@imgly/codesign-mcp 0.5.0 → 0.5.1

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/README.md CHANGED
@@ -257,8 +257,6 @@ These are a development surface:
257
257
  | `IMGLY_DIAGNOSTICS_TOOL` | on \| off — the diagnostics tool (default: on). |
258
258
  | `IMGLY_DIAGNOSTICS_DIR` | where diagnostics logs are written (default: the platform state dir). |
259
259
  | `IMGLY_GATEWAY_BASE_URL` | AI gateway endpoint (default: IMG.LY hosted). |
260
- | `IMGLY_AUTH_ISSUER` | override the built-in sign-in endpoints — set both together, or neither. |
261
- | `IMGLY_AUTH_CLIENT_ID` | see IMGLY_AUTH_ISSUER. |
262
260
  | `IMGLY_DEFAULT_ASSETS_BASE_URL` | manifest root for the default asset sources (default: IMG.LY CDN). |
263
261
  | `IMGLY_DEMO_ASSETS_BASE_URL` | manifest root for the demo asset sources (default: IMG.LY CDN). |
264
262
  | `IMGLY_GFONTS_CONTENT_URL` | Google Fonts catalogue, `<root>/ly.img.gfonts/content.json`; its aliases load from `<root>/ly.img.gfonts-fallbacks/` (default: IMG.LY CDN). |
@@ -1,17 +1,16 @@
1
- import type { Env } from '../config.js';
2
1
  export interface ClerkConfig {
3
2
  issuer: string;
4
3
  clientId: string;
5
4
  }
6
5
  /** `openid` is NOT in the dashboard-default app allowlist; offline_access is. */
7
6
  export declare const AUTH_SCOPE = "profile email offline_access";
8
- export declare function pickAuthConfig(envIssuer: string | undefined, envClientId: string | undefined, bakedIssuer: string, bakedClientId: string): ClerkConfig | undefined;
9
- export declare function resolveAuthConfig(env: Env): ClerkConfig | undefined;
7
+ export declare const AUTH_CONFIG: ClerkConfig;
10
8
  export declare function createPkcePair(): {
11
9
  verifier: string;
12
10
  challenge: string;
13
11
  };
14
12
  export declare function randomState(): string;
13
+ export declare const CONNECT_AUTHORIZE_URL = "https://img.ly/auth/connect";
15
14
  export declare function buildAuthorizeUrl(cfg: ClerkConfig, opts: {
16
15
  redirectUri: string;
17
16
  state: string;
@@ -1 +1 @@
1
- {"version":3,"file":"clerk-client.d.ts","sourceRoot":"","sources":["../../src/auth/clerk-client.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAMxC,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,iFAAiF;AACjF,eAAO,MAAM,UAAU,iCAAiC,CAAC;AASzD,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,GACpB,WAAW,GAAG,SAAS,CAKzB;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,GAAG,GAAG,WAAW,GAAG,SAAS,CAOnE;AAID,wBAAgB,cAAc,IAAI;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAIxE;AAED,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE;IACJ,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,GACA,MAAM,CAYR;AAED,qBAAa,cAAe,SAAQ,KAAK;aAErB,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM,EAC5B,OAAO,EAAE,MAAM;CAKlB;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA0CD,wBAAgB,YAAY,CAC1B,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAC5D,OAAO,CAAC,aAAa,CAAC,CAOxB;AAED,wBAAgB,aAAa,CAC3B,GAAG,EAAE,WAAW,EAChB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,aAAa,CAAC,CAKxB;AAED,gFAAgF;AAChF,wBAAsB,WAAW,CAC/B,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAUf;AAED,wBAAsB,aAAa,CACjC,GAAG,EAAE,WAAW,EAChB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAuB1C"}
1
+ {"version":3,"file":"clerk-client.d.ts","sourceRoot":"","sources":["../../src/auth/clerk-client.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,iFAAiF;AACjF,eAAO,MAAM,UAAU,iCAAiC,CAAC;AAOzD,eAAO,MAAM,WAAW,EAAE,WAGzB,CAAC;AAIF,wBAAgB,cAAc,IAAI;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAIxE;AAED,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAID,eAAO,MAAM,qBAAqB,gCAAgC,CAAC;AAEnE,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE;IACJ,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,GACA,MAAM,CAYR;AAED,qBAAa,cAAe,SAAQ,KAAK;aAErB,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM,EAC5B,OAAO,EAAE,MAAM;CAKlB;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA0CD,wBAAgB,YAAY,CAC1B,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAC5D,OAAO,CAAC,aAAa,CAAC,CAOxB;AAED,wBAAgB,aAAa,CAC3B,GAAG,EAAE,WAAW,EAChB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,aAAa,CAAC,CAKxB;AAED,gFAAgF;AAChF,wBAAsB,WAAW,CAC/B,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAUf;AAED,wBAAsB,aAAa,CACjC,GAAG,EAAE,WAAW,EAChB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAuB1C"}
@@ -6,25 +6,16 @@
6
6
  // refresh tokens ROTATE with strict reuse invalidation; /oauth/token/revoke
7
7
  // accepts public-client calls.
8
8
  import { createHash, randomBytes } from 'node:crypto';
9
- import { BAKED_AUTH_CLIENT_ID, BAKED_AUTH_ISSUER } from './auth-config.generated.js';
10
9
  /** `openid` is NOT in the dashboard-default app allowlist; offline_access is. */
11
10
  export const AUTH_SCOPE = 'profile email offline_access';
12
11
  /** Fallback token lifetime when the token endpoint omits `expires_in`. */
13
12
  const DEFAULT_EXPIRES_IN_S = 86_400;
14
- // Env overrides the baked default; the baked default (from
15
- // scripts/generate-auth-config.mjs) is what ships in published builds. Both
16
- // empty ⇒ undefined ⇒ login stays env-gated dark. Kept as a pure helper so the
17
- // env-vs-baked precedence is unit-testable without the generated module.
18
- export function pickAuthConfig(envIssuer, envClientId, bakedIssuer, bakedClientId) {
19
- const issuer = (envIssuer?.trim() || bakedIssuer).replace(/\/+$/, '');
20
- const clientId = envClientId?.trim() || bakedClientId;
21
- if (!issuer || !clientId)
22
- return undefined;
23
- return { issuer, clientId };
24
- }
25
- export function resolveAuthConfig(env) {
26
- return pickAuthConfig(env.IMGLY_AUTH_ISSUER, env.IMGLY_AUTH_CLIENT_ID, BAKED_AUTH_ISSUER, BAKED_AUTH_CLIENT_ID);
27
- }
13
+ // The production Clerk app, fixed in code: an override would let whoever sets it
14
+ // send the sign-in to another server. Both values are public.
15
+ export const AUTH_CONFIG = {
16
+ issuer: 'https://clerk.img.ly',
17
+ clientId: 'zOC6DtNv8Zv6207q'
18
+ };
28
19
  const b64url = (buf) => buf.toString('base64url');
29
20
  export function createPkcePair() {
30
21
  const verifier = b64url(randomBytes(32));
@@ -34,8 +25,11 @@ export function createPkcePair() {
34
25
  export function randomState() {
35
26
  return b64url(randomBytes(16));
36
27
  }
28
+ // Shows the CoDesign-branded sign-in/sign-up to a signed-out user, then forwards
29
+ // the query untouched to the issuer's /oauth/authorize.
30
+ export const CONNECT_AUTHORIZE_URL = 'https://img.ly/auth/connect';
37
31
  export function buildAuthorizeUrl(cfg, opts) {
38
- const url = new URL(`${cfg.issuer}/oauth/authorize`);
32
+ const url = new URL(CONNECT_AUTHORIZE_URL);
39
33
  url.searchParams.set('client_id', cfg.clientId);
40
34
  url.searchParams.set('response_type', 'code');
41
35
  url.searchParams.set('redirect_uri', opts.redirectUri);
@@ -1 +1 @@
1
- {"version":3,"file":"clerk-client.js","sourceRoot":"","sources":["../../src/auth/clerk-client.ts"],"names":[],"mappings":"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","sourcesContent":["//\n// OAuth client for Clerk (IMG.LY SSO) as a PUBLIC client: PKCE S256, no\n// client secret anywhere. Endpoint shapes and behaviors verified against a\n// live dev instance 2026-07-17 (specs/2026-07-15-local-mcp-clerk-login-\n// research.md): portless loopback registration matches any runtime port;\n// refresh tokens ROTATE with strict reuse invalidation; /oauth/token/revoke\n// accepts public-client calls.\nimport { createHash, randomBytes } from 'node:crypto';\nimport type { Env } from '../config.js';\nimport {\n BAKED_AUTH_CLIENT_ID,\n BAKED_AUTH_ISSUER\n} from './auth-config.generated.js';\n\nexport interface ClerkConfig {\n issuer: string;\n clientId: string;\n}\n\n/** `openid` is NOT in the dashboard-default app allowlist; offline_access is. */\nexport const AUTH_SCOPE = 'profile email offline_access';\n\n/** Fallback token lifetime when the token endpoint omits `expires_in`. */\nconst DEFAULT_EXPIRES_IN_S = 86_400;\n\n// Env overrides the baked default; the baked default (from\n// scripts/generate-auth-config.mjs) is what ships in published builds. Both\n// empty ⇒ undefined ⇒ login stays env-gated dark. Kept as a pure helper so the\n// env-vs-baked precedence is unit-testable without the generated module.\nexport function pickAuthConfig(\n envIssuer: string | undefined,\n envClientId: string | undefined,\n bakedIssuer: string,\n bakedClientId: string\n): ClerkConfig | undefined {\n const issuer = (envIssuer?.trim() || bakedIssuer).replace(/\\/+$/, '');\n const clientId = envClientId?.trim() || bakedClientId;\n if (!issuer || !clientId) return undefined;\n return { issuer, clientId };\n}\n\nexport function resolveAuthConfig(env: Env): ClerkConfig | undefined {\n return pickAuthConfig(\n env.IMGLY_AUTH_ISSUER,\n env.IMGLY_AUTH_CLIENT_ID,\n BAKED_AUTH_ISSUER,\n BAKED_AUTH_CLIENT_ID\n );\n}\n\nconst b64url = (buf: Buffer): string => buf.toString('base64url');\n\nexport function createPkcePair(): { verifier: string; challenge: string } {\n const verifier = b64url(randomBytes(32));\n const challenge = b64url(createHash('sha256').update(verifier).digest());\n return { verifier, challenge };\n}\n\nexport function randomState(): string {\n return b64url(randomBytes(16));\n}\n\nexport function buildAuthorizeUrl(\n cfg: ClerkConfig,\n opts: {\n redirectUri: string;\n state: string;\n challenge: string;\n switchAccount?: boolean;\n }\n): string {\n const url = new URL(`${cfg.issuer}/oauth/authorize`);\n url.searchParams.set('client_id', cfg.clientId);\n url.searchParams.set('response_type', 'code');\n url.searchParams.set('redirect_uri', opts.redirectUri);\n url.searchParams.set('scope', AUTH_SCOPE);\n url.searchParams.set('state', opts.state);\n url.searchParams.set('code_challenge', opts.challenge);\n url.searchParams.set('code_challenge_method', 'S256');\n // Empirically honored: forces a fresh sign-in past an active SSO session.\n if (opts.switchAccount) url.searchParams.set('prompt', 'login');\n return url.toString();\n}\n\nexport class ClerkAuthError extends Error {\n constructor(\n public readonly code: string,\n message: string\n ) {\n super(message);\n this.name = 'ClerkAuthError';\n }\n}\n\nexport interface TokenResponse {\n accessToken: string;\n refreshToken?: string;\n expiresIn: number;\n scope?: string;\n}\n\nasync function tokenPost(\n cfg: ClerkConfig,\n params: Record<string, string>\n): Promise<TokenResponse> {\n let resp: Response;\n try {\n resp = await fetch(`${cfg.issuer}/oauth/token`, {\n method: 'POST',\n headers: { 'content-type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({ ...params, client_id: cfg.clientId })\n });\n } catch (err) {\n throw new ClerkAuthError(\n 'network',\n `token endpoint unreachable: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n const body = (await resp.json().catch(() => ({}))) as {\n access_token?: string;\n refresh_token?: string;\n expires_in?: number;\n scope?: string;\n error?: string;\n error_description?: string;\n };\n if (!resp.ok || !body.access_token) {\n throw new ClerkAuthError(\n body.error ?? `http_${resp.status}`,\n body.error_description ?? `token endpoint returned ${resp.status}`\n );\n }\n const out: TokenResponse = {\n accessToken: body.access_token,\n expiresIn: body.expires_in ?? DEFAULT_EXPIRES_IN_S\n };\n if (body.refresh_token) out.refreshToken = body.refresh_token;\n if (body.scope) out.scope = body.scope;\n return out;\n}\n\nexport function exchangeCode(\n cfg: ClerkConfig,\n opts: { code: string; redirectUri: string; verifier: string }\n): Promise<TokenResponse> {\n return tokenPost(cfg, {\n grant_type: 'authorization_code',\n code: opts.code,\n redirect_uri: opts.redirectUri,\n code_verifier: opts.verifier\n });\n}\n\nexport function refreshTokens(\n cfg: ClerkConfig,\n refreshToken: string\n): Promise<TokenResponse> {\n return tokenPost(cfg, {\n grant_type: 'refresh_token',\n refresh_token: refreshToken\n });\n}\n\n/** Best-effort server-side revocation (works for public clients — verified). */\nexport async function revokeToken(\n cfg: ClerkConfig,\n token: string\n): Promise<void> {\n await fetch(`${cfg.issuer}/oauth/token/revoke`, {\n method: 'POST',\n headers: { 'content-type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({\n token,\n token_type_hint: 'refresh_token',\n client_id: cfg.clientId\n })\n }).catch(() => undefined);\n}\n\nexport async function fetchUserinfo(\n cfg: ClerkConfig,\n accessToken: string\n): Promise<{ sub: string; email?: string }> {\n let resp: Response;\n try {\n resp = await fetch(`${cfg.issuer}/oauth/userinfo`, {\n headers: { authorization: `Bearer ${accessToken}` }\n });\n } catch (err) {\n throw new ClerkAuthError(\n 'network',\n `userinfo endpoint unreachable: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n if (!resp.ok)\n throw new ClerkAuthError(`http_${resp.status}`, 'userinfo failed');\n const body = (await resp.json().catch(() => ({}))) as {\n sub?: string;\n email?: string;\n };\n if (!body.sub)\n throw new ClerkAuthError('bad_userinfo', 'userinfo missing sub');\n const out: { sub: string; email?: string } = { sub: body.sub };\n if (body.email) out.email = body.email;\n return out;\n}\n"]}
1
+ {"version":3,"file":"clerk-client.js","sourceRoot":"","sources":["../../src/auth/clerk-client.ts"],"names":[],"mappings":"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","sourcesContent":["//\n// OAuth client for Clerk (IMG.LY SSO) as a PUBLIC client: PKCE S256, no\n// client secret anywhere. Endpoint shapes and behaviors verified against a\n// live dev instance 2026-07-17 (specs/2026-07-15-local-mcp-clerk-login-\n// research.md): portless loopback registration matches any runtime port;\n// refresh tokens ROTATE with strict reuse invalidation; /oauth/token/revoke\n// accepts public-client calls.\nimport { createHash, randomBytes } from 'node:crypto';\n\nexport interface ClerkConfig {\n issuer: string;\n clientId: string;\n}\n\n/** `openid` is NOT in the dashboard-default app allowlist; offline_access is. */\nexport const AUTH_SCOPE = 'profile email offline_access';\n\n/** Fallback token lifetime when the token endpoint omits `expires_in`. */\nconst DEFAULT_EXPIRES_IN_S = 86_400;\n\n// The production Clerk app, fixed in code: an override would let whoever sets it\n// send the sign-in to another server. Both values are public.\nexport const AUTH_CONFIG: ClerkConfig = {\n issuer: 'https://clerk.img.ly',\n clientId: 'zOC6DtNv8Zv6207q'\n};\n\nconst b64url = (buf: Buffer): string => buf.toString('base64url');\n\nexport function createPkcePair(): { verifier: string; challenge: string } {\n const verifier = b64url(randomBytes(32));\n const challenge = b64url(createHash('sha256').update(verifier).digest());\n return { verifier, challenge };\n}\n\nexport function randomState(): string {\n return b64url(randomBytes(16));\n}\n\n// Shows the CoDesign-branded sign-in/sign-up to a signed-out user, then forwards\n// the query untouched to the issuer's /oauth/authorize.\nexport const CONNECT_AUTHORIZE_URL = 'https://img.ly/auth/connect';\n\nexport function buildAuthorizeUrl(\n cfg: ClerkConfig,\n opts: {\n redirectUri: string;\n state: string;\n challenge: string;\n switchAccount?: boolean;\n }\n): string {\n const url = new URL(CONNECT_AUTHORIZE_URL);\n url.searchParams.set('client_id', cfg.clientId);\n url.searchParams.set('response_type', 'code');\n url.searchParams.set('redirect_uri', opts.redirectUri);\n url.searchParams.set('scope', AUTH_SCOPE);\n url.searchParams.set('state', opts.state);\n url.searchParams.set('code_challenge', opts.challenge);\n url.searchParams.set('code_challenge_method', 'S256');\n // Empirically honored: forces a fresh sign-in past an active SSO session.\n if (opts.switchAccount) url.searchParams.set('prompt', 'login');\n return url.toString();\n}\n\nexport class ClerkAuthError extends Error {\n constructor(\n public readonly code: string,\n message: string\n ) {\n super(message);\n this.name = 'ClerkAuthError';\n }\n}\n\nexport interface TokenResponse {\n accessToken: string;\n refreshToken?: string;\n expiresIn: number;\n scope?: string;\n}\n\nasync function tokenPost(\n cfg: ClerkConfig,\n params: Record<string, string>\n): Promise<TokenResponse> {\n let resp: Response;\n try {\n resp = await fetch(`${cfg.issuer}/oauth/token`, {\n method: 'POST',\n headers: { 'content-type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({ ...params, client_id: cfg.clientId })\n });\n } catch (err) {\n throw new ClerkAuthError(\n 'network',\n `token endpoint unreachable: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n const body = (await resp.json().catch(() => ({}))) as {\n access_token?: string;\n refresh_token?: string;\n expires_in?: number;\n scope?: string;\n error?: string;\n error_description?: string;\n };\n if (!resp.ok || !body.access_token) {\n throw new ClerkAuthError(\n body.error ?? `http_${resp.status}`,\n body.error_description ?? `token endpoint returned ${resp.status}`\n );\n }\n const out: TokenResponse = {\n accessToken: body.access_token,\n expiresIn: body.expires_in ?? DEFAULT_EXPIRES_IN_S\n };\n if (body.refresh_token) out.refreshToken = body.refresh_token;\n if (body.scope) out.scope = body.scope;\n return out;\n}\n\nexport function exchangeCode(\n cfg: ClerkConfig,\n opts: { code: string; redirectUri: string; verifier: string }\n): Promise<TokenResponse> {\n return tokenPost(cfg, {\n grant_type: 'authorization_code',\n code: opts.code,\n redirect_uri: opts.redirectUri,\n code_verifier: opts.verifier\n });\n}\n\nexport function refreshTokens(\n cfg: ClerkConfig,\n refreshToken: string\n): Promise<TokenResponse> {\n return tokenPost(cfg, {\n grant_type: 'refresh_token',\n refresh_token: refreshToken\n });\n}\n\n/** Best-effort server-side revocation (works for public clients — verified). */\nexport async function revokeToken(\n cfg: ClerkConfig,\n token: string\n): Promise<void> {\n await fetch(`${cfg.issuer}/oauth/token/revoke`, {\n method: 'POST',\n headers: { 'content-type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({\n token,\n token_type_hint: 'refresh_token',\n client_id: cfg.clientId\n })\n }).catch(() => undefined);\n}\n\nexport async function fetchUserinfo(\n cfg: ClerkConfig,\n accessToken: string\n): Promise<{ sub: string; email?: string }> {\n let resp: Response;\n try {\n resp = await fetch(`${cfg.issuer}/oauth/userinfo`, {\n headers: { authorization: `Bearer ${accessToken}` }\n });\n } catch (err) {\n throw new ClerkAuthError(\n 'network',\n `userinfo endpoint unreachable: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n if (!resp.ok)\n throw new ClerkAuthError(`http_${resp.status}`, 'userinfo failed');\n const body = (await resp.json().catch(() => ({}))) as {\n sub?: string;\n email?: string;\n };\n if (!body.sub)\n throw new ClerkAuthError('bad_userinfo', 'userinfo missing sub');\n const out: { sub: string; email?: string } = { sub: body.sub };\n if (body.email) out.email = body.email;\n return out;\n}\n"]}
@@ -1,2 +1,2 @@
1
- export declare const IMGLY_CESDK_LICENSE = "NPmIsBpNj7WduCjPMV-6yX5-yd99f3zjiONo_YYqN8uFRUmwICE6-gCB-PMs44Bk";
1
+ export declare const IMGLY_CESDK_LICENSE = "juKW7zC0g7EZJUFvFDTKWOdA71XxMTCD5uUKuFoANwqbOJoEMjJ2itJON14OyyyJ";
2
2
  //# sourceMappingURL=license.generated.d.ts.map
@@ -1,4 +1,4 @@
1
1
  // AUTO-GENERATED by scripts/generate-license.mjs — do not edit.
2
2
  // Empty unless IMGLY_CESDK_LICENSE was set at build/publish time.
3
- export const IMGLY_CESDK_LICENSE = "NPmIsBpNj7WduCjPMV-6yX5-yd99f3zjiONo_YYqN8uFRUmwICE6-gCB-PMs44Bk";
3
+ export const IMGLY_CESDK_LICENSE = "juKW7zC0g7EZJUFvFDTKWOdA71XxMTCD5uUKuFoANwqbOJoEMjJ2itJON14OyyyJ";
4
4
  //# sourceMappingURL=license.generated.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"license.generated.js","sourceRoot":"","sources":["../../src/cli/license.generated.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,kEAAkE;AAClE,MAAM,CAAC,MAAM,mBAAmB,GAAG,kEAAkE,CAAC","sourcesContent":["// AUTO-GENERATED by scripts/generate-license.mjs — do not edit.\n// Empty unless IMGLY_CESDK_LICENSE was set at build/publish time.\nexport const IMGLY_CESDK_LICENSE = \"NPmIsBpNj7WduCjPMV-6yX5-yd99f3zjiONo_YYqN8uFRUmwICE6-gCB-PMs44Bk\";\n"]}
1
+ {"version":3,"file":"license.generated.js","sourceRoot":"","sources":["../../src/cli/license.generated.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,kEAAkE;AAClE,MAAM,CAAC,MAAM,mBAAmB,GAAG,kEAAkE,CAAC","sourcesContent":["// AUTO-GENERATED by scripts/generate-license.mjs — do not edit.\n// Empty unless IMGLY_CESDK_LICENSE was set at build/publish time.\nexport const IMGLY_CESDK_LICENSE = \"juKW7zC0g7EZJUFvFDTKWOdA71XxMTCD5uUKuFoANwqbOJoEMjJ2itJON14OyyyJ\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../../src/cli/stdio.ts"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAgBxC,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,0BAA0B,CAAC;AAMlC,OAAO,EAEL,kBAAkB,EAClB,KAAK,yBAAyB,EAC/B,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,aAAa,EAGd,MAAM,gCAAgC,CAAC;AAGxC,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,iCAAiC,CAAC;AAgBzC,OAAO,EAIL,KAAK,aAAa,EACnB,MAAM,8BAA8B,CAAC;AA0CtC,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,GAAG,EACR,IAAI,EAAE;IACJ,SAAS,EAAE,OAAO,GAAG,MAAM,CAAC;IAC5B;;;;OAIG;IACH,SAAS,EACL,KAAK,GACL;QACE,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;QAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACN;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,IAAI,CACtB,yBAAyB,EACzB,kBAAkB,GAAG,kBAAkB,CACxC,CAAC;IACF,+EAA+E;IAC/E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,aAAa,CAAC;CAC/B,GACA;IACD,IAAI,EAAE,eAAe,CAAC;IACtB,SAAS,EAAE,aAAa,CAAC;IACzB,cAAc,EAAE,kBAAkB,GAAG,SAAS,CAAC;IAC/C,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;CAClB,CAuDA;AAED,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAslB9C"}
1
+ {"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../../src/cli/stdio.ts"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAgBxC,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,0BAA0B,CAAC;AAMlC,OAAO,EAEL,kBAAkB,EAClB,KAAK,yBAAyB,EAC/B,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,aAAa,EAGd,MAAM,gCAAgC,CAAC;AAGxC,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,iCAAiC,CAAC;AAgBzC,OAAO,EAIL,KAAK,aAAa,EACnB,MAAM,8BAA8B,CAAC;AA0CtC,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,GAAG,EACR,IAAI,EAAE;IACJ,SAAS,EAAE,OAAO,GAAG,MAAM,CAAC;IAC5B;;;;OAIG;IACH,SAAS,EACL,KAAK,GACL;QACE,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;QAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACN;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,IAAI,CACtB,yBAAyB,EACzB,kBAAkB,GAAG,kBAAkB,CACxC,CAAC;IACF,+EAA+E;IAC/E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,aAAa,CAAC;CAC/B,GACA;IACD,IAAI,EAAE,eAAe,CAAC;IACtB,SAAS,EAAE,aAAa,CAAC;IACzB,cAAc,EAAE,kBAAkB,GAAG,SAAS,CAAC;IAC/C,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;CAClB,CAuDA;AAED,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAqlB9C"}
package/dist/cli/stdio.js CHANGED
@@ -67,7 +67,7 @@ import { IMGLY_CESDK_LICENSE } from './license.generated.js';
67
67
  import { pinOpenSourceCodecs } from './codec-pack.js';
68
68
  import { createAiTokenResolver } from '../auth/ai-token.js';
69
69
  import { attemptRedemption, promoSuccessLine } from '../auth/auto-redeem.js';
70
- import { resolveAuthConfig } from '../auth/clerk-client.js';
70
+ import { AUTH_CONFIG } from '../auth/clerk-client.js';
71
71
  import { LoginManager } from '../auth/login-manager.js';
72
72
  import { defaultAuthFile, readAuth } from '../auth/token-store.js';
73
73
  import { createLoginTool, createLogoutTool } from '../tools/login.js';
@@ -359,13 +359,12 @@ export async function runStdio() {
359
359
  // A new process is a new conversation with its own draft; it resumes a design only by `open`.
360
360
  const localSession = localSessionId();
361
361
  await forgetDeadSessions(sessionStore).catch(() => undefined);
362
- // IMG.LY SSO login (POC, identity-only): enabled only when both
363
- // IMGLY_AUTH_ISSUER and IMGLY_AUTH_CLIENT_ID are set. The callback route
364
- // rides the existing loopback listener.
362
+ // IMG.LY SSO login (identity-only). The callback route rides the existing
363
+ // loopback listener.
365
364
  //
366
365
  // Computed ahead of the viewer router (below) — /api/ai-token needs the
367
366
  // same gatewayKey/loginManager precedence as the gateway client just below.
368
- const authConfig = resolveAuthConfig(process.env);
367
+ const authConfig = AUTH_CONFIG;
369
368
  const loginManager = authConfig
370
369
  ? new LoginManager({ config: authConfig, authFile: defaultAuthFile() })
371
370
  : undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../src/cli/stdio.ts"],"names":[],"mappings":"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","sourcesContent":["// MCP server over stdin/stdout. Bootstraps:\n// - Workspace (NodeWorkspaceFS rooted at $CODESIGN_WORKSPACE or ~/.codesign/workspace)\n// - the design session (openLocalDesign) over one lazily booted CE.SDK engine\n// - SseBroadcaster for the viewer\n// - Viewer router + ephemeral localhost listener\n// - design + workspace tool registrations\n// - LocalGatewayClient (IMGLY_GATEWAY_API_KEY or the Clerk session)\n//\n// One engine, one workspace, one MCP session.\n//\n// Startup order matters: everything cheap (workspace, store, viewer listener,\n// tool wiring) runs before `server.connect()` so the MCP handshake replies\n// immediately. The expensive CE.SDK engine init + CDN asset-source fetch are\n// deferred to a background promise (bootstrapEngine) that the first tool call\n// awaits. Doing this work before connect can blow the host's MCP startup\n// timeout on a cold boot — seen as \"fails on add/update, works after Reconnect\".\n//\n// Optional env:\n// CESDK_LICENSE — overrides the build-time-bundled license. Mandatory\n// when no license is baked in (see resolve-license.ts).\n//\n// Logging note: stdout is reserved for MCP protocol traffic. Everything\n// human-facing (errors, progress) goes to stderr.\nimport { randomUUID } from 'node:crypto';\nimport { homedir } from 'node:os';\nimport { fileURLToPath } from 'node:url';\nimport { join as joinPath, resolve as resolvePath } from 'node:path';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport type CreativeEngine from '@cesdk/engine';\nimport { loadNodeAssets } from '../assets/load-node.js';\nimport type { Env } from '../config.js';\nimport {\n errorReportingEnabled,\n placeholderNotices,\n sentryDsn,\n usageTelemetryEnabled,\n viewerDisabled\n} from '../flags/index.js';\nimport {\n diagnosticsFileEnabled,\n diagnosticsToolEnabled,\n resolveDiagnosticsDir,\n resolveEngineIdleTimeoutMs,\n resolveMaxEngines,\n resolveSecret\n} from '../config.js';\nimport {\n NOOP_DIAGNOSTICS_SINK,\n type DiagnosticsSink\n} from '../diagnostics/events.js';\nimport { composeSinks } from '../diagnostics/compose.js';\nimport { FileDiagnosticsSink } from '../diagnostics/file-sink.js';\nimport { createDiagnosticsRouter } from '../diagnostics/router.js';\nimport { toolCallSink } from '../diagnostics/tool-call-adapter.js';\nimport { createDiagnosticsTool } from '../diagnostics/tool.js';\nimport {\n combineSinks,\n UsageTelemetrySink,\n type UsageTelemetrySinkOptions\n} from '../telemetry/usage-sink.js';\nimport { TelemetrySpool } from '../telemetry/spool.js';\nimport {\n ErrorReporter,\n createSentrySend,\n setProcessReporter\n} from '../telemetry/error-reporter.js';\nimport { thrownByModel } from '../telemetry/error-policy.js';\nimport { engineFallbackStack, engineFallbackWarning } from '../tools/engine.js';\nimport {\n HarnessContext,\n type HarnessFields\n} from '../telemetry/harness-context.js';\nimport { withTelemetryCovered } from '../tools/telemetry-wrapper.js';\nimport { createSlotGatedEngine, isPidAlive } from '../engine/engine-slots.js';\nimport {\n forgetDeadSessions,\n closeLocalSession,\n localSessionId\n} from '../sessions/local-session.js';\nimport { SessionStore } from '../sessions/store.js';\nimport { migrateLegacyWorkspace } from '../legacy/migrate.js';\n\nimport { createCodesignMcpServer } from '../server.js';\nimport {\n disposeHeadlessEngine,\n ensureHeadlessEngine\n} from '../tools/engine.js';\nimport {\n createGatewayClient,\n DEMOS,\n wrapEngineCapacity,\n type TelemetrySink\n} from '@imgly/codesign-sdk/internal';\nimport { openLocalDesign } from '../host/local-design.js';\nimport { resolvedEngineFlavor } from '../tools/engine.js';\nimport { installedCesdkVersion } from '../viewer/cesdk-cdn.js';\nimport {\n scratchAudioExtractor,\n slotGatedScratchEngines\n} from '../host/audio-extractor.js';\nimport { buildLocalToolRegistrations } from '../host/local-tools.js';\nimport {\n BroadcastingSessionStore,\n createViewerRouter,\n ViewerUrlBuilder,\n SseBroadcaster,\n startViewerListener\n} from '../viewer/index.js';\nimport { resolveAiPluginAssets } from '../viewer/ai-plugin-assets.js';\nimport { resolveExportPluginAssets } from '../viewer/export-plugin-assets.js';\nimport { viewerVideoExport } from '../viewer/video-export.js';\nimport { engineCapabilities, videoOffAdvice } from '../capability.js';\nimport { NodeWorkspaceFS } from '../workspace/node-fs.js';\nimport { redirectConsoleToStderr } from './redirect-console.js';\nimport { resolveLicense, usesBundledLicense } from './resolve-license.js';\nimport { DEFAULT_DURABLE_ROOT, ensureDurableRoot } from '../durable-root.js';\nimport { IMGLY_CESDK_LICENSE } from './license.generated.js';\nimport { pinOpenSourceCodecs } from './codec-pack.js';\nimport { createAiTokenResolver } from '../auth/ai-token.js';\nimport {\n attemptRedemption,\n promoSuccessLine,\n type RedemptionOutcome\n} from '../auth/auto-redeem.js';\nimport { resolveAuthConfig } from '../auth/clerk-client.js';\nimport { LoginManager } from '../auth/login-manager.js';\nimport { defaultAuthFile, readAuth } from '../auth/token-store.js';\nimport { createLoginTool, createLogoutTool } from '../tools/login.js';\nimport { pluginSkillsMismatch } from '../plugin-skills.js';\n\nconst DEFAULT_WORKSPACE = joinPath(homedir(), '.codesign', 'workspace');\nconst TELEMETRY_EXIT_FLUSH_MS = 2_000;\nconst TELEMETRY_LATE_FLUSH_MS = 500;\n\nexport function buildDiagnostics(\n env: Env,\n opts: {\n transport: 'stdio' | 'http';\n /**\n * Usage telemetry, or false for none. `fetch` is required so a test can\n * never post to the real endpoint by accident; `spoolDir` keeps unsent\n * events on disk for the next process.\n */\n telemetry:\n | false\n | {\n license: string;\n fetch: typeof globalThis.fetch;\n spoolDir?: string;\n };\n /**\n * Test seam — the same `authFile`/`idFile` pattern diagnostics/status.ts\n * uses. The sink's defaults read the real ~/.codesign/auth.json and MINT\n * the real ~/.codesign/id, so a test that records through a sink built\n * here writes to the developer's actual $HOME.\n */\n telemetryIdentity?: Pick<\n UsageTelemetrySinkOptions,\n 'resolveAccountId' | 'resolveInstallId'\n >;\n /** One id per server process, shared with the error reporter's `runId` tag. */\n runId?: string;\n errorReporter?: ErrorReporter;\n harness?: () => HarnessFields;\n }\n): {\n diag: DiagnosticsSink;\n telemetry: TelemetrySink;\n usageTelemetry: UsageTelemetrySink | undefined;\n dir: string | undefined;\n enabled: boolean;\n} {\n const fileOn = diagnosticsFileEnabled(env);\n let diag: DiagnosticsSink = NOOP_DIAGNOSTICS_SINK;\n let dir: string | undefined;\n const sinks: TelemetrySink[] = [];\n if (fileOn) {\n dir = resolveDiagnosticsDir(env);\n const fileSink = new FileDiagnosticsSink({ dir });\n diag = fileSink;\n sinks.push(toolCallSink(fileSink));\n }\n // Usage telemetry is independent of local diagnostics logging:\n // the usage sink joins the fan-out whenever the flag is on.\n const telemetry = opts.telemetry;\n const spoolDir = telemetry ? telemetry.spoolDir : undefined;\n const usageTelemetry = telemetry\n ? new UsageTelemetrySink({\n transport: opts.transport,\n license: telemetry.license,\n fetch: telemetry.fetch,\n ...(opts.runId ? { runId: opts.runId } : {}),\n ...(spoolDir\n ? {\n spool: (runId: string) =>\n new TelemetrySpool({\n dir: spoolDir,\n pid: process.pid,\n runId,\n isPidAlive\n })\n }\n : {}),\n ...opts.telemetryIdentity,\n ...(opts.harness ? { harness: opts.harness } : {}),\n onEvent: (text, error) =>\n diag.emit({\n kind: 'lifecycle',\n timestamp: Date.now(),\n text,\n ...(error ? { error } : {})\n })\n })\n : undefined;\n if (usageTelemetry) sinks.push(usageTelemetry);\n if (opts.errorReporter) {\n sinks.push(opts.errorReporter);\n diag = composeSinks(diag, opts.errorReporter);\n }\n return {\n diag,\n telemetry: combineSinks(...sinks),\n usageTelemetry,\n dir,\n enabled: fileOn\n };\n}\n\nexport async function runStdio(): Promise<void> {\n let usageTelemetryOn = true;\n try {\n usageTelemetryOn = usageTelemetryEnabled(process.env);\n } catch (err) {\n process.stderr.write(\n `codesign-mcp stdio: ${err instanceof Error ? err.message : String(err)}\\n`\n );\n process.exit(1);\n }\n const harness = new HarnessContext(process.env);\n const runId = randomUUID();\n let errorReporter: ErrorReporter | undefined;\n const created: {\n server?: ReturnType<typeof createCodesignMcpServer>;\n diag?: DiagnosticsSink;\n } = {};\n let cesdkVersion: string | undefined;\n let reportingOn = false;\n try {\n reportingOn = errorReportingEnabled(process.env);\n } catch (err) {\n process.stderr.write(\n `codesign-mcp stdio: ${err instanceof Error ? err.message : String(err)}\\n`\n );\n process.exit(1);\n }\n for (const line of placeholderNotices(process.env))\n process.stderr.write(`${line}\\n`);\n const dsn = sentryDsn(process.env);\n if (reportingOn && dsn) {\n try {\n errorReporter = new ErrorReporter({\n send: await createSentrySend(dsn),\n packageRoot: fileURLToPath(new URL('../..', import.meta.url)).replace(\n /[\\\\/]$/,\n ''\n ),\n context: {\n platform: () => process.platform,\n arch: () => process.arch,\n transport: () => 'stdio',\n engineFlavor: () => resolvedEngineFlavor(),\n cesdkVersion: () => (cesdkVersion ??= installedCesdkVersion()),\n clientName: () => created.server?.getClientVersion()?.name,\n clientVersion: () => created.server?.getClientVersion()?.version,\n runId: () => runId\n },\n harness: () => harness.fields(),\n signedInEmail: async () => (await readAuth(defaultAuthFile()))?.email,\n onFailure: (err) => {\n process.stderr.write(\n `codesign-mcp stdio: error report failed — ${err instanceof Error ? err.message : String(err)}\\n`\n );\n created.diag?.emit({\n kind: 'lifecycle',\n timestamp: Date.now(),\n text: 'error_report_failed'\n });\n }\n });\n setProcessReporter(errorReporter);\n } catch (err) {\n process.stderr.write(\n `codesign-mcp stdio: error reporting unavailable — ${err instanceof Error ? err.message : String(err)}\\n`\n );\n }\n }\n const license = resolveLicense(process.env, IMGLY_CESDK_LICENSE);\n if (!license) {\n process.stderr.write(\n 'codesign-mcp stdio: no CESDK_LICENSE set and no bundled license — set CESDK_LICENSE (or IMGLY_CESDK_LICENSE) to a CE.SDK node license string.\\n'\n );\n process.exit(1);\n }\n const usedBundledLicense = usesBundledLicense(process.env);\n const {\n diag,\n telemetry,\n usageTelemetry,\n dir: diagnosticsDir,\n enabled: diagnosticsEnabled\n } = buildDiagnostics(process.env, {\n transport: 'stdio',\n telemetry: usageTelemetryOn\n ? {\n license,\n fetch: globalThis.fetch,\n spoolDir: joinPath(DEFAULT_DURABLE_ROOT, 'telemetry')\n }\n : false,\n harness: () => harness.fields(),\n runId,\n ...(errorReporter ? { errorReporter } : {})\n });\n created.diag = diag;\n if (diagnosticsEnabled && diagnosticsDir) {\n await FileDiagnosticsSink.pruneOnStartup({ dir: diagnosticsDir });\n process.stderr.write(\n `codesign-mcp stdio: diagnostics logging to ${diagnosticsDir} — redacted, local-only; disable with IMGLY_DIAGNOSTICS_FILE=off\\n`\n );\n }\n // Before any skill reaches the model: the plugin's skills may be another build's.\n const skillsMismatch = pluginSkillsMismatch(process.env);\n if (skillsMismatch) {\n process.stderr.write(`codesign-mcp stdio: ${skillsMismatch}\\n`);\n }\n // stdout is the JSON-RPC channel in stdio mode; keep engine console.* noise off it.\n redirectConsoleToStderr((level, text) =>\n diag.emit({ kind: 'engine_log', timestamp: Date.now(), level, text })\n );\n\n // Video is on wherever the engine can encode it: native, the default off Windows.\n // Advertised from the configuration; a native boot that falls back to WASM\n // is refused per call (host/workspace-files.ts).\n const capabilities = await engineCapabilities();\n const video = capabilities.video;\n // Read once here; a typo'd value fails the boot loudly.\n let noViewer = false;\n try {\n noViewer = viewerDisabled(process.env);\n } catch (err) {\n process.stderr.write(\n `codesign-mcp stdio: ${err instanceof Error ? err.message : String(err)}\\n`\n );\n process.exit(1);\n }\n pinOpenSourceCodecs(process.env, usedBundledLicense);\n\n // ~/.codesign must exist — and be hidden on Windows — before the\n // workspace, codesign-id, and engine-slot subsystems touch it.\n await ensureDurableRoot();\n\n const workspaceRoot = process.env.CODESIGN_WORKSPACE ?? DEFAULT_WORKSPACE;\n const fs = new NodeWorkspaceFS(workspaceRoot);\n\n const broadcaster = new SseBroadcaster();\n\n // The viewer listener binds an ephemeral localhost port — cheap and local, so\n // it stays on the startup path. urlBuilder must exist before we build the tools\n // and before the engine's workspace:// URI resolver is wired.\n // A floating rejection must never kill the server — every session's\n // engine slot and staged scene dies with the process. Facade promises are\n // tracked per edit (edit.ts); this net catches everything else sandbox\n // code can float (fetch, timers), logging instead of crashing — as it does\n // for an uncaught throw the model's code caused.\n process.on('unhandledRejection', (reason) => {\n console.error(\n 'codesign-mcp: unhandled promise rejection (continuing):',\n reason instanceof Error ? (reason.stack ?? reason.message) : reason\n );\n errorReporter?.captureProcess('unhandled_rejection', reason);\n });\n process.on('uncaughtException', (err: unknown) => {\n const text =\n err instanceof Error ? (err.stack ?? err.message) : String(err);\n const byModel = thrownByModel(err);\n errorReporter?.captureProcess('uncaught_exception', err);\n if (byModel) {\n process.stderr.write(\n `codesign-mcp: uncaught exception in edit code (continuing) — ${text}\\n`\n );\n return;\n }\n process.stderr.write(`codesign-mcp: uncaught exception — ${text}\\n`);\n void Promise.all([\n errorReporter?.flush(),\n usageTelemetry?.flush(TELEMETRY_EXIT_FLUSH_MS)\n ]).finally(() => process.exit(1));\n });\n\n const diagnosticsOn = diagnosticsToolEnabled(process.env);\n const diagDir = resolveDiagnosticsDir(process.env);\n\n // Engine boot is DEFERRED to the first engine-using tool call and gated by a\n // machine-wide slot: idle panes hold no engine (~8-12 MB) and no\n // slot; only real design work boots one, and at most IMGLY_MAX_ENGINES\n // engines run across all stdio processes at once. bootstrapEngine still runs\n // OFF the handshake path — it is just triggered lazily now, not eagerly.\n // At capacity, get() throws EngineCapacityError, which wrapEngineCapacity\n // (below) turns into an isError tool result.\n //\n // Built ahead of the viewer router (below) — urlBuilder isn't assigned until\n // after the listener binds, but boot() only runs lazily on the first real\n // `.get()` (well after urlBuilder is set), so closing over it here is safe.\n const gatedEngine = createSlotGatedEngine<CreativeEngine>({\n max: resolveMaxEngines(process.env),\n boot: () => {\n diag.emit({\n kind: 'lifecycle',\n timestamp: Date.now(),\n text: 'engine_init_start'\n });\n const p = bootstrapEngine({ license, usedBundledLicense });\n void p\n .then(() => {\n diag.emit({\n kind: 'lifecycle',\n timestamp: Date.now(),\n text: 'engine_init_done'\n });\n const fallback = engineFallbackWarning();\n if (fallback)\n diag.emit({\n kind: 'lifecycle',\n timestamp: Date.now(),\n text: 'engine_fallback',\n error: { message: fallback, stack: engineFallbackStack() }\n });\n })\n .catch(() => {\n // rejection is surfaced by the catch below — never unhandled here\n });\n // Surface a background init failure on stderr + diagnostics. The awaiting\n // tool call still sees the real error; this just avoids a silent gap.\n void p.catch((err) => {\n process.stderr.write(\n `codesign-mcp stdio: engine initialization failed — ${\n err instanceof Error ? (err.stack ?? err.message) : String(err)\n }\\n`\n );\n diag.emit({\n kind: 'lifecycle',\n timestamp: Date.now(),\n text: 'engine_init_failed',\n error: {\n message: err instanceof Error ? err.message : String(err),\n ...(err instanceof Error && err.stack ? { stack: err.stack } : {})\n }\n });\n });\n return p;\n }\n });\n\n // Session-model wiring. One stdio process serves one client, so one\n // session and one current design for everything on this connection.\n // Broadcasting: a save is the one event the viewer reacts to, and\n // `saveDesign` is the only method that writes one. Checkpoints inherit\n // unchanged, so twenty `edit` calls move nothing in an open tab.\n const sessionStore = new BroadcastingSessionStore(fs, broadcaster);\n\n // A workspace the revision model wrote: bring over what it holds that this\n // version has not seen yet, on every boot, since a user may switch back and\n // forth. Awaited BEFORE server.connect(): a file copy, not an engine boot,\n // and nothing can save over a design while it runs.\n //\n // A PLAIN store here on purpose: restoring forty old designs is not forty\n // saves anyone made, and this runs before the listener exists anyway.\n const migration = await migrateLegacyWorkspace({\n fs,\n sessionStore: new SessionStore(fs)\n });\n if (migration) {\n // A skipped design is the one thing here a user may need to act on, so it\n // gets its own line rather than a count.\n for (const skip of migration.skipped) {\n process.stderr.write(\n `codesign-mcp stdio: could not migrate design ${skip.root} — ${skip.reason}\\n`\n );\n }\n for (const both of migration.keptBoth) {\n process.stderr.write(\n `codesign-mcp stdio: design ${both.root} changed on both versions — kept the saved one; the old version's newest state is design ${both.designId}\\n`\n );\n }\n process.stderr.write(\n `codesign-mcp stdio: migrated ${migration.migrated.length} design(s) from pre-0.4 revision history, kept ${migration.keptBoth.length} twice, skipped ${migration.skipped.length}\\n`\n );\n diag.emit({\n kind: 'lifecycle',\n timestamp: Date.now(),\n text: `legacy_migration:migrated=${migration.migrated.length},keptBoth=${migration.keptBoth.length},skipped=${migration.skipped.length}`\n });\n }\n\n // A new process is a new conversation with its own draft; it resumes a design only by `open`.\n const localSession = localSessionId();\n await forgetDeadSessions(sessionStore).catch(() => undefined);\n\n // IMG.LY SSO login (POC, identity-only): enabled only when both\n // IMGLY_AUTH_ISSUER and IMGLY_AUTH_CLIENT_ID are set. The callback route\n // rides the existing loopback listener.\n //\n // Computed ahead of the viewer router (below) — /api/ai-token needs the\n // same gatewayKey/loginManager precedence as the gateway client just below.\n const authConfig = resolveAuthConfig(process.env);\n const loginManager = authConfig\n ? new LoginManager({ config: authConfig, authFile: defaultAuthFile() })\n : undefined;\n // Campaign auto-redeem (spec 2026-07-31-auto-promo-redemption-design.md):\n // the login-completion hook is awaited ~5s so the signed-in page and the\n // next `login` confirm call can carry the outcome; the fire-and-forget\n // server-start attempt covers accounts that signed in before this\n // shipped. Failures are silent everywhere by design, and attemptRedemption\n // resolves undefined when it has nothing conclusive (including when the\n // campaign constant is empty).\n let lastPromoOutcome: RedemptionOutcome | undefined;\n if (loginManager) {\n const gatewayBase = process.env.IMGLY_GATEWAY_BASE_URL;\n loginManager.onSignedIn = async () => {\n const outcome = await attemptRedemption({\n loginManager,\n timeoutMs: 5_000,\n ...(gatewayBase ? { gatewayBaseUrl: gatewayBase } : {})\n });\n if (outcome?.outcome !== 'redeemed') return undefined;\n lastPromoOutcome = outcome;\n return promoSuccessLine(outcome);\n };\n void attemptRedemption({\n loginManager,\n ...(gatewayBase ? { gatewayBaseUrl: gatewayBase } : {})\n });\n }\n // Gateway credentials resolve per request: an explicit IMGLY_GATEWAY_API_KEY\n // (headless/CI) wins over the interactive Clerk session; with neither\n // SOURCE configured the client is unconfigured and asset_generate stays\n // hidden from tools/list.\n const { value: gatewayKey, problem: gatewayKeyProblem } = resolveSecret(\n 'IMGLY_GATEWAY_API_KEY',\n process.env\n );\n if (gatewayKeyProblem)\n process.stderr.write(\n `codesign-mcp stdio: ${gatewayKeyProblem} Starting without it: asset_generate needs the key or a \\`login\\`.\\n`\n );\n const aiToken = createAiTokenResolver({\n ...(gatewayKey ? { gatewayKey } : {}),\n ...(loginManager ? { loginManager } : {}),\n ...(process.env.IMGLY_GATEWAY_BASE_URL\n ? { gatewayBaseUrl: process.env.IMGLY_GATEWAY_BASE_URL }\n : {})\n });\n const gateway = createGatewayClient({\n bearer: async (opts) =>\n gatewayKey ??\n (loginManager\n ? (\n await loginManager.ensureFreshTokens({\n force: opts?.forceRefresh === true\n })\n )?.accessToken\n : undefined),\n ...(process.env.IMGLY_GATEWAY_BASE_URL\n ? { baseURL: process.env.IMGLY_GATEWAY_BASE_URL }\n : {})\n });\n\n let viewerBase = '';\n const viewerRouter = createViewerRouter({\n store: sessionStore,\n fs,\n broadcaster,\n cesdkLicense: license,\n workspaceRoot,\n videoExport: viewerVideoExport({\n capability: () => engineCapabilities(),\n // `design` is opened below; the route only fires after startup.\n readEngine: (fn) => design.readEngine(fn)\n }),\n aiPluginAssets: resolveAiPluginAssets(),\n exportPluginAssets: resolveExportPluginAssets(),\n // Only wire the resolver when a credential source actually exists — a\n // credential-less server must report aiEditor: false (createViewerRouter\n // derives it from Boolean(opts.aiToken)) so the editor skips AI wiring\n // entirely and /api/ai-token 501s, instead of always returning 503 from a\n // resolver that can never succeed.\n ...(gatewayKey || loginManager ? { aiToken } : {}),\n ...(process.env.IMGLY_GATEWAY_BASE_URL\n ? { gatewayBaseUrl: process.env.IMGLY_GATEWAY_BASE_URL }\n : {}),\n ...(loginManager\n ? {\n loginStart: () =>\n loginManager.startLogin({ callbackBase: viewerBase })\n }\n : {})\n });\n const diagnosticsRouter = diagnosticsOn\n ? createDiagnosticsRouter({ diag, dir: diagDir, env: process.env })\n : undefined;\n const extraRouters = [\n ...(diagnosticsRouter ? [diagnosticsRouter] : []),\n ...(loginManager ? [loginManager.router] : [])\n ];\n const listener = await startViewerListener({\n router: viewerRouter,\n ...(extraRouters.length ? { extraRouters } : {})\n });\n viewerBase = listener.base;\n // The listener always runs — the engine resolves every `workspace://` through\n // its `/r/` route. Only the human-facing announcement is withheld.\n if (!noViewer)\n process.stderr.write(`codesign-mcp stdio: viewer at ${listener.base}\\n`);\n if (authConfig) {\n process.stderr.write(\n `codesign-mcp stdio: IMG.LY login enabled (issuer ${authConfig.issuer})\\n`\n );\n }\n diag.emit({\n kind: 'lifecycle',\n timestamp: Date.now(),\n text: 'viewer_listening'\n });\n const urlBuilder = new ViewerUrlBuilder({ base: listener.base });\n const diagnosticsViewerUrl =\n diagnosticsOn && !noViewer ? urlBuilder.forDiagnostics() : undefined;\n\n const localRoot = noViewer ? resolvePath(workspaceRoot) : undefined;\n const design = await openLocalDesign({\n fs,\n store: sessionStore,\n sessionId: localSession,\n urlBuilder,\n boot: () => gatedEngine.get(),\n dispose: async () => {\n if (shuttingDown) return; // shutdown releases the engine itself\n await releaseEngine('idle');\n diag.emit({\n kind: 'lifecycle',\n timestamp: Date.now(),\n text: 'engine_idle_evicted'\n });\n },\n scratch: slotGatedScratchEngines({\n license,\n maxEngines: resolveMaxEngines(process.env)\n }),\n idleMs: resolveEngineIdleTimeoutMs(process.env),\n engineFlavor: resolvedEngineFlavor,\n video,\n videoAdvice: videoOffAdvice(capabilities),\n ...(localRoot !== undefined ? { localRoot } : {}),\n demos: DEMOS,\n telemetry\n });\n const designSession = design.session;\n const tools = [\n ...design.tools.map((t) =>\n wrapEngineCapacity(withTelemetryCovered(t, telemetry))\n ),\n ...buildLocalToolRegistrations({\n sessionId: localSession,\n store: sessionStore,\n fs,\n urlBuilder,\n withEngine: (fn) => design.readEngine((engine) => fn(engine)),\n session: design.session,\n gateway,\n gatewayConfigured: Boolean(gatewayKey) || Boolean(authConfig),\n ...(video\n ? {\n extractAudio: scratchAudioExtractor({\n license,\n urlBuilder,\n maxEngines: resolveMaxEngines(process.env)\n })\n }\n : {}),\n viewerDisabled: noViewer,\n localRoot: workspaceRoot,\n telemetry\n }).map((t) => wrapEngineCapacity(withTelemetryCovered(t, telemetry))),\n ...(diagnosticsOn\n ? [\n createDiagnosticsTool({\n env: process.env,\n dir: diagDir,\n fileLogging: diagnosticsEnabled,\n harness: () => harness.fields(),\n flush: () => diag.flush?.() ?? Promise.resolve(),\n ...(diagnosticsViewerUrl\n ? { viewerUrl: diagnosticsViewerUrl }\n : {}),\n telemetry: {\n enabled: usageTelemetry !== undefined,\n ...(usageTelemetry ? { stats: () => usageTelemetry.stats() } : {})\n },\n errorReporting: {\n enabled: errorReporter !== undefined,\n configured: dsn !== undefined,\n ...(errorReporter ? { stats: () => errorReporter.stats() } : {})\n }\n })\n ]\n : []),\n ...(loginManager\n ? [\n createLoginTool({\n manager: loginManager,\n callbackBase: () => listener.base,\n promoOutcome: () => {\n const outcome = lastPromoOutcome;\n lastPromoOutcome = undefined;\n return outcome;\n }\n }),\n createLogoutTool({ manager: loginManager })\n ]\n : [])\n ];\n\n const assets = loadNodeAssets();\n const server = createCodesignMcpServer({\n assets,\n tools,\n telemetry,\n onToolCallMeta: (m) => harness.noteCallMeta(m)\n });\n created.server = server;\n usageTelemetry?.setClientInfo(() => server.getClientVersion());\n\n const transport = new StdioServerTransport();\n\n // Dispose the engine and free its machine-wide slot; best-effort, idempotent.\n const releaseEngine = async (reason: string): Promise<void> => {\n // Release the CE.SDK engine (WASM/native runtime) deterministically instead\n // of leaving it to process teardown.\n try {\n await disposeHeadlessEngine();\n } catch (err) {\n process.stderr.write(\n `codesign-mcp stdio: engine dispose failed (${reason}) — ${\n err instanceof Error ? err.message : String(err)\n }\\n`\n );\n }\n // Clean path; SIGKILL is covered by PID-liveness reaping on the next acquire.\n try {\n await gatedEngine.release();\n } catch {\n // best-effort\n }\n };\n\n let shuttingDown = false;\n const shutdown = async (reason: string) => {\n if (shuttingDown) return; // idempotent — a signal and the transport close can race\n shuttingDown = true;\n diag.emit({\n kind: 'lifecycle',\n timestamp: Date.now(),\n text: `shutdown:${reason}`\n });\n // Flush the breadcrumb NOW, before the slower teardown below. emit() is\n // fire-and-forget, engine dispose can take seconds, and a client may SIGKILL\n // after a short grace window — landing the event first lets it survive even\n // if we're killed mid-teardown.\n try {\n await diag.flush?.();\n } catch {\n // best-effort\n }\n // Same reasoning for held usage events; what misses the window stays on\n // disk for the next process.\n await usageTelemetry?.flush(TELEMETRY_EXIT_FLUSH_MS);\n try {\n await listener.close();\n } catch {\n // best-effort — keep tearing down\n }\n try {\n await server.close();\n } catch {\n // best-effort\n }\n // Engine teardown comes AFTER server.close() so no tool call can arrive\n // against a disposed engine.\n // A call that never settles (a long encode) must not keep the process alive.\n await Promise.race([\n designSession.close().catch(() => undefined),\n new Promise((resolve) => setTimeout(resolve, 5000).unref())\n ]);\n await closeLocalSession(sessionStore, localSession).catch(() => undefined);\n await releaseEngine(`shutdown:${reason}`);\n // Calls that finished during the teardown above recorded after the first flush.\n await usageTelemetry?.flush(TELEMETRY_LATE_FLUSH_MS);\n process.exit(0);\n };\n\n // A client can disconnect by closing the stdio pipe (stdin EOF) WITHOUT a\n // signal — e.g. an orphaned/crashed host. `StdioServerTransport` only listens\n // for stdin `data`/`error`, never EOF, so it never surfaces that disconnect on\n // its own; the viewer listener's open socket then keeps the event loop alive\n // and the process lingers with the engine resident. So detect stdin EOF here\n // and reap. Listeners are attached before connect() (which puts stdin into\n // flowing mode) so we can't miss the `end`. `server.onclose` additionally\n // covers a protocol-level close routed through transport.close().\n server.onclose = () => void shutdown('server-close');\n process.stdin.on('end', () => void shutdown('stdin-end'));\n process.stdin.on('close', () => void shutdown('stdin-close'));\n\n await server.connect(transport);\n\n process.on('SIGINT', () => void shutdown('SIGINT'));\n process.on('SIGTERM', () => void shutdown('SIGTERM'));\n process.on('SIGHUP', () => void shutdown('SIGHUP'));\n}\n\n// Heavy engine bootstrap, run in the background by runStdio (off the MCP\n// handshake path). Resolves to a fully-wired engine: design-unit-patched (by\n// ensureHeadlessEngine), workspace:// URI resolver installed, and — best-effort\n// — the default + demo asset sources registered so asset_search has content.\n// The asset-source step hits the CDN; failures log to stderr and leave the\n// engine usable (asset_search just sees fewer sources).\nasync function bootstrapEngine({\n license,\n usedBundledLicense\n}: {\n license: string;\n /** License came from the bundled license — turns an init rejection into a hint. */\n usedBundledLicense: boolean;\n}): Promise<Awaited<ReturnType<typeof ensureHeadlessEngine>>> {\n let engine: Awaited<ReturnType<typeof ensureHeadlessEngine>>;\n try {\n engine = await ensureHeadlessEngine(license);\n } catch (err) {\n if (usedBundledLicense) {\n process.stderr.write(\n 'codesign-mcp stdio: the bundled license was rejected (it covers only the engine version this build was published with). Set CESDK_LICENSE to a valid CE.SDK node license string.\\n'\n );\n }\n throw err;\n }\n return engine;\n}\n"]}
1
+ {"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../src/cli/stdio.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,yFAAyF;AACzF,gFAAgF;AAChF,oCAAoC;AACpC,mDAAmD;AACnD,4CAA4C;AAC5C,sEAAsE;AACtE,EAAE;AACF,8CAA8C;AAC9C,EAAE;AACF,8EAA8E;AAC9E,2EAA2E;AAC3E,6EAA6E;AAC7E,8EAA8E;AAC9E,yEAAyE;AACzE,iFAAiF;AACjF,EAAE;AACF,gBAAgB;AAChB,wEAAwE;AACxE,0DAA0D;AAC1D,EAAE;AACF,wEAAwE;AACxE,kDAAkD;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,WAAW,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,SAAS,EACT,qBAAqB,EACrB,cAAc,EACf,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,EACrB,0BAA0B,EAC1B,iBAAiB,EACjB,aAAa,EACd,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,qBAAqB,EAEtB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EACL,YAAY,EACZ,kBAAkB,EAEnB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,kBAAkB,EACnB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAChF,OAAO,EACL,cAAc,EAEf,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAC9E,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACf,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,mBAAmB,EACnB,KAAK,EACL,kBAAkB,EAEnB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACxB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EACL,wBAAwB,EACxB,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,EACd,mBAAmB,EACpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAEjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D,MAAM,iBAAiB,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;AACxE,MAAM,uBAAuB,GAAG,KAAK,CAAC;AACtC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAEpC,MAAM,UAAU,gBAAgB,CAC9B,GAAQ,EACR,IA4BC;IAQD,MAAM,MAAM,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC;IAC3C,IAAI,IAAI,GAAoB,qBAAqB,CAAC;IAClD,IAAI,GAAuB,CAAC;IAC5B,MAAM,KAAK,GAAoB,EAAE,CAAC;IAClC,IAAI,MAAM,EAAE,CAAC;QACX,GAAG,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,QAAQ,GAAG,IAAI,mBAAmB,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QAClD,IAAI,GAAG,QAAQ,CAAC;QAChB,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;IACrC,CAAC;IACD,+DAA+D;IAC/D,4DAA4D;IAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IACjC,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5D,MAAM,cAAc,GAAG,SAAS;QAC9B,CAAC,CAAC,IAAI,kBAAkB,CAAC;YACrB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAE,SAAS,CAAC,OAAO;YAC1B,KAAK,EAAE,SAAS,CAAC,KAAK;YACtB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5C,GAAG,CAAC,QAAQ;gBACV,CAAC,CAAC;oBACE,KAAK,EAAE,CAAC,KAAa,EAAE,EAAE,CACvB,IAAI,cAAc,CAAC;wBACjB,GAAG,EAAE,QAAQ;wBACb,GAAG,EAAE,OAAO,CAAC,GAAG;wBAChB,KAAK;wBACL,UAAU;qBACX,CAAC;iBACL;gBACH,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,IAAI,CAAC,iBAAiB;YACzB,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAClD,OAAO,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACvB,IAAI,CAAC,IAAI,CAAC;gBACR,IAAI,EAAE,WAAW;gBACjB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,IAAI;gBACJ,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC5B,CAAC;SACL,CAAC;QACJ,CAAC,CAAC,SAAS,CAAC;IACd,IAAI,cAAc;QAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC/C,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC/B,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IAChD,CAAC;IACD,OAAO;QACL,IAAI;QACJ,SAAS,EAAE,YAAY,CAAC,GAAG,KAAK,CAAC;QACjC,cAAc;QACd,GAAG;QACH,OAAO,EAAE,MAAM;KAChB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ;IAC5B,IAAI,gBAAgB,GAAG,IAAI,CAAC;IAC5B,IAAI,CAAC;QACH,gBAAgB,GAAG,qBAAqB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACxD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,uBAAuB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAC5E,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC;IAC3B,IAAI,aAAwC,CAAC;IAC7C,MAAM,OAAO,GAGT,EAAE,CAAC;IACP,IAAI,YAAgC,CAAC;IACrC,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,IAAI,CAAC;QACH,WAAW,GAAG,qBAAqB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,uBAAuB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAC5E,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC;QAChD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;IACpC,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,WAAW,IAAI,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,aAAa,GAAG,IAAI,aAAa,CAAC;gBAChC,IAAI,EAAE,MAAM,gBAAgB,CAAC,GAAG,CAAC;gBACjC,WAAW,EAAE,aAAa,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CACnE,QAAQ,EACR,EAAE,CACH;gBACD,OAAO,EAAE;oBACP,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ;oBAChC,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI;oBACxB,SAAS,EAAE,GAAG,EAAE,CAAC,OAAO;oBACxB,YAAY,EAAE,GAAG,EAAE,CAAC,oBAAoB,EAAE;oBAC1C,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,YAAY,KAAK,qBAAqB,EAAE,CAAC;oBAC9D,UAAU,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,gBAAgB,EAAE,EAAE,IAAI;oBAC1D,aAAa,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,gBAAgB,EAAE,EAAE,OAAO;oBAChE,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK;iBACnB;gBACD,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE;gBAC/B,aAAa,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,QAAQ,CAAC,eAAe,EAAE,CAAC,CAAC,EAAE,KAAK;gBACrE,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE;oBACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,6CAA6C,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAClG,CAAC;oBACF,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC;wBACjB,IAAI,EAAE,WAAW;wBACjB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;wBACrB,IAAI,EAAE,qBAAqB;qBAC5B,CAAC,CAAC;gBACL,CAAC;aACF,CAAC,CAAC;YACH,kBAAkB,CAAC,aAAa,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,qDAAqD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAC1G,CAAC;QACJ,CAAC;IACH,CAAC;IACD,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;IACjE,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,iJAAiJ,CAClJ,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3D,MAAM,EACJ,IAAI,EACJ,SAAS,EACT,cAAc,EACd,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,kBAAkB,EAC5B,GAAG,gBAAgB,CAAC,OAAO,CAAC,GAAG,EAAE;QAChC,SAAS,EAAE,OAAO;QAClB,SAAS,EAAE,gBAAgB;YACzB,CAAC,CAAC;gBACE,OAAO;gBACP,KAAK,EAAE,UAAU,CAAC,KAAK;gBACvB,QAAQ,EAAE,QAAQ,CAAC,oBAAoB,EAAE,WAAW,CAAC;aACtD;YACH,CAAC,CAAC,KAAK;QACT,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE;QAC/B,KAAK;QACL,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5C,CAAC,CAAC;IACH,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IACpB,IAAI,kBAAkB,IAAI,cAAc,EAAE,CAAC;QACzC,MAAM,mBAAmB,CAAC,cAAc,CAAC,EAAE,GAAG,EAAE,cAAc,EAAE,CAAC,CAAC;QAClE,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,8CAA8C,cAAc,oEAAoE,CACjI,CAAC;IACJ,CAAC;IACD,kFAAkF;IAClF,MAAM,cAAc,GAAG,oBAAoB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACzD,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,cAAc,IAAI,CAAC,CAAC;IAClE,CAAC;IACD,oFAAoF;IACpF,uBAAuB,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CACtC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CACtE,CAAC;IAEF,kFAAkF;IAClF,2EAA2E;IAC3E,iDAAiD;IACjD,MAAM,YAAY,GAAG,MAAM,kBAAkB,EAAE,CAAC;IAChD,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC;IACjC,wDAAwD;IACxD,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,CAAC;QACH,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,uBAAuB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAC5E,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,mBAAmB,CAAC,OAAO,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;IAErD,iEAAiE;IACjE,+DAA+D;IAC/D,MAAM,iBAAiB,EAAE,CAAC;IAE1B,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,iBAAiB,CAAC;IAC1E,MAAM,EAAE,GAAG,IAAI,eAAe,CAAC,aAAa,CAAC,CAAC;IAE9C,MAAM,WAAW,GAAG,IAAI,cAAc,EAAE,CAAC;IAEzC,8EAA8E;IAC9E,gFAAgF;IAChF,8DAA8D;IAC9D,oEAAoE;IACpE,0EAA0E;IAC1E,uEAAuE;IACvE,2EAA2E;IAC3E,iDAAiD;IACjD,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,EAAE;QAC1C,OAAO,CAAC,KAAK,CACX,yDAAyD,EACzD,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CACpE,CAAC;QACF,aAAa,EAAE,cAAc,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,GAAY,EAAE,EAAE;QAC/C,MAAM,IAAI,GACR,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAClE,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;QACnC,aAAa,EAAE,cAAc,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAC;QACzD,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,gEAAgE,IAAI,IAAI,CACzE,CAAC;YACF,OAAO;QACT,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sCAAsC,IAAI,IAAI,CAAC,CAAC;QACrE,KAAK,OAAO,CAAC,GAAG,CAAC;YACf,aAAa,EAAE,KAAK,EAAE;YACtB,cAAc,EAAE,KAAK,CAAC,uBAAuB,CAAC;SAC/C,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,sBAAsB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,qBAAqB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAEnD,6EAA6E;IAC7E,iEAAiE;IACjE,uEAAuE;IACvE,6EAA6E;IAC7E,yEAAyE;IACzE,0EAA0E;IAC1E,6CAA6C;IAC7C,EAAE;IACF,6EAA6E;IAC7E,0EAA0E;IAC1E,4EAA4E;IAC5E,MAAM,WAAW,GAAG,qBAAqB,CAAiB;QACxD,GAAG,EAAE,iBAAiB,CAAC,OAAO,CAAC,GAAG,CAAC;QACnC,IAAI,EAAE,GAAG,EAAE;YACT,IAAI,CAAC,IAAI,CAAC;gBACR,IAAI,EAAE,WAAW;gBACjB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,IAAI,EAAE,mBAAmB;aAC1B,CAAC,CAAC;YACH,MAAM,CAAC,GAAG,eAAe,CAAC,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC3D,KAAK,CAAC;iBACH,IAAI,CAAC,GAAG,EAAE;gBACT,IAAI,CAAC,IAAI,CAAC;oBACR,IAAI,EAAE,WAAW;oBACjB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;oBACrB,IAAI,EAAE,kBAAkB;iBACzB,CAAC,CAAC;gBACH,MAAM,QAAQ,GAAG,qBAAqB,EAAE,CAAC;gBACzC,IAAI,QAAQ;oBACV,IAAI,CAAC,IAAI,CAAC;wBACR,IAAI,EAAE,WAAW;wBACjB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;wBACrB,IAAI,EAAE,iBAAiB;wBACvB,KAAK,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE;qBAC3D,CAAC,CAAC;YACP,CAAC,CAAC;iBACD,KAAK,CAAC,GAAG,EAAE;gBACV,kEAAkE;YACpE,CAAC,CAAC,CAAC;YACL,0EAA0E;YAC1E,sEAAsE;YACtE,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,sDACE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAChE,IAAI,CACL,CAAC;gBACF,IAAI,CAAC,IAAI,CAAC;oBACR,IAAI,EAAE,WAAW;oBACjB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;oBACrB,IAAI,EAAE,oBAAoB;oBAC1B,KAAK,EAAE;wBACL,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;wBACzD,GAAG,CAAC,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBACnE;iBACF,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YACH,OAAO,CAAC,CAAC;QACX,CAAC;KACF,CAAC,CAAC;IAEH,oEAAoE;IACpE,oEAAoE;IACpE,kEAAkE;IAClE,uEAAuE;IACvE,iEAAiE;IACjE,MAAM,YAAY,GAAG,IAAI,wBAAwB,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;IAEnE,2EAA2E;IAC3E,4EAA4E;IAC5E,2EAA2E;IAC3E,oDAAoD;IACpD,EAAE;IACF,0EAA0E;IAC1E,sEAAsE;IACtE,MAAM,SAAS,GAAG,MAAM,sBAAsB,CAAC;QAC7C,EAAE;QACF,YAAY,EAAE,IAAI,YAAY,CAAC,EAAE,CAAC;KACnC,CAAC,CAAC;IACH,IAAI,SAAS,EAAE,CAAC;QACd,0EAA0E;QAC1E,yCAAyC;QACzC,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;YACrC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,gDAAgD,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,MAAM,IAAI,CAC/E,CAAC;QACJ,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;YACtC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,8BAA8B,IAAI,CAAC,IAAI,4FAA4F,IAAI,CAAC,QAAQ,IAAI,CACrJ,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,gCAAgC,SAAS,CAAC,QAAQ,CAAC,MAAM,kDAAkD,SAAS,CAAC,QAAQ,CAAC,MAAM,mBAAmB,SAAS,CAAC,OAAO,CAAC,MAAM,IAAI,CACpL,CAAC;QACF,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,WAAW;YACjB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,IAAI,EAAE,6BAA6B,SAAS,CAAC,QAAQ,CAAC,MAAM,aAAa,SAAS,CAAC,QAAQ,CAAC,MAAM,YAAY,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE;SACzI,CAAC,CAAC;IACL,CAAC;IAED,8FAA8F;IAC9F,MAAM,YAAY,GAAG,cAAc,EAAE,CAAC;IACtC,MAAM,kBAAkB,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAE9D,0EAA0E;IAC1E,qBAAqB;IACrB,EAAE;IACF,wEAAwE;IACxE,4EAA4E;IAC5E,MAAM,UAAU,GAAG,WAAW,CAAC;IAC/B,MAAM,YAAY,GAAG,UAAU;QAC7B,CAAC,CAAC,IAAI,YAAY,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,eAAe,EAAE,EAAE,CAAC;QACvE,CAAC,CAAC,SAAS,CAAC;IACd,0EAA0E;IAC1E,yEAAyE;IACzE,uEAAuE;IACvE,kEAAkE;IAClE,2EAA2E;IAC3E,wEAAwE;IACxE,+BAA+B;IAC/B,IAAI,gBAA+C,CAAC;IACpD,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;QACvD,YAAY,CAAC,UAAU,GAAG,KAAK,IAAI,EAAE;YACnC,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC;gBACtC,YAAY;gBACZ,SAAS,EAAE,KAAK;gBAChB,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACxD,CAAC,CAAC;YACH,IAAI,OAAO,EAAE,OAAO,KAAK,UAAU;gBAAE,OAAO,SAAS,CAAC;YACtD,gBAAgB,GAAG,OAAO,CAAC;YAC3B,OAAO,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC,CAAC;QACF,KAAK,iBAAiB,CAAC;YACrB,YAAY;YACZ,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxD,CAAC,CAAC;IACL,CAAC;IACD,6EAA6E;IAC7E,sEAAsE;IACtE,wEAAwE;IACxE,0BAA0B;IAC1B,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,iBAAiB,EAAE,GAAG,aAAa,CACrE,uBAAuB,EACvB,OAAO,CAAC,GAAG,CACZ,CAAC;IACF,IAAI,iBAAiB;QACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,uBAAuB,iBAAiB,sEAAsE,CAC/G,CAAC;IACJ,MAAM,OAAO,GAAG,qBAAqB,CAAC;QACpC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB;YACpC,CAAC,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE;YACxD,CAAC,CAAC,EAAE,CAAC;KACR,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,mBAAmB,CAAC;QAClC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CACrB,UAAU;YACV,CAAC,YAAY;gBACX,CAAC,CAAC,CACE,MAAM,YAAY,CAAC,iBAAiB,CAAC;oBACnC,KAAK,EAAE,IAAI,EAAE,YAAY,KAAK,IAAI;iBACnC,CAAC,CACH,EAAE,WAAW;gBAChB,CAAC,CAAC,SAAS,CAAC;QAChB,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB;YACpC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE;YACjD,CAAC,CAAC,EAAE,CAAC;KACR,CAAC,CAAC;IAEH,IAAI,UAAU,GAAG,EAAE,CAAC;IACpB,MAAM,YAAY,GAAG,kBAAkB,CAAC;QACtC,KAAK,EAAE,YAAY;QACnB,EAAE;QACF,WAAW;QACX,YAAY,EAAE,OAAO;QACrB,aAAa;QACb,WAAW,EAAE,iBAAiB,CAAC;YAC7B,UAAU,EAAE,GAAG,EAAE,CAAC,kBAAkB,EAAE;YACtC,gEAAgE;YAChE,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;SAC1C,CAAC;QACF,cAAc,EAAE,qBAAqB,EAAE;QACvC,kBAAkB,EAAE,yBAAyB,EAAE;QAC/C,sEAAsE;QACtE,yEAAyE;QACzE,uEAAuE;QACvE,0EAA0E;QAC1E,mCAAmC;QACnC,GAAG,CAAC,UAAU,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClD,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB;YACpC,CAAC,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE;YACxD,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,YAAY;YACd,CAAC,CAAC;gBACE,UAAU,EAAE,GAAG,EAAE,CACf,YAAY,CAAC,UAAU,CAAC,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC;aACxD;YACH,CAAC,CAAC,EAAE,CAAC;KACR,CAAC,CAAC;IACH,MAAM,iBAAiB,GAAG,aAAa;QACrC,CAAC,CAAC,uBAAuB,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;QACnE,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,YAAY,GAAG;QACnB,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KAC/C,CAAC;IACF,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC;QACzC,MAAM,EAAE,YAAY;QACpB,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACjD,CAAC,CAAC;IACH,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC;IAC3B,8EAA8E;IAC9E,mEAAmE;IACnE,IAAI,CAAC,QAAQ;QACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAC;IAC3E,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,oDAAoD,UAAU,CAAC,MAAM,KAAK,CAC3E,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,IAAI,CAAC;QACR,IAAI,EAAE,WAAW;QACjB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,IAAI,EAAE,kBAAkB;KACzB,CAAC,CAAC;IACH,MAAM,UAAU,GAAG,IAAI,gBAAgB,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACjE,MAAM,oBAAoB,GACxB,aAAa,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAEvE,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACpE,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC;QACnC,EAAE;QACF,KAAK,EAAE,YAAY;QACnB,SAAS,EAAE,YAAY;QACvB,UAAU;QACV,IAAI,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;QAC7B,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,IAAI,YAAY;gBAAE,OAAO,CAAC,sCAAsC;YAChE,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC;gBACR,IAAI,EAAE,WAAW;gBACjB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,IAAI,EAAE,qBAAqB;aAC5B,CAAC,CAAC;QACL,CAAC;QACD,OAAO,EAAE,uBAAuB,CAAC;YAC/B,OAAO;YACP,UAAU,EAAE,iBAAiB,CAAC,OAAO,CAAC,GAAG,CAAC;SAC3C,CAAC;QACF,MAAM,EAAE,0BAA0B,CAAC,OAAO,CAAC,GAAG,CAAC;QAC/C,YAAY,EAAE,oBAAoB;QAClC,KAAK;QACL,WAAW,EAAE,cAAc,CAAC,YAAY,CAAC;QACzC,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,KAAK,EAAE,KAAK;QACZ,SAAS;KACV,CAAC,CAAC;IACH,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC;IACrC,MAAM,KAAK,GAAG;QACZ,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACxB,kBAAkB,CAAC,oBAAoB,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CACvD;QACD,GAAG,2BAA2B,CAAC;YAC7B,SAAS,EAAE,YAAY;YACvB,KAAK,EAAE,YAAY;YACnB,EAAE;YACF,UAAU;YACV,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;YAC7D,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO;YACP,iBAAiB,EAAE,OAAO,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC;YAC7D,GAAG,CAAC,KAAK;gBACP,CAAC,CAAC;oBACE,YAAY,EAAE,qBAAqB,CAAC;wBAClC,OAAO;wBACP,UAAU;wBACV,UAAU,EAAE,iBAAiB,CAAC,OAAO,CAAC,GAAG,CAAC;qBAC3C,CAAC;iBACH;gBACH,CAAC,CAAC,EAAE,CAAC;YACP,cAAc,EAAE,QAAQ;YACxB,SAAS,EAAE,aAAa;YACxB,SAAS;SACV,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,oBAAoB,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;QACrE,GAAG,CAAC,aAAa;YACf,CAAC,CAAC;gBACE,qBAAqB,CAAC;oBACpB,GAAG,EAAE,OAAO,CAAC,GAAG;oBAChB,GAAG,EAAE,OAAO;oBACZ,WAAW,EAAE,kBAAkB;oBAC/B,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE;oBAC/B,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,OAAO,CAAC,OAAO,EAAE;oBAChD,GAAG,CAAC,oBAAoB;wBACtB,CAAC,CAAC,EAAE,SAAS,EAAE,oBAAoB,EAAE;wBACrC,CAAC,CAAC,EAAE,CAAC;oBACP,SAAS,EAAE;wBACT,OAAO,EAAE,cAAc,KAAK,SAAS;wBACrC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBACnE;oBACD,cAAc,EAAE;wBACd,OAAO,EAAE,aAAa,KAAK,SAAS;wBACpC,UAAU,EAAE,GAAG,KAAK,SAAS;wBAC7B,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBACjE;iBACF,CAAC;aACH;YACH,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,YAAY;YACd,CAAC,CAAC;gBACE,eAAe,CAAC;oBACd,OAAO,EAAE,YAAY;oBACrB,YAAY,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI;oBACjC,YAAY,EAAE,GAAG,EAAE;wBACjB,MAAM,OAAO,GAAG,gBAAgB,CAAC;wBACjC,gBAAgB,GAAG,SAAS,CAAC;wBAC7B,OAAO,OAAO,CAAC;oBACjB,CAAC;iBACF,CAAC;gBACF,gBAAgB,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;aAC5C;YACH,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;IAEF,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,uBAAuB,CAAC;QACrC,MAAM;QACN,KAAK;QACL,SAAS;QACT,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;KAC/C,CAAC,CAAC;IACH,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;IACxB,cAAc,EAAE,aAAa,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAE/D,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAE7C,8EAA8E;IAC9E,MAAM,aAAa,GAAG,KAAK,EAAE,MAAc,EAAiB,EAAE;QAC5D,4EAA4E;QAC5E,qCAAqC;QACrC,IAAI,CAAC;YACH,MAAM,qBAAqB,EAAE,CAAC;QAChC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,8CAA8C,MAAM,OAClD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CACjD,IAAI,CACL,CAAC;QACJ,CAAC;QACD,8EAA8E;QAC9E,IAAI,CAAC;YACH,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,cAAc;QAChB,CAAC;IACH,CAAC,CAAC;IAEF,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,MAAM,QAAQ,GAAG,KAAK,EAAE,MAAc,EAAE,EAAE;QACxC,IAAI,YAAY;YAAE,OAAO,CAAC,yDAAyD;QACnF,YAAY,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,WAAW;YACjB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,IAAI,EAAE,YAAY,MAAM,EAAE;SAC3B,CAAC,CAAC;QACH,wEAAwE;QACxE,6EAA6E;QAC7E,4EAA4E;QAC5E,gCAAgC;QAChC,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YACP,cAAc;QAChB,CAAC;QACD,wEAAwE;QACxE,6BAA6B;QAC7B,MAAM,cAAc,EAAE,KAAK,CAAC,uBAAuB,CAAC,CAAC;QACrD,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,kCAAkC;QACpC,CAAC;QACD,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YACP,cAAc;QAChB,CAAC;QACD,wEAAwE;QACxE,6BAA6B;QAC7B,6EAA6E;QAC7E,MAAM,OAAO,CAAC,IAAI,CAAC;YACjB,aAAa,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;YAC5C,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;SAC5D,CAAC,CAAC;QACH,MAAM,iBAAiB,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC3E,MAAM,aAAa,CAAC,YAAY,MAAM,EAAE,CAAC,CAAC;QAC1C,gFAAgF;QAChF,MAAM,cAAc,EAAE,KAAK,CAAC,uBAAuB,CAAC,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,0EAA0E;IAC1E,8EAA8E;IAC9E,+EAA+E;IAC/E,6EAA6E;IAC7E,6EAA6E;IAC7E,2EAA2E;IAC3E,0EAA0E;IAC1E,kEAAkE;IAClE,MAAM,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,KAAK,QAAQ,CAAC,cAAc,CAAC,CAAC;IACrD,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;IAC1D,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC;IAE9D,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpD,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IACtD,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,yEAAyE;AACzE,6EAA6E;AAC7E,gFAAgF;AAChF,6EAA6E;AAC7E,2EAA2E;AAC3E,wDAAwD;AACxD,KAAK,UAAU,eAAe,CAAC,EAC7B,OAAO,EACP,kBAAkB,EAKnB;IACC,IAAI,MAAwD,CAAC;IAC7D,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,kBAAkB,EAAE,CAAC;YACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,oLAAoL,CACrL,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["// MCP server over stdin/stdout. Bootstraps:\n// - Workspace (NodeWorkspaceFS rooted at $CODESIGN_WORKSPACE or ~/.codesign/workspace)\n// - the design session (openLocalDesign) over one lazily booted CE.SDK engine\n// - SseBroadcaster for the viewer\n// - Viewer router + ephemeral localhost listener\n// - design + workspace tool registrations\n// - LocalGatewayClient (IMGLY_GATEWAY_API_KEY or the Clerk session)\n//\n// One engine, one workspace, one MCP session.\n//\n// Startup order matters: everything cheap (workspace, store, viewer listener,\n// tool wiring) runs before `server.connect()` so the MCP handshake replies\n// immediately. The expensive CE.SDK engine init + CDN asset-source fetch are\n// deferred to a background promise (bootstrapEngine) that the first tool call\n// awaits. Doing this work before connect can blow the host's MCP startup\n// timeout on a cold boot — seen as \"fails on add/update, works after Reconnect\".\n//\n// Optional env:\n// CESDK_LICENSE — overrides the build-time-bundled license. Mandatory\n// when no license is baked in (see resolve-license.ts).\n//\n// Logging note: stdout is reserved for MCP protocol traffic. Everything\n// human-facing (errors, progress) goes to stderr.\nimport { randomUUID } from 'node:crypto';\nimport { homedir } from 'node:os';\nimport { fileURLToPath } from 'node:url';\nimport { join as joinPath, resolve as resolvePath } from 'node:path';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport type CreativeEngine from '@cesdk/engine';\nimport { loadNodeAssets } from '../assets/load-node.js';\nimport type { Env } from '../config.js';\nimport {\n errorReportingEnabled,\n placeholderNotices,\n sentryDsn,\n usageTelemetryEnabled,\n viewerDisabled\n} from '../flags/index.js';\nimport {\n diagnosticsFileEnabled,\n diagnosticsToolEnabled,\n resolveDiagnosticsDir,\n resolveEngineIdleTimeoutMs,\n resolveMaxEngines,\n resolveSecret\n} from '../config.js';\nimport {\n NOOP_DIAGNOSTICS_SINK,\n type DiagnosticsSink\n} from '../diagnostics/events.js';\nimport { composeSinks } from '../diagnostics/compose.js';\nimport { FileDiagnosticsSink } from '../diagnostics/file-sink.js';\nimport { createDiagnosticsRouter } from '../diagnostics/router.js';\nimport { toolCallSink } from '../diagnostics/tool-call-adapter.js';\nimport { createDiagnosticsTool } from '../diagnostics/tool.js';\nimport {\n combineSinks,\n UsageTelemetrySink,\n type UsageTelemetrySinkOptions\n} from '../telemetry/usage-sink.js';\nimport { TelemetrySpool } from '../telemetry/spool.js';\nimport {\n ErrorReporter,\n createSentrySend,\n setProcessReporter\n} from '../telemetry/error-reporter.js';\nimport { thrownByModel } from '../telemetry/error-policy.js';\nimport { engineFallbackStack, engineFallbackWarning } from '../tools/engine.js';\nimport {\n HarnessContext,\n type HarnessFields\n} from '../telemetry/harness-context.js';\nimport { withTelemetryCovered } from '../tools/telemetry-wrapper.js';\nimport { createSlotGatedEngine, isPidAlive } from '../engine/engine-slots.js';\nimport {\n forgetDeadSessions,\n closeLocalSession,\n localSessionId\n} from '../sessions/local-session.js';\nimport { SessionStore } from '../sessions/store.js';\nimport { migrateLegacyWorkspace } from '../legacy/migrate.js';\n\nimport { createCodesignMcpServer } from '../server.js';\nimport {\n disposeHeadlessEngine,\n ensureHeadlessEngine\n} from '../tools/engine.js';\nimport {\n createGatewayClient,\n DEMOS,\n wrapEngineCapacity,\n type TelemetrySink\n} from '@imgly/codesign-sdk/internal';\nimport { openLocalDesign } from '../host/local-design.js';\nimport { resolvedEngineFlavor } from '../tools/engine.js';\nimport { installedCesdkVersion } from '../viewer/cesdk-cdn.js';\nimport {\n scratchAudioExtractor,\n slotGatedScratchEngines\n} from '../host/audio-extractor.js';\nimport { buildLocalToolRegistrations } from '../host/local-tools.js';\nimport {\n BroadcastingSessionStore,\n createViewerRouter,\n ViewerUrlBuilder,\n SseBroadcaster,\n startViewerListener\n} from '../viewer/index.js';\nimport { resolveAiPluginAssets } from '../viewer/ai-plugin-assets.js';\nimport { resolveExportPluginAssets } from '../viewer/export-plugin-assets.js';\nimport { viewerVideoExport } from '../viewer/video-export.js';\nimport { engineCapabilities, videoOffAdvice } from '../capability.js';\nimport { NodeWorkspaceFS } from '../workspace/node-fs.js';\nimport { redirectConsoleToStderr } from './redirect-console.js';\nimport { resolveLicense, usesBundledLicense } from './resolve-license.js';\nimport { DEFAULT_DURABLE_ROOT, ensureDurableRoot } from '../durable-root.js';\nimport { IMGLY_CESDK_LICENSE } from './license.generated.js';\nimport { pinOpenSourceCodecs } from './codec-pack.js';\nimport { createAiTokenResolver } from '../auth/ai-token.js';\nimport {\n attemptRedemption,\n promoSuccessLine,\n type RedemptionOutcome\n} from '../auth/auto-redeem.js';\nimport { AUTH_CONFIG } from '../auth/clerk-client.js';\nimport { LoginManager } from '../auth/login-manager.js';\nimport { defaultAuthFile, readAuth } from '../auth/token-store.js';\nimport { createLoginTool, createLogoutTool } from '../tools/login.js';\nimport { pluginSkillsMismatch } from '../plugin-skills.js';\n\nconst DEFAULT_WORKSPACE = joinPath(homedir(), '.codesign', 'workspace');\nconst TELEMETRY_EXIT_FLUSH_MS = 2_000;\nconst TELEMETRY_LATE_FLUSH_MS = 500;\n\nexport function buildDiagnostics(\n env: Env,\n opts: {\n transport: 'stdio' | 'http';\n /**\n * Usage telemetry, or false for none. `fetch` is required so a test can\n * never post to the real endpoint by accident; `spoolDir` keeps unsent\n * events on disk for the next process.\n */\n telemetry:\n | false\n | {\n license: string;\n fetch: typeof globalThis.fetch;\n spoolDir?: string;\n };\n /**\n * Test seam — the same `authFile`/`idFile` pattern diagnostics/status.ts\n * uses. The sink's defaults read the real ~/.codesign/auth.json and MINT\n * the real ~/.codesign/id, so a test that records through a sink built\n * here writes to the developer's actual $HOME.\n */\n telemetryIdentity?: Pick<\n UsageTelemetrySinkOptions,\n 'resolveAccountId' | 'resolveInstallId'\n >;\n /** One id per server process, shared with the error reporter's `runId` tag. */\n runId?: string;\n errorReporter?: ErrorReporter;\n harness?: () => HarnessFields;\n }\n): {\n diag: DiagnosticsSink;\n telemetry: TelemetrySink;\n usageTelemetry: UsageTelemetrySink | undefined;\n dir: string | undefined;\n enabled: boolean;\n} {\n const fileOn = diagnosticsFileEnabled(env);\n let diag: DiagnosticsSink = NOOP_DIAGNOSTICS_SINK;\n let dir: string | undefined;\n const sinks: TelemetrySink[] = [];\n if (fileOn) {\n dir = resolveDiagnosticsDir(env);\n const fileSink = new FileDiagnosticsSink({ dir });\n diag = fileSink;\n sinks.push(toolCallSink(fileSink));\n }\n // Usage telemetry is independent of local diagnostics logging:\n // the usage sink joins the fan-out whenever the flag is on.\n const telemetry = opts.telemetry;\n const spoolDir = telemetry ? telemetry.spoolDir : undefined;\n const usageTelemetry = telemetry\n ? new UsageTelemetrySink({\n transport: opts.transport,\n license: telemetry.license,\n fetch: telemetry.fetch,\n ...(opts.runId ? { runId: opts.runId } : {}),\n ...(spoolDir\n ? {\n spool: (runId: string) =>\n new TelemetrySpool({\n dir: spoolDir,\n pid: process.pid,\n runId,\n isPidAlive\n })\n }\n : {}),\n ...opts.telemetryIdentity,\n ...(opts.harness ? { harness: opts.harness } : {}),\n onEvent: (text, error) =>\n diag.emit({\n kind: 'lifecycle',\n timestamp: Date.now(),\n text,\n ...(error ? { error } : {})\n })\n })\n : undefined;\n if (usageTelemetry) sinks.push(usageTelemetry);\n if (opts.errorReporter) {\n sinks.push(opts.errorReporter);\n diag = composeSinks(diag, opts.errorReporter);\n }\n return {\n diag,\n telemetry: combineSinks(...sinks),\n usageTelemetry,\n dir,\n enabled: fileOn\n };\n}\n\nexport async function runStdio(): Promise<void> {\n let usageTelemetryOn = true;\n try {\n usageTelemetryOn = usageTelemetryEnabled(process.env);\n } catch (err) {\n process.stderr.write(\n `codesign-mcp stdio: ${err instanceof Error ? err.message : String(err)}\\n`\n );\n process.exit(1);\n }\n const harness = new HarnessContext(process.env);\n const runId = randomUUID();\n let errorReporter: ErrorReporter | undefined;\n const created: {\n server?: ReturnType<typeof createCodesignMcpServer>;\n diag?: DiagnosticsSink;\n } = {};\n let cesdkVersion: string | undefined;\n let reportingOn = false;\n try {\n reportingOn = errorReportingEnabled(process.env);\n } catch (err) {\n process.stderr.write(\n `codesign-mcp stdio: ${err instanceof Error ? err.message : String(err)}\\n`\n );\n process.exit(1);\n }\n for (const line of placeholderNotices(process.env))\n process.stderr.write(`${line}\\n`);\n const dsn = sentryDsn(process.env);\n if (reportingOn && dsn) {\n try {\n errorReporter = new ErrorReporter({\n send: await createSentrySend(dsn),\n packageRoot: fileURLToPath(new URL('../..', import.meta.url)).replace(\n /[\\\\/]$/,\n ''\n ),\n context: {\n platform: () => process.platform,\n arch: () => process.arch,\n transport: () => 'stdio',\n engineFlavor: () => resolvedEngineFlavor(),\n cesdkVersion: () => (cesdkVersion ??= installedCesdkVersion()),\n clientName: () => created.server?.getClientVersion()?.name,\n clientVersion: () => created.server?.getClientVersion()?.version,\n runId: () => runId\n },\n harness: () => harness.fields(),\n signedInEmail: async () => (await readAuth(defaultAuthFile()))?.email,\n onFailure: (err) => {\n process.stderr.write(\n `codesign-mcp stdio: error report failed — ${err instanceof Error ? err.message : String(err)}\\n`\n );\n created.diag?.emit({\n kind: 'lifecycle',\n timestamp: Date.now(),\n text: 'error_report_failed'\n });\n }\n });\n setProcessReporter(errorReporter);\n } catch (err) {\n process.stderr.write(\n `codesign-mcp stdio: error reporting unavailable — ${err instanceof Error ? err.message : String(err)}\\n`\n );\n }\n }\n const license = resolveLicense(process.env, IMGLY_CESDK_LICENSE);\n if (!license) {\n process.stderr.write(\n 'codesign-mcp stdio: no CESDK_LICENSE set and no bundled license — set CESDK_LICENSE (or IMGLY_CESDK_LICENSE) to a CE.SDK node license string.\\n'\n );\n process.exit(1);\n }\n const usedBundledLicense = usesBundledLicense(process.env);\n const {\n diag,\n telemetry,\n usageTelemetry,\n dir: diagnosticsDir,\n enabled: diagnosticsEnabled\n } = buildDiagnostics(process.env, {\n transport: 'stdio',\n telemetry: usageTelemetryOn\n ? {\n license,\n fetch: globalThis.fetch,\n spoolDir: joinPath(DEFAULT_DURABLE_ROOT, 'telemetry')\n }\n : false,\n harness: () => harness.fields(),\n runId,\n ...(errorReporter ? { errorReporter } : {})\n });\n created.diag = diag;\n if (diagnosticsEnabled && diagnosticsDir) {\n await FileDiagnosticsSink.pruneOnStartup({ dir: diagnosticsDir });\n process.stderr.write(\n `codesign-mcp stdio: diagnostics logging to ${diagnosticsDir} — redacted, local-only; disable with IMGLY_DIAGNOSTICS_FILE=off\\n`\n );\n }\n // Before any skill reaches the model: the plugin's skills may be another build's.\n const skillsMismatch = pluginSkillsMismatch(process.env);\n if (skillsMismatch) {\n process.stderr.write(`codesign-mcp stdio: ${skillsMismatch}\\n`);\n }\n // stdout is the JSON-RPC channel in stdio mode; keep engine console.* noise off it.\n redirectConsoleToStderr((level, text) =>\n diag.emit({ kind: 'engine_log', timestamp: Date.now(), level, text })\n );\n\n // Video is on wherever the engine can encode it: native, the default off Windows.\n // Advertised from the configuration; a native boot that falls back to WASM\n // is refused per call (host/workspace-files.ts).\n const capabilities = await engineCapabilities();\n const video = capabilities.video;\n // Read once here; a typo'd value fails the boot loudly.\n let noViewer = false;\n try {\n noViewer = viewerDisabled(process.env);\n } catch (err) {\n process.stderr.write(\n `codesign-mcp stdio: ${err instanceof Error ? err.message : String(err)}\\n`\n );\n process.exit(1);\n }\n pinOpenSourceCodecs(process.env, usedBundledLicense);\n\n // ~/.codesign must exist — and be hidden on Windows — before the\n // workspace, codesign-id, and engine-slot subsystems touch it.\n await ensureDurableRoot();\n\n const workspaceRoot = process.env.CODESIGN_WORKSPACE ?? DEFAULT_WORKSPACE;\n const fs = new NodeWorkspaceFS(workspaceRoot);\n\n const broadcaster = new SseBroadcaster();\n\n // The viewer listener binds an ephemeral localhost port — cheap and local, so\n // it stays on the startup path. urlBuilder must exist before we build the tools\n // and before the engine's workspace:// URI resolver is wired.\n // A floating rejection must never kill the server — every session's\n // engine slot and staged scene dies with the process. Facade promises are\n // tracked per edit (edit.ts); this net catches everything else sandbox\n // code can float (fetch, timers), logging instead of crashing — as it does\n // for an uncaught throw the model's code caused.\n process.on('unhandledRejection', (reason) => {\n console.error(\n 'codesign-mcp: unhandled promise rejection (continuing):',\n reason instanceof Error ? (reason.stack ?? reason.message) : reason\n );\n errorReporter?.captureProcess('unhandled_rejection', reason);\n });\n process.on('uncaughtException', (err: unknown) => {\n const text =\n err instanceof Error ? (err.stack ?? err.message) : String(err);\n const byModel = thrownByModel(err);\n errorReporter?.captureProcess('uncaught_exception', err);\n if (byModel) {\n process.stderr.write(\n `codesign-mcp: uncaught exception in edit code (continuing) — ${text}\\n`\n );\n return;\n }\n process.stderr.write(`codesign-mcp: uncaught exception — ${text}\\n`);\n void Promise.all([\n errorReporter?.flush(),\n usageTelemetry?.flush(TELEMETRY_EXIT_FLUSH_MS)\n ]).finally(() => process.exit(1));\n });\n\n const diagnosticsOn = diagnosticsToolEnabled(process.env);\n const diagDir = resolveDiagnosticsDir(process.env);\n\n // Engine boot is DEFERRED to the first engine-using tool call and gated by a\n // machine-wide slot: idle panes hold no engine (~8-12 MB) and no\n // slot; only real design work boots one, and at most IMGLY_MAX_ENGINES\n // engines run across all stdio processes at once. bootstrapEngine still runs\n // OFF the handshake path — it is just triggered lazily now, not eagerly.\n // At capacity, get() throws EngineCapacityError, which wrapEngineCapacity\n // (below) turns into an isError tool result.\n //\n // Built ahead of the viewer router (below) — urlBuilder isn't assigned until\n // after the listener binds, but boot() only runs lazily on the first real\n // `.get()` (well after urlBuilder is set), so closing over it here is safe.\n const gatedEngine = createSlotGatedEngine<CreativeEngine>({\n max: resolveMaxEngines(process.env),\n boot: () => {\n diag.emit({\n kind: 'lifecycle',\n timestamp: Date.now(),\n text: 'engine_init_start'\n });\n const p = bootstrapEngine({ license, usedBundledLicense });\n void p\n .then(() => {\n diag.emit({\n kind: 'lifecycle',\n timestamp: Date.now(),\n text: 'engine_init_done'\n });\n const fallback = engineFallbackWarning();\n if (fallback)\n diag.emit({\n kind: 'lifecycle',\n timestamp: Date.now(),\n text: 'engine_fallback',\n error: { message: fallback, stack: engineFallbackStack() }\n });\n })\n .catch(() => {\n // rejection is surfaced by the catch below — never unhandled here\n });\n // Surface a background init failure on stderr + diagnostics. The awaiting\n // tool call still sees the real error; this just avoids a silent gap.\n void p.catch((err) => {\n process.stderr.write(\n `codesign-mcp stdio: engine initialization failed — ${\n err instanceof Error ? (err.stack ?? err.message) : String(err)\n }\\n`\n );\n diag.emit({\n kind: 'lifecycle',\n timestamp: Date.now(),\n text: 'engine_init_failed',\n error: {\n message: err instanceof Error ? err.message : String(err),\n ...(err instanceof Error && err.stack ? { stack: err.stack } : {})\n }\n });\n });\n return p;\n }\n });\n\n // Session-model wiring. One stdio process serves one client, so one\n // session and one current design for everything on this connection.\n // Broadcasting: a save is the one event the viewer reacts to, and\n // `saveDesign` is the only method that writes one. Checkpoints inherit\n // unchanged, so twenty `edit` calls move nothing in an open tab.\n const sessionStore = new BroadcastingSessionStore(fs, broadcaster);\n\n // A workspace the revision model wrote: bring over what it holds that this\n // version has not seen yet, on every boot, since a user may switch back and\n // forth. Awaited BEFORE server.connect(): a file copy, not an engine boot,\n // and nothing can save over a design while it runs.\n //\n // A PLAIN store here on purpose: restoring forty old designs is not forty\n // saves anyone made, and this runs before the listener exists anyway.\n const migration = await migrateLegacyWorkspace({\n fs,\n sessionStore: new SessionStore(fs)\n });\n if (migration) {\n // A skipped design is the one thing here a user may need to act on, so it\n // gets its own line rather than a count.\n for (const skip of migration.skipped) {\n process.stderr.write(\n `codesign-mcp stdio: could not migrate design ${skip.root} — ${skip.reason}\\n`\n );\n }\n for (const both of migration.keptBoth) {\n process.stderr.write(\n `codesign-mcp stdio: design ${both.root} changed on both versions — kept the saved one; the old version's newest state is design ${both.designId}\\n`\n );\n }\n process.stderr.write(\n `codesign-mcp stdio: migrated ${migration.migrated.length} design(s) from pre-0.4 revision history, kept ${migration.keptBoth.length} twice, skipped ${migration.skipped.length}\\n`\n );\n diag.emit({\n kind: 'lifecycle',\n timestamp: Date.now(),\n text: `legacy_migration:migrated=${migration.migrated.length},keptBoth=${migration.keptBoth.length},skipped=${migration.skipped.length}`\n });\n }\n\n // A new process is a new conversation with its own draft; it resumes a design only by `open`.\n const localSession = localSessionId();\n await forgetDeadSessions(sessionStore).catch(() => undefined);\n\n // IMG.LY SSO login (identity-only). The callback route rides the existing\n // loopback listener.\n //\n // Computed ahead of the viewer router (below) — /api/ai-token needs the\n // same gatewayKey/loginManager precedence as the gateway client just below.\n const authConfig = AUTH_CONFIG;\n const loginManager = authConfig\n ? new LoginManager({ config: authConfig, authFile: defaultAuthFile() })\n : undefined;\n // Campaign auto-redeem (spec 2026-07-31-auto-promo-redemption-design.md):\n // the login-completion hook is awaited ~5s so the signed-in page and the\n // next `login` confirm call can carry the outcome; the fire-and-forget\n // server-start attempt covers accounts that signed in before this\n // shipped. Failures are silent everywhere by design, and attemptRedemption\n // resolves undefined when it has nothing conclusive (including when the\n // campaign constant is empty).\n let lastPromoOutcome: RedemptionOutcome | undefined;\n if (loginManager) {\n const gatewayBase = process.env.IMGLY_GATEWAY_BASE_URL;\n loginManager.onSignedIn = async () => {\n const outcome = await attemptRedemption({\n loginManager,\n timeoutMs: 5_000,\n ...(gatewayBase ? { gatewayBaseUrl: gatewayBase } : {})\n });\n if (outcome?.outcome !== 'redeemed') return undefined;\n lastPromoOutcome = outcome;\n return promoSuccessLine(outcome);\n };\n void attemptRedemption({\n loginManager,\n ...(gatewayBase ? { gatewayBaseUrl: gatewayBase } : {})\n });\n }\n // Gateway credentials resolve per request: an explicit IMGLY_GATEWAY_API_KEY\n // (headless/CI) wins over the interactive Clerk session; with neither\n // SOURCE configured the client is unconfigured and asset_generate stays\n // hidden from tools/list.\n const { value: gatewayKey, problem: gatewayKeyProblem } = resolveSecret(\n 'IMGLY_GATEWAY_API_KEY',\n process.env\n );\n if (gatewayKeyProblem)\n process.stderr.write(\n `codesign-mcp stdio: ${gatewayKeyProblem} Starting without it: asset_generate needs the key or a \\`login\\`.\\n`\n );\n const aiToken = createAiTokenResolver({\n ...(gatewayKey ? { gatewayKey } : {}),\n ...(loginManager ? { loginManager } : {}),\n ...(process.env.IMGLY_GATEWAY_BASE_URL\n ? { gatewayBaseUrl: process.env.IMGLY_GATEWAY_BASE_URL }\n : {})\n });\n const gateway = createGatewayClient({\n bearer: async (opts) =>\n gatewayKey ??\n (loginManager\n ? (\n await loginManager.ensureFreshTokens({\n force: opts?.forceRefresh === true\n })\n )?.accessToken\n : undefined),\n ...(process.env.IMGLY_GATEWAY_BASE_URL\n ? { baseURL: process.env.IMGLY_GATEWAY_BASE_URL }\n : {})\n });\n\n let viewerBase = '';\n const viewerRouter = createViewerRouter({\n store: sessionStore,\n fs,\n broadcaster,\n cesdkLicense: license,\n workspaceRoot,\n videoExport: viewerVideoExport({\n capability: () => engineCapabilities(),\n // `design` is opened below; the route only fires after startup.\n readEngine: (fn) => design.readEngine(fn)\n }),\n aiPluginAssets: resolveAiPluginAssets(),\n exportPluginAssets: resolveExportPluginAssets(),\n // Only wire the resolver when a credential source actually exists — a\n // credential-less server must report aiEditor: false (createViewerRouter\n // derives it from Boolean(opts.aiToken)) so the editor skips AI wiring\n // entirely and /api/ai-token 501s, instead of always returning 503 from a\n // resolver that can never succeed.\n ...(gatewayKey || loginManager ? { aiToken } : {}),\n ...(process.env.IMGLY_GATEWAY_BASE_URL\n ? { gatewayBaseUrl: process.env.IMGLY_GATEWAY_BASE_URL }\n : {}),\n ...(loginManager\n ? {\n loginStart: () =>\n loginManager.startLogin({ callbackBase: viewerBase })\n }\n : {})\n });\n const diagnosticsRouter = diagnosticsOn\n ? createDiagnosticsRouter({ diag, dir: diagDir, env: process.env })\n : undefined;\n const extraRouters = [\n ...(diagnosticsRouter ? [diagnosticsRouter] : []),\n ...(loginManager ? [loginManager.router] : [])\n ];\n const listener = await startViewerListener({\n router: viewerRouter,\n ...(extraRouters.length ? { extraRouters } : {})\n });\n viewerBase = listener.base;\n // The listener always runs — the engine resolves every `workspace://` through\n // its `/r/` route. Only the human-facing announcement is withheld.\n if (!noViewer)\n process.stderr.write(`codesign-mcp stdio: viewer at ${listener.base}\\n`);\n if (authConfig) {\n process.stderr.write(\n `codesign-mcp stdio: IMG.LY login enabled (issuer ${authConfig.issuer})\\n`\n );\n }\n diag.emit({\n kind: 'lifecycle',\n timestamp: Date.now(),\n text: 'viewer_listening'\n });\n const urlBuilder = new ViewerUrlBuilder({ base: listener.base });\n const diagnosticsViewerUrl =\n diagnosticsOn && !noViewer ? urlBuilder.forDiagnostics() : undefined;\n\n const localRoot = noViewer ? resolvePath(workspaceRoot) : undefined;\n const design = await openLocalDesign({\n fs,\n store: sessionStore,\n sessionId: localSession,\n urlBuilder,\n boot: () => gatedEngine.get(),\n dispose: async () => {\n if (shuttingDown) return; // shutdown releases the engine itself\n await releaseEngine('idle');\n diag.emit({\n kind: 'lifecycle',\n timestamp: Date.now(),\n text: 'engine_idle_evicted'\n });\n },\n scratch: slotGatedScratchEngines({\n license,\n maxEngines: resolveMaxEngines(process.env)\n }),\n idleMs: resolveEngineIdleTimeoutMs(process.env),\n engineFlavor: resolvedEngineFlavor,\n video,\n videoAdvice: videoOffAdvice(capabilities),\n ...(localRoot !== undefined ? { localRoot } : {}),\n demos: DEMOS,\n telemetry\n });\n const designSession = design.session;\n const tools = [\n ...design.tools.map((t) =>\n wrapEngineCapacity(withTelemetryCovered(t, telemetry))\n ),\n ...buildLocalToolRegistrations({\n sessionId: localSession,\n store: sessionStore,\n fs,\n urlBuilder,\n withEngine: (fn) => design.readEngine((engine) => fn(engine)),\n session: design.session,\n gateway,\n gatewayConfigured: Boolean(gatewayKey) || Boolean(authConfig),\n ...(video\n ? {\n extractAudio: scratchAudioExtractor({\n license,\n urlBuilder,\n maxEngines: resolveMaxEngines(process.env)\n })\n }\n : {}),\n viewerDisabled: noViewer,\n localRoot: workspaceRoot,\n telemetry\n }).map((t) => wrapEngineCapacity(withTelemetryCovered(t, telemetry))),\n ...(diagnosticsOn\n ? [\n createDiagnosticsTool({\n env: process.env,\n dir: diagDir,\n fileLogging: diagnosticsEnabled,\n harness: () => harness.fields(),\n flush: () => diag.flush?.() ?? Promise.resolve(),\n ...(diagnosticsViewerUrl\n ? { viewerUrl: diagnosticsViewerUrl }\n : {}),\n telemetry: {\n enabled: usageTelemetry !== undefined,\n ...(usageTelemetry ? { stats: () => usageTelemetry.stats() } : {})\n },\n errorReporting: {\n enabled: errorReporter !== undefined,\n configured: dsn !== undefined,\n ...(errorReporter ? { stats: () => errorReporter.stats() } : {})\n }\n })\n ]\n : []),\n ...(loginManager\n ? [\n createLoginTool({\n manager: loginManager,\n callbackBase: () => listener.base,\n promoOutcome: () => {\n const outcome = lastPromoOutcome;\n lastPromoOutcome = undefined;\n return outcome;\n }\n }),\n createLogoutTool({ manager: loginManager })\n ]\n : [])\n ];\n\n const assets = loadNodeAssets();\n const server = createCodesignMcpServer({\n assets,\n tools,\n telemetry,\n onToolCallMeta: (m) => harness.noteCallMeta(m)\n });\n created.server = server;\n usageTelemetry?.setClientInfo(() => server.getClientVersion());\n\n const transport = new StdioServerTransport();\n\n // Dispose the engine and free its machine-wide slot; best-effort, idempotent.\n const releaseEngine = async (reason: string): Promise<void> => {\n // Release the CE.SDK engine (WASM/native runtime) deterministically instead\n // of leaving it to process teardown.\n try {\n await disposeHeadlessEngine();\n } catch (err) {\n process.stderr.write(\n `codesign-mcp stdio: engine dispose failed (${reason}) — ${\n err instanceof Error ? err.message : String(err)\n }\\n`\n );\n }\n // Clean path; SIGKILL is covered by PID-liveness reaping on the next acquire.\n try {\n await gatedEngine.release();\n } catch {\n // best-effort\n }\n };\n\n let shuttingDown = false;\n const shutdown = async (reason: string) => {\n if (shuttingDown) return; // idempotent — a signal and the transport close can race\n shuttingDown = true;\n diag.emit({\n kind: 'lifecycle',\n timestamp: Date.now(),\n text: `shutdown:${reason}`\n });\n // Flush the breadcrumb NOW, before the slower teardown below. emit() is\n // fire-and-forget, engine dispose can take seconds, and a client may SIGKILL\n // after a short grace window — landing the event first lets it survive even\n // if we're killed mid-teardown.\n try {\n await diag.flush?.();\n } catch {\n // best-effort\n }\n // Same reasoning for held usage events; what misses the window stays on\n // disk for the next process.\n await usageTelemetry?.flush(TELEMETRY_EXIT_FLUSH_MS);\n try {\n await listener.close();\n } catch {\n // best-effort — keep tearing down\n }\n try {\n await server.close();\n } catch {\n // best-effort\n }\n // Engine teardown comes AFTER server.close() so no tool call can arrive\n // against a disposed engine.\n // A call that never settles (a long encode) must not keep the process alive.\n await Promise.race([\n designSession.close().catch(() => undefined),\n new Promise((resolve) => setTimeout(resolve, 5000).unref())\n ]);\n await closeLocalSession(sessionStore, localSession).catch(() => undefined);\n await releaseEngine(`shutdown:${reason}`);\n // Calls that finished during the teardown above recorded after the first flush.\n await usageTelemetry?.flush(TELEMETRY_LATE_FLUSH_MS);\n process.exit(0);\n };\n\n // A client can disconnect by closing the stdio pipe (stdin EOF) WITHOUT a\n // signal — e.g. an orphaned/crashed host. `StdioServerTransport` only listens\n // for stdin `data`/`error`, never EOF, so it never surfaces that disconnect on\n // its own; the viewer listener's open socket then keeps the event loop alive\n // and the process lingers with the engine resident. So detect stdin EOF here\n // and reap. Listeners are attached before connect() (which puts stdin into\n // flowing mode) so we can't miss the `end`. `server.onclose` additionally\n // covers a protocol-level close routed through transport.close().\n server.onclose = () => void shutdown('server-close');\n process.stdin.on('end', () => void shutdown('stdin-end'));\n process.stdin.on('close', () => void shutdown('stdin-close'));\n\n await server.connect(transport);\n\n process.on('SIGINT', () => void shutdown('SIGINT'));\n process.on('SIGTERM', () => void shutdown('SIGTERM'));\n process.on('SIGHUP', () => void shutdown('SIGHUP'));\n}\n\n// Heavy engine bootstrap, run in the background by runStdio (off the MCP\n// handshake path). Resolves to a fully-wired engine: design-unit-patched (by\n// ensureHeadlessEngine), workspace:// URI resolver installed, and — best-effort\n// — the default + demo asset sources registered so asset_search has content.\n// The asset-source step hits the CDN; failures log to stderr and leave the\n// engine usable (asset_search just sees fewer sources).\nasync function bootstrapEngine({\n license,\n usedBundledLicense\n}: {\n license: string;\n /** License came from the bundled license — turns an init rejection into a hint. */\n usedBundledLicense: boolean;\n}): Promise<Awaited<ReturnType<typeof ensureHeadlessEngine>>> {\n let engine: Awaited<ReturnType<typeof ensureHeadlessEngine>>;\n try {\n engine = await ensureHeadlessEngine(license);\n } catch (err) {\n if (usedBundledLicense) {\n process.stderr.write(\n 'codesign-mcp stdio: the bundled license was rejected (it covers only the engine version this build was published with). Set CESDK_LICENSE to a valid CE.SDK node license string.\\n'\n );\n }\n throw err;\n }\n return engine;\n}\n"]}
@@ -94,7 +94,7 @@ export interface StatusReport {
94
94
  };
95
95
  login: {
96
96
  configured: boolean;
97
- /** Resolved Clerk issuer (baked default or env override); null when unconfigured. Non-secret. */
97
+ /** The Clerk issuer (fixed in code). Non-secret. */
98
98
  issuer: string | null;
99
99
  signedIn: boolean;
100
100
  accessTokenExpiresAt: number | null;
@@ -1 +1 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/diagnostics/status.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/diagnostics/status.ts"],"names":[],"mappings":"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"}
@@ -13,7 +13,7 @@ import { engineCapabilities } from '../capability.js';
13
13
  import { errorReportingDecision, telemetryDecision, viewerDisabled } from '../flags/index.js';
14
14
  import { pluginSkills } from '../plugin-skills.js';
15
15
  import { CHANNEL } from '../flags/channel.js';
16
- import { resolveAuthConfig } from '../auth/clerk-client.js';
16
+ import { AUTH_CONFIG } from '../auth/clerk-client.js';
17
17
  import { defaultAuthFile, readAuth } from '../auth/token-store.js';
18
18
  import { defaultRedemptionsFile, PROMO_CODE, readRedemptionOutcome } from '../auth/auto-redeem.js';
19
19
  import { readCodesignId } from '../engine/codesign-id.js';
@@ -92,7 +92,7 @@ function envStrings(env) {
92
92
  function gatewayFields(env) {
93
93
  const key = resolveSecret('IMGLY_GATEWAY_API_KEY', env);
94
94
  return {
95
- gatewayConfigured: Boolean(key.value) || Boolean(resolveAuthConfig(env)),
95
+ gatewayConfigured: true,
96
96
  gatewayKeyError: key.problem ?? null
97
97
  };
98
98
  }
@@ -154,7 +154,6 @@ async function streamState(dir) {
154
154
  }
155
155
  async function buildLogin(opts) {
156
156
  const storedAuth = await readAuth(opts.authFile ?? defaultAuthFile());
157
- const authConfig = resolveAuthConfig(opts.env);
158
157
  const promoCode = opts.promoCode ?? PROMO_CODE;
159
158
  let promoRedemption = 'off';
160
159
  if (promoCode)
@@ -166,8 +165,8 @@ async function buildLogin(opts) {
166
165
  })) ?? 'pending')
167
166
  : 'pending';
168
167
  return {
169
- configured: Boolean(authConfig),
170
- issuer: authConfig?.issuer ?? null,
168
+ configured: true,
169
+ issuer: AUTH_CONFIG.issuer,
171
170
  signedIn: Boolean(storedAuth),
172
171
  accessTokenExpiresAt: storedAuth?.accessTokenExpiresAt ?? null,
173
172
  promoRedemption
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/diagnostics/status.ts"],"names":[],"mappings":"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","sourcesContent":["// packages/codesign-mcp/src/diagnostics/status.ts\n//\n// The `diagnostics` tool's `status` payload: what's running (versions) + a\n// NON-SECRET config block. Assembled from direct env reads (never loadConfig,\n// which requires a license and would throw), so status never fails on a partial\n// config. Secrets appear only as a presence boolean (gatewayConfigured). See\n// AGENTS.md — new config knobs should be surfaced here.\nimport { stat } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type { Env } from '../config.js';\nimport {\n resolveEngineIdleTimeoutMs,\n resolveMaxEngines,\n resolveSecret\n} from '../config.js';\nimport {\n DEFAULT_ASSETS_BASE_URL,\n DEFAULT_GFONTS_CONTENT_URL\n} from '../engine/asset-sources.js';\nimport { engineCapabilities } from '../capability.js';\nimport {\n errorReportingDecision,\n telemetryDecision,\n viewerDisabled,\n type DecidedBy\n} from '../flags/index.js';\nimport { pluginSkills } from '../plugin-skills.js';\nimport { CHANNEL } from '../flags/channel.js';\nimport type { Channel } from '../flags/manifest.js';\nimport { resolveAuthConfig } from '../auth/clerk-client.js';\nimport { defaultAuthFile, readAuth } from '../auth/token-store.js';\nimport {\n defaultRedemptionsFile,\n PROMO_CODE,\n readRedemptionOutcome\n} from '../auth/auto-redeem.js';\nimport { readCodesignId } from '../engine/codesign-id.js';\nimport { DEFAULT_DURABLE_ROOT } from '../durable-root.js';\nimport { buildBundleMeta } from './bundle.js';\nimport {\n engineFallbackWarning,\n engineReason,\n headlessEngineBooted,\n resolvedEngineFlavor,\n resolvedEngineReason,\n type EngineFlavor,\n type EngineReason\n} from '../tools/engine.js';\nimport { aiPluginsVersion } from '../viewer/ai-plugin-assets.js';\nimport type { TelemetrySinkStats } from '../telemetry/usage-sink.js';\nimport {\n internalUserName,\n type ErrorReporterStats\n} from '../telemetry/error-reporter.js';\nimport type { HarnessFields } from '../telemetry/harness-context.js';\n\nexport interface StatusReport {\n mcp: { buildId: string; node: string; os: string; arch: string };\n cesdkEngine: string;\n config: {\n maxEngines: number;\n /**\n * stdio: how long an untouched server keeps its engine before disposing it\n * and handing its slot back (IMGLY_ENGINE_IDLE_TIMEOUT). 0 = never.\n */\n engineIdleTimeoutSec: number;\n /** Harness context sent with error reports and usage telemetry (model, entrypoint, …); never a session id or path. */\n harness: HarnessFields;\n /** Whether an engine is resident right now. False is normal after an idle eviction. */\n engineBooted: boolean;\n /** A credential SOURCE for asset_generate exists: gateway API key, or (stdio only) IMG.LY auth config. */\n gatewayConfigured: boolean;\n /** Why IMGLY_GATEWAY_API_KEY_FILE gave no key (never its value); null when it is unset or read. */\n gatewayKeyError: string | null;\n gatewayBaseUrl: string;\n engine: string;\n /** The engine this server runs, or will boot, and why: `wasm (windows default)`, `native (default)`, `native (IMGLY_CESDK_ENGINE=native)`, `wasm (IMGLY_CESDK_ENGINE=wasm)`, `wasm (native failed to start)`. */\n engineChoice: string;\n engineResolved: EngineFlavor | null;\n /** Why the engine fell back to WASM (engineResolved 'wasm-fallback'); null otherwise. */\n engineFallbackReason: string | null;\n /** Whether the running engine can do video/audio (native); null until the engine boots. */\n videoAvailable: boolean | null;\n /** UBQ_AV_CODECS: the native engine's codec set — `oss`, `fluendo`, or `auto` (the engine picks; Fluendo when a codec pack is installed). stdio pins `oss` on the bundled licence. */\n avCodecs: string;\n /** IMGLY_DISABLE_VIEWER: true → no `view` tool, and deliverables come back\n * as `file://` paths instead of viewer URLs. */\n viewerDisabled: boolean;\n /** The skills version the spawning plugin ships, and whether it is this build's. */\n pluginSkillsVersion: string | null;\n pluginSkillsMatch: boolean | null;\n /** Build profile this bundle was compiled for: stable | next | canary. A\n * canary requires the native engine, so the right support answer differs\n * by channel — report it rather than inferring it from the flags below. */\n channel: Channel;\n /** IMGLY_TELEMETRY, and on only with the bundled licence: usage events posted to IMG.LY. */\n telemetryEnabled: boolean;\n /** Which variable decided the usage-telemetry switch: DO_NOT_TRACK, IMGLY_TELEMETRY, IMGLY_PLUGIN_TELEMETRY, an unexpanded plugin setting, or the default. */\n telemetryDecidedBy: DecidedBy | null;\n telemetrySent: number | null;\n telemetryBuffered: number | null;\n telemetryDropped: number | null;\n /** Events lost while building the payload, as opposed to evicted from a full buffer (`telemetryDropped`). Non-zero means a breadcrumb was written to stderr. */\n telemetryFailed: number | null;\n /** Random per-process UUID stamped on every telemetry event (the `runId` envelope field) — the join key between a support case and its warehouse rows. Not a secret; null when telemetry is off. */\n telemetryRunId: string | null;\n /** The `installId` envelope field: `~/.codesign/id`, or this process's `telemetryRunId` when that id could not be minted. Equal to `telemetryRunId` ⇒ degraded, and this machine is not countable as an install. Null before the first event. */\n telemetryInstallId: string | null;\n /** A reporter was built: reporting is on, a DSN is present and the Sentry client started. */\n errorReportingEnabled: boolean;\n /** A DSN is present, whether or not reporting is on. */\n errorReportingConfigured: boolean;\n /** Which variable decided the error-report switch; errorReportingConfigured explains a missing DSN. */\n errorReportingDecidedBy: DecidedBy | null;\n errorReportsSent: number | null;\n /** Not sent: a repeat, over the per-process cap, a licence rejection, or a process error nobody can place. */\n errorReportsDropped: number | null;\n errorReportsFailed: number | null;\n errorReportLastEventId: string | null;\n /** Error reports go out tagged internal, with the name part of the account's email: reporting is on and an @img.ly account is signed in. The email itself is not shown. */\n errorReportInternal: boolean;\n defaultAssetsBaseUrl: string;\n /** Google Fonts catalog manifest (ly.img.gfonts) — pinned default or IMGLY_GFONTS_CONTENT_URL override. */\n gfontsContentUrl: string;\n /** Stable codesign ID (~/.codesign/id, the engine's userId). A random UUID — not a secret — so the value is shown; null before first engine boot. */\n codesignId: string | null;\n /** The durable root (~/.codesign): workspace, auth, id, engine-slots. Fixed path, not configurable — surfaced for support. */\n durableRoot: string;\n /** Installed @imgly/plugin-ai-* version served to the editor, or null when unresolvable. */\n aiPluginsVersion: string | null;\n };\n diagnostics: {\n toolEnabled: boolean;\n fileLogging: boolean;\n dir: string;\n streamPresent: boolean;\n lastActivity: number | null;\n };\n login: {\n configured: boolean;\n /** Resolved Clerk issuer (baked default or env override); null when unconfigured. Non-secret. */\n issuer: string | null;\n signedIn: boolean;\n accessTokenExpiresAt: number | null;\n /** Campaign auto-redeem state for the signed-in account: 'off' = no campaign code baked in; 'pending' = signed out or not yet attempted conclusively. The code value itself is never surfaced. */\n promoRedemption: 'off' | 'pending' | 'redeemed' | 'rejected';\n };\n}\n\n// Status never throws (see header): an unparseable IMGLY_ENGINE_IDLE_TIMEOUT —\n// which fails the boot elsewhere — reports as the default here.\nfunction engineIdleSecSafe(env: Env): number {\n try {\n return resolveEngineIdleTimeoutMs(env) / 1000;\n } catch {\n return 300;\n }\n}\n\n// Status never throws (see header): an invalid value — which fails the boot\n// elsewhere — reports as the default here.\nfunction viewerFlagSafe(env: Env): boolean {\n try {\n return viewerDisabled(env);\n } catch {\n return false;\n }\n}\n\nfunction decidedBySafe(\n decide: () => { decidedBy: DecidedBy }\n): DecidedBy | null {\n try {\n return decide().decidedBy;\n } catch {\n return null;\n }\n}\n\nfunction errorReportingFields(r: StatusOptions['errorReporting']) {\n return {\n errorReportingEnabled: r?.enabled ?? false,\n errorReportingConfigured: r?.configured ?? false,\n errorReportsSent: r?.stats?.sent ?? null,\n errorReportsDropped: r?.stats?.dropped ?? null,\n errorReportsFailed: r?.stats?.failed ?? null,\n errorReportLastEventId: r?.stats?.lastEventId ?? null\n };\n}\n\n/** The telemetry counters, all null when no sink is attached. */\nfunction telemetryFields(\n telemetry: StatusOptions['telemetry']\n): Pick<\n StatusReport['config'],\n | 'telemetryEnabled'\n | 'telemetrySent'\n | 'telemetryBuffered'\n | 'telemetryDropped'\n | 'telemetryFailed'\n | 'telemetryRunId'\n | 'telemetryInstallId'\n> {\n const stats = telemetry?.stats;\n return {\n telemetryEnabled: telemetry?.enabled ?? false,\n telemetrySent: stats?.sent ?? null,\n telemetryBuffered: stats?.buffered ?? null,\n telemetryDropped: stats?.dropped ?? null,\n telemetryFailed: stats?.failed ?? null,\n telemetryRunId: stats?.runId ?? null,\n telemetryInstallId: stats?.installId ?? null\n };\n}\n\n/** Env knobs that are a plain string with a default. */\nconst ENV_STRINGS = {\n gatewayBaseUrl: ['IMGLY_GATEWAY_BASE_URL', 'https://gateway.img.ly'],\n defaultAssetsBaseUrl: [\n 'IMGLY_DEFAULT_ASSETS_BASE_URL',\n DEFAULT_ASSETS_BASE_URL\n ],\n gfontsContentUrl: ['IMGLY_GFONTS_CONTENT_URL', DEFAULT_GFONTS_CONTENT_URL]\n} as const satisfies Record<string, readonly [string, string]>;\n\nfunction envStrings(env: Env): Record<keyof typeof ENV_STRINGS, string> {\n const out = {} as Record<keyof typeof ENV_STRINGS, string>;\n for (const [field, [key, fallback]] of Object.entries(ENV_STRINGS) as [\n keyof typeof ENV_STRINGS,\n readonly [string, string]\n ][])\n out[field] = env[key] ?? fallback;\n return out;\n}\n\n/** A credential SOURCE for asset_generate (gateway API key or IMG.LY auth config), and why a key file gave none. */\nfunction gatewayFields(\n env: Env\n): Pick<StatusReport['config'], 'gatewayConfigured' | 'gatewayKeyError'> {\n const key = resolveSecret('IMGLY_GATEWAY_API_KEY', env);\n return {\n gatewayConfigured: Boolean(key.value) || Boolean(resolveAuthConfig(env)),\n gatewayKeyError: key.problem ?? null\n };\n}\n\nfunction engineChoice(flavor: EngineFlavor, reason: EngineReason): string {\n if (flavor === 'wasm-fallback') return 'wasm (native failed to start)';\n if (reason === 'IMGLY_CESDK_ENGINE') {\n return `${flavor} (IMGLY_CESDK_ENGINE=${flavor})`;\n }\n return `${flavor} (${reason === 'windows-default' ? 'windows default' : 'default'})`;\n}\n\nasync function buildConfig(\n opts: StatusOptions\n): Promise<StatusReport['config']> {\n const { env, platform = process.platform } = opts;\n const plugin = pluginSkills(env);\n const flavor = resolvedEngineFlavor();\n const reason =\n resolvedEngineReason() ?? engineReason(env.IMGLY_CESDK_ENGINE, platform);\n const planned =\n flavor ??\n (reason === 'windows-default' || env.IMGLY_CESDK_ENGINE === 'wasm'\n ? 'wasm'\n : 'native');\n return {\n maxEngines: resolveMaxEngines(env),\n // What turns maxEngines into a cap on ACTIVE engines rather than on open\n // sessions. Never throws on a bad value: status must always render.\n engineIdleTimeoutSec: engineIdleSecSafe(env),\n harness: opts.harness ?? {},\n engineBooted: headlessEngineBooted(),\n ...envStrings(env),\n ...gatewayFields(env),\n engine: env.IMGLY_CESDK_ENGINE || 'default',\n engineChoice: engineChoice(planned, reason),\n engineResolved: flavor ?? null,\n engineFallbackReason: engineFallbackWarning() ?? null,\n videoAvailable:\n flavor === undefined && planned === 'native'\n ? null\n : (await engineCapabilities({ env, platform })).video,\n avCodecs: env.UBQ_AV_CODECS || 'auto',\n viewerDisabled: viewerFlagSafe(env),\n pluginSkillsVersion: plugin?.version ?? null,\n pluginSkillsMatch: plugin?.matches ?? null,\n channel: CHANNEL,\n ...telemetryFields(opts.telemetry),\n ...errorReportingFields(opts.errorReporting),\n telemetryDecidedBy: decidedBySafe(() => telemetryDecision(env)),\n errorReportingDecidedBy: decidedBySafe(() => errorReportingDecision(env)),\n errorReportInternal:\n (opts.errorReporting?.enabled ?? false) &&\n internalUserName(\n (await readAuth(opts.authFile ?? defaultAuthFile()))?.email\n ) !== undefined,\n codesignId: await readCodesignId(opts.idFile),\n durableRoot: DEFAULT_DURABLE_ROOT,\n aiPluginsVersion: aiPluginsVersion()\n };\n}\n\n/** The diagnostics stream's presence and last write, if it exists at all. */\nasync function streamState(\n dir: string\n): Promise<\n Pick<StatusReport['diagnostics'], 'streamPresent' | 'lastActivity'>\n> {\n const s = await stat(join(dir, 'diagnostics.ndjson')).catch(() => null);\n return s\n ? { streamPresent: true, lastActivity: Math.round(s.mtimeMs) }\n : { streamPresent: false, lastActivity: null };\n}\n\nasync function buildLogin(opts: StatusOptions): Promise<StatusReport['login']> {\n const storedAuth = await readAuth(opts.authFile ?? defaultAuthFile());\n const authConfig = resolveAuthConfig(opts.env);\n const promoCode = opts.promoCode ?? PROMO_CODE;\n let promoRedemption: StatusReport['login']['promoRedemption'] = 'off';\n if (promoCode)\n promoRedemption = storedAuth\n ? ((await readRedemptionOutcome({\n subject: storedAuth.subject,\n code: promoCode,\n recordFile: opts.redemptionsFile ?? defaultRedemptionsFile()\n })) ?? 'pending')\n : 'pending';\n return {\n configured: Boolean(authConfig),\n issuer: authConfig?.issuer ?? null,\n signedIn: Boolean(storedAuth),\n accessTokenExpiresAt: storedAuth?.accessTokenExpiresAt ?? null,\n promoRedemption\n };\n}\n\nexport interface StatusOptions {\n env: Env;\n dir: string;\n fileLogging: boolean;\n toolEnabled: boolean;\n harness?: HarnessFields;\n authFile?: string;\n idFile?: string;\n /** Test seam. Default: process.platform. */\n platform?: NodeJS.Platform;\n /** Test seam. Default: the baked PROMO_CODE. */\n promoCode?: string;\n /** Test seam. Default: ~/.codesign/redemptions.json. */\n redemptionsFile?: string;\n telemetry?: {\n enabled: boolean;\n stats?: TelemetrySinkStats;\n };\n errorReporting?: {\n enabled: boolean;\n configured: boolean;\n stats?: ErrorReporterStats;\n };\n}\n\nexport async function buildStatusReport(\n opts: StatusOptions\n): Promise<StatusReport> {\n const { env, dir, fileLogging, toolEnabled } = opts;\n const meta = buildBundleMeta(env) as {\n buildId: string;\n os: string;\n arch: string;\n node: string;\n cesdkEngine: string;\n };\n return {\n mcp: {\n buildId: meta.buildId,\n node: meta.node,\n os: meta.os,\n arch: meta.arch\n },\n cesdkEngine: meta.cesdkEngine,\n config: await buildConfig(opts),\n diagnostics: {\n toolEnabled,\n fileLogging,\n dir,\n ...(await streamState(dir))\n },\n login: await buildLogin(opts)\n };\n}\n"]}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/diagnostics/status.ts"],"names":[],"mappings":"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","sourcesContent":["// packages/codesign-mcp/src/diagnostics/status.ts\n//\n// The `diagnostics` tool's `status` payload: what's running (versions) + a\n// NON-SECRET config block. Assembled from direct env reads (never loadConfig,\n// which requires a license and would throw), so status never fails on a partial\n// config. Secrets appear only as a presence boolean (gatewayConfigured). See\n// AGENTS.md — new config knobs should be surfaced here.\nimport { stat } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type { Env } from '../config.js';\nimport {\n resolveEngineIdleTimeoutMs,\n resolveMaxEngines,\n resolveSecret\n} from '../config.js';\nimport {\n DEFAULT_ASSETS_BASE_URL,\n DEFAULT_GFONTS_CONTENT_URL\n} from '../engine/asset-sources.js';\nimport { engineCapabilities } from '../capability.js';\nimport {\n errorReportingDecision,\n telemetryDecision,\n viewerDisabled,\n type DecidedBy\n} from '../flags/index.js';\nimport { pluginSkills } from '../plugin-skills.js';\nimport { CHANNEL } from '../flags/channel.js';\nimport type { Channel } from '../flags/manifest.js';\nimport { AUTH_CONFIG } from '../auth/clerk-client.js';\nimport { defaultAuthFile, readAuth } from '../auth/token-store.js';\nimport {\n defaultRedemptionsFile,\n PROMO_CODE,\n readRedemptionOutcome\n} from '../auth/auto-redeem.js';\nimport { readCodesignId } from '../engine/codesign-id.js';\nimport { DEFAULT_DURABLE_ROOT } from '../durable-root.js';\nimport { buildBundleMeta } from './bundle.js';\nimport {\n engineFallbackWarning,\n engineReason,\n headlessEngineBooted,\n resolvedEngineFlavor,\n resolvedEngineReason,\n type EngineFlavor,\n type EngineReason\n} from '../tools/engine.js';\nimport { aiPluginsVersion } from '../viewer/ai-plugin-assets.js';\nimport type { TelemetrySinkStats } from '../telemetry/usage-sink.js';\nimport {\n internalUserName,\n type ErrorReporterStats\n} from '../telemetry/error-reporter.js';\nimport type { HarnessFields } from '../telemetry/harness-context.js';\n\nexport interface StatusReport {\n mcp: { buildId: string; node: string; os: string; arch: string };\n cesdkEngine: string;\n config: {\n maxEngines: number;\n /**\n * stdio: how long an untouched server keeps its engine before disposing it\n * and handing its slot back (IMGLY_ENGINE_IDLE_TIMEOUT). 0 = never.\n */\n engineIdleTimeoutSec: number;\n /** Harness context sent with error reports and usage telemetry (model, entrypoint, …); never a session id or path. */\n harness: HarnessFields;\n /** Whether an engine is resident right now. False is normal after an idle eviction. */\n engineBooted: boolean;\n /** A credential SOURCE for asset_generate exists: gateway API key, or (stdio only) IMG.LY auth config. */\n gatewayConfigured: boolean;\n /** Why IMGLY_GATEWAY_API_KEY_FILE gave no key (never its value); null when it is unset or read. */\n gatewayKeyError: string | null;\n gatewayBaseUrl: string;\n engine: string;\n /** The engine this server runs, or will boot, and why: `wasm (windows default)`, `native (default)`, `native (IMGLY_CESDK_ENGINE=native)`, `wasm (IMGLY_CESDK_ENGINE=wasm)`, `wasm (native failed to start)`. */\n engineChoice: string;\n engineResolved: EngineFlavor | null;\n /** Why the engine fell back to WASM (engineResolved 'wasm-fallback'); null otherwise. */\n engineFallbackReason: string | null;\n /** Whether the running engine can do video/audio (native); null until the engine boots. */\n videoAvailable: boolean | null;\n /** UBQ_AV_CODECS: the native engine's codec set — `oss`, `fluendo`, or `auto` (the engine picks; Fluendo when a codec pack is installed). stdio pins `oss` on the bundled licence. */\n avCodecs: string;\n /** IMGLY_DISABLE_VIEWER: true → no `view` tool, and deliverables come back\n * as `file://` paths instead of viewer URLs. */\n viewerDisabled: boolean;\n /** The skills version the spawning plugin ships, and whether it is this build's. */\n pluginSkillsVersion: string | null;\n pluginSkillsMatch: boolean | null;\n /** Build profile this bundle was compiled for: stable | next | canary. A\n * canary requires the native engine, so the right support answer differs\n * by channel — report it rather than inferring it from the flags below. */\n channel: Channel;\n /** IMGLY_TELEMETRY, and on only with the bundled licence: usage events posted to IMG.LY. */\n telemetryEnabled: boolean;\n /** Which variable decided the usage-telemetry switch: DO_NOT_TRACK, IMGLY_TELEMETRY, IMGLY_PLUGIN_TELEMETRY, an unexpanded plugin setting, or the default. */\n telemetryDecidedBy: DecidedBy | null;\n telemetrySent: number | null;\n telemetryBuffered: number | null;\n telemetryDropped: number | null;\n /** Events lost while building the payload, as opposed to evicted from a full buffer (`telemetryDropped`). Non-zero means a breadcrumb was written to stderr. */\n telemetryFailed: number | null;\n /** Random per-process UUID stamped on every telemetry event (the `runId` envelope field) — the join key between a support case and its warehouse rows. Not a secret; null when telemetry is off. */\n telemetryRunId: string | null;\n /** The `installId` envelope field: `~/.codesign/id`, or this process's `telemetryRunId` when that id could not be minted. Equal to `telemetryRunId` ⇒ degraded, and this machine is not countable as an install. Null before the first event. */\n telemetryInstallId: string | null;\n /** A reporter was built: reporting is on, a DSN is present and the Sentry client started. */\n errorReportingEnabled: boolean;\n /** A DSN is present, whether or not reporting is on. */\n errorReportingConfigured: boolean;\n /** Which variable decided the error-report switch; errorReportingConfigured explains a missing DSN. */\n errorReportingDecidedBy: DecidedBy | null;\n errorReportsSent: number | null;\n /** Not sent: a repeat, over the per-process cap, a licence rejection, or a process error nobody can place. */\n errorReportsDropped: number | null;\n errorReportsFailed: number | null;\n errorReportLastEventId: string | null;\n /** Error reports go out tagged internal, with the name part of the account's email: reporting is on and an @img.ly account is signed in. The email itself is not shown. */\n errorReportInternal: boolean;\n defaultAssetsBaseUrl: string;\n /** Google Fonts catalog manifest (ly.img.gfonts) — pinned default or IMGLY_GFONTS_CONTENT_URL override. */\n gfontsContentUrl: string;\n /** Stable codesign ID (~/.codesign/id, the engine's userId). A random UUID — not a secret — so the value is shown; null before first engine boot. */\n codesignId: string | null;\n /** The durable root (~/.codesign): workspace, auth, id, engine-slots. Fixed path, not configurable — surfaced for support. */\n durableRoot: string;\n /** Installed @imgly/plugin-ai-* version served to the editor, or null when unresolvable. */\n aiPluginsVersion: string | null;\n };\n diagnostics: {\n toolEnabled: boolean;\n fileLogging: boolean;\n dir: string;\n streamPresent: boolean;\n lastActivity: number | null;\n };\n login: {\n configured: boolean;\n /** The Clerk issuer (fixed in code). Non-secret. */\n issuer: string | null;\n signedIn: boolean;\n accessTokenExpiresAt: number | null;\n /** Campaign auto-redeem state for the signed-in account: 'off' = no campaign code baked in; 'pending' = signed out or not yet attempted conclusively. The code value itself is never surfaced. */\n promoRedemption: 'off' | 'pending' | 'redeemed' | 'rejected';\n };\n}\n\n// Status never throws (see header): an unparseable IMGLY_ENGINE_IDLE_TIMEOUT —\n// which fails the boot elsewhere — reports as the default here.\nfunction engineIdleSecSafe(env: Env): number {\n try {\n return resolveEngineIdleTimeoutMs(env) / 1000;\n } catch {\n return 300;\n }\n}\n\n// Status never throws (see header): an invalid value — which fails the boot\n// elsewhere — reports as the default here.\nfunction viewerFlagSafe(env: Env): boolean {\n try {\n return viewerDisabled(env);\n } catch {\n return false;\n }\n}\n\nfunction decidedBySafe(\n decide: () => { decidedBy: DecidedBy }\n): DecidedBy | null {\n try {\n return decide().decidedBy;\n } catch {\n return null;\n }\n}\n\nfunction errorReportingFields(r: StatusOptions['errorReporting']) {\n return {\n errorReportingEnabled: r?.enabled ?? false,\n errorReportingConfigured: r?.configured ?? false,\n errorReportsSent: r?.stats?.sent ?? null,\n errorReportsDropped: r?.stats?.dropped ?? null,\n errorReportsFailed: r?.stats?.failed ?? null,\n errorReportLastEventId: r?.stats?.lastEventId ?? null\n };\n}\n\n/** The telemetry counters, all null when no sink is attached. */\nfunction telemetryFields(\n telemetry: StatusOptions['telemetry']\n): Pick<\n StatusReport['config'],\n | 'telemetryEnabled'\n | 'telemetrySent'\n | 'telemetryBuffered'\n | 'telemetryDropped'\n | 'telemetryFailed'\n | 'telemetryRunId'\n | 'telemetryInstallId'\n> {\n const stats = telemetry?.stats;\n return {\n telemetryEnabled: telemetry?.enabled ?? false,\n telemetrySent: stats?.sent ?? null,\n telemetryBuffered: stats?.buffered ?? null,\n telemetryDropped: stats?.dropped ?? null,\n telemetryFailed: stats?.failed ?? null,\n telemetryRunId: stats?.runId ?? null,\n telemetryInstallId: stats?.installId ?? null\n };\n}\n\n/** Env knobs that are a plain string with a default. */\nconst ENV_STRINGS = {\n gatewayBaseUrl: ['IMGLY_GATEWAY_BASE_URL', 'https://gateway.img.ly'],\n defaultAssetsBaseUrl: [\n 'IMGLY_DEFAULT_ASSETS_BASE_URL',\n DEFAULT_ASSETS_BASE_URL\n ],\n gfontsContentUrl: ['IMGLY_GFONTS_CONTENT_URL', DEFAULT_GFONTS_CONTENT_URL]\n} as const satisfies Record<string, readonly [string, string]>;\n\nfunction envStrings(env: Env): Record<keyof typeof ENV_STRINGS, string> {\n const out = {} as Record<keyof typeof ENV_STRINGS, string>;\n for (const [field, [key, fallback]] of Object.entries(ENV_STRINGS) as [\n keyof typeof ENV_STRINGS,\n readonly [string, string]\n ][])\n out[field] = env[key] ?? fallback;\n return out;\n}\n\n/** A credential SOURCE for asset_generate (gateway API key or IMG.LY auth config), and why a key file gave none. */\nfunction gatewayFields(\n env: Env\n): Pick<StatusReport['config'], 'gatewayConfigured' | 'gatewayKeyError'> {\n const key = resolveSecret('IMGLY_GATEWAY_API_KEY', env);\n return {\n gatewayConfigured: true,\n gatewayKeyError: key.problem ?? null\n };\n}\n\nfunction engineChoice(flavor: EngineFlavor, reason: EngineReason): string {\n if (flavor === 'wasm-fallback') return 'wasm (native failed to start)';\n if (reason === 'IMGLY_CESDK_ENGINE') {\n return `${flavor} (IMGLY_CESDK_ENGINE=${flavor})`;\n }\n return `${flavor} (${reason === 'windows-default' ? 'windows default' : 'default'})`;\n}\n\nasync function buildConfig(\n opts: StatusOptions\n): Promise<StatusReport['config']> {\n const { env, platform = process.platform } = opts;\n const plugin = pluginSkills(env);\n const flavor = resolvedEngineFlavor();\n const reason =\n resolvedEngineReason() ?? engineReason(env.IMGLY_CESDK_ENGINE, platform);\n const planned =\n flavor ??\n (reason === 'windows-default' || env.IMGLY_CESDK_ENGINE === 'wasm'\n ? 'wasm'\n : 'native');\n return {\n maxEngines: resolveMaxEngines(env),\n // What turns maxEngines into a cap on ACTIVE engines rather than on open\n // sessions. Never throws on a bad value: status must always render.\n engineIdleTimeoutSec: engineIdleSecSafe(env),\n harness: opts.harness ?? {},\n engineBooted: headlessEngineBooted(),\n ...envStrings(env),\n ...gatewayFields(env),\n engine: env.IMGLY_CESDK_ENGINE || 'default',\n engineChoice: engineChoice(planned, reason),\n engineResolved: flavor ?? null,\n engineFallbackReason: engineFallbackWarning() ?? null,\n videoAvailable:\n flavor === undefined && planned === 'native'\n ? null\n : (await engineCapabilities({ env, platform })).video,\n avCodecs: env.UBQ_AV_CODECS || 'auto',\n viewerDisabled: viewerFlagSafe(env),\n pluginSkillsVersion: plugin?.version ?? null,\n pluginSkillsMatch: plugin?.matches ?? null,\n channel: CHANNEL,\n ...telemetryFields(opts.telemetry),\n ...errorReportingFields(opts.errorReporting),\n telemetryDecidedBy: decidedBySafe(() => telemetryDecision(env)),\n errorReportingDecidedBy: decidedBySafe(() => errorReportingDecision(env)),\n errorReportInternal:\n (opts.errorReporting?.enabled ?? false) &&\n internalUserName(\n (await readAuth(opts.authFile ?? defaultAuthFile()))?.email\n ) !== undefined,\n codesignId: await readCodesignId(opts.idFile),\n durableRoot: DEFAULT_DURABLE_ROOT,\n aiPluginsVersion: aiPluginsVersion()\n };\n}\n\n/** The diagnostics stream's presence and last write, if it exists at all. */\nasync function streamState(\n dir: string\n): Promise<\n Pick<StatusReport['diagnostics'], 'streamPresent' | 'lastActivity'>\n> {\n const s = await stat(join(dir, 'diagnostics.ndjson')).catch(() => null);\n return s\n ? { streamPresent: true, lastActivity: Math.round(s.mtimeMs) }\n : { streamPresent: false, lastActivity: null };\n}\n\nasync function buildLogin(opts: StatusOptions): Promise<StatusReport['login']> {\n const storedAuth = await readAuth(opts.authFile ?? defaultAuthFile());\n const promoCode = opts.promoCode ?? PROMO_CODE;\n let promoRedemption: StatusReport['login']['promoRedemption'] = 'off';\n if (promoCode)\n promoRedemption = storedAuth\n ? ((await readRedemptionOutcome({\n subject: storedAuth.subject,\n code: promoCode,\n recordFile: opts.redemptionsFile ?? defaultRedemptionsFile()\n })) ?? 'pending')\n : 'pending';\n return {\n configured: true,\n issuer: AUTH_CONFIG.issuer,\n signedIn: Boolean(storedAuth),\n accessTokenExpiresAt: storedAuth?.accessTokenExpiresAt ?? null,\n promoRedemption\n };\n}\n\nexport interface StatusOptions {\n env: Env;\n dir: string;\n fileLogging: boolean;\n toolEnabled: boolean;\n harness?: HarnessFields;\n authFile?: string;\n idFile?: string;\n /** Test seam. Default: process.platform. */\n platform?: NodeJS.Platform;\n /** Test seam. Default: the baked PROMO_CODE. */\n promoCode?: string;\n /** Test seam. Default: ~/.codesign/redemptions.json. */\n redemptionsFile?: string;\n telemetry?: {\n enabled: boolean;\n stats?: TelemetrySinkStats;\n };\n errorReporting?: {\n enabled: boolean;\n configured: boolean;\n stats?: ErrorReporterStats;\n };\n}\n\nexport async function buildStatusReport(\n opts: StatusOptions\n): Promise<StatusReport> {\n const { env, dir, fileLogging, toolEnabled } = opts;\n const meta = buildBundleMeta(env) as {\n buildId: string;\n os: string;\n arch: string;\n node: string;\n cesdkEngine: string;\n };\n return {\n mcp: {\n buildId: meta.buildId,\n node: meta.node,\n os: meta.os,\n arch: meta.arch\n },\n cesdkEngine: meta.cesdkEngine,\n config: await buildConfig(opts),\n diagnostics: {\n toolEnabled,\n fileLogging,\n dir,\n ...(await streamState(dir))\n },\n login: await buildLogin(opts)\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/flags/manifest.ts"],"names":[],"mappings":"AAaA,qDAAqD;AACrD,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEnD,KAAK,IAAI,GAAG;IACV,IAAI,EAAE,MAAM,CAAC;IACb,8DAA8D;IAC9D,OAAO,EAAE,MAAM,CAAC;IAChB,wFAAwF;IACxF,OAAO,CAAC,EAAE,IAAI,CAAC;CAChB,CAAC;AAEF,oHAAoH;AACpH,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG;IAC7B,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;CACpC,CAAC;AAEF,gFAAgF;AAChF,MAAM,MAAM,QAAQ,GAAG,IAAI,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;CAC1C,CAAC;AAEF,wEAAwE;AACxE,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAEjD,MAAM,MAAM,IAAI,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;AAepD,eAAO,MAAM,KAAK,EAAE,SAAS,IAAI,EAqFhC,CAAC;AAEF,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAIvC;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAMpE;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAMzE"}
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/flags/manifest.ts"],"names":[],"mappings":"AAaA,qDAAqD;AACrD,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEnD,KAAK,IAAI,GAAG;IACV,IAAI,EAAE,MAAM,CAAC;IACb,8DAA8D;IAC9D,OAAO,EAAE,MAAM,CAAC;IAChB,wFAAwF;IACxF,OAAO,CAAC,EAAE,IAAI,CAAC;CAChB,CAAC;AAEF,oHAAoH;AACpH,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG;IAC7B,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;CACpC,CAAC;AAEF,gFAAgF;AAChF,MAAM,MAAM,QAAQ,GAAG,IAAI,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;CAC1C,CAAC;AAEF,wEAAwE;AACxE,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAEjD,MAAM,MAAM,IAAI,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;AAepD,eAAO,MAAM,KAAK,EAAE,SAAS,IAAI,EAgFhC,CAAC;AAEF,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAIvC;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAMpE;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAMzE"}
@@ -33,8 +33,6 @@ export const KNOBS = [
33
33
  value('IMGLY_DIAGNOSTICS_DIR', 'where diagnostics logs are written (default: the platform state dir).'),
34
34
  value('IMGLY_GATEWAY_API_KEY', 'AI gateway key; an alternative to signing in with the login tool.', { honored: true }),
35
35
  value('IMGLY_GATEWAY_BASE_URL', 'AI gateway endpoint (default: IMG.LY hosted).'),
36
- value('IMGLY_AUTH_ISSUER', 'override the built-in sign-in endpoints — set both together, or neither.'),
37
- value('IMGLY_AUTH_CLIENT_ID', 'see IMGLY_AUTH_ISSUER.'),
38
36
  value('IMGLY_DEFAULT_ASSETS_BASE_URL', 'manifest root for the default asset sources (default: IMG.LY CDN).'),
39
37
  value('IMGLY_DEMO_ASSETS_BASE_URL', 'manifest root for the demo asset sources (default: IMG.LY CDN).'),
40
38
  value('IMGLY_GFONTS_CONTENT_URL', 'Google Fonts catalogue, `<root>/ly.img.gfonts/content.json`; its aliases load from `<root>/ly.img.gfonts-fallbacks/` (default: IMG.LY CDN).')
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/flags/manifest.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,EAAE;AACF,6EAA6E;AAC7E,8CAA8C;AAC9C,EAAE;AACF,6EAA6E;AAC7E,+EAA+E;AAC/E,6EAA6E;AAC7E,4EAA4E;AAC5E,gFAAgF;AAChF,oEAAoE;AACpE,qEAAqE;AA+BrE,MAAM,KAAK,GAAG,CACZ,IAAY,EACZ,OAAe,EACf,QAAkC,EAClC,QAA+B,EAAE,EACtB,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;AAExE,MAAM,KAAK,GAAG,CACZ,IAAY,EACZ,OAAe,EACf,QAA+B,EAAE,EACtB,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;AAE7D,MAAM,CAAC,MAAM,KAAK,GAAoB;IACpC;QACE,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,oBAAoB;QAC1B,MAAM,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC;QAC1B,uFAAuF;QACvF,QAAQ,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE;QACxD,OAAO,EAAE,IAAI;QACb,OAAO,EACL,6IAA6I;KAChJ;IACD,KAAK,CACH,sBAAsB,EACtB,6EAA6E,EAC7E,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAC7C,EAAE,OAAO,EAAE,IAAI,EAAE,CAClB;IACD,KAAK,CACH,iBAAiB,EACjB,2CAA2C,EAC3C,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAC1C,EAAE,OAAO,EAAE,IAAI,EAAE,CAClB;IACD,KAAK,CACH,uBAAuB,EACvB,qFAAqF,EACrF,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAC1C,EAAE,OAAO,EAAE,IAAI,EAAE,CAClB;IACD,KAAK,CACH,wBAAwB,EACxB,kIAAkI,EAClI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAC1C,EAAE,OAAO,EAAE,IAAI,EAAE,CAClB;IACD,KAAK,CACH,8BAA8B,EAC9B,iHAAiH,EACjH,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAC1C,EAAE,OAAO,EAAE,IAAI,EAAE,CAClB;IACD,KAAK,CACH,kBAAkB,EAClB,6EAA6E,CAC9E;IACD,KAAK,CACH,wBAAwB,EACxB,qDAAqD,EACrD,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAC3C;IACD,KAAK,CACH,wBAAwB,EACxB,gDAAgD,EAChD,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAC3C;IACD,KAAK,CACH,uBAAuB,EACvB,uEAAuE,CACxE;IACD,KAAK,CACH,uBAAuB,EACvB,mEAAmE,EACnE,EAAE,OAAO,EAAE,IAAI,EAAE,CAClB;IACD,KAAK,CACH,wBAAwB,EACxB,+CAA+C,CAChD;IACD,KAAK,CACH,mBAAmB,EACnB,0EAA0E,CAC3E;IACD,KAAK,CAAC,sBAAsB,EAAE,wBAAwB,CAAC;IACvD,KAAK,CACH,+BAA+B,EAC/B,oEAAoE,CACrE;IACD,KAAK,CACH,4BAA4B,EAC5B,iEAAiE,CAClE;IACD,KAAK,CACH,0BAA0B,EAC1B,6IAA6I,CAC9I;CACF,CAAC;AAEF,MAAM,UAAU,IAAI,CAAC,IAAY;IAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACjD,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,qBAAqB,CAAC,CAAC;IACxE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,OAAgB;IACzD,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;IACrB,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,IAAI,IAAI,kCAAkC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,OAAgB;IACxD,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;IACrB,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,IAAI,IAAI,gCAAgC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC","sourcesContent":["// packages/codesign-mcp/src/flags/manifest.ts\n//\n// The declared set of product knobs. One entry per environment variable, and\n// the single place a default is written down.\n//\n// Why this exists: a knob used to be four things in four places that nothing\n// forced to agree — a reader in features.ts, a line in status.config, an entry\n// in a hand-written DEV_ENV_HELP string, and a prefix rule in frozen-env.ts.\n// The first three now derive from here, and so does frozen-env.ts's list of\n// knobs that survive a release build (`honored`). The freeze itself is still by\n// PREFIX: a knob missing from this file is still frozen, it is just\n// undocumented, which is the pre-existing failure mode and no worse.\n\n/** Which build profile a bundle was produced for. */\nexport type Channel = 'stable' | 'next' | 'canary';\n\ntype Base = {\n name: string;\n /** One line, used verbatim by --help and the README table. */\n summary: string;\n /** Survives the release-build freeze (src/cli/frozen-env.ts says why each one does). */\n honored?: true;\n};\n\n/** on/off, true/false or 1/0, any case (config.ts `boolEnv`). Anything else throws — a typo must not mean \"off\". */\nexport type OnOffKnob = Base & {\n kind: 'on-off';\n defaults: Record<Channel, boolean>;\n};\n\n/** A closed set of spellings. A `null` default means unset — resolved later. */\nexport type EnumKnob = Base & {\n kind: 'enum';\n values: readonly string[];\n defaults: Record<Channel, string | null>;\n};\n\n/** Free-form string (URLs, paths, credentials). No channel defaults. */\nexport type ValueKnob = Base & { kind: 'value' };\n\nexport type Knob = OnOffKnob | EnumKnob | ValueKnob;\n\nconst onOff = (\n name: string,\n summary: string,\n defaults: Record<Channel, boolean>,\n extra: Pick<Base, 'honored'> = {}\n): OnOffKnob => ({ kind: 'on-off', name, summary, defaults, ...extra });\n\nconst value = (\n name: string,\n summary: string,\n extra: Pick<Base, 'honored'> = {}\n): ValueKnob => ({ kind: 'value', name, summary, ...extra });\n\nexport const KNOBS: readonly Knob[] = [\n {\n kind: 'enum',\n name: 'IMGLY_CESDK_ENGINE',\n values: ['wasm', 'native'],\n // null = native with WASM fallback (WASM on Windows); canary requires native outright.\n defaults: { stable: null, next: null, canary: 'native' },\n honored: true,\n summary:\n 'engine flavor: wasm | native (default: native, falling back to wasm if it cannot start; wasm on Windows, where video is not supported yet).'\n },\n onOff(\n 'IMGLY_DISABLE_VIEWER',\n 'on hides the browser viewer; designs are delivered as files (default: off).',\n { stable: false, next: false, canary: false },\n { honored: true }\n ),\n onOff(\n 'IMGLY_TELEMETRY',\n 'on | off — usage telemetry (default: on).',\n { stable: true, next: true, canary: true },\n { honored: true }\n ),\n onOff(\n 'IMGLY_ERROR_REPORTING',\n 'on | off — send error reports (crashes, failed tool calls) to IMG.LY (default: on).',\n { stable: true, next: true, canary: true },\n { honored: true }\n ),\n onOff(\n 'IMGLY_PLUGIN_TELEMETRY',\n 'on | off — set by the Claude plugin\\'s \"Send usage data\" setting; off turns usage telemetry and error reports off (default: on).',\n { stable: true, next: true, canary: true },\n { honored: true }\n ),\n onOff(\n 'IMGLY_PLUGIN_ERROR_REPORTING',\n 'on | off — set by the Claude plugin\\'s \"Send error reports\" setting; off turns error reports off (default: on).',\n { stable: true, next: true, canary: true },\n { honored: true }\n ),\n value(\n 'IMGLY_SENTRY_DSN',\n 'error-report destination for source builds; a published build uses its own.'\n ),\n onOff(\n 'IMGLY_DIAGNOSTICS_FILE',\n 'on | off — local diagnostics logging (default: on).',\n { stable: true, next: true, canary: true }\n ),\n onOff(\n 'IMGLY_DIAGNOSTICS_TOOL',\n 'on | off — the diagnostics tool (default: on).',\n { stable: true, next: true, canary: true }\n ),\n value(\n 'IMGLY_DIAGNOSTICS_DIR',\n 'where diagnostics logs are written (default: the platform state dir).'\n ),\n value(\n 'IMGLY_GATEWAY_API_KEY',\n 'AI gateway key; an alternative to signing in with the login tool.',\n { honored: true }\n ),\n value(\n 'IMGLY_GATEWAY_BASE_URL',\n 'AI gateway endpoint (default: IMG.LY hosted).'\n ),\n value(\n 'IMGLY_AUTH_ISSUER',\n 'override the built-in sign-in endpoints — set both together, or neither.'\n ),\n value('IMGLY_AUTH_CLIENT_ID', 'see IMGLY_AUTH_ISSUER.'),\n value(\n 'IMGLY_DEFAULT_ASSETS_BASE_URL',\n 'manifest root for the default asset sources (default: IMG.LY CDN).'\n ),\n value(\n 'IMGLY_DEMO_ASSETS_BASE_URL',\n 'manifest root for the demo asset sources (default: IMG.LY CDN).'\n ),\n value(\n 'IMGLY_GFONTS_CONTENT_URL',\n 'Google Fonts catalogue, `<root>/ly.img.gfonts/content.json`; its aliases load from `<root>/ly.img.gfonts-fallbacks/` (default: IMG.LY CDN).'\n )\n];\n\nexport function knob(name: string): Knob {\n const found = KNOBS.find((k) => k.name === name);\n if (!found) throw new Error(`unknown knob \"${name}\" — add it to KNOBS`);\n return found;\n}\n\nexport function onOffDefault(name: string, channel: Channel): boolean {\n const k = knob(name);\n if (k.kind !== 'on-off') {\n throw new Error(`\"${name}\" is not an on-off knob (kind: ${k.kind})`);\n }\n return k.defaults[channel];\n}\n\nexport function enumDefault(name: string, channel: Channel): string | null {\n const k = knob(name);\n if (k.kind !== 'enum') {\n throw new Error(`\"${name}\" is not an enum knob (kind: ${k.kind})`);\n }\n return k.defaults[channel];\n}\n"]}
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/flags/manifest.ts"],"names":[],"mappings":"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","sourcesContent":["// packages/codesign-mcp/src/flags/manifest.ts\n//\n// The declared set of product knobs. One entry per environment variable, and\n// the single place a default is written down.\n//\n// Why this exists: a knob used to be four things in four places that nothing\n// forced to agree — a reader in features.ts, a line in status.config, an entry\n// in a hand-written DEV_ENV_HELP string, and a prefix rule in frozen-env.ts.\n// The first three now derive from here, and so does frozen-env.ts's list of\n// knobs that survive a release build (`honored`). The freeze itself is still by\n// PREFIX: a knob missing from this file is still frozen, it is just\n// undocumented, which is the pre-existing failure mode and no worse.\n\n/** Which build profile a bundle was produced for. */\nexport type Channel = 'stable' | 'next' | 'canary';\n\ntype Base = {\n name: string;\n /** One line, used verbatim by --help and the README table. */\n summary: string;\n /** Survives the release-build freeze (src/cli/frozen-env.ts says why each one does). */\n honored?: true;\n};\n\n/** on/off, true/false or 1/0, any case (config.ts `boolEnv`). Anything else throws — a typo must not mean \"off\". */\nexport type OnOffKnob = Base & {\n kind: 'on-off';\n defaults: Record<Channel, boolean>;\n};\n\n/** A closed set of spellings. A `null` default means unset — resolved later. */\nexport type EnumKnob = Base & {\n kind: 'enum';\n values: readonly string[];\n defaults: Record<Channel, string | null>;\n};\n\n/** Free-form string (URLs, paths, credentials). No channel defaults. */\nexport type ValueKnob = Base & { kind: 'value' };\n\nexport type Knob = OnOffKnob | EnumKnob | ValueKnob;\n\nconst onOff = (\n name: string,\n summary: string,\n defaults: Record<Channel, boolean>,\n extra: Pick<Base, 'honored'> = {}\n): OnOffKnob => ({ kind: 'on-off', name, summary, defaults, ...extra });\n\nconst value = (\n name: string,\n summary: string,\n extra: Pick<Base, 'honored'> = {}\n): ValueKnob => ({ kind: 'value', name, summary, ...extra });\n\nexport const KNOBS: readonly Knob[] = [\n {\n kind: 'enum',\n name: 'IMGLY_CESDK_ENGINE',\n values: ['wasm', 'native'],\n // null = native with WASM fallback (WASM on Windows); canary requires native outright.\n defaults: { stable: null, next: null, canary: 'native' },\n honored: true,\n summary:\n 'engine flavor: wasm | native (default: native, falling back to wasm if it cannot start; wasm on Windows, where video is not supported yet).'\n },\n onOff(\n 'IMGLY_DISABLE_VIEWER',\n 'on hides the browser viewer; designs are delivered as files (default: off).',\n { stable: false, next: false, canary: false },\n { honored: true }\n ),\n onOff(\n 'IMGLY_TELEMETRY',\n 'on | off — usage telemetry (default: on).',\n { stable: true, next: true, canary: true },\n { honored: true }\n ),\n onOff(\n 'IMGLY_ERROR_REPORTING',\n 'on | off — send error reports (crashes, failed tool calls) to IMG.LY (default: on).',\n { stable: true, next: true, canary: true },\n { honored: true }\n ),\n onOff(\n 'IMGLY_PLUGIN_TELEMETRY',\n 'on | off — set by the Claude plugin\\'s \"Send usage data\" setting; off turns usage telemetry and error reports off (default: on).',\n { stable: true, next: true, canary: true },\n { honored: true }\n ),\n onOff(\n 'IMGLY_PLUGIN_ERROR_REPORTING',\n 'on | off — set by the Claude plugin\\'s \"Send error reports\" setting; off turns error reports off (default: on).',\n { stable: true, next: true, canary: true },\n { honored: true }\n ),\n value(\n 'IMGLY_SENTRY_DSN',\n 'error-report destination for source builds; a published build uses its own.'\n ),\n onOff(\n 'IMGLY_DIAGNOSTICS_FILE',\n 'on | off — local diagnostics logging (default: on).',\n { stable: true, next: true, canary: true }\n ),\n onOff(\n 'IMGLY_DIAGNOSTICS_TOOL',\n 'on | off — the diagnostics tool (default: on).',\n { stable: true, next: true, canary: true }\n ),\n value(\n 'IMGLY_DIAGNOSTICS_DIR',\n 'where diagnostics logs are written (default: the platform state dir).'\n ),\n value(\n 'IMGLY_GATEWAY_API_KEY',\n 'AI gateway key; an alternative to signing in with the login tool.',\n { honored: true }\n ),\n value(\n 'IMGLY_GATEWAY_BASE_URL',\n 'AI gateway endpoint (default: IMG.LY hosted).'\n ),\n value(\n 'IMGLY_DEFAULT_ASSETS_BASE_URL',\n 'manifest root for the default asset sources (default: IMG.LY CDN).'\n ),\n value(\n 'IMGLY_DEMO_ASSETS_BASE_URL',\n 'manifest root for the demo asset sources (default: IMG.LY CDN).'\n ),\n value(\n 'IMGLY_GFONTS_CONTENT_URL',\n 'Google Fonts catalogue, `<root>/ly.img.gfonts/content.json`; its aliases load from `<root>/ly.img.gfonts-fallbacks/` (default: IMG.LY CDN).'\n )\n];\n\nexport function knob(name: string): Knob {\n const found = KNOBS.find((k) => k.name === name);\n if (!found) throw new Error(`unknown knob \"${name}\" — add it to KNOBS`);\n return found;\n}\n\nexport function onOffDefault(name: string, channel: Channel): boolean {\n const k = knob(name);\n if (k.kind !== 'on-off') {\n throw new Error(`\"${name}\" is not an on-off knob (kind: ${k.kind})`);\n }\n return k.defaults[channel];\n}\n\nexport function enumDefault(name: string, channel: Channel): string | null {\n const k = knob(name);\n if (k.kind !== 'enum') {\n throw new Error(`\"${name}\" is not an enum knob (kind: ${k.kind})`);\n }\n return k.defaults[channel];\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/tools/login.ts"],"names":[],"mappings":"AAUA,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAM7C,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,OAAO,EAAE,YAAY,CAAC;IACtB,wEAAwE;IACxE,YAAY,EAAE,MAAM,MAAM,CAAC;IAC3B;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,iBAAiB,GAAG,SAAS,CAAC;CACpD,GAAG,QAAQ,CAqDX;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IAAE,OAAO,EAAE,YAAY,CAAA;CAAE,GAAG,QAAQ,CA6B1E"}
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/tools/login.ts"],"names":[],"mappings":"AASA,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAM7C,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,OAAO,EAAE,YAAY,CAAC;IACtB,wEAAwE;IACxE,YAAY,EAAE,MAAM,MAAM,CAAC;IAC3B;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,iBAAiB,GAAG,SAAS,CAAC;CACpD,GAAG,QAAQ,CAqDX;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IAAE,OAAO,EAAE,YAAY,CAAA;CAAE,GAAG,QAAQ,CA6B1E"}
@@ -1,6 +1,5 @@
1
1
  //
2
- // `login` / `logout` MCP tools (env-gated: only registered when
3
- // IMGLY_AUTH_ISSUER + IMGLY_AUTH_CLIENT_ID are set — see cli/stdio.ts).
2
+ // `login` / `logout` MCP tools (registered in cli/stdio.ts).
4
3
  // `login` is deliberately NON-BLOCKING: Claude Desktop and Cursor kill tool
5
4
  // calls at ~60 s, so the flow completes out of band and the user (or model)
6
5
  // calls `login` again to confirm. Re-calling is idempotent: startLogin reuses
@@ -1 +1 @@
1
- {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/tools/login.ts"],"names":[],"mappings":"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","sourcesContent":["//\n// `login` / `logout` MCP tools (env-gated: only registered when\n// IMGLY_AUTH_ISSUER + IMGLY_AUTH_CLIENT_ID are set — see cli/stdio.ts).\n// `login` is deliberately NON-BLOCKING: Claude Desktop and Cursor kill tool\n// calls at ~60 s, so the flow completes out of band and the user (or model)\n// calls `login` again to confirm. Re-calling is idempotent: startLogin reuses\n// the live pending login (hands back the SAME link) until sign-in completes,\n// then status reports the signed-in account — it never restarts the flow or\n// invalidates the open link (unless switch_account=true). No elicitation: no\n// host declares elicitation.url today (capability probe 2026-07-20).\nimport {\n promoSuccessLine,\n type RedemptionOutcome\n} from '../auth/auto-redeem.js';\nimport type { LoginManager } from '../auth/login-manager.js';\nimport type { HostTool } from '../server.js';\n\nconst textResult = (text: string) => ({\n content: [{ type: 'text' as const, text }]\n});\n\nexport function createLoginTool(opts: {\n manager: LoginManager;\n /** Resolved lazily — the listener port is only known after listen(). */\n callbackBase: () => string;\n /**\n * A just-completed campaign redemption to surface once (the provider\n * clears it on read). Only the signed-in confirm call can carry it —\n * `login` never blocks on the browser flow.\n */\n promoOutcome?: () => RedemptionOutcome | undefined;\n}): HostTool {\n return {\n name: 'login',\n description:\n 'Sign in with your IMG.LY account (opens the system browser). The session saves automatically once the user finishes in the browser; call login again anytime to confirm — safe to repeat, it does not restart the flow or invalidate the open link. Pass switch_account=true to sign in as a different user.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n switch_account: {\n type: 'boolean' as const,\n description: 'Force a fresh sign-in screen even if a session exists.'\n }\n },\n additionalProperties: false\n },\n call: async (rawArgs) => {\n try {\n const args = (rawArgs ?? {}) as { switch_account?: boolean };\n const status = await opts.manager.status();\n if (status.signedIn && !args.switch_account) {\n const promo = opts.promoOutcome?.();\n const promoNote =\n promo?.outcome === 'redeemed' ? ` ${promoSuccessLine(promo)}` : '';\n return textResult(\n `Already signed in as ${status.email ?? status.subject}.${promoNote} Use switch_account=true to change accounts, or the logout tool to sign out.`\n );\n }\n const startOpts: Parameters<LoginManager['startLogin']>[0] = {\n callbackBase: opts.callbackBase()\n };\n if (args.switch_account) startOpts.switchAccount = true;\n const { url, browser } = await opts.manager.startLogin(startOpts);\n return textResult(\n (browser === 'opened'\n ? 'Your browser should have opened for IMG.LY sign-in.'\n : browser === 'reused'\n ? 'A sign-in is already in progress — continue with the same link below.'\n : 'Could not open a browser automatically.') +\n `\\n\\nSign in here: ${url}\\n\\nThe session is saved automatically once you finish in the browser — nothing else is required. To confirm, call login again: it is safe to repeat and returns the signed-in account once done, or hands back this same link while sign-in is still in progress (it does not restart or invalidate it). The link expires in 10 minutes.`\n );\n } catch (err) {\n return {\n isError: true,\n content: [\n {\n type: 'text' as const,\n text: `login failed: ${err instanceof Error ? err.message : String(err)}`\n }\n ]\n };\n }\n }\n };\n}\n\nexport function createLogoutTool(opts: { manager: LoginManager }): HostTool {\n return {\n name: 'logout',\n description:\n 'Sign out of your IMG.LY account (revokes the session and clears local credentials).',\n inputSchema: {\n type: 'object' as const,\n properties: {},\n additionalProperties: false\n },\n call: async () => {\n try {\n const { wasSignedIn } = await opts.manager.logout();\n return textResult(\n wasSignedIn ? 'Signed out.' : 'You were not signed in.'\n );\n } catch (err) {\n return {\n isError: true,\n content: [\n {\n type: 'text' as const,\n text: `logout failed: ${err instanceof Error ? err.message : String(err)}`\n }\n ]\n };\n }\n }\n };\n}\n"]}
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/tools/login.ts"],"names":[],"mappings":"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","sourcesContent":["//\n// `login` / `logout` MCP tools (registered in cli/stdio.ts).\n// `login` is deliberately NON-BLOCKING: Claude Desktop and Cursor kill tool\n// calls at ~60 s, so the flow completes out of band and the user (or model)\n// calls `login` again to confirm. Re-calling is idempotent: startLogin reuses\n// the live pending login (hands back the SAME link) until sign-in completes,\n// then status reports the signed-in account — it never restarts the flow or\n// invalidates the open link (unless switch_account=true). No elicitation: no\n// host declares elicitation.url today (capability probe 2026-07-20).\nimport {\n promoSuccessLine,\n type RedemptionOutcome\n} from '../auth/auto-redeem.js';\nimport type { LoginManager } from '../auth/login-manager.js';\nimport type { HostTool } from '../server.js';\n\nconst textResult = (text: string) => ({\n content: [{ type: 'text' as const, text }]\n});\n\nexport function createLoginTool(opts: {\n manager: LoginManager;\n /** Resolved lazily — the listener port is only known after listen(). */\n callbackBase: () => string;\n /**\n * A just-completed campaign redemption to surface once (the provider\n * clears it on read). Only the signed-in confirm call can carry it —\n * `login` never blocks on the browser flow.\n */\n promoOutcome?: () => RedemptionOutcome | undefined;\n}): HostTool {\n return {\n name: 'login',\n description:\n 'Sign in with your IMG.LY account (opens the system browser). The session saves automatically once the user finishes in the browser; call login again anytime to confirm — safe to repeat, it does not restart the flow or invalidate the open link. Pass switch_account=true to sign in as a different user.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n switch_account: {\n type: 'boolean' as const,\n description: 'Force a fresh sign-in screen even if a session exists.'\n }\n },\n additionalProperties: false\n },\n call: async (rawArgs) => {\n try {\n const args = (rawArgs ?? {}) as { switch_account?: boolean };\n const status = await opts.manager.status();\n if (status.signedIn && !args.switch_account) {\n const promo = opts.promoOutcome?.();\n const promoNote =\n promo?.outcome === 'redeemed' ? ` ${promoSuccessLine(promo)}` : '';\n return textResult(\n `Already signed in as ${status.email ?? status.subject}.${promoNote} Use switch_account=true to change accounts, or the logout tool to sign out.`\n );\n }\n const startOpts: Parameters<LoginManager['startLogin']>[0] = {\n callbackBase: opts.callbackBase()\n };\n if (args.switch_account) startOpts.switchAccount = true;\n const { url, browser } = await opts.manager.startLogin(startOpts);\n return textResult(\n (browser === 'opened'\n ? 'Your browser should have opened for IMG.LY sign-in.'\n : browser === 'reused'\n ? 'A sign-in is already in progress — continue with the same link below.'\n : 'Could not open a browser automatically.') +\n `\\n\\nSign in here: ${url}\\n\\nThe session is saved automatically once you finish in the browser — nothing else is required. To confirm, call login again: it is safe to repeat and returns the signed-in account once done, or hands back this same link while sign-in is still in progress (it does not restart or invalidate it). The link expires in 10 minutes.`\n );\n } catch (err) {\n return {\n isError: true,\n content: [\n {\n type: 'text' as const,\n text: `login failed: ${err instanceof Error ? err.message : String(err)}`\n }\n ]\n };\n }\n }\n };\n}\n\nexport function createLogoutTool(opts: { manager: LoginManager }): HostTool {\n return {\n name: 'logout',\n description:\n 'Sign out of your IMG.LY account (revokes the session and clears local credentials).',\n inputSchema: {\n type: 'object' as const,\n properties: {},\n additionalProperties: false\n },\n call: async () => {\n try {\n const { wasSignedIn } = await opts.manager.logout();\n return textResult(\n wasSignedIn ? 'Signed out.' : 'You were not signed in.'\n );\n } catch (err) {\n return {\n isError: true,\n content: [\n {\n type: 'text' as const,\n text: `logout failed: ${err instanceof Error ? err.message : String(err)}`\n }\n ]\n };\n }\n }\n };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@imgly/codesign-mcp",
3
- "version": "0.5.0",
3
+ "version": "0.5.1",
4
4
  "description": "A real design engine for your AI agent: generate designs, print-ready PDFs and videos with audio, over MCP.",
5
5
  "keywords": [
6
6
  "mcp",
@@ -54,9 +54,8 @@
54
54
  "generate-spa-assets": "node scripts/generate-spa-assets.mjs",
55
55
  "generate-spa-assets:diagnostics": "node scripts/generate-spa-assets.mjs src/diagnostics/spa src/diagnostics/spa-assets.generated.ts",
56
56
  "generate-license": "node scripts/generate-license.mjs",
57
- "generate-auth-config": "node scripts/generate-auth-config.mjs",
58
57
  "generate-release-flags": "node scripts/generate-release-flags.mjs",
59
- "refresh-assets": "pnpm run sync:cesdk-api && pnpm --filter @imgly/codesign-sdk run build && pnpm run generate-spa-assets && pnpm run generate-spa-assets:diagnostics && pnpm run generate-license && pnpm run generate-auth-config && pnpm run generate-release-flags && pnpm run generate-flag-docs",
58
+ "refresh-assets": "pnpm run sync:cesdk-api && pnpm --filter @imgly/codesign-sdk run build && pnpm run generate-spa-assets && pnpm run generate-spa-assets:diagnostics && pnpm run generate-license && pnpm run generate-release-flags && pnpm run generate-flag-docs",
60
59
  "stage-ai-plugins": "node scripts/stage-ai-plugin-assets.mjs",
61
60
  "prebuild": "pnpm run refresh-assets && pnpm run stage-ai-plugins",
62
61
  "precheck": "pnpm run refresh-assets",
@@ -1,3 +0,0 @@
1
- export declare const BAKED_AUTH_ISSUER = "https://clerk.img.ly";
2
- export declare const BAKED_AUTH_CLIENT_ID = "zOC6DtNv8Zv6207q";
3
- //# sourceMappingURL=auth-config.generated.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth-config.generated.d.ts","sourceRoot":"","sources":["../../src/auth/auth-config.generated.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,iBAAiB,yBAAyB,CAAC;AACxD,eAAO,MAAM,oBAAoB,qBAAqB,CAAC"}
@@ -1,6 +0,0 @@
1
- // AUTO-GENERATED by scripts/generate-auth-config.mjs — do not edit.
2
- // Baked from the environment, else .env, else the committed .env.defaults.
3
- // Both are public (non-secret); env overrides them at runtime too.
4
- export const BAKED_AUTH_ISSUER = "https://clerk.img.ly";
5
- export const BAKED_AUTH_CLIENT_ID = "zOC6DtNv8Zv6207q";
6
- //# sourceMappingURL=auth-config.generated.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth-config.generated.js","sourceRoot":"","sources":["../../src/auth/auth-config.generated.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,2EAA2E;AAC3E,mEAAmE;AACnE,MAAM,CAAC,MAAM,iBAAiB,GAAG,sBAAsB,CAAC;AACxD,MAAM,CAAC,MAAM,oBAAoB,GAAG,kBAAkB,CAAC","sourcesContent":["// AUTO-GENERATED by scripts/generate-auth-config.mjs — do not edit.\n// Baked from the environment, else .env, else the committed .env.defaults.\n// Both are public (non-secret); env overrides them at runtime too.\nexport const BAKED_AUTH_ISSUER = \"https://clerk.img.ly\";\nexport const BAKED_AUTH_CLIENT_ID = \"zOC6DtNv8Zv6207q\";\n"]}