@agent-native/core 0.7.49 → 0.7.51

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/dist/a2a/agent-card.d.ts.map +1 -1
  2. package/dist/a2a/agent-card.js +21 -16
  3. package/dist/a2a/agent-card.js.map +1 -1
  4. package/dist/a2a/auth-policy.d.ts +10 -0
  5. package/dist/a2a/auth-policy.d.ts.map +1 -0
  6. package/dist/a2a/auth-policy.js +34 -0
  7. package/dist/a2a/auth-policy.js.map +1 -0
  8. package/dist/a2a/client.d.ts +6 -2
  9. package/dist/a2a/client.d.ts.map +1 -1
  10. package/dist/a2a/client.js +9 -4
  11. package/dist/a2a/client.js.map +1 -1
  12. package/dist/a2a/handlers.d.ts.map +1 -1
  13. package/dist/a2a/handlers.js +5 -4
  14. package/dist/a2a/handlers.js.map +1 -1
  15. package/dist/a2a/index.d.ts +1 -0
  16. package/dist/a2a/index.d.ts.map +1 -1
  17. package/dist/a2a/index.js +1 -0
  18. package/dist/a2a/index.js.map +1 -1
  19. package/dist/a2a/response-text.d.ts +4 -1
  20. package/dist/a2a/response-text.d.ts.map +1 -1
  21. package/dist/a2a/response-text.js +3 -2
  22. package/dist/a2a/response-text.js.map +1 -1
  23. package/dist/a2a/server.d.ts.map +1 -1
  24. package/dist/a2a/server.js +44 -29
  25. package/dist/a2a/server.js.map +1 -1
  26. package/dist/client/resources/ResourceEditor.d.ts.map +1 -1
  27. package/dist/client/resources/ResourceEditor.js +2 -4
  28. package/dist/client/resources/ResourceEditor.js.map +1 -1
  29. package/dist/client/settings/AgentsSection.d.ts.map +1 -1
  30. package/dist/client/settings/AgentsSection.js +4 -6
  31. package/dist/client/settings/AgentsSection.js.map +1 -1
  32. package/dist/deploy/build.d.ts.map +1 -1
  33. package/dist/deploy/build.js +8 -0
  34. package/dist/deploy/build.js.map +1 -1
  35. package/dist/deploy/route-discovery.d.ts.map +1 -1
  36. package/dist/deploy/route-discovery.js +11 -2
  37. package/dist/deploy/route-discovery.js.map +1 -1
  38. package/dist/integrations/a2a-continuation-processor.d.ts.map +1 -1
  39. package/dist/integrations/a2a-continuation-processor.js +39 -13
  40. package/dist/integrations/a2a-continuation-processor.js.map +1 -1
  41. package/dist/integrations/a2a-continuations-store.d.ts +2 -1
  42. package/dist/integrations/a2a-continuations-store.d.ts.map +1 -1
  43. package/dist/integrations/a2a-continuations-store.js +33 -4
  44. package/dist/integrations/a2a-continuations-store.js.map +1 -1
  45. package/dist/integrations/webhook-handler.js +4 -3
  46. package/dist/integrations/webhook-handler.js.map +1 -1
  47. package/dist/resources/handlers.d.ts.map +1 -1
  48. package/dist/resources/handlers.js +2 -3
  49. package/dist/resources/handlers.js.map +1 -1
  50. package/dist/resources/metadata.d.ts +5 -0
  51. package/dist/resources/metadata.d.ts.map +1 -1
  52. package/dist/resources/metadata.js +17 -2
  53. package/dist/resources/metadata.js.map +1 -1
  54. package/dist/resources/store.d.ts.map +1 -1
  55. package/dist/resources/store.js +2 -1
  56. package/dist/resources/store.js.map +1 -1
  57. package/dist/scripts/call-agent.d.ts.map +1 -1
  58. package/dist/scripts/call-agent.js +9 -4
  59. package/dist/scripts/call-agent.js.map +1 -1
  60. package/dist/server/agent-discovery.d.ts.map +1 -1
  61. package/dist/server/agent-discovery.js +7 -4
  62. package/dist/server/agent-discovery.js.map +1 -1
  63. package/dist/server/auth.d.ts.map +1 -1
  64. package/dist/server/auth.js +6 -0
  65. package/dist/server/auth.js.map +1 -1
  66. package/dist/vite/index.d.ts +1 -1
  67. package/dist/vite/index.d.ts.map +1 -1
  68. package/dist/vite/index.js +1 -1
  69. package/dist/vite/index.js.map +1 -1
  70. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/a2a/server.ts"],"names":[],"mappings":"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","sourcesContent":["import * as jose from \"jose\";\nimport { getH3App } from \"../server/framework-request-handler.js\";\nimport {\n defineEventHandler,\n setResponseHeader,\n setResponseStatus,\n getMethod,\n getRequestHeader,\n} from \"h3\";\nimport type { A2AConfig } from \"./types.js\";\nimport { generateAgentCard } from \"./agent-card.js\";\nimport { handleJsonRpcH3, processA2ATaskFromQueue } from \"./handlers.js\";\nimport { readBody } from \"../server/h3-helpers.js\";\nimport {\n extractBearerToken,\n verifyInternalToken,\n} from \"../integrations/internal-token.js\";\n\n/**\n * One-time warning when A2A is running unauthenticated in development. We\n * don't refuse the request (local templates need to work out of the box),\n * but we log a single noisy line so operators notice if they accidentally\n * deploy with no auth configured.\n */\nlet _warnedUnauthA2A = false;\nfunction warnA2AUnauthOnce(): void {\n if (_warnedUnauthA2A) return;\n _warnedUnauthA2A = true;\n // eslint-disable-next-line no-console\n console.warn(\n \"[a2a] No A2A_SECRET or apiKeyEnv configured — A2A endpoint runs unauthenticated. \" +\n \"This is allowed in development but blocked in production. Set A2A_SECRET before deploying.\",\n );\n}\n\n/**\n * Verify an inbound A2A JWT signed with the shared A2A_SECRET.\n * Returns the caller's email (from `sub` claim) if valid, null otherwise.\n */\ninterface A2ATokenPayload {\n email: string | null;\n orgDomain: string | null;\n}\n\n/**\n * Resolve the audience (`aud`) value to expect in an inbound JWT. We use the\n * receiver's app URL — it's the natural identifier of \"who this token was\n * minted for\". Falls back to undefined when no app URL is configured, in\n * which case the audience check is skipped (backward-compat with tokens\n * minted before the audience claim shipped).\n */\nfunction expectedJwtAudience(event: any | undefined): string | undefined {\n const fromEnv =\n process.env.APP_URL ||\n process.env.URL ||\n process.env.DEPLOY_URL ||\n process.env.BETTER_AUTH_URL;\n if (fromEnv) return String(fromEnv);\n // Best-effort: derive from the inbound request host. This is forgeable\n // (Host-header attack), but only useful as a hint when env-derived URL\n // is unset; the rest of the JWT verification still uses the secret.\n try {\n const proto = getRequestHeader(event, \"x-forwarded-proto\") || \"https\";\n const host = getRequestHeader(event, \"host\");\n if (host) return `${proto}://${host}`;\n } catch {}\n return undefined;\n}\n\nasync function verifyA2AToken(\n authHeader: string,\n event: any | undefined,\n): Promise<A2ATokenPayload> {\n const token = authHeader.replace(\"Bearer \", \"\");\n\n // Step 1: Peek at JWT claims WITHOUT verification to get org_domain.\n // This is safe because we only use org_domain to look up the secret,\n // then verify the full JWT with that secret. If someone forges a JWT\n // with a fake org_domain, verification will fail because they don't\n // have the real secret.\n let orgDomainHint: string | undefined;\n let unverifiedPayload: jose.JWTPayload | undefined;\n try {\n unverifiedPayload = jose.decodeJwt(token);\n orgDomainHint = unverifiedPayload.org_domain as string | undefined;\n } catch {\n // Malformed token — fall through to global secret attempt\n }\n\n // Step 2: Look up the org's A2A secret by domain\n let secret: string | undefined;\n if (orgDomainHint) {\n try {\n const { getA2ASecretByDomain } = await import(\"../org/context.js\");\n const orgSecret = await getA2ASecretByDomain(orgDomainHint);\n if (orgSecret) secret = orgSecret;\n } catch {\n // DB not ready or column doesn't exist yet — fall through\n }\n }\n\n // Step 3: Fall back to global A2A_SECRET\n if (!secret) secret = process.env.A2A_SECRET;\n if (!secret) return { email: null, orgDomain: null };\n\n // Step 4: Verify JWT with the resolved secret.\n //\n // - `audience`: passed only when the token carries an `aud` claim\n // (backward-compat: tokens minted by older `signA2AToken` versions\n // don't include one).\n // - `issuer`: enforced when the token carries an `iss` claim. The\n // sender's `signA2AToken` (`a2a/client.ts:42`) sets the issuer to its\n // own app URL, so a verified token must self-identify a non-empty\n // string issuer. We accept any string the token claims (we don't pin\n // a specific expected issuer because dispatchers may legitimately\n // mint tokens from many sender URLs — dev tunnels, multi-deploy\n // setups). The pin is \"issuer must match the value the token says\n // it was minted from\", which `jose.jwtVerify` validates exactly when\n // `issuer` is supplied as a string. Backward-compat: when the token\n // has no `iss`, we skip the check.\n try {\n const verifyOptions: jose.JWTVerifyOptions = {};\n if (unverifiedPayload && typeof unverifiedPayload.aud !== \"undefined\") {\n const aud = expectedJwtAudience(event);\n if (aud) verifyOptions.audience = aud;\n }\n if (\n unverifiedPayload &&\n typeof unverifiedPayload.iss === \"string\" &&\n unverifiedPayload.iss.length > 0\n ) {\n verifyOptions.issuer = unverifiedPayload.iss;\n }\n const { payload } = await jose.jwtVerify(\n token,\n new TextEncoder().encode(secret),\n verifyOptions,\n );\n return {\n email: (payload.sub as string) ?? null,\n orgDomain: (payload.org_domain as string) ?? null,\n };\n } catch {\n return { email: null, orgDomain: null };\n }\n}\n\n/**\n * Mount A2A protocol endpoints on an H3/Nitro app.\n *\n * - GET /.well-known/agent-card.json — public agent card (no auth)\n * - POST /_agent-native/a2a — JSON-RPC endpoint (with optional auth)\n *\n * When A2A_SECRET is set, inbound Bearer tokens are verified as JWTs\n * and the caller's email is extracted from the `sub` claim. This provides\n * cryptographic identity verification for cross-app A2A calls.\n */\nexport function mountA2A(\n nitroApp: any,\n config: A2AConfig,\n routePrefix = \"/_agent-native\",\n): void {\n // Public agent card endpoint (no auth required).\n //\n // SECURITY: per-user / per-org MCP tools are filtered out of the public\n // skills list. Their merged-key prefix (`mcp__user_<emailhash>_…` or\n // `mcp__org_<orgid>_…`) discloses (a) which users have integrations\n // attached, and (b) what those integrations are — fingerprinting the\n // tenant. Template- and framework-defined skills stay; only the dynamic\n // per-tenant MCP entries are dropped. See finding #7 in\n // /tmp/security-audit/12-mcp-a2a-agent.md.\n getH3App(nitroApp).use(\n \"/.well-known/agent-card.json\",\n defineEventHandler((event) => {\n if (getMethod(event) !== \"GET\") {\n setResponseStatus(event, 405);\n return { error: \"Method not allowed\" };\n }\n const protocol =\n getRequestHeader(event, \"x-forwarded-proto\") ||\n (event.url?.protocol?.replace(\":\", \"\") ?? \"http\");\n const host = getRequestHeader(event, \"host\") ?? \"localhost\";\n const baseUrl = `${protocol}://${host}`;\n\n // Filter out per-user/per-org MCP tools to avoid tenant disclosure.\n // Note: stdio MCP tools loaded from a file-based mcp.config.json are\n // process-wide and don't carry a per-user/per-org prefix, so they\n // remain visible. That's intentional — they're an operator-controlled\n // capability list.\n const filteredSkills = (config.skills ?? []).filter((skill) => {\n const id =\n (skill as { id?: string; name?: string }).id ??\n (skill as { name?: string }).name ??\n \"\";\n if (typeof id !== \"string\") return true;\n return !id.startsWith(\"mcp__user_\") && !id.startsWith(\"mcp__org_\");\n });\n\n return generateAgentCard({ ...config, skills: filteredSkills }, baseUrl);\n }),\n );\n\n // Async-mode processor route. MUST be mounted BEFORE the `/a2a` catch-all\n // below, since h3's `.use()` matches by prefix and `/a2a` would otherwise\n // swallow `/a2a/_process-task` and return a JSON-RPC \"Invalid token\" error\n // (the JSON-RPC handler doesn't know about taskId-only bodies).\n //\n // When `message/send` is called with `async: true`, the JSON-RPC handler\n // enqueues the task and self-fires a POST to this route on the same\n // deployment so the actual handler runs in a fresh function execution (its\n // own full timeout). Authenticated with an HMAC token bound to the task id\n // (5-minute lifetime, signed with A2A_SECRET — same scheme as the\n // integration webhook queue).\n getH3App(nitroApp).use(\n `${routePrefix}/a2a/_process-task`,\n defineEventHandler(async (event) => {\n if (getMethod(event) !== \"POST\") {\n setResponseStatus(event, 405);\n return { error: \"Method not allowed\" };\n }\n\n const body = (await readBody(event)) as { taskId?: unknown } | null;\n const taskId = body && typeof body.taskId === \"string\" ? body.taskId : \"\";\n if (!taskId) {\n setResponseStatus(event, 400);\n return { error: \"taskId required\" };\n }\n\n // When A2A_SECRET is set, require a valid HMAC token bound to this\n // taskId. In production, we REQUIRE A2A_SECRET to be set so unsigned\n // dispatches are never accepted (an attacker who fishes a taskId out\n // of logs / a share link could otherwise force-replay it). In\n // development, a missing secret is permitted so local templates work\n // out of the box, but we log a one-time warning so operators notice.\n if (process.env.A2A_SECRET) {\n const auth = getRequestHeader(event, \"authorization\");\n const tok = extractBearerToken(auth);\n if (!verifyInternalToken(taskId, tok)) {\n setResponseStatus(event, 401);\n return { error: \"Invalid or expired processor token\" };\n }\n } else if (process.env.NODE_ENV === \"production\") {\n setResponseStatus(event, 503);\n return {\n error:\n \"A2A processor not configured — set A2A_SECRET on this deployment to enable async A2A.\",\n };\n } else {\n warnA2AUnauthOnce();\n }\n\n try {\n await processA2ATaskFromQueue(taskId, config, event);\n return { ok: true };\n } catch (err: any) {\n console.error(\"[a2a] process-task failed:\", err);\n setResponseStatus(event, 500);\n return { error: err?.message ?? \"process-task failed\" };\n }\n }),\n );\n\n // JSON-RPC A2A endpoint (with optional auth)\n getH3App(nitroApp).use(\n `${routePrefix}/a2a`,\n defineEventHandler(async (event) => {\n if (getMethod(event) !== \"POST\") {\n setResponseStatus(event, 405);\n return { error: \"Method not allowed\" };\n }\n\n // h3 prefix-matches mounts, so a request to `/a2a/_process-task`\n // reaches this handler too. The dedicated mount above runs first and\n // takes the request, but if that returns `undefined` (or h3 ever\n // changes ordering semantics) defensively bail here. event.path is\n // stripped to the remainder after the mount prefix.\n const sub = (event.path || \"/\").split(\"?\")[0].replace(/^\\//, \"\");\n if (sub.startsWith(\"_process-task\")) return;\n\n const authHeader = getRequestHeader(event, \"authorization\");\n let verifiedCallerEmail: string | null = null;\n let verifiedOrgDomain: string | null = null;\n let legacyApiKeyAuthenticated = false;\n let bearerTokenRejectedByJwt = false;\n\n // SECURITY: when neither A2A_SECRET nor an apiKeyEnv is configured,\n // there's no way to authenticate the caller. Default to \"auth required\"\n // in production — return 503 with a clear message instead of running\n // the agent loop unauthenticated. In development, log a one-time\n // warning but allow so local templates work out of the box.\n const hasA2ASecret = !!process.env.A2A_SECRET;\n const hasApiKey = !!(config.apiKeyEnv && process.env[config.apiKeyEnv]);\n\n // Try JWT verification first (org-level or global A2A_SECRET-based identity)\n if (authHeader?.startsWith(\"Bearer \")) {\n const tokenPayload = await verifyA2AToken(authHeader, event);\n verifiedCallerEmail = tokenPayload.email;\n verifiedOrgDomain = tokenPayload.orgDomain;\n bearerTokenRejectedByJwt = !verifiedCallerEmail;\n }\n\n // Fall back to legacy API key check (exact string match)\n if (!verifiedCallerEmail && config.apiKeyEnv) {\n const expectedKey = process.env[config.apiKeyEnv];\n if (expectedKey) {\n if (!authHeader || !authHeader.startsWith(\"Bearer \")) {\n setResponseStatus(event, 401);\n return {\n jsonrpc: \"2.0\",\n id: null,\n error: { code: -32001, message: \"Authentication required\" },\n };\n }\n const token = authHeader.slice(7);\n if (token !== expectedKey) {\n setResponseStatus(event, 401);\n return {\n jsonrpc: \"2.0\",\n id: null,\n error: { code: -32001, message: \"Invalid API key\" },\n };\n }\n legacyApiKeyAuthenticated = true;\n }\n }\n\n if (!verifiedCallerEmail && !legacyApiKeyAuthenticated) {\n // If a global secret exists and JWT verification failed, reject after\n // giving the legacy exact-match apiKeyEnv path a chance to succeed.\n if (bearerTokenRejectedByJwt && process.env.A2A_SECRET) {\n setResponseStatus(event, 401);\n return {\n jsonrpc: \"2.0\",\n id: null,\n error: {\n code: -32001,\n message: \"Invalid or expired A2A token\",\n },\n };\n }\n\n if (!hasA2ASecret && !hasApiKey) {\n if (process.env.NODE_ENV === \"production\") {\n setResponseStatus(event, 503);\n return {\n jsonrpc: \"2.0\",\n id: null,\n error: {\n code: -32001,\n message:\n \"A2A authentication not configured. Set A2A_SECRET (preferred) or configure apiKeyEnv to accept inbound A2A traffic.\",\n },\n };\n }\n warnA2AUnauthOnce();\n }\n }\n\n // Store verified caller identity on the event context so the handler\n // can set request context from a trusted source instead of metadata\n if (verifiedCallerEmail) {\n event.context.__a2aVerifiedEmail = verifiedCallerEmail;\n }\n if (verifiedOrgDomain) {\n event.context.__a2aOrgDomain = verifiedOrgDomain;\n }\n\n const body = await readBody(event);\n return handleJsonRpcH3(body, event, config);\n }),\n );\n}\n"]}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/a2a/server.ts"],"names":[],"mappings":"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","sourcesContent":["import * as jose from \"jose\";\nimport { getH3App } from \"../server/framework-request-handler.js\";\nimport {\n defineEventHandler,\n setResponseHeader,\n setResponseStatus,\n getMethod,\n getRequestHeader,\n} from \"h3\";\nimport type { A2AConfig } from \"./types.js\";\nimport { generateAgentCard } from \"./agent-card.js\";\nimport { handleJsonRpcH3, processA2ATaskFromQueue } from \"./handlers.js\";\nimport { readBody } from \"../server/h3-helpers.js\";\nimport {\n extractBearerToken,\n verifyInternalToken,\n} from \"../integrations/internal-token.js\";\nimport {\n hasConfiguredA2ASecret,\n isA2AProductionRuntime,\n} from \"./auth-policy.js\";\n\n/**\n * One-time warning when A2A is running unauthenticated in development. We\n * don't refuse the request (local templates need to work out of the box),\n * but we log a single noisy line so operators notice if they accidentally\n * deploy with no auth configured.\n */\nlet _warnedUnauthA2A = false;\nfunction warnA2AUnauthOnce(): void {\n if (_warnedUnauthA2A) return;\n _warnedUnauthA2A = true;\n // eslint-disable-next-line no-console\n console.warn(\n \"[a2a] No A2A_SECRET or apiKeyEnv configured — A2A endpoint runs unauthenticated. \" +\n \"This is allowed in development but blocked in production. Set A2A_SECRET before deploying.\",\n );\n}\n\n/**\n * Verify an inbound A2A JWT signed with the shared A2A_SECRET.\n * Returns the caller's email (from `sub` claim) if valid, null otherwise.\n */\ninterface A2ATokenPayload {\n email: string | null;\n orgDomain: string | null;\n}\n\nfunction addSecretCandidate(\n candidates: string[],\n secret: string | undefined,\n): void {\n const trimmed = secret?.trim();\n if (!trimmed || candidates.includes(trimmed)) return;\n candidates.push(trimmed);\n}\n\n/**\n * Resolve the audience (`aud`) value to expect in an inbound JWT. We use the\n * receiver's app URL — it's the natural identifier of \"who this token was\n * minted for\". Falls back to undefined when no app URL is configured, in\n * which case the audience check is skipped (backward-compat with tokens\n * minted before the audience claim shipped).\n */\nfunction expectedJwtAudience(event: any | undefined): string | undefined {\n const fromEnv =\n process.env.APP_URL ||\n process.env.URL ||\n process.env.DEPLOY_URL ||\n process.env.BETTER_AUTH_URL;\n if (fromEnv) return String(fromEnv);\n // Best-effort: derive from the inbound request host. This is forgeable\n // (Host-header attack), but only useful as a hint when env-derived URL\n // is unset; the rest of the JWT verification still uses the secret.\n try {\n const proto = getRequestHeader(event, \"x-forwarded-proto\") || \"https\";\n const host = getRequestHeader(event, \"host\");\n if (host) return `${proto}://${host}`;\n } catch {}\n return undefined;\n}\n\nasync function verifyA2AToken(\n token: string,\n event: any | undefined,\n): Promise<A2ATokenPayload> {\n // Step 1: Peek at JWT claims WITHOUT verification to get org_domain.\n // This is safe because we only use org_domain to look up the secret,\n // then verify the full JWT with that secret. If someone forges a JWT\n // with a fake org_domain, verification will fail because they don't\n // have the real secret.\n let orgDomainHint: string | undefined;\n let unverifiedPayload: jose.JWTPayload | undefined;\n try {\n unverifiedPayload = jose.decodeJwt(token);\n orgDomainHint = unverifiedPayload.org_domain as string | undefined;\n } catch {\n // Malformed token — fall through to global secret attempt\n }\n\n // Step 2: Build a small, ordered set of candidate secrets. Tokens minted by\n // current callers prefer the shared A2A_SECRET; older callers may still use\n // an org-level secret. Try both without logging or reflecting secret details.\n const candidateSecrets: string[] = [];\n addSecretCandidate(candidateSecrets, process.env.A2A_SECRET);\n if (orgDomainHint) {\n try {\n const { getA2ASecretByDomain } = await import(\"../org/context.js\");\n const orgSecret = await getA2ASecretByDomain(orgDomainHint);\n addSecretCandidate(candidateSecrets, orgSecret);\n } catch {\n // DB not ready or column doesn't exist yet — fall through\n }\n }\n if (candidateSecrets.length === 0) return { email: null, orgDomain: null };\n\n // Step 3: Verify JWT with the candidate secrets.\n //\n // - `audience`: passed only when the token carries an `aud` claim\n // (backward-compat: tokens minted by older `signA2AToken` versions\n // don't include one).\n // - `issuer`: enforced when the token carries an `iss` claim. The\n // sender's `signA2AToken` (`a2a/client.ts:42`) sets the issuer to its\n // own app URL, so a verified token must self-identify a non-empty\n // string issuer. We accept any string the token claims (we don't pin\n // a specific expected issuer because dispatchers may legitimately\n // mint tokens from many sender URLs — dev tunnels, multi-deploy\n // setups). The pin is \"issuer must match the value the token says\n // it was minted from\", which `jose.jwtVerify` validates exactly when\n // `issuer` is supplied as a string. Backward-compat: when the token\n // has no `iss`, we skip the check.\n try {\n const verifyOptions: jose.JWTVerifyOptions = {};\n if (unverifiedPayload && typeof unverifiedPayload.aud !== \"undefined\") {\n const aud = expectedJwtAudience(event);\n if (aud) verifyOptions.audience = aud;\n }\n if (\n unverifiedPayload &&\n typeof unverifiedPayload.iss === \"string\" &&\n unverifiedPayload.iss.length > 0\n ) {\n verifyOptions.issuer = unverifiedPayload.iss;\n }\n for (const secret of candidateSecrets) {\n try {\n const { payload } = await jose.jwtVerify(\n token,\n new TextEncoder().encode(secret),\n verifyOptions,\n );\n return {\n email: (payload.sub as string) ?? null,\n orgDomain: (payload.org_domain as string) ?? null,\n };\n } catch {\n // Try the next candidate without leaking which secret failed.\n }\n }\n } catch {\n // Keep malformed option construction indistinguishable from auth failure.\n }\n return { email: null, orgDomain: null };\n}\n\n/**\n * Mount A2A protocol endpoints on an H3/Nitro app.\n *\n * - GET /.well-known/agent-card.json — public agent card (no auth)\n * - POST /_agent-native/a2a — JSON-RPC endpoint (with optional auth)\n *\n * When A2A_SECRET is set, inbound Bearer tokens are verified as JWTs\n * and the caller's email is extracted from the `sub` claim. This provides\n * cryptographic identity verification for cross-app A2A calls.\n */\nexport function mountA2A(\n nitroApp: any,\n config: A2AConfig,\n routePrefix = \"/_agent-native\",\n): void {\n // Public agent card endpoint (no auth required).\n //\n // SECURITY: per-user / per-org MCP tools are filtered out of the public\n // skills list. Their merged-key prefix (`mcp__user_<emailhash>_…` or\n // `mcp__org_<orgid>_…`) discloses (a) which users have integrations\n // attached, and (b) what those integrations are — fingerprinting the\n // tenant. Template- and framework-defined skills stay; only the dynamic\n // per-tenant MCP entries are dropped. See finding #7 in\n // /tmp/security-audit/12-mcp-a2a-agent.md.\n getH3App(nitroApp).use(\n \"/.well-known/agent-card.json\",\n defineEventHandler((event) => {\n if (getMethod(event) !== \"GET\") {\n setResponseStatus(event, 405);\n return { error: \"Method not allowed\" };\n }\n const protocol =\n getRequestHeader(event, \"x-forwarded-proto\") ||\n (event.url?.protocol?.replace(\":\", \"\") ?? \"http\");\n const host = getRequestHeader(event, \"host\") ?? \"localhost\";\n const baseUrl = `${protocol}://${host}`;\n\n // Filter out per-user/per-org MCP tools to avoid tenant disclosure.\n // Note: stdio MCP tools loaded from a file-based mcp.config.json are\n // process-wide and don't carry a per-user/per-org prefix, so they\n // remain visible. That's intentional — they're an operator-controlled\n // capability list.\n const filteredSkills = (config.skills ?? []).filter((skill) => {\n const id =\n (skill as { id?: string; name?: string }).id ??\n (skill as { name?: string }).name ??\n \"\";\n if (typeof id !== \"string\") return true;\n return !id.startsWith(\"mcp__user_\") && !id.startsWith(\"mcp__org_\");\n });\n\n return generateAgentCard({ ...config, skills: filteredSkills }, baseUrl);\n }),\n );\n\n // Async-mode processor route. MUST be mounted BEFORE the `/a2a` catch-all\n // below, since h3's `.use()` matches by prefix and `/a2a` would otherwise\n // swallow `/a2a/_process-task` and return a JSON-RPC \"Invalid token\" error\n // (the JSON-RPC handler doesn't know about taskId-only bodies).\n //\n // When `message/send` is called with `async: true`, the JSON-RPC handler\n // enqueues the task and self-fires a POST to this route on the same\n // deployment so the actual handler runs in a fresh function execution (its\n // own full timeout). Authenticated with an HMAC token bound to the task id\n // (5-minute lifetime, signed with A2A_SECRET — same scheme as the\n // integration webhook queue).\n getH3App(nitroApp).use(\n `${routePrefix}/a2a/_process-task`,\n defineEventHandler(async (event) => {\n if (getMethod(event) !== \"POST\") {\n setResponseStatus(event, 405);\n return { error: \"Method not allowed\" };\n }\n\n const body = (await readBody(event)) as { taskId?: unknown } | null;\n const taskId = body && typeof body.taskId === \"string\" ? body.taskId : \"\";\n if (!taskId) {\n setResponseStatus(event, 400);\n return { error: \"taskId required\" };\n }\n\n // When A2A_SECRET is set, require a valid HMAC token bound to this\n // taskId. In production, we REQUIRE A2A_SECRET to be set so unsigned\n // dispatches are never accepted (an attacker who fishes a taskId out\n // of logs / a share link could otherwise force-replay it). In\n // development, a missing secret is permitted so local templates work\n // out of the box, but we log a one-time warning so operators notice.\n if (hasConfiguredA2ASecret()) {\n const auth = getRequestHeader(event, \"authorization\");\n const tok = extractBearerToken(auth);\n if (!verifyInternalToken(taskId, tok)) {\n setResponseStatus(event, 401);\n return { error: \"Invalid or expired processor token\" };\n }\n } else if (isA2AProductionRuntime()) {\n setResponseStatus(event, 503);\n return {\n error:\n \"A2A processor not configured — set A2A_SECRET on this deployment to enable async A2A.\",\n };\n } else {\n warnA2AUnauthOnce();\n }\n\n try {\n await processA2ATaskFromQueue(taskId, config, event);\n return { ok: true };\n } catch (err: any) {\n console.error(\"[a2a] process-task failed:\", err);\n setResponseStatus(event, 500);\n return { error: err?.message ?? \"process-task failed\" };\n }\n }),\n );\n\n // JSON-RPC A2A endpoint (with optional auth)\n getH3App(nitroApp).use(\n `${routePrefix}/a2a`,\n defineEventHandler(async (event) => {\n if (getMethod(event) !== \"POST\") {\n setResponseStatus(event, 405);\n return { error: \"Method not allowed\" };\n }\n\n // h3 prefix-matches mounts, so a request to `/a2a/_process-task`\n // reaches this handler too. The dedicated mount above runs first and\n // takes the request, but if that returns `undefined` (or h3 ever\n // changes ordering semantics) defensively bail here. event.path is\n // stripped to the remainder after the mount prefix.\n const sub = (event.path || \"/\").split(\"?\")[0].replace(/^\\//, \"\");\n if (sub.startsWith(\"_process-task\")) return;\n\n const authHeader = getRequestHeader(event, \"authorization\");\n const bearerToken = extractBearerToken(authHeader);\n let verifiedCallerEmail: string | null = null;\n let verifiedOrgDomain: string | null = null;\n let legacyApiKeyAuthenticated = false;\n let bearerTokenRejectedByJwt = false;\n\n // SECURITY: when neither A2A_SECRET nor an apiKeyEnv is configured,\n // there's no way to authenticate the caller. Default to \"auth required\"\n // in production — return 503 with a clear message instead of running\n // the agent loop unauthenticated. In development, log a one-time\n // warning but allow so local templates work out of the box.\n const hasA2ASecret = hasConfiguredA2ASecret();\n const hasApiKey = !!(config.apiKeyEnv && process.env[config.apiKeyEnv]);\n\n // Try JWT verification first (org-level or global A2A_SECRET-based identity)\n if (bearerToken) {\n const tokenPayload = await verifyA2AToken(bearerToken, event);\n verifiedCallerEmail = tokenPayload.email;\n verifiedOrgDomain = tokenPayload.orgDomain;\n bearerTokenRejectedByJwt = !verifiedCallerEmail;\n }\n\n // Fall back to legacy API key check (exact string match)\n if (!verifiedCallerEmail && config.apiKeyEnv) {\n const expectedKey = process.env[config.apiKeyEnv];\n if (expectedKey) {\n if (!bearerToken) {\n setResponseStatus(event, 401);\n return {\n jsonrpc: \"2.0\",\n id: null,\n error: { code: -32001, message: \"Authentication required\" },\n };\n }\n if (bearerToken !== expectedKey) {\n setResponseStatus(event, 401);\n return {\n jsonrpc: \"2.0\",\n id: null,\n error: { code: -32001, message: \"Invalid API key\" },\n };\n }\n legacyApiKeyAuthenticated = true;\n }\n }\n\n if (!verifiedCallerEmail && !legacyApiKeyAuthenticated) {\n // Any supplied bearer token that failed JWT verification is an auth\n // failure after the legacy exact-match apiKeyEnv path has had a\n // chance to succeed. Do not let bad tokens fall through to tasks/get\n // and get reported as lookup misses.\n if (bearerTokenRejectedByJwt) {\n setResponseStatus(event, 401);\n return {\n jsonrpc: \"2.0\",\n id: null,\n error: {\n code: -32001,\n message: \"Invalid or expired A2A token\",\n },\n };\n }\n\n if (!hasA2ASecret && !hasApiKey) {\n if (isA2AProductionRuntime()) {\n setResponseStatus(event, 503);\n return {\n jsonrpc: \"2.0\",\n id: null,\n error: {\n code: -32001,\n message:\n \"A2A authentication not configured. Set A2A_SECRET (preferred) or configure apiKeyEnv to accept inbound A2A traffic.\",\n },\n };\n }\n warnA2AUnauthOnce();\n }\n }\n\n // Store verified caller identity on the event context so the handler\n // can set request context from a trusted source instead of metadata\n if (verifiedCallerEmail) {\n event.context.__a2aVerifiedEmail = verifiedCallerEmail;\n }\n if (verifiedOrgDomain) {\n event.context.__a2aOrgDomain = verifiedOrgDomain;\n }\n\n const body = await readBody(event);\n return handleJsonRpcH3(body, event, config);\n }),\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ResourceEditor.d.ts","sourceRoot":"","sources":["../../../src/client/resources/ResourceEditor.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAWnD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,qFAAqF;IACrF,IAAI,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,GAAG,MAAM,KAAK,IAAI,CAAC;IAC9C,0CAA0C;IAC1C,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,KAAK,IAAI,CAAC;IACnE,6DAA6D;IAC7D,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAgiCD,wBAAgB,cAAc,CAAC,EAC7B,QAAQ,EACR,MAAM,EACN,IAAI,EAAE,cAAc,EACpB,YAAY,EACZ,kBAAkB,EAClB,WAAW,GACZ,EAAE,mBAAmB,2CAuLrB"}
1
+ {"version":3,"file":"ResourceEditor.d.ts","sourceRoot":"","sources":["../../../src/client/resources/ResourceEditor.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAYnD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,qFAAqF;IACrF,IAAI,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,GAAG,MAAM,KAAK,IAAI,CAAC;IAC9C,0CAA0C;IAC1C,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,KAAK,IAAI,CAAC;IACnE,6DAA6D;IAC7D,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AA8hCD,wBAAgB,cAAc,CAAC,EAC7B,QAAQ,EACR,MAAM,EACN,IAAI,EAAE,cAAc,EACpB,YAAY,EACZ,kBAAkB,EAClB,WAAW,GACZ,EAAE,mBAAmB,2CAuLrB"}
@@ -7,7 +7,7 @@ import Link from "@tiptap/extension-link";
7
7
  import { Markdown } from "tiptap-markdown";
8
8
  import { cn } from "../utils.js";
9
9
  import { agentNativePath } from "../api-path.js";
10
- import { getFrontmatterValue, isCustomAgentPath, isRemoteAgentPath, isSkillPath, parseFrontmatter, serializeFrontmatter, } from "../../resources/metadata.js";
10
+ import { getRemoteAgentIdFromPath, getFrontmatterValue, isCustomAgentPath, isRemoteAgentPath, isSkillPath, parseFrontmatter, serializeFrontmatter, } from "../../resources/metadata.js";
11
11
  const CONTROL_STYLE = { fontSize: 12, lineHeight: 1 };
12
12
  const VIEW_PREF_KEY = "resource-editor-view";
13
13
  function getViewPref() {
@@ -633,9 +633,7 @@ function VisualMarkdownEditor({ content, onChange, resourcePath, }) {
633
633
  } })), _jsx(InlineBubbleToolbar, { editor: editor }), _jsx(SlashMenu, { editor: editor }), _jsx(EditorContent, { editor: editor })] }));
634
634
  }
635
635
  function parseRemoteAgentContent(content, path) {
636
- const fallbackId = path
637
- .replace(/^remote-agents\//, "")
638
- .replace(/\.json$/, "");
636
+ const fallbackId = getRemoteAgentIdFromPath(path);
639
637
  try {
640
638
  const data = JSON.parse(content || "{}");
641
639
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"ResourceEditor.js","sourceRoot":"","sources":["../../../src/client/resources/ResourceEditor.tsx"],"names":[],"mappings":";AAAA,OAAc,EACZ,QAAQ,EACR,MAAM,EACN,SAAS,EACT,WAAW,EACX,OAAO,GACR,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,UAAU,MAAM,qBAAqB,CAAC;AAC7C,OAAO,WAAW,MAAM,+BAA+B,CAAC;AACxD,OAAO,IAAI,MAAM,wBAAwB,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,OAAO,EAEL,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,WAAW,EACX,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,6BAA6B,CAAC;AAcrC,MAAM,aAAa,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAW,CAAC;AAE/D,MAAM,aAAa,GAAG,sBAAsB,CAAC;AAE7C,SAAS,WAAW;IAClB,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAC9C,IAAI,CAAC,KAAK,MAAM;YAAE,OAAO,MAAM,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IACV,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,WAAW,CAAC,CAAoB;IACvC,IAAI,CAAC;QACH,YAAY,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;AACZ,CAAC;AAED,MAAM,cAAc,GAAwB;IAC1C,UAAU,EAAE,aAAa;IACzB,MAAM,EAAE,MAAM;IACd,OAAO,EAAE,MAAM;IACf,KAAK,EAAE,SAAS;IAChB,QAAQ,EAAE,SAAS;IACnB,UAAU,EAAE,SAAS;IACrB,KAAK,EAAE,MAAM;IACb,OAAO,EAAE,CAAC;CACX,CAAC;AAEF,SAAS,cAAc,CAAC,EACtB,YAAY,EACZ,WAAW,EACX,QAAQ,GAKT;IACC,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,mBAAmB,CAAC,WAAW,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;IAE9E,MAAM,WAAW,GAAG,CAAC,GAAW,EAAE,KAAa,EAAE,EAAE;QACjD,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;QAC7D,MAAM,SAAS,GAAG,MAAM;YACtB,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACtE,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAsB;YACjC,GAAG,WAAW;YACd,GAAG,EAAE,oBAAoB,CAAC,SAAS,CAAC;YACpC,MAAM,EAAE,SAAS;SAClB,CAAC;QACF,QAAQ,CAAC,OAAO,CAAC,CAAC;IACpB,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC9B,MAAM,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;IAC5C,MAAM,eAAe,GAAG,QAAQ,CAAC,gBAAgB,CAAC,KAAK,MAAM,CAAC;IAC9D,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC;IAC7C,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC;IAC7C,MAAM,aAAa,GAAG,iBAAiB,CAAC,YAAY,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;IAE1C,OAAO,CACL,eACE,KAAK,EAAE;YACL,OAAO,EAAE,UAAU;YACnB,YAAY,EAAE,CAAC;YACf,YAAY,EAAE,CAAC;YACf,UAAU,EAAE,yBAAyB;YACrC,MAAM,EAAE,oCAAoC;YAC5C,QAAQ,EAAE,EAAE;YACZ,UAAU,EAAE,GAAG;YACf,KAAK,EAAE,8BAA8B;SACtC,aAED,eAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,aAC3D,gBACE,KAAK,EAAE,IAAI,EACX,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACpD,WAAW,EAAE,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,EACxD,KAAK,EAAE;4BACL,GAAG,cAAc;4BACjB,UAAU,EAAE,GAAG;4BACf,KAAK,EAAE,wBAAwB;4BAC/B,QAAQ,EAAE,EAAE;4BACZ,IAAI,EAAE,CAAC;yBACR,GACD,EACD,OAAO,CAAC,CAAC,CAAC,CACT,iBACE,KAAK,EAAE;4BACL,OAAO,EAAE,MAAM;4BACf,UAAU,EAAE,QAAQ;4BACpB,GAAG,EAAE,CAAC;4BACN,QAAQ,EAAE,EAAE;4BACZ,MAAM,EAAE,SAAS;4BACjB,UAAU,EAAE,QAAQ;4BACpB,UAAU,EAAE,MAAM;4BAClB,OAAO,EAAE,SAAS;4BAClB,YAAY,EAAE,CAAC;4BACf,UAAU,EAAE,eAAe;gCACzB,CAAC,CAAC,4BAA4B;gCAC9B,CAAC,CAAC,aAAa;4BACjB,KAAK,EAAE,eAAe;gCACpB,CAAC,CAAC,qBAAqB;gCACvB,CAAC,CAAC,8BAA8B;4BAClC,MAAM,EAAE,eAAe;gCACrB,CAAC,CAAC,MAAM;gCACR,CAAC,CAAC,+BAA+B;4BACnC,UAAU,EAAE,GAAG;yBAChB,aAED,gBACE,IAAI,EAAC,UAAU,EACf,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CACd,WAAW,CACT,gBAAgB,EAChB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CACpC,EAEH,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAC1B,OACA,IAAI,IAAI,SAAS,IACb,CACT,CAAC,CAAC,CAAC,IAAI,EACP,aAAa,CAAC,CAAC,CAAC,CACf,kBACE,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACrD,KAAK,EAAE;4BACL,YAAY,EAAE,CAAC;4BACf,MAAM,EAAE,8BAA8B;4BACtC,UAAU,EAAE,wBAAwB;4BACpC,KAAK,EAAE,wBAAwB;4BAC/B,QAAQ,EAAE,EAAE;4BACZ,OAAO,EAAE,SAAS;yBACnB,aAED,iBAAQ,KAAK,EAAC,SAAS,8BAAuB,EAC9C,iBAAQ,KAAK,EAAC,mBAAmB,kCAA2B,EAC5D,iBAAQ,KAAK,EAAC,2BAA2B,iCAA0B,IAC5D,CACV,CAAC,CAAC,CAAC,IAAI,IACJ,EACN,gBACE,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,aAAa,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC3D,WAAW,EACT,aAAa;oBACX,CAAC,CAAC,6CAA6C;oBAC/C,CAAC,CAAC,oCAAoC,EAE1C,KAAK,EAAE;oBACL,GAAG,cAAc;oBACjB,SAAS,EAAE,CAAC;oBACZ,OAAO,EAAE,GAAG;oBACZ,KAAK,EAAE,8BAA8B;iBACtC,GACD,EACD,aAAa,CAAC,CAAC,CAAC,CACf,eACE,KAAK,EAAE;oBACL,OAAO,EAAE,MAAM;oBACf,GAAG,EAAE,CAAC;oBACN,SAAS,EAAE,CAAC;oBACZ,UAAU,EAAE,QAAQ;iBACrB,aAED,gBACE,KAAK,EAAE;4BACL,QAAQ,EAAE,EAAE;4BACZ,KAAK,EAAE,8BAA8B;4BACrC,QAAQ,EAAE,EAAE;yBACb,sBAGK,EACR,kBACE,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACrD,KAAK,EAAE;4BACL,YAAY,EAAE,CAAC;4BACf,MAAM,EAAE,8BAA8B;4BACtC,UAAU,EAAE,wBAAwB;4BACpC,KAAK,EAAE,wBAAwB;4BAC/B,QAAQ,EAAE,EAAE;4BACZ,OAAO,EAAE,SAAS;yBACnB,aAED,iBAAQ,KAAK,EAAC,SAAS,wBAAiB,EACxC,iBAAQ,KAAK,EAAC,WAAW,gCAAyB,EAClD,iBAAQ,KAAK,EAAC,UAAU,+BAAwB,IACzC,IACL,CACP,CAAC,CAAC,CAAC,IAAI,IACJ,CACP,CAAC;AACJ,CAAC;AAWD,MAAM,aAAa,GAAkB;IACnC;QACE,KAAK,EAAE,MAAM;QACb,WAAW,EAAE,YAAY;QACzB,IAAI,EAAE,GAAG;QACT,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,YAAY,EAAE,CAAC,GAAG,EAAE;KAChE;IACD;QACE,KAAK,EAAE,WAAW;QAClB,WAAW,EAAE,eAAe;QAC5B,IAAI,EAAE,IAAI;QACV,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CACjB,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE;KAC3D;IACD;QACE,KAAK,EAAE,WAAW;QAClB,WAAW,EAAE,gBAAgB;QAC7B,IAAI,EAAE,IAAI;QACV,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CACjB,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE;KAC3D;IACD;QACE,KAAK,EAAE,WAAW;QAClB,WAAW,EAAE,eAAe;QAC5B,IAAI,EAAE,IAAI;QACV,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CACjB,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE;KAC3D;IACD;QACE,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,gBAAgB;QAC7B,IAAI,EAAE,GAAG;QACT,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,gBAAgB,EAAE,CAAC,GAAG,EAAE;KACpE;IACD;QACE,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,cAAc;QAC3B,IAAI,EAAE,IAAI;QACV,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,iBAAiB,EAAE,CAAC,GAAG,EAAE;KACrE;IACD;QACE,KAAK,EAAE,YAAY;QACnB,WAAW,EAAE,cAAc;QAC3B,IAAI,EAAE,IAAI;QACV,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,eAAe,EAAE,CAAC,GAAG,EAAE;KACnE;IACD;QACE,KAAK,EAAE,OAAO;QACd,WAAW,EAAE,aAAa;QAC1B,IAAI,EAAE,GAAG;QACT,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,gBAAgB,EAAE,CAAC,GAAG,EAAE;KACpE;IACD;QACE,KAAK,EAAE,SAAS;QAChB,WAAW,EAAE,iBAAiB;QAC9B,IAAI,EAAE,GAAG;QACT,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,iBAAiB,EAAE,CAAC,GAAG,EAAE;KACrE;CACF,CAAC;AAEF,SAAS,SAAS,CAAC,EAAE,MAAM,EAAmB;IAC5C,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACvC,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACtD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAI9B,IAAI,CAAC,CAAC;IAChB,MAAM,WAAW,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAE7C,MAAM,gBAAgB,GAAG,OAAO,CAC9B,GAAG,EAAE,CACH,aAAa,CAAC,MAAM,CAClB,CAAC,GAAG,EAAE,EAAE,CACN,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QACrD,GAAG,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAC9D,EACH,CAAC,KAAK,CAAC,CACR,CAAC;IAEF,MAAM,cAAc,GAAG,WAAW,CAChC,CAAC,GAAgB,EAAE,EAAE;QACnB,IAAI,WAAW,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YACjC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC;YACxC,MAAM;iBACH,KAAK,EAAE;iBACP,KAAK,EAAE;iBACP,WAAW,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;iBACpD,GAAG,EAAE,CAAC;QACX,CAAC;QACD,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACnB,SAAS,CAAC,KAAK,CAAC,CAAC;QACjB,QAAQ,CAAC,EAAE,CAAC,CAAC;QACb,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC;IAC7B,CAAC,EACD,CAAC,MAAM,CAAC,CACT,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,MAAM;YAAE,OAAO;QAEpB,MAAM,aAAa,GAAG,CAAC,CAAgB,EAAE,EAAE;YACzC,IAAI,CAAC,MAAM;gBAAE,OAAO;YAEpB,IAAI,CAAC,CAAC,GAAG,KAAK,WAAW,EAAE,CAAC;gBAC1B,CAAC,CAAC,cAAc,EAAE,CAAC;gBACnB,gBAAgB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;YAC7D,CAAC;iBAAM,IAAI,CAAC,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;gBAC/B,CAAC,CAAC,cAAc,EAAE,CAAC;gBACnB,gBAAgB,CACd,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAC,MAAM,CAAC,GAAG,gBAAgB,CAAC,MAAM,CACnE,CAAC;YACJ,CAAC;iBAAM,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;gBAC7B,CAAC,CAAC,cAAc,EAAE,CAAC;gBACnB,IAAI,gBAAgB,CAAC,aAAa,CAAC,EAAE,CAAC;oBACpC,cAAc,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC,CAAC;gBAClD,CAAC;YACH,CAAC;iBAAM,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAC9B,SAAS,CAAC,KAAK,CAAC,CAAC;gBACjB,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACb,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC;YAC7B,CAAC;QACH,CAAC,CAAC;QAEF,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;QAC1D,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;IAC5E,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC;IAEtE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,MAAM;YAAE,OAAO;QAEpB,MAAM,iBAAiB,GAAG,GAAG,EAAE;YAC7B,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;YACzB,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC;YACjC,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,WAAW,CACtC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,EAAE,CAAC,EACtB,IAAI,EACJ,IAAI,CACL,CAAC;YAEF,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;YAEzD,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,UAAU,GAAG,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;gBAC/C,WAAW,CAAC,OAAO,GAAG,UAAU,CAAC;gBACjC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;gBACxB,gBAAgB,CAAC,CAAC,CAAC,CAAC;gBAEpB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;gBAC7C,+DAA+D;gBAC/D,MAAM,UAAU,GAAG,GAAG,CAAC;gBACvB,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC;gBACtD,MAAM,MAAM,GAAG,UAAU,GAAG,UAAU,IAAI,MAAM,CAAC,GAAG,GAAG,UAAU,CAAC;gBAElE,WAAW,CAAC;oBACV,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;oBAC5C,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,GAAG,GAAG,CAAC;oBACpD,MAAM;iBACP,CAAC,CAAC;gBACH,SAAS,CAAC,IAAI,CAAC,CAAC;YAClB,CAAC;iBAAM,CAAC;gBACN,IAAI,MAAM,EAAE,CAAC;oBACX,SAAS,CAAC,KAAK,CAAC,CAAC;oBACjB,QAAQ,CAAC,EAAE,CAAC,CAAC;oBACb,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC;gBAC7B,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,CAAC,EAAE,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;QAC5C,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;QAC/C,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAErB,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEvE,OAAO,CACL,cACE,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE;YACL,QAAQ,EAAE,OAAO;YACjB,GAAG,CAAC,QAAQ,CAAC,MAAM;gBACjB,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,WAAW,GAAG,QAAQ,CAAC,GAAG,GAAG,CAAC,EAAE;gBACnD,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC;YAC1B,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,MAAM,EAAE,IAAI;SACb,EACD,SAAS,EAAC,eAAe,YAEzB,eAAK,SAAS,EAAC,MAAM,aACnB,cACE,KAAK,EAAE;wBACL,OAAO,EAAE,UAAU;wBACnB,QAAQ,EAAE,EAAE;wBACZ,UAAU,EAAE,GAAG;wBACf,aAAa,EAAE,WAAW;wBAC1B,aAAa,EAAE,QAAQ;wBACvB,OAAO,EAAE,GAAG;qBACb,uBAGG,EACL,gBAAgB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAChC,kBAEE,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,EAClC,YAAY,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,EACvC,SAAS,EAAE,EAAE,CACX,eAAe,EACf,CAAC,KAAK,aAAa,IAAI,uBAAuB,CAC/C,aAED,eAAM,SAAS,EAAC,eAAe,YAAE,GAAG,CAAC,IAAI,GAAQ,EACjD,2BACE,eAAM,SAAS,EAAC,gBAAgB,YAAE,GAAG,CAAC,KAAK,GAAQ,EACnD,eAAM,SAAS,EAAC,eAAe,YAAE,GAAG,CAAC,WAAW,GAAQ,IACnD,KAZF,GAAG,CAAC,KAAK,CAaP,CACV,CAAC,IACE,GACF,CACP,CAAC;AACJ,CAAC;AAED,gCAAgC;AAEhC,SAAS,mBAAmB,CAAC,EAAE,MAAM,EAAmB;IACtD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IAC1D,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC1D,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAEhD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,MAAM,MAAM,GAAG,GAAG,EAAE;YAClB,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC;YAC5C,IAAI,IAAI,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;gBACrC,UAAU,CAAC,KAAK,CAAC,CAAC;gBAClB,OAAO;YACT,CAAC;YACD,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;YAC3C,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;gBACnD,UAAU,CAAC,KAAK,CAAC,CAAC;gBAClB,OAAO;YACT,CAAC;YACD,MAAM,KAAK,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM,IAAI,GAAG,KAAK,CAAC,qBAAqB,EAAE,CAAC;YAC3C,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;gBACrB,UAAU,CAAC,KAAK,CAAC,CAAC;gBAClB,OAAO;YACT,CAAC;YACD,kDAAkD;YAClD,SAAS,CAAC;gBACR,GAAG,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC;gBACjB,IAAI,EAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC;aACjC,CAAC,CAAC;YACH,UAAU,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC,CAAC;QACF,MAAM,CAAC,EAAE,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,GAAG,EAAE;YAClB,4DAA4D;YAC5D,UAAU,CAAC,GAAG,EAAE;gBACd,IAAI,CAAC,MAAM,CAAC,SAAS;oBAAE,UAAU,CAAC,KAAK,CAAC,CAAC;YAC3C,CAAC,EAAE,GAAG,CAAC,CAAC;QACV,CAAC,CAAC;QACF,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC1B,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;YACtC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC7B,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,MAAM,aAAa,GAAG,GAAG,EAAE;QACzB,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YACnB,MAAM;iBACH,KAAK,EAAE;iBACP,KAAK,EAAE;iBACP,eAAe,CAAC,MAAM,CAAC;iBACvB,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;iBACjC,GAAG,EAAE,CAAC;QACX,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,CAAC;QACnE,CAAC;QACD,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACxB,UAAU,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,GAAG,EAAE;QACtB,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5B,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,CAAC;YACzC,OAAO;QACT,CAAC;QACD,MAAM,WAAW,GAAG,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;QAC5D,UAAU,CAAC,WAAW,CAAC,CAAC;QACxB,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG;QACZ;YACE,KAAK,EAAE,GAAG;YACV,KAAK,EAAE,MAAM;YACb,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE;YACvD,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YACvC,KAAK,EAAE,EAAE,UAAU,EAAE,GAAG,EAAyB;SAClD;QACD;YACE,KAAK,EAAE,GAAG;YACV,KAAK,EAAE,QAAQ;YACf,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,YAAY,EAAE,CAAC,GAAG,EAAE;YACzD,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACzC,KAAK,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAyB;SACtD;QACD;YACE,KAAK,EAAE,GAAG;YACV,KAAK,EAAE,eAAe;YACtB,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,YAAY,EAAE,CAAC,GAAG,EAAE;YACzD,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACzC,KAAK,EAAE,EAAE,cAAc,EAAE,cAAc,EAAyB;SACjE;QACD;YACE,KAAK,EAAE,IAAI;YACX,KAAK,EAAE,MAAM;YACb,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE;YACvD,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YACvC,KAAK,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,EAAyB;SACxE;QACD,EAAE,IAAI,EAAE,SAAkB,EAAE;QAC5B;YACE,KAAK,EAAE,IAAI;YACX,KAAK,EAAE,WAAW;YAClB,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE;YACtE,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;SACzD;QACD;YACE,KAAK,EAAE,IAAI;YACX,KAAK,EAAE,WAAW;YAClB,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE;YACtE,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;SACzD;QACD;YACE,KAAK,EAAE,IAAI;YACX,KAAK,EAAE,WAAW;YAClB,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE;YACtE,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;SACzD;QACD,EAAE,IAAI,EAAE,SAAkB,EAAE;QAC5B;YACE,KAAK,EAAE,MAAM;YACb,KAAK,EAAE,MAAM;YACb,MAAM,EAAE,UAAU;YAClB,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;SACxC;KACF,CAAC;IAEF,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,OAAO,CACL,cACE,GAAG,EAAE,UAAU,EACf,SAAS,EAAC,mBAAmB,EAC7B,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,EAAE,EACtC,KAAK,EAAE;YACL,QAAQ,EAAE,OAAO;YACjB,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,SAAS,EAAE,wBAAwB;YACnC,MAAM,EAAE,IAAI;SACb,YAEA,aAAa,CAAC,CAAC,CAAC,CACf,eACE,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EACpE,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,EAAE,aAEtC,gBACE,SAAS,QACT,IAAI,EAAC,KAAK,EACV,WAAW,EAAC,eAAe,EAC3B,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC3C,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;wBACf,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO;4BAAE,aAAa,EAAE,CAAC;wBACvC,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;4BACvB,gBAAgB,CAAC,KAAK,CAAC,CAAC;4BACxB,UAAU,CAAC,EAAE,CAAC,CAAC;wBACjB,CAAC;oBACH,CAAC,EACD,KAAK,EAAE;wBACL,UAAU,EAAE,aAAa;wBACzB,MAAM,EAAE,MAAM;wBACd,OAAO,EAAE,MAAM;wBACf,KAAK,EAAE,OAAO;wBACd,QAAQ,EAAE,EAAE;wBACZ,KAAK,EAAE,GAAG;wBACV,OAAO,EAAE,SAAS;qBACnB,GACD,EACF,iBACE,OAAO,EAAE,aAAa,EACtB,KAAK,EAAE;wBACL,QAAQ,EAAE,EAAE;wBACZ,KAAK,EAAE,SAAS;wBAChB,OAAO,EAAE,SAAS;wBAClB,UAAU,EAAE,GAAG;wBACf,UAAU,EAAE,MAAM;wBAClB,MAAM,EAAE,MAAM;wBACd,MAAM,EAAE,SAAS;qBAClB,sBAGM,IACL,CACP,CAAC,CAAC,CAAC,CACF,cACE,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,EACxD,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,EAAE,YAErC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;gBACrB,IAAI,MAAM,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;oBAC9C,OAAO,CACL,cAEE,KAAK,EAAE;4BACL,KAAK,EAAE,CAAC;4BACR,MAAM,EAAE,EAAE;4BACV,UAAU,EAAE,uBAAuB;4BACnC,MAAM,EAAE,OAAO;yBAChB,IANI,KAAK,CAAC,EAAE,CAOb,CACH,CAAC;gBACJ,CAAC;gBACD,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,IAMjD,CAAC;gBACF,OAAO,CACL,iBAEE,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,EAAE,CACX,eAAe,EACf,QAAQ,EAAE,IAAI,uBAAuB,CACtC,EACD,KAAK,EAAE,KAAK,YAEX,KAAK,IATD,KAAK,CAUH,CACV,CAAC;YACJ,CAAC,CAAC,GACE,CACP,GACG,CACP,CAAC;AACJ,CAAC;AAED,iCAAiC;AAEjC,8DAA8D;AAE9D,SAAS,aAAa,CAAC,IAAY;IACjC,oBAAoB;IACpB,MAAM,GAAG,GAAG,IAAI;SACb,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACzB,2BAA2B;IAC3B,OAAO,GAAG,CAAC,OAAO,CAChB,mHAAmH,EACnH,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QAC5B,IAAI,GAAG;YAAE,OAAO,wBAAwB,GAAG,UAAU,CAAC;QACtD,IAAI,GAAG;YAAE,OAAO,wBAAwB,GAAG,SAAS,CAAC;QACrD,IAAI,GAAG;YAAE,OAAO,wBAAwB,GAAG,SAAS,CAAC;QACrD,IAAI,GAAG;YAAE,OAAO,wBAAwB,GAAG,SAAS,CAAC;QACrD,OAAO,KAAK,CAAC;IACf,CAAC,CACF,CAAC;AACJ,CAAC;AAED,MAAM,QAAQ,GAAG;;;;;CAKhB,CAAC;AAEF,SAAS,qBAAqB,CAAC,EAC7B,KAAK,EACL,QAAQ,EACR,QAAQ,EAAE,SAAS,GAKpB;IACC,MAAM,WAAW,GAAG,MAAM,CAAsB,IAAI,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAE5C,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEjE,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;QAClC,IAAI,WAAW,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YAC1C,MAAM,CAAC,OAAO,CAAC,SAAS,GAAG,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC;YACzD,MAAM,CAAC,OAAO,CAAC,UAAU,GAAG,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC;QAC7D,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,QAAQ,GACZ,qEAAqE,CAAC;IACxE,MAAM,WAAW,GAAwB;QACvC,UAAU,EAAE,QAAQ;QACpB,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,GAAG;QACf,OAAO,EAAE,EAAE;QACX,MAAM,EAAE,CAAC;QACT,MAAM,EAAE,MAAM;QACd,UAAU,EAAE,KAAK;QACjB,QAAQ,EAAE,QAAQ;QAClB,YAAY,EAAE,QAAQ;QACtB,OAAO,EAAE,CAAC;KACX,CAAC;IAEF,OAAO,CACL,8BACE,0BAAQ,QAAQ,GAAS,EACzB,eACE,SAAS,EAAC,gBAAgB,EAC1B,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAEnD,cACE,GAAG,EAAE,MAAM,uBAEX,KAAK,EAAE;4BACL,GAAG,WAAW;4BACd,QAAQ,EAAE,UAAU;4BACpB,KAAK,EAAE,CAAC;4BACR,QAAQ,EAAE,MAAM;4BAChB,aAAa,EAAE,MAAM;4BACrB,KAAK,EAAE,8BAA8B;4BACrC,UAAU,EAAE,aAAa;yBAC1B,EACD,uBAAuB,EAAE,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,EAAE,GACvD,EACF,mBACE,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACzC,QAAQ,EAAE,UAAU,EACpB,UAAU,EAAE,KAAK,EACjB,KAAK,EAAE;4BACL,GAAG,WAAW;4BACd,QAAQ,EAAE,UAAU;4BACpB,KAAK,EAAE,CAAC;4BACR,KAAK,EAAE,MAAM;4BACb,MAAM,EAAE,MAAM;4BACd,QAAQ,EAAE,MAAM;4BAChB,MAAM,EAAE,MAAM;4BACd,UAAU,EAAE,aAAa;4BACzB,KAAK,EAAE,aAAa;4BACpB,UAAU,EAAE,wBAAwB;4BACpC,OAAO,EAAE,MAAM;4BACf,mBAAmB,EAAE,aAAa;yBACnC,GACD,IACE,IACL,CACJ,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,EAC5B,OAAO,EACP,QAAQ,EACR,YAAY,GAKb;IACC,MAAM,gBAAgB,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IACrC,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAC;IAE/B,uEAAuE;IACvE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IACnE,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IACtC,cAAc,CAAC,OAAO,GAAG,MAAM,CAAC;IAEhC,MAAM,MAAM,GAAG,SAAS,CAAC;QACvB,UAAU,EAAE;YACV,UAAU,CAAC,SAAS,CAAC;gBACnB,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE;gBAC9B,SAAS,EAAE,EAAE;gBACb,UAAU,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,CAAC,EAAE;aACpD,CAAC;YACF,WAAW,CAAC,SAAS,CAAC;gBACpB,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;oBACxB,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;wBACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;wBAC/B,IAAI,KAAK,KAAK,CAAC;4BAAE,OAAO,WAAW,CAAC;wBACpC,IAAI,KAAK,KAAK,CAAC;4BAAE,OAAO,WAAW,CAAC;wBACpC,OAAO,WAAW,CAAC;oBACrB,CAAC;oBACD,OAAO,0BAA0B,CAAC;gBACpC,CAAC;gBACD,oBAAoB,EAAE,IAAI;gBAC1B,eAAe,EAAE,IAAI;aACtB,CAAC;YACF,IAAI,CAAC,SAAS,CAAC;gBACb,WAAW,EAAE,KAAK;gBAClB,cAAc,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;aACrC,CAAC;YACF,QAAQ,CAAC,SAAS,CAAC;gBACjB,IAAI,EAAE,IAAI;gBACV,mBAAmB,EAAE,IAAI;gBACzB,mBAAmB,EAAE,IAAI;aAC1B,CAAC;SACH;QACD,OAAO,EAAE,MAAM,EAAE,IAAI,IAAI,OAAO;QAChC,WAAW,EAAE;YACX,UAAU,EAAE;gBACV,KAAK,EAAE,UAAU;aAClB;SACF;QACD,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;YACvB,IAAI,gBAAgB,CAAC,OAAO;gBAAE,OAAO;YACrC,IAAI,CAAC;gBACH,MAAM,EAAE,GAAI,MAAM,CAAC,OAAe,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;gBAC1D,uCAAuC;gBACvC,MAAM,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC;gBAClC,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,WAAW;YAAE,OAAO;QAC1C,MAAM,SAAS,GAAI,MAAM,CAAC,OAAe,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;QACjE,IAAI,SAAS,KAAK,CAAC,MAAM,EAAE,IAAI,IAAI,OAAO,CAAC,EAAE,CAAC;YAC5C,IAAI,MAAM,CAAC,SAAS;gBAAE,OAAO;YAC7B,gBAAgB,CAAC,OAAO,GAAG,IAAI,CAAC;YAChC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,IAAI,OAAO,CAAC,CAAC;YACpD,gBAAgB,CAAC,OAAO,GAAG,KAAK,CAAC;QACnC,CAAC;IACH,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAE9B,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,GAAG,EAAE;YACV,MAAM,EAAE,OAAO,EAAE,CAAC;QACpB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,MAAM,kBAAkB,GAAG,CAAC,CAAmC,EAAE,EAAE;QACjE,oFAAoF;QACpF,MAAM,MAAM,GAAG,CAAC,CAAC,MAAqB,CAAC;QACvC,IACE,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,qBAAqB,CAAC;YAChD,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAC9C,CAAC;YACD,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC;QACpC,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CACL,eACE,SAAS,EAAC,uCAAuC,EACjD,OAAO,EAAE,kBAAkB,EAC3B,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAEjE,MAAM,IAAI,CACT,KAAC,cAAc,IACb,YAAY,EAAE,YAAY,EAC1B,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE;oBACpB,cAAc,CAAC,OAAO,GAAG,OAAO,CAAC;oBACjC,wDAAwD;oBACxD,IAAI,CAAC;wBACH,MAAM,EAAE,GAAI,MAAM,CAAC,OAAe,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;wBAC1D,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;oBACxC,CAAC;oBAAC,MAAM,CAAC;wBACP,WAAW;oBACb,CAAC;gBACH,CAAC,GACD,CACH,EACD,KAAC,mBAAmB,IAAC,MAAM,EAAE,MAAM,GAAI,EACvC,KAAC,SAAS,IAAC,MAAM,EAAE,MAAM,GAAI,EAC7B,KAAC,aAAa,IAAC,MAAM,EAAE,MAAM,GAAI,IAC7B,CACP,CAAC;AACJ,CAAC;AAYD,SAAS,uBAAuB,CAC9B,OAAe,EACf,IAAY;IAEZ,MAAM,UAAU,GAAG,IAAI;SACpB,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;SAC/B,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC;QACzC,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,EAAE,IAAI,UAAU;YACzB,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE;YACrB,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;YACnC,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,EAAE;YACnB,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,SAAS;SAC/B,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,EAAE,EAAE,UAAU;YACd,IAAI,EAAE,EAAE;YACR,WAAW,EAAE,EAAE;YACf,GAAG,EAAE,EAAE;YACP,KAAK,EAAE,SAAS;SACjB,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,KAA2B;IACvD,OAAO,CACL,IAAI,CAAC,SAAS,CACZ;QACE,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,SAAS;QAC3C,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,KAAK,EAAE,KAAK,CAAC,KAAK;KACnB,EACD,IAAI,EACJ,CAAC,CACF,GAAG,IAAI,CACT,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,EAC7B,QAAQ,EACR,QAAQ,GAIT;IACC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAuB,GAAG,EAAE,CAC5D,uBAAuB,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,CACzD,CAAC;IACF,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEtC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,CAAC,OAAO,KAAK,QAAQ,CAAC,EAAE,EAAE,CAAC;YACtC,QAAQ,CAAC,uBAAuB,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;YACnE,SAAS,CAAC,OAAO,GAAG,QAAQ,CAAC,EAAE,CAAC;QAClC,CAAC;IACH,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAEnD,MAAM,MAAM,GAAG,CAAC,KAAoC,EAAE,EAAE;QACtD,MAAM,IAAI,GAAG,EAAE,GAAG,KAAK,EAAE,GAAG,KAAK,EAAE,CAAC;QACpC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,QAAQ,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC;IAEF,MAAM,UAAU,GACd,iLAAiL,CAAC;IACpL,MAAM,UAAU,GAAG,0DAA0D,CAAC;IAE9E,OAAO,CACL,cAAK,SAAS,EAAC,kDAAkD,YAC/D,eAAK,SAAS,EAAC,oBAAoB,aACjC,YAAG,SAAS,EAAC,mDAAmD,sGAG5D,EACJ,0BACE,gBAAO,SAAS,EAAE,UAAU,qBAAc,EAC1C,gBACE,SAAS,EAAE,UAAU,EACrB,KAAK,EAAE,KAAK,CAAC,IAAI,EACjB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EACjD,WAAW,EAAC,WAAW,GACvB,IACE,EACN,0BACE,gBAAO,SAAS,EAAE,UAAU,oBAAa,EACzC,gBACE,SAAS,EAAE,UAAU,EACrB,KAAK,EAAE,KAAK,CAAC,GAAG,EAChB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAChD,WAAW,EAAC,+BAA+B,GAC3C,EACF,aAAG,SAAS,EAAC,2CAA2C,0DACZ,GAAG,EAC7C,0DAAyC,SACvC,IACA,EACN,0BACE,gBAAO,SAAS,EAAE,UAAU,4BAAqB,EACjD,mBACE,SAAS,EAAE,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC,EACrC,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,KAAK,CAAC,WAAW,EACxB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EACxD,WAAW,EAAC,iFAA4E,GACxF,IACE,EACN,0BACE,gBAAO,SAAS,EAAE,UAAU,sBAAe,EAC3C,eAAK,SAAS,EAAC,yBAAyB,aACtC,gBACE,IAAI,EAAC,OAAO,EACZ,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAClD,SAAS,EAAC,qEAAqE,GAC/E,EACF,gBACE,SAAS,EAAE,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,EACnC,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAClD,WAAW,EAAC,SAAS,GACrB,IACE,IACF,IACF,GACF,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,EAC7B,QAAQ,EACR,MAAM,EACN,IAAI,EAAE,cAAc,EACpB,YAAY,EACZ,kBAAkB,EAClB,WAAW,GACS;IACpB,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACzD,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAC9C,WAAW,CACZ,CAAC;IACF,MAAM,IAAI,GAAG,cAAc,IAAI,YAAY,CAAC;IAC5C,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAC1C,MAAM,CACP,CAAC;IACF,MAAM,WAAW,GAAG,MAAM,CAAuC,IAAI,CAAC,CAAC;IACvE,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEtC,sCAAsC;IACtC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,CAAC,OAAO,KAAK,QAAQ,CAAC,EAAE,EAAE,CAAC;YACtC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC7B,aAAa,CAAC,MAAM,CAAC,CAAC;YACtB,kBAAkB,EAAE,CAAC,MAAM,CAAC,CAAC;YAC7B,SAAS,CAAC,OAAO,GAAG,QAAQ,CAAC,EAAE,CAAC;QAClC,CAAC;IACH,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAExD,MAAM,YAAY,GAAG,WAAW,CAC9B,CAAC,UAAkB,EAAE,EAAE;QACrB,UAAU,CAAC,UAAU,CAAC,CAAC;QACvB,aAAa,CAAC,MAAM,CAAC,CAAC;QACtB,kBAAkB,EAAE,CAAC,MAAM,CAAC,CAAC;QAC7B,IAAI,WAAW,CAAC,OAAO;YAAE,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC3D,WAAW,CAAC,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YACpC,aAAa,CAAC,QAAQ,CAAC,CAAC;YACxB,kBAAkB,EAAE,CAAC,QAAQ,CAAC,CAAC;YAC/B,MAAM,CAAC,UAAU,CAAC,CAAC;YACnB,UAAU,CAAC,GAAG,EAAE;gBACd,aAAa,CAAC,OAAO,CAAC,CAAC;gBACvB,kBAAkB,EAAE,CAAC,OAAO,CAAC,CAAC;YAChC,CAAC,EAAE,GAAG,CAAC,CAAC;QACV,CAAC,EAAE,IAAI,CAAC,CAAC;IACX,CAAC,EACD,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAC7B,CAAC;IAEF,MAAM,UAAU,GAAG,WAAW,CAC5B,CAAC,CAAoB,EAAE,EAAE;QACvB,eAAe,CAAC,CAAC,CAAC,CAAC;QACnB,WAAW,CAAC,CAAC,CAAC,CAAC;QACf,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC,EACD,CAAC,YAAY,CAAC,CACf,CAAC;IAEF,8BAA8B;IAC9B,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,GAAG,EAAE;YACV,IAAI,WAAW,CAAC,OAAO;gBAAE,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC7D,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,UAAU,GACd,QAAQ,CAAC,QAAQ,KAAK,eAAe,IAAI,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACzE,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACvD,MAAM,aAAa,GAAG,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAEvD,sCAAsC;IACtC,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,CACL,cAAK,SAAS,EAAC,sBAAsB,YACnC,KAAC,qBAAqB,IAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,GAAI,GACjE,CACP,CAAC;IACJ,CAAC;IAED,gBAAgB;IAChB,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CACL,cAAK,SAAS,EAAC,sBAAsB,YACnC,cAAK,SAAS,EAAC,2DAA2D,YACxE,cACE,GAAG,EAAE,eAAe,CAAC,4BAA4B,QAAQ,CAAC,EAAE,MAAM,CAAC,EACnE,GAAG,EAAE,QAAQ,CAAC,IAAI,EAClB,SAAS,EAAC,sCAAsC,GAChD,GACE,GACF,CACP,CAAC;IACJ,CAAC;IAED,wCAAwC;IACxC,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CACL,eAAK,SAAS,EAAC,sBAAsB,aACnC,0BAAQ,YAAY,GAAS,EAC5B,CAAC,WAAW,IAAI,CACf,eAAK,SAAS,EAAC,oEAAoE,aACjF,eAAK,SAAS,EAAC,yBAAyB,aACtC,iBACE,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EACnC,SAAS,EAAE,EAAE,CACX,iDAAiD,EACjD,IAAI,KAAK,QAAQ;wCACf,CAAC,CAAC,2BAA2B;wCAC7B,CAAC,CAAC,gEAAgE,CACrE,EACD,KAAK,EAAE,aAAa,uBAGb,EACT,iBACE,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EACjC,SAAS,EAAE,EAAE,CACX,iDAAiD,EACjD,IAAI,KAAK,MAAM;wCACb,CAAC,CAAC,2BAA2B;wCAC7B,CAAC,CAAC,gEAAgE,CACrE,EACD,KAAK,EAAE,aAAa,qBAGb,IACL,EACN,eAAM,SAAS,EAAC,sCAAsC,YACnD,UAAU,KAAK,QAAQ;gCACtB,CAAC,CAAC,WAAW;gCACb,CAAC,CAAC,UAAU,KAAK,OAAO;oCACtB,CAAC,CAAC,OAAO;oCACT,CAAC,CAAC,EAAE,GACH,IACH,CACP,EACA,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CACnB,cACE,SAAS,EAAC,oCAAoC,YAG9C,KAAC,oBAAoB,IACnB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,YAAY,EACtB,YAAY,EAAE,QAAQ,CAAC,IAAI,GAC3B,IANG,QAAQ,CAAC,EAAE,GAAG,SAAS,CAOxB,CACP,CAAC,CAAC,CAAC,CACF,mBACE,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC7C,SAAS,EAAC,6HAA6H,EACvI,KAAK,EAAE;wBACL,UAAU,EACR,qEAAqE;wBACvE,UAAU,EAAE,GAAG;qBAChB,EACD,UAAU,EAAE,KAAK,GACjB,CACH,IACG,CACP,CAAC;IACJ,CAAC;IAED,0BAA0B;IAC1B,MAAM,MAAM,GACV,QAAQ,CAAC,QAAQ,KAAK,kBAAkB,IAAI,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAE9E,OAAO,CACL,cAAK,SAAS,EAAC,sBAAsB,YAClC,MAAM,CAAC,CAAC,CAAC,CACR,KAAC,qBAAqB,IACpB,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAC,MAAM,GACf,CACH,CAAC,CAAC,CAAC,CACF,mBACE,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC7C,SAAS,EAAC,6HAA6H,EACvI,KAAK,EAAE;gBACL,UAAU,EACR,qEAAqE;gBACvE,UAAU,EAAE,GAAG;aAChB,EACD,UAAU,EAAE,KAAK,GACjB,CACH,GACG,CACP,CAAC;AACJ,CAAC;AAED,2EAA2E;AAE3E,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkMpB,CAAC","sourcesContent":["import React, {\n useState,\n useRef,\n useEffect,\n useCallback,\n useMemo,\n} from \"react\";\nimport { useEditor, EditorContent } from \"@tiptap/react\";\nimport StarterKit from \"@tiptap/starter-kit\";\nimport Placeholder from \"@tiptap/extension-placeholder\";\nimport Link from \"@tiptap/extension-link\";\nimport { Markdown } from \"tiptap-markdown\";\nimport { cn } from \"../utils.js\";\nimport { agentNativePath } from \"../api-path.js\";\nimport type { Resource } from \"./use-resources.js\";\nimport {\n type ParsedFrontmatter,\n getFrontmatterValue,\n isCustomAgentPath,\n isRemoteAgentPath,\n isSkillPath,\n parseFrontmatter,\n serializeFrontmatter,\n} from \"../../resources/metadata.js\";\n\nexport interface ResourceEditorProps {\n resource: Resource;\n onSave: (content: string) => void;\n /** Controlled view mode — if provided, the editor won't manage its own view state */\n view?: \"visual\" | \"code\";\n onViewChange?: (v: \"visual\" | \"code\") => void;\n /** Called whenever save status changes */\n onSaveStatusChange?: (status: \"idle\" | \"saving\" | \"saved\") => void;\n /** When true, the editor's internal toolbar row is hidden */\n hideToolbar?: boolean;\n}\n\nconst CONTROL_STYLE = { fontSize: 12, lineHeight: 1 } as const;\n\nconst VIEW_PREF_KEY = \"resource-editor-view\";\n\nfunction getViewPref(): \"visual\" | \"code\" {\n try {\n const v = localStorage.getItem(VIEW_PREF_KEY);\n if (v === \"code\") return \"code\";\n } catch {}\n return \"visual\";\n}\n\nfunction setViewPref(v: \"visual\" | \"code\") {\n try {\n localStorage.setItem(VIEW_PREF_KEY, v);\n } catch {}\n}\n\nconst FM_INPUT_STYLE: React.CSSProperties = {\n background: \"transparent\",\n border: \"none\",\n outline: \"none\",\n color: \"inherit\",\n fontSize: \"inherit\",\n fontFamily: \"inherit\",\n width: \"100%\",\n padding: 0,\n};\n\nfunction FrontmatterBar({\n resourcePath,\n frontmatter,\n onChange,\n}: {\n resourcePath: string;\n frontmatter: ParsedFrontmatter;\n onChange: (updated: ParsedFrontmatter) => void;\n}) {\n const getField = (key: string) => getFrontmatterValue(frontmatter, key) ?? \"\";\n\n const updateField = (key: string, value: string) => {\n const exists = frontmatter.fields.some((f) => f.key === key);\n const newFields = exists\n ? frontmatter.fields.map((f) => (f.key === key ? { ...f, value } : f))\n : [...frontmatter.fields, { key, value }];\n const updated: ParsedFrontmatter = {\n ...frontmatter,\n raw: serializeFrontmatter(newFields),\n fields: newFields,\n };\n onChange(updated);\n };\n\n const name = getField(\"name\");\n const description = getField(\"description\");\n const isUserInvocable = getField(\"user-invocable\") === \"true\";\n const model = getField(\"model\") || \"inherit\";\n const tools = getField(\"tools\") || \"inherit\";\n const isCustomAgent = isCustomAgentPath(resourcePath);\n const isSkill = isSkillPath(resourcePath);\n\n return (\n <div\n style={{\n padding: \"8px 12px\",\n marginBottom: 8,\n borderRadius: 6,\n background: \"hsl(var(--muted) / 0.5)\",\n border: \"1px solid hsl(var(--border) / 0.5)\",\n fontSize: 12,\n lineHeight: 1.5,\n color: \"hsl(var(--muted-foreground))\",\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 6 }}>\n <input\n value={name}\n onChange={(e) => updateField(\"name\", e.target.value)}\n placeholder={isCustomAgent ? \"Agent name\" : \"Skill name\"}\n style={{\n ...FM_INPUT_STYLE,\n fontWeight: 600,\n color: \"hsl(var(--foreground))\",\n fontSize: 13,\n flex: 1,\n }}\n />\n {isSkill ? (\n <label\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n fontSize: 10,\n cursor: \"pointer\",\n whiteSpace: \"nowrap\",\n userSelect: \"none\",\n padding: \"1px 5px\",\n borderRadius: 3,\n background: isUserInvocable\n ? \"hsl(var(--primary) / 0.15)\"\n : \"transparent\",\n color: isUserInvocable\n ? \"hsl(var(--primary))\"\n : \"hsl(var(--muted-foreground))\",\n border: isUserInvocable\n ? \"none\"\n : \"1px dashed hsl(var(--border))\",\n fontWeight: 500,\n }}\n >\n <input\n type=\"checkbox\"\n checked={isUserInvocable}\n onChange={(e) =>\n updateField(\n \"user-invocable\",\n e.target.checked ? \"true\" : \"false\",\n )\n }\n style={{ display: \"none\" }}\n />\n /{name || \"command\"}\n </label>\n ) : null}\n {isCustomAgent ? (\n <select\n value={model}\n onChange={(e) => updateField(\"model\", e.target.value)}\n style={{\n borderRadius: 4,\n border: \"1px solid hsl(var(--border))\",\n background: \"hsl(var(--background))\",\n color: \"hsl(var(--foreground))\",\n fontSize: 11,\n padding: \"2px 6px\",\n }}\n >\n <option value=\"inherit\">Default model</option>\n <option value=\"claude-sonnet-4-6\">Claude Sonnet 4.6</option>\n <option value=\"claude-haiku-4-5-20251001\">Claude Haiku 4.5</option>\n </select>\n ) : null}\n </div>\n <input\n value={description}\n onChange={(e) => updateField(\"description\", e.target.value)}\n placeholder={\n isCustomAgent\n ? \"Description — what this agent should handle\"\n : \"Description — what this skill does\"\n }\n style={{\n ...FM_INPUT_STYLE,\n marginTop: 2,\n opacity: 0.8,\n color: \"hsl(var(--muted-foreground))\",\n }}\n />\n {isCustomAgent ? (\n <div\n style={{\n display: \"flex\",\n gap: 8,\n marginTop: 6,\n alignItems: \"center\",\n }}\n >\n <label\n style={{\n fontSize: 10,\n color: \"hsl(var(--muted-foreground))\",\n minWidth: 28,\n }}\n >\n Tools\n </label>\n <select\n value={tools}\n onChange={(e) => updateField(\"tools\", e.target.value)}\n style={{\n borderRadius: 4,\n border: \"1px solid hsl(var(--border))\",\n background: \"hsl(var(--background))\",\n color: \"hsl(var(--foreground))\",\n fontSize: 11,\n padding: \"2px 6px\",\n }}\n >\n <option value=\"inherit\">Inherit</option>\n <option value=\"allowlist\">Allowlist later</option>\n <option value=\"denylist\">Denylist later</option>\n </select>\n </div>\n ) : null}\n </div>\n );\n}\n\n// --- Slash Command Menu ---\n\ninterface CommandItem {\n title: string;\n description: string;\n icon: string;\n action: (editor: any) => void;\n}\n\nconst slashCommands: CommandItem[] = [\n {\n title: \"Text\",\n description: \"Plain text\",\n icon: \"T\",\n action: (editor) => editor.chain().focus().setParagraph().run(),\n },\n {\n title: \"Heading 1\",\n description: \"Large heading\",\n icon: \"H1\",\n action: (editor) =>\n editor.chain().focus().toggleHeading({ level: 1 }).run(),\n },\n {\n title: \"Heading 2\",\n description: \"Medium heading\",\n icon: \"H2\",\n action: (editor) =>\n editor.chain().focus().toggleHeading({ level: 2 }).run(),\n },\n {\n title: \"Heading 3\",\n description: \"Small heading\",\n icon: \"H3\",\n action: (editor) =>\n editor.chain().focus().toggleHeading({ level: 3 }).run(),\n },\n {\n title: \"Bullet List\",\n description: \"Unordered list\",\n icon: \"•\",\n action: (editor) => editor.chain().focus().toggleBulletList().run(),\n },\n {\n title: \"Numbered List\",\n description: \"Ordered list\",\n icon: \"1.\",\n action: (editor) => editor.chain().focus().toggleOrderedList().run(),\n },\n {\n title: \"Code Block\",\n description: \"Code snippet\",\n icon: \"<>\",\n action: (editor) => editor.chain().focus().toggleCodeBlock().run(),\n },\n {\n title: \"Quote\",\n description: \"Block quote\",\n icon: '\"',\n action: (editor) => editor.chain().focus().toggleBlockquote().run(),\n },\n {\n title: \"Divider\",\n description: \"Horizontal rule\",\n icon: \"—\",\n action: (editor) => editor.chain().focus().setHorizontalRule().run(),\n },\n];\n\nfunction SlashMenu({ editor }: { editor: any }) {\n const [isOpen, setIsOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [position, setPosition] = useState<{\n top: number;\n left: number;\n flipUp: boolean;\n } | null>(null);\n const slashPosRef = useRef<number | null>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n\n const filteredCommands = useMemo(\n () =>\n slashCommands.filter(\n (cmd) =>\n cmd.title.toLowerCase().includes(query.toLowerCase()) ||\n cmd.description.toLowerCase().includes(query.toLowerCase()),\n ),\n [query],\n );\n\n const executeCommand = useCallback(\n (cmd: CommandItem) => {\n if (slashPosRef.current !== null) {\n const { from } = editor.state.selection;\n editor\n .chain()\n .focus()\n .deleteRange({ from: slashPosRef.current, to: from })\n .run();\n }\n cmd.action(editor);\n setIsOpen(false);\n setQuery(\"\");\n slashPosRef.current = null;\n },\n [editor],\n );\n\n useEffect(() => {\n if (!editor) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (!isOpen) return;\n\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setSelectedIndex((i) => (i + 1) % filteredCommands.length);\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setSelectedIndex(\n (i) => (i - 1 + filteredCommands.length) % filteredCommands.length,\n );\n } else if (e.key === \"Enter\") {\n e.preventDefault();\n if (filteredCommands[selectedIndex]) {\n executeCommand(filteredCommands[selectedIndex]);\n }\n } else if (e.key === \"Escape\") {\n setIsOpen(false);\n setQuery(\"\");\n slashPosRef.current = null;\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown, true);\n return () => document.removeEventListener(\"keydown\", handleKeyDown, true);\n }, [isOpen, selectedIndex, filteredCommands, executeCommand, editor]);\n\n useEffect(() => {\n if (!editor) return;\n\n const handleTransaction = () => {\n const { state } = editor;\n const { from } = state.selection;\n const textBefore = state.doc.textBetween(\n Math.max(0, from - 20),\n from,\n \"\\n\",\n );\n\n const slashMatch = textBefore.match(/\\/([a-zA-Z0-9]*)$/);\n\n if (slashMatch) {\n const slashStart = from - slashMatch[0].length;\n slashPosRef.current = slashStart;\n setQuery(slashMatch[1]);\n setSelectedIndex(0);\n\n const coords = editor.view.coordsAtPos(from);\n // Estimate menu height (~320px max) and check if it fits below\n const menuHeight = 320;\n const spaceBelow = window.innerHeight - coords.bottom;\n const flipUp = spaceBelow < menuHeight && coords.top > menuHeight;\n\n setPosition({\n top: flipUp ? coords.top : coords.bottom + 4,\n left: Math.min(coords.left, window.innerWidth - 240),\n flipUp,\n });\n setIsOpen(true);\n } else {\n if (isOpen) {\n setIsOpen(false);\n setQuery(\"\");\n slashPosRef.current = null;\n }\n }\n };\n\n editor.on(\"transaction\", handleTransaction);\n return () => {\n editor.off(\"transaction\", handleTransaction);\n };\n }, [editor, isOpen]);\n\n if (!isOpen || !position || filteredCommands.length === 0) return null;\n\n return (\n <div\n ref={menuRef}\n style={{\n position: \"fixed\",\n ...(position.flipUp\n ? { bottom: window.innerHeight - position.top + 4 }\n : { top: position.top }),\n left: position.left,\n zIndex: 9999,\n }}\n className=\"re-slash-menu\"\n >\n <div className=\"py-1\">\n <div\n style={{\n padding: \"4px 10px\",\n fontSize: 10,\n fontWeight: 600,\n textTransform: \"uppercase\",\n letterSpacing: \"0.06em\",\n opacity: 0.5,\n }}\n >\n Blocks\n </div>\n {filteredCommands.map((cmd, i) => (\n <button\n key={cmd.title}\n onClick={() => executeCommand(cmd)}\n onMouseEnter={() => setSelectedIndex(i)}\n className={cn(\n \"re-slash-item\",\n i === selectedIndex && \"re-slash-item--active\",\n )}\n >\n <span className=\"re-slash-icon\">{cmd.icon}</span>\n <span>\n <span className=\"re-slash-title\">{cmd.title}</span>\n <span className=\"re-slash-desc\">{cmd.description}</span>\n </span>\n </button>\n ))}\n </div>\n </div>\n );\n}\n\n// --- Inline Bubble Toolbar ---\n\nfunction InlineBubbleToolbar({ editor }: { editor: any }) {\n const [visible, setVisible] = useState(false);\n const [coords, setCoords] = useState({ top: 0, left: 0 });\n const [showLinkInput, setShowLinkInput] = useState(false);\n const [linkUrl, setLinkUrl] = useState(\"\");\n const toolbarRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!editor) return;\n const update = () => {\n const { from, to } = editor.state.selection;\n if (from === to || !editor.isFocused) {\n setVisible(false);\n return;\n }\n const domSelection = window.getSelection();\n if (!domSelection || domSelection.rangeCount === 0) {\n setVisible(false);\n return;\n }\n const range = domSelection.getRangeAt(0);\n const rect = range.getBoundingClientRect();\n if (rect.width === 0) {\n setVisible(false);\n return;\n }\n // Use fixed positioning with viewport coordinates\n setCoords({\n top: rect.top - 8,\n left: rect.left + rect.width / 2,\n });\n setVisible(true);\n };\n editor.on(\"selectionUpdate\", update);\n const onBlur = () => {\n // Delay so clicks on toolbar buttons register before hiding\n setTimeout(() => {\n if (!editor.isFocused) setVisible(false);\n }, 150);\n };\n editor.on(\"blur\", onBlur);\n return () => {\n editor.off(\"selectionUpdate\", update);\n editor.off(\"blur\", onBlur);\n };\n }, [editor]);\n\n const handleSetLink = () => {\n if (linkUrl.trim()) {\n editor\n .chain()\n .focus()\n .extendMarkRange(\"link\")\n .setLink({ href: linkUrl.trim() })\n .run();\n } else {\n editor.chain().focus().extendMarkRange(\"link\").unsetLink().run();\n }\n setShowLinkInput(false);\n setLinkUrl(\"\");\n };\n\n const toggleLink = () => {\n if (editor.isActive(\"link\")) {\n editor.chain().focus().unsetLink().run();\n return;\n }\n const previousUrl = editor.getAttributes(\"link\").href || \"\";\n setLinkUrl(previousUrl);\n setShowLinkInput(true);\n };\n\n const items = [\n {\n label: \"B\",\n title: \"Bold\",\n action: () => editor.chain().focus().toggleBold().run(),\n isActive: () => editor.isActive(\"bold\"),\n style: { fontWeight: 700 } as React.CSSProperties,\n },\n {\n label: \"I\",\n title: \"Italic\",\n action: () => editor.chain().focus().toggleItalic().run(),\n isActive: () => editor.isActive(\"italic\"),\n style: { fontStyle: \"italic\" } as React.CSSProperties,\n },\n {\n label: \"S\",\n title: \"Strikethrough\",\n action: () => editor.chain().focus().toggleStrike().run(),\n isActive: () => editor.isActive(\"strike\"),\n style: { textDecoration: \"line-through\" } as React.CSSProperties,\n },\n {\n label: \"<>\",\n title: \"Code\",\n action: () => editor.chain().focus().toggleCode().run(),\n isActive: () => editor.isActive(\"code\"),\n style: { fontFamily: \"monospace\", fontSize: 11 } as React.CSSProperties,\n },\n { type: \"divider\" as const },\n {\n label: \"H1\",\n title: \"Heading 1\",\n action: () => editor.chain().focus().toggleHeading({ level: 1 }).run(),\n isActive: () => editor.isActive(\"heading\", { level: 1 }),\n },\n {\n label: \"H2\",\n title: \"Heading 2\",\n action: () => editor.chain().focus().toggleHeading({ level: 2 }).run(),\n isActive: () => editor.isActive(\"heading\", { level: 2 }),\n },\n {\n label: \"H3\",\n title: \"Heading 3\",\n action: () => editor.chain().focus().toggleHeading({ level: 3 }).run(),\n isActive: () => editor.isActive(\"heading\", { level: 3 }),\n },\n { type: \"divider\" as const },\n {\n label: \"Link\",\n title: \"Link\",\n action: toggleLink,\n isActive: () => editor.isActive(\"link\"),\n },\n ];\n\n if (!visible) return null;\n\n return (\n <div\n ref={toolbarRef}\n className=\"re-bubble-toolbar\"\n onMouseDown={(e) => e.preventDefault()}\n style={{\n position: \"fixed\",\n top: coords.top,\n left: coords.left,\n transform: \"translate(-50%, -100%)\",\n zIndex: 9999,\n }}\n >\n {showLinkInput ? (\n <div\n style={{ display: \"flex\", alignItems: \"center\", gap: 4, padding: 4 }}\n onMouseDown={(e) => e.preventDefault()}\n >\n <input\n autoFocus\n type=\"url\"\n placeholder=\"Paste link...\"\n value={linkUrl}\n onChange={(e) => setLinkUrl(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") handleSetLink();\n if (e.key === \"Escape\") {\n setShowLinkInput(false);\n setLinkUrl(\"\");\n }\n }}\n style={{\n background: \"transparent\",\n border: \"none\",\n outline: \"none\",\n color: \"white\",\n fontSize: 12,\n width: 160,\n padding: \"2px 4px\",\n }}\n />\n <button\n onClick={handleSetLink}\n style={{\n fontSize: 11,\n color: \"#60a5fa\",\n padding: \"2px 6px\",\n fontWeight: 500,\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n }}\n >\n Apply\n </button>\n </div>\n ) : (\n <div\n style={{ display: \"flex\", alignItems: \"center\", gap: 2 }}\n onMouseDown={(e) => e.preventDefault()}\n >\n {items.map((item, i) => {\n if (\"type\" in item && item.type === \"divider\") {\n return (\n <div\n key={`d-${i}`}\n style={{\n width: 1,\n height: 16,\n background: \"rgba(255,255,255,0.2)\",\n margin: \"0 2px\",\n }}\n />\n );\n }\n const { label, title, action, isActive, style } = item as {\n label: string;\n title: string;\n action: () => void;\n isActive: () => boolean;\n style?: React.CSSProperties;\n };\n return (\n <button\n key={title}\n onClick={action}\n title={title}\n className={cn(\n \"re-bubble-btn\",\n isActive() && \"re-bubble-btn--active\",\n )}\n style={style}\n >\n {label}\n </button>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n\n// --- Visual Markdown Editor ---\n\n// --- Syntax-highlighted code editor (textarea + overlay) ---\n\nfunction highlightJson(text: string): string {\n // Escape HTML first\n const esc = text\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\");\n // Tokenize JSON with regex\n return esc.replace(\n /(\"(?:\\\\.|[^\"\\\\])*\")\\s*:|(\"(?:\\\\.|[^\"\\\\])*\")|((?:-?\\d+)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?)|(\\btrue\\b|\\bfalse\\b|\\bnull\\b)/g,\n (match, key, str, num, lit) => {\n if (key) return `<span class=\"sh-key\">${key}</span>:`;\n if (str) return `<span class=\"sh-str\">${str}</span>`;\n if (num) return `<span class=\"sh-num\">${num}</span>`;\n if (lit) return `<span class=\"sh-lit\">${lit}</span>`;\n return match;\n },\n );\n}\n\nconst shStyles = `\n.sh-key { color: #7dd3fc; }\n.sh-str { color: #86efac; }\n.sh-num { color: #fca5a5; }\n.sh-lit { color: #c4b5fd; }\n`;\n\nfunction SyntaxHighlightEditor({\n value,\n onChange,\n language: _language,\n}: {\n value: string;\n onChange: (v: string) => void;\n language: \"json\";\n}) {\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const preRef = useRef<HTMLPreElement>(null);\n\n const highlighted = useMemo(() => highlightJson(value), [value]);\n\n const syncScroll = useCallback(() => {\n if (textareaRef.current && preRef.current) {\n preRef.current.scrollTop = textareaRef.current.scrollTop;\n preRef.current.scrollLeft = textareaRef.current.scrollLeft;\n }\n }, []);\n\n const monoFont =\n 'ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, monospace';\n const sharedStyle: React.CSSProperties = {\n fontFamily: monoFont,\n fontSize: 13,\n lineHeight: 1.6,\n padding: 12,\n margin: 0,\n border: \"none\",\n whiteSpace: \"pre\",\n wordWrap: \"normal\",\n overflowWrap: \"normal\",\n tabSize: 2,\n };\n\n return (\n <>\n <style>{shStyles}</style>\n <div\n className=\"flex-1 min-h-0\"\n style={{ position: \"relative\", overflow: \"hidden\" }}\n >\n <pre\n ref={preRef}\n aria-hidden\n style={{\n ...sharedStyle,\n position: \"absolute\",\n inset: 0,\n overflow: \"auto\",\n pointerEvents: \"none\",\n color: \"hsl(var(--muted-foreground))\",\n background: \"transparent\",\n }}\n dangerouslySetInnerHTML={{ __html: highlighted + \"\\n\" }}\n />\n <textarea\n ref={textareaRef}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onScroll={syncScroll}\n spellCheck={false}\n style={{\n ...sharedStyle,\n position: \"absolute\",\n inset: 0,\n width: \"100%\",\n height: \"100%\",\n overflow: \"auto\",\n resize: \"none\",\n background: \"transparent\",\n color: \"transparent\",\n caretColor: \"hsl(var(--foreground))\",\n outline: \"none\",\n WebkitTextFillColor: \"transparent\",\n }}\n />\n </div>\n </>\n );\n}\n\nfunction VisualMarkdownEditor({\n content,\n onChange,\n resourcePath,\n}: {\n content: string;\n onChange: (md: string) => void;\n resourcePath: string;\n}) {\n const isSettingContent = useRef(false);\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n // Parse frontmatter — strip it from tiptap content, re-prepend on save\n const parsed = useMemo(() => parseFrontmatter(content), [content]);\n const frontmatterRef = useRef(parsed);\n frontmatterRef.current = parsed;\n\n const editor = useEditor({\n extensions: [\n StarterKit.configure({\n heading: { levels: [1, 2, 3] },\n codeBlock: {},\n dropcursor: { color: \"hsl(var(--ring))\", width: 2 },\n }),\n Placeholder.configure({\n placeholder: ({ node }) => {\n if (node.type.name === \"heading\") {\n const level = node.attrs.level;\n if (level === 1) return \"Heading 1\";\n if (level === 2) return \"Heading 2\";\n return \"Heading 3\";\n }\n return \"Type '/' for commands...\";\n },\n showOnlyWhenEditable: true,\n showOnlyCurrent: true,\n }),\n Link.configure({\n openOnClick: false,\n HTMLAttributes: { class: \"re-link\" },\n }),\n Markdown.configure({\n html: true,\n transformPastedText: true,\n transformCopiedText: true,\n }),\n ],\n content: parsed?.body ?? content,\n editorProps: {\n attributes: {\n class: \"re-prose\",\n },\n },\n onUpdate: ({ editor }) => {\n if (isSettingContent.current) return;\n try {\n const md = (editor.storage as any).markdown.getMarkdown();\n // Re-prepend frontmatter if it existed\n const fm = frontmatterRef.current;\n const full = fm ? fm.raw + md : md;\n onChangeRef.current(full);\n } catch (err) {\n console.error(\"Markdown serialization error:\", err);\n }\n },\n });\n\n useEffect(() => {\n if (!editor || editor.isDestroyed) return;\n const currentMd = (editor.storage as any).markdown.getMarkdown();\n if (currentMd !== (parsed?.body ?? content)) {\n if (editor.isFocused) return;\n isSettingContent.current = true;\n editor.commands.setContent(parsed?.body ?? content);\n isSettingContent.current = false;\n }\n }, [content, editor, parsed]);\n\n useEffect(() => {\n return () => {\n editor?.destroy();\n };\n }, [editor]);\n\n if (!editor) return null;\n\n const handleWrapperClick = (e: React.MouseEvent<HTMLDivElement>) => {\n // If the click was on the wrapper (empty area), not on editor content, focus at end\n const target = e.target as HTMLElement;\n if (\n target.classList.contains(\"re-editor-clickable\") ||\n target.classList.contains(\"re-editor-wrapper\")\n ) {\n editor.chain().focus(\"end\").run();\n }\n };\n\n return (\n <div\n className=\"re-editor-wrapper re-editor-clickable\"\n onClick={handleWrapperClick}\n style={{ position: \"relative\", minHeight: \"100%\", cursor: \"text\" }}\n >\n {parsed && (\n <FrontmatterBar\n resourcePath={resourcePath}\n frontmatter={parsed}\n onChange={(updated) => {\n frontmatterRef.current = updated;\n // Get current body and combine with updated frontmatter\n try {\n const md = (editor.storage as any).markdown.getMarkdown();\n onChangeRef.current(updated.raw + md);\n } catch {\n // fallback\n }\n }}\n />\n )}\n <InlineBubbleToolbar editor={editor} />\n <SlashMenu editor={editor} />\n <EditorContent editor={editor} />\n </div>\n );\n}\n\n// --- Main ResourceEditor ---\n\ninterface RemoteAgentFormValue {\n id?: string;\n name: string;\n description: string;\n url: string;\n color: string;\n}\n\nfunction parseRemoteAgentContent(\n content: string,\n path: string,\n): RemoteAgentFormValue {\n const fallbackId = path\n .replace(/^remote-agents\\//, \"\")\n .replace(/\\.json$/, \"\");\n try {\n const data = JSON.parse(content || \"{}\");\n return {\n id: data.id || fallbackId,\n name: data.name ?? \"\",\n description: data.description ?? \"\",\n url: data.url ?? \"\",\n color: data.color ?? \"#6B7280\",\n };\n } catch {\n return {\n id: fallbackId,\n name: \"\",\n description: \"\",\n url: \"\",\n color: \"#6B7280\",\n };\n }\n}\n\nfunction serializeRemoteAgent(value: RemoteAgentFormValue): string {\n return (\n JSON.stringify(\n {\n id: value.id,\n name: value.name,\n description: value.description || undefined,\n url: value.url,\n color: value.color,\n },\n null,\n 2,\n ) + \"\\n\"\n );\n}\n\nfunction RemoteAgentFormEditor({\n resource,\n onChange,\n}: {\n resource: Resource;\n onChange: (content: string) => void;\n}) {\n const [value, setValue] = useState<RemoteAgentFormValue>(() =>\n parseRemoteAgentContent(resource.content, resource.path),\n );\n const prevIdRef = useRef(resource.id);\n\n useEffect(() => {\n if (prevIdRef.current !== resource.id) {\n setValue(parseRemoteAgentContent(resource.content, resource.path));\n prevIdRef.current = resource.id;\n }\n }, [resource.id, resource.content, resource.path]);\n\n const update = (patch: Partial<RemoteAgentFormValue>) => {\n const next = { ...value, ...patch };\n setValue(next);\n onChange(serializeRemoteAgent(next));\n };\n\n const inputClass =\n \"w-full rounded-md border border-border bg-background px-2.5 py-1.5 text-[13px] text-foreground outline-none placeholder:text-muted-foreground/50 focus:ring-1 focus:ring-accent\";\n const labelClass = \"block text-[11px] font-medium text-muted-foreground mb-1\";\n\n return (\n <div className=\"flex flex-1 min-h-0 flex-col overflow-y-auto p-4\">\n <div className=\"max-w-md space-y-3\">\n <p className=\"text-[11px] text-muted-foreground/70 leading-snug\">\n Connected remote agent over the A2A protocol. @-mention it in chat to\n delegate tasks.\n </p>\n <div>\n <label className={labelClass}>Name</label>\n <input\n className={inputClass}\n value={value.name}\n onChange={(e) => update({ name: e.target.value })}\n placeholder=\"Analytics\"\n />\n </div>\n <div>\n <label className={labelClass}>URL</label>\n <input\n className={inputClass}\n value={value.url}\n onChange={(e) => update({ url: e.target.value })}\n placeholder=\"https://analytics.example.com\"\n />\n <p className=\"mt-1 text-[10px] text-muted-foreground/50\">\n A2A endpoint. The agent card is served at{\" \"}\n <code>/.well-known/agent-card.json</code>.\n </p>\n </div>\n <div>\n <label className={labelClass}>Description</label>\n <textarea\n className={cn(inputClass, \"resize-y\")}\n rows={3}\n value={value.description}\n onChange={(e) => update({ description: e.target.value })}\n placeholder=\"What this agent is good at — helps the main agent decide when to delegate.\"\n />\n </div>\n <div>\n <label className={labelClass}>Color</label>\n <div className=\"flex items-center gap-2\">\n <input\n type=\"color\"\n value={value.color}\n onChange={(e) => update({ color: e.target.value })}\n className=\"h-8 w-10 cursor-pointer rounded border border-border bg-transparent\"\n />\n <input\n className={cn(inputClass, \"flex-1\")}\n value={value.color}\n onChange={(e) => update({ color: e.target.value })}\n placeholder=\"#6B7280\"\n />\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nexport function ResourceEditor({\n resource,\n onSave,\n view: controlledView,\n onViewChange,\n onSaveStatusChange,\n hideToolbar,\n}: ResourceEditorProps) {\n const [content, setContent] = useState(resource.content);\n const [internalView, setInternalView] = useState<\"visual\" | \"code\">(\n getViewPref,\n );\n const view = controlledView ?? internalView;\n const [saveStatus, setSaveStatus] = useState<\"idle\" | \"saving\" | \"saved\">(\n \"idle\",\n );\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const prevIdRef = useRef(resource.id);\n\n // Reset content when resource changes\n useEffect(() => {\n if (prevIdRef.current !== resource.id) {\n setContent(resource.content);\n setSaveStatus(\"idle\");\n onSaveStatusChange?.(\"idle\");\n prevIdRef.current = resource.id;\n }\n }, [resource.id, resource.content, onSaveStatusChange]);\n\n const handleChange = useCallback(\n (newContent: string) => {\n setContent(newContent);\n setSaveStatus(\"idle\");\n onSaveStatusChange?.(\"idle\");\n if (debounceRef.current) clearTimeout(debounceRef.current);\n debounceRef.current = setTimeout(() => {\n setSaveStatus(\"saving\");\n onSaveStatusChange?.(\"saving\");\n onSave(newContent);\n setTimeout(() => {\n setSaveStatus(\"saved\");\n onSaveStatusChange?.(\"saved\");\n }, 300);\n }, 1000);\n },\n [onSave, onSaveStatusChange],\n );\n\n const switchView = useCallback(\n (v: \"visual\" | \"code\") => {\n setInternalView(v);\n setViewPref(v);\n onViewChange?.(v);\n },\n [onViewChange],\n );\n\n // Cleanup debounce on unmount\n useEffect(() => {\n return () => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n };\n }, []);\n\n const isMarkdown =\n resource.mimeType === \"text/markdown\" || resource.path.endsWith(\".md\");\n const isImage = resource.mimeType.startsWith(\"image/\");\n const isRemoteAgent = isRemoteAgentPath(resource.path);\n\n // Remote-agent manifest → form editor\n if (isRemoteAgent) {\n return (\n <div className=\"flex h-full flex-col\">\n <RemoteAgentFormEditor resource={resource} onChange={handleChange} />\n </div>\n );\n }\n\n // Image preview\n if (isImage) {\n return (\n <div className=\"flex h-full flex-col\">\n <div className=\"flex flex-1 items-center justify-center overflow-auto p-4\">\n <img\n src={agentNativePath(`/_agent-native/resources/${resource.id}?raw`)}\n alt={resource.path}\n className=\"max-h-full max-w-full object-contain\"\n />\n </div>\n </div>\n );\n }\n\n // Markdown files get visual/code toggle\n if (isMarkdown) {\n return (\n <div className=\"flex h-full flex-col\">\n <style>{editorStyles}</style>\n {!hideToolbar && (\n <div className=\"flex items-center justify-between border-b border-border px-3 py-2\">\n <div className=\"flex items-center gap-1\">\n <button\n onClick={() => switchView(\"visual\")}\n className={cn(\n \"rounded-md px-2 py-1.5 text-[12px] leading-none\",\n view === \"visual\"\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:bg-accent/50 hover:text-foreground\",\n )}\n style={CONTROL_STYLE}\n >\n Visual\n </button>\n <button\n onClick={() => switchView(\"code\")}\n className={cn(\n \"rounded-md px-2 py-1.5 text-[12px] leading-none\",\n view === \"code\"\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:bg-accent/50 hover:text-foreground\",\n )}\n style={CONTROL_STYLE}\n >\n Code\n </button>\n </div>\n <span className=\"text-[11px] text-muted-foreground/60\">\n {saveStatus === \"saving\"\n ? \"Saving...\"\n : saveStatus === \"saved\"\n ? \"Saved\"\n : \"\"}\n </span>\n </div>\n )}\n {view === \"visual\" ? (\n <div\n className=\"flex-1 min-h-0 overflow-y-auto p-3\"\n key={resource.id + \"-visual\"}\n >\n <VisualMarkdownEditor\n content={content}\n onChange={handleChange}\n resourcePath={resource.path}\n />\n </div>\n ) : (\n <textarea\n value={content}\n onChange={(e) => handleChange(e.target.value)}\n className=\"flex-1 min-h-0 resize-none bg-transparent p-3 text-[13px] text-foreground outline-none placeholder:text-muted-foreground/50\"\n style={{\n fontFamily:\n 'ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, monospace',\n lineHeight: 1.6,\n }}\n spellCheck={false}\n />\n )}\n </div>\n );\n }\n\n // Non-markdown text files\n const isJson =\n resource.mimeType === \"application/json\" || resource.path.endsWith(\".json\");\n\n return (\n <div className=\"flex h-full flex-col\">\n {isJson ? (\n <SyntaxHighlightEditor\n value={content}\n onChange={handleChange}\n language=\"json\"\n />\n ) : (\n <textarea\n value={content}\n onChange={(e) => handleChange(e.target.value)}\n className=\"flex-1 min-h-0 resize-none bg-transparent p-3 text-[13px] text-foreground outline-none placeholder:text-muted-foreground/50\"\n style={{\n fontFamily:\n 'ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, monospace',\n lineHeight: 1.6,\n }}\n spellCheck={false}\n />\n )}\n </div>\n );\n}\n\n// --- Scoped editor styles (injected inline so no external CSS needed) ---\n\nconst editorStyles = `\n/* Prose styling for the visual editor */\n.re-prose {\n outline: none;\n color: hsl(var(--foreground));\n line-height: 1.65;\n font-size: 13px;\n min-height: 100%;\n}\n.re-prose > *:first-child { margin-top: 0; }\n\n.re-prose h1 {\n font-size: 1.5em;\n font-weight: 700;\n margin: 1em 0 0.25em;\n line-height: 1.25;\n}\n.re-prose h2 {\n font-size: 1.25em;\n font-weight: 600;\n margin: 0.8em 0 0.2em;\n line-height: 1.3;\n}\n.re-prose h3 {\n font-size: 1.1em;\n font-weight: 600;\n margin: 0.6em 0 0.15em;\n line-height: 1.35;\n}\n.re-prose p {\n margin: 0.35em 0;\n min-height: 1.65em;\n}\n.re-prose ul {\n list-style-type: disc;\n padding-left: 1.4em;\n margin: 0.2em 0;\n}\n.re-prose ol {\n list-style-type: decimal;\n padding-left: 1.4em;\n margin: 0.2em 0;\n}\n.re-prose li { margin: 0.05em 0; }\n.re-prose li p { margin: 0; }\n\n.re-prose blockquote {\n border-left: 2px solid hsl(var(--border));\n padding-left: 0.8em;\n margin: 0.3em 0;\n color: hsl(var(--muted-foreground));\n}\n.re-prose code {\n font-family: ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, monospace;\n font-size: 0.88em;\n background: hsl(var(--muted));\n padding: 0.1em 0.3em;\n border-radius: 3px;\n}\n.re-prose pre {\n font-family: ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, monospace;\n font-size: 12px;\n background: hsl(var(--muted));\n border-radius: 4px;\n padding: 0.7em 0.9em;\n margin: 0.3em 0;\n overflow-x: auto;\n line-height: 1.5;\n}\n.re-prose pre code {\n background: none;\n padding: 0;\n border: none;\n font-size: inherit;\n}\n.re-prose hr {\n border: none;\n border-top: 1px solid hsl(var(--border));\n margin: 1em 0;\n}\n.re-prose strong { font-weight: 600; }\n.re-prose em { font-style: italic; }\n.re-prose s { text-decoration: line-through; }\n\n.re-link {\n color: hsl(var(--foreground));\n text-decoration: underline;\n text-underline-offset: 2px;\n text-decoration-color: hsl(var(--muted-foreground));\n cursor: pointer;\n}\n.re-link:hover {\n text-decoration-color: hsl(var(--foreground));\n}\n\n/* Placeholder */\n.re-prose p.is-editor-empty:first-child::before,\n.re-prose p.is-empty::before,\n.re-prose h1.is-empty::before,\n.re-prose h2.is-empty::before,\n.re-prose h3.is-empty::before {\n content: attr(data-placeholder);\n float: left;\n color: hsl(var(--muted-foreground));\n opacity: 0.5;\n pointer-events: none;\n height: 0;\n}\n\n/* Selection */\n.re-prose ::selection {\n background: hsl(210 100% 52% / 0.2);\n}\n\n/* Bubble toolbar */\n.re-bubble-toolbar {\n display: flex;\n align-items: center;\n background: hsl(0 0% 15%);\n border-radius: 6px;\n padding: 3px;\n box-shadow: 0 4px 16px rgb(0 0 0 / 0.25), 0 0 0 1px rgb(255 255 255 / 0.06);\n}\n.re-bubble-btn {\n padding: 3px 6px;\n border-radius: 4px;\n font-size: 12px;\n color: rgba(255,255,255,0.75);\n background: none;\n border: none;\n cursor: pointer;\n line-height: 1;\n}\n.re-bubble-btn:hover {\n background: rgba(255,255,255,0.12);\n color: white;\n}\n.re-bubble-btn--active {\n background: rgba(255,255,255,0.18);\n color: white;\n}\n\n/* Slash command menu */\n.re-slash-menu {\n background: hsl(var(--popover));\n border: 1px solid hsl(var(--border));\n border-radius: 6px;\n box-shadow: 0 4px 20px rgb(0 0 0 / 0.12), 0 0 0 1px rgb(0 0 0 / 0.04);\n min-width: 220px;\n max-height: 320px;\n overflow-y: auto;\n color: hsl(var(--foreground));\n}\n.re-slash-item {\n width: 100%;\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 10px;\n text-align: left;\n background: none;\n border: none;\n cursor: pointer;\n color: hsl(var(--foreground));\n font-size: 13px;\n}\n.re-slash-item:hover,\n.re-slash-item--active {\n background: hsl(var(--accent));\n}\n.re-slash-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border-radius: 4px;\n border: 1px solid hsl(var(--border));\n background: hsl(var(--background));\n font-size: 12px;\n font-weight: 600;\n color: hsl(var(--muted-foreground));\n flex-shrink: 0;\n}\n.re-slash-title {\n display: block;\n font-weight: 500;\n font-size: 13px;\n}\n.re-slash-desc {\n display: block;\n font-size: 11px;\n color: hsl(var(--muted-foreground));\n}\n`;\n"]}
1
+ {"version":3,"file":"ResourceEditor.js","sourceRoot":"","sources":["../../../src/client/resources/ResourceEditor.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, {\n useState,\n useRef,\n useEffect,\n useCallback,\n useMemo,\n} from \"react\";\nimport { useEditor, EditorContent } from \"@tiptap/react\";\nimport StarterKit from \"@tiptap/starter-kit\";\nimport Placeholder from \"@tiptap/extension-placeholder\";\nimport Link from \"@tiptap/extension-link\";\nimport { Markdown } from \"tiptap-markdown\";\nimport { cn } from \"../utils.js\";\nimport { agentNativePath } from \"../api-path.js\";\nimport type { Resource } from \"./use-resources.js\";\nimport {\n type ParsedFrontmatter,\n getRemoteAgentIdFromPath,\n getFrontmatterValue,\n isCustomAgentPath,\n isRemoteAgentPath,\n isSkillPath,\n parseFrontmatter,\n serializeFrontmatter,\n} from \"../../resources/metadata.js\";\n\nexport interface ResourceEditorProps {\n resource: Resource;\n onSave: (content: string) => void;\n /** Controlled view mode — if provided, the editor won't manage its own view state */\n view?: \"visual\" | \"code\";\n onViewChange?: (v: \"visual\" | \"code\") => void;\n /** Called whenever save status changes */\n onSaveStatusChange?: (status: \"idle\" | \"saving\" | \"saved\") => void;\n /** When true, the editor's internal toolbar row is hidden */\n hideToolbar?: boolean;\n}\n\nconst CONTROL_STYLE = { fontSize: 12, lineHeight: 1 } as const;\n\nconst VIEW_PREF_KEY = \"resource-editor-view\";\n\nfunction getViewPref(): \"visual\" | \"code\" {\n try {\n const v = localStorage.getItem(VIEW_PREF_KEY);\n if (v === \"code\") return \"code\";\n } catch {}\n return \"visual\";\n}\n\nfunction setViewPref(v: \"visual\" | \"code\") {\n try {\n localStorage.setItem(VIEW_PREF_KEY, v);\n } catch {}\n}\n\nconst FM_INPUT_STYLE: React.CSSProperties = {\n background: \"transparent\",\n border: \"none\",\n outline: \"none\",\n color: \"inherit\",\n fontSize: \"inherit\",\n fontFamily: \"inherit\",\n width: \"100%\",\n padding: 0,\n};\n\nfunction FrontmatterBar({\n resourcePath,\n frontmatter,\n onChange,\n}: {\n resourcePath: string;\n frontmatter: ParsedFrontmatter;\n onChange: (updated: ParsedFrontmatter) => void;\n}) {\n const getField = (key: string) => getFrontmatterValue(frontmatter, key) ?? \"\";\n\n const updateField = (key: string, value: string) => {\n const exists = frontmatter.fields.some((f) => f.key === key);\n const newFields = exists\n ? frontmatter.fields.map((f) => (f.key === key ? { ...f, value } : f))\n : [...frontmatter.fields, { key, value }];\n const updated: ParsedFrontmatter = {\n ...frontmatter,\n raw: serializeFrontmatter(newFields),\n fields: newFields,\n };\n onChange(updated);\n };\n\n const name = getField(\"name\");\n const description = getField(\"description\");\n const isUserInvocable = getField(\"user-invocable\") === \"true\";\n const model = getField(\"model\") || \"inherit\";\n const tools = getField(\"tools\") || \"inherit\";\n const isCustomAgent = isCustomAgentPath(resourcePath);\n const isSkill = isSkillPath(resourcePath);\n\n return (\n <div\n style={{\n padding: \"8px 12px\",\n marginBottom: 8,\n borderRadius: 6,\n background: \"hsl(var(--muted) / 0.5)\",\n border: \"1px solid hsl(var(--border) / 0.5)\",\n fontSize: 12,\n lineHeight: 1.5,\n color: \"hsl(var(--muted-foreground))\",\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 6 }}>\n <input\n value={name}\n onChange={(e) => updateField(\"name\", e.target.value)}\n placeholder={isCustomAgent ? \"Agent name\" : \"Skill name\"}\n style={{\n ...FM_INPUT_STYLE,\n fontWeight: 600,\n color: \"hsl(var(--foreground))\",\n fontSize: 13,\n flex: 1,\n }}\n />\n {isSkill ? (\n <label\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n fontSize: 10,\n cursor: \"pointer\",\n whiteSpace: \"nowrap\",\n userSelect: \"none\",\n padding: \"1px 5px\",\n borderRadius: 3,\n background: isUserInvocable\n ? \"hsl(var(--primary) / 0.15)\"\n : \"transparent\",\n color: isUserInvocable\n ? \"hsl(var(--primary))\"\n : \"hsl(var(--muted-foreground))\",\n border: isUserInvocable\n ? \"none\"\n : \"1px dashed hsl(var(--border))\",\n fontWeight: 500,\n }}\n >\n <input\n type=\"checkbox\"\n checked={isUserInvocable}\n onChange={(e) =>\n updateField(\n \"user-invocable\",\n e.target.checked ? \"true\" : \"false\",\n )\n }\n style={{ display: \"none\" }}\n />\n /{name || \"command\"}\n </label>\n ) : null}\n {isCustomAgent ? (\n <select\n value={model}\n onChange={(e) => updateField(\"model\", e.target.value)}\n style={{\n borderRadius: 4,\n border: \"1px solid hsl(var(--border))\",\n background: \"hsl(var(--background))\",\n color: \"hsl(var(--foreground))\",\n fontSize: 11,\n padding: \"2px 6px\",\n }}\n >\n <option value=\"inherit\">Default model</option>\n <option value=\"claude-sonnet-4-6\">Claude Sonnet 4.6</option>\n <option value=\"claude-haiku-4-5-20251001\">Claude Haiku 4.5</option>\n </select>\n ) : null}\n </div>\n <input\n value={description}\n onChange={(e) => updateField(\"description\", e.target.value)}\n placeholder={\n isCustomAgent\n ? \"Description — what this agent should handle\"\n : \"Description — what this skill does\"\n }\n style={{\n ...FM_INPUT_STYLE,\n marginTop: 2,\n opacity: 0.8,\n color: \"hsl(var(--muted-foreground))\",\n }}\n />\n {isCustomAgent ? (\n <div\n style={{\n display: \"flex\",\n gap: 8,\n marginTop: 6,\n alignItems: \"center\",\n }}\n >\n <label\n style={{\n fontSize: 10,\n color: \"hsl(var(--muted-foreground))\",\n minWidth: 28,\n }}\n >\n Tools\n </label>\n <select\n value={tools}\n onChange={(e) => updateField(\"tools\", e.target.value)}\n style={{\n borderRadius: 4,\n border: \"1px solid hsl(var(--border))\",\n background: \"hsl(var(--background))\",\n color: \"hsl(var(--foreground))\",\n fontSize: 11,\n padding: \"2px 6px\",\n }}\n >\n <option value=\"inherit\">Inherit</option>\n <option value=\"allowlist\">Allowlist later</option>\n <option value=\"denylist\">Denylist later</option>\n </select>\n </div>\n ) : null}\n </div>\n );\n}\n\n// --- Slash Command Menu ---\n\ninterface CommandItem {\n title: string;\n description: string;\n icon: string;\n action: (editor: any) => void;\n}\n\nconst slashCommands: CommandItem[] = [\n {\n title: \"Text\",\n description: \"Plain text\",\n icon: \"T\",\n action: (editor) => editor.chain().focus().setParagraph().run(),\n },\n {\n title: \"Heading 1\",\n description: \"Large heading\",\n icon: \"H1\",\n action: (editor) =>\n editor.chain().focus().toggleHeading({ level: 1 }).run(),\n },\n {\n title: \"Heading 2\",\n description: \"Medium heading\",\n icon: \"H2\",\n action: (editor) =>\n editor.chain().focus().toggleHeading({ level: 2 }).run(),\n },\n {\n title: \"Heading 3\",\n description: \"Small heading\",\n icon: \"H3\",\n action: (editor) =>\n editor.chain().focus().toggleHeading({ level: 3 }).run(),\n },\n {\n title: \"Bullet List\",\n description: \"Unordered list\",\n icon: \"•\",\n action: (editor) => editor.chain().focus().toggleBulletList().run(),\n },\n {\n title: \"Numbered List\",\n description: \"Ordered list\",\n icon: \"1.\",\n action: (editor) => editor.chain().focus().toggleOrderedList().run(),\n },\n {\n title: \"Code Block\",\n description: \"Code snippet\",\n icon: \"<>\",\n action: (editor) => editor.chain().focus().toggleCodeBlock().run(),\n },\n {\n title: \"Quote\",\n description: \"Block quote\",\n icon: '\"',\n action: (editor) => editor.chain().focus().toggleBlockquote().run(),\n },\n {\n title: \"Divider\",\n description: \"Horizontal rule\",\n icon: \"—\",\n action: (editor) => editor.chain().focus().setHorizontalRule().run(),\n },\n];\n\nfunction SlashMenu({ editor }: { editor: any }) {\n const [isOpen, setIsOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [position, setPosition] = useState<{\n top: number;\n left: number;\n flipUp: boolean;\n } | null>(null);\n const slashPosRef = useRef<number | null>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n\n const filteredCommands = useMemo(\n () =>\n slashCommands.filter(\n (cmd) =>\n cmd.title.toLowerCase().includes(query.toLowerCase()) ||\n cmd.description.toLowerCase().includes(query.toLowerCase()),\n ),\n [query],\n );\n\n const executeCommand = useCallback(\n (cmd: CommandItem) => {\n if (slashPosRef.current !== null) {\n const { from } = editor.state.selection;\n editor\n .chain()\n .focus()\n .deleteRange({ from: slashPosRef.current, to: from })\n .run();\n }\n cmd.action(editor);\n setIsOpen(false);\n setQuery(\"\");\n slashPosRef.current = null;\n },\n [editor],\n );\n\n useEffect(() => {\n if (!editor) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (!isOpen) return;\n\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setSelectedIndex((i) => (i + 1) % filteredCommands.length);\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setSelectedIndex(\n (i) => (i - 1 + filteredCommands.length) % filteredCommands.length,\n );\n } else if (e.key === \"Enter\") {\n e.preventDefault();\n if (filteredCommands[selectedIndex]) {\n executeCommand(filteredCommands[selectedIndex]);\n }\n } else if (e.key === \"Escape\") {\n setIsOpen(false);\n setQuery(\"\");\n slashPosRef.current = null;\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown, true);\n return () => document.removeEventListener(\"keydown\", handleKeyDown, true);\n }, [isOpen, selectedIndex, filteredCommands, executeCommand, editor]);\n\n useEffect(() => {\n if (!editor) return;\n\n const handleTransaction = () => {\n const { state } = editor;\n const { from } = state.selection;\n const textBefore = state.doc.textBetween(\n Math.max(0, from - 20),\n from,\n \"\\n\",\n );\n\n const slashMatch = textBefore.match(/\\/([a-zA-Z0-9]*)$/);\n\n if (slashMatch) {\n const slashStart = from - slashMatch[0].length;\n slashPosRef.current = slashStart;\n setQuery(slashMatch[1]);\n setSelectedIndex(0);\n\n const coords = editor.view.coordsAtPos(from);\n // Estimate menu height (~320px max) and check if it fits below\n const menuHeight = 320;\n const spaceBelow = window.innerHeight - coords.bottom;\n const flipUp = spaceBelow < menuHeight && coords.top > menuHeight;\n\n setPosition({\n top: flipUp ? coords.top : coords.bottom + 4,\n left: Math.min(coords.left, window.innerWidth - 240),\n flipUp,\n });\n setIsOpen(true);\n } else {\n if (isOpen) {\n setIsOpen(false);\n setQuery(\"\");\n slashPosRef.current = null;\n }\n }\n };\n\n editor.on(\"transaction\", handleTransaction);\n return () => {\n editor.off(\"transaction\", handleTransaction);\n };\n }, [editor, isOpen]);\n\n if (!isOpen || !position || filteredCommands.length === 0) return null;\n\n return (\n <div\n ref={menuRef}\n style={{\n position: \"fixed\",\n ...(position.flipUp\n ? { bottom: window.innerHeight - position.top + 4 }\n : { top: position.top }),\n left: position.left,\n zIndex: 9999,\n }}\n className=\"re-slash-menu\"\n >\n <div className=\"py-1\">\n <div\n style={{\n padding: \"4px 10px\",\n fontSize: 10,\n fontWeight: 600,\n textTransform: \"uppercase\",\n letterSpacing: \"0.06em\",\n opacity: 0.5,\n }}\n >\n Blocks\n </div>\n {filteredCommands.map((cmd, i) => (\n <button\n key={cmd.title}\n onClick={() => executeCommand(cmd)}\n onMouseEnter={() => setSelectedIndex(i)}\n className={cn(\n \"re-slash-item\",\n i === selectedIndex && \"re-slash-item--active\",\n )}\n >\n <span className=\"re-slash-icon\">{cmd.icon}</span>\n <span>\n <span className=\"re-slash-title\">{cmd.title}</span>\n <span className=\"re-slash-desc\">{cmd.description}</span>\n </span>\n </button>\n ))}\n </div>\n </div>\n );\n}\n\n// --- Inline Bubble Toolbar ---\n\nfunction InlineBubbleToolbar({ editor }: { editor: any }) {\n const [visible, setVisible] = useState(false);\n const [coords, setCoords] = useState({ top: 0, left: 0 });\n const [showLinkInput, setShowLinkInput] = useState(false);\n const [linkUrl, setLinkUrl] = useState(\"\");\n const toolbarRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!editor) return;\n const update = () => {\n const { from, to } = editor.state.selection;\n if (from === to || !editor.isFocused) {\n setVisible(false);\n return;\n }\n const domSelection = window.getSelection();\n if (!domSelection || domSelection.rangeCount === 0) {\n setVisible(false);\n return;\n }\n const range = domSelection.getRangeAt(0);\n const rect = range.getBoundingClientRect();\n if (rect.width === 0) {\n setVisible(false);\n return;\n }\n // Use fixed positioning with viewport coordinates\n setCoords({\n top: rect.top - 8,\n left: rect.left + rect.width / 2,\n });\n setVisible(true);\n };\n editor.on(\"selectionUpdate\", update);\n const onBlur = () => {\n // Delay so clicks on toolbar buttons register before hiding\n setTimeout(() => {\n if (!editor.isFocused) setVisible(false);\n }, 150);\n };\n editor.on(\"blur\", onBlur);\n return () => {\n editor.off(\"selectionUpdate\", update);\n editor.off(\"blur\", onBlur);\n };\n }, [editor]);\n\n const handleSetLink = () => {\n if (linkUrl.trim()) {\n editor\n .chain()\n .focus()\n .extendMarkRange(\"link\")\n .setLink({ href: linkUrl.trim() })\n .run();\n } else {\n editor.chain().focus().extendMarkRange(\"link\").unsetLink().run();\n }\n setShowLinkInput(false);\n setLinkUrl(\"\");\n };\n\n const toggleLink = () => {\n if (editor.isActive(\"link\")) {\n editor.chain().focus().unsetLink().run();\n return;\n }\n const previousUrl = editor.getAttributes(\"link\").href || \"\";\n setLinkUrl(previousUrl);\n setShowLinkInput(true);\n };\n\n const items = [\n {\n label: \"B\",\n title: \"Bold\",\n action: () => editor.chain().focus().toggleBold().run(),\n isActive: () => editor.isActive(\"bold\"),\n style: { fontWeight: 700 } as React.CSSProperties,\n },\n {\n label: \"I\",\n title: \"Italic\",\n action: () => editor.chain().focus().toggleItalic().run(),\n isActive: () => editor.isActive(\"italic\"),\n style: { fontStyle: \"italic\" } as React.CSSProperties,\n },\n {\n label: \"S\",\n title: \"Strikethrough\",\n action: () => editor.chain().focus().toggleStrike().run(),\n isActive: () => editor.isActive(\"strike\"),\n style: { textDecoration: \"line-through\" } as React.CSSProperties,\n },\n {\n label: \"<>\",\n title: \"Code\",\n action: () => editor.chain().focus().toggleCode().run(),\n isActive: () => editor.isActive(\"code\"),\n style: { fontFamily: \"monospace\", fontSize: 11 } as React.CSSProperties,\n },\n { type: \"divider\" as const },\n {\n label: \"H1\",\n title: \"Heading 1\",\n action: () => editor.chain().focus().toggleHeading({ level: 1 }).run(),\n isActive: () => editor.isActive(\"heading\", { level: 1 }),\n },\n {\n label: \"H2\",\n title: \"Heading 2\",\n action: () => editor.chain().focus().toggleHeading({ level: 2 }).run(),\n isActive: () => editor.isActive(\"heading\", { level: 2 }),\n },\n {\n label: \"H3\",\n title: \"Heading 3\",\n action: () => editor.chain().focus().toggleHeading({ level: 3 }).run(),\n isActive: () => editor.isActive(\"heading\", { level: 3 }),\n },\n { type: \"divider\" as const },\n {\n label: \"Link\",\n title: \"Link\",\n action: toggleLink,\n isActive: () => editor.isActive(\"link\"),\n },\n ];\n\n if (!visible) return null;\n\n return (\n <div\n ref={toolbarRef}\n className=\"re-bubble-toolbar\"\n onMouseDown={(e) => e.preventDefault()}\n style={{\n position: \"fixed\",\n top: coords.top,\n left: coords.left,\n transform: \"translate(-50%, -100%)\",\n zIndex: 9999,\n }}\n >\n {showLinkInput ? (\n <div\n style={{ display: \"flex\", alignItems: \"center\", gap: 4, padding: 4 }}\n onMouseDown={(e) => e.preventDefault()}\n >\n <input\n autoFocus\n type=\"url\"\n placeholder=\"Paste link...\"\n value={linkUrl}\n onChange={(e) => setLinkUrl(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") handleSetLink();\n if (e.key === \"Escape\") {\n setShowLinkInput(false);\n setLinkUrl(\"\");\n }\n }}\n style={{\n background: \"transparent\",\n border: \"none\",\n outline: \"none\",\n color: \"white\",\n fontSize: 12,\n width: 160,\n padding: \"2px 4px\",\n }}\n />\n <button\n onClick={handleSetLink}\n style={{\n fontSize: 11,\n color: \"#60a5fa\",\n padding: \"2px 6px\",\n fontWeight: 500,\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n }}\n >\n Apply\n </button>\n </div>\n ) : (\n <div\n style={{ display: \"flex\", alignItems: \"center\", gap: 2 }}\n onMouseDown={(e) => e.preventDefault()}\n >\n {items.map((item, i) => {\n if (\"type\" in item && item.type === \"divider\") {\n return (\n <div\n key={`d-${i}`}\n style={{\n width: 1,\n height: 16,\n background: \"rgba(255,255,255,0.2)\",\n margin: \"0 2px\",\n }}\n />\n );\n }\n const { label, title, action, isActive, style } = item as {\n label: string;\n title: string;\n action: () => void;\n isActive: () => boolean;\n style?: React.CSSProperties;\n };\n return (\n <button\n key={title}\n onClick={action}\n title={title}\n className={cn(\n \"re-bubble-btn\",\n isActive() && \"re-bubble-btn--active\",\n )}\n style={style}\n >\n {label}\n </button>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n\n// --- Visual Markdown Editor ---\n\n// --- Syntax-highlighted code editor (textarea + overlay) ---\n\nfunction highlightJson(text: string): string {\n // Escape HTML first\n const esc = text\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\");\n // Tokenize JSON with regex\n return esc.replace(\n /(\"(?:\\\\.|[^\"\\\\])*\")\\s*:|(\"(?:\\\\.|[^\"\\\\])*\")|((?:-?\\d+)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?)|(\\btrue\\b|\\bfalse\\b|\\bnull\\b)/g,\n (match, key, str, num, lit) => {\n if (key) return `<span class=\"sh-key\">${key}</span>:`;\n if (str) return `<span class=\"sh-str\">${str}</span>`;\n if (num) return `<span class=\"sh-num\">${num}</span>`;\n if (lit) return `<span class=\"sh-lit\">${lit}</span>`;\n return match;\n },\n );\n}\n\nconst shStyles = `\n.sh-key { color: #7dd3fc; }\n.sh-str { color: #86efac; }\n.sh-num { color: #fca5a5; }\n.sh-lit { color: #c4b5fd; }\n`;\n\nfunction SyntaxHighlightEditor({\n value,\n onChange,\n language: _language,\n}: {\n value: string;\n onChange: (v: string) => void;\n language: \"json\";\n}) {\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const preRef = useRef<HTMLPreElement>(null);\n\n const highlighted = useMemo(() => highlightJson(value), [value]);\n\n const syncScroll = useCallback(() => {\n if (textareaRef.current && preRef.current) {\n preRef.current.scrollTop = textareaRef.current.scrollTop;\n preRef.current.scrollLeft = textareaRef.current.scrollLeft;\n }\n }, []);\n\n const monoFont =\n 'ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, monospace';\n const sharedStyle: React.CSSProperties = {\n fontFamily: monoFont,\n fontSize: 13,\n lineHeight: 1.6,\n padding: 12,\n margin: 0,\n border: \"none\",\n whiteSpace: \"pre\",\n wordWrap: \"normal\",\n overflowWrap: \"normal\",\n tabSize: 2,\n };\n\n return (\n <>\n <style>{shStyles}</style>\n <div\n className=\"flex-1 min-h-0\"\n style={{ position: \"relative\", overflow: \"hidden\" }}\n >\n <pre\n ref={preRef}\n aria-hidden\n style={{\n ...sharedStyle,\n position: \"absolute\",\n inset: 0,\n overflow: \"auto\",\n pointerEvents: \"none\",\n color: \"hsl(var(--muted-foreground))\",\n background: \"transparent\",\n }}\n dangerouslySetInnerHTML={{ __html: highlighted + \"\\n\" }}\n />\n <textarea\n ref={textareaRef}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onScroll={syncScroll}\n spellCheck={false}\n style={{\n ...sharedStyle,\n position: \"absolute\",\n inset: 0,\n width: \"100%\",\n height: \"100%\",\n overflow: \"auto\",\n resize: \"none\",\n background: \"transparent\",\n color: \"transparent\",\n caretColor: \"hsl(var(--foreground))\",\n outline: \"none\",\n WebkitTextFillColor: \"transparent\",\n }}\n />\n </div>\n </>\n );\n}\n\nfunction VisualMarkdownEditor({\n content,\n onChange,\n resourcePath,\n}: {\n content: string;\n onChange: (md: string) => void;\n resourcePath: string;\n}) {\n const isSettingContent = useRef(false);\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n // Parse frontmatter — strip it from tiptap content, re-prepend on save\n const parsed = useMemo(() => parseFrontmatter(content), [content]);\n const frontmatterRef = useRef(parsed);\n frontmatterRef.current = parsed;\n\n const editor = useEditor({\n extensions: [\n StarterKit.configure({\n heading: { levels: [1, 2, 3] },\n codeBlock: {},\n dropcursor: { color: \"hsl(var(--ring))\", width: 2 },\n }),\n Placeholder.configure({\n placeholder: ({ node }) => {\n if (node.type.name === \"heading\") {\n const level = node.attrs.level;\n if (level === 1) return \"Heading 1\";\n if (level === 2) return \"Heading 2\";\n return \"Heading 3\";\n }\n return \"Type '/' for commands...\";\n },\n showOnlyWhenEditable: true,\n showOnlyCurrent: true,\n }),\n Link.configure({\n openOnClick: false,\n HTMLAttributes: { class: \"re-link\" },\n }),\n Markdown.configure({\n html: true,\n transformPastedText: true,\n transformCopiedText: true,\n }),\n ],\n content: parsed?.body ?? content,\n editorProps: {\n attributes: {\n class: \"re-prose\",\n },\n },\n onUpdate: ({ editor }) => {\n if (isSettingContent.current) return;\n try {\n const md = (editor.storage as any).markdown.getMarkdown();\n // Re-prepend frontmatter if it existed\n const fm = frontmatterRef.current;\n const full = fm ? fm.raw + md : md;\n onChangeRef.current(full);\n } catch (err) {\n console.error(\"Markdown serialization error:\", err);\n }\n },\n });\n\n useEffect(() => {\n if (!editor || editor.isDestroyed) return;\n const currentMd = (editor.storage as any).markdown.getMarkdown();\n if (currentMd !== (parsed?.body ?? content)) {\n if (editor.isFocused) return;\n isSettingContent.current = true;\n editor.commands.setContent(parsed?.body ?? content);\n isSettingContent.current = false;\n }\n }, [content, editor, parsed]);\n\n useEffect(() => {\n return () => {\n editor?.destroy();\n };\n }, [editor]);\n\n if (!editor) return null;\n\n const handleWrapperClick = (e: React.MouseEvent<HTMLDivElement>) => {\n // If the click was on the wrapper (empty area), not on editor content, focus at end\n const target = e.target as HTMLElement;\n if (\n target.classList.contains(\"re-editor-clickable\") ||\n target.classList.contains(\"re-editor-wrapper\")\n ) {\n editor.chain().focus(\"end\").run();\n }\n };\n\n return (\n <div\n className=\"re-editor-wrapper re-editor-clickable\"\n onClick={handleWrapperClick}\n style={{ position: \"relative\", minHeight: \"100%\", cursor: \"text\" }}\n >\n {parsed && (\n <FrontmatterBar\n resourcePath={resourcePath}\n frontmatter={parsed}\n onChange={(updated) => {\n frontmatterRef.current = updated;\n // Get current body and combine with updated frontmatter\n try {\n const md = (editor.storage as any).markdown.getMarkdown();\n onChangeRef.current(updated.raw + md);\n } catch {\n // fallback\n }\n }}\n />\n )}\n <InlineBubbleToolbar editor={editor} />\n <SlashMenu editor={editor} />\n <EditorContent editor={editor} />\n </div>\n );\n}\n\n// --- Main ResourceEditor ---\n\ninterface RemoteAgentFormValue {\n id?: string;\n name: string;\n description: string;\n url: string;\n color: string;\n}\n\nfunction parseRemoteAgentContent(\n content: string,\n path: string,\n): RemoteAgentFormValue {\n const fallbackId = getRemoteAgentIdFromPath(path);\n try {\n const data = JSON.parse(content || \"{}\");\n return {\n id: data.id || fallbackId,\n name: data.name ?? \"\",\n description: data.description ?? \"\",\n url: data.url ?? \"\",\n color: data.color ?? \"#6B7280\",\n };\n } catch {\n return {\n id: fallbackId,\n name: \"\",\n description: \"\",\n url: \"\",\n color: \"#6B7280\",\n };\n }\n}\n\nfunction serializeRemoteAgent(value: RemoteAgentFormValue): string {\n return (\n JSON.stringify(\n {\n id: value.id,\n name: value.name,\n description: value.description || undefined,\n url: value.url,\n color: value.color,\n },\n null,\n 2,\n ) + \"\\n\"\n );\n}\n\nfunction RemoteAgentFormEditor({\n resource,\n onChange,\n}: {\n resource: Resource;\n onChange: (content: string) => void;\n}) {\n const [value, setValue] = useState<RemoteAgentFormValue>(() =>\n parseRemoteAgentContent(resource.content, resource.path),\n );\n const prevIdRef = useRef(resource.id);\n\n useEffect(() => {\n if (prevIdRef.current !== resource.id) {\n setValue(parseRemoteAgentContent(resource.content, resource.path));\n prevIdRef.current = resource.id;\n }\n }, [resource.id, resource.content, resource.path]);\n\n const update = (patch: Partial<RemoteAgentFormValue>) => {\n const next = { ...value, ...patch };\n setValue(next);\n onChange(serializeRemoteAgent(next));\n };\n\n const inputClass =\n \"w-full rounded-md border border-border bg-background px-2.5 py-1.5 text-[13px] text-foreground outline-none placeholder:text-muted-foreground/50 focus:ring-1 focus:ring-accent\";\n const labelClass = \"block text-[11px] font-medium text-muted-foreground mb-1\";\n\n return (\n <div className=\"flex flex-1 min-h-0 flex-col overflow-y-auto p-4\">\n <div className=\"max-w-md space-y-3\">\n <p className=\"text-[11px] text-muted-foreground/70 leading-snug\">\n Connected remote agent over the A2A protocol. @-mention it in chat to\n delegate tasks.\n </p>\n <div>\n <label className={labelClass}>Name</label>\n <input\n className={inputClass}\n value={value.name}\n onChange={(e) => update({ name: e.target.value })}\n placeholder=\"Analytics\"\n />\n </div>\n <div>\n <label className={labelClass}>URL</label>\n <input\n className={inputClass}\n value={value.url}\n onChange={(e) => update({ url: e.target.value })}\n placeholder=\"https://analytics.example.com\"\n />\n <p className=\"mt-1 text-[10px] text-muted-foreground/50\">\n A2A endpoint. The agent card is served at{\" \"}\n <code>/.well-known/agent-card.json</code>.\n </p>\n </div>\n <div>\n <label className={labelClass}>Description</label>\n <textarea\n className={cn(inputClass, \"resize-y\")}\n rows={3}\n value={value.description}\n onChange={(e) => update({ description: e.target.value })}\n placeholder=\"What this agent is good at — helps the main agent decide when to delegate.\"\n />\n </div>\n <div>\n <label className={labelClass}>Color</label>\n <div className=\"flex items-center gap-2\">\n <input\n type=\"color\"\n value={value.color}\n onChange={(e) => update({ color: e.target.value })}\n className=\"h-8 w-10 cursor-pointer rounded border border-border bg-transparent\"\n />\n <input\n className={cn(inputClass, \"flex-1\")}\n value={value.color}\n onChange={(e) => update({ color: e.target.value })}\n placeholder=\"#6B7280\"\n />\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nexport function ResourceEditor({\n resource,\n onSave,\n view: controlledView,\n onViewChange,\n onSaveStatusChange,\n hideToolbar,\n}: ResourceEditorProps) {\n const [content, setContent] = useState(resource.content);\n const [internalView, setInternalView] = useState<\"visual\" | \"code\">(\n getViewPref,\n );\n const view = controlledView ?? internalView;\n const [saveStatus, setSaveStatus] = useState<\"idle\" | \"saving\" | \"saved\">(\n \"idle\",\n );\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const prevIdRef = useRef(resource.id);\n\n // Reset content when resource changes\n useEffect(() => {\n if (prevIdRef.current !== resource.id) {\n setContent(resource.content);\n setSaveStatus(\"idle\");\n onSaveStatusChange?.(\"idle\");\n prevIdRef.current = resource.id;\n }\n }, [resource.id, resource.content, onSaveStatusChange]);\n\n const handleChange = useCallback(\n (newContent: string) => {\n setContent(newContent);\n setSaveStatus(\"idle\");\n onSaveStatusChange?.(\"idle\");\n if (debounceRef.current) clearTimeout(debounceRef.current);\n debounceRef.current = setTimeout(() => {\n setSaveStatus(\"saving\");\n onSaveStatusChange?.(\"saving\");\n onSave(newContent);\n setTimeout(() => {\n setSaveStatus(\"saved\");\n onSaveStatusChange?.(\"saved\");\n }, 300);\n }, 1000);\n },\n [onSave, onSaveStatusChange],\n );\n\n const switchView = useCallback(\n (v: \"visual\" | \"code\") => {\n setInternalView(v);\n setViewPref(v);\n onViewChange?.(v);\n },\n [onViewChange],\n );\n\n // Cleanup debounce on unmount\n useEffect(() => {\n return () => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n };\n }, []);\n\n const isMarkdown =\n resource.mimeType === \"text/markdown\" || resource.path.endsWith(\".md\");\n const isImage = resource.mimeType.startsWith(\"image/\");\n const isRemoteAgent = isRemoteAgentPath(resource.path);\n\n // Remote-agent manifest → form editor\n if (isRemoteAgent) {\n return (\n <div className=\"flex h-full flex-col\">\n <RemoteAgentFormEditor resource={resource} onChange={handleChange} />\n </div>\n );\n }\n\n // Image preview\n if (isImage) {\n return (\n <div className=\"flex h-full flex-col\">\n <div className=\"flex flex-1 items-center justify-center overflow-auto p-4\">\n <img\n src={agentNativePath(`/_agent-native/resources/${resource.id}?raw`)}\n alt={resource.path}\n className=\"max-h-full max-w-full object-contain\"\n />\n </div>\n </div>\n );\n }\n\n // Markdown files get visual/code toggle\n if (isMarkdown) {\n return (\n <div className=\"flex h-full flex-col\">\n <style>{editorStyles}</style>\n {!hideToolbar && (\n <div className=\"flex items-center justify-between border-b border-border px-3 py-2\">\n <div className=\"flex items-center gap-1\">\n <button\n onClick={() => switchView(\"visual\")}\n className={cn(\n \"rounded-md px-2 py-1.5 text-[12px] leading-none\",\n view === \"visual\"\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:bg-accent/50 hover:text-foreground\",\n )}\n style={CONTROL_STYLE}\n >\n Visual\n </button>\n <button\n onClick={() => switchView(\"code\")}\n className={cn(\n \"rounded-md px-2 py-1.5 text-[12px] leading-none\",\n view === \"code\"\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:bg-accent/50 hover:text-foreground\",\n )}\n style={CONTROL_STYLE}\n >\n Code\n </button>\n </div>\n <span className=\"text-[11px] text-muted-foreground/60\">\n {saveStatus === \"saving\"\n ? \"Saving...\"\n : saveStatus === \"saved\"\n ? \"Saved\"\n : \"\"}\n </span>\n </div>\n )}\n {view === \"visual\" ? (\n <div\n className=\"flex-1 min-h-0 overflow-y-auto p-3\"\n key={resource.id + \"-visual\"}\n >\n <VisualMarkdownEditor\n content={content}\n onChange={handleChange}\n resourcePath={resource.path}\n />\n </div>\n ) : (\n <textarea\n value={content}\n onChange={(e) => handleChange(e.target.value)}\n className=\"flex-1 min-h-0 resize-none bg-transparent p-3 text-[13px] text-foreground outline-none placeholder:text-muted-foreground/50\"\n style={{\n fontFamily:\n 'ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, monospace',\n lineHeight: 1.6,\n }}\n spellCheck={false}\n />\n )}\n </div>\n );\n }\n\n // Non-markdown text files\n const isJson =\n resource.mimeType === \"application/json\" || resource.path.endsWith(\".json\");\n\n return (\n <div className=\"flex h-full flex-col\">\n {isJson ? (\n <SyntaxHighlightEditor\n value={content}\n onChange={handleChange}\n language=\"json\"\n />\n ) : (\n <textarea\n value={content}\n onChange={(e) => handleChange(e.target.value)}\n className=\"flex-1 min-h-0 resize-none bg-transparent p-3 text-[13px] text-foreground outline-none placeholder:text-muted-foreground/50\"\n style={{\n fontFamily:\n 'ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, monospace',\n lineHeight: 1.6,\n }}\n spellCheck={false}\n />\n )}\n </div>\n );\n}\n\n// --- Scoped editor styles (injected inline so no external CSS needed) ---\n\nconst editorStyles = `\n/* Prose styling for the visual editor */\n.re-prose {\n outline: none;\n color: hsl(var(--foreground));\n line-height: 1.65;\n font-size: 13px;\n min-height: 100%;\n}\n.re-prose > *:first-child { margin-top: 0; }\n\n.re-prose h1 {\n font-size: 1.5em;\n font-weight: 700;\n margin: 1em 0 0.25em;\n line-height: 1.25;\n}\n.re-prose h2 {\n font-size: 1.25em;\n font-weight: 600;\n margin: 0.8em 0 0.2em;\n line-height: 1.3;\n}\n.re-prose h3 {\n font-size: 1.1em;\n font-weight: 600;\n margin: 0.6em 0 0.15em;\n line-height: 1.35;\n}\n.re-prose p {\n margin: 0.35em 0;\n min-height: 1.65em;\n}\n.re-prose ul {\n list-style-type: disc;\n padding-left: 1.4em;\n margin: 0.2em 0;\n}\n.re-prose ol {\n list-style-type: decimal;\n padding-left: 1.4em;\n margin: 0.2em 0;\n}\n.re-prose li { margin: 0.05em 0; }\n.re-prose li p { margin: 0; }\n\n.re-prose blockquote {\n border-left: 2px solid hsl(var(--border));\n padding-left: 0.8em;\n margin: 0.3em 0;\n color: hsl(var(--muted-foreground));\n}\n.re-prose code {\n font-family: ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, monospace;\n font-size: 0.88em;\n background: hsl(var(--muted));\n padding: 0.1em 0.3em;\n border-radius: 3px;\n}\n.re-prose pre {\n font-family: ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, monospace;\n font-size: 12px;\n background: hsl(var(--muted));\n border-radius: 4px;\n padding: 0.7em 0.9em;\n margin: 0.3em 0;\n overflow-x: auto;\n line-height: 1.5;\n}\n.re-prose pre code {\n background: none;\n padding: 0;\n border: none;\n font-size: inherit;\n}\n.re-prose hr {\n border: none;\n border-top: 1px solid hsl(var(--border));\n margin: 1em 0;\n}\n.re-prose strong { font-weight: 600; }\n.re-prose em { font-style: italic; }\n.re-prose s { text-decoration: line-through; }\n\n.re-link {\n color: hsl(var(--foreground));\n text-decoration: underline;\n text-underline-offset: 2px;\n text-decoration-color: hsl(var(--muted-foreground));\n cursor: pointer;\n}\n.re-link:hover {\n text-decoration-color: hsl(var(--foreground));\n}\n\n/* Placeholder */\n.re-prose p.is-editor-empty:first-child::before,\n.re-prose p.is-empty::before,\n.re-prose h1.is-empty::before,\n.re-prose h2.is-empty::before,\n.re-prose h3.is-empty::before {\n content: attr(data-placeholder);\n float: left;\n color: hsl(var(--muted-foreground));\n opacity: 0.5;\n pointer-events: none;\n height: 0;\n}\n\n/* Selection */\n.re-prose ::selection {\n background: hsl(210 100% 52% / 0.2);\n}\n\n/* Bubble toolbar */\n.re-bubble-toolbar {\n display: flex;\n align-items: center;\n background: hsl(0 0% 15%);\n border-radius: 6px;\n padding: 3px;\n box-shadow: 0 4px 16px rgb(0 0 0 / 0.25), 0 0 0 1px rgb(255 255 255 / 0.06);\n}\n.re-bubble-btn {\n padding: 3px 6px;\n border-radius: 4px;\n font-size: 12px;\n color: rgba(255,255,255,0.75);\n background: none;\n border: none;\n cursor: pointer;\n line-height: 1;\n}\n.re-bubble-btn:hover {\n background: rgba(255,255,255,0.12);\n color: white;\n}\n.re-bubble-btn--active {\n background: rgba(255,255,255,0.18);\n color: white;\n}\n\n/* Slash command menu */\n.re-slash-menu {\n background: hsl(var(--popover));\n border: 1px solid hsl(var(--border));\n border-radius: 6px;\n box-shadow: 0 4px 20px rgb(0 0 0 / 0.12), 0 0 0 1px rgb(0 0 0 / 0.04);\n min-width: 220px;\n max-height: 320px;\n overflow-y: auto;\n color: hsl(var(--foreground));\n}\n.re-slash-item {\n width: 100%;\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 10px;\n text-align: left;\n background: none;\n border: none;\n cursor: pointer;\n color: hsl(var(--foreground));\n font-size: 13px;\n}\n.re-slash-item:hover,\n.re-slash-item--active {\n background: hsl(var(--accent));\n}\n.re-slash-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border-radius: 4px;\n border: 1px solid hsl(var(--border));\n background: hsl(var(--background));\n font-size: 12px;\n font-weight: 600;\n color: hsl(var(--muted-foreground));\n flex-shrink: 0;\n}\n.re-slash-title {\n display: block;\n font-weight: 500;\n font-size: 13px;\n}\n.re-slash-desc {\n display: block;\n font-size: 11px;\n color: hsl(var(--muted-foreground));\n}\n`;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"AgentsSection.d.ts","sourceRoot":"","sources":["../../../src/client/settings/AgentsSection.tsx"],"names":[],"mappings":"AAuNA,wBAAgB,aAAa,4CAwN5B"}
1
+ {"version":3,"file":"AgentsSection.d.ts","sourceRoot":"","sources":["../../../src/client/settings/AgentsSection.tsx"],"names":[],"mappings":"AA4NA,wBAAgB,aAAa,4CAoN5B"}
@@ -1,5 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { agentNativePath } from "../api-path.js";
3
+ import { getRemoteAgentIdFromPath, isRemoteAgentPath, remoteAgentResourcePath, } from "../../resources/metadata.js";
3
4
  import { useState, useEffect, useRef, useCallback } from "react";
4
5
  import { IconPlus, IconPencil, IconTrash, IconX, } from "@tabler/icons-react";
5
6
  function AgentEditPopover({ agent, onSave, onDelete, onClose, }) {
@@ -97,7 +98,7 @@ export function AgentsSection() {
97
98
  if (!res.ok)
98
99
  return;
99
100
  const data = await res.json();
100
- const agentResources = (data.resources ?? []).filter((r) => r.path.startsWith("remote-agents/") && r.path.endsWith(".json"));
101
+ const agentResources = (data.resources ?? []).filter((r) => isRemoteAgentPath(r.path));
101
102
  const parsed = await Promise.all(agentResources.map(async (r) => {
102
103
  try {
103
104
  const detail = await fetch(agentNativePath(`/_agent-native/resources/${r.id}`));
@@ -140,7 +141,7 @@ export function AgentsSection() {
140
141
  method: "POST",
141
142
  headers: { "Content-Type": "application/json" },
142
143
  body: JSON.stringify({
143
- path: `remote-agents/${id}.json`,
144
+ path: remoteAgentResourcePath(id),
144
145
  content: agentJson,
145
146
  shared: true,
146
147
  }),
@@ -154,10 +155,7 @@ export function AgentsSection() {
154
155
  };
155
156
  const handleSave = async (agent) => {
156
157
  const agentJson = JSON.stringify({
157
- id: agent.path
158
- .replace("remote-agents/", "")
159
- .replace("agents/", "")
160
- .replace(".json", ""),
158
+ id: getRemoteAgentIdFromPath(agent.path),
161
159
  name: agent.name,
162
160
  description: agent.description || undefined,
163
161
  url: agent.url,