crewly 1.20.142 → 1.20.143

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 (218) hide show
  1. package/config/runtime_scripts/runtime-config.json +7 -0
  2. package/config/skills/orchestrator/update-team-member/SKILL.md +2 -2
  3. package/dist/backend/backend/src/constants.d.ts +151 -0
  4. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  5. package/dist/backend/backend/src/constants.js +173 -0
  6. package/dist/backend/backend/src/constants.js.map +1 -1
  7. package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.d.ts.map +1 -1
  8. package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.js +4 -3
  9. package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.js.map +1 -1
  10. package/dist/backend/backend/src/controllers/project/project.controller.d.ts.map +1 -1
  11. package/dist/backend/backend/src/controllers/project/project.controller.js +13 -0
  12. package/dist/backend/backend/src/controllers/project/project.controller.js.map +1 -1
  13. package/dist/backend/backend/src/controllers/request-types.d.ts +2 -2
  14. package/dist/backend/backend/src/controllers/request-types.d.ts.map +1 -1
  15. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +22 -1
  16. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  17. package/dist/backend/backend/src/services/agent/agent-registration.service.js +128 -14
  18. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  19. package/dist/backend/backend/src/services/agent/antigravity-runtime.service.d.ts +267 -0
  20. package/dist/backend/backend/src/services/agent/antigravity-runtime.service.d.ts.map +1 -0
  21. package/dist/backend/backend/src/services/agent/antigravity-runtime.service.js +521 -0
  22. package/dist/backend/backend/src/services/agent/antigravity-runtime.service.js.map +1 -0
  23. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -1
  24. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js +10 -0
  25. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -1
  26. package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -1
  27. package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js +12 -1
  28. package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
  29. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
  30. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js +3 -1
  31. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
  32. package/dist/backend/backend/src/services/agent/runtime-service.factory.d.ts.map +1 -1
  33. package/dist/backend/backend/src/services/agent/runtime-service.factory.js +9 -0
  34. package/dist/backend/backend/src/services/agent/runtime-service.factory.js.map +1 -1
  35. package/dist/backend/backend/src/services/agent/runtime-session-recovery.d.ts +57 -1
  36. package/dist/backend/backend/src/services/agent/runtime-session-recovery.d.ts.map +1 -1
  37. package/dist/backend/backend/src/services/agent/runtime-session-recovery.js +176 -2
  38. package/dist/backend/backend/src/services/agent/runtime-session-recovery.js.map +1 -1
  39. package/dist/backend/backend/src/services/agent/runtime-startup-blocked.error.d.ts +15 -3
  40. package/dist/backend/backend/src/services/agent/runtime-startup-blocked.error.d.ts.map +1 -1
  41. package/dist/backend/backend/src/services/agent/runtime-startup-blocked.error.js +2 -1
  42. package/dist/backend/backend/src/services/agent/runtime-startup-blocked.error.js.map +1 -1
  43. package/dist/backend/backend/src/services/harness/harness-api-key.service.d.ts +26 -0
  44. package/dist/backend/backend/src/services/harness/harness-api-key.service.d.ts.map +1 -1
  45. package/dist/backend/backend/src/services/harness/harness-api-key.service.js +65 -5
  46. package/dist/backend/backend/src/services/harness/harness-api-key.service.js.map +1 -1
  47. package/dist/backend/backend/src/services/harness/harness-credentials.store.d.ts +37 -6
  48. package/dist/backend/backend/src/services/harness/harness-credentials.store.d.ts.map +1 -1
  49. package/dist/backend/backend/src/services/harness/harness-credentials.store.js +57 -9
  50. package/dist/backend/backend/src/services/harness/harness-credentials.store.js.map +1 -1
  51. package/dist/backend/backend/src/services/harness/harness-install.service.d.ts +60 -7
  52. package/dist/backend/backend/src/services/harness/harness-install.service.d.ts.map +1 -1
  53. package/dist/backend/backend/src/services/harness/harness-install.service.js +154 -37
  54. package/dist/backend/backend/src/services/harness/harness-install.service.js.map +1 -1
  55. package/dist/backend/backend/src/services/harness/harness-registry.d.ts +46 -5
  56. package/dist/backend/backend/src/services/harness/harness-registry.d.ts.map +1 -1
  57. package/dist/backend/backend/src/services/harness/harness-registry.js +53 -8
  58. package/dist/backend/backend/src/services/harness/harness-registry.js.map +1 -1
  59. package/dist/backend/backend/src/services/harness/harness-status.service.d.ts +15 -1
  60. package/dist/backend/backend/src/services/harness/harness-status.service.d.ts.map +1 -1
  61. package/dist/backend/backend/src/services/harness/harness-status.service.js +34 -6
  62. package/dist/backend/backend/src/services/harness/harness-status.service.js.map +1 -1
  63. package/dist/backend/backend/src/services/harness/harness.types.d.ts +10 -3
  64. package/dist/backend/backend/src/services/harness/harness.types.d.ts.map +1 -1
  65. package/dist/backend/backend/src/services/harness/harness.types.js +4 -3
  66. package/dist/backend/backend/src/services/harness/harness.types.js.map +1 -1
  67. package/dist/backend/backend/src/services/mcp-tool-definitions.d.ts +1 -1
  68. package/dist/backend/backend/src/services/mcp-tool-definitions.js +1 -1
  69. package/dist/backend/backend/src/services/mcp-tool-definitions.js.map +1 -1
  70. package/dist/backend/backend/src/services/orchestrator/orchestrator-restart.service.d.ts.map +1 -1
  71. package/dist/backend/backend/src/services/orchestrator/orchestrator-restart.service.js +3 -2
  72. package/dist/backend/backend/src/services/orchestrator/orchestrator-restart.service.js.map +1 -1
  73. package/dist/backend/backend/src/services/runtime-adapter.d.ts +10 -1
  74. package/dist/backend/backend/src/services/runtime-adapter.d.ts.map +1 -1
  75. package/dist/backend/backend/src/services/runtime-adapter.js +12 -1
  76. package/dist/backend/backend/src/services/runtime-adapter.js.map +1 -1
  77. package/dist/backend/backend/src/services/settings/settings.service.d.ts.map +1 -1
  78. package/dist/backend/backend/src/services/settings/settings.service.js +1 -0
  79. package/dist/backend/backend/src/services/settings/settings.service.js.map +1 -1
  80. package/dist/backend/backend/src/types/index.d.ts +1 -1
  81. package/dist/backend/backend/src/types/index.d.ts.map +1 -1
  82. package/dist/backend/backend/src/types/settings.types.d.ts +1 -1
  83. package/dist/backend/backend/src/types/settings.types.d.ts.map +1 -1
  84. package/dist/backend/backend/src/types/settings.types.js +7 -1
  85. package/dist/backend/backend/src/types/settings.types.js.map +1 -1
  86. package/dist/backend/backend/src/types/solution-bundle.types.d.ts +1 -1
  87. package/dist/backend/backend/src/types/solution-bundle.types.d.ts.map +1 -1
  88. package/dist/backend/backend/src/types/team-template.types.d.ts +2 -2
  89. package/dist/backend/backend/src/types/team-template.types.d.ts.map +1 -1
  90. package/dist/backend/backend/src/types/team-template.types.js +1 -1
  91. package/dist/backend/backend/src/types/team-template.types.js.map +1 -1
  92. package/dist/backend/backend/src/utils/antigravity-settings.utils.d.ts +115 -0
  93. package/dist/backend/backend/src/utils/antigravity-settings.utils.d.ts.map +1 -0
  94. package/dist/backend/backend/src/utils/antigravity-settings.utils.js +181 -0
  95. package/dist/backend/backend/src/utils/antigravity-settings.utils.js.map +1 -0
  96. package/dist/backend/backend/src/utils/runtime-model-flags.utils.d.ts +3 -2
  97. package/dist/backend/backend/src/utils/runtime-model-flags.utils.d.ts.map +1 -1
  98. package/dist/backend/backend/src/utils/runtime-model-flags.utils.js +13 -3
  99. package/dist/backend/backend/src/utils/runtime-model-flags.utils.js.map +1 -1
  100. package/dist/backend/backend/src/utils/terminal-string-ops.d.ts +1 -0
  101. package/dist/backend/backend/src/utils/terminal-string-ops.d.ts.map +1 -1
  102. package/dist/backend/backend/src/utils/terminal-string-ops.js +29 -1
  103. package/dist/backend/backend/src/utils/terminal-string-ops.js.map +1 -1
  104. package/dist/backend/build-info.json +2 -2
  105. package/dist/cli/backend/src/constants.d.ts +151 -0
  106. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  107. package/dist/cli/backend/src/constants.js +173 -0
  108. package/dist/cli/backend/src/constants.js.map +1 -1
  109. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts +22 -1
  110. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  111. package/dist/cli/backend/src/services/agent/agent-registration.service.js +128 -14
  112. package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
  113. package/dist/cli/backend/src/services/agent/antigravity-runtime.service.d.ts +267 -0
  114. package/dist/cli/backend/src/services/agent/antigravity-runtime.service.d.ts.map +1 -0
  115. package/dist/cli/backend/src/services/agent/antigravity-runtime.service.js +521 -0
  116. package/dist/cli/backend/src/services/agent/antigravity-runtime.service.js.map +1 -0
  117. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -1
  118. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.js +10 -0
  119. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -1
  120. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -1
  121. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js +12 -1
  122. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
  123. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
  124. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js +3 -1
  125. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
  126. package/dist/cli/backend/src/services/agent/runtime-service.factory.d.ts.map +1 -1
  127. package/dist/cli/backend/src/services/agent/runtime-service.factory.js +9 -0
  128. package/dist/cli/backend/src/services/agent/runtime-service.factory.js.map +1 -1
  129. package/dist/cli/backend/src/services/agent/runtime-session-recovery.d.ts +57 -1
  130. package/dist/cli/backend/src/services/agent/runtime-session-recovery.d.ts.map +1 -1
  131. package/dist/cli/backend/src/services/agent/runtime-session-recovery.js +176 -2
  132. package/dist/cli/backend/src/services/agent/runtime-session-recovery.js.map +1 -1
  133. package/dist/cli/backend/src/services/agent/runtime-startup-blocked.error.d.ts +15 -3
  134. package/dist/cli/backend/src/services/agent/runtime-startup-blocked.error.d.ts.map +1 -1
  135. package/dist/cli/backend/src/services/agent/runtime-startup-blocked.error.js +2 -1
  136. package/dist/cli/backend/src/services/agent/runtime-startup-blocked.error.js.map +1 -1
  137. package/dist/cli/backend/src/services/harness/harness-api-key.service.d.ts +26 -0
  138. package/dist/cli/backend/src/services/harness/harness-api-key.service.d.ts.map +1 -1
  139. package/dist/cli/backend/src/services/harness/harness-api-key.service.js +65 -5
  140. package/dist/cli/backend/src/services/harness/harness-api-key.service.js.map +1 -1
  141. package/dist/cli/backend/src/services/harness/harness-credentials.store.d.ts +37 -6
  142. package/dist/cli/backend/src/services/harness/harness-credentials.store.d.ts.map +1 -1
  143. package/dist/cli/backend/src/services/harness/harness-credentials.store.js +57 -9
  144. package/dist/cli/backend/src/services/harness/harness-credentials.store.js.map +1 -1
  145. package/dist/cli/backend/src/services/harness/harness-install.service.d.ts +60 -7
  146. package/dist/cli/backend/src/services/harness/harness-install.service.d.ts.map +1 -1
  147. package/dist/cli/backend/src/services/harness/harness-install.service.js +154 -37
  148. package/dist/cli/backend/src/services/harness/harness-install.service.js.map +1 -1
  149. package/dist/cli/backend/src/services/harness/harness-registry.d.ts +46 -5
  150. package/dist/cli/backend/src/services/harness/harness-registry.d.ts.map +1 -1
  151. package/dist/cli/backend/src/services/harness/harness-registry.js +53 -8
  152. package/dist/cli/backend/src/services/harness/harness-registry.js.map +1 -1
  153. package/dist/cli/backend/src/services/harness/harness-status.service.d.ts +15 -1
  154. package/dist/cli/backend/src/services/harness/harness-status.service.d.ts.map +1 -1
  155. package/dist/cli/backend/src/services/harness/harness-status.service.js +34 -6
  156. package/dist/cli/backend/src/services/harness/harness-status.service.js.map +1 -1
  157. package/dist/cli/backend/src/services/harness/harness.types.d.ts +10 -3
  158. package/dist/cli/backend/src/services/harness/harness.types.d.ts.map +1 -1
  159. package/dist/cli/backend/src/services/harness/harness.types.js +4 -3
  160. package/dist/cli/backend/src/services/harness/harness.types.js.map +1 -1
  161. package/dist/cli/backend/src/services/mcp-tool-definitions.d.ts +1 -1
  162. package/dist/cli/backend/src/services/mcp-tool-definitions.js +1 -1
  163. package/dist/cli/backend/src/services/mcp-tool-definitions.js.map +1 -1
  164. package/dist/cli/backend/src/services/orchestrator/orchestrator-restart.service.d.ts.map +1 -1
  165. package/dist/cli/backend/src/services/orchestrator/orchestrator-restart.service.js +3 -2
  166. package/dist/cli/backend/src/services/orchestrator/orchestrator-restart.service.js.map +1 -1
  167. package/dist/cli/backend/src/services/settings/settings.service.d.ts.map +1 -1
  168. package/dist/cli/backend/src/services/settings/settings.service.js +1 -0
  169. package/dist/cli/backend/src/services/settings/settings.service.js.map +1 -1
  170. package/dist/cli/backend/src/types/index.d.ts +1 -1
  171. package/dist/cli/backend/src/types/index.d.ts.map +1 -1
  172. package/dist/cli/backend/src/types/settings.types.d.ts +1 -1
  173. package/dist/cli/backend/src/types/settings.types.d.ts.map +1 -1
  174. package/dist/cli/backend/src/types/settings.types.js +7 -1
  175. package/dist/cli/backend/src/types/settings.types.js.map +1 -1
  176. package/dist/cli/backend/src/types/solution-bundle.types.d.ts +1 -1
  177. package/dist/cli/backend/src/types/solution-bundle.types.d.ts.map +1 -1
  178. package/dist/cli/backend/src/types/team-template.types.d.ts +2 -2
  179. package/dist/cli/backend/src/types/team-template.types.d.ts.map +1 -1
  180. package/dist/cli/backend/src/types/team-template.types.js +1 -1
  181. package/dist/cli/backend/src/types/team-template.types.js.map +1 -1
  182. package/dist/cli/backend/src/utils/antigravity-settings.utils.d.ts +115 -0
  183. package/dist/cli/backend/src/utils/antigravity-settings.utils.d.ts.map +1 -0
  184. package/dist/cli/backend/src/utils/antigravity-settings.utils.js +181 -0
  185. package/dist/cli/backend/src/utils/antigravity-settings.utils.js.map +1 -0
  186. package/dist/cli/backend/src/utils/runtime-model-flags.utils.d.ts +3 -2
  187. package/dist/cli/backend/src/utils/runtime-model-flags.utils.d.ts.map +1 -1
  188. package/dist/cli/backend/src/utils/runtime-model-flags.utils.js +13 -3
  189. package/dist/cli/backend/src/utils/runtime-model-flags.utils.js.map +1 -1
  190. package/dist/cli/backend/src/utils/terminal-string-ops.d.ts +1 -0
  191. package/dist/cli/backend/src/utils/terminal-string-ops.d.ts.map +1 -1
  192. package/dist/cli/backend/src/utils/terminal-string-ops.js +29 -1
  193. package/dist/cli/backend/src/utils/terminal-string-ops.js.map +1 -1
  194. package/dist/cli/cli/src/commands/doctor.d.ts +2 -2
  195. package/dist/cli/cli/src/commands/doctor.d.ts.map +1 -1
  196. package/dist/cli/cli/src/commands/doctor.js +6 -3
  197. package/dist/cli/cli/src/commands/doctor.js.map +1 -1
  198. package/dist/cli/cli/src/commands/harness-setup.d.ts +21 -1
  199. package/dist/cli/cli/src/commands/harness-setup.d.ts.map +1 -1
  200. package/dist/cli/cli/src/commands/harness-setup.js +53 -16
  201. package/dist/cli/cli/src/commands/harness-setup.js.map +1 -1
  202. package/dist/cli/cli/src/commands/harness.d.ts +2 -2
  203. package/dist/cli/cli/src/commands/harness.d.ts.map +1 -1
  204. package/dist/cli/cli/src/commands/harness.js +6 -5
  205. package/dist/cli/cli/src/commands/harness.js.map +1 -1
  206. package/dist/cli/cli/src/commands/onboard.d.ts +7 -5
  207. package/dist/cli/cli/src/commands/onboard.d.ts.map +1 -1
  208. package/dist/cli/cli/src/commands/onboard.js +6 -4
  209. package/dist/cli/cli/src/commands/onboard.js.map +1 -1
  210. package/dist/cli/cli/src/index.js +3 -3
  211. package/dist/cli/cli/src/index.js.map +1 -1
  212. package/dist/cli/cli/src/utils/runtime-auth.d.ts +42 -5
  213. package/dist/cli/cli/src/utils/runtime-auth.d.ts.map +1 -1
  214. package/dist/cli/cli/src/utils/runtime-auth.js +78 -6
  215. package/dist/cli/cli/src/utils/runtime-auth.js.map +1 -1
  216. package/frontend/dist/assets/{index-b4d5575e.js → index-e05af897.js} +271 -271
  217. package/frontend/dist/index.html +1 -1
  218. package/package.json +1 -1
@@ -0,0 +1,521 @@
1
+ import * as os from 'os';
2
+ import * as path from 'path';
3
+ import { RuntimeAgentService } from './runtime-agent.service.abstract.js';
4
+ import { RuntimeStartupBlockedError } from './runtime-startup-blocked.error.js';
5
+ import { ANTIGRAVITY_CONSTANTS, CREWLY_CONSTANTS, RUNTIME_INPUT_READY_PATTERNS, RUNTIME_TYPES, } from '../../constants.js';
6
+ import { delay } from '../../utils/async.utils.js';
7
+ import { stripAnsiCodes } from '../../utils/terminal-string-ops.js';
8
+ import { ensureAntigravityApiKeyProvider, } from '../../utils/antigravity-settings.utils.js';
9
+ import { getHarnessCredentialsStore } from '../harness/harness-credentials.store.js';
10
+ import { getSettingsService } from '../settings/settings.service.js';
11
+ /** Trailing screen lines inspected when deciding whether agy is running. */
12
+ const ANTIGRAVITY_DETECTION_CAPTURE_LINES = 120;
13
+ /** Minimum run of `─` that counts as one of the input box's horizontal rules. */
14
+ const INPUT_BOX_RULE_MIN_LENGTH = 20;
15
+ /** How long postInitialize waits for the idle prompt around each `/add-dir`. */
16
+ const ADD_DIR_IDLE_TIMEOUT_MS = 15_000;
17
+ const ADD_DIR_POLL_MS = 500;
18
+ /** Banner line agy paints above the prompt: `Antigravity CLI 1.2.11`. */
19
+ const BANNER_VERSION_RE = /Antigravity CLI \d+\.\d+/;
20
+ /**
21
+ * The Gemini API key an Antigravity session gets: the key saved for
22
+ * Antigravity in Settings → Harness, else a Gemini key from Crewly settings
23
+ * (global or an antigravity-cli override), else GEMINI_API_KEY in the
24
+ * backend's environment.
25
+ *
26
+ * @returns The key, or null when none is available
27
+ */
28
+ export async function resolveAntigravityApiKey() {
29
+ try {
30
+ const stored = getHarnessCredentialsStore().getAntigravityGeminiApiKey();
31
+ if (stored)
32
+ return stored;
33
+ }
34
+ catch {
35
+ // unreadable store — try the other sources
36
+ }
37
+ try {
38
+ const fromSettings = await getSettingsService().getApiKey('gemini', { runtime: RUNTIME_TYPES.ANTIGRAVITY_CLI });
39
+ if (fromSettings && fromSettings.trim())
40
+ return fromSettings;
41
+ }
42
+ catch {
43
+ // settings unavailable
44
+ }
45
+ const fromEnv = process.env[ANTIGRAVITY_CONSTANTS.API_KEY_ENV];
46
+ return fromEnv && fromEnv.trim() ? fromEnv : null;
47
+ }
48
+ /**
49
+ * Whether a marker is on screen, also when the terminal wrapped it: agy's
50
+ * plain-text messages (printed before the TUI starts) wrap at the PTY width,
51
+ * so the marker is searched in the text as shown and with line breaks
52
+ * removed.
53
+ *
54
+ * @param screen - Captured screen (ANSI already stripped)
55
+ * @param marker - Text to find
56
+ * @returns True when found
57
+ */
58
+ export function antigravityScreenIncludes(screen, marker) {
59
+ return screen.includes(marker) || screen.replace(/\r?\n/g, '').includes(marker);
60
+ }
61
+ /**
62
+ * Classify a screen that agy cannot get past without the user, or that
63
+ * Crewly must refuse (an account sign-in).
64
+ *
65
+ * @param screen - Captured screen
66
+ * @returns The blocking error to throw, or null
67
+ */
68
+ export function detectAntigravityStartupBlocker(screen) {
69
+ const clean = stripAnsiCodes(screen);
70
+ const { SCREEN, MESSAGES } = ANTIGRAVITY_CONSTANTS;
71
+ if (SCREEN.ACCOUNT_LOGIN_MARKERS.some((m) => antigravityScreenIncludes(clean, m))) {
72
+ return new RuntimeStartupBlockedError('account_login_refused', MESSAGES.ACCOUNT_LOGIN);
73
+ }
74
+ if (antigravityScreenIncludes(clean, SCREEN.MISSING_KEY_ERROR)) {
75
+ return new RuntimeStartupBlockedError('api_key_required', MESSAGES.KEY_NOT_IN_SESSION);
76
+ }
77
+ if (SCREEN.FIRST_RUN_MARKERS.some((m) => antigravityScreenIncludes(clean, m))) {
78
+ return new RuntimeStartupBlockedError('first_run_setup', MESSAGES.FIRST_RUN);
79
+ }
80
+ return null;
81
+ }
82
+ /**
83
+ * Whether agy started on something other than the Gemini API key: its
84
+ * banner (`Antigravity CLI 1.2.11`) is on screen but the `Gemini API key`
85
+ * line that replaces the account email is not. Only meaningful once the
86
+ * screen is fully painted (the idle footer is up): the two lines are drawn
87
+ * together, but a capture can land between them while agy boots.
88
+ *
89
+ * @param screen - Captured screen (ANSI stripped)
90
+ * @returns True for an account session
91
+ */
92
+ export function isAntigravityAccountSession(screen) {
93
+ return BANNER_VERSION_RE.test(screen) && !screen.includes(ANTIGRAVITY_CONSTANTS.SCREEN.API_KEY_HEADER);
94
+ }
95
+ /**
96
+ * Whether agy's folder-trust screen is showing.
97
+ *
98
+ * @param screen - Captured screen
99
+ * @returns True when the "Do you trust the contents of this project?" screen is up
100
+ */
101
+ export function isAntigravityTrustPrompt(screen) {
102
+ const clean = stripAnsiCodes(screen);
103
+ return clean.includes(ANTIGRAVITY_CONSTANTS.SCREEN.TRUST_PROMPT) && clean.includes(ANTIGRAVITY_CONSTANTS.SCREEN.TRUST_ACCEPT_OPTION);
104
+ }
105
+ /**
106
+ * Whether a line is one of the full-width `─` rules around agy's prompt box.
107
+ *
108
+ * @param line - Screen line
109
+ * @returns True for a rule line
110
+ */
111
+ function isRuleLine(line) {
112
+ const trimmed = line.trim();
113
+ return trimmed.length >= INPUT_BOX_RULE_MIN_LENGTH && /^─+$/.test(trimmed);
114
+ }
115
+ /**
116
+ * The text currently typed in agy's prompt box: the lines between the last
117
+ * two horizontal rules, without the `>` marker. The accept-edits
118
+ * placeholder counts as empty.
119
+ *
120
+ * ```
121
+ * ───────────────────────────── ← top rule
122
+ * > Read the file at /x.md ← input (may wrap onto more lines)
123
+ * ───────────────────────────── ← bottom rule
124
+ * ? for shortcuts … ← footer
125
+ * ```
126
+ *
127
+ * @param screen - Captured screen
128
+ * @returns The typed text (whitespace-collapsed), '' when empty, or null when no prompt box is visible
129
+ */
130
+ export function getAntigravityInputBoxText(screen) {
131
+ const lines = stripAnsiCodes(screen).split('\n');
132
+ let bottom = -1;
133
+ for (let i = lines.length - 1; i >= 0; i--) {
134
+ if (isRuleLine(lines[i])) {
135
+ bottom = i;
136
+ break;
137
+ }
138
+ }
139
+ if (bottom <= 0)
140
+ return null;
141
+ let top = -1;
142
+ for (let i = bottom - 1; i >= 0; i--) {
143
+ if (isRuleLine(lines[i])) {
144
+ top = i;
145
+ break;
146
+ }
147
+ }
148
+ if (top < 0)
149
+ return null;
150
+ const text = lines
151
+ .slice(top + 1, bottom)
152
+ .join(' ')
153
+ .replace(/\s+/g, ' ')
154
+ .trim()
155
+ .replace(/^>\s?/, '')
156
+ .trim();
157
+ return text.startsWith(ANTIGRAVITY_CONSTANTS.SCREEN.ACCEPT_EDITS_PLACEHOLDER) ? '' : text;
158
+ }
159
+ /**
160
+ * Whether a message is still sitting in agy's prompt box (typed, not
161
+ * submitted). Only the box counts: agy echoes every submitted message above
162
+ * it as `> text`, which must not read as "stuck".
163
+ *
164
+ * @param screen - Captured screen
165
+ * @param message - Message that was sent
166
+ * @returns True when its start is still in the prompt box
167
+ */
168
+ export function isTextInAntigravityInputBox(screen, message) {
169
+ const box = getAntigravityInputBoxText(screen);
170
+ if (!box)
171
+ return false;
172
+ const token = message.replace(/\s+/g, ' ').trim().slice(0, 30);
173
+ return token.length > 0 && box.includes(token);
174
+ }
175
+ /**
176
+ * Quote a path for the shell the launch command is typed into.
177
+ *
178
+ * @param value - Path
179
+ * @returns Single-quoted path
180
+ */
181
+ function shellQuote(value) {
182
+ return `'${value.replace(/'/g, `'\\''`)}'`;
183
+ }
184
+ /**
185
+ * Google Antigravity CLI (`agy`) runtime service.
186
+ *
187
+ * Crewly drives agy's interactive TUI in a PTY, like the other harnesses.
188
+ * The one hard rule: agy runs **only on a Gemini API key**. Google does not
189
+ * allow third-party tools to use Antigravity (or Gemini CLI) product OAuth,
190
+ * so before every launch Crewly
191
+ *
192
+ * 1. refuses to launch without a Gemini API key (RuntimeStartupBlockedError
193
+ * `api_key_required`), and
194
+ * 2. writes `"modelProvider": "gemini"` into agy's settings file (with the
195
+ * agent's folder in `trustedWorkspaces`). The key reaches the session as
196
+ * `GEMINI_API_KEY` in its spawn environment (harnessEnvForAgents).
197
+ *
198
+ * With that provider agy "never establishes an account session", even when
199
+ * the machine has an account login in its keyring. If agy nevertheless shows
200
+ * an account sign-in screen, or starts without the `Gemini API key` header,
201
+ * the launch is refused (`account_login_refused`) instead of letting the
202
+ * owner sign in.
203
+ *
204
+ * Launch: `agy --dangerously-skip-permissions --mode=accept-edits`, plus
205
+ * `--add-dir` for the Crewly home (the init prompt file lives there) and the
206
+ * temp dir (skill artifacts), `--model` / `--effort` for the member, and
207
+ * `--conversation=<id>` to resume. `AGY_CLI_DISABLE_AUTO_UPDATE=true` keeps
208
+ * the self-updater from replacing the binary mid-task.
209
+ *
210
+ * Screen anatomy (agy 1.2.11, captured in a PTY):
211
+ *
212
+ * ```
213
+ * Antigravity CLI 1.2.11
214
+ * Gemini API key ← provider header
215
+ * Gemini 3.1 Pro (Low)
216
+ * ─────────────────────────────────────────────
217
+ * > Accept-edits mode: file edits auto-approved (shift+tab to cycle)
218
+ * ─────────────────────────────────────────────
219
+ * ? for shortcuts accept-edits · Gemini 3.1 Pro · low ← idle footer
220
+ *
221
+ * > say hello ← echo of a submitted message
222
+ * ⣯ Generating... ← busy
223
+ * ──────────────── > ────────────────
224
+ * esc to cancel accept-edits · … ← busy footer
225
+ * ```
226
+ *
227
+ * Detection is a passive screen scrape: Ctrl+C at the prompt arms "press
228
+ * ctrl+c again to exit" and `/` opens the command menu, so no key probes.
229
+ */
230
+ export class AntigravityRuntimeService extends RuntimeAgentService {
231
+ resolveApiKey;
232
+ ensureProvider;
233
+ crewlyHome;
234
+ tmpDir;
235
+ /**
236
+ * @param sessionHelper - PTY session helper
237
+ * @param projectRoot - Crewly install dir
238
+ * @param deps - Injectable dependencies (tests)
239
+ */
240
+ constructor(sessionHelper, projectRoot, deps = {}) {
241
+ super(sessionHelper, projectRoot);
242
+ this.resolveApiKey = deps.resolveApiKey ?? resolveAntigravityApiKey;
243
+ this.ensureProvider = deps.ensureProvider ?? ((trustedPaths) => ensureAntigravityApiKeyProvider({ trustedPaths, logger: this.logger }));
244
+ this.crewlyHome = deps.crewlyHome ?? (() => path.join(os.homedir(), CREWLY_CONSTANTS.PATHS.CREWLY_HOME));
245
+ this.tmpDir = deps.tmpDir ?? os.tmpdir;
246
+ }
247
+ getRuntimeType() {
248
+ return RUNTIME_TYPES.ANTIGRAVITY_CLI;
249
+ }
250
+ /**
251
+ * Folders agy gets with `--add-dir` at launch: the Crewly home (the init
252
+ * prompt file and skills) and the temp dir (skill artifacts). agy's file
253
+ * tools otherwise stay inside the workspace.
254
+ *
255
+ * @returns Absolute paths
256
+ */
257
+ getLaunchWorkspaceDirs() {
258
+ return [this.crewlyHome(), this.tmpDir()];
259
+ }
260
+ /**
261
+ * Make sure agy can only start on the Gemini API key, then launch it.
262
+ *
263
+ * Claude-only launch arguments (`--agent`, a prompt file) are dropped:
264
+ * agy has its own, unrelated `--agent` flag.
265
+ *
266
+ * @param sessionName - PTY session name
267
+ * @param targetPath - Working directory for the session
268
+ * @param runtimeFlags - Model / effort / resume flags
269
+ * @param _promptFilePath - Ignored (Claude Code only)
270
+ * @param _agentName - Ignored (Claude Code only)
271
+ * @param resumeSessionId - Conversation being resumed (its flag is in runtimeFlags)
272
+ * @throws RuntimeStartupBlockedError when no key is available or agy's settings cannot be set
273
+ */
274
+ async executeRuntimeInitScript(sessionName, targetPath, runtimeFlags, _promptFilePath, _agentName, resumeSessionId) {
275
+ await this.prepareLaunch(targetPath);
276
+ const addDirs = this.getLaunchWorkspaceDirs().map((dir) => `${ANTIGRAVITY_CONSTANTS.ADD_DIR_FLAG}=${shellQuote(dir)}`);
277
+ const flags = [...(runtimeFlags ?? []), ...addDirs];
278
+ return super.executeRuntimeInitScript(sessionName, targetPath, flags, undefined, undefined, resumeSessionId);
279
+ }
280
+ /**
281
+ * Pre-launch guard: a Gemini API key must exist and agy's settings must
282
+ * select the Gemini provider (trusting the agent's folders).
283
+ *
284
+ * @param targetPath - The session's working directory
285
+ * @throws RuntimeStartupBlockedError `api_key_required` | `settings_unreadable`
286
+ */
287
+ async prepareLaunch(targetPath) {
288
+ const key = await this.resolveApiKey();
289
+ if (!key) {
290
+ throw new RuntimeStartupBlockedError('api_key_required', ANTIGRAVITY_CONSTANTS.MESSAGES.NO_API_KEY);
291
+ }
292
+ const workspace = targetPath || this.projectRoot;
293
+ const trusted = [workspace, ...this.getLaunchWorkspaceDirs()];
294
+ const result = await this.ensureProvider(trusted);
295
+ if (result === 'unparseable') {
296
+ throw new RuntimeStartupBlockedError('settings_unreadable', ANTIGRAVITY_CONSTANTS.MESSAGES.SETTINGS_UNREADABLE);
297
+ }
298
+ if (result === 'error') {
299
+ throw new RuntimeStartupBlockedError('settings_unreadable', ANTIGRAVITY_CONSTANTS.MESSAGES.SETTINGS_WRITE_FAILED);
300
+ }
301
+ this.logger.info('Antigravity set to the Gemini API key provider for launch', { workspace, settings: result });
302
+ }
303
+ /**
304
+ * Wait for agy's idle prompt.
305
+ *
306
+ * Screens only the user may resolve (first-run terms, a missing key) and
307
+ * screens Crewly must refuse (account sign-in) fail fast with a
308
+ * RuntimeStartupBlockedError; an account session is also exited so it
309
+ * does no work. The folder-trust screen is answered with its
310
+ * pre-selected "Yes, I trust this folder" (the folder is normally
311
+ * pre-trusted, so this is a fallback).
312
+ *
313
+ * @param sessionName - PTY session name
314
+ * @param timeout - Overall timeout (ms)
315
+ * @param checkInterval - Poll interval (ms)
316
+ * @returns True when ready, false on timeout or a startup error
317
+ * @throws RuntimeStartupBlockedError when start-up is blocked on the user
318
+ */
319
+ async waitForRuntimeReady(sessionName, timeout, checkInterval = 2000) {
320
+ const startTime = Date.now();
321
+ let trustAnswers = 0;
322
+ this.logger.info('Waiting for Antigravity CLI to be ready', { sessionName, timeout, checkInterval });
323
+ while (Date.now() - startTime < timeout) {
324
+ let output = '';
325
+ try {
326
+ output = this.sessionHelper.capturePane(sessionName);
327
+ }
328
+ catch (error) {
329
+ this.logger.warn('Could not read the Antigravity screen', { sessionName, error: String(error) });
330
+ }
331
+ const clean = stripAnsiCodes(output);
332
+ const blocked = detectAntigravityStartupBlocker(clean);
333
+ if (blocked) {
334
+ this.logger.error('Antigravity start-up blocked', { sessionName, reason: blocked.reason, totalElapsed: Date.now() - startTime });
335
+ if (blocked.reason === 'account_login_refused')
336
+ await this.exitAntigravity(sessionName);
337
+ throw blocked;
338
+ }
339
+ if (isAntigravityTrustPrompt(clean)) {
340
+ trustAnswers++;
341
+ this.logger.info('Antigravity folder-trust screen shown; accepting the pre-selected "Yes, I trust this folder"', {
342
+ sessionName,
343
+ attempt: trustAnswers,
344
+ });
345
+ await this.sessionHelper.sendEnter(sessionName);
346
+ await delay(1000);
347
+ continue;
348
+ }
349
+ const readyPattern = this.getRuntimeReadyPatterns().find((p) => clean.includes(p));
350
+ if (readyPattern && isAntigravityAccountSession(clean)) {
351
+ this.logger.error('Antigravity started on an account session instead of the Gemini API key; exiting it', { sessionName });
352
+ await this.exitAntigravity(sessionName);
353
+ throw new RuntimeStartupBlockedError('account_login_refused', ANTIGRAVITY_CONSTANTS.MESSAGES.ACCOUNT_LOGIN);
354
+ }
355
+ if (readyPattern) {
356
+ this.logger.info('Antigravity ready', { sessionName, detectedPattern: readyPattern, totalElapsed: Date.now() - startTime });
357
+ return true;
358
+ }
359
+ const errorPattern = this.getRuntimeErrorPatterns().find((p) => antigravityScreenIncludes(clean, p));
360
+ if (errorPattern) {
361
+ this.logger.error('Antigravity error during start-up', { sessionName, detectedError: errorPattern });
362
+ return false;
363
+ }
364
+ await delay(checkInterval);
365
+ }
366
+ this.logger.warn('Timeout waiting for Antigravity CLI', { sessionName, timeout });
367
+ return false;
368
+ }
369
+ /**
370
+ * Leave agy (Ctrl+C twice: the first arms "press ctrl+c again to exit").
371
+ *
372
+ * @param sessionName - PTY session name
373
+ */
374
+ async exitAntigravity(sessionName) {
375
+ try {
376
+ await this.sessionHelper.sendCtrlC(sessionName);
377
+ await delay(300);
378
+ await this.sessionHelper.sendCtrlC(sessionName);
379
+ }
380
+ catch {
381
+ // session already gone
382
+ }
383
+ }
384
+ /**
385
+ * Passive detection: agy's footer (idle or busy) is the last thing on
386
+ * screen, with no exit hint after it.
387
+ *
388
+ * @param sessionName - PTY session name
389
+ * @returns True when agy is running
390
+ */
391
+ async detectRuntimeSpecific(sessionName) {
392
+ const output = stripAnsiCodes(this.sessionHelper.capturePane(sessionName, ANTIGRAVITY_DETECTION_CAPTURE_LINES));
393
+ const lastFooter = Math.max(output.lastIndexOf(ANTIGRAVITY_CONSTANTS.SCREEN.IDLE_FOOTER), output.lastIndexOf('esc to cancel'));
394
+ const lastExit = output.lastIndexOf(ANTIGRAVITY_CONSTANTS.SCREEN.EXIT_RESUME_HINT);
395
+ const running = lastFooter >= 0 && lastFooter > lastExit;
396
+ this.logger.debug('Antigravity detection completed', { sessionName, running });
397
+ return running;
398
+ }
399
+ /**
400
+ * Text on screen once agy is up and taking input (or already busy, e.g.
401
+ * a resumed conversation): the idle footer, the empty accept-edits
402
+ * placeholder, or the busy footer.
403
+ *
404
+ * @returns Ready patterns
405
+ */
406
+ getRuntimeReadyPatterns() {
407
+ return [
408
+ ANTIGRAVITY_CONSTANTS.SCREEN.IDLE_FOOTER,
409
+ ANTIGRAVITY_CONSTANTS.SCREEN.ACCEPT_EDITS_PLACEHOLDER,
410
+ 'esc to cancel',
411
+ ];
412
+ }
413
+ /**
414
+ * Markers that veto readiness while the idle footer may still be painted.
415
+ *
416
+ * @returns Lower-case markers
417
+ */
418
+ getNotReadyMarkers() {
419
+ return RUNTIME_INPUT_READY_PATTERNS.ANTIGRAVITY_CLI.NOT_READY_MARKERS;
420
+ }
421
+ /**
422
+ * Exit patterns for RuntimeExitMonitorService (matched against the raw
423
+ * output stream, which is not wrapped). agy prints its resume hint on
424
+ * every clean exit, and refuses to start without the key.
425
+ *
426
+ * @returns Exit patterns
427
+ */
428
+ getRuntimeExitPatterns() {
429
+ return [
430
+ /Resume with -c \(or command below\)/,
431
+ /modelProvider is set to "gemini" in settings\.json, but the GEMINI_API_KEY/,
432
+ /command not found: agy/,
433
+ /agy: command not found/,
434
+ ];
435
+ }
436
+ /**
437
+ * Start-up error patterns (fail waitForRuntimeReady fast). Kept short so
438
+ * an 80-column wrap cannot split them.
439
+ *
440
+ * @returns Error patterns
441
+ */
442
+ getRuntimeErrorPatterns() {
443
+ return [
444
+ 'command not found: agy',
445
+ 'agy: command not found',
446
+ 'Permission denied',
447
+ 'No such file or directory',
448
+ ];
449
+ }
450
+ /**
451
+ * Add folders to a running agy's workspace with `/add-dir <path>` (the
452
+ * orchestrator's project folders). The Crewly home and temp dir were
453
+ * added at launch. Waits for the idle prompt around each command so the
454
+ * registration kickoff cannot land in the middle of one.
455
+ *
456
+ * @param sessionName - PTY session name
457
+ * @param targetProjectPath - The session's working directory (already the workspace)
458
+ * @param additionalAllowlistPaths - Extra folders to add
459
+ */
460
+ async postInitialize(sessionName, targetProjectPath, additionalAllowlistPaths) {
461
+ const workspace = path.resolve(targetProjectPath || this.projectRoot);
462
+ const already = new Set([workspace, ...this.getLaunchWorkspaceDirs().map((dir) => path.resolve(dir))]);
463
+ const extra = (additionalAllowlistPaths ?? [])
464
+ .filter((p) => typeof p === 'string' && p.length > 0 && !/[\r\n]/.test(p))
465
+ .map((p) => path.resolve(p))
466
+ .filter((p, index, all) => !already.has(p) && all.indexOf(p) === index);
467
+ if (extra.length === 0)
468
+ return;
469
+ this.logger.info('Adding folders to the Antigravity workspace', { sessionName, count: extra.length });
470
+ for (const dir of extra) {
471
+ await this.waitForIdlePrompt(sessionName);
472
+ await this.sessionHelper.sendMessage(sessionName, `${ANTIGRAVITY_CONSTANTS.ADD_DIR_COMMAND} ${dir}`);
473
+ }
474
+ await this.waitForIdlePrompt(sessionName);
475
+ }
476
+ /**
477
+ * Add one folder to a running agy's workspace, but only while it is idle
478
+ * at its prompt: a slash command typed during a turn would be queued as a
479
+ * message. Used when a project is added while the orchestrator runs.
480
+ *
481
+ * @param sessionName - PTY session name
482
+ * @param dir - Folder to add
483
+ * @returns True when the command was sent, false when agy was busy or the path is unusable
484
+ */
485
+ async addWorkspaceDir(sessionName, dir) {
486
+ if (!dir || /[\r\n]/.test(dir))
487
+ return false;
488
+ try {
489
+ if (!this.isReadyForInput(this.sessionHelper.capturePane(sessionName)))
490
+ return false;
491
+ await this.sessionHelper.sendMessage(sessionName, `${ANTIGRAVITY_CONSTANTS.ADD_DIR_COMMAND} ${path.resolve(dir)}`);
492
+ return true;
493
+ }
494
+ catch (error) {
495
+ this.logger.warn('Could not add a folder to the Antigravity workspace', { sessionName, error: String(error) });
496
+ return false;
497
+ }
498
+ }
499
+ /**
500
+ * Wait (bounded) until agy shows its idle prompt.
501
+ *
502
+ * @param sessionName - PTY session name
503
+ * @returns True when idle, false on timeout
504
+ */
505
+ async waitForIdlePrompt(sessionName) {
506
+ const deadline = Date.now() + ADD_DIR_IDLE_TIMEOUT_MS;
507
+ for (;;) {
508
+ try {
509
+ if (this.isReadyForInput(this.sessionHelper.capturePane(sessionName)))
510
+ return true;
511
+ }
512
+ catch {
513
+ // keep polling
514
+ }
515
+ if (Date.now() >= deadline)
516
+ return false;
517
+ await delay(ADD_DIR_POLL_MS);
518
+ }
519
+ }
520
+ }
521
+ //# sourceMappingURL=antigravity-runtime.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"antigravity-runtime.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/antigravity-runtime.service.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"oauth-relogin-monitor.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/oauth-relogin-monitor.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"oauth-relogin-monitor.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/oauth-relogin-monitor.service.ts"],"names":[],"mappings":"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"}
@@ -27,6 +27,12 @@ import { getSessionBackendSync, } from '../session/index.js';
27
27
  import { stripAnsiCodes } from '../../utils/terminal-output.utils.js';
28
28
  import { OAUTH_RELOGIN_CONSTANTS, OAUTH_ERROR_PATTERN_SETS, LOGIN_REQUIRED_PATTERN_SETS, LOGIN_REQUIRED_CONSTANTS, ORCHESTRATOR_SESSION_NAME, RUNTIME_TYPES, } from '../../constants.js';
29
29
  import { detectLoginExpiry } from '../harness/login-expiry-rules.js';
30
+ /**
31
+ * Runtimes Crewly must never type `/login` into. Antigravity CLI runs only on
32
+ * a Gemini API key: Google does not allow third-party tools to use its
33
+ * account (OAuth) login, and agy has no `/login` command anyway.
34
+ */
35
+ const NO_RELOGIN_COMMAND_RUNTIMES = new Set([RUNTIME_TYPES.ANTIGRAVITY_CLI]);
30
36
  // =============================================================================
31
37
  // Service
32
38
  // =============================================================================
@@ -912,6 +918,10 @@ export class OAuthReloginMonitorService {
912
918
  if (!state || state.reloginInProgress) {
913
919
  return;
914
920
  }
921
+ if (NO_RELOGIN_COMMAND_RUNTIMES.has(state.runtimeType)) {
922
+ this.logger.debug('OAuth relogin skipped: this runtime never gets /login', { sessionName, runtimeType: state.runtimeType });
923
+ return;
924
+ }
915
925
  // Check cooldown
916
926
  const now = Date.now();
917
927
  if (now - state.lastReloginAt < OAUTH_RELOGIN_CONSTANTS.RELOGIN_COOLDOWN_MS) {