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
@@ -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)
@@ -1705,6 +1771,7 @@ export class AgentRegistrationService {
1705
1771
  await this.createOrchestratorSession({
1706
1772
  sessionName,
1707
1773
  projectPath: orchestratorCwd,
1774
+ runtimeType,
1708
1775
  });
1709
1776
  // D3: let the shell print its prompt before the init sequence's Ctrl-C.
1710
1777
  await this.waitForShellReady(sessionName);
@@ -1763,7 +1830,7 @@ export class AgentRegistrationService {
1763
1830
  // and channel replies).
1764
1831
  const recreationCwd = projectPath || process.cwd();
1765
1832
  await (await this.getSessionHelper()).createSession(sessionName, recreationCwd, {
1766
- env: this.buildAgentIdentityEnv(sessionName, role, recreationCwd),
1833
+ env: this.buildAgentIdentityEnv(sessionName, role, recreationCwd, runtimeType),
1767
1834
  });
1768
1835
  // D3: let the shell print its prompt before the init sequence's Ctrl-C.
1769
1836
  await this.waitForShellReady(sessionName);
@@ -2705,7 +2772,7 @@ Loop until done, blocked, or explicitly reassigned:
2705
2772
  // Create new session for orchestrator — with the identity env (D1), the
2706
2773
  // same object the primary path spawns with. windowName not used in PTY backend.
2707
2774
  await (await this.getSessionHelper()).createSession(config.sessionName, config.projectPath, {
2708
- env: this.buildAgentIdentityEnv(config.sessionName, ORCHESTRATOR_ROLE, config.projectPath),
2775
+ env: this.buildAgentIdentityEnv(config.sessionName, ORCHESTRATOR_ROLE, config.projectPath, config.runtimeType),
2709
2776
  });
2710
2777
  this.logger.info('Orchestrator session created successfully', {
2711
2778
  sessionName: config.sessionName,
@@ -2724,16 +2791,20 @@ Loop until done, blocked, or explicitly reassigned:
2724
2791
  * It also carries the harness env (harnessEnvForAgents): PATH with the
2725
2792
  * user npm prefix (`~/.crewly/npm-global/bin`, where a harness lands when
2726
2793
  * `npm install -g` hit EACCES) and the Claude credential Crewly holds from
2727
- * 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.
2728
2798
  *
2729
2799
  * @param sessionName - PTY session name (also the agent's identity)
2730
2800
  * @param role - Agent role (orchestrator, developer, …)
2731
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
2732
2803
  * @returns Env map to pass as `createSession(..., { env })`
2733
2804
  */
2734
- buildAgentIdentityEnv(sessionName, role, cwd) {
2805
+ buildAgentIdentityEnv(sessionName, role, cwd, runtimeType) {
2735
2806
  return {
2736
- ...harnessEnvForAgents(),
2807
+ ...harnessEnvForAgents(process.env, runtimeType),
2737
2808
  [ENV_CONSTANTS.CREWLY_SESSION_NAME]: sessionName,
2738
2809
  [ENV_CONSTANTS.CREWLY_ROLE]: role,
2739
2810
  // The port this instance actually runs on, not the default (#777).
@@ -3224,7 +3295,7 @@ Loop until done, blocked, or explicitly reassigned:
3224
3295
  // reply-channel fails with a misleading 404 (Think Tank, 2026-09-18).
3225
3296
  // Same env object as the Step-2 recreation path (buildAgentIdentityEnv).
3226
3297
  const createdSession = await sessionHelper.createSession(sessionName, cwdToUse, {
3227
- env: this.buildAgentIdentityEnv(sessionName, role, cwdToUse),
3298
+ env: this.buildAgentIdentityEnv(sessionName, role, cwdToUse, runtimeType),
3228
3299
  });
3229
3300
  this.logger.info('PTY session created successfully', {
3230
3301
  sessionName,
@@ -3280,8 +3351,12 @@ Loop until done, blocked, or explicitly reassigned:
3280
3351
  // on the child's spawn environment instead.
3281
3352
  const settingsService = getSettingsService();
3282
3353
  const runtimeContext = { runtime: runtimeType };
3283
- // Gemini key — needed by gemini-cli and crewly-agent
3284
- 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);
3285
3360
  if (geminiKey) {
3286
3361
  await sessionHelper.setEnvironmentVariable(sessionName, 'GOOGLE_GENERATIVE_AI_API_KEY', geminiKey);
3287
3362
  await sessionHelper.setEnvironmentVariable(sessionName, ENV_CONSTANTS.GEMINI_API_KEY, geminiKey);
@@ -3919,6 +3994,7 @@ Loop until done, blocked, or explicitly reassigned:
3919
3994
  const isClaudeCode = runtimeType === RUNTIME_TYPES.CLAUDE_CODE;
3920
3995
  const isCodexCli = runtimeType === RUNTIME_TYPES.CODEX_CLI;
3921
3996
  const isGeminiCli = runtimeType === RUNTIME_TYPES.GEMINI_CLI;
3997
+ const isAntigravity = runtimeType === RUNTIME_TYPES.ANTIGRAVITY_CLI;
3922
3998
  // Register TUI sessions for TUI prompt-line scanning (Part 1 of scanner).
3923
3999
  // The scanner itself is started lazily by trackSentMessage() which
3924
4000
  // runs after every message send, covering all runtimes.
@@ -4043,6 +4119,16 @@ Loop until done, blocked, or explicitly reassigned:
4043
4119
  await sessionHelper.sendKey(sessionName, 'Tab');
4044
4120
  await delay(300);
4045
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
+ }
4046
4132
  else if (isCodexCli) {
4047
4133
  // #246: Codex CLI TUI recovery — simpler than Gemini.
4048
4134
  // Codex uses Ink-based TUI with › prompt. Avoid Gemini-specific
@@ -4542,7 +4628,25 @@ Loop until done, blocked, or explicitly reassigned:
4542
4628
  // literally sitting on the `> ` prompt line). If not stuck, trust the
4543
4629
  // write. Skip the output-change heuristics that cause false negatives.
4544
4630
  const isGemini = runtimeType === RUNTIME_TYPES.GEMINI_CLI;
4545
- 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) {
4546
4650
  // Single stuck-at-prompt check — the only reliable failure signal
4547
4651
  const stuckAtPrompt = this.isTextStuckAtTuiPrompt(sessionName, message);
4548
4652
  if (stuckAtPrompt) {
@@ -4643,6 +4747,12 @@ Loop until done, blocked, or explicitly reassigned:
4643
4747
  if (isClaudeCode) {
4644
4748
  await sessionHelper.clearCurrentCommandLine(sessionName);
4645
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
+ }
4646
4756
  else {
4647
4757
  // Gemini CLI retry cleanup: NEVER send Ctrl+C — it triggers /quit
4648
4758
  // and kills the CLI entirely, regardless of whether text is in the
@@ -4918,7 +5028,10 @@ Loop until done, blocked, or explicitly reassigned:
4918
5028
  try {
4919
5029
  // Skip Gemini CLI sessions — their TUI prompt behaves differently
4920
5030
  // and false-positive stuck detection causes Tab+Enter spam.
4921
- 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) {
4922
5035
  continue;
4923
5036
  }
4924
5037
  // #213: Skip orchestrator — it frequently waits for long-running
@@ -4988,7 +5101,7 @@ Loop until done, blocked, or explicitly reassigned:
4988
5101
  // Skip Gemini CLI sessions — Tab+Enter recovery causes more harm
4989
5102
  // than good because the Gemini TUI handles input differently.
4990
5103
  const trackedRuntime = this.tuiSessionRegistry.get(sessionName);
4991
- if (trackedRuntime === RUNTIME_TYPES.GEMINI_CLI) {
5104
+ if (trackedRuntime === RUNTIME_TYPES.GEMINI_CLI || trackedRuntime === RUNTIME_TYPES.ANTIGRAVITY_CLI) {
4992
5105
  continue;
4993
5106
  }
4994
5107
  try {
@@ -5403,10 +5516,11 @@ Loop until done, blocked, or explicitly reassigned:
5403
5516
  await sessionHelper.sendKey(sessionName, 'C-u');
5404
5517
  await delay(300);
5405
5518
  }
5406
- else if (runtimeType === RUNTIME_TYPES.CODEX_CLI) {
5519
+ else if (runtimeType === RUNTIME_TYPES.CODEX_CLI || runtimeType === RUNTIME_TYPES.ANTIGRAVITY_CLI) {
5407
5520
  // #246: Codex CLI — Ctrl+U to clear any stale input text.
5408
5521
  // Unlike Gemini, Codex doesn't need Enter flush; its Ink TUI
5409
5522
  // handles Ctrl+U for line clear similar to Claude Code.
5523
+ // Antigravity clears its prompt box on Ctrl+U the same way.
5410
5524
  await sessionHelper.sendKey(sessionName, 'C-u');
5411
5525
  await delay(300);
5412
5526
  }