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.
- package/config/runtime_scripts/runtime-config.json +7 -0
- package/config/skills/orchestrator/update-team-member/SKILL.md +2 -2
- package/dist/backend/backend/src/constants.d.ts +151 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +173 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.js +4 -3
- package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/project/project.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/project/project.controller.js +13 -0
- package/dist/backend/backend/src/controllers/project/project.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/request-types.d.ts +2 -2
- package/dist/backend/backend/src/controllers/request-types.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +22 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.js +128 -14
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/antigravity-runtime.service.d.ts +267 -0
- package/dist/backend/backend/src/services/agent/antigravity-runtime.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/antigravity-runtime.service.js +521 -0
- package/dist/backend/backend/src/services/agent/antigravity-runtime.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js +10 -0
- package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js +12 -1
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js +3 -1
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-service.factory.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-service.factory.js +9 -0
- package/dist/backend/backend/src/services/agent/runtime-service.factory.js.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-session-recovery.d.ts +57 -1
- package/dist/backend/backend/src/services/agent/runtime-session-recovery.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-session-recovery.js +176 -2
- package/dist/backend/backend/src/services/agent/runtime-session-recovery.js.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-startup-blocked.error.d.ts +15 -3
- package/dist/backend/backend/src/services/agent/runtime-startup-blocked.error.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-startup-blocked.error.js +2 -1
- package/dist/backend/backend/src/services/agent/runtime-startup-blocked.error.js.map +1 -1
- package/dist/backend/backend/src/services/harness/harness-api-key.service.d.ts +26 -0
- package/dist/backend/backend/src/services/harness/harness-api-key.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/harness/harness-api-key.service.js +65 -5
- package/dist/backend/backend/src/services/harness/harness-api-key.service.js.map +1 -1
- package/dist/backend/backend/src/services/harness/harness-credentials.store.d.ts +37 -6
- package/dist/backend/backend/src/services/harness/harness-credentials.store.d.ts.map +1 -1
- package/dist/backend/backend/src/services/harness/harness-credentials.store.js +57 -9
- package/dist/backend/backend/src/services/harness/harness-credentials.store.js.map +1 -1
- package/dist/backend/backend/src/services/harness/harness-install.service.d.ts +60 -7
- package/dist/backend/backend/src/services/harness/harness-install.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/harness/harness-install.service.js +154 -37
- package/dist/backend/backend/src/services/harness/harness-install.service.js.map +1 -1
- package/dist/backend/backend/src/services/harness/harness-registry.d.ts +46 -5
- package/dist/backend/backend/src/services/harness/harness-registry.d.ts.map +1 -1
- package/dist/backend/backend/src/services/harness/harness-registry.js +53 -8
- package/dist/backend/backend/src/services/harness/harness-registry.js.map +1 -1
- package/dist/backend/backend/src/services/harness/harness-status.service.d.ts +15 -1
- package/dist/backend/backend/src/services/harness/harness-status.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/harness/harness-status.service.js +34 -6
- package/dist/backend/backend/src/services/harness/harness-status.service.js.map +1 -1
- package/dist/backend/backend/src/services/harness/harness.types.d.ts +10 -3
- package/dist/backend/backend/src/services/harness/harness.types.d.ts.map +1 -1
- package/dist/backend/backend/src/services/harness/harness.types.js +4 -3
- package/dist/backend/backend/src/services/harness/harness.types.js.map +1 -1
- package/dist/backend/backend/src/services/mcp-tool-definitions.d.ts +1 -1
- package/dist/backend/backend/src/services/mcp-tool-definitions.js +1 -1
- package/dist/backend/backend/src/services/mcp-tool-definitions.js.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/orchestrator-restart.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/orchestrator-restart.service.js +3 -2
- package/dist/backend/backend/src/services/orchestrator/orchestrator-restart.service.js.map +1 -1
- package/dist/backend/backend/src/services/runtime-adapter.d.ts +10 -1
- package/dist/backend/backend/src/services/runtime-adapter.d.ts.map +1 -1
- package/dist/backend/backend/src/services/runtime-adapter.js +12 -1
- package/dist/backend/backend/src/services/runtime-adapter.js.map +1 -1
- package/dist/backend/backend/src/services/settings/settings.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/settings/settings.service.js +1 -0
- package/dist/backend/backend/src/services/settings/settings.service.js.map +1 -1
- package/dist/backend/backend/src/types/index.d.ts +1 -1
- package/dist/backend/backend/src/types/index.d.ts.map +1 -1
- package/dist/backend/backend/src/types/settings.types.d.ts +1 -1
- package/dist/backend/backend/src/types/settings.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/settings.types.js +7 -1
- package/dist/backend/backend/src/types/settings.types.js.map +1 -1
- package/dist/backend/backend/src/types/solution-bundle.types.d.ts +1 -1
- package/dist/backend/backend/src/types/solution-bundle.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/team-template.types.d.ts +2 -2
- package/dist/backend/backend/src/types/team-template.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/team-template.types.js +1 -1
- package/dist/backend/backend/src/types/team-template.types.js.map +1 -1
- package/dist/backend/backend/src/utils/antigravity-settings.utils.d.ts +115 -0
- package/dist/backend/backend/src/utils/antigravity-settings.utils.d.ts.map +1 -0
- package/dist/backend/backend/src/utils/antigravity-settings.utils.js +181 -0
- package/dist/backend/backend/src/utils/antigravity-settings.utils.js.map +1 -0
- package/dist/backend/backend/src/utils/runtime-model-flags.utils.d.ts +3 -2
- package/dist/backend/backend/src/utils/runtime-model-flags.utils.d.ts.map +1 -1
- package/dist/backend/backend/src/utils/runtime-model-flags.utils.js +13 -3
- package/dist/backend/backend/src/utils/runtime-model-flags.utils.js.map +1 -1
- package/dist/backend/backend/src/utils/terminal-string-ops.d.ts +1 -0
- package/dist/backend/backend/src/utils/terminal-string-ops.d.ts.map +1 -1
- package/dist/backend/backend/src/utils/terminal-string-ops.js +29 -1
- package/dist/backend/backend/src/utils/terminal-string-ops.js.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +151 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +173 -0
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts +22 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.js +128 -14
- package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/antigravity-runtime.service.d.ts +267 -0
- package/dist/cli/backend/src/services/agent/antigravity-runtime.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/antigravity-runtime.service.js +521 -0
- package/dist/cli/backend/src/services/agent/antigravity-runtime.service.js.map +1 -0
- package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.js +10 -0
- package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js +12 -1
- package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js +3 -1
- package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-service.factory.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-service.factory.js +9 -0
- package/dist/cli/backend/src/services/agent/runtime-service.factory.js.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-session-recovery.d.ts +57 -1
- package/dist/cli/backend/src/services/agent/runtime-session-recovery.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-session-recovery.js +176 -2
- package/dist/cli/backend/src/services/agent/runtime-session-recovery.js.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-startup-blocked.error.d.ts +15 -3
- package/dist/cli/backend/src/services/agent/runtime-startup-blocked.error.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-startup-blocked.error.js +2 -1
- package/dist/cli/backend/src/services/agent/runtime-startup-blocked.error.js.map +1 -1
- package/dist/cli/backend/src/services/harness/harness-api-key.service.d.ts +26 -0
- package/dist/cli/backend/src/services/harness/harness-api-key.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/harness/harness-api-key.service.js +65 -5
- package/dist/cli/backend/src/services/harness/harness-api-key.service.js.map +1 -1
- package/dist/cli/backend/src/services/harness/harness-credentials.store.d.ts +37 -6
- package/dist/cli/backend/src/services/harness/harness-credentials.store.d.ts.map +1 -1
- package/dist/cli/backend/src/services/harness/harness-credentials.store.js +57 -9
- package/dist/cli/backend/src/services/harness/harness-credentials.store.js.map +1 -1
- package/dist/cli/backend/src/services/harness/harness-install.service.d.ts +60 -7
- package/dist/cli/backend/src/services/harness/harness-install.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/harness/harness-install.service.js +154 -37
- package/dist/cli/backend/src/services/harness/harness-install.service.js.map +1 -1
- package/dist/cli/backend/src/services/harness/harness-registry.d.ts +46 -5
- package/dist/cli/backend/src/services/harness/harness-registry.d.ts.map +1 -1
- package/dist/cli/backend/src/services/harness/harness-registry.js +53 -8
- package/dist/cli/backend/src/services/harness/harness-registry.js.map +1 -1
- package/dist/cli/backend/src/services/harness/harness-status.service.d.ts +15 -1
- package/dist/cli/backend/src/services/harness/harness-status.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/harness/harness-status.service.js +34 -6
- package/dist/cli/backend/src/services/harness/harness-status.service.js.map +1 -1
- package/dist/cli/backend/src/services/harness/harness.types.d.ts +10 -3
- package/dist/cli/backend/src/services/harness/harness.types.d.ts.map +1 -1
- package/dist/cli/backend/src/services/harness/harness.types.js +4 -3
- package/dist/cli/backend/src/services/harness/harness.types.js.map +1 -1
- package/dist/cli/backend/src/services/mcp-tool-definitions.d.ts +1 -1
- package/dist/cli/backend/src/services/mcp-tool-definitions.js +1 -1
- package/dist/cli/backend/src/services/mcp-tool-definitions.js.map +1 -1
- package/dist/cli/backend/src/services/orchestrator/orchestrator-restart.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/orchestrator/orchestrator-restart.service.js +3 -2
- package/dist/cli/backend/src/services/orchestrator/orchestrator-restart.service.js.map +1 -1
- package/dist/cli/backend/src/services/settings/settings.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/settings/settings.service.js +1 -0
- package/dist/cli/backend/src/services/settings/settings.service.js.map +1 -1
- package/dist/cli/backend/src/types/index.d.ts +1 -1
- package/dist/cli/backend/src/types/index.d.ts.map +1 -1
- package/dist/cli/backend/src/types/settings.types.d.ts +1 -1
- package/dist/cli/backend/src/types/settings.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/settings.types.js +7 -1
- package/dist/cli/backend/src/types/settings.types.js.map +1 -1
- package/dist/cli/backend/src/types/solution-bundle.types.d.ts +1 -1
- package/dist/cli/backend/src/types/solution-bundle.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/team-template.types.d.ts +2 -2
- package/dist/cli/backend/src/types/team-template.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/team-template.types.js +1 -1
- package/dist/cli/backend/src/types/team-template.types.js.map +1 -1
- package/dist/cli/backend/src/utils/antigravity-settings.utils.d.ts +115 -0
- package/dist/cli/backend/src/utils/antigravity-settings.utils.d.ts.map +1 -0
- package/dist/cli/backend/src/utils/antigravity-settings.utils.js +181 -0
- package/dist/cli/backend/src/utils/antigravity-settings.utils.js.map +1 -0
- package/dist/cli/backend/src/utils/runtime-model-flags.utils.d.ts +3 -2
- package/dist/cli/backend/src/utils/runtime-model-flags.utils.d.ts.map +1 -1
- package/dist/cli/backend/src/utils/runtime-model-flags.utils.js +13 -3
- package/dist/cli/backend/src/utils/runtime-model-flags.utils.js.map +1 -1
- package/dist/cli/backend/src/utils/terminal-string-ops.d.ts +1 -0
- package/dist/cli/backend/src/utils/terminal-string-ops.d.ts.map +1 -1
- package/dist/cli/backend/src/utils/terminal-string-ops.js +29 -1
- package/dist/cli/backend/src/utils/terminal-string-ops.js.map +1 -1
- package/dist/cli/cli/src/commands/doctor.d.ts +2 -2
- package/dist/cli/cli/src/commands/doctor.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/doctor.js +6 -3
- package/dist/cli/cli/src/commands/doctor.js.map +1 -1
- package/dist/cli/cli/src/commands/harness-setup.d.ts +21 -1
- package/dist/cli/cli/src/commands/harness-setup.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/harness-setup.js +53 -16
- package/dist/cli/cli/src/commands/harness-setup.js.map +1 -1
- package/dist/cli/cli/src/commands/harness.d.ts +2 -2
- package/dist/cli/cli/src/commands/harness.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/harness.js +6 -5
- package/dist/cli/cli/src/commands/harness.js.map +1 -1
- package/dist/cli/cli/src/commands/onboard.d.ts +7 -5
- package/dist/cli/cli/src/commands/onboard.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/onboard.js +6 -4
- package/dist/cli/cli/src/commands/onboard.js.map +1 -1
- package/dist/cli/cli/src/index.js +3 -3
- package/dist/cli/cli/src/index.js.map +1 -1
- package/dist/cli/cli/src/utils/runtime-auth.d.ts +42 -5
- package/dist/cli/cli/src/utils/runtime-auth.d.ts.map +1 -1
- package/dist/cli/cli/src/utils/runtime-auth.js +78 -6
- package/dist/cli/cli/src/utils/runtime-auth.js.map +1 -1
- package/frontend/dist/assets/{index-b4d5575e.js → index-e05af897.js} +271 -271
- package/frontend/dist/index.html +1 -1
- 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
|
|
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
|
|
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
|
|
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
|
-
* @
|
|
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":"AAAA
|
|
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
|
|
2
|
+
* Harness install as an async job with a log.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* retried once under the
|
|
6
|
-
* (`npm install -g --prefix …`);
|
|
7
|
-
*
|
|
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
|
|
117
|
+
* Run the install for a harness and record the outcome.
|
|
83
118
|
*
|
|
84
119
|
* @param record - Job record (mutated)
|
|
85
|
-
* @param
|
|
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
|
|
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
|
|
2
|
+
* Harness install as an async job with a log.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* retried once under the
|
|
6
|
-
* (`npm install -g --prefix …`);
|
|
7
|
-
*
|
|
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
|
|
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
|
|
175
|
+
* Run the install for a harness and record the outcome.
|
|
123
176
|
*
|
|
124
177
|
* @param record - Job record (mutated)
|
|
125
|
-
* @param
|
|
178
|
+
* @param def - Harness definition
|
|
126
179
|
* @returns The finished job
|
|
127
180
|
*/
|
|
128
|
-
async execute(record,
|
|
129
|
-
const spec = `${npmPackage}@latest`;
|
|
130
|
-
const env = { ...this.env, PATH: buildNpmPath(this.env.PATH) };
|
|
181
|
+
async execute(record, def) {
|
|
131
182
|
try {
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
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":"AAAA
|
|
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,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,
|
|
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.
|
|
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
|
-
|
|
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`, `
|
|
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('
|
|
123
|
+
* resolveHarnessAlias('agy'); // 'antigravity-cli'
|
|
83
124
|
* ```
|
|
84
125
|
*/
|
|
85
126
|
export declare function resolveHarnessAlias(value: string | undefined | null): HarnessId | null;
|