crewly 1.20.141 → 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 (230) 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 +153 -0
  4. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  5. package/dist/backend/backend/src/constants.js +175 -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 +41 -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 +169 -16
  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-relogin.service.d.ts.map +1 -1
  60. package/dist/backend/backend/src/services/harness/harness-relogin.service.js +15 -0
  61. package/dist/backend/backend/src/services/harness/harness-relogin.service.js.map +1 -1
  62. package/dist/backend/backend/src/services/harness/harness-status.service.d.ts +15 -1
  63. package/dist/backend/backend/src/services/harness/harness-status.service.d.ts.map +1 -1
  64. package/dist/backend/backend/src/services/harness/harness-status.service.js +34 -6
  65. package/dist/backend/backend/src/services/harness/harness-status.service.js.map +1 -1
  66. package/dist/backend/backend/src/services/harness/harness.types.d.ts +10 -3
  67. package/dist/backend/backend/src/services/harness/harness.types.d.ts.map +1 -1
  68. package/dist/backend/backend/src/services/harness/harness.types.js +4 -3
  69. package/dist/backend/backend/src/services/harness/harness.types.js.map +1 -1
  70. package/dist/backend/backend/src/services/harness/login-expiry-rules.d.ts.map +1 -1
  71. package/dist/backend/backend/src/services/harness/login-expiry-rules.js +8 -0
  72. package/dist/backend/backend/src/services/harness/login-expiry-rules.js.map +1 -1
  73. package/dist/backend/backend/src/services/mcp-tool-definitions.d.ts +1 -1
  74. package/dist/backend/backend/src/services/mcp-tool-definitions.js +1 -1
  75. package/dist/backend/backend/src/services/mcp-tool-definitions.js.map +1 -1
  76. package/dist/backend/backend/src/services/orchestrator/orchestrator-restart.service.d.ts.map +1 -1
  77. package/dist/backend/backend/src/services/orchestrator/orchestrator-restart.service.js +3 -2
  78. package/dist/backend/backend/src/services/orchestrator/orchestrator-restart.service.js.map +1 -1
  79. package/dist/backend/backend/src/services/runtime-adapter.d.ts +10 -1
  80. package/dist/backend/backend/src/services/runtime-adapter.d.ts.map +1 -1
  81. package/dist/backend/backend/src/services/runtime-adapter.js +12 -1
  82. package/dist/backend/backend/src/services/runtime-adapter.js.map +1 -1
  83. package/dist/backend/backend/src/services/settings/settings.service.d.ts.map +1 -1
  84. package/dist/backend/backend/src/services/settings/settings.service.js +1 -0
  85. package/dist/backend/backend/src/services/settings/settings.service.js.map +1 -1
  86. package/dist/backend/backend/src/types/index.d.ts +1 -1
  87. package/dist/backend/backend/src/types/index.d.ts.map +1 -1
  88. package/dist/backend/backend/src/types/settings.types.d.ts +1 -1
  89. package/dist/backend/backend/src/types/settings.types.d.ts.map +1 -1
  90. package/dist/backend/backend/src/types/settings.types.js +7 -1
  91. package/dist/backend/backend/src/types/settings.types.js.map +1 -1
  92. package/dist/backend/backend/src/types/solution-bundle.types.d.ts +1 -1
  93. package/dist/backend/backend/src/types/solution-bundle.types.d.ts.map +1 -1
  94. package/dist/backend/backend/src/types/team-template.types.d.ts +2 -2
  95. package/dist/backend/backend/src/types/team-template.types.d.ts.map +1 -1
  96. package/dist/backend/backend/src/types/team-template.types.js +1 -1
  97. package/dist/backend/backend/src/types/team-template.types.js.map +1 -1
  98. package/dist/backend/backend/src/utils/antigravity-settings.utils.d.ts +115 -0
  99. package/dist/backend/backend/src/utils/antigravity-settings.utils.d.ts.map +1 -0
  100. package/dist/backend/backend/src/utils/antigravity-settings.utils.js +181 -0
  101. package/dist/backend/backend/src/utils/antigravity-settings.utils.js.map +1 -0
  102. package/dist/backend/backend/src/utils/runtime-model-flags.utils.d.ts +3 -2
  103. package/dist/backend/backend/src/utils/runtime-model-flags.utils.d.ts.map +1 -1
  104. package/dist/backend/backend/src/utils/runtime-model-flags.utils.js +13 -3
  105. package/dist/backend/backend/src/utils/runtime-model-flags.utils.js.map +1 -1
  106. package/dist/backend/backend/src/utils/terminal-string-ops.d.ts +1 -0
  107. package/dist/backend/backend/src/utils/terminal-string-ops.d.ts.map +1 -1
  108. package/dist/backend/backend/src/utils/terminal-string-ops.js +29 -1
  109. package/dist/backend/backend/src/utils/terminal-string-ops.js.map +1 -1
  110. package/dist/backend/build-info.json +2 -2
  111. package/dist/cli/backend/src/constants.d.ts +153 -0
  112. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  113. package/dist/cli/backend/src/constants.js +175 -0
  114. package/dist/cli/backend/src/constants.js.map +1 -1
  115. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts +41 -1
  116. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  117. package/dist/cli/backend/src/services/agent/agent-registration.service.js +169 -16
  118. package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
  119. package/dist/cli/backend/src/services/agent/antigravity-runtime.service.d.ts +267 -0
  120. package/dist/cli/backend/src/services/agent/antigravity-runtime.service.d.ts.map +1 -0
  121. package/dist/cli/backend/src/services/agent/antigravity-runtime.service.js +521 -0
  122. package/dist/cli/backend/src/services/agent/antigravity-runtime.service.js.map +1 -0
  123. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -1
  124. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.js +10 -0
  125. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -1
  126. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -1
  127. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js +12 -1
  128. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
  129. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
  130. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js +3 -1
  131. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
  132. package/dist/cli/backend/src/services/agent/runtime-service.factory.d.ts.map +1 -1
  133. package/dist/cli/backend/src/services/agent/runtime-service.factory.js +9 -0
  134. package/dist/cli/backend/src/services/agent/runtime-service.factory.js.map +1 -1
  135. package/dist/cli/backend/src/services/agent/runtime-session-recovery.d.ts +57 -1
  136. package/dist/cli/backend/src/services/agent/runtime-session-recovery.d.ts.map +1 -1
  137. package/dist/cli/backend/src/services/agent/runtime-session-recovery.js +176 -2
  138. package/dist/cli/backend/src/services/agent/runtime-session-recovery.js.map +1 -1
  139. package/dist/cli/backend/src/services/agent/runtime-startup-blocked.error.d.ts +15 -3
  140. package/dist/cli/backend/src/services/agent/runtime-startup-blocked.error.d.ts.map +1 -1
  141. package/dist/cli/backend/src/services/agent/runtime-startup-blocked.error.js +2 -1
  142. package/dist/cli/backend/src/services/agent/runtime-startup-blocked.error.js.map +1 -1
  143. package/dist/cli/backend/src/services/harness/harness-api-key.service.d.ts +26 -0
  144. package/dist/cli/backend/src/services/harness/harness-api-key.service.d.ts.map +1 -1
  145. package/dist/cli/backend/src/services/harness/harness-api-key.service.js +65 -5
  146. package/dist/cli/backend/src/services/harness/harness-api-key.service.js.map +1 -1
  147. package/dist/cli/backend/src/services/harness/harness-credentials.store.d.ts +37 -6
  148. package/dist/cli/backend/src/services/harness/harness-credentials.store.d.ts.map +1 -1
  149. package/dist/cli/backend/src/services/harness/harness-credentials.store.js +57 -9
  150. package/dist/cli/backend/src/services/harness/harness-credentials.store.js.map +1 -1
  151. package/dist/cli/backend/src/services/harness/harness-install.service.d.ts +60 -7
  152. package/dist/cli/backend/src/services/harness/harness-install.service.d.ts.map +1 -1
  153. package/dist/cli/backend/src/services/harness/harness-install.service.js +154 -37
  154. package/dist/cli/backend/src/services/harness/harness-install.service.js.map +1 -1
  155. package/dist/cli/backend/src/services/harness/harness-registry.d.ts +46 -5
  156. package/dist/cli/backend/src/services/harness/harness-registry.d.ts.map +1 -1
  157. package/dist/cli/backend/src/services/harness/harness-registry.js +53 -8
  158. package/dist/cli/backend/src/services/harness/harness-registry.js.map +1 -1
  159. package/dist/cli/backend/src/services/harness/harness-relogin.service.d.ts.map +1 -1
  160. package/dist/cli/backend/src/services/harness/harness-relogin.service.js +15 -0
  161. package/dist/cli/backend/src/services/harness/harness-relogin.service.js.map +1 -1
  162. package/dist/cli/backend/src/services/harness/harness-status.service.d.ts +15 -1
  163. package/dist/cli/backend/src/services/harness/harness-status.service.d.ts.map +1 -1
  164. package/dist/cli/backend/src/services/harness/harness-status.service.js +34 -6
  165. package/dist/cli/backend/src/services/harness/harness-status.service.js.map +1 -1
  166. package/dist/cli/backend/src/services/harness/harness.types.d.ts +10 -3
  167. package/dist/cli/backend/src/services/harness/harness.types.d.ts.map +1 -1
  168. package/dist/cli/backend/src/services/harness/harness.types.js +4 -3
  169. package/dist/cli/backend/src/services/harness/harness.types.js.map +1 -1
  170. package/dist/cli/backend/src/services/harness/login-expiry-rules.d.ts.map +1 -1
  171. package/dist/cli/backend/src/services/harness/login-expiry-rules.js +8 -0
  172. package/dist/cli/backend/src/services/harness/login-expiry-rules.js.map +1 -1
  173. package/dist/cli/backend/src/services/mcp-tool-definitions.d.ts +1 -1
  174. package/dist/cli/backend/src/services/mcp-tool-definitions.js +1 -1
  175. package/dist/cli/backend/src/services/mcp-tool-definitions.js.map +1 -1
  176. package/dist/cli/backend/src/services/orchestrator/orchestrator-restart.service.d.ts.map +1 -1
  177. package/dist/cli/backend/src/services/orchestrator/orchestrator-restart.service.js +3 -2
  178. package/dist/cli/backend/src/services/orchestrator/orchestrator-restart.service.js.map +1 -1
  179. package/dist/cli/backend/src/services/settings/settings.service.d.ts.map +1 -1
  180. package/dist/cli/backend/src/services/settings/settings.service.js +1 -0
  181. package/dist/cli/backend/src/services/settings/settings.service.js.map +1 -1
  182. package/dist/cli/backend/src/types/index.d.ts +1 -1
  183. package/dist/cli/backend/src/types/index.d.ts.map +1 -1
  184. package/dist/cli/backend/src/types/settings.types.d.ts +1 -1
  185. package/dist/cli/backend/src/types/settings.types.d.ts.map +1 -1
  186. package/dist/cli/backend/src/types/settings.types.js +7 -1
  187. package/dist/cli/backend/src/types/settings.types.js.map +1 -1
  188. package/dist/cli/backend/src/types/solution-bundle.types.d.ts +1 -1
  189. package/dist/cli/backend/src/types/solution-bundle.types.d.ts.map +1 -1
  190. package/dist/cli/backend/src/types/team-template.types.d.ts +2 -2
  191. package/dist/cli/backend/src/types/team-template.types.d.ts.map +1 -1
  192. package/dist/cli/backend/src/types/team-template.types.js +1 -1
  193. package/dist/cli/backend/src/types/team-template.types.js.map +1 -1
  194. package/dist/cli/backend/src/utils/antigravity-settings.utils.d.ts +115 -0
  195. package/dist/cli/backend/src/utils/antigravity-settings.utils.d.ts.map +1 -0
  196. package/dist/cli/backend/src/utils/antigravity-settings.utils.js +181 -0
  197. package/dist/cli/backend/src/utils/antigravity-settings.utils.js.map +1 -0
  198. package/dist/cli/backend/src/utils/runtime-model-flags.utils.d.ts +3 -2
  199. package/dist/cli/backend/src/utils/runtime-model-flags.utils.d.ts.map +1 -1
  200. package/dist/cli/backend/src/utils/runtime-model-flags.utils.js +13 -3
  201. package/dist/cli/backend/src/utils/runtime-model-flags.utils.js.map +1 -1
  202. package/dist/cli/backend/src/utils/terminal-string-ops.d.ts +1 -0
  203. package/dist/cli/backend/src/utils/terminal-string-ops.d.ts.map +1 -1
  204. package/dist/cli/backend/src/utils/terminal-string-ops.js +29 -1
  205. package/dist/cli/backend/src/utils/terminal-string-ops.js.map +1 -1
  206. package/dist/cli/cli/src/commands/doctor.d.ts +2 -2
  207. package/dist/cli/cli/src/commands/doctor.d.ts.map +1 -1
  208. package/dist/cli/cli/src/commands/doctor.js +6 -3
  209. package/dist/cli/cli/src/commands/doctor.js.map +1 -1
  210. package/dist/cli/cli/src/commands/harness-setup.d.ts +21 -1
  211. package/dist/cli/cli/src/commands/harness-setup.d.ts.map +1 -1
  212. package/dist/cli/cli/src/commands/harness-setup.js +53 -16
  213. package/dist/cli/cli/src/commands/harness-setup.js.map +1 -1
  214. package/dist/cli/cli/src/commands/harness.d.ts +2 -2
  215. package/dist/cli/cli/src/commands/harness.d.ts.map +1 -1
  216. package/dist/cli/cli/src/commands/harness.js +6 -5
  217. package/dist/cli/cli/src/commands/harness.js.map +1 -1
  218. package/dist/cli/cli/src/commands/onboard.d.ts +7 -5
  219. package/dist/cli/cli/src/commands/onboard.d.ts.map +1 -1
  220. package/dist/cli/cli/src/commands/onboard.js +6 -4
  221. package/dist/cli/cli/src/commands/onboard.js.map +1 -1
  222. package/dist/cli/cli/src/index.js +3 -3
  223. package/dist/cli/cli/src/index.js.map +1 -1
  224. package/dist/cli/cli/src/utils/runtime-auth.d.ts +42 -5
  225. package/dist/cli/cli/src/utils/runtime-auth.d.ts.map +1 -1
  226. package/dist/cli/cli/src/utils/runtime-auth.js +78 -6
  227. package/dist/cli/cli/src/utils/runtime-auth.js.map +1 -1
  228. package/frontend/dist/assets/{index-b4d5575e.js → index-e05af897.js} +271 -271
  229. package/frontend/dist/index.html +1 -1
  230. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  import { createHash } from 'crypto';
2
- import { harnessEnvForAgents } from '../harness/harness-credentials.store.js';
2
+ import { getHarnessCredentialsStore, harnessEnvForAgents } from '../harness/harness-credentials.store.js';
3
3
  import * as path from 'path';
4
4
  import * as os from 'os';
5
5
  import { readFile, readdir, stat, mkdir, writeFile, access } from 'fs/promises';
@@ -33,7 +33,8 @@ import { isPromptLine, containsSpinnerOrWorkingIndicator, containsProcessingIndi
33
33
  import { PtyActivityTrackerService } from './pty-activity-tracker.service.js';
34
34
  import { synthesizeSlackConversationId } from '../chat-v2/legacy-dto.utils.js';
35
35
  import { isRuntimeStartupBlockedError } from './runtime-startup-blocked.error.js';
36
- import { buildHandoverSummary, claudeTranscriptPath, conversationExists, lastTurnContextTokens, orcFreshContextTokens, planRuntimeSessionFlags, waitForCodexSessionId, } from './runtime-session-recovery.js';
36
+ import { buildHandoverSummary, claudeTranscriptPath, conversationExists, lastTurnContextTokens, orcFreshContextTokens, planRuntimeSessionFlags, waitForAntigravityConversationId, waitForCodexSessionId, } from './runtime-session-recovery.js';
37
+ import { isTextInAntigravityInputBox } from './antigravity-runtime.service.js';
37
38
  import { getLocalApiBaseUrl } from '../../utils/local-api-url.utils.js';
38
39
  import { RegistrationFlowRegistry } from './registration-flow-registry.js';
39
40
  import { buildResumedKickoff } from './resumed-kickoff.js';
@@ -892,6 +893,10 @@ export class AgentRegistrationService {
892
893
  return buildResumedKickoff({ projectRoot: this.projectRoot, sessionName, role, promptFilePath });
893
894
  }
894
895
  recordRuntimeSessionAfterLaunch(sessionName, runtimeType, cwd, launchedAtMs, plan) {
896
+ if (runtimeType === RUNTIME_TYPES.ANTIGRAVITY_CLI) {
897
+ this.recordAntigravityConversationAfterLaunch(sessionName, cwd, launchedAtMs, plan);
898
+ return;
899
+ }
895
900
  if (runtimeType !== RUNTIME_TYPES.CODEX_CLI || plan.resumeSessionId || !cwd)
896
901
  return;
897
902
  let persistence;
@@ -923,6 +928,61 @@ export class AgentRegistrationService {
923
928
  });
924
929
  });
925
930
  }
931
+ /**
932
+ * For a freshly launched Antigravity agent, learn its conversation id and
933
+ * persist it so a restart can resume with `agy --conversation=<id>`.
934
+ * agy creates the conversation when the first prompt (the registration
935
+ * kickoff) arrives; the conversation whose logs mention this agent's init
936
+ * prompt file wins, else agy's latest conversation for the workspace.
937
+ * Runs in the background; never throws.
938
+ *
939
+ * @param sessionName - Agent session
940
+ * @param cwd - The agent's working directory (agy's workspace)
941
+ * @param launchedAtMs - When the launch command was sent
942
+ * @param plan - The launch plan (skips when resuming a known id)
943
+ */
944
+ recordAntigravityConversationAfterLaunch(sessionName, cwd, launchedAtMs, plan) {
945
+ if (plan.resumeSessionId || !cwd)
946
+ return;
947
+ let persistence;
948
+ const claimed = new Set();
949
+ try {
950
+ persistence = getSessionStatePersistence();
951
+ for (const name of persistence.getRegisteredSessions()) {
952
+ const id = persistence.getSessionId(name);
953
+ if (id && name !== sessionName)
954
+ claimed.add(id);
955
+ }
956
+ }
957
+ catch (err) {
958
+ // No (usable) persistence: nothing to record into; the launch goes on.
959
+ this.logger.debug('Antigravity conversation id not recorded: session persistence unavailable', {
960
+ sessionName,
961
+ error: err instanceof Error ? err.message : String(err),
962
+ });
963
+ return;
964
+ }
965
+ void waitForAntigravityConversationId({
966
+ cwd,
967
+ notBeforeMs: launchedAtMs,
968
+ claimed,
969
+ marker: path.basename(this.getInitPromptFilePath(sessionName)),
970
+ })
971
+ .then((conversationId) => {
972
+ if (!conversationId) {
973
+ this.logger.warn('Antigravity conversation id not found after launch (resume after restart will not work)', { sessionName, cwd });
974
+ return;
975
+ }
976
+ persistence.updateSessionId(sessionName, conversationId);
977
+ this.logger.info('Antigravity conversation id recorded', { sessionName, sessionId: conversationId });
978
+ })
979
+ .catch((err) => {
980
+ this.logger.debug('Antigravity conversation id discovery failed (non-fatal)', {
981
+ sessionName,
982
+ error: err instanceof Error ? err.message : String(err),
983
+ });
984
+ });
985
+ }
926
986
  /**
927
987
  * Get the check interval based on environment.
928
988
  * Uses shorter intervals in test environment for faster tests.
@@ -1381,6 +1441,7 @@ export class AgentRegistrationService {
1381
1441
  * - Gemini CLI → GEMINI.md (project root)
1382
1442
  * - Codex → AGENTS.md (project root)
1383
1443
  * - OpenCode → AGENTS.md (project root, same convention as Codex — #306)
1444
+ * - Antigravity → AGENTS.md (project root; agy reads GEMINI.md and AGENTS.md)
1384
1445
  *
1385
1446
  * Uses 'wx' flag to avoid overwriting existing files.
1386
1447
  *
@@ -1406,6 +1467,11 @@ export class AgentRegistrationService {
1406
1467
  template: 'agent-agents-md.md',
1407
1468
  outputPath: path.join(projectPath, 'AGENTS.md'),
1408
1469
  },
1470
+ // agy reads both GEMINI.md and AGENTS.md (antigravity.google/docs/cli/gcli-migration)
1471
+ [RUNTIME_TYPES.ANTIGRAVITY_CLI]: {
1472
+ template: 'agent-agents-md.md',
1473
+ outputPath: path.join(projectPath, 'AGENTS.md'),
1474
+ },
1409
1475
  };
1410
1476
  const config = configMap[runtimeType];
1411
1477
  if (!config)
@@ -1474,9 +1540,11 @@ export class AgentRegistrationService {
1474
1540
  // every log line still said "sent successfully" (server-install finding 3).
1475
1541
  if (cancelled())
1476
1542
  return;
1477
- await this.waitForRuntimeInputReady(sessionName, runtimeType, signal);
1543
+ const inputReady = await this.waitForRuntimeInputReady(sessionName, runtimeType, signal);
1478
1544
  if (cancelled())
1479
1545
  return;
1546
+ if (!inputReady && (await this.isOnSignInScreen(sessionName)))
1547
+ return;
1480
1548
  const sent = await this.sendPromptRobustly(sessionName, prompt, runtimeType, signal);
1481
1549
  if (sent) {
1482
1550
  this.logger.info('Registration prompt sent successfully', { sessionName, role });
@@ -1504,6 +1572,30 @@ export class AgentRegistrationService {
1504
1572
  this.registrationFlows.end(flow);
1505
1573
  }
1506
1574
  }
1575
+ /**
1576
+ * Whether the runtime is sitting on its sign-in screen. Typing the kickoff
1577
+ * there after the input-ready timeout put the instruction text into
1578
+ * Codex's "Provide your own API key" box: it became the "API key", every
1579
+ * call 401'd, and the 401 set off a re-login that wiped the owner's fresh
1580
+ * ChatGPT sign-in (2026-09-26, Nova). Nothing is typed; the login monitor
1581
+ * sees the screen and asks the owner to sign in.
1582
+ *
1583
+ * @param sessionName - Session
1584
+ * @returns True when the screen is a sign-in / login prompt
1585
+ */
1586
+ async isOnSignInScreen(sessionName) {
1587
+ let screen = '';
1588
+ try {
1589
+ screen = (await this.getSessionHelper()).capturePane(sessionName);
1590
+ }
1591
+ catch {
1592
+ return false;
1593
+ }
1594
+ if (!isSignInScreen(screen))
1595
+ return false;
1596
+ this.logger.warn('Runtime is on its sign-in screen — not typing the registration instruction into it', { sessionName });
1597
+ return true;
1598
+ }
1507
1599
  /**
1508
1600
  * Poll the PTY screen until the runtime is idle at its input prompt
1509
1601
  * (`RuntimeAgentService.isReadyForInput`) or the timeout elapses.
@@ -1625,9 +1717,11 @@ export class AgentRegistrationService {
1625
1717
  this.logger.warn('No registration within timeout — re-delivering registration instruction', {
1626
1718
  sessionName, role, runtimeType, timeoutMs: timeout,
1627
1719
  });
1628
- await this.waitForRuntimeInputReady(sessionName, runtimeType, abortSignal);
1720
+ const readyAgain = await this.waitForRuntimeInputReady(sessionName, runtimeType, abortSignal);
1629
1721
  if (this.isFlowCancelled(sessionName, abortSignal))
1630
1722
  return;
1723
+ if (!readyAgain && (await this.isOnSignInScreen(sessionName)))
1724
+ return;
1631
1725
  const resent = await this.sendPromptRobustly(sessionName, prompt, runtimeType, abortSignal);
1632
1726
  this.logger.info('registration re-delivered', { sessionName, role, runtimeType, resent });
1633
1727
  }
@@ -1677,6 +1771,7 @@ export class AgentRegistrationService {
1677
1771
  await this.createOrchestratorSession({
1678
1772
  sessionName,
1679
1773
  projectPath: orchestratorCwd,
1774
+ runtimeType,
1680
1775
  });
1681
1776
  // D3: let the shell print its prompt before the init sequence's Ctrl-C.
1682
1777
  await this.waitForShellReady(sessionName);
@@ -1735,7 +1830,7 @@ export class AgentRegistrationService {
1735
1830
  // and channel replies).
1736
1831
  const recreationCwd = projectPath || process.cwd();
1737
1832
  await (await this.getSessionHelper()).createSession(sessionName, recreationCwd, {
1738
- env: this.buildAgentIdentityEnv(sessionName, role, recreationCwd),
1833
+ env: this.buildAgentIdentityEnv(sessionName, role, recreationCwd, runtimeType),
1739
1834
  });
1740
1835
  // D3: let the shell print its prompt before the init sequence's Ctrl-C.
1741
1836
  await this.waitForShellReady(sessionName);
@@ -2677,7 +2772,7 @@ Loop until done, blocked, or explicitly reassigned:
2677
2772
  // Create new session for orchestrator — with the identity env (D1), the
2678
2773
  // same object the primary path spawns with. windowName not used in PTY backend.
2679
2774
  await (await this.getSessionHelper()).createSession(config.sessionName, config.projectPath, {
2680
- env: this.buildAgentIdentityEnv(config.sessionName, ORCHESTRATOR_ROLE, config.projectPath),
2775
+ env: this.buildAgentIdentityEnv(config.sessionName, ORCHESTRATOR_ROLE, config.projectPath, config.runtimeType),
2681
2776
  });
2682
2777
  this.logger.info('Orchestrator session created successfully', {
2683
2778
  sessionName: config.sessionName,
@@ -2696,16 +2791,20 @@ Loop until done, blocked, or explicitly reassigned:
2696
2791
  * It also carries the harness env (harnessEnvForAgents): PATH with the
2697
2792
  * user npm prefix (`~/.crewly/npm-global/bin`, where a harness lands when
2698
2793
  * `npm install -g` hit EACCES) and the Claude credential Crewly holds from
2699
- * onboarding (`CLAUDE_CODE_OAUTH_TOKEN` or `ANTHROPIC_API_KEY`).
2794
+ * onboarding (`CLAUDE_CODE_OAUTH_TOKEN` or `ANTHROPIC_API_KEY`). For an
2795
+ * Antigravity session it adds the saved Gemini key as `GEMINI_API_KEY`
2796
+ * (agy reads the key only from its environment) — in the spawn env, so it
2797
+ * is never typed into the terminal.
2700
2798
  *
2701
2799
  * @param sessionName - PTY session name (also the agent's identity)
2702
2800
  * @param role - Agent role (orchestrator, developer, …)
2703
2801
  * @param cwd - Working directory the PTY is spawned in (exposed as CREWLY_PROJECT_PATH)
2802
+ * @param runtimeType - Runtime the session will run, when known
2704
2803
  * @returns Env map to pass as `createSession(..., { env })`
2705
2804
  */
2706
- buildAgentIdentityEnv(sessionName, role, cwd) {
2805
+ buildAgentIdentityEnv(sessionName, role, cwd, runtimeType) {
2707
2806
  return {
2708
- ...harnessEnvForAgents(),
2807
+ ...harnessEnvForAgents(process.env, runtimeType),
2709
2808
  [ENV_CONSTANTS.CREWLY_SESSION_NAME]: sessionName,
2710
2809
  [ENV_CONSTANTS.CREWLY_ROLE]: role,
2711
2810
  // The port this instance actually runs on, not the default (#777).
@@ -3196,7 +3295,7 @@ Loop until done, blocked, or explicitly reassigned:
3196
3295
  // reply-channel fails with a misleading 404 (Think Tank, 2026-09-18).
3197
3296
  // Same env object as the Step-2 recreation path (buildAgentIdentityEnv).
3198
3297
  const createdSession = await sessionHelper.createSession(sessionName, cwdToUse, {
3199
- env: this.buildAgentIdentityEnv(sessionName, role, cwdToUse),
3298
+ env: this.buildAgentIdentityEnv(sessionName, role, cwdToUse, runtimeType),
3200
3299
  });
3201
3300
  this.logger.info('PTY session created successfully', {
3202
3301
  sessionName,
@@ -3252,8 +3351,12 @@ Loop until done, blocked, or explicitly reassigned:
3252
3351
  // on the child's spawn environment instead.
3253
3352
  const settingsService = getSettingsService();
3254
3353
  const runtimeContext = { runtime: runtimeType };
3255
- // Gemini key — needed by gemini-cli and crewly-agent
3256
- const geminiKey = await settingsService.getApiKey('gemini', runtimeContext);
3354
+ // Gemini key — needed by gemini-cli, antigravity-cli and crewly-agent.
3355
+ // An Antigravity session whose key was saved in Settings → Harness
3356
+ // already got it at spawn (buildAgentIdentityEnv); a settings key
3357
+ // must not override it, and the saved key is never typed here.
3358
+ const antigravityKeyAtSpawn = runtimeType === RUNTIME_TYPES.ANTIGRAVITY_CLI && getHarnessCredentialsStore().getAntigravityGeminiApiKey() !== null;
3359
+ const geminiKey = antigravityKeyAtSpawn ? undefined : await settingsService.getApiKey('gemini', runtimeContext);
3257
3360
  if (geminiKey) {
3258
3361
  await sessionHelper.setEnvironmentVariable(sessionName, 'GOOGLE_GENERATIVE_AI_API_KEY', geminiKey);
3259
3362
  await sessionHelper.setEnvironmentVariable(sessionName, ENV_CONSTANTS.GEMINI_API_KEY, geminiKey);
@@ -3891,6 +3994,7 @@ Loop until done, blocked, or explicitly reassigned:
3891
3994
  const isClaudeCode = runtimeType === RUNTIME_TYPES.CLAUDE_CODE;
3892
3995
  const isCodexCli = runtimeType === RUNTIME_TYPES.CODEX_CLI;
3893
3996
  const isGeminiCli = runtimeType === RUNTIME_TYPES.GEMINI_CLI;
3997
+ const isAntigravity = runtimeType === RUNTIME_TYPES.ANTIGRAVITY_CLI;
3894
3998
  // Register TUI sessions for TUI prompt-line scanning (Part 1 of scanner).
3895
3999
  // The scanner itself is started lazily by trackSentMessage() which
3896
4000
  // runs after every message send, covering all runtimes.
@@ -4015,6 +4119,16 @@ Loop until done, blocked, or explicitly reassigned:
4015
4119
  await sessionHelper.sendKey(sessionName, 'Tab');
4016
4120
  await delay(300);
4017
4121
  }
4122
+ else if (isAntigravity) {
4123
+ // Antigravity CLI: Ctrl+U clears stale input (verified on agy
4124
+ // 1.2.11). No Tab/Enter nudges: Tab completes slash commands and
4125
+ // the binary labels its spinner "Generating... (Enter/Esc to
4126
+ // cancel)", so a stray Enter or Esc can cancel a running turn.
4127
+ if (attempt > 1) {
4128
+ await sessionHelper.sendKey(sessionName, 'C-u');
4129
+ await delay(300);
4130
+ }
4131
+ }
4018
4132
  else if (isCodexCli) {
4019
4133
  // #246: Codex CLI TUI recovery — simpler than Gemini.
4020
4134
  // Codex uses Ink-based TUI with › prompt. Avoid Gemini-specific
@@ -4514,7 +4628,25 @@ Loop until done, blocked, or explicitly reassigned:
4514
4628
  // literally sitting on the `> ` prompt line). If not stuck, trust the
4515
4629
  // write. Skip the output-change heuristics that cause false negatives.
4516
4630
  const isGemini = runtimeType === RUNTIME_TYPES.GEMINI_CLI;
4517
- if (isGemini) {
4631
+ if (isAntigravity) {
4632
+ // --- Antigravity CLI: prompt-box check only ---
4633
+ // agy echoes every submitted message as `> text` above its
4634
+ // prompt box, so the generic "text on a `>` line" check would
4635
+ // call a delivered message stuck. Only the box itself counts.
4636
+ const screen = sessionHelper.capturePane(sessionName);
4637
+ if (!isTextInAntigravityInputBox(screen, message)) {
4638
+ this.logger.debug('Antigravity: message left the prompt box — delivery trusted', { sessionName, attempt });
4639
+ return true;
4640
+ }
4641
+ this.logger.warn('Antigravity: message still in the prompt box — pressing Enter once', { sessionName, attempt });
4642
+ await sessionHelper.sendEnter(sessionName);
4643
+ await delay(SESSION_COMMAND_DELAYS.MESSAGE_PROCESSING_DELAY);
4644
+ if (!isTextInAntigravityInputBox(sessionHelper.capturePane(sessionName), message)) {
4645
+ return true;
4646
+ }
4647
+ this.logger.warn('Antigravity: message still in the prompt box after Enter', { sessionName, attempt });
4648
+ }
4649
+ else if (isGemini) {
4518
4650
  // Single stuck-at-prompt check — the only reliable failure signal
4519
4651
  const stuckAtPrompt = this.isTextStuckAtTuiPrompt(sessionName, message);
4520
4652
  if (stuckAtPrompt) {
@@ -4615,6 +4747,12 @@ Loop until done, blocked, or explicitly reassigned:
4615
4747
  if (isClaudeCode) {
4616
4748
  await sessionHelper.clearCurrentCommandLine(sessionName);
4617
4749
  }
4750
+ else if (isAntigravity) {
4751
+ // Antigravity: clear the prompt box (Ctrl+U) so the retry types
4752
+ // the message into an empty box. No Ctrl+C (arms exit), no Tab.
4753
+ await sessionHelper.sendKey(sessionName, 'C-u');
4754
+ await delay(300);
4755
+ }
4618
4756
  else {
4619
4757
  // Gemini CLI retry cleanup: NEVER send Ctrl+C — it triggers /quit
4620
4758
  // and kills the CLI entirely, regardless of whether text is in the
@@ -4890,7 +5028,10 @@ Loop until done, blocked, or explicitly reassigned:
4890
5028
  try {
4891
5029
  // Skip Gemini CLI sessions — their TUI prompt behaves differently
4892
5030
  // and false-positive stuck detection causes Tab+Enter spam.
4893
- if (runtimeType === RUNTIME_TYPES.GEMINI_CLI) {
5031
+ // Skip Antigravity too: its idle placeholder and the `> text` echo
5032
+ // of every submitted message sit on `>` lines, and Enter during a
5033
+ // turn can cancel it; its deliveries are verified on the prompt box.
5034
+ if (runtimeType === RUNTIME_TYPES.GEMINI_CLI || runtimeType === RUNTIME_TYPES.ANTIGRAVITY_CLI) {
4894
5035
  continue;
4895
5036
  }
4896
5037
  // #213: Skip orchestrator — it frequently waits for long-running
@@ -4960,7 +5101,7 @@ Loop until done, blocked, or explicitly reassigned:
4960
5101
  // Skip Gemini CLI sessions — Tab+Enter recovery causes more harm
4961
5102
  // than good because the Gemini TUI handles input differently.
4962
5103
  const trackedRuntime = this.tuiSessionRegistry.get(sessionName);
4963
- if (trackedRuntime === RUNTIME_TYPES.GEMINI_CLI) {
5104
+ if (trackedRuntime === RUNTIME_TYPES.GEMINI_CLI || trackedRuntime === RUNTIME_TYPES.ANTIGRAVITY_CLI) {
4964
5105
  continue;
4965
5106
  }
4966
5107
  try {
@@ -5375,10 +5516,11 @@ Loop until done, blocked, or explicitly reassigned:
5375
5516
  await sessionHelper.sendKey(sessionName, 'C-u');
5376
5517
  await delay(300);
5377
5518
  }
5378
- else if (runtimeType === RUNTIME_TYPES.CODEX_CLI) {
5519
+ else if (runtimeType === RUNTIME_TYPES.CODEX_CLI || runtimeType === RUNTIME_TYPES.ANTIGRAVITY_CLI) {
5379
5520
  // #246: Codex CLI — Ctrl+U to clear any stale input text.
5380
5521
  // Unlike Gemini, Codex doesn't need Enter flush; its Ink TUI
5381
5522
  // handles Ctrl+U for line clear similar to Claude Code.
5523
+ // Antigravity clears its prompt box on Ctrl+U the same way.
5382
5524
  await sessionHelper.sendKey(sessionName, 'C-u');
5383
5525
  await delay(300);
5384
5526
  }
@@ -5513,4 +5655,15 @@ export function codexHasOwnLogin(env = process.env) {
5513
5655
  const home = env.CODEX_HOME && env.CODEX_HOME.length > 0 ? env.CODEX_HOME : path.join(os.homedir(), '.codex');
5514
5656
  return existsSync(path.join(home, 'auth.json'));
5515
5657
  }
5658
+ /** Sign-in prompts of the CLI runtimes (compared with spaces removed: TUIs drop them). */
5659
+ const SIGN_IN_SCREEN = /signinwithchatgpt|provideyourownapikey|signinwithdevicecode|pastecodehereifprompted|usetheurlbelowtosignin|loginwithgoogle/i;
5660
+ /**
5661
+ * Whether a captured screen is a runtime's sign-in / login prompt.
5662
+ *
5663
+ * @param screen - Captured terminal text
5664
+ * @returns True for a sign-in screen
5665
+ */
5666
+ export function isSignInScreen(screen) {
5667
+ return SIGN_IN_SCREEN.test((screen ?? '').replace(/\s+/g, ''));
5668
+ }
5516
5669
  //# sourceMappingURL=agent-registration.service.js.map