@evalops/maestro 0.10.46 → 0.10.47
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/dist/agent/providers/openai-codex-session.js +1 -1
- package/dist/agent/providers/openai-codex-session.js.map +1 -1
- package/dist/app-server/in-process-client.d.ts +2 -2
- package/dist/app-server/in-process-client.js.map +1 -1
- package/dist/app-server/protocol-modes-api.js +1 -1
- package/dist/app-server/protocol-modes-api.js.map +1 -1
- package/dist/app-server/sandbox-check-api.d.ts +21 -0
- package/dist/app-server/{sandbox-proof-api.d.ts.map → sandbox-check-api.d.ts.map} +1 -1
- package/dist/app-server/{sandbox-proof-api.js → sandbox-check-api.js} +18 -18
- package/dist/app-server/{sandbox-proof-api.js.map → sandbox-check-api.js.map} +1 -1
- package/dist/app-server/session-api.d.ts +5 -5
- package/dist/app-server/session-api.js +18 -18
- package/dist/app-server/session-api.js.map +1 -1
- package/dist/audit/logger.d.ts +1 -1
- package/dist/cli/args.js +1 -1
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/commands/codex.js +30 -3
- package/dist/cli/commands/codex.js.map +1 -1
- package/dist/cli-tui/auth-state.d.ts +7 -0
- package/dist/cli-tui/auth-state.d.ts.map +1 -0
- package/dist/cli-tui/auth-state.js +46 -0
- package/dist/cli-tui/auth-state.js.map +1 -0
- package/dist/cli-tui/commands/command-catalog.d.ts.map +1 -1
- package/dist/cli-tui/commands/command-catalog.js +6 -1
- package/dist/cli-tui/commands/command-catalog.js.map +1 -1
- package/dist/cli-tui/commands/command-suite-handlers.d.ts +2 -5
- package/dist/cli-tui/commands/command-suite-handlers.d.ts.map +1 -1
- package/dist/cli-tui/commands/command-suite-handlers.js.map +1 -1
- package/dist/cli-tui/commands/subcommands/auth-commands.d.ts +6 -5
- package/dist/cli-tui/commands/subcommands/auth-commands.d.ts.map +1 -1
- package/dist/cli-tui/commands/subcommands/auth-commands.js +2 -2
- package/dist/cli-tui/commands/subcommands/auth-commands.js.map +1 -1
- package/dist/cli-tui/oauth/oauth-flow-controller.d.ts.map +1 -1
- package/dist/cli-tui/oauth/oauth-flow-controller.js +24 -11
- package/dist/cli-tui/oauth/oauth-flow-controller.js.map +1 -1
- package/dist/cli-tui/selectors/oauth-selector-view.d.ts +1 -0
- package/dist/cli-tui/selectors/oauth-selector-view.d.ts.map +1 -1
- package/dist/cli-tui/selectors/oauth-selector-view.js +1 -1
- package/dist/cli-tui/selectors/oauth-selector-view.js.map +1 -1
- package/dist/cli-tui/selectors/oauth-selector.d.ts +2 -1
- package/dist/cli-tui/selectors/oauth-selector.d.ts.map +1 -1
- package/dist/cli-tui/selectors/oauth-selector.js +25 -2
- package/dist/cli-tui/selectors/oauth-selector.js.map +1 -1
- package/dist/cli-tui/tui-renderer/command-suite-wiring.d.ts +2 -5
- package/dist/cli-tui/tui-renderer/command-suite-wiring.d.ts.map +1 -1
- package/dist/cli-tui/tui-renderer/command-suite-wiring.js.map +1 -1
- package/dist/cli-tui/tui-renderer.d.ts +0 -4
- package/dist/cli-tui/tui-renderer.d.ts.map +1 -1
- package/dist/cli-tui/tui-renderer.js +3 -28
- package/dist/cli-tui/tui-renderer.js.map +1 -1
- package/dist/cli.js +896 -497
- package/dist/codex/app-server-client.d.ts +8 -2
- package/dist/codex/app-server-client.d.ts.map +1 -1
- package/dist/codex/app-server-client.js +18 -4
- package/dist/codex/app-server-client.js.map +1 -1
- package/dist/codex/auth.d.ts +4 -0
- package/dist/codex/auth.d.ts.map +1 -0
- package/dist/codex/auth.js +103 -0
- package/dist/codex/auth.js.map +1 -0
- package/dist/db/schema.d.ts +1 -1
- package/dist/evalops/agent-bootstrap.js +2 -2
- package/dist/evalops/agent-bootstrap.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +5 -1
- package/dist/main.js.map +1 -1
- package/dist/models/config-loader.d.ts +5 -5
- package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.d.ts +19 -19
- package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.d.ts.map +1 -1
- package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.js +12 -13
- package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.js.map +1 -1
- package/dist/node_modules/@evalops/contracts/package.json +1 -1
- package/dist/node_modules/@evalops/tui/package.json +1 -1
- package/dist/oauth/index.d.ts +1 -0
- package/dist/oauth/index.d.ts.map +1 -1
- package/dist/oauth/index.js +42 -2
- package/dist/oauth/index.js.map +1 -1
- package/dist/server/app-context.d.ts +2 -0
- package/dist/server/app-context.d.ts.map +1 -1
- package/dist/server/app-context.js.map +1 -1
- package/dist/server/handlers/headless-sessions.d.ts.map +1 -1
- package/dist/server/handlers/headless-sessions.js +44 -10
- package/dist/server/handlers/headless-sessions.js.map +1 -1
- package/dist/server/handlers/hosted-runner-identity.d.ts +2 -0
- package/dist/server/handlers/hosted-runner-identity.d.ts.map +1 -1
- package/dist/server/handlers/hosted-runner-identity.js +2 -0
- package/dist/server/handlers/hosted-runner-identity.js.map +1 -1
- package/dist/server/handlers/platform-a2a-push.d.ts.map +1 -1
- package/dist/server/handlers/platform-a2a-push.js +113 -2
- package/dist/server/handlers/platform-a2a-push.js.map +1 -1
- package/dist/server/headless-in-process-host.d.ts.map +1 -1
- package/dist/server/headless-in-process-host.js +1 -1
- package/dist/server/headless-in-process-host.js.map +1 -1
- package/dist/server/headless-runtime-service.d.ts +9 -2
- package/dist/server/headless-runtime-service.d.ts.map +1 -1
- package/dist/server/headless-runtime-service.js +54 -15
- package/dist/server/headless-runtime-service.js.map +1 -1
- package/dist/tools/background/task-runtime.js +1 -1
- package/dist/tools/background/task-runtime.js.map +1 -1
- package/dist/version.json +2 -2
- package/package.json +1 -1
- package/dist/app-server/sandbox-proof-api.d.ts +0 -21
package/dist/oauth/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { hasOpenAICodexAppServerAccount, loginOpenAICodexAppServer, logoutOpenAICodexAppServer, } from "../codex/auth.js";
|
|
1
2
|
import { assertEvalOpsManagedGatewayEnabled, isEvalOpsManagedGatewayEnabled, } from "../providers/evalops-managed.js";
|
|
2
3
|
import { createLogger } from "../utils/logger.js";
|
|
3
4
|
import { revokeOAuthProviderConnection, syncOAuthProviderConnection, syncStoredOAuthProviderConnection, } from "./connectors.js";
|
|
@@ -75,6 +76,14 @@ export function listOAuthLogoutProviders() {
|
|
|
75
76
|
return listOAuthProvidersFromStorage().filter((provider) => isSupportedOAuthProvider(provider) ||
|
|
76
77
|
isLegacyLogoutOnlyOAuthProvider(provider));
|
|
77
78
|
}
|
|
79
|
+
export async function listOAuthLogoutProvidersWithCodexAppServer() {
|
|
80
|
+
const providers = listOAuthLogoutProviders();
|
|
81
|
+
if (!providers.includes("openai-codex") &&
|
|
82
|
+
(await hasOpenAICodexAppServerAccount())) {
|
|
83
|
+
return [...providers, "openai-codex"];
|
|
84
|
+
}
|
|
85
|
+
return providers;
|
|
86
|
+
}
|
|
78
87
|
export function getOAuthLogoutProviders() {
|
|
79
88
|
const loggedInProviders = new Set(listOAuthLogoutProviders());
|
|
80
89
|
const supported = getOAuthProviders().filter((provider) => loggedInProviders.has(provider.id));
|
|
@@ -109,8 +118,13 @@ export async function login(provider, options) {
|
|
|
109
118
|
shouldSyncConnectorConnection = true;
|
|
110
119
|
break;
|
|
111
120
|
case "openai-codex":
|
|
112
|
-
|
|
113
|
-
|
|
121
|
+
if (options.mode === "responses" || options.mode === "legacy-responses") {
|
|
122
|
+
await loginOpenAICodex(options.onAuthUrl, options.onPromptCode, options.onStatus);
|
|
123
|
+
shouldSyncConnectorConnection = true;
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
await loginOpenAICodexAppServer(options.onAuthUrl, options.onPromptCode, options.onStatus);
|
|
127
|
+
}
|
|
114
128
|
break;
|
|
115
129
|
case "evalops":
|
|
116
130
|
assertEvalOpsManagedGatewayEnabled();
|
|
@@ -143,6 +157,7 @@ export async function login(provider, options) {
|
|
|
143
157
|
*/
|
|
144
158
|
export async function logout(provider) {
|
|
145
159
|
const credentials = loadOAuthCredentials(provider);
|
|
160
|
+
let codexAppServerLogoutError;
|
|
146
161
|
if (isLegacyLogoutOnlyOAuthProvider(provider)) {
|
|
147
162
|
await revokeOAuthProviderConnection(provider, credentials);
|
|
148
163
|
removeOAuthCredentials(provider);
|
|
@@ -159,10 +174,35 @@ export async function logout(provider) {
|
|
|
159
174
|
});
|
|
160
175
|
}
|
|
161
176
|
}
|
|
177
|
+
if (provider === "openai-codex") {
|
|
178
|
+
const shouldLogoutAppServer = !credentials || (await hasOpenAICodexAppServerAccount());
|
|
179
|
+
if (shouldLogoutAppServer) {
|
|
180
|
+
try {
|
|
181
|
+
await logoutOpenAICodexAppServer();
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
if (!credentials) {
|
|
185
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
186
|
+
throw new Error(`Failed to sign out of Codex app-server: ${message}`);
|
|
187
|
+
}
|
|
188
|
+
codexAppServerLogoutError = error;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
162
192
|
if (provider !== "evalops") {
|
|
163
193
|
await revokeOAuthProviderConnection(provider, credentials);
|
|
164
194
|
}
|
|
165
195
|
removeOAuthCredentials(provider);
|
|
196
|
+
if (codexAppServerLogoutError) {
|
|
197
|
+
const message = codexAppServerLogoutError instanceof Error
|
|
198
|
+
? codexAppServerLogoutError.message
|
|
199
|
+
: String(codexAppServerLogoutError);
|
|
200
|
+
logger.warn("Failed to sign out of Codex app-server", {
|
|
201
|
+
error: message,
|
|
202
|
+
provider,
|
|
203
|
+
});
|
|
204
|
+
throw new Error(`Failed to sign out of Codex app-server; legacy OAuth credentials were removed: ${message}`);
|
|
205
|
+
}
|
|
166
206
|
}
|
|
167
207
|
/**
|
|
168
208
|
* Refresh OAuth token for provider
|
package/dist/oauth/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/oauth/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tassertEvalOpsManagedGatewayEnabled,\n\tisEvalOpsManagedGatewayEnabled,\n} from \"../providers/evalops-managed.js\";\nimport { createLogger } from \"../utils/logger.js\";\nimport {\n\trevokeOAuthProviderConnection,\n\tsyncOAuthProviderConnection,\n\tsyncStoredOAuthProviderConnection,\n} from \"./connectors.js\";\nimport {\n\tbuildEvalOpsDelegationEnvironment,\n\tissueEvalOpsDelegationToken,\n\tloginEvalOps,\n\trefreshEvalOpsToken,\n\trevokeEvalOpsToken,\n} from \"./evalops.js\";\nimport {\n\tloginGitHubCopilot,\n\tmigrateGitHubCopilotCredentials,\n\trefreshGitHubCopilotToken,\n} from \"./github-copilot.js\";\nimport {\n\tloginGoogleAntigravity,\n\trefreshGoogleAntigravityToken,\n} from \"./google-antigravity.js\";\nimport {\n\tloginGoogleGeminiCli,\n\trefreshGoogleGeminiCliToken,\n} from \"./google-gemini-cli.js\";\nimport { loginOpenAICodex, refreshOpenAICodexToken } from \"./openai-codex.js\";\nimport {\n\tloginOpenAI,\n\tmigrateOpenAICredentials,\n\trefreshOpenAIToken,\n} from \"./openai.js\";\nimport {\n\ttype OAuthCredentials,\n\tlistOAuthProviders as listOAuthProvidersFromStorage,\n\tloadOAuthCredentials,\n\tremoveOAuthCredentials,\n\tsaveOAuthCredentials,\n} from \"./storage.js\";\n\nconst logger = createLogger(\"oauth\");\n\nexport type { OAuthCredentials } from \"./storage.js\";\nexport { buildEvalOpsDelegationEnvironment, issueEvalOpsDelegationToken };\n\nexport type SupportedOAuthProvider =\n\t| \"evalops\"\n\t| \"openai\"\n\t| \"openai-codex\"\n\t| \"github-copilot\"\n\t| \"google-gemini-cli\"\n\t| \"google-antigravity\";\n\nexport type LegacyLogoutOnlyOAuthProvider = \"anthropic\";\nexport type OAuthLogoutProvider =\n\t| SupportedOAuthProvider\n\t| LegacyLogoutOnlyOAuthProvider;\n\nconst SUPPORTED_OAUTH_PROVIDERS = new Set<SupportedOAuthProvider>([\n\t\"evalops\",\n\t\"openai\",\n\t\"openai-codex\",\n\t\"github-copilot\",\n\t\"google-gemini-cli\",\n\t\"google-antigravity\",\n]);\n\nconst LEGACY_LOGOUT_ONLY_OAUTH_PROVIDERS =\n\tnew Set<LegacyLogoutOnlyOAuthProvider>([\"anthropic\"]);\n\nexport interface OAuthProviderInfo<\n\tTProvider extends string = SupportedOAuthProvider,\n> {\n\tid: TProvider;\n\tname: string;\n\tdescription: string;\n\tavailable: boolean;\n}\n\nfunction isSupportedOAuthProvider(\n\tprovider: string,\n): provider is SupportedOAuthProvider {\n\treturn SUPPORTED_OAUTH_PROVIDERS.has(provider as SupportedOAuthProvider);\n}\n\nfunction isLegacyLogoutOnlyOAuthProvider(\n\tprovider: string,\n): provider is LegacyLogoutOnlyOAuthProvider {\n\treturn LEGACY_LOGOUT_ONLY_OAUTH_PROVIDERS.has(\n\t\tprovider as LegacyLogoutOnlyOAuthProvider,\n\t);\n}\n\n/**\n * Get list of OAuth providers\n */\nexport function getOAuthProviders(): OAuthProviderInfo[] {\n\treturn [\n\t\t{\n\t\t\tid: \"openai-codex\",\n\t\t\tname: \"OpenAI Codex\",\n\t\t\tdescription: \"Codex with ChatGPT Plus/Pro login\",\n\t\t\tavailable: true,\n\t\t},\n\t\t{\n\t\t\tid: \"openai\",\n\t\t\tname: \"OpenAI\",\n\t\t\tdescription: \"OpenAI Platform API via ChatGPT login\",\n\t\t\tavailable: true,\n\t\t},\n\t\t{\n\t\t\tid: \"evalops\",\n\t\t\tname: \"EvalOps Managed\",\n\t\t\tdescription: \"Identity-backed managed gateway access\",\n\t\t\tavailable: isEvalOpsManagedGatewayEnabled(),\n\t\t},\n\t\t{\n\t\t\tid: \"google-gemini-cli\",\n\t\t\tname: \"Google Gemini CLI\",\n\t\t\tdescription: \"Cloud Code Assist OAuth\",\n\t\t\tavailable: true,\n\t\t},\n\t\t{\n\t\t\tid: \"google-antigravity\",\n\t\t\tname: \"Google Antigravity\",\n\t\t\tdescription: \"Antigravity sandbox OAuth\",\n\t\t\tavailable: true,\n\t\t},\n\t\t{\n\t\t\tid: \"github-copilot\",\n\t\t\tname: \"GitHub Copilot\",\n\t\t\tdescription: \"GitHub Copilot subscription\",\n\t\t\tavailable: true,\n\t\t},\n\t];\n}\n\nexport function listOAuthProviders(): SupportedOAuthProvider[] {\n\treturn listOAuthProvidersFromStorage().filter(\n\t\t(provider): provider is SupportedOAuthProvider =>\n\t\t\tisSupportedOAuthProvider(provider),\n\t);\n}\n\nexport function listOAuthLogoutProviders(): OAuthLogoutProvider[] {\n\treturn listOAuthProvidersFromStorage().filter(\n\t\t(provider): provider is OAuthLogoutProvider =>\n\t\t\tisSupportedOAuthProvider(provider) ||\n\t\t\tisLegacyLogoutOnlyOAuthProvider(provider),\n\t);\n}\n\nexport function getOAuthLogoutProviders(): OAuthProviderInfo<OAuthLogoutProvider>[] {\n\tconst loggedInProviders = new Set(listOAuthLogoutProviders());\n\tconst supported = getOAuthProviders().filter((provider) =>\n\t\tloggedInProviders.has(provider.id),\n\t);\n\tconst legacy: OAuthProviderInfo<OAuthLogoutProvider>[] = [];\n\tif (loggedInProviders.has(\"anthropic\")) {\n\t\tlegacy.push({\n\t\t\tid: \"anthropic\",\n\t\t\tname: \"Anthropic OAuth\",\n\t\t\tdescription: \"Legacy Anthropic OAuth credentials (logout only)\",\n\t\t\tavailable: true,\n\t\t});\n\t}\n\treturn [...supported, ...legacy];\n}\n\n/**\n * Check if a provider has OAuth credentials stored\n */\nexport function hasOAuthCredentials(provider: SupportedOAuthProvider): boolean {\n\tif (!SUPPORTED_OAUTH_PROVIDERS.has(provider)) {\n\t\treturn false;\n\t}\n\treturn loadOAuthCredentials(provider) !== null;\n}\n\n/**\n * Login with OAuth provider\n */\nexport async function login(\n\tprovider: SupportedOAuthProvider,\n\toptions: {\n\t\tmode?: string;\n\t\tonAuthUrl: (url: string) => void;\n\t\tonPromptCode?: () => Promise<string>;\n\t\tonStatus?: (status: string) => void;\n\t\tonDeviceCode?: (code: string, verificationUri: string) => void;\n\t},\n): Promise<void> {\n\tlet shouldSyncConnectorConnection = false;\n\tswitch (provider) {\n\t\tcase \"openai\":\n\t\t\tawait loginOpenAI(options.onAuthUrl, options.onStatus);\n\t\t\tshouldSyncConnectorConnection = true;\n\t\t\tbreak;\n\t\tcase \"openai-codex\":\n\t\t\tawait loginOpenAICodex(\n\t\t\t\toptions.onAuthUrl,\n\t\t\t\toptions.onPromptCode,\n\t\t\t\toptions.onStatus,\n\t\t\t);\n\t\t\tshouldSyncConnectorConnection = true;\n\t\t\tbreak;\n\t\tcase \"evalops\":\n\t\t\tassertEvalOpsManagedGatewayEnabled();\n\t\t\tawait loginEvalOps(options.onAuthUrl, options.onStatus);\n\t\t\tbreak;\n\t\tcase \"google-gemini-cli\":\n\t\t\tawait loginGoogleGeminiCli(options.onAuthUrl, options.onStatus);\n\t\t\tshouldSyncConnectorConnection = true;\n\t\t\tbreak;\n\t\tcase \"google-antigravity\":\n\t\t\tawait loginGoogleAntigravity(options.onAuthUrl, options.onStatus);\n\t\t\tshouldSyncConnectorConnection = true;\n\t\t\tbreak;\n\t\tcase \"github-copilot\":\n\t\t\tif (!options.onDeviceCode) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"GitHub Copilot requires onDeviceCode callback for device flow\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait loginGitHubCopilot(options.onDeviceCode, options.onStatus);\n\t\t\tshouldSyncConnectorConnection = true;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow new Error(`Unknown OAuth provider: ${provider}`);\n\t}\n\tif (shouldSyncConnectorConnection) {\n\t\tawait syncStoredOAuthProviderConnection(provider);\n\t}\n}\n\n/**\n * Logout from OAuth provider\n */\nexport async function logout(provider: OAuthLogoutProvider): Promise<void> {\n\tconst credentials = loadOAuthCredentials(provider);\n\tif (isLegacyLogoutOnlyOAuthProvider(provider)) {\n\t\tawait revokeOAuthProviderConnection(provider, credentials);\n\t\tremoveOAuthCredentials(provider);\n\t\treturn;\n\t}\n\tif (provider === \"evalops\" && credentials?.refresh) {\n\t\ttry {\n\t\t\tawait revokeEvalOpsToken(credentials.refresh, credentials.metadata);\n\t\t} catch (error) {\n\t\t\tlogger.warn(\"Failed to revoke EvalOps refresh token during logout\", {\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\tprovider,\n\t\t\t});\n\t\t}\n\t}\n\tif (provider !== \"evalops\") {\n\t\tawait revokeOAuthProviderConnection(provider, credentials);\n\t}\n\tremoveOAuthCredentials(provider);\n}\n\n/**\n * Refresh OAuth token for provider\n */\nexport async function refreshToken(\n\tprovider: SupportedOAuthProvider,\n): Promise<string> {\n\tconst credentials = loadOAuthCredentials(provider);\n\tif (!credentials) {\n\t\tthrow new Error(`No OAuth credentials found for ${provider}`);\n\t}\n\n\tlet newCredentials: OAuthCredentials;\n\n\tswitch (provider) {\n\t\tcase \"openai\":\n\t\t\tnewCredentials = await refreshOpenAIToken(\n\t\t\t\tcredentials.refresh,\n\t\t\t\tcredentials.metadata,\n\t\t\t);\n\t\t\tbreak;\n\t\tcase \"openai-codex\":\n\t\t\tnewCredentials = await refreshOpenAICodexToken(\n\t\t\t\tcredentials.refresh,\n\t\t\t\tcredentials.metadata,\n\t\t\t);\n\t\t\tbreak;\n\t\tcase \"evalops\":\n\t\t\tnewCredentials = await refreshEvalOpsToken(\n\t\t\t\tcredentials.refresh,\n\t\t\t\tcredentials.metadata,\n\t\t\t);\n\t\t\tbreak;\n\t\tcase \"google-gemini-cli\":\n\t\t\tnewCredentials = await refreshGoogleGeminiCliToken(\n\t\t\t\tcredentials.refresh,\n\t\t\t\tcredentials.metadata,\n\t\t\t);\n\t\t\tbreak;\n\t\tcase \"google-antigravity\":\n\t\t\tnewCredentials = await refreshGoogleAntigravityToken(\n\t\t\t\tcredentials.refresh,\n\t\t\t\tcredentials.metadata,\n\t\t\t);\n\t\t\tbreak;\n\t\tcase \"github-copilot\":\n\t\t\tnewCredentials = await refreshGitHubCopilotToken(\n\t\t\t\tcredentials.refresh,\n\t\t\t\tcredentials.metadata,\n\t\t\t);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow new Error(`Unknown OAuth provider: ${provider}`);\n\t}\n\n\tif (provider !== \"evalops\") {\n\t\tnewCredentials = await syncOAuthProviderConnection(\n\t\t\tprovider,\n\t\t\tnewCredentials,\n\t\t);\n\t}\n\n\t// Save new credentials\n\tsaveOAuthCredentials(provider, newCredentials);\n\n\treturn newCredentials.access;\n}\n\n/**\n * Get OAuth token for provider (auto-refreshes if expired)\n */\nexport async function getOAuthToken(\n\tprovider: SupportedOAuthProvider,\n): Promise<string | null> {\n\tif (!SUPPORTED_OAUTH_PROVIDERS.has(provider)) {\n\t\treturn null;\n\t}\n\tconst credentials = loadOAuthCredentials(provider);\n\tif (!credentials) {\n\t\treturn null;\n\t}\n\n\t// Check if token is expired (with 1 min buffer)\n\tif (Date.now() >= credentials.expires - 60_000) {\n\t\t// Token expired or expiring soon - refresh it\n\t\ttry {\n\t\t\treturn await refreshToken(provider);\n\t\t} catch (error) {\n\t\t\tlogger.error(\n\t\t\t\t\"Failed to refresh OAuth token\",\n\t\t\t\terror instanceof Error ? error : new Error(String(error)),\n\t\t\t\t{ provider },\n\t\t\t);\n\t\t\t// Remove invalid credentials\n\t\t\tremoveOAuthCredentials(provider);\n\t\t\treturn null;\n\t\t}\n\t}\n\n\treturn credentials.access;\n}\n\n/**\n * Migrate old provider-specific OAuth credentials to new generic format\n */\nexport async function migrateOAuthCredentials(): Promise<void> {\n\t// Migrate OpenAI credentials\n\tconst openaiMigrated = await migrateOpenAICredentials();\n\tif (openaiMigrated) {\n\t\tlogger.info(\"Migrated OpenAI OAuth credentials to new format\");\n\t}\n\n\t// Migrate GitHub Copilot credentials from environment\n\tconst copilotMigrated = await migrateGitHubCopilotCredentials();\n\tif (copilotMigrated) {\n\t\tlogger.info(\"Migrated GitHub Copilot credentials from environment\");\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/oauth/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\thasOpenAICodexAppServerAccount,\n\tloginOpenAICodexAppServer,\n\tlogoutOpenAICodexAppServer,\n} from \"../codex/auth.js\";\nimport {\n\tassertEvalOpsManagedGatewayEnabled,\n\tisEvalOpsManagedGatewayEnabled,\n} from \"../providers/evalops-managed.js\";\nimport { createLogger } from \"../utils/logger.js\";\nimport {\n\trevokeOAuthProviderConnection,\n\tsyncOAuthProviderConnection,\n\tsyncStoredOAuthProviderConnection,\n} from \"./connectors.js\";\nimport {\n\tbuildEvalOpsDelegationEnvironment,\n\tissueEvalOpsDelegationToken,\n\tloginEvalOps,\n\trefreshEvalOpsToken,\n\trevokeEvalOpsToken,\n} from \"./evalops.js\";\nimport {\n\tloginGitHubCopilot,\n\tmigrateGitHubCopilotCredentials,\n\trefreshGitHubCopilotToken,\n} from \"./github-copilot.js\";\nimport {\n\tloginGoogleAntigravity,\n\trefreshGoogleAntigravityToken,\n} from \"./google-antigravity.js\";\nimport {\n\tloginGoogleGeminiCli,\n\trefreshGoogleGeminiCliToken,\n} from \"./google-gemini-cli.js\";\nimport { loginOpenAICodex, refreshOpenAICodexToken } from \"./openai-codex.js\";\nimport {\n\tloginOpenAI,\n\tmigrateOpenAICredentials,\n\trefreshOpenAIToken,\n} from \"./openai.js\";\nimport {\n\ttype OAuthCredentials,\n\tlistOAuthProviders as listOAuthProvidersFromStorage,\n\tloadOAuthCredentials,\n\tremoveOAuthCredentials,\n\tsaveOAuthCredentials,\n} from \"./storage.js\";\n\nconst logger = createLogger(\"oauth\");\n\nexport type { OAuthCredentials } from \"./storage.js\";\nexport { buildEvalOpsDelegationEnvironment, issueEvalOpsDelegationToken };\n\nexport type SupportedOAuthProvider =\n\t| \"evalops\"\n\t| \"openai\"\n\t| \"openai-codex\"\n\t| \"github-copilot\"\n\t| \"google-gemini-cli\"\n\t| \"google-antigravity\";\n\nexport type LegacyLogoutOnlyOAuthProvider = \"anthropic\";\nexport type OAuthLogoutProvider =\n\t| SupportedOAuthProvider\n\t| LegacyLogoutOnlyOAuthProvider;\n\nconst SUPPORTED_OAUTH_PROVIDERS = new Set<SupportedOAuthProvider>([\n\t\"evalops\",\n\t\"openai\",\n\t\"openai-codex\",\n\t\"github-copilot\",\n\t\"google-gemini-cli\",\n\t\"google-antigravity\",\n]);\n\nconst LEGACY_LOGOUT_ONLY_OAUTH_PROVIDERS =\n\tnew Set<LegacyLogoutOnlyOAuthProvider>([\"anthropic\"]);\n\nexport interface OAuthProviderInfo<\n\tTProvider extends string = SupportedOAuthProvider,\n> {\n\tid: TProvider;\n\tname: string;\n\tdescription: string;\n\tavailable: boolean;\n}\n\nfunction isSupportedOAuthProvider(\n\tprovider: string,\n): provider is SupportedOAuthProvider {\n\treturn SUPPORTED_OAUTH_PROVIDERS.has(provider as SupportedOAuthProvider);\n}\n\nfunction isLegacyLogoutOnlyOAuthProvider(\n\tprovider: string,\n): provider is LegacyLogoutOnlyOAuthProvider {\n\treturn LEGACY_LOGOUT_ONLY_OAUTH_PROVIDERS.has(\n\t\tprovider as LegacyLogoutOnlyOAuthProvider,\n\t);\n}\n\n/**\n * Get list of OAuth providers\n */\nexport function getOAuthProviders(): OAuthProviderInfo[] {\n\treturn [\n\t\t{\n\t\t\tid: \"openai-codex\",\n\t\t\tname: \"OpenAI Codex\",\n\t\t\tdescription: \"Codex with ChatGPT Plus/Pro login\",\n\t\t\tavailable: true,\n\t\t},\n\t\t{\n\t\t\tid: \"openai\",\n\t\t\tname: \"OpenAI\",\n\t\t\tdescription: \"OpenAI Platform API via ChatGPT login\",\n\t\t\tavailable: true,\n\t\t},\n\t\t{\n\t\t\tid: \"evalops\",\n\t\t\tname: \"EvalOps Managed\",\n\t\t\tdescription: \"Identity-backed managed gateway access\",\n\t\t\tavailable: isEvalOpsManagedGatewayEnabled(),\n\t\t},\n\t\t{\n\t\t\tid: \"google-gemini-cli\",\n\t\t\tname: \"Google Gemini CLI\",\n\t\t\tdescription: \"Cloud Code Assist OAuth\",\n\t\t\tavailable: true,\n\t\t},\n\t\t{\n\t\t\tid: \"google-antigravity\",\n\t\t\tname: \"Google Antigravity\",\n\t\t\tdescription: \"Antigravity sandbox OAuth\",\n\t\t\tavailable: true,\n\t\t},\n\t\t{\n\t\t\tid: \"github-copilot\",\n\t\t\tname: \"GitHub Copilot\",\n\t\t\tdescription: \"GitHub Copilot subscription\",\n\t\t\tavailable: true,\n\t\t},\n\t];\n}\n\nexport function listOAuthProviders(): SupportedOAuthProvider[] {\n\treturn listOAuthProvidersFromStorage().filter(\n\t\t(provider): provider is SupportedOAuthProvider =>\n\t\t\tisSupportedOAuthProvider(provider),\n\t);\n}\n\nexport function listOAuthLogoutProviders(): OAuthLogoutProvider[] {\n\treturn listOAuthProvidersFromStorage().filter(\n\t\t(provider): provider is OAuthLogoutProvider =>\n\t\t\tisSupportedOAuthProvider(provider) ||\n\t\t\tisLegacyLogoutOnlyOAuthProvider(provider),\n\t);\n}\n\nexport async function listOAuthLogoutProvidersWithCodexAppServer(): Promise<\n\tOAuthLogoutProvider[]\n> {\n\tconst providers = listOAuthLogoutProviders();\n\tif (\n\t\t!providers.includes(\"openai-codex\") &&\n\t\t(await hasOpenAICodexAppServerAccount())\n\t) {\n\t\treturn [...providers, \"openai-codex\"];\n\t}\n\treturn providers;\n}\n\nexport function getOAuthLogoutProviders(): OAuthProviderInfo<OAuthLogoutProvider>[] {\n\tconst loggedInProviders = new Set(listOAuthLogoutProviders());\n\tconst supported = getOAuthProviders().filter((provider) =>\n\t\tloggedInProviders.has(provider.id),\n\t);\n\tconst legacy: OAuthProviderInfo<OAuthLogoutProvider>[] = [];\n\tif (loggedInProviders.has(\"anthropic\")) {\n\t\tlegacy.push({\n\t\t\tid: \"anthropic\",\n\t\t\tname: \"Anthropic OAuth\",\n\t\t\tdescription: \"Legacy Anthropic OAuth credentials (logout only)\",\n\t\t\tavailable: true,\n\t\t});\n\t}\n\treturn [...supported, ...legacy];\n}\n\n/**\n * Check if a provider has OAuth credentials stored\n */\nexport function hasOAuthCredentials(provider: SupportedOAuthProvider): boolean {\n\tif (!SUPPORTED_OAUTH_PROVIDERS.has(provider)) {\n\t\treturn false;\n\t}\n\treturn loadOAuthCredentials(provider) !== null;\n}\n\n/**\n * Login with OAuth provider\n */\nexport async function login(\n\tprovider: SupportedOAuthProvider,\n\toptions: {\n\t\tmode?: string;\n\t\tonAuthUrl: (url: string) => void;\n\t\tonPromptCode?: () => Promise<string>;\n\t\tonStatus?: (status: string) => void;\n\t\tonDeviceCode?: (code: string, verificationUri: string) => void;\n\t},\n): Promise<void> {\n\tlet shouldSyncConnectorConnection = false;\n\tswitch (provider) {\n\t\tcase \"openai\":\n\t\t\tawait loginOpenAI(options.onAuthUrl, options.onStatus);\n\t\t\tshouldSyncConnectorConnection = true;\n\t\t\tbreak;\n\t\tcase \"openai-codex\":\n\t\t\tif (options.mode === \"responses\" || options.mode === \"legacy-responses\") {\n\t\t\t\tawait loginOpenAICodex(\n\t\t\t\t\toptions.onAuthUrl,\n\t\t\t\t\toptions.onPromptCode,\n\t\t\t\t\toptions.onStatus,\n\t\t\t\t);\n\t\t\t\tshouldSyncConnectorConnection = true;\n\t\t\t} else {\n\t\t\t\tawait loginOpenAICodexAppServer(\n\t\t\t\t\toptions.onAuthUrl,\n\t\t\t\t\toptions.onPromptCode,\n\t\t\t\t\toptions.onStatus,\n\t\t\t\t);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase \"evalops\":\n\t\t\tassertEvalOpsManagedGatewayEnabled();\n\t\t\tawait loginEvalOps(options.onAuthUrl, options.onStatus);\n\t\t\tbreak;\n\t\tcase \"google-gemini-cli\":\n\t\t\tawait loginGoogleGeminiCli(options.onAuthUrl, options.onStatus);\n\t\t\tshouldSyncConnectorConnection = true;\n\t\t\tbreak;\n\t\tcase \"google-antigravity\":\n\t\t\tawait loginGoogleAntigravity(options.onAuthUrl, options.onStatus);\n\t\t\tshouldSyncConnectorConnection = true;\n\t\t\tbreak;\n\t\tcase \"github-copilot\":\n\t\t\tif (!options.onDeviceCode) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"GitHub Copilot requires onDeviceCode callback for device flow\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait loginGitHubCopilot(options.onDeviceCode, options.onStatus);\n\t\t\tshouldSyncConnectorConnection = true;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow new Error(`Unknown OAuth provider: ${provider}`);\n\t}\n\tif (shouldSyncConnectorConnection) {\n\t\tawait syncStoredOAuthProviderConnection(provider);\n\t}\n}\n\n/**\n * Logout from OAuth provider\n */\nexport async function logout(provider: OAuthLogoutProvider): Promise<void> {\n\tconst credentials = loadOAuthCredentials(provider);\n\tlet codexAppServerLogoutError: unknown;\n\tif (isLegacyLogoutOnlyOAuthProvider(provider)) {\n\t\tawait revokeOAuthProviderConnection(provider, credentials);\n\t\tremoveOAuthCredentials(provider);\n\t\treturn;\n\t}\n\tif (provider === \"evalops\" && credentials?.refresh) {\n\t\ttry {\n\t\t\tawait revokeEvalOpsToken(credentials.refresh, credentials.metadata);\n\t\t} catch (error) {\n\t\t\tlogger.warn(\"Failed to revoke EvalOps refresh token during logout\", {\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\tprovider,\n\t\t\t});\n\t\t}\n\t}\n\tif (provider === \"openai-codex\") {\n\t\tconst shouldLogoutAppServer =\n\t\t\t!credentials || (await hasOpenAICodexAppServerAccount());\n\t\tif (shouldLogoutAppServer) {\n\t\t\ttry {\n\t\t\t\tawait logoutOpenAICodexAppServer();\n\t\t\t} catch (error) {\n\t\t\t\tif (!credentials) {\n\t\t\t\t\tconst message =\n\t\t\t\t\t\terror instanceof Error ? error.message : String(error);\n\t\t\t\t\tthrow new Error(`Failed to sign out of Codex app-server: ${message}`);\n\t\t\t\t}\n\t\t\t\tcodexAppServerLogoutError = error;\n\t\t\t}\n\t\t}\n\t}\n\tif (provider !== \"evalops\") {\n\t\tawait revokeOAuthProviderConnection(provider, credentials);\n\t}\n\tremoveOAuthCredentials(provider);\n\tif (codexAppServerLogoutError) {\n\t\tconst message =\n\t\t\tcodexAppServerLogoutError instanceof Error\n\t\t\t\t? codexAppServerLogoutError.message\n\t\t\t\t: String(codexAppServerLogoutError);\n\t\tlogger.warn(\"Failed to sign out of Codex app-server\", {\n\t\t\terror: message,\n\t\t\tprovider,\n\t\t});\n\t\tthrow new Error(\n\t\t\t`Failed to sign out of Codex app-server; legacy OAuth credentials were removed: ${message}`,\n\t\t);\n\t}\n}\n\n/**\n * Refresh OAuth token for provider\n */\nexport async function refreshToken(\n\tprovider: SupportedOAuthProvider,\n): Promise<string> {\n\tconst credentials = loadOAuthCredentials(provider);\n\tif (!credentials) {\n\t\tthrow new Error(`No OAuth credentials found for ${provider}`);\n\t}\n\n\tlet newCredentials: OAuthCredentials;\n\n\tswitch (provider) {\n\t\tcase \"openai\":\n\t\t\tnewCredentials = await refreshOpenAIToken(\n\t\t\t\tcredentials.refresh,\n\t\t\t\tcredentials.metadata,\n\t\t\t);\n\t\t\tbreak;\n\t\tcase \"openai-codex\":\n\t\t\tnewCredentials = await refreshOpenAICodexToken(\n\t\t\t\tcredentials.refresh,\n\t\t\t\tcredentials.metadata,\n\t\t\t);\n\t\t\tbreak;\n\t\tcase \"evalops\":\n\t\t\tnewCredentials = await refreshEvalOpsToken(\n\t\t\t\tcredentials.refresh,\n\t\t\t\tcredentials.metadata,\n\t\t\t);\n\t\t\tbreak;\n\t\tcase \"google-gemini-cli\":\n\t\t\tnewCredentials = await refreshGoogleGeminiCliToken(\n\t\t\t\tcredentials.refresh,\n\t\t\t\tcredentials.metadata,\n\t\t\t);\n\t\t\tbreak;\n\t\tcase \"google-antigravity\":\n\t\t\tnewCredentials = await refreshGoogleAntigravityToken(\n\t\t\t\tcredentials.refresh,\n\t\t\t\tcredentials.metadata,\n\t\t\t);\n\t\t\tbreak;\n\t\tcase \"github-copilot\":\n\t\t\tnewCredentials = await refreshGitHubCopilotToken(\n\t\t\t\tcredentials.refresh,\n\t\t\t\tcredentials.metadata,\n\t\t\t);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow new Error(`Unknown OAuth provider: ${provider}`);\n\t}\n\n\tif (provider !== \"evalops\") {\n\t\tnewCredentials = await syncOAuthProviderConnection(\n\t\t\tprovider,\n\t\t\tnewCredentials,\n\t\t);\n\t}\n\n\t// Save new credentials\n\tsaveOAuthCredentials(provider, newCredentials);\n\n\treturn newCredentials.access;\n}\n\n/**\n * Get OAuth token for provider (auto-refreshes if expired)\n */\nexport async function getOAuthToken(\n\tprovider: SupportedOAuthProvider,\n): Promise<string | null> {\n\tif (!SUPPORTED_OAUTH_PROVIDERS.has(provider)) {\n\t\treturn null;\n\t}\n\tconst credentials = loadOAuthCredentials(provider);\n\tif (!credentials) {\n\t\treturn null;\n\t}\n\n\t// Check if token is expired (with 1 min buffer)\n\tif (Date.now() >= credentials.expires - 60_000) {\n\t\t// Token expired or expiring soon - refresh it\n\t\ttry {\n\t\t\treturn await refreshToken(provider);\n\t\t} catch (error) {\n\t\t\tlogger.error(\n\t\t\t\t\"Failed to refresh OAuth token\",\n\t\t\t\terror instanceof Error ? error : new Error(String(error)),\n\t\t\t\t{ provider },\n\t\t\t);\n\t\t\t// Remove invalid credentials\n\t\t\tremoveOAuthCredentials(provider);\n\t\t\treturn null;\n\t\t}\n\t}\n\n\treturn credentials.access;\n}\n\n/**\n * Migrate old provider-specific OAuth credentials to new generic format\n */\nexport async function migrateOAuthCredentials(): Promise<void> {\n\t// Migrate OpenAI credentials\n\tconst openaiMigrated = await migrateOpenAICredentials();\n\tif (openaiMigrated) {\n\t\tlogger.info(\"Migrated OpenAI OAuth credentials to new format\");\n\t}\n\n\t// Migrate GitHub Copilot credentials from environment\n\tconst copilotMigrated = await migrateGitHubCopilotCredentials();\n\tif (copilotMigrated) {\n\t\tlogger.info(\"Migrated GitHub Copilot credentials from environment\");\n\t}\n}\n"]}
|
|
@@ -34,6 +34,8 @@ export interface HostedRunnerContext {
|
|
|
34
34
|
lastPlatformA2APush?: {
|
|
35
35
|
kind: "statusUpdate" | "artifactUpdate" | "task" | "message";
|
|
36
36
|
taskId?: string;
|
|
37
|
+
messageId?: string;
|
|
38
|
+
messageIds?: string[];
|
|
37
39
|
contextId?: string;
|
|
38
40
|
workspaceId?: string;
|
|
39
41
|
organizationId?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-context.d.ts","sourceRoot":"","sources":["../../src/server/app-context.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"app-context.d.ts","sourceRoot":"","sources":["../../src/server/app-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-context.js","sourceRoot":"","sources":["../../src/server/app-context.ts"],"names":[],"mappings":"","sourcesContent":["import type { IncomingMessage, ServerResponse } from \"node:http\";\nimport type {\n\tActionApprovalService,\n\tApprovalMode,\n} from \"../agent/action-approval.js\";\nimport type { Agent } from \"../agent/index.js\";\nimport type { ToolRetryService } from \"../agent/tool-retry.js\";\nimport type { ClientToolExecutionService } from \"../agent/transport.js\";\nimport type { PlatformToolExecutionBridge } from \"../agent/transport/tool-execution-bridge.js\";\nimport type { ThinkingLevel } from \"../agent/types.js\";\nimport type { RegisteredModel } from \"../models/registry.js\";\nimport type { AuthCredential } from \"../providers/auth.js\";\nimport type { HeadlessRuntimeService } from \"./headless-runtime-service.js\";\nimport type { HostedRunnerLeaseSnapshot } from \"./hosted-runner-lease.js\";\n\nexport interface WebServerConfig {\n\tcorsHeaders: Record<string, string>;\n\tstaticMaxAge: number;\n\tdefaultApprovalMode: ApprovalMode;\n\tdefaultProvider: string;\n\tdefaultModelId: string;\n\thostedRunner?: HostedRunnerContext;\n}\n\nexport interface HostedRunnerContext {\n\tenabled: true;\n\trunnerSessionId: string;\n\townerInstanceId?: string;\n\tworkspaceRoot: string;\n\tsnapshotRoot?: string;\n\trestoreManifestPath?: string;\n\tlistenHost?: string;\n\tlistenPort?: number;\n\tworkspaceId?: string;\n\tagentId?: string;\n\tagentRunId?: string;\n\tagentRuntimeLeaseToken?: string;\n\ta2aMessageId?: string;\n\ta2aTaskId?: string;\n\tlastPlatformA2APush?: {\n\t\tkind: \"statusUpdate\" | \"artifactUpdate\" | \"task\" | \"message\";\n\t\ttaskId?: string;\n\t\tcontextId?: string;\n\t\tworkspaceId?: string;\n\t\torganizationId?: string;\n\t\ttenantId?: string;\n\t\tstate?: string;\n\t\tfinal?: boolean;\n\t\treceivedAt: string;\n\t\truntimeEventId?: string;\n\t\truntimeEventType?: string;\n\t\ttraceparent?: string;\n\t\ttracestate?: string;\n\t\tagentId?: string;\n\t\tactorId?: string;\n\t};\n\tagentRuntimeWorkerQueue?: string;\n\tagentRuntimeCorrelationPath?: string;\n\tattachAudience?: string;\n\tconfiguredMaestroSessionId?: string;\n\tactiveMaestroSessionId?: string;\n\truntimeLease?: HostedRunnerLeaseSnapshot;\n\tdraining?: boolean;\n\tlastDrain?: {\n\t\tstatus: string;\n\t\tmanifestPath: string;\n\t\tdrainedAt: string;\n\t\treason?: string;\n\t\trequestedBy?: string;\n\t};\n}\n\nexport interface WebServerServices {\n\tcreateAgent: (\n\t\tmodel: RegisteredModel,\n\t\tthinking: ThinkingLevel,\n\t\tapproval: ApprovalMode,\n\t\toptions?: {\n\t\t\tcwd?: string;\n\t\t\tenableClientTools?: boolean;\n\t\t\tuseClientAskUser?: boolean;\n\t\t\tincludeVscodeTools?: boolean;\n\t\t\tincludeJetBrainsTools?: boolean;\n\t\t\tincludeConductorTools?: boolean;\n\t\t\tapprovalService?: ActionApprovalService;\n\t\t\tclientToolService?: ClientToolExecutionService;\n\t\t\ttoolRetryService?: ToolRetryService;\n\t\t\tplatformToolExecutionBridge?: PlatformToolExecutionBridge | false;\n\t\t},\n\t) => Promise<Agent>;\n\tcreateBackgroundAgent: (\n\t\tmodel: RegisteredModel,\n\t\toptions?: {\n\t\t\tcwd?: string;\n\t\t\tsystemPrompt?: string;\n\t\t},\n\t) => Promise<Agent>;\n\tgetRegisteredModel: (\n\t\tinput: string | null | undefined,\n\t) => Promise<RegisteredModel>;\n\tgetCurrentSelection: () => { provider: string; modelId: string };\n\tensureCredential: (provider: string) => Promise<AuthCredential>;\n\tsetModelSelection: (model: RegisteredModel) => void;\n\tacquireSse: () => symbol | null;\n\treleaseSse: (token: symbol | null) => void;\n\theadlessRuntimeService: HeadlessRuntimeService;\n}\n\nexport type WebServerContext = WebServerConfig & WebServerServices;\n"]}
|
|
1
|
+
{"version":3,"file":"app-context.js","sourceRoot":"","sources":["../../src/server/app-context.ts"],"names":[],"mappings":"","sourcesContent":["import type { IncomingMessage, ServerResponse } from \"node:http\";\nimport type {\n\tActionApprovalService,\n\tApprovalMode,\n} from \"../agent/action-approval.js\";\nimport type { Agent } from \"../agent/index.js\";\nimport type { ToolRetryService } from \"../agent/tool-retry.js\";\nimport type { ClientToolExecutionService } from \"../agent/transport.js\";\nimport type { PlatformToolExecutionBridge } from \"../agent/transport/tool-execution-bridge.js\";\nimport type { ThinkingLevel } from \"../agent/types.js\";\nimport type { RegisteredModel } from \"../models/registry.js\";\nimport type { AuthCredential } from \"../providers/auth.js\";\nimport type { HeadlessRuntimeService } from \"./headless-runtime-service.js\";\nimport type { HostedRunnerLeaseSnapshot } from \"./hosted-runner-lease.js\";\n\nexport interface WebServerConfig {\n\tcorsHeaders: Record<string, string>;\n\tstaticMaxAge: number;\n\tdefaultApprovalMode: ApprovalMode;\n\tdefaultProvider: string;\n\tdefaultModelId: string;\n\thostedRunner?: HostedRunnerContext;\n}\n\nexport interface HostedRunnerContext {\n\tenabled: true;\n\trunnerSessionId: string;\n\townerInstanceId?: string;\n\tworkspaceRoot: string;\n\tsnapshotRoot?: string;\n\trestoreManifestPath?: string;\n\tlistenHost?: string;\n\tlistenPort?: number;\n\tworkspaceId?: string;\n\tagentId?: string;\n\tagentRunId?: string;\n\tagentRuntimeLeaseToken?: string;\n\ta2aMessageId?: string;\n\ta2aTaskId?: string;\n\tlastPlatformA2APush?: {\n\t\tkind: \"statusUpdate\" | \"artifactUpdate\" | \"task\" | \"message\";\n\t\ttaskId?: string;\n\t\tmessageId?: string;\n\t\tmessageIds?: string[];\n\t\tcontextId?: string;\n\t\tworkspaceId?: string;\n\t\torganizationId?: string;\n\t\ttenantId?: string;\n\t\tstate?: string;\n\t\tfinal?: boolean;\n\t\treceivedAt: string;\n\t\truntimeEventId?: string;\n\t\truntimeEventType?: string;\n\t\ttraceparent?: string;\n\t\ttracestate?: string;\n\t\tagentId?: string;\n\t\tactorId?: string;\n\t};\n\tagentRuntimeWorkerQueue?: string;\n\tagentRuntimeCorrelationPath?: string;\n\tattachAudience?: string;\n\tconfiguredMaestroSessionId?: string;\n\tactiveMaestroSessionId?: string;\n\truntimeLease?: HostedRunnerLeaseSnapshot;\n\tdraining?: boolean;\n\tlastDrain?: {\n\t\tstatus: string;\n\t\tmanifestPath: string;\n\t\tdrainedAt: string;\n\t\treason?: string;\n\t\trequestedBy?: string;\n\t};\n}\n\nexport interface WebServerServices {\n\tcreateAgent: (\n\t\tmodel: RegisteredModel,\n\t\tthinking: ThinkingLevel,\n\t\tapproval: ApprovalMode,\n\t\toptions?: {\n\t\t\tcwd?: string;\n\t\t\tenableClientTools?: boolean;\n\t\t\tuseClientAskUser?: boolean;\n\t\t\tincludeVscodeTools?: boolean;\n\t\t\tincludeJetBrainsTools?: boolean;\n\t\t\tincludeConductorTools?: boolean;\n\t\t\tapprovalService?: ActionApprovalService;\n\t\t\tclientToolService?: ClientToolExecutionService;\n\t\t\ttoolRetryService?: ToolRetryService;\n\t\t\tplatformToolExecutionBridge?: PlatformToolExecutionBridge | false;\n\t\t},\n\t) => Promise<Agent>;\n\tcreateBackgroundAgent: (\n\t\tmodel: RegisteredModel,\n\t\toptions?: {\n\t\t\tcwd?: string;\n\t\t\tsystemPrompt?: string;\n\t\t},\n\t) => Promise<Agent>;\n\tgetRegisteredModel: (\n\t\tinput: string | null | undefined,\n\t) => Promise<RegisteredModel>;\n\tgetCurrentSelection: () => { provider: string; modelId: string };\n\tensureCredential: (provider: string) => Promise<AuthCredential>;\n\tsetModelSelection: (model: RegisteredModel) => void;\n\tacquireSse: () => symbol | null;\n\treleaseSse: (token: symbol | null) => void;\n\theadlessRuntimeService: HeadlessRuntimeService;\n}\n\nexport type WebServerContext = WebServerConfig & WebServerServices;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"headless-sessions.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/headless-sessions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAmBjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"headless-sessions.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/headless-sessions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAmBjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAgC1D,oBAAY,qBAAqB;IAChC,eAAe,sBAAsB;IACrC,qBAAqB,4BAA4B;CACjD;AAytBD,wBAAsB,2BAA2B,CAChD,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,gBAAgB,iBAgBzB;AAED,wBAAsB,8BAA8B,CACnD,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,gBAAgB,iBAazB;AAED,wBAAgB,0BAA0B,CACzC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,gBAAgB,EACzB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,QAI/B;AAED,wBAAsB,8BAA8B,CACnD,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,gBAAgB,EACzB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,iBA4D/B;AAED,wBAAsB,gCAAgC,CACrD,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,gBAAgB,EACzB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,iBAW/B;AAED,wBAAsB,8BAA8B,CACnD,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,gBAAgB,EACzB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,iBAiB/B;AAED,wBAAsB,+BAA+B,CACpD,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,gBAAgB,EACzB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,iBAqB/B;AAED,wBAAgB,2BAA2B,CAC1C,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,gBAAgB,EACzB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,QA2E/B;AAED,wBAAsB,4BAA4B,CACjD,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,gBAAgB,EACzB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,iBAuB/B"}
|
|
@@ -5,7 +5,7 @@ import { resolveExistingWorkspaceRoot } from "../../headless/workspace-root.js";
|
|
|
5
5
|
import { recordMaestroSessionRuntimeTrigger } from "../../platform/agent-runtime-client.js";
|
|
6
6
|
import { normalizeApprovalMode, resolveApprovalModeForRequest, } from "../approval-mode-store.js";
|
|
7
7
|
import { getAuthScopeKey, getAuthSubject } from "../authz.js";
|
|
8
|
-
import { loadHostedRunnerRestoreManifest } from "../headless-runtime-service.js";
|
|
8
|
+
import { HeadlessRuntimeNotReadyError, loadHostedRunnerRestoreManifest, } from "../headless-runtime-service.js";
|
|
9
9
|
import { bindHostedRunnerPlatformLease, claimHostedRunnerLease, evaluateHostedRunnerLeaseUse, } from "../hosted-runner-lease.js";
|
|
10
10
|
import { getTraceParentHeader } from "../request-context.js";
|
|
11
11
|
import { ApiError, getRequestHeader, readRequestBody, sendJson, } from "../server-utils.js";
|
|
@@ -262,6 +262,14 @@ function rethrowHeadlessMessageError(error) {
|
|
|
262
262
|
if (!(error instanceof Error)) {
|
|
263
263
|
throw error;
|
|
264
264
|
}
|
|
265
|
+
if (error instanceof HeadlessRuntimeNotReadyError) {
|
|
266
|
+
throw new ApiError(503, error.message, [
|
|
267
|
+
{
|
|
268
|
+
reason: HostedRunnerErrorType.RuntimeNotReady,
|
|
269
|
+
domain: HOSTED_RUNNER_ERROR_DOMAIN,
|
|
270
|
+
},
|
|
271
|
+
], HostedRunnerErrorType.RuntimeNotReady);
|
|
272
|
+
}
|
|
265
273
|
if (error.message === "Viewer headless connections cannot send messages") {
|
|
266
274
|
throw new ApiError(403, error.message);
|
|
267
275
|
}
|
|
@@ -282,6 +290,14 @@ function rethrowHeadlessConnectionLifecycleError(error) {
|
|
|
282
290
|
if (!(error instanceof Error)) {
|
|
283
291
|
throw error;
|
|
284
292
|
}
|
|
293
|
+
if (error instanceof HeadlessRuntimeNotReadyError) {
|
|
294
|
+
throw new ApiError(503, error.message, [
|
|
295
|
+
{
|
|
296
|
+
reason: HostedRunnerErrorType.RuntimeNotReady,
|
|
297
|
+
domain: HOSTED_RUNNER_ERROR_DOMAIN,
|
|
298
|
+
},
|
|
299
|
+
], HostedRunnerErrorType.RuntimeNotReady);
|
|
300
|
+
}
|
|
285
301
|
if (error.message === "Headless connection not found") {
|
|
286
302
|
throw new ApiError(404, error.message);
|
|
287
303
|
}
|
|
@@ -487,7 +503,16 @@ function getRuntime(req, context, sessionId) {
|
|
|
487
503
|
}
|
|
488
504
|
export async function handleHeadlessSessionCreate(req, res, context) {
|
|
489
505
|
const input = await parseAndValidateJson(req, HeadlessSessionCreateSchema);
|
|
490
|
-
|
|
506
|
+
let runtime;
|
|
507
|
+
try {
|
|
508
|
+
runtime = await ensureRuntime(req, context, input);
|
|
509
|
+
}
|
|
510
|
+
catch (error) {
|
|
511
|
+
if (error instanceof HeadlessRuntimeNotReadyError) {
|
|
512
|
+
rethrowHeadlessConnectionLifecycleError(error);
|
|
513
|
+
}
|
|
514
|
+
throw error;
|
|
515
|
+
}
|
|
491
516
|
sendJson(res, 200, runtime.getSnapshot(), context.corsHeaders, req);
|
|
492
517
|
}
|
|
493
518
|
export async function handleHeadlessConnectionCreate(req, res, context) {
|
|
@@ -532,6 +557,9 @@ export async function handleHeadlessSessionSubscribe(req, res, context, params)
|
|
|
532
557
|
}), context.corsHeaders, req);
|
|
533
558
|
}
|
|
534
559
|
catch (error) {
|
|
560
|
+
if (error instanceof HeadlessRuntimeNotReadyError) {
|
|
561
|
+
rethrowHeadlessConnectionLifecycleError(error);
|
|
562
|
+
}
|
|
535
563
|
if (error instanceof Error &&
|
|
536
564
|
error.message === "Controller lease is already held by another connection") {
|
|
537
565
|
throw new ApiError(409, error.message);
|
|
@@ -587,13 +615,19 @@ export function handleHeadlessSessionEvents(req, res, context, params) {
|
|
|
587
615
|
const cursorParam = url.searchParams.get("cursor");
|
|
588
616
|
const cursor = cursorParam ? Number.parseInt(cursorParam, 10) : null;
|
|
589
617
|
const subscriptionId = url.searchParams.get("subscriptionId") || getHeadlessSubscriberId(req);
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
618
|
+
let stream;
|
|
619
|
+
try {
|
|
620
|
+
stream = subscriptionId
|
|
621
|
+
? runtime.attachSubscription(subscriptionId)
|
|
622
|
+
: runtime.createImplicitStream({
|
|
623
|
+
cursor,
|
|
624
|
+
role: getHeadlessRole(req),
|
|
625
|
+
optOutNotifications: parseOptOutNotifications(req),
|
|
626
|
+
});
|
|
627
|
+
}
|
|
628
|
+
catch (error) {
|
|
629
|
+
rethrowHeadlessConnectionLifecycleError(error);
|
|
630
|
+
}
|
|
597
631
|
if (!stream) {
|
|
598
632
|
throw new ApiError(404, "Headless subscriber not found");
|
|
599
633
|
}
|
|
@@ -647,7 +681,7 @@ export async function handleHeadlessSessionMessage(req, res, context, params) {
|
|
|
647
681
|
const runtime = getRuntime(req, context, params?.id);
|
|
648
682
|
const input = await parseHeadlessMessage(req);
|
|
649
683
|
try {
|
|
650
|
-
runtime.assertCanSend(getHeadlessRole(req), getHeadlessSubscriberId(req), getHeadlessConnectionId(req));
|
|
684
|
+
runtime.assertCanSend(getHeadlessRole(req), getHeadlessSubscriberId(req), getHeadlessConnectionId(req), { allowNotReady: input.type === "shutdown" });
|
|
651
685
|
}
|
|
652
686
|
catch (error) {
|
|
653
687
|
rethrowHeadlessMessageError(error);
|