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