@evalops/maestro 0.10.45 → 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.
Files changed (101) hide show
  1. package/dist/agent/providers/openai-codex-session.js +1 -1
  2. package/dist/agent/providers/openai-codex-session.js.map +1 -1
  3. package/dist/app-server/in-process-client.d.ts +2 -2
  4. package/dist/app-server/in-process-client.js.map +1 -1
  5. package/dist/app-server/protocol-modes-api.js +1 -1
  6. package/dist/app-server/protocol-modes-api.js.map +1 -1
  7. package/dist/app-server/sandbox-check-api.d.ts +21 -0
  8. package/dist/app-server/{sandbox-proof-api.d.ts.map → sandbox-check-api.d.ts.map} +1 -1
  9. package/dist/app-server/{sandbox-proof-api.js → sandbox-check-api.js} +18 -18
  10. package/dist/app-server/{sandbox-proof-api.js.map → sandbox-check-api.js.map} +1 -1
  11. package/dist/app-server/session-api.d.ts +5 -5
  12. package/dist/app-server/session-api.js +18 -18
  13. package/dist/app-server/session-api.js.map +1 -1
  14. package/dist/audit/logger.d.ts +1 -1
  15. package/dist/cli/args.js +1 -1
  16. package/dist/cli/args.js.map +1 -1
  17. package/dist/cli/commands/codex.js +30 -3
  18. package/dist/cli/commands/codex.js.map +1 -1
  19. package/dist/cli-tui/auth-state.d.ts +7 -0
  20. package/dist/cli-tui/auth-state.d.ts.map +1 -0
  21. package/dist/cli-tui/auth-state.js +46 -0
  22. package/dist/cli-tui/auth-state.js.map +1 -0
  23. package/dist/cli-tui/commands/command-catalog.d.ts.map +1 -1
  24. package/dist/cli-tui/commands/command-catalog.js +6 -1
  25. package/dist/cli-tui/commands/command-catalog.js.map +1 -1
  26. package/dist/cli-tui/commands/command-suite-handlers.d.ts +2 -5
  27. package/dist/cli-tui/commands/command-suite-handlers.d.ts.map +1 -1
  28. package/dist/cli-tui/commands/command-suite-handlers.js.map +1 -1
  29. package/dist/cli-tui/commands/subcommands/auth-commands.d.ts +6 -5
  30. package/dist/cli-tui/commands/subcommands/auth-commands.d.ts.map +1 -1
  31. package/dist/cli-tui/commands/subcommands/auth-commands.js +2 -2
  32. package/dist/cli-tui/commands/subcommands/auth-commands.js.map +1 -1
  33. package/dist/cli-tui/oauth/oauth-flow-controller.d.ts.map +1 -1
  34. package/dist/cli-tui/oauth/oauth-flow-controller.js +24 -11
  35. package/dist/cli-tui/oauth/oauth-flow-controller.js.map +1 -1
  36. package/dist/cli-tui/selectors/oauth-selector-view.d.ts +1 -0
  37. package/dist/cli-tui/selectors/oauth-selector-view.d.ts.map +1 -1
  38. package/dist/cli-tui/selectors/oauth-selector-view.js +1 -1
  39. package/dist/cli-tui/selectors/oauth-selector-view.js.map +1 -1
  40. package/dist/cli-tui/selectors/oauth-selector.d.ts +2 -1
  41. package/dist/cli-tui/selectors/oauth-selector.d.ts.map +1 -1
  42. package/dist/cli-tui/selectors/oauth-selector.js +25 -2
  43. package/dist/cli-tui/selectors/oauth-selector.js.map +1 -1
  44. package/dist/cli-tui/tui-renderer/command-suite-wiring.d.ts +2 -5
  45. package/dist/cli-tui/tui-renderer/command-suite-wiring.d.ts.map +1 -1
  46. package/dist/cli-tui/tui-renderer/command-suite-wiring.js.map +1 -1
  47. package/dist/cli-tui/tui-renderer.d.ts +0 -4
  48. package/dist/cli-tui/tui-renderer.d.ts.map +1 -1
  49. package/dist/cli-tui/tui-renderer.js +3 -28
  50. package/dist/cli-tui/tui-renderer.js.map +1 -1
  51. package/dist/cli.js +896 -497
  52. package/dist/codex/app-server-client.d.ts +8 -2
  53. package/dist/codex/app-server-client.d.ts.map +1 -1
  54. package/dist/codex/app-server-client.js +18 -4
  55. package/dist/codex/app-server-client.js.map +1 -1
  56. package/dist/codex/auth.d.ts +4 -0
  57. package/dist/codex/auth.d.ts.map +1 -0
  58. package/dist/codex/auth.js +103 -0
  59. package/dist/codex/auth.js.map +1 -0
  60. package/dist/db/schema.d.ts +1 -1
  61. package/dist/evalops/agent-bootstrap.js +2 -2
  62. package/dist/evalops/agent-bootstrap.js.map +1 -1
  63. package/dist/main.d.ts.map +1 -1
  64. package/dist/main.js +5 -1
  65. package/dist/main.js.map +1 -1
  66. package/dist/models/config-loader.d.ts +5 -5
  67. package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.d.ts +19 -19
  68. package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.d.ts.map +1 -1
  69. package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.js +12 -13
  70. package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.js.map +1 -1
  71. package/dist/node_modules/@evalops/contracts/package.json +1 -1
  72. package/dist/node_modules/@evalops/tui/package.json +1 -1
  73. package/dist/oauth/index.d.ts +1 -0
  74. package/dist/oauth/index.d.ts.map +1 -1
  75. package/dist/oauth/index.js +42 -2
  76. package/dist/oauth/index.js.map +1 -1
  77. package/dist/server/app-context.d.ts +2 -0
  78. package/dist/server/app-context.d.ts.map +1 -1
  79. package/dist/server/app-context.js.map +1 -1
  80. package/dist/server/handlers/headless-sessions.d.ts.map +1 -1
  81. package/dist/server/handlers/headless-sessions.js +44 -10
  82. package/dist/server/handlers/headless-sessions.js.map +1 -1
  83. package/dist/server/handlers/hosted-runner-identity.d.ts +2 -0
  84. package/dist/server/handlers/hosted-runner-identity.d.ts.map +1 -1
  85. package/dist/server/handlers/hosted-runner-identity.js +2 -0
  86. package/dist/server/handlers/hosted-runner-identity.js.map +1 -1
  87. package/dist/server/handlers/platform-a2a-push.d.ts.map +1 -1
  88. package/dist/server/handlers/platform-a2a-push.js +113 -2
  89. package/dist/server/handlers/platform-a2a-push.js.map +1 -1
  90. package/dist/server/headless-in-process-host.d.ts.map +1 -1
  91. package/dist/server/headless-in-process-host.js +1 -1
  92. package/dist/server/headless-in-process-host.js.map +1 -1
  93. package/dist/server/headless-runtime-service.d.ts +9 -2
  94. package/dist/server/headless-runtime-service.d.ts.map +1 -1
  95. package/dist/server/headless-runtime-service.js +54 -15
  96. package/dist/server/headless-runtime-service.js.map +1 -1
  97. package/dist/tools/background/task-runtime.js +1 -1
  98. package/dist/tools/background/task-runtime.js.map +1 -1
  99. package/dist/version.json +2 -2
  100. package/package.json +1 -1
  101. package/dist/app-server/sandbox-proof-api.d.ts +0 -21
@@ -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
- await loginOpenAICodex(options.onAuthUrl, options.onPromptCode, options.onStatus);
113
- shouldSyncConnectorConnection = true;
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
@@ -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":"AACA,OAAO,KAAK,EACX,qBAAqB,EACrB,YAAY,EACZ,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AACxE,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,6CAA6C,CAAC;AAC/F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAE1E,MAAM,WAAW,eAAe;IAC/B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,YAAY,CAAC;IAClC,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,mBAAmB,CAAC;CACnC;AAED,MAAM,WAAW,mBAAmB;IACnC,OAAO,EAAE,IAAI,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB,CAAC,EAAE;QACrB,IAAI,EAAE,cAAc,GAAG,gBAAgB,GAAG,MAAM,GAAG,SAAS,CAAC;QAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;QACtB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,YAAY,CAAC,EAAE,yBAAyB,CAAC;IACzC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE;QACX,MAAM,EAAE,MAAM,CAAC;QACf,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACF;AAED,MAAM,WAAW,iBAAiB;IACjC,WAAW,EAAE,CACZ,KAAK,EAAE,eAAe,EACtB,QAAQ,EAAE,aAAa,EACvB,QAAQ,EAAE,YAAY,EACtB,OAAO,CAAC,EAAE;QACT,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAC5B,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAC3B,kBAAkB,CAAC,EAAE,OAAO,CAAC;QAC7B,qBAAqB,CAAC,EAAE,OAAO,CAAC;QAChC,qBAAqB,CAAC,EAAE,OAAO,CAAC;QAChC,eAAe,CAAC,EAAE,qBAAqB,CAAC;QACxC,iBAAiB,CAAC,EAAE,0BAA0B,CAAC;QAC/C,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;QACpC,2BAA2B,CAAC,EAAE,2BAA2B,GAAG,KAAK,CAAC;KAClE,KACG,OAAO,CAAC,KAAK,CAAC,CAAC;IACpB,qBAAqB,EAAE,CACtB,KAAK,EAAE,eAAe,EACtB,OAAO,CAAC,EAAE;QACT,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,YAAY,CAAC,EAAE,MAAM,CAAC;KACtB,KACG,OAAO,CAAC,KAAK,CAAC,CAAC;IACpB,kBAAkB,EAAE,CACnB,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,KAC5B,OAAO,CAAC,eAAe,CAAC,CAAC;IAC9B,mBAAmB,EAAE,MAAM;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACjE,gBAAgB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IAChE,iBAAiB,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IACpD,UAAU,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IAChC,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC3C,sBAAsB,EAAE,sBAAsB,CAAC;CAC/C;AAED,MAAM,MAAM,gBAAgB,GAAG,eAAe,GAAG,iBAAiB,CAAC"}
@@ -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;AA4B1D,oBAAY,qBAAqB;IAChC,eAAe,sBAAsB;IACrC,qBAAqB,4BAA4B;CACjD;AA+rBD,wBAAsB,2BAA2B,CAChD,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,gBAAgB,iBAQzB;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,iBAyD/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,QAsE/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,iBAsB/B"}
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
- const runtime = await ensureRuntime(req, context, input);
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
- const stream = subscriptionId
591
- ? runtime.attachSubscription(subscriptionId)
592
- : runtime.createImplicitStream({
593
- cursor,
594
- role: getHeadlessRole(req),
595
- optOutNotifications: parseOptOutNotifications(req),
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);