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 +1 @@
1
- {"version":3,"file":"harness-credentials.store.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/harness/harness-credentials.store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAQH,mDAAmD;AACnD,MAAM,WAAW,kBAAkB;IAClC,MAAM,CAAC,EAAE;QACR,uFAAuF;QACvF,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,wDAAwD;QACxD,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,SAAS,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,KAAK,CAAC,EAAE;QACP,iFAAiF;QACjF,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,SAAS,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;CACF;AAED,gDAAgD;AAChD,MAAM,MAAM,sBAAsB,GAAG,aAAa,GAAG,SAAS,GAAG,IAAI,CAAC;AAYtE;;;;;GAKG;AACH,qBAAa,uBAAuB;IAKvB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAJtC;;;OAGG;gBAC0B,QAAQ,CAAC,EAAE,MAAM,YAAA;IAE9C;;;;OAIG;IACH,WAAW,IAAI,MAAM;IAIrB;;;;OAIG;IACH,IAAI,IAAI,kBAAkB;IAS1B;;;;;;;;OAQG;IACH,KAAK,CAAC,WAAW,EAAE,kBAAkB,GAAG,IAAI;IAe5C;;;;;;OAMG;IACH,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAMxC;;;;;OAKG;IACH,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAMrC;;;;;OAKG;IACH,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAMlC;;OAEG;IACH,WAAW,IAAI,IAAI;IAQnB;;;;OAIG;IACH,uBAAuB,IAAI,sBAAsB;IAOjD;;;;;;;;;;OAUG;IACH,mBAAmB,CAAC,OAAO,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAUrF;AAKD;;;;GAIG;AACH,wBAAgB,0BAA0B,IAAI,uBAAuB,CAEpE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAMpG"}
1
+ {"version":3,"file":"harness-credentials.store.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/harness/harness-credentials.store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAQH,mDAAmD;AACnD,MAAM,WAAW,kBAAkB;IAClC,MAAM,CAAC,EAAE;QACR,uFAAuF;QACvF,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,wDAAwD;QACxD,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,SAAS,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,KAAK,CAAC,EAAE;QACP,iFAAiF;QACjF,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,SAAS,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,WAAW,CAAC,EAAE;QACb,2GAA2G;QAC3G,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,SAAS,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;CACF;AAED,gDAAgD;AAChD,MAAM,MAAM,sBAAsB,GAAG,aAAa,GAAG,SAAS,GAAG,IAAI,CAAC;AAYtE;;;;;GAKG;AACH,qBAAa,uBAAuB;IAKvB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAJtC;;;OAGG;gBAC0B,QAAQ,CAAC,EAAE,MAAM,YAAA;IAE9C;;;;OAIG;IACH,WAAW,IAAI,MAAM;IAIrB;;;;OAIG;IACH,IAAI,IAAI,kBAAkB;IAS1B;;;;;;;;OAQG;IACH,KAAK,CAAC,WAAW,EAAE,kBAAkB,GAAG,IAAI;IAe5C;;;;;;OAMG;IACH,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAMxC;;;;;OAKG;IACH,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAMrC;;;;;OAKG;IACH,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAMlC;;;;;OAKG;IACH,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAM7C;;;;OAIG;IACH,0BAA0B,IAAI,MAAM,GAAG,IAAI;IAK3C;;OAEG;IACH,gBAAgB,IAAI,IAAI;IAQxB;;OAEG;IACH,WAAW,IAAI,IAAI;IAQnB;;;;OAIG;IACH,uBAAuB,IAAI,sBAAsB;IAOjD;;;;;;;;;;;;;;;;;OAiBG;IACH,mBAAmB,CAAC,OAAO,GAAE,MAAM,CAAC,UAAwB,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAgB3G;AAKD;;;;GAIG;AACH,wBAAgB,0BAA0B,IAAI,uBAAuB,CAEpE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,MAAM,CAAC,UAAwB,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAM1H"}
@@ -5,10 +5,11 @@
5
5
  * saving it, and an Anthropic API key has to reach agents somehow; both live
6
6
  * here, in `<crewlyHome>/harness-credentials.json` with mode 0600. Codex
7
7
  * writes its own credentials (`$CODEX_HOME/auth.json`), so nothing is stored
8
- * for it unless a future flow needs the key.
8
+ * for it unless a future flow needs the key. Antigravity CLI reads its Gemini
9
+ * API key only from the environment, so Crewly keeps that key here too.
9
10
  *
10
11
  * {@link harnessEnvForAgents} turns the stored credentials into the env vars
11
- * injected into every agent PTY (and adds the user npm prefix to PATH).
12
+ * injected into agent PTYs (and adds the user npm prefix to PATH).
12
13
  *
13
14
  * Secrets are never logged, never returned by the REST API and never put in
14
15
  * an error message.
@@ -17,7 +18,7 @@
17
18
  */
18
19
  import * as fs from 'fs';
19
20
  import * as path from 'path';
20
- import { HARNESS_CONSTANTS } from '../../constants.js';
21
+ import { ANTIGRAVITY_CONSTANTS, HARNESS_CONSTANTS, RUNTIME_TYPES } from '../../constants.js';
21
22
  import { getCrewlyHomePath } from '../core/crewly-home.utils.js';
22
23
  import { buildHarnessPath } from './harness-exec.utils.js';
23
24
  /**
@@ -127,6 +128,38 @@ export class HarnessCredentialsStore {
127
128
  const current = this.read();
128
129
  this.write({ ...current, codex: { openaiApiKey: key.trim(), updatedAt: new Date().toISOString() } });
129
130
  }
131
+ /**
132
+ * Store the Gemini API key Antigravity CLI runs with.
133
+ *
134
+ * @param key - Gemini API key
135
+ * @throws Error when the key is empty
136
+ */
137
+ setAntigravityGeminiApiKey(key) {
138
+ if (!isNonEmptyString(key))
139
+ throw new Error('Gemini API key is empty');
140
+ const current = this.read();
141
+ this.write({ ...current, antigravity: { geminiApiKey: key.trim(), updatedAt: new Date().toISOString() } });
142
+ }
143
+ /**
144
+ * The stored Antigravity Gemini API key.
145
+ *
146
+ * @returns The key, or null when none is stored
147
+ */
148
+ getAntigravityGeminiApiKey() {
149
+ const key = this.read().antigravity?.geminiApiKey;
150
+ return isNonEmptyString(key) ? key : null;
151
+ }
152
+ /**
153
+ * Forget the stored Antigravity key.
154
+ */
155
+ clearAntigravity() {
156
+ const current = this.read();
157
+ if (!current.antigravity)
158
+ return;
159
+ const next = { ...current };
160
+ delete next.antigravity;
161
+ this.write(next);
162
+ }
130
163
  /**
131
164
  * Forget the stored Claude credential.
132
165
  */
@@ -159,18 +192,32 @@ export class HarnessCredentialsStore {
159
192
  * a Claude credential. Nothing is added for Codex: it reads its own
160
193
  * `auth.json`.
161
194
  *
195
+ * For an `antigravity-cli` session it also adds the stored Gemini key as
196
+ * `GEMINI_API_KEY` (Antigravity reads the key only from the environment)
197
+ * and `AGY_CLI_DISABLE_AUTO_UPDATE`. The key is scoped to that runtime on
198
+ * purpose: in a Gemini CLI session an unexpected GEMINI_API_KEY brings up
199
+ * Gemini's "Existing API key detected" dialog for Google-login users.
200
+ *
162
201
  * @param baseEnv - Environment whose PATH is extended (defaults to process.env)
202
+ * @param runtimeType - Runtime the session will run, when known
163
203
  * @returns Env map to merge into the agent's spawn env
164
204
  */
165
- harnessEnvForAgents(baseEnv = process.env) {
205
+ harnessEnvForAgents(baseEnv = process.env, runtimeType) {
166
206
  const env = { PATH: buildHarnessPath(baseEnv.PATH) };
167
- const claude = this.read().claude;
207
+ const stored = this.read();
208
+ const claude = stored.claude;
168
209
  if (isNonEmptyString(claude?.oauthToken)) {
169
210
  env[HARNESS_CONSTANTS.CLAUDE.OAUTH_TOKEN_ENV] = claude.oauthToken;
170
211
  }
171
212
  else if (isNonEmptyString(claude?.anthropicApiKey)) {
172
213
  env[HARNESS_CONSTANTS.CLAUDE.API_KEY_ENV] = claude.anthropicApiKey;
173
214
  }
215
+ if (runtimeType === RUNTIME_TYPES.ANTIGRAVITY_CLI) {
216
+ env[ANTIGRAVITY_CONSTANTS.DISABLE_AUTO_UPDATE_ENV] = ANTIGRAVITY_CONSTANTS.DISABLE_AUTO_UPDATE_VALUE;
217
+ const key = stored.antigravity?.geminiApiKey;
218
+ if (isNonEmptyString(key))
219
+ env[ANTIGRAVITY_CONSTANTS.API_KEY_ENV] = key;
220
+ }
174
221
  return env;
175
222
  }
176
223
  }
@@ -190,16 +237,17 @@ export function getHarnessCredentialsStore() {
190
237
  * Never throws: a broken credentials file yields just the PATH.
191
238
  *
192
239
  * @param baseEnv - Environment whose PATH is extended (defaults to process.env)
193
- * @returns Env map (PATH plus any Claude credential env var)
240
+ * @param runtimeType - Runtime the session will run (adds runtime-scoped vars such as Antigravity's key)
241
+ * @returns Env map (PATH plus any credential env var)
194
242
  *
195
243
  * @example
196
244
  * ```ts
197
- * const env = { ...identityEnv, ...harnessEnvForAgents() };
245
+ * const env = { ...identityEnv, ...harnessEnvForAgents(process.env, 'antigravity-cli') };
198
246
  * ```
199
247
  */
200
- export function harnessEnvForAgents(baseEnv = process.env) {
248
+ export function harnessEnvForAgents(baseEnv = process.env, runtimeType) {
201
249
  try {
202
- return defaultStore.harnessEnvForAgents(baseEnv);
250
+ return defaultStore.harnessEnvForAgents(baseEnv, runtimeType);
203
251
  }
204
252
  catch {
205
253
  return { PATH: buildHarnessPath(baseEnv.PATH) };
@@ -1 +1 @@
1
- {"version":3,"file":"harness-credentials.store.js","sourceRoot":"","sources":["../../../../../../backend/src/services/harness/harness-credentials.store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"harness-credentials.store.js","sourceRoot":"","sources":["../../../../../../backend/src/services/harness/harness-credentials.store.ts"],"names":[],"mappings":"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"}
@@ -1,17 +1,46 @@
1
1
  /**
2
- * Harness install — `npm install -g <pkg>@latest` as an async job.
2
+ * Harness install as an async job with a log.
3
3
  *
4
- * When the global prefix is not writable (EACCES / EPERM), the install is
5
- * retried once under the user-owned prefix `<crewlyHome>/npm-global`
6
- * (`npm install -g --prefix …`); its `bin` dir is on the PATH of everything
7
- * Crewly spawns (harness-exec.utils). No sudo, no shell profile edits.
4
+ * - npm harnesses: `npm install -g <pkg>@latest`. When the global prefix is
5
+ * not writable (EACCES / EPERM), the install is retried once under the
6
+ * user-owned prefix `<crewlyHome>/npm-global` (`npm install -g --prefix …`);
7
+ * its `bin` dir is on the PATH of everything Crewly spawns
8
+ * (harness-exec.utils). No sudo, no shell profile edits.
9
+ * - Script harnesses (Antigravity CLI, which has no npm package): the vendor's
10
+ * official installer is downloaded over https from exactly the registry URL
11
+ * (`https://antigravity.google/cli/install.sh`; redirects refused, size
12
+ * capped, must be a `#!` script), written to a private temp dir and run
13
+ * with bash — the same as the documented `curl -fsSL … | bash`. The
14
+ * installer verifies the binary's SHA-512 itself and puts `agy` in
15
+ * `~/.local/bin`, which is on the harness PATH. When the binary is already
16
+ * installed the job runs its own updater (`agy update`) instead.
8
17
  *
9
18
  * One install runs per harness at a time: starting a second one while the
10
19
  * first is running returns the running job.
11
20
  *
12
21
  * @module services/harness/harness-install.service
13
22
  */
23
+ import { type ScriptInstallSpec } from './harness-registry.js';
14
24
  import { type HarnessId, type HarnessLogger, type InstallJob, type RunCommand } from './harness.types.js';
25
+ /** Downloads an installer script; rejects on any failure. */
26
+ export type FetchScript = (url: string) => Promise<string>;
27
+ /**
28
+ * Whether a URL is one Crewly may download an installer from: https, and
29
+ * exactly the URL the registry names.
30
+ *
31
+ * @param url - Candidate URL
32
+ * @param spec - The harness's script install spec
33
+ * @returns True when allowed
34
+ */
35
+ export declare function isAllowedInstallerUrl(url: string, spec: ScriptInstallSpec): boolean;
36
+ /**
37
+ * Default installer download: https only, no redirects, size-capped.
38
+ *
39
+ * @param url - Installer URL
40
+ * @returns Script text
41
+ * @throws Error on a non-2xx status, a redirect, a timeout or an oversized body
42
+ */
43
+ export declare const defaultFetchScript: FetchScript;
15
44
  /** Injectable dependencies. */
16
45
  export interface HarnessInstallDeps {
17
46
  run?: RunCommand;
@@ -23,6 +52,10 @@ export interface HarnessInstallDeps {
23
52
  logger?: HarnessLogger;
24
53
  /** Called after a successful install (e.g. to refresh status caches) */
25
54
  onInstalled?: (harnessId: HarnessId) => void;
55
+ /** Downloads a vendor installer script (script harnesses) */
56
+ fetchScript?: FetchScript;
57
+ /** PATH lookup of an installed harness binary (script harnesses update in place) */
58
+ resolveCommand?: (command: string) => string | null;
26
59
  }
27
60
  /** Error with a machine-readable code, for the REST layer. */
28
61
  export declare class HarnessInstallError extends Error {
@@ -49,6 +82,8 @@ export declare class HarnessInstallService {
49
82
  private readonly idFactory;
50
83
  private readonly logger;
51
84
  private readonly onInstalled?;
85
+ private readonly fetchScript;
86
+ private readonly resolveCommand;
52
87
  private readonly jobs;
53
88
  /**
54
89
  * @param deps - Injectable dependencies (all optional)
@@ -79,13 +114,31 @@ export declare class HarnessInstallService {
79
114
  */
80
115
  waitForJob(jobId: string): Promise<InstallJob>;
81
116
  /**
82
- * Run npm, falling back to the user prefix on a permission error.
117
+ * Run the install for a harness and record the outcome.
83
118
  *
84
119
  * @param record - Job record (mutated)
85
- * @param npmPackage - Package to install
120
+ * @param def - Harness definition
86
121
  * @returns The finished job
87
122
  */
88
123
  private execute;
124
+ /**
125
+ * Install with the vendor's official script, or update in place when the
126
+ * binary is already there.
127
+ *
128
+ * @param record - Job record (mutated)
129
+ * @param def - Harness definition
130
+ * @param spec - Script install spec
131
+ * @returns True on success
132
+ */
133
+ private installScript;
134
+ /**
135
+ * Run npm, falling back to the user prefix on a permission error.
136
+ *
137
+ * @param record - Job record (mutated)
138
+ * @param npmPackage - Package to install
139
+ * @returns True on success
140
+ */
141
+ private installNpm;
89
142
  /**
90
143
  * Append to a job log, keeping only the tail.
91
144
  *
@@ -1 +1 @@
1
- {"version":3,"file":"harness-install.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/harness/harness-install.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,OAAO,EAAyB,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEjI,+BAA+B;AAC/B,MAAM,WAAW,kBAAkB;IAClC,GAAG,CAAC,EAAE,UAAU,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,kCAAkC;IAClC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,MAAM,CAAC;IACzB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,wEAAwE;IACxE,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,IAAI,CAAC;CAC7C;AAED,8DAA8D;AAC9D,qBAAa,mBAAoB,SAAQ,KAAK;aAM5B,IAAI,EAAE,iBAAiB,GAAG,eAAe;IAL1D;;;OAGG;gBAEc,IAAI,EAAE,iBAAiB,GAAG,eAAe,EACzD,OAAO,EAAE,MAAM;CAKhB;AASD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAGzD;AAED,4CAA4C;AAC5C,qBAAa,qBAAqB;IACjC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAa;IACjC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAoB;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwB;IAC/C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAiC;IAC9D,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAgC;IAErD;;OAEG;gBACS,IAAI,GAAE,kBAAuB;IAUzC;;;;;;OAMG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU;IAqB3C;;;;;;OAMG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU;IAMjC;;;;;;OAMG;IACG,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAOpD;;;;;;OAMG;YACW,OAAO;IAuCrB;;;;;OAKG;IACH,OAAO,CAAC,MAAM;IAMd,4DAA4D;IAC5D,OAAO,CAAC,aAAa;IAOrB;;;;;OAKG;IACH,OAAO,CAAC,QAAQ;CAShB"}
1
+ {"version":3,"file":"harness-install.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/harness/harness-install.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAQH,OAAO,EAAgD,KAAK,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC7G,OAAO,EAAyB,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEjI,6DAA6D;AAC7D,MAAM,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAE3D;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAQnF;AAED;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,EAAE,WAWhC,CAAC;AAEF,+BAA+B;AAC/B,MAAM,WAAW,kBAAkB;IAClC,GAAG,CAAC,EAAE,UAAU,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,kCAAkC;IAClC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,MAAM,CAAC;IACzB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,wEAAwE;IACxE,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,IAAI,CAAC;IAC7C,6DAA6D;IAC7D,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,oFAAoF;IACpF,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;CACpD;AAED,8DAA8D;AAC9D,qBAAa,mBAAoB,SAAQ,KAAK;aAM5B,IAAI,EAAE,iBAAiB,GAAG,eAAe;IAL1D;;;OAGG;gBAEc,IAAI,EAAE,iBAAiB,GAAG,eAAe,EACzD,OAAO,EAAE,MAAM;CAKhB;AASD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAGzD;AAED,4CAA4C;AAC5C,qBAAa,qBAAqB;IACjC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAa;IACjC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAoB;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwB;IAC/C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAiC;IAC9D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqC;IACpE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAgC;IAErD;;OAEG;gBACS,IAAI,GAAE,kBAAuB;IAYzC;;;;;;OAMG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU;IAqB3C;;;;;;OAMG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU;IAMjC;;;;;;OAMG;IACG,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAOpD;;;;;;OAMG;YACW,OAAO;IAiBrB;;;;;;;;OAQG;YACW,aAAa;IAyC3B;;;;;;OAMG;YACW,UAAU;IA6BxB;;;;;OAKG;IACH,OAAO,CAAC,MAAM;IAMd,4DAA4D;IAC5D,OAAO,CAAC,aAAa;IAOrB;;;;;OAKG;IACH,OAAO,CAAC,QAAQ;CAShB"}
@@ -1,10 +1,19 @@
1
1
  /**
2
- * Harness install — `npm install -g <pkg>@latest` as an async job.
2
+ * Harness install as an async job with a log.
3
3
  *
4
- * When the global prefix is not writable (EACCES / EPERM), the install is
5
- * retried once under the user-owned prefix `<crewlyHome>/npm-global`
6
- * (`npm install -g --prefix …`); its `bin` dir is on the PATH of everything
7
- * Crewly spawns (harness-exec.utils). No sudo, no shell profile edits.
4
+ * - npm harnesses: `npm install -g <pkg>@latest`. When the global prefix is
5
+ * not writable (EACCES / EPERM), the install is retried once under the
6
+ * user-owned prefix `<crewlyHome>/npm-global` (`npm install -g --prefix …`);
7
+ * its `bin` dir is on the PATH of everything Crewly spawns
8
+ * (harness-exec.utils). No sudo, no shell profile edits.
9
+ * - Script harnesses (Antigravity CLI, which has no npm package): the vendor's
10
+ * official installer is downloaded over https from exactly the registry URL
11
+ * (`https://antigravity.google/cli/install.sh`; redirects refused, size
12
+ * capped, must be a `#!` script), written to a private temp dir and run
13
+ * with bash — the same as the documented `curl -fsSL … | bash`. The
14
+ * installer verifies the binary's SHA-512 itself and puts `agy` in
15
+ * `~/.local/bin`, which is on the harness PATH. When the binary is already
16
+ * installed the job runs its own updater (`agy update`) instead.
8
17
  *
9
18
  * One install runs per harness at a time: starting a second one while the
10
19
  * first is running returns the running job.
@@ -13,10 +22,50 @@
13
22
  */
14
23
  import { randomUUID } from 'crypto';
15
24
  import * as fs from 'fs';
25
+ import * as os from 'os';
26
+ import * as path from 'path';
16
27
  import { HARNESS_CONSTANTS } from '../../constants.js';
17
- import { buildNpmPath, getUserNpmPrefix, runCommand } from './harness-exec.utils.js';
28
+ import { buildHarnessPath, buildNpmPath, getUserNpmPrefix, resolveExecutable, runCommand } from './harness-exec.utils.js';
18
29
  import { getHarnessDefinition } from './harness-registry.js';
19
30
  import { SILENT_HARNESS_LOGGER } from './harness.types.js';
31
+ /**
32
+ * Whether a URL is one Crewly may download an installer from: https, and
33
+ * exactly the URL the registry names.
34
+ *
35
+ * @param url - Candidate URL
36
+ * @param spec - The harness's script install spec
37
+ * @returns True when allowed
38
+ */
39
+ export function isAllowedInstallerUrl(url, spec) {
40
+ try {
41
+ const parsed = new URL(url);
42
+ const expected = new URL(spec.scriptUrl);
43
+ return parsed.protocol === 'https:' && parsed.href === expected.href;
44
+ }
45
+ catch {
46
+ return false;
47
+ }
48
+ }
49
+ /**
50
+ * Default installer download: https only, no redirects, size-capped.
51
+ *
52
+ * @param url - Installer URL
53
+ * @returns Script text
54
+ * @throws Error on a non-2xx status, a redirect, a timeout or an oversized body
55
+ */
56
+ export const defaultFetchScript = async (url) => {
57
+ const response = await fetch(url, {
58
+ redirect: 'error',
59
+ signal: AbortSignal.timeout(HARNESS_CONSTANTS.ANTIGRAVITY.INSTALL_SCRIPT_FETCH_TIMEOUT_MS),
60
+ });
61
+ if (!response.ok)
62
+ throw new Error(`Download failed: HTTP ${response.status}`);
63
+ const text = await response.text();
64
+ if (Buffer.byteLength(text, 'utf8') > HARNESS_CONSTANTS.ANTIGRAVITY.INSTALL_SCRIPT_MAX_BYTES) {
65
+ throw new Error('Download failed: installer is larger than expected');
66
+ }
67
+ return text;
68
+ };
20
69
  /** Error with a machine-readable code, for the REST layer. */
21
70
  export class HarnessInstallError extends Error {
22
71
  code;
@@ -49,6 +98,8 @@ export class HarnessInstallService {
49
98
  idFactory;
50
99
  logger;
51
100
  onInstalled;
101
+ fetchScript;
102
+ resolveCommand;
52
103
  jobs = new Map();
53
104
  /**
54
105
  * @param deps - Injectable dependencies (all optional)
@@ -61,6 +112,8 @@ export class HarnessInstallService {
61
112
  this.idFactory = deps.idFactory ?? randomUUID;
62
113
  this.logger = deps.logger ?? SILENT_HARNESS_LOGGER;
63
114
  this.onInstalled = deps.onInstalled;
115
+ this.fetchScript = deps.fetchScript ?? defaultFetchScript;
116
+ this.resolveCommand = deps.resolveCommand ?? ((command) => resolveExecutable(command, buildHarnessPath(this.env.PATH)));
64
117
  }
65
118
  /**
66
119
  * Start installing (or updating) a harness.
@@ -87,7 +140,7 @@ export class HarnessInstallService {
87
140
  done: null,
88
141
  };
89
142
  this.jobs.set(record.jobId, record);
90
- record.done = this.execute(record, def.npmPackage);
143
+ record.done = this.execute(record, def);
91
144
  return this.toPublic(record);
92
145
  }
93
146
  /**
@@ -119,41 +172,17 @@ export class HarnessInstallService {
119
172
  return this.toPublic(record);
120
173
  }
121
174
  /**
122
- * Run npm, falling back to the user prefix on a permission error.
175
+ * Run the install for a harness and record the outcome.
123
176
  *
124
177
  * @param record - Job record (mutated)
125
- * @param npmPackage - Package to install
178
+ * @param def - Harness definition
126
179
  * @returns The finished job
127
180
  */
128
- async execute(record, npmPackage) {
129
- const spec = `${npmPackage}@latest`;
130
- const env = { ...this.env, PATH: buildNpmPath(this.env.PATH) };
181
+ async execute(record, def) {
131
182
  try {
132
- this.append(record, `$ npm install -g ${spec}\n`);
133
- const first = await this.run('npm', ['install', '-g', spec], {
134
- env,
135
- timeoutMs: HARNESS_CONSTANTS.INSTALL_TIMEOUT_MS,
136
- onOutput: (chunk) => this.append(record, chunk),
137
- });
138
- let ok = first.code === 0;
139
- if (!ok && isPermissionError(`${first.stdout}\n${first.stderr}\n${first.error ?? ''}`)) {
140
- const prefix = getUserNpmPrefix();
141
- this.mkdirp(prefix);
142
- record.usedUserPrefix = true;
143
- this.append(record, `\nNo permission to write the global npm prefix; installing under ${prefix} instead.\n`);
144
- this.append(record, `$ npm install -g --prefix ${prefix} ${spec}\n`);
145
- const second = await this.run('npm', ['install', '-g', '--prefix', prefix, spec], {
146
- env,
147
- timeoutMs: HARNESS_CONSTANTS.INSTALL_TIMEOUT_MS,
148
- onOutput: (chunk) => this.append(record, chunk),
149
- });
150
- ok = second.code === 0;
151
- if (!ok && second.error)
152
- this.append(record, `\n${second.error}\n`);
153
- }
154
- else if (!ok && first.error) {
155
- this.append(record, `\n${first.error}\n`);
156
- }
183
+ const ok = def.install.kind === 'npm'
184
+ ? await this.installNpm(record, def.install.npmPackage)
185
+ : await this.installScript(record, def, def.install);
157
186
  record.state = ok ? 'succeeded' : 'failed';
158
187
  this.append(record, ok ? '\nInstalled.\n' : '\nInstall failed.\n');
159
188
  if (ok)
@@ -167,6 +196,94 @@ export class HarnessInstallService {
167
196
  this.logger.info('Harness install finished', { harnessId: record.harnessId, state: record.state, usedUserPrefix: record.usedUserPrefix });
168
197
  return this.toPublic(record);
169
198
  }
199
+ /**
200
+ * Install with the vendor's official script, or update in place when the
201
+ * binary is already there.
202
+ *
203
+ * @param record - Job record (mutated)
204
+ * @param def - Harness definition
205
+ * @param spec - Script install spec
206
+ * @returns True on success
207
+ */
208
+ async installScript(record, def, spec) {
209
+ const env = { ...this.env, PATH: buildHarnessPath(this.env.PATH) };
210
+ const installed = this.resolveCommand(def.command);
211
+ if (installed) {
212
+ this.append(record, `$ ${def.command} ${spec.updateArgs.join(' ')}\n`);
213
+ const result = await this.run(installed, spec.updateArgs, {
214
+ env,
215
+ timeoutMs: HARNESS_CONSTANTS.INSTALL_TIMEOUT_MS,
216
+ onOutput: (chunk) => this.append(record, chunk),
217
+ });
218
+ if (result.code !== 0 && result.error)
219
+ this.append(record, `\n${result.error}\n`);
220
+ return result.code === 0;
221
+ }
222
+ if (!isAllowedInstallerUrl(spec.scriptUrl, spec)) {
223
+ this.append(record, `Refusing to download an installer from ${spec.scriptUrl}\n`);
224
+ return false;
225
+ }
226
+ const shell = HARNESS_CONSTANTS.ANTIGRAVITY.INSTALL_SHELL;
227
+ this.append(record, `$ curl -fsSL ${spec.scriptUrl} | ${shell}\n`);
228
+ const script = await this.fetchScript(spec.scriptUrl);
229
+ if (!script.startsWith('#!')) {
230
+ this.append(record, 'The downloaded installer is not a shell script; not running it.\n');
231
+ return false;
232
+ }
233
+ const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'crewly-harness-install-'));
234
+ const file = path.join(dir, 'install.sh');
235
+ try {
236
+ fs.writeFileSync(file, script, { mode: 0o700 });
237
+ const result = await this.run(shell, [file], {
238
+ env,
239
+ timeoutMs: HARNESS_CONSTANTS.INSTALL_TIMEOUT_MS,
240
+ onOutput: (chunk) => this.append(record, chunk),
241
+ });
242
+ if (result.code !== 0 && result.error)
243
+ this.append(record, `\n${result.error}\n`);
244
+ return result.code === 0;
245
+ }
246
+ finally {
247
+ fs.rmSync(dir, { recursive: true, force: true });
248
+ }
249
+ }
250
+ /**
251
+ * Run npm, falling back to the user prefix on a permission error.
252
+ *
253
+ * @param record - Job record (mutated)
254
+ * @param npmPackage - Package to install
255
+ * @returns True on success
256
+ */
257
+ async installNpm(record, npmPackage) {
258
+ const spec = `${npmPackage}@latest`;
259
+ const env = { ...this.env, PATH: buildNpmPath(this.env.PATH) };
260
+ this.append(record, `$ npm install -g ${spec}\n`);
261
+ const first = await this.run('npm', ['install', '-g', spec], {
262
+ env,
263
+ timeoutMs: HARNESS_CONSTANTS.INSTALL_TIMEOUT_MS,
264
+ onOutput: (chunk) => this.append(record, chunk),
265
+ });
266
+ let ok = first.code === 0;
267
+ if (!ok && isPermissionError(`${first.stdout}\n${first.stderr}\n${first.error ?? ''}`)) {
268
+ const prefix = getUserNpmPrefix();
269
+ this.mkdirp(prefix);
270
+ record.usedUserPrefix = true;
271
+ this.append(record, `\nNo permission to write the global npm prefix; installing under ${prefix} instead.\n`);
272
+ this.append(record, `$ npm install -g --prefix ${prefix} ${spec}\n`);
273
+ const second = await this.run('npm', ['install', '-g', '--prefix', prefix, spec], {
274
+ env,
275
+ timeoutMs: HARNESS_CONSTANTS.INSTALL_TIMEOUT_MS,
276
+ onOutput: (chunk) => this.append(record, chunk),
277
+ });
278
+ ok = second.code === 0;
279
+ if (!ok && second.error)
280
+ this.append(record, `\n${second.error}\n`);
281
+ }
282
+ else if (!ok && first.error) {
283
+ this.append(record, `\n${first.error}\n`);
284
+ }
285
+ return ok;
286
+ }
170
287
  /**
171
288
  * Append to a job log, keeping only the tail.
172
289
  *
@@ -1 +1 @@
1
- {"version":3,"file":"harness-install.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/harness/harness-install.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"harness-install.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/harness/harness-install.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1H,OAAO,EAAE,oBAAoB,EAAkD,MAAM,uBAAuB,CAAC;AAC7G,OAAO,EAAE,qBAAqB,EAAwE,MAAM,oBAAoB,CAAC;AAKjI;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAW,EAAE,IAAuB;IACzE,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACzC,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,CAAC;IACtE,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,KAAK,CAAC;IACd,CAAC;AACF,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAgB,KAAK,EAAE,GAAG,EAAE,EAAE;IAC5D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QACjC,QAAQ,EAAE,OAAO;QACjB,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,iBAAiB,CAAC,WAAW,CAAC,+BAA+B,CAAC;KAC1F,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9E,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,iBAAiB,CAAC,WAAW,CAAC,wBAAwB,EAAE,CAAC;QAC9F,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC,CAAC;AAmBF,8DAA8D;AAC9D,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAM5B;IALjB;;;OAGG;IACH,YACiB,IAAyC,EACzD,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,SAAI,GAAJ,IAAI,CAAqC;QAIzD,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACnC,CAAC;CACD;AASD;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC/C,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACnC,OAAO,iBAAiB,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;AAC7G,CAAC;AAED,4CAA4C;AAC5C,MAAM,OAAO,qBAAqB;IAChB,GAAG,CAAa;IAChB,GAAG,CAAoB;IACvB,MAAM,CAAwB;IAC9B,GAAG,CAAe;IAClB,SAAS,CAAe;IACxB,MAAM,CAAgB;IACtB,WAAW,CAAkC;IAC7C,WAAW,CAAc;IACzB,cAAc,CAAqC;IACnD,IAAI,GAAG,IAAI,GAAG,EAAqB,CAAC;IAErD;;OAEG;IACH,YAAY,OAA2B,EAAE;QACxC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,UAAU,CAAC;QAClC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;QACnC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC/E,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;QAChC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,UAAU,CAAC;QAC9C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,qBAAqB,CAAC;QACnD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACpC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,kBAAkB,CAAC;QAC1D,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,iBAAiB,CAAC,OAAO,EAAE,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACzH,CAAC;IAED;;;;;;OAMG;IACH,YAAY,CAAC,SAAiB;QAC7B,MAAM,GAAG,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC;QAC5C,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,mBAAmB,CAAC,iBAAiB,EAAE,oBAAoB,SAAS,EAAE,CAAC,CAAC;QAC5F,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,KAAK,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;QAC3G,IAAI,OAAO;YAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAE3C,MAAM,MAAM,GAAc;YACzB,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE;YACvB,SAAS,EAAE,GAAG,CAAC,EAAE;YACjB,KAAK,EAAE,SAAS;YAChB,GAAG,EAAE,EAAE;YACP,cAAc,EAAE,KAAK;YACrB,UAAU,EAAE,IAAI;YAChB,IAAI,EAAE,IAAI;SACV,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACpC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACxC,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,KAAa;QACnB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,mBAAmB,CAAC,eAAe,EAAE,0BAA0B,KAAK,EAAE,CAAC,CAAC;QAC/F,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,UAAU,CAAC,KAAa;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,mBAAmB,CAAC,eAAe,EAAE,0BAA0B,KAAK,EAAE,CAAC,CAAC;QAC/F,IAAI,MAAM,CAAC,IAAI;YAAE,MAAM,MAAM,CAAC,IAAI,CAAC;QACnC,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IAED;;;;;;OAMG;IACK,KAAK,CAAC,OAAO,CAAC,MAAiB,EAAE,GAAsB;QAC9D,IAAI,CAAC;YACJ,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,KAAK;gBACpC,CAAC,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC;gBACvD,CAAC,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;YACtD,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC;YAC3C,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC;YACnE,IAAI,EAAE;gBAAE,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,CAAC,KAAK,GAAG,QAAQ,CAAC;YACxB,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACtF,CAAC;QACD,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0B,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,cAAc,EAAE,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;QAC1I,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IAED;;;;;;;;OAQG;IACK,KAAK,CAAC,aAAa,CAAC,MAAiB,EAAE,GAAsB,EAAE,IAAuB;QAC7F,MAAM,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACnE,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACnD,IAAI,SAAS,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACvE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE;gBACzD,GAAG;gBACH,SAAS,EAAE,iBAAiB,CAAC,kBAAkB;gBAC/C,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;aAC/C,CAAC,CAAC;YACH,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK;gBAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;YAClF,OAAO,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC;QAC1B,CAAC;QAED,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC;YAClD,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,0CAA0C,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC;YAClF,OAAO,KAAK,CAAC;QACd,CAAC;QACD,MAAM,KAAK,GAAG,iBAAiB,CAAC,WAAW,CAAC,aAAa,CAAC;QAC1D,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,IAAI,CAAC,SAAS,MAAM,KAAK,IAAI,CAAC,CAAC;QACnE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtD,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,mEAAmE,CAAC,CAAC;YACzF,OAAO,KAAK,CAAC;QACd,CAAC;QACD,MAAM,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,yBAAyB,CAAC,CAAC,CAAC;QAC9E,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAC1C,IAAI,CAAC;YACJ,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAChD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE;gBAC5C,GAAG;gBACH,SAAS,EAAE,iBAAiB,CAAC,kBAAkB;gBAC/C,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;aAC/C,CAAC,CAAC;YACH,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK;gBAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;YAClF,OAAO,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC;QAC1B,CAAC;gBAAS,CAAC;YACV,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,CAAC;IACF,CAAC;IAED;;;;;;OAMG;IACK,KAAK,CAAC,UAAU,CAAC,MAAiB,EAAE,UAAkB;QAC7D,MAAM,IAAI,GAAG,GAAG,UAAU,SAAS,CAAC;QACpC,MAAM,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/D,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,oBAAoB,IAAI,IAAI,CAAC,CAAC;QAClD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE;YAC5D,GAAG;YACH,SAAS,EAAE,iBAAiB,CAAC,kBAAkB;YAC/C,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;SAC/C,CAAC,CAAC;QACH,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC;QAC1B,IAAI,CAAC,EAAE,IAAI,iBAAiB,CAAC,GAAG,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;YACxF,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;YAClC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACpB,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC;YAC7B,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,oEAAoE,MAAM,aAAa,CAAC,CAAC;YAC7G,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,6BAA6B,MAAM,IAAI,IAAI,IAAI,CAAC,CAAC;YACrE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;gBACjF,GAAG;gBACH,SAAS,EAAE,iBAAiB,CAAC,kBAAkB;gBAC/C,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;aAC/C,CAAC,CAAC;YACH,EAAE,GAAG,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC;YACvB,IAAI,CAAC,EAAE,IAAI,MAAM,CAAC,KAAK;gBAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;QACrE,CAAC;aAAM,IAAI,CAAC,EAAE,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAC/B,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO,EAAE,CAAC;IACX,CAAC;IAED;;;;;OAKG;IACK,MAAM,CAAC,MAAiB,EAAE,IAAY;QAC7C,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC;QAC/B,MAAM,GAAG,GAAG,iBAAiB,CAAC,qBAAqB,CAAC;QACpD,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACvE,CAAC;IAED,4DAA4D;IACpD,aAAa;QACpB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,iBAAiB,CAAC,wBAAwB,CAAC;QACvE,KAAK,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACnC,IAAI,GAAG,CAAC,UAAU,KAAK,IAAI,IAAI,GAAG,CAAC,UAAU,GAAG,MAAM;gBAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC9E,CAAC;IACF,CAAC;IAED;;;;;OAKG;IACK,QAAQ,CAAC,MAAiB;QACjC,OAAO;YACN,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,cAAc,EAAE,MAAM,CAAC,cAAc;SACrC,CAAC;IACH,CAAC;CACD"}
@@ -1,10 +1,17 @@
1
1
  /**
2
2
  * Harness registry — static definitions of the agent CLIs Crewly can set up.
3
3
  *
4
- * One entry per harness: display name, binary, npm package, how to print the
4
+ * One entry per harness: display name, binary, how it is installed (an npm
5
+ * package, or the vendor's official install script), how to print the
5
6
  * version, and the login methods Crewly offers. A `broker` method names the
6
7
  * harness's own login command, which the login broker runs in a PTY; an
7
- * `api_key` method is a pasted key. Gemini CLI is detect-only (no methods).
8
+ * `api_key` method is a pasted key.
9
+ *
10
+ * - Antigravity CLI is **API key only**: Google does not allow third-party
11
+ * tools to use Antigravity product OAuth, so there is deliberately no
12
+ * broker method for it (specs/antigravity-runtime.md).
13
+ * - Gemini CLI is detect-only (no methods) and retired: kept working for
14
+ * existing / enterprise users, not offered to new ones.
8
15
  *
9
16
  * @module services/harness/harness-registry
10
17
  */
@@ -23,16 +30,35 @@ export interface LoginMethodDefinition {
23
30
  /** Command run by the login broker (kind `broker` only) */
24
31
  broker?: BrokerCommand;
25
32
  }
33
+ /** Installed with `npm install -g <package>@latest` (user-prefix fallback on EACCES). */
34
+ export interface NpmInstallSpec {
35
+ kind: 'npm';
36
+ npmPackage: string;
37
+ }
38
+ /**
39
+ * Installed with the vendor's official shell installer, downloaded over
40
+ * https from exactly `scriptUrl` and run with bash. An installed binary is
41
+ * updated with `<binary> <updateArgs>` instead.
42
+ */
43
+ export interface ScriptInstallSpec {
44
+ kind: 'script';
45
+ scriptUrl: string;
46
+ updateArgs: readonly string[];
47
+ }
48
+ /** How a harness is installed. */
49
+ export type HarnessInstallSpec = NpmInstallSpec | ScriptInstallSpec;
26
50
  /** Static facts about one harness. */
27
51
  export interface HarnessDefinition {
28
52
  id: HarnessId;
29
53
  displayName: string;
30
54
  /** Binary name on PATH */
31
55
  command: string;
32
- npmPackage: string;
56
+ install: HarnessInstallSpec;
33
57
  /** Arguments that print the version */
34
58
  versionArgs: readonly string[];
35
59
  loginMethods: readonly LoginMethodDefinition[];
60
+ /** Not offered to new users (see HARNESS_CONSTANTS.RETIRED_IDS) */
61
+ retired: boolean;
36
62
  }
37
63
  /** Every harness Crewly knows, in display order (default first). */
38
64
  export declare const HARNESS_DEFINITIONS: readonly HarnessDefinition[];
@@ -71,15 +97,30 @@ export declare function getBrokerLoginMethod(harnessId: string): LoginMethodDefi
71
97
  * @returns `{ id, label, kind }` per method
72
98
  */
73
99
  export declare function toPublicLoginMethods(def: HarnessDefinition): HarnessLoginMethod[];
100
+ /**
101
+ * The install command a person would run by hand, for hints and prompts.
102
+ *
103
+ * @param def - Harness definition
104
+ * @returns e.g. `npm install -g @openai/codex` or `curl -fsSL https://antigravity.google/cli/install.sh | bash`
105
+ */
106
+ export declare function describeInstallCommand(def: HarnessDefinition): string;
107
+ /**
108
+ * Whether a harness is retired (kept for existing users, hidden from new ones).
109
+ *
110
+ * @param id - Harness id
111
+ * @returns True for a retired harness
112
+ */
113
+ export declare function isRetiredHarness(id: string): boolean;
74
114
  /**
75
115
  * Resolve a harness id from a full id or a short CLI alias.
76
116
  *
77
- * @param value - `claude-code`, `claude`, `codex-cli`, `codex`, `gemini-cli` or `gemini` (case-insensitive)
117
+ * @param value - `claude-code`, `claude`, `codex-cli`, `codex`, `antigravity-cli`,
118
+ * `antigravity`, `agy`, `gemini-cli` or `gemini` (case-insensitive)
78
119
  * @returns The harness id, or null when unknown
79
120
  *
80
121
  * @example
81
122
  * ```ts
82
- * resolveHarnessAlias('codex'); // 'codex-cli'
123
+ * resolveHarnessAlias('agy'); // 'antigravity-cli'
83
124
  * ```
84
125
  */
85
126
  export declare function resolveHarnessAlias(value: string | undefined | null): HarnessId | null;