@devicai/ui 0.47.1 → 0.49.0

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 (50) hide show
  1. package/dist/cjs/api/client.js +56 -0
  2. package/dist/cjs/api/client.js.map +1 -1
  3. package/dist/cjs/api/types.js.map +1 -1
  4. package/dist/cjs/components/ChatDrawer/ChatDrawer.js +8 -1
  5. package/dist/cjs/components/ChatDrawer/ChatDrawer.js.map +1 -1
  6. package/dist/cjs/components/ChatDrawer/HandoffSubagentWidget.js +2 -1
  7. package/dist/cjs/components/ChatDrawer/HandoffSubagentWidget.js.map +1 -1
  8. package/dist/cjs/components/IntegrationsModal/IntegrationsModal.js +36 -5
  9. package/dist/cjs/components/IntegrationsModal/IntegrationsModal.js.map +1 -1
  10. package/dist/cjs/components/IntegrationsModal/McpConnectForm.js +79 -0
  11. package/dist/cjs/components/IntegrationsModal/McpConnectForm.js.map +1 -0
  12. package/dist/cjs/components/IntegrationsModal/McpServersSection.js +234 -0
  13. package/dist/cjs/components/IntegrationsModal/McpServersSection.js.map +1 -0
  14. package/dist/cjs/components/IntegrationsModal/useTenantMcp.js +107 -0
  15. package/dist/cjs/components/IntegrationsModal/useTenantMcp.js.map +1 -0
  16. package/dist/cjs/index.js +6 -0
  17. package/dist/cjs/index.js.map +1 -1
  18. package/dist/cjs/styles.css +1 -1
  19. package/dist/cjs/utils/avatar.js +60 -0
  20. package/dist/cjs/utils/avatar.js.map +1 -0
  21. package/dist/esm/api/client.d.ts +41 -1
  22. package/dist/esm/api/client.js +56 -0
  23. package/dist/esm/api/client.js.map +1 -1
  24. package/dist/esm/api/types.d.ts +87 -0
  25. package/dist/esm/api/types.js.map +1 -1
  26. package/dist/esm/components/ChatDrawer/ChatDrawer.js +8 -1
  27. package/dist/esm/components/ChatDrawer/ChatDrawer.js.map +1 -1
  28. package/dist/esm/components/ChatDrawer/HandoffSubagentWidget.js +2 -1
  29. package/dist/esm/components/ChatDrawer/HandoffSubagentWidget.js.map +1 -1
  30. package/dist/esm/components/IntegrationsModal/IntegrationsModal.d.ts +8 -1
  31. package/dist/esm/components/IntegrationsModal/IntegrationsModal.js +36 -5
  32. package/dist/esm/components/IntegrationsModal/IntegrationsModal.js.map +1 -1
  33. package/dist/esm/components/IntegrationsModal/McpConnectForm.d.ts +42 -0
  34. package/dist/esm/components/IntegrationsModal/McpConnectForm.js +77 -0
  35. package/dist/esm/components/IntegrationsModal/McpConnectForm.js.map +1 -0
  36. package/dist/esm/components/IntegrationsModal/McpServersSection.d.ts +25 -0
  37. package/dist/esm/components/IntegrationsModal/McpServersSection.js +232 -0
  38. package/dist/esm/components/IntegrationsModal/McpServersSection.js.map +1 -0
  39. package/dist/esm/components/IntegrationsModal/index.d.ts +6 -0
  40. package/dist/esm/components/IntegrationsModal/useTenantMcp.d.ts +40 -0
  41. package/dist/esm/components/IntegrationsModal/useTenantMcp.js +105 -0
  42. package/dist/esm/components/IntegrationsModal/useTenantMcp.js.map +1 -0
  43. package/dist/esm/index.d.ts +3 -3
  44. package/dist/esm/index.js +3 -0
  45. package/dist/esm/index.js.map +1 -1
  46. package/dist/esm/styles.css +1 -1
  47. package/dist/esm/utils/avatar.d.ts +18 -0
  48. package/dist/esm/utils/avatar.js +58 -0
  49. package/dist/esm/utils/avatar.js.map +1 -0
  50. package/package.json +2 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"McpServersSection.js","sources":["../../../../../src/components/IntegrationsModal/McpServersSection.tsx"],"sourcesContent":["import { useCallback, useEffect, useRef, useState, type JSX } from \"react\";\nimport type {\n TenantMcpAuthInput,\n TenantMcpConnectResult,\n TenantMcpServer,\n} from \"../../api/types\";\nimport type { DevicTheme } from \"../theme\";\nimport { McpConnectForm } from \"./McpConnectForm\";\nimport type { TenantMcpState } from \"./useTenantMcp\";\n\nexport interface McpServersSectionProps {\n state: TenantMcpState;\n theme?: DevicTheme;\n /** Filter typed in the modal's search box. */\n query?: string;\n}\n\n/** Message the OAuth callback page posts back when an MCP connection is done. */\ninterface McpCallbackMessage {\n source?: string;\n type?: string;\n status?: string;\n returnTo?: string;\n}\n\n/** A random value tying an OAuth round trip to the window that started it. */\nfunction newNonce(): string {\n const c = typeof crypto !== \"undefined\" ? crypto : undefined;\n if (c?.randomUUID) return c.randomUUID();\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n}\n\nfunction stateOf(server: TenantMcpServer): {\n key: \"connected\" | \"reconnect\" | \"disconnected\";\n label: string;\n} {\n const status = server.connection?.status;\n if (status === \"active\") return { key: \"connected\", label: \"Connected\" };\n if (status === \"error\") return { key: \"reconnect\", label: \"Needs attention\" };\n if (status === \"pending_auth\")\n return { key: \"reconnect\", label: \"Waiting for sign-in\" };\n return { key: \"disconnected\", label: \"Not connected\" };\n}\n\nfunction matches(server: TenantMcpServer, query: string): boolean {\n const q = query.trim().toLowerCase();\n if (!q) return true;\n return (\n server.name.toLowerCase().includes(q) ||\n server.url.toLowerCase().includes(q) ||\n (server.description ?? \"\").toLowerCase().includes(q)\n );\n}\n\n/** Identity of a row, stable whether or not it has been connected yet. */\nfunction keyOf(server: TenantMcpServer): string {\n return server.connection?.id ?? server.templateId ?? server.url;\n}\n\n/**\n * The MCP servers section of the connected-apps panel.\n *\n * The end user sees one list: the servers their developer left ready to\n * connect, the ones they added themselves, and — unless it was switched off —\n * a button to add another. Both routes open the same form, because the only\n * difference between them is who typed the url.\n *\n * Connecting opens a consent screen in a popup. The popup is opened empty\n * *before* the request that produces its URL, because browsers only honour\n * `window.open` inside the gesture that triggered it; opening it after the\n * round trip is what gets it blocked. Two endings are watched, not one — a\n * cancelled consent screen posts nothing back, so the close is watched too.\n */\nexport function McpServersSection({\n state,\n theme,\n query = \"\",\n}: McpServersSectionProps): JSX.Element | null {\n const { servers, allowCustom, limits, loading, client, scope, refresh } = state;\n\n const [actionError, setActionError] = useState<string | null>(null);\n const [busyKey, setBusyKey] = useState<string | null>(null);\n const [blockedUrl, setBlockedUrl] = useState<{ url: string } | null>(null);\n /** The row whose form is open. `null` inside the object is \"add your own\". */\n const [prompt, setPrompt] = useState<{\n server: TenantMcpServer | null;\n callbackUrl?: string;\n needsClientCredentials?: boolean;\n } | null>(null);\n const [formError, setFormError] = useState<string | null>(null);\n\n const pendingRef = useRef<{ returnTo: string } | null>(null);\n const popupRef = useRef<Window | null>(null);\n const pollRef = useRef<number | null>(null);\n\n const finish = useCallback(() => {\n if (pollRef.current !== null) {\n window.clearInterval(pollRef.current);\n pollRef.current = null;\n }\n pendingRef.current = null;\n popupRef.current = null;\n setBusyKey(null);\n void refresh();\n }, [refresh]);\n\n // The callback page says it is done. A nudge, never the result: what is shown\n // comes from re-reading the server, so a forged message costs one extra fetch\n // and nothing else.\n useEffect(() => {\n const onMessage = (event: MessageEvent) => {\n const data = event.data as McpCallbackMessage | undefined;\n if (!data || data.source !== \"devic\") return;\n if (data.type !== \"mcp-connected\") return;\n const pending = pendingRef.current;\n if (!pending || data.returnTo !== pending.returnTo) return;\n popupRef.current?.close();\n finish();\n };\n window.addEventListener(\"message\", onMessage);\n return () => window.removeEventListener(\"message\", onMessage);\n }, [finish]);\n\n useEffect(\n () => () => {\n if (pollRef.current !== null) window.clearInterval(pollRef.current);\n },\n []\n );\n\n const openPrompt = (server: TenantMcpServer | null) => {\n setFormError(null);\n setActionError(null);\n setBlockedUrl(null);\n setPrompt({ server });\n };\n\n const submit = async (values: {\n url?: string;\n name?: string;\n auth: TenantMcpAuthInput;\n }) => {\n if (!client || !prompt) return;\n const server = prompt.server;\n const rowKey = server ? keyOf(server) : \"new\";\n setBusyKey(rowKey);\n setFormError(null);\n\n const nonce = newNonce();\n const returnTo = `${window.location.origin}/?devic_mcp=${nonce}`;\n // Opened empty inside the submit gesture and navigated once the URL is\n // known. Skipped when no browser is involved at all.\n const popup =\n values.auth.mode === \"oauth\"\n ? window.open(\n \"\",\n \"devic-mcp-oauth\",\n \"width=520,height=680,menubar=no,toolbar=no\"\n )\n : null;\n\n try {\n const existing = server?.connection;\n const result: TenantMcpConnectResult = existing\n ? await client.reconnectMcpServer(existing.id, {\n ...scope,\n returnTo,\n auth: values.auth,\n })\n : await client.connectMcpServer({\n ...scope,\n returnTo,\n templateId: server?.templateId,\n url: values.url,\n name: values.name,\n auth: values.auth,\n });\n\n if (result.requiresClientCredentials) {\n // Not a failure the user can do nothing about: they own the server, so\n // the form reopens with the fields and the redirect URI to authorise.\n popup?.close();\n setBusyKey(null);\n setPrompt({\n server,\n callbackUrl: result.callbackUrl,\n needsClientCredentials: true,\n });\n setFormError(result.error ?? null);\n return;\n }\n\n if (result.status === \"error\") {\n popup?.close();\n setBusyKey(null);\n setFormError(result.error ?? \"The server could not be reached.\");\n return;\n }\n\n if (!result.authorizationUrl) {\n // Connected outright: the key the user typed is the credential.\n popup?.close();\n setPrompt(null);\n finish();\n return;\n }\n\n pendingRef.current = { returnTo };\n setPrompt(null);\n if (popup && !popup.closed) {\n popupRef.current = popup;\n popup.location.href = result.authorizationUrl;\n pollRef.current = window.setInterval(() => {\n if (popup.closed) finish();\n }, 700);\n } else {\n // Blocked (Safari, in-app browsers, extensions): hand over the URL.\n setBlockedUrl({ url: result.authorizationUrl });\n setBusyKey(null);\n }\n } catch (err) {\n popup?.close();\n pendingRef.current = null;\n setBusyKey(null);\n setFormError(err instanceof Error ? err.message : String(err));\n }\n };\n\n const disconnect = async (server: TenantMcpServer) => {\n const connection = server.connection;\n if (!client || !connection || busyKey) return;\n setBusyKey(keyOf(server));\n setActionError(null);\n try {\n await client.disconnectMcpServer(connection.id, scope);\n await refresh();\n } catch (err) {\n setActionError(err instanceof Error ? err.message : String(err));\n } finally {\n setBusyKey(null);\n }\n };\n\n const visible = servers.filter((s) => matches(s, query));\n const atLimit = limits.used >= limits.maxServers;\n\n // Nothing offered and nothing addable: the whole section would be a heading\n // over an empty box, which says less than saying nothing.\n if (!servers.length && !allowCustom) return null;\n\n return (\n <div className=\"devic-int-mcp-section\">\n <div className=\"devic-int-mcp-heading\">\n <h4>MCP servers</h4>\n <span>Connect a server and its tools become available in this chat.</span>\n </div>\n\n {actionError && <div className=\"devic-int-error\">{actionError}</div>}\n\n {blockedUrl && (\n <div className=\"devic-int-notice\">\n Your browser blocked the pop-up.{\" \"}\n <a\n href={blockedUrl.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={() => {\n pendingRef.current = null;\n setBlockedUrl(null);\n }}\n >\n Open the authorisation page\n </a>{\" \"}\n and come back — then use Refresh.\n </div>\n )}\n\n {visible.length > 0 && (\n <div className=\"devic-int-grid\">\n {visible.map((server) => {\n const cardState = stateOf(server);\n const rowKey = keyOf(server);\n const busy = busyKey === rowKey;\n const connection = server.connection;\n return (\n <div\n key={rowKey}\n className=\"devic-int-card\"\n data-state={cardState.key}\n >\n <div className=\"devic-int-card-head\">\n {server.logoUrl ? (\n <img\n className=\"devic-int-mcp-logo\"\n src={server.logoUrl}\n alt=\"\"\n aria-hidden=\"true\"\n />\n ) : (\n <span className=\"devic-int-mcp-logo devic-int-mcp-logo-fallback\">\n {server.name.slice(0, 1).toUpperCase()}\n </span>\n )}\n <span className=\"devic-int-state\">\n <span\n className=\"devic-int-dot\"\n data-ok={cardState.key === \"connected\"}\n data-off={cardState.key === \"disconnected\"}\n aria-hidden=\"true\"\n />\n {cardState.label}\n </span>\n </div>\n\n <div className=\"devic-int-name\" title={server.name}>\n {server.name}\n </div>\n\n <div\n className=\"devic-int-description\"\n title={server.description ?? server.url}\n >\n {server.description ?? server.url}\n </div>\n\n {connection?.shared && (\n // Worth saying before they wonder why they cannot remove it.\n <div className=\"devic-int-mcp-note\">\n Connected for everyone on this account\n </div>\n )}\n\n {connection?.status === \"active\" &&\n typeof connection.toolCount === \"number\" && (\n <div className=\"devic-int-mcp-note\">\n {connection.toolCount} tool\n {connection.toolCount === 1 ? \"\" : \"s\"} available\n </div>\n )}\n\n {connection?.lastProbeError && (\n <div\n className=\"devic-int-mcp-note devic-int-mcp-note-warn\"\n title={connection.lastProbeError}\n >\n {connection.lastProbeError}\n </div>\n )}\n\n <button\n type=\"button\"\n className={`devic-int-btn devic-int-btn-block${\n cardState.key === \"connected\" ? \"\" : \" devic-int-btn-primary\"\n }`}\n onClick={() => openPrompt(server)}\n disabled={\n busy ||\n !!busyKey ||\n connection?.readOnly ||\n (!connection && atLimit)\n }\n title={\n connection?.readOnly\n ? \"This server was connected for the whole account.\"\n : !connection && atLimit\n ? `You can have ${limits.maxServers} connected at a time.`\n : undefined\n }\n >\n {busy\n ? \"Waiting…\"\n : cardState.key === \"disconnected\"\n ? \"Connect\"\n : \"Reconnect\"}\n </button>\n\n {connection && !connection.readOnly && (\n <button\n type=\"button\"\n className=\"devic-int-btn devic-int-btn-block devic-int-mcp-remove\"\n onClick={() => void disconnect(server)}\n disabled={!!busyKey}\n >\n Disconnect\n </button>\n )}\n </div>\n );\n })}\n </div>\n )}\n\n {allowCustom && (\n <button\n type=\"button\"\n className=\"devic-int-btn devic-int-mcp-add\"\n onClick={() => openPrompt(null)}\n disabled={loading || !!busyKey || atLimit}\n title={\n atLimit\n ? `You can have ${limits.maxServers} MCP server${\n limits.maxServers === 1 ? \"\" : \"s\"\n } connected at a time.`\n : undefined\n }\n >\n + Add your own MCP\n </button>\n )}\n\n {prompt && (\n <McpConnectForm\n server={prompt.server}\n callbackUrl={prompt.callbackUrl}\n needsClientCredentials={prompt.needsClientCredentials}\n submitting={\n busyKey === (prompt.server ? keyOf(prompt.server) : \"new\")\n }\n error={formError}\n theme={theme}\n onCancel={() => {\n setPrompt(null);\n setFormError(null);\n }}\n onSubmit={submit}\n />\n )}\n </div>\n );\n}\n\nexport default McpServersSection;\n"],"names":["useState","useRef","useCallback","useEffect","_jsxs","_jsx","McpConnectForm"],"mappings":"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"}
@@ -0,0 +1,107 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+ var client = require('../../api/client.js');
5
+ require('react/jsx-runtime');
6
+ var DevicContext = require('../../provider/DevicContext.js');
7
+
8
+ /** A 4xx here means "not for you", not "something broke". */
9
+ function isRefusal(err) {
10
+ const status = err?.statusCode;
11
+ return typeof status === "number" && status >= 400 && status < 500;
12
+ }
13
+ const NO_LIMITS = { maxServers: 0, maxToolsPerServer: 0, used: 0 };
14
+ /**
15
+ * The MCP servers an assistant offers its tenants, together with the ones this
16
+ * tenant has connected — loaded once and shared.
17
+ *
18
+ * Deliberately a sibling of `useIntegrations` rather than part of it: the two
19
+ * answer different endpoints, and folding them together would mean an assistant
20
+ * that offers only one of them pays for both on every open.
21
+ */
22
+ function useTenantMcp(options) {
23
+ const { assistantId, tenantId, subtenantId, apiKey, baseUrl, enabled = true } = options;
24
+ const context = DevicContext.useOptionalDevicContext();
25
+ const resolvedBaseUrl = baseUrl || context?.baseUrl || "https://api.devic.ai";
26
+ const resolvedTenantId = tenantId || context?.tenantId;
27
+ const resolvedSubtenantId = subtenantId || context?.subtenantId;
28
+ const resolvedApiKey = apiKey || context?.apiKey;
29
+ const resolvedTenantSession = context?.getTenantSession;
30
+ const onSessionExpired = context?.onSessionExpired;
31
+ const client$1 = React.useMemo(() => resolvedApiKey || resolvedTenantSession
32
+ ? new client.DevicApiClient({
33
+ apiKey: resolvedApiKey,
34
+ baseUrl: resolvedBaseUrl,
35
+ getTenantSession: resolvedTenantSession,
36
+ onSessionExpired,
37
+ })
38
+ : null, [resolvedApiKey, resolvedTenantSession, resolvedBaseUrl]);
39
+ const scope = React.useMemo(() => ({
40
+ assistantId,
41
+ tenantId: resolvedTenantId || undefined,
42
+ subtenantId: resolvedSubtenantId || undefined,
43
+ }), [assistantId, resolvedTenantId, resolvedSubtenantId]);
44
+ const [listing, setListing] = React.useState(null);
45
+ const [loading, setLoading] = React.useState(false);
46
+ const [error, setError] = React.useState(null);
47
+ const [settled, setSettled] = React.useState(false);
48
+ const refresh = React.useCallback(async () => {
49
+ if (!client$1) {
50
+ setError("No credentials configured");
51
+ setSettled(true);
52
+ return;
53
+ }
54
+ setLoading(true);
55
+ setError(null);
56
+ try {
57
+ setListing(await client$1.getMcpServers(scope));
58
+ }
59
+ catch (err) {
60
+ setListing(null);
61
+ setError(err instanceof Error ? err.message : String(err));
62
+ if (!isRefusal(err)) {
63
+ // A refusal is an ordinary answer — a disabled feature, a missing
64
+ // tenant — and stays quiet. A 500 is not, and swallowing it would
65
+ // leave an integrator with a panel that never appears and no reason.
66
+ console.warn("[devic-ui] could not load MCP servers", err);
67
+ }
68
+ }
69
+ finally {
70
+ setLoading(false);
71
+ setSettled(true);
72
+ }
73
+ }, [client$1, scope]);
74
+ // Once per scope, not once per render of whatever switched it on. A different
75
+ // tenant is a different listing, and the previous one is dropped first:
76
+ // showing it while the new one arrives would name servers that are not this
77
+ // user's.
78
+ const key = `${client$1 ? "k" : "-"}|${scope.assistantId}|${scope.tenantId ?? ""}|${scope.subtenantId ?? ""}`;
79
+ const loadedKeyRef = React.useRef(null);
80
+ React.useEffect(() => {
81
+ if (!enabled || loadedKeyRef.current === key)
82
+ return;
83
+ if (loadedKeyRef.current !== null) {
84
+ setListing(null);
85
+ setSettled(false);
86
+ }
87
+ loadedKeyRef.current = key;
88
+ void refresh();
89
+ }, [enabled, key, refresh]);
90
+ return {
91
+ servers: listing?.servers ?? [],
92
+ loading,
93
+ error,
94
+ // Offered only once the server has said so. Anything hanging off this stays
95
+ // hidden until then, so nothing appears and then disappears.
96
+ offered: !!listing?.offered,
97
+ allowCustom: !!listing?.allowCustom,
98
+ limits: listing?.limits ?? NO_LIMITS,
99
+ settled,
100
+ refresh,
101
+ client: client$1,
102
+ scope,
103
+ };
104
+ }
105
+
106
+ exports.useTenantMcp = useTenantMcp;
107
+ //# sourceMappingURL=useTenantMcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTenantMcp.js","sources":["../../../../../src/components/IntegrationsModal/useTenantMcp.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { DevicApiError } from \"../../api/client\";\nimport { DevicApiClient } from \"../../api/client\";\nimport type { TenantMcpListing, TenantMcpServer } from \"../../api/types\";\nimport { useOptionalDevicContext } from \"../../provider\";\nimport type { IntegrationsScope } from \"./useIntegrations\";\n\nexport interface UseTenantMcpOptions extends IntegrationsScope {\n apiKey?: string;\n baseUrl?: string;\n /**\n * Fetch when this turns true, and only then. The modal passes its own open\n * state, so a panel nobody opens costs no request at all.\n */\n enabled?: boolean;\n}\n\nexport interface TenantMcpState {\n servers: TenantMcpServer[];\n loading: boolean;\n error: string | null;\n /** Whether this assistant offers MCP servers to its tenants at all. */\n offered: boolean;\n /** Whether the end user may add a server of their own. */\n allowCustom: boolean;\n limits: { maxServers: number; maxToolsPerServer: number; used: number };\n /** True once a first answer (or refusal) has arrived. */\n settled: boolean;\n refresh: () => Promise<void>;\n client: DevicApiClient | null;\n scope: IntegrationsScope;\n}\n\n/** A 4xx here means \"not for you\", not \"something broke\". */\nfunction isRefusal(err: unknown): boolean {\n const status = (err as DevicApiError)?.statusCode;\n return typeof status === \"number\" && status >= 400 && status < 500;\n}\n\nconst NO_LIMITS = { maxServers: 0, maxToolsPerServer: 0, used: 0 };\n\n/**\n * The MCP servers an assistant offers its tenants, together with the ones this\n * tenant has connected — loaded once and shared.\n *\n * Deliberately a sibling of `useIntegrations` rather than part of it: the two\n * answer different endpoints, and folding them together would mean an assistant\n * that offers only one of them pays for both on every open.\n */\nexport function useTenantMcp(options: UseTenantMcpOptions): TenantMcpState {\n const { assistantId, tenantId, subtenantId, apiKey, baseUrl, enabled = true } =\n options;\n\n const context = useOptionalDevicContext();\n const resolvedBaseUrl = baseUrl || context?.baseUrl || \"https://api.devic.ai\";\n const resolvedTenantId = tenantId || context?.tenantId;\n const resolvedSubtenantId = subtenantId || context?.subtenantId;\n const resolvedApiKey = apiKey || context?.apiKey;\n const resolvedTenantSession = context?.getTenantSession;\n const onSessionExpired = context?.onSessionExpired;\n\n const client = useMemo(\n () =>\n resolvedApiKey || resolvedTenantSession\n ? new DevicApiClient({\n apiKey: resolvedApiKey,\n baseUrl: resolvedBaseUrl,\n getTenantSession: resolvedTenantSession,\n onSessionExpired,\n })\n : null,\n [resolvedApiKey, resolvedTenantSession, resolvedBaseUrl]\n );\n\n const scope = useMemo(\n () => ({\n assistantId,\n tenantId: resolvedTenantId || undefined,\n subtenantId: resolvedSubtenantId || undefined,\n }),\n [assistantId, resolvedTenantId, resolvedSubtenantId]\n );\n\n const [listing, setListing] = useState<TenantMcpListing | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [settled, setSettled] = useState(false);\n\n const refresh = useCallback(async () => {\n if (!client) {\n setError(\"No credentials configured\");\n setSettled(true);\n return;\n }\n setLoading(true);\n setError(null);\n try {\n setListing(await client.getMcpServers(scope));\n } catch (err) {\n setListing(null);\n setError(err instanceof Error ? err.message : String(err));\n if (!isRefusal(err)) {\n // A refusal is an ordinary answer — a disabled feature, a missing\n // tenant — and stays quiet. A 500 is not, and swallowing it would\n // leave an integrator with a panel that never appears and no reason.\n console.warn(\"[devic-ui] could not load MCP servers\", err);\n }\n } finally {\n setLoading(false);\n setSettled(true);\n }\n }, [client, scope]);\n\n // Once per scope, not once per render of whatever switched it on. A different\n // tenant is a different listing, and the previous one is dropped first:\n // showing it while the new one arrives would name servers that are not this\n // user's.\n const key = `${client ? \"k\" : \"-\"}|${scope.assistantId}|${scope.tenantId ?? \"\"}|${scope.subtenantId ?? \"\"}`;\n const loadedKeyRef = useRef<string | null>(null);\n useEffect(() => {\n if (!enabled || loadedKeyRef.current === key) return;\n if (loadedKeyRef.current !== null) {\n setListing(null);\n setSettled(false);\n }\n loadedKeyRef.current = key;\n void refresh();\n }, [enabled, key, refresh]);\n\n return {\n servers: listing?.servers ?? [],\n loading,\n error,\n // Offered only once the server has said so. Anything hanging off this stays\n // hidden until then, so nothing appears and then disappears.\n offered: !!listing?.offered,\n allowCustom: !!listing?.allowCustom,\n limits: listing?.limits ?? NO_LIMITS,\n settled,\n refresh,\n client,\n scope,\n };\n}\n"],"names":["useOptionalDevicContext","client","useMemo","DevicApiClient","useState","useCallback","useRef","useEffect"],"mappings":"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"}
package/dist/cjs/index.js CHANGED
@@ -20,6 +20,9 @@ require('react/jsx-runtime');
20
20
  require('react');
21
21
  var IntegrationLogo = require('./components/IntegrationsModal/IntegrationLogo.js');
22
22
  var useIntegrations = require('./components/IntegrationsModal/useIntegrations.js');
23
+ var McpServersSection = require('./components/IntegrationsModal/McpServersSection.js');
24
+ var McpConnectForm = require('./components/IntegrationsModal/McpConnectForm.js');
25
+ var useTenantMcp = require('./components/IntegrationsModal/useTenantMcp.js');
23
26
  var assistantInfo = require('./api/assistantInfo.js');
24
27
  var sharedSession = require('./provider/sharedSession.js');
25
28
  var theme = require('./components/theme.js');
@@ -63,6 +66,9 @@ exports.IntegrationsLauncher = IntegrationsLauncher.IntegrationsLauncher;
63
66
  exports.IntegrationsHint = IntegrationsHint.IntegrationsHint;
64
67
  exports.IntegrationLogo = IntegrationLogo.IntegrationLogo;
65
68
  exports.useIntegrations = useIntegrations.useIntegrations;
69
+ exports.McpServersSection = McpServersSection.McpServersSection;
70
+ exports.McpConnectForm = McpConnectForm.McpConnectForm;
71
+ exports.useTenantMcp = useTenantMcp.useTenantMcp;
66
72
  exports.forgetAssistant = assistantInfo.forgetAssistant;
67
73
  exports.useAssistantInfo = assistantInfo.useAssistantInfo;
68
74
  exports.createSharedSession = sharedSession.createSharedSession;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1 +1 @@
1
- .devic-state-tag{align-items:center;border:1px solid;border-radius:4px;cursor:default;display:inline-flex;font-family:var(--devic-font-family,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif);font-size:12px;font-weight:500;gap:6px;line-height:20px;padding:2px 8px;position:relative;white-space:nowrap}.devic-state-tag[data-interactive=true]{cursor:pointer}.devic-state-tag[data-interactive=true]:hover{opacity:.85}.devic-state-tag[data-color=gold]{background:rgba(250,173,20,.15);border-color:rgba(250,173,20,.35);color:#faad14}.devic-state-tag[data-color=processing]{background:rgba(22,119,255,.15);border-color:rgba(22,119,255,.35);color:#4096ff}.devic-state-tag[data-color=success]{background:rgba(82,196,26,.15);border-color:rgba(82,196,26,.35);color:#52c41a}.devic-state-tag[data-color=error]{background:rgba(255,77,79,.15);border-color:rgba(255,77,79,.35);color:#ff4d4f}.devic-state-tag[data-color=default]{background:hsla(0,0%,60%,.15);border-color:hsla(0,0%,60%,.35);color:#999}.devic-state-tag[data-color=purple]{background:rgba(114,46,209,.15);border-color:rgba(114,46,209,.35);color:#b37feb}.devic-state-tag[data-color=blue]{background:rgba(22,119,255,.15);border-color:rgba(22,119,255,.35);color:#4096ff}.devic-state-tag-icon{align-items:center;display:inline-flex;flex-shrink:0}.devic-state-tag-caret{align-items:center;display:inline-flex;margin-left:2px;transition:transform .2s ease}.devic-state-tag[data-dropdown-open=true] .devic-state-tag-caret{transform:rotate(180deg)}.devic-state-spinner{animation:devic-state-spin 1s linear infinite}@keyframes devic-state-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.devic-state-tooltip{background:rgba(0,0,0,.85);border-radius:6px;bottom:calc(100% + 8px);color:#fff;font-family:SFMono-Regular,Consolas,monospace;font-size:12px;font-weight:400;line-height:1.4;max-width:280px;padding:6px 10px;pointer-events:none;white-space:normal;z-index:1060}.devic-state-tooltip,.devic-state-tooltip:after{left:50%;position:absolute;transform:translateX(-50%)}.devic-state-tooltip:after{border:5px solid transparent;border-top-color:rgba(0,0,0,.85);content:"";top:100%}.devic-state-dropdown{animation:devic-dropdownSlide .15s ease-out;background:#fff;border:1px solid #e8e8e8;border-radius:8px;box-shadow:0 6px 16px rgba(0,0,0,.08),0 3px 6px rgba(0,0,0,.06);min-width:180px;padding:4px 0;position:absolute;right:0;top:calc(100% + 4px);z-index:1050}@keyframes devic-dropdownSlide{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.devic-state-dropdown-item{align-items:center;background:none;border:none;color:#333;cursor:pointer;display:flex;font-family:inherit;font-size:13px;gap:8px;padding:8px 12px;text-align:left;transition:background .15s;width:100%}.devic-state-dropdown-item:hover{background:#f5f5f5}.devic-state-dropdown-item-icon{align-items:center;display:flex;flex-shrink:0;justify-content:center;width:18px}.devic-state-tooltip-portal{background:rgba(0,0,0,.85);border-radius:6px;color:#fff;font-family:SFMono-Regular,Consolas,monospace;font-size:12px;font-weight:400;line-height:1.4;max-width:280px;padding:6px 10px;pointer-events:none;white-space:normal;z-index:99999}.devic-state-dropdown-portal{animation:devic-dropdownSlide .15s ease-out;background:#fff;border:1px solid #e8e8e8;border-radius:8px;box-shadow:0 6px 16px rgba(0,0,0,.08),0 3px 6px rgba(0,0,0,.06);min-width:180px;padding:4px 0;z-index:99999}.devic-state-modal-overlay{align-items:center;animation:devic-fadeIn .2s ease;background:rgba(0,0,0,.45);display:flex;inset:0;justify-content:center;position:fixed;z-index:1050}@keyframes devic-fadeIn{0%{opacity:0}to{opacity:1}}.devic-state-modal{animation:devic-modalSlide .2s ease-out;background:#fff;border-radius:8px;box-shadow:0 6px 16px rgba(0,0,0,.08);display:flex;flex-direction:column;max-height:80vh;max-width:520px;width:90%}@keyframes devic-modalSlide{0%{opacity:0;transform:translateY(-16px)}to{opacity:1;transform:translateY(0)}}.devic-state-modal-header{align-items:center;border-bottom:1px solid #f0f0f0;display:flex;justify-content:space-between;padding:16px 20px}.devic-state-modal-title{align-items:center;display:flex;font-size:16px;font-weight:600;gap:8px;margin:0}.devic-state-modal-close{align-items:center;background:none;border:none;border-radius:4px;color:#999;cursor:pointer;display:flex;padding:4px}.devic-state-modal-close:hover{background:#f5f5f5;color:#333}.devic-state-modal-body{flex:1;overflow-y:auto;padding:20px}.devic-state-modal-footer{border-top:1px solid #f0f0f0;display:flex;gap:8px;justify-content:flex-end;padding:12px 20px}.devic-state-btn{align-items:center;background:#fff;border:1px solid #d9d9d9;border-radius:6px;color:#333;cursor:pointer;display:inline-flex;font-family:inherit;font-size:14px;font-weight:500;gap:6px;justify-content:center;padding:6px 16px;transition:all .2s}.devic-state-btn:hover{border-color:#1677ff;color:#1677ff}.devic-state-btn-primary{background:#1677ff;border-color:#1677ff;color:#fff}.devic-state-btn-primary:hover{background:#4096ff;border-color:#4096ff;color:#fff}.devic-state-btn-danger{background:#ff4d4f;border-color:#ff4d4f;color:#fff}.devic-state-btn-danger:hover{background:#ff7875;border-color:#ff7875;color:#fff}.devic-state-btn-success{background:#52c41a;border-color:#52c41a;color:#fff}.devic-state-btn-success:hover{background:#73d13d;border-color:#73d13d;color:#fff}.devic-state-btn:disabled{cursor:not-allowed;opacity:.5}.devic-explain-content{border:1px solid #e8e8e8;border-radius:8px;font-family:SFMono-Regular,Consolas,monospace;font-size:13px;line-height:1.6;max-height:300px;min-height:150px;overflow-y:auto;padding:12px;white-space:pre-wrap}.devic-typing-cursor{animation:devic-blink 1s step-end infinite}@keyframes devic-blink{0%,to{opacity:1}50%{opacity:0}}.devic-approval-layout{display:flex;gap:16px}.devic-approval-request{background:#fafafa;border:1px solid #e8e8e8;border-radius:8px;flex:1;font-size:13px;line-height:1.6;max-height:250px;overflow-y:auto;padding:12px}.devic-approval-actions{display:flex;flex:1;flex-direction:column;gap:12px}.devic-approval-textarea{border:1px solid #d9d9d9;border-radius:6px;box-sizing:border-box;font-family:inherit;font-size:13px;min-height:80px;outline:none;padding:8px 12px;resize:vertical;width:100%}.devic-approval-textarea:focus{border-color:#1677ff}.devic-approval-buttons{display:flex;flex-direction:column;gap:8px}.devic-completion-select{background:#fff;border:1px solid #d9d9d9;border-radius:6px;cursor:pointer;font-family:inherit;font-size:14px;outline:none;padding:8px 12px;width:100%}.devic-completion-select:focus{border-color:#1677ff}.devic-state-loading{align-items:center;display:flex;justify-content:center;padding:24px}.devic-state-loading-spinner{animation:devic-state-spin .8s linear infinite;border:2px solid #f0f0f0;border-radius:50%;border-top-color:#1677ff;height:24px;width:24px}.devic-state-warning{align-items:flex-start;color:#cf1322;display:flex;font-size:13px;font-weight:500;gap:6px;margin-top:8px}.devic-message-actions{align-items:center;display:flex;gap:4px;opacity:0;transition:opacity .15s ease}.devic-message-actions:focus-within,.devic-message:hover .devic-message-actions{opacity:1}.devic-message-actions:has(.devic-action-btn--active){opacity:1}.devic-action-btn{align-items:center;background:transparent;border:none;border-radius:var(--devic-radius-sm,6px);color:var(--devic-text-muted,#94a3b8);cursor:pointer;display:flex;height:28px;justify-content:center;padding:0;transition:all .15s ease;width:28px}.devic-action-btn:hover:not(:disabled){background:var(--devic-bg-secondary,#f8fafc);color:var(--devic-text-secondary,#64748b)}.devic-action-btn:disabled{cursor:not-allowed;opacity:.5}.devic-action-btn--active{color:var(--devic-primary,#3b82f6)}.devic-action-btn--active.devic-action-btn--positive{color:#22c55e}.devic-action-btn--active.devic-action-btn--negative{color:#ef4444}.devic-feedback-overlay{align-items:center;animation:devic-feedback-fade-in .15s ease;background:rgba(0,0,0,.4);bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:10001}@keyframes devic-feedback-fade-in{0%{opacity:0}to{opacity:1}}.devic-feedback-modal{animation:devic-feedback-slide-up .2s ease;background:var(--devic-bg,#fff);border-radius:var(--devic-radius,12px);box-shadow:0 20px 60px rgba(0,0,0,.2);margin:16px;max-width:400px;width:100%}@keyframes devic-feedback-slide-up{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.devic-feedback-modal-header{align-items:center;border-bottom:1px solid var(--devic-border,#e2e8f0);display:flex;gap:10px;padding:16px 16px 12px}.devic-feedback-modal-icon{align-items:center;background:var(--devic-bg-secondary,#f8fafc);border-radius:8px;color:var(--devic-text,#1e293b);display:flex;height:32px;justify-content:center;width:32px}.devic-feedback-modal-title{color:var(--devic-text,#1e293b);flex:1;font-size:15px;font-weight:600}.devic-feedback-modal-close{align-items:center;background:transparent;border:none;border-radius:6px;color:var(--devic-text-muted,#94a3b8);cursor:pointer;display:flex;height:28px;justify-content:center;padding:0;transition:all .15s ease;width:28px}.devic-feedback-modal-close:hover{background:var(--devic-bg-secondary,#f8fafc);color:var(--devic-text-secondary,#64748b)}.devic-feedback-textarea{background:transparent;border:none;border-bottom:1px solid var(--devic-border,#e2e8f0);box-sizing:border-box;color:var(--devic-text,#1e293b);display:block;font-family:inherit;font-size:14px;line-height:1.5;padding:12px 16px;resize:none;width:100%}.devic-feedback-textarea:focus{outline:none}.devic-feedback-textarea::placeholder{color:var(--devic-text-muted,#94a3b8)}.devic-feedback-modal-actions{display:flex;gap:8px;justify-content:flex-end;padding:12px 16px}.devic-feedback-btn{border:none;border-radius:var(--devic-radius-sm,6px);cursor:pointer;font-family:inherit;font-size:14px;font-weight:500;padding:8px 16px;transition:all .15s ease}.devic-feedback-btn:disabled{cursor:not-allowed;opacity:.6}.devic-feedback-btn--secondary{background:var(--devic-bg-secondary,#f8fafc);color:var(--devic-text-secondary,#64748b)}.devic-feedback-btn--secondary:hover:not(:disabled){background:var(--devic-border,#e2e8f0)}.devic-feedback-btn--primary{background:var(--devic-primary,#3b82f6);color:#fff}.devic-feedback-btn--primary:hover:not(:disabled){background:var(--devic-primary-hover,#2563eb)}.devic-cmd-result-actions{border-top:1px solid var(--devic-cmd-border,var(--devic-border,#e5e7eb));margin-top:8px;padding-top:8px}.devic-cmd-result-actions .devic-message-actions{opacity:1;padding-left:10px}.devic-cmd-result-actions .devic-action-btn{opacity:.7}.devic-cmd-result-actions .devic-action-btn--active,.devic-cmd-result-actions .devic-action-btn:hover{opacity:1}.devic-cm-overlay{align-items:center;background:rgba(0,0,0,.45);display:flex;inset:0;justify-content:center;position:fixed;z-index:10000}.devic-cm-modal{background:var(--devic-bg,#fff);border-radius:12px;box-shadow:0 12px 40px rgba(0,0,0,.22);color:var(--devic-text,#333);display:flex;flex-direction:column;font-size:13px;max-height:min(640px,calc(100vh - 64px));width:min(560px,calc(100vw - 32px))}.devic-cm-header{align-items:center;border-bottom:1px solid var(--devic-border,#e8e8e8);display:flex;justify-content:space-between;padding:14px 16px}.devic-cm-title{align-items:center;display:flex;font-size:15px;font-weight:600;gap:8px;margin:0}.devic-cm-title svg{color:var(--devic-recall-accent,#722ed1)}.devic-cm-close{background:transparent;border:none;border-radius:6px;color:var(--devic-text-muted,#999);cursor:pointer;font-size:20px;line-height:1;padding:2px 6px}.devic-cm-close:hover{background:var(--devic-bg-secondary,#f5f5f5);color:var(--devic-text,#333)}.devic-cm-body{display:flex;flex-direction:column;gap:12px;overflow-y:auto;padding:12px 16px}.devic-cm-error{background:rgba(255,77,79,.08);border:1px solid rgba(255,77,79,.4);border-radius:8px;color:#cf1322;font-size:12px;padding:8px 10px}.devic-cm-empty,.devic-cm-loading{color:var(--devic-text-muted,#999);padding:24px 8px;text-align:center}.devic-cm-section-title{color:var(--devic-text-muted,#999);font-size:10px;font-weight:700;letter-spacing:.6px;margin-bottom:6px;text-transform:uppercase}.devic-cm-entry{align-items:flex-start;border:1px solid var(--devic-border,#e8e8e8);border-radius:8px;display:flex;gap:8px;justify-content:space-between;margin-bottom:6px;padding:8px 10px}.devic-cm-entry-content{align-items:flex-start;display:flex;flex:1;gap:6px;white-space:pre-wrap;word-break:break-word}.devic-cm-pin{color:var(--devic-recall-accent,#722ed1);flex-shrink:0;margin-top:2px}.devic-cm-entry-actions{display:flex;flex-shrink:0;gap:4px}.devic-cm-editor{display:flex;flex:1;flex-direction:column;gap:6px}.devic-cm-textarea{background:var(--devic-bg,#fff);border:1px solid var(--devic-border,#d9d9d9);border-radius:8px;box-sizing:border-box;color:inherit;font:inherit;min-height:64px;padding:8px 10px;resize:vertical;width:100%}.devic-cm-textarea:focus{border-color:var(--devic-recall-accent,#722ed1);outline:none}.devic-cm-composer,.devic-cm-editor-actions{display:flex;gap:6px}.devic-cm-composer{flex-direction:column}.devic-cm-composer-row{display:flex;gap:6px}.devic-cm-select{color:inherit;padding:4px 8px}.devic-cm-btn,.devic-cm-select{background:var(--devic-bg,#fff);border:1px solid var(--devic-border,#d9d9d9);border-radius:6px;font:inherit}.devic-cm-btn{color:var(--devic-text,#333);cursor:pointer;font-size:12px;padding:5px 12px}.devic-cm-btn:hover:not(:disabled){border-color:var(--devic-recall-accent,#722ed1);color:var(--devic-recall-accent,#722ed1)}.devic-cm-btn:disabled{cursor:not-allowed;opacity:.5}.devic-cm-btn-primary{background:var(--devic-recall-accent,#722ed1);border-color:var(--devic-recall-accent,#722ed1);color:#fff}.devic-cm-btn-primary:hover:not(:disabled){color:#fff;opacity:.9}.devic-cm-btn-small{font-size:11px;padding:2px 8px}.devic-cm-btn-danger:hover:not(:disabled){border-color:#ff4d4f;color:#ff4d4f}.devic-cm-footer{border-top:1px solid var(--devic-border,#e8e8e8);color:var(--devic-text-muted,#999);font-size:11px;padding:10px 16px}.devic-int-overlay{align-items:center;background:rgba(0,0,0,.45);display:flex;inset:0;justify-content:center;position:fixed;z-index:10000}.devic-int-modal{background:var(--devic-bg,#fff);border-radius:12px;box-shadow:0 12px 40px rgba(0,0,0,.22);color:var(--devic-text,#333);display:flex;flex-direction:column;font-size:13px;max-height:min(660px,calc(100vh - 64px));width:min(620px,calc(100vw - 32px))}.devic-int-header{align-items:center;border-bottom:1px solid var(--devic-border,#e8e8e8);display:flex;justify-content:space-between;padding:14px 16px}.devic-int-title{align-items:center;display:flex;font-size:15px;font-weight:600;gap:8px;margin:0}.devic-int-title svg{color:var(--devic-primary,#1677ff)}.devic-int-close{background:transparent;border:none;border-radius:6px;color:var(--devic-text-muted,#999);cursor:pointer;font-size:20px;line-height:1;padding:2px 6px}.devic-int-close:hover{background:var(--devic-bg-secondary,#f5f5f5);color:var(--devic-text,#333)}.devic-int-search{align-items:center;background:var(--devic-bg-secondary,#f7f7f7);border:1px solid var(--devic-border,#e8e8e8);border-radius:8px;color:var(--devic-text-muted,#999);display:flex;gap:8px;margin:12px 16px 0;padding:7px 10px}.devic-int-search:focus-within{border-color:var(--devic-primary,#1677ff)}.devic-int-search input{-webkit-appearance:none;appearance:none;background:transparent;border:none;color:var(--devic-text,#333);flex:1;font:inherit;font-size:13px;min-width:0;outline:none}.devic-int-search input::-webkit-search-cancel-button{-webkit-appearance:none}.devic-int-search input::placeholder{color:var(--devic-text-muted,#999)}.devic-int-body{display:flex;flex-direction:column;gap:10px;overflow-y:auto;padding:12px 16px}.devic-int-error{background:rgba(255,77,79,.08);border:1px solid rgba(255,77,79,.4);border-radius:8px;color:#ff4d4f;font-size:12px;padding:8px 10px}.devic-int-notice{background:rgba(250,173,20,.1);border:1px solid rgba(250,173,20,.45);border-radius:8px;color:inherit;font-size:12px;padding:8px 10px}.devic-int-notice a{color:var(--devic-primary,#1677ff)}.devic-int-empty,.devic-int-loading{color:var(--devic-text-muted,#999);padding:24px 8px;text-align:center}.devic-int-grid{display:grid;gap:10px;grid-template-columns:repeat(auto-fill,minmax(158px,1fr))}.devic-int-card{border:1px solid var(--devic-border,#e8e8e8);border-radius:10px;display:flex;flex-direction:column;gap:6px;padding:12px}.devic-int-card[data-state=connected]{border-color:rgba(82,196,26,.45)}.devic-int-card[data-state=reconnect]{border-color:rgba(250,173,20,.5)}.devic-int-card-head{align-items:center;display:flex;gap:8px;justify-content:space-between}.devic-int-logo{background:var(--devic-bg-secondary,#f5f5f5);border-radius:8px;flex-shrink:0;height:32px;object-fit:contain;width:32px}.devic-int-logo-fallback{align-items:center;color:var(--devic-text-muted,#999);display:flex;font-weight:600;justify-content:center}.devic-int-name{font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.devic-int-state{align-items:center;color:var(--devic-text-muted,#999);display:inline-flex;font-size:11px;gap:4px;white-space:nowrap}.devic-int-card[data-state=connected] .devic-int-state{color:#52c41a}.devic-int-card[data-state=reconnect] .devic-int-state{color:#faad14}.devic-int-description{-webkit-line-clamp:2;-webkit-box-orient:vertical;color:var(--devic-text-muted,#999);display:-webkit-box;font-size:12px;line-height:1.4;overflow:hidden}.devic-int-accounts{display:flex;flex-direction:column;gap:4px;list-style:none;margin:0;padding:0}.devic-int-account{align-items:center;background:var(--devic-bg-secondary,#f7f7f7);border-radius:6px;display:flex;font-size:11px;gap:6px;padding:3px 6px}.devic-int-account-label{color:var(--devic-text-muted,#999);flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.devic-int-account-warn{color:#faad14}.devic-int-dot{background:#faad14;border-radius:50%;flex-shrink:0;height:6px;width:6px}.devic-int-dot[data-ok=true]{background:#52c41a}.devic-int-dot[data-off=true]{background:var(--devic-text-muted,#bbb)}.devic-int-unlink{background:transparent;border:none;border-radius:4px;color:var(--devic-text-muted,#999);cursor:pointer;flex-shrink:0;font-size:14px;line-height:1;padding:0 2px}.devic-int-unlink:hover:not(:disabled){color:#ff4d4f}.devic-int-unlink:disabled{cursor:not-allowed;opacity:.4}.devic-int-btn{background:var(--devic-bg,#fff);border:1px solid var(--devic-border,#d9d9d9);border-radius:6px;color:var(--devic-text,#333);cursor:pointer;flex-shrink:0;font:inherit;font-size:12px;padding:5px 12px}.devic-int-btn:hover:not(:disabled){border-color:var(--devic-primary,#1677ff);color:var(--devic-primary,#1677ff)}.devic-int-btn:disabled{cursor:not-allowed;opacity:.5}.devic-int-btn-block{margin-top:auto;text-align:center;width:100%}.devic-int-btn-primary{background:var(--devic-primary,#1677ff);border-color:var(--devic-primary,#1677ff);color:#fff}.devic-int-btn-primary:hover:not(:disabled){color:#fff;opacity:.9}.devic-int-btn-small{font-size:11px;padding:2px 8px}.devic-int-overlay-stacked{background:rgba(0,0,0,.5);z-index:10001}.devic-int-connect-dialog{background:var(--devic-bg,#fff);border-radius:12px;box-shadow:0 12px 40px rgba(0,0,0,.3);color:var(--devic-text,#333);display:flex;flex-direction:column;font-size:13px;max-height:calc(100vh - 64px);width:min(440px,calc(100vw - 32px))}.devic-int-connect-header{align-items:flex-start;border-bottom:1px solid var(--devic-border,#e8e8e8);display:flex;gap:10px;padding:14px 16px}.devic-int-connect-heading{display:flex;flex:1;flex-direction:column;gap:2px;min-width:0}.devic-int-connect-heading strong{font-size:14px}.devic-int-connect-heading span{color:var(--devic-text-muted,#999);font-size:11px;line-height:1.4}.devic-int-connect-body{display:flex;flex-direction:column;gap:14px;overflow-y:auto;padding:16px}.devic-int-connect-field{display:flex;flex-direction:column;gap:5px}.devic-int-connect-label{color:var(--devic-text,#333);font-size:12px;font-weight:500}.devic-int-connect-label em{color:var(--devic-text-muted,#999);font-style:normal;font-weight:400}.devic-int-connect-field input,.devic-int-connect-field select{background:var(--devic-bg-secondary,#fafafa);border:1px solid var(--devic-border,#d9d9d9);border-radius:8px;box-sizing:border-box;color:var(--devic-text,#333);font:inherit;font-size:13px;height:36px;line-height:normal;padding:0 10px;transition:border-color .15s,box-shadow .15s;width:100%}.devic-int-connect-field input::placeholder{color:var(--devic-text-muted,#bbb)}.devic-int-connect-field input:focus,.devic-int-connect-field select:focus{border-color:var(--devic-primary,#1677ff);box-shadow:0 0 0 3px color-mix(in srgb,var(--devic-primary,#1677ff) 18%,transparent);outline:none}.devic-int-connect-field input[data-invalid]{border-color:#ff4d4f}.devic-int-connect-field input[data-invalid]:focus{box-shadow:0 0 0 3px rgba(255,77,79,.18)}.devic-int-connect-hint{color:var(--devic-text-muted,#999);font-size:11px;line-height:1.45}.devic-int-connect-guide{color:var(--devic-primary,#1677ff);font-size:12px}.devic-int-connect-actions{justify-content:flex-end;padding:12px 16px}.devic-int-connect-actions,.devic-int-footer{border-top:1px solid var(--devic-border,#e8e8e8);display:flex;gap:8px}.devic-int-footer{align-items:center;color:var(--devic-text-muted,#999);font-size:11px;justify-content:space-between;padding:10px 16px}.devic-int-launcher{align-items:center;background:none;border:none;border-radius:var(--devic-radius-sm,6px);cursor:pointer;display:inline-flex;padding:4px 5px;transition:background var(--devic-transition,.2s)}.devic-int-launcher:hover{background:var(--devic-bg-secondary,#f5f5f5)}.devic-int-launcher-item{align-items:center;background:var(--devic-bg,#fff);border:1px solid var(--devic-border,#e8e8e8);border-radius:6px;box-sizing:border-box;display:flex;flex-shrink:0;height:22px;justify-content:center;margin-left:-4px;overflow:hidden;width:22px}.devic-int-launcher-item:first-child{margin-left:0}.devic-int-launcher-item[data-connected=false]{opacity:.55}.devic-int-logo.devic-int-launcher-logo{background:transparent;border-radius:3px;font-size:11px;height:16px;width:16px}.devic-int-launcher-more{background:var(--devic-bg-secondary,#f0f0f0);color:var(--devic-text-muted,#999);font-size:10px;font-weight:600}.devic-int-launcher-loading{cursor:default}.devic-int-launcher-loading:hover{background:none}.devic-int-launcher-skeleton{animation:devic-int-pulse 1.4s ease-in-out infinite;background:var(--devic-bg-secondary,#f0f0f0)}.devic-int-launcher-skeleton:nth-child(2){animation-delay:.16s}.devic-int-launcher-skeleton:nth-child(3){animation-delay:.32s}.devic-int-launcher-skeleton:nth-child(n+4){animation-delay:.48s}@keyframes devic-int-pulse{0%,to{opacity:.35}50%{opacity:.75}}@media (prefers-reduced-motion:reduce){.devic-int-launcher-skeleton{animation:none;opacity:.5}}.devic-int-launcher[data-dark=true] .devic-int-launcher-item{background:hsla(0,0%,100%,.92);border-color:hsla(0,0%,100%,.16)}.devic-int-launcher[data-dark=true] .devic-int-launcher-more{background:var(--devic-bg-secondary,#f0f0f0);border-color:var(--devic-border,#e8e8e8)}.devic-int-overlay[data-dark=true] .devic-int-card .devic-int-logo{background:hsla(0,0%,100%,.92)}.devic-int-overlay[data-dark=true] .devic-int-card .devic-int-logo-fallback{color:#595959}.devic-int-hint{align-items:center;background:var(--devic-bg-secondary,#f7f7f7);border:1px solid var(--devic-border,#e8e8e8);border-radius:12px;display:flex;gap:4px;margin:0 0 8px;padding:6px 8px 6px 12px;transition:opacity .2s ease,transform .2s ease}.devic-int-hint[data-leaving=true]{opacity:0;pointer-events:none;transform:translateY(-4px)}.devic-int-hint-main{align-items:center;background:none;border:none;border-radius:8px;color:inherit;cursor:pointer;display:flex;flex:1;font:inherit;gap:10px;justify-content:space-between;min-width:0;padding:2px}.devic-int-hint-label{color:var(--devic-text-muted,#8c8c8c);font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.devic-int-hint-main:hover .devic-int-hint-label{color:var(--devic-text,#333)}.devic-int-hint-logos{gap:6px}.devic-int-hint-item,.devic-int-hint-logos{align-items:center;display:flex;flex-shrink:0}.devic-int-hint-item{background:var(--devic-bg,#fff);border:1px solid var(--devic-border,#e8e8e8);border-radius:6px;box-sizing:border-box;height:24px;justify-content:center;overflow:hidden;width:24px}.devic-int-hint-item[data-connected=false]{opacity:.6}.devic-int-logo.devic-int-hint-logo{background:transparent;border-radius:3px;font-size:11px;height:17px;width:17px}.devic-int-hint-more{background:var(--devic-bg-secondary,#f0f0f0);color:var(--devic-text-muted,#999);font-size:10px;font-weight:600}.devic-int-hint-close{background:transparent;border:none;border-radius:6px;color:var(--devic-text-muted,#999);cursor:pointer;flex-shrink:0;font-size:18px;line-height:1;padding:2px 6px}.devic-int-hint-close:hover{background:var(--devic-bg,#fff);color:var(--devic-text,#333)}.devic-int-hint[data-dark=true] .devic-int-hint-item{background:hsla(0,0%,100%,.92);border-color:hsla(0,0%,100%,.16)}.devic-int-hint[data-dark=true] .devic-int-hint-more{background:var(--devic-bg,#1f1f1f);border-color:var(--devic-border,#303030)}.devic-int-hint-ghost{align-items:center;display:flex;gap:6px;pointer-events:none;position:fixed;z-index:10001}.devic-int-toggle{display:inline-flex;flex-shrink:0;position:relative}.devic-int-toggle-btn{position:relative}.devic-int-toggle-badge{background:var(--devic-primary,#1677ff);border-radius:7px;box-sizing:border-box;color:#fff;font-size:9px;font-weight:600;height:14px;line-height:14px;min-width:14px;padding:0 3px;position:absolute;right:-2px;text-align:center;top:-2px}.devic-int-toggle-popover{background:var(--devic-bg,#fff);border:1px solid var(--devic-border,#e8e8e8);border-radius:var(--devic-radius,10px);bottom:calc(100% + 8px);box-shadow:0 8px 24px rgba(0,0,0,.14);box-sizing:border-box;color:var(--devic-text,#333);left:0;max-height:320px;overflow-y:auto;padding:10px;position:absolute;width:260px;z-index:10002}.devic-int-toggle-head{border-bottom:1px solid var(--devic-border,#e8e8e8);display:flex;flex-direction:column;gap:2px;margin-bottom:6px;padding:2px 2px 8px}.devic-int-toggle-head strong{font-size:13px}.devic-int-toggle-head span{color:var(--devic-text-muted,#999);font-size:11px;line-height:1.4}.devic-int-toggle-list{list-style:none;margin:0;padding:0}.devic-int-toggle-row{align-items:center;border-radius:var(--devic-radius-sm,6px);cursor:pointer;display:flex;gap:8px;justify-content:space-between;padding:6px 4px}.devic-int-toggle-row:hover{background:var(--devic-bg-secondary,#f5f5f5)}.devic-int-toggle-app{align-items:center;display:flex;gap:8px;min-width:0}.devic-int-toggle-app .devic-int-logo{border-radius:4px;flex-shrink:0;height:18px;object-fit:contain;width:18px}.devic-int-toggle-name{font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.devic-int-toggle-switch{appearance:none;-webkit-appearance:none;background:var(--devic-border,#d9d9d9);border-radius:9px;cursor:pointer;flex-shrink:0;height:18px;margin:0;position:relative;transition:background var(--devic-transition,.2s);width:32px}.devic-int-toggle-switch:after{background:#fff;border-radius:50%;content:"";height:14px;left:2px;position:absolute;top:2px;transition:transform var(--devic-transition,.2s);width:14px}.devic-int-toggle-switch:checked{background:var(--devic-primary,#1677ff)}.devic-int-toggle-switch:checked:after{transform:translateX(14px)}.devic-int-toggle-switch:focus-visible{outline:2px solid var(--devic-primary,#1677ff);outline-offset:2px}.devic-int-toggle-manage{background:none;border:none;border-radius:0 0 var(--devic-radius-sm,6px) var(--devic-radius-sm,6px);border-top:1px solid var(--devic-border,#e8e8e8);color:var(--devic-primary,#1677ff);cursor:pointer;font:inherit;font-size:12px;margin-top:6px;padding:6px;width:100%}.devic-int-toggle-manage:hover{background:var(--devic-bg-secondary,#f5f5f5)}.devic-int-toggle[data-dark=true] .devic-int-toggle-popover{box-shadow:0 8px 24px rgba(0,0,0,.45)}.devic-int-toggle[data-dark=true] .devic-int-toggle-switch:not(:checked){background:var(--devic-border,#434343)}.devic-chat-drawer{--devic-primary:#1890ff;--devic-primary-hover:#40a9ff;--devic-primary-light:#e6f7ff;--devic-bg:#fff;--devic-bg-secondary:#f5f5f5;--devic-text:#333;--devic-text-secondary:#666;--devic-text-muted:#999;--devic-border:#e8e8e8;--devic-shadow:0 4px 12px rgba(0,0,0,.15);--devic-radius:8px;--devic-radius-sm:4px;--devic-radius-lg:16px;--devic-font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;--devic-transition:0.3s ease;background:var(--devic-bg);bottom:0;box-shadow:var(--devic-shadow);color:var(--devic-text);display:flex;flex-direction:column;font-family:var(--devic-font-family);font-size:14px;line-height:1.5;position:fixed;top:0;transition:transform var(--devic-transition)}.devic-chat-drawer[data-position=right]{right:0;transform:translateX(100%)}.devic-chat-drawer[data-position=left]{left:0;transform:translateX(-100%)}.devic-chat-drawer[data-open=true]{transform:translateX(0)}.devic-drawer-overlay{background:rgba(0,0,0,.3);inset:0;opacity:0;position:fixed;transition:opacity var(--devic-transition),visibility var(--devic-transition);visibility:hidden}.devic-drawer-overlay[data-open=true]{opacity:1;visibility:visible}.devic-drawer-header{align-items:center;border-bottom:1px solid var(--devic-border);display:flex;flex-shrink:0;justify-content:space-between;padding:16px}.devic-drawer-avatar{border-radius:50%;flex-shrink:0;height:28px;object-fit:cover;width:28px}.devic-drawer-title{flex-shrink:1;font-size:16px;font-weight:600;margin:0;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.devic-drawer-close{background:none;border:none;border-radius:var(--devic-radius-sm);color:var(--devic-text-secondary);cursor:pointer;padding:8px;transition:background var(--devic-transition),color var(--devic-transition)}.devic-drawer-close:hover{background:var(--devic-bg-secondary);color:var(--devic-text)}.devic-messages-container{display:flex;flex:1;flex-direction:column;gap:12px;overflow-y:auto;padding:16px}.devic-welcome{color:var(--devic-text-secondary);padding:24px 16px;text-align:center}.devic-welcome-text{font-size:16px;margin-bottom:16px}.devic-suggested-messages{display:flex;flex-wrap:wrap;gap:8px;justify-content:center}.devic-suggested-btn{background:var(--devic-bg);border:1px solid var(--devic-border);border-radius:var(--devic-radius-lg);color:var(--devic-text);cursor:pointer;font-size:13px;padding:8px 16px;transition:border-color var(--devic-transition),background var(--devic-transition)}.devic-suggested-btn:hover{background:var(--devic-primary-light);border-color:var(--devic-primary)}.devic-message{display:flex;flex-direction:column;max-width:85%}.devic-message[data-role=user]{align-self:flex-end}.devic-message[data-role=assistant],.devic-message[data-role=tool]{align-self:flex-start}.devic-message-bubble{word-wrap:break-word;border-radius:var(--devic-radius);padding:10px 14px}.devic-message[data-role=user] .devic-message-bubble{background:var(--devic-user-bubble,var(--devic-primary));border-bottom-right-radius:var(--devic-radius-sm);color:var(--devic-user-bubble-text,#fff)}.devic-message[data-role=assistant] .devic-message-bubble{background:var(--devic-assistant-bubble,var(--devic-bg-secondary));border-bottom-left-radius:var(--devic-radius-sm);color:var(--devic-assistant-bubble-text,var(--devic-text))}.devic-message[data-role=tool] .devic-message-bubble{background:var(--devic-primary-light);border:1px solid var(--devic-primary);color:var(--devic-text);font-size:12px}.devic-message-footer{align-items:center;display:flex;gap:8px;justify-content:space-between;margin-top:4px}.devic-message-time{color:var(--devic-text-muted);font-size:11px}.devic-message[data-role=user] .devic-message-footer{justify-content:flex-end}.devic-message[data-role=user] .devic-message-time{text-align:right}.devic-message-files{display:flex;flex-wrap:wrap;gap:8px;margin-top:8px}.devic-message-file{align-items:center;background:hsla(0,0%,100%,.2);border-radius:var(--devic-radius-sm);display:flex;font-size:12px;gap:6px;padding:6px 10px}.devic-recall{align-self:flex-start;background:var(--devic-recall-bg,rgba(114,46,209,.06));border:1px solid var(--devic-recall-border,rgba(114,46,209,.3));border-radius:var(--devic-radius-sm,8px);color:var(--devic-text-secondary);flex-shrink:0;font-size:12px;margin:2px 0 8px;max-width:88%;overflow:hidden}.devic-recall-header{align-items:center;background:transparent;border:none;color:inherit;cursor:pointer;display:flex;font:inherit;gap:6px;padding:6px 10px;text-align:left;width:100%}.devic-recall-icon{color:var(--devic-recall-accent,#722ed1);flex-shrink:0}.devic-recall-title{color:var(--devic-text);font-weight:600;white-space:nowrap}.devic-recall-summary{opacity:.75;white-space:nowrap}.devic-recall-spacer{flex:1}.devic-recall-source{border:1px solid var(--devic-recall-border,rgba(114,46,209,.3));border-radius:4px;color:var(--devic-recall-accent,#722ed1);font-size:10px;line-height:16px;padding:0 6px;white-space:nowrap}.devic-recall-chevron{flex-shrink:0;opacity:.6;transition:transform .15s ease}.devic-recall-body{display:flex;flex-direction:column;gap:8px;padding:2px 10px 10px}.devic-recall-facts{display:flex;flex-direction:column;gap:6px}.devic-recall-fact{color:var(--devic-text);display:flex;flex-direction:column;gap:2px}.devic-recall-fact-meta{color:var(--devic-text-muted);font-size:10px}.devic-recall-entities{display:flex;flex-wrap:wrap;gap:4px}.devic-recall-entity{background:var(--devic-bg);border:1px solid var(--devic-border,#d9d9d9);border-radius:4px;color:var(--devic-text-secondary);font-size:10px;line-height:18px;padding:0 6px}.devic-recall-entity-type{opacity:.55}.devic-recall-turns{display:flex;flex-direction:column;gap:3px}.devic-recall-turns-title{font-size:10px;font-weight:600;letter-spacing:.4px;opacity:.7;text-transform:uppercase}.devic-recall-turn{font-size:11px;opacity:.85}.devic-recall-turn-role{font-weight:600}.devic-loading{align-self:flex-start;display:flex;gap:4px;padding:10px 14px}.devic-loading-dot{animation:devic-bounce 1.4s ease-in-out infinite both;background:var(--devic-text-muted);border-radius:50%;height:8px;width:8px}.devic-loading-dot:first-child{animation-delay:-.32s}.devic-loading-dot:nth-child(2){animation-delay:-.16s}@keyframes devic-bounce{0%,80%,to{transform:scale(0)}40%{transform:scale(1)}}.devic-tool-group{align-self:flex-start;display:flex;flex-direction:column;gap:2px;max-width:85%}.devic-tool-activity{align-items:flex-start;animation:devic-slideUp .3s ease-out;display:flex;gap:8px;padding:4px 0}.devic-tool-activity-icon{align-items:center;color:var(--devic-text-muted);display:flex;flex-shrink:0;margin-top:1px}.devic-tool-activity--active .devic-tool-activity-icon{color:var(--devic-primary)}.devic-tool-activity-text{color:var(--devic-text-secondary);font-size:13px;line-height:1.4}.devic-glow-text{animation:devic-pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes devic-pulse{0%,to{opacity:1}50%{opacity:.5}}.devic-spinner{animation:devic-spin 1s linear infinite}@keyframes devic-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes devic-slideUp{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.devic-tool-collapse-btn{align-items:center;background:none;border:none;color:var(--devic-text-muted);cursor:pointer;display:flex;font-family:var(--devic-font-family);font-size:12px;gap:6px;padding:4px 0;transition:color .2s ease}.devic-tool-collapse-btn:hover{color:var(--devic-primary)}.devic-tool-group-items{animation:devic-expandItems .4s ease-out;overflow:hidden}.devic-tool-group-items[data-expanded=true]{max-height:500px}@keyframes devic-expandItems{0%{max-height:0;opacity:0}to{max-height:500px;opacity:1}}.devic-input-area{border-top:1px solid var(--devic-border);flex-shrink:0;padding:16px}.devic-input-wrapper{--devic-input-row-height:28px;--devic-input-line-height:20px;align-items:flex-end;background:var(--devic-bg-secondary);border-radius:var(--devic-radius);display:flex;gap:8px;padding:8px 12px}.devic-input{background:none;border:none;box-sizing:border-box;color:var(--devic-text);flex:1;font-family:inherit;font-size:14px;line-height:var(--devic-input-line-height);max-height:120px;min-height:var(--devic-input-row-height);outline:none;padding:calc((var(--devic-input-row-height) - var(--devic-input-line-height))/2) 0;resize:none}.devic-input::placeholder{color:var(--devic-text-muted)}.devic-input-btn{align-items:center;background:none;border:none;border-radius:var(--devic-radius-sm);box-sizing:border-box;color:var(--devic-text-secondary);cursor:pointer;display:inline-flex;flex-shrink:0;justify-content:center;min-height:var(--devic-input-row-height,28px);padding:4px;transition:color var(--devic-transition)}.devic-input-btn:hover:not(:disabled){color:var(--devic-primary)}.devic-input-btn:disabled{cursor:not-allowed;opacity:.5}.devic-send-btn{padding:4px 12px}.devic-send-btn,.devic-stop-btn{background:var(--devic-send-btn,var(--devic-primary));border-radius:var(--devic-radius-sm);color:#fff}.devic-stop-btn{min-width:var(--devic-input-row-height,28px);padding:4px}.devic-stop-btn:hover{background:var(--devic-primary-hover);color:#fff}.devic-send-btn-wrapper{flex-shrink:0;position:relative}.devic-send-btn-custom{align-items:center;display:flex;justify-content:center;pointer-events:none}.devic-send-btn-overlay{background:transparent;border:none;cursor:pointer;inset:0;margin:0;padding:0;position:absolute}.devic-send-btn-overlay:disabled{cursor:not-allowed;opacity:.5}.devic-send-btn:hover:not(:disabled){background:var(--devic-primary-hover);color:#fff}.devic-speech-error{background:#fff1f0;border:1px solid #ffccc7;border-radius:var(--devic-radius-sm);color:#cf1322;font-size:12px;margin-bottom:8px;padding:6px 10px}.devic-speech-mic.devic-input-btn:hover:not(:disabled){color:var(--devic-primary)}.devic-speech-mic-wrap{align-items:center;display:inline-flex;flex-shrink:0;justify-content:center;position:relative}.devic-speech-mic-wrap[data-holding=true] .devic-speech-mic{color:var(--devic-primary)}.devic-mic-hold-ring{height:calc(100% + 6px);inset:-3px;pointer-events:none;position:absolute;transform:rotate(-90deg);width:calc(100% + 6px)}.devic-mic-hold-ring-track{fill:none;stroke:var(--devic-primary);stroke-opacity:.18;stroke-width:3}.devic-mic-hold-ring-progress{fill:none;stroke:var(--devic-primary);stroke-width:3;stroke-linecap:round;transition:stroke-dashoffset 90ms linear}.devic-speech-panel{align-items:center;display:flex;flex:1;gap:8px;min-height:var(--devic-input-row-height,28px)}.devic-speech-live{align-items:center;display:flex;flex:1;gap:10px;justify-content:flex-start}.devic-speech-timer{color:var(--devic-text-secondary);font-size:13px;font-variant-numeric:tabular-nums}.devic-speech-confirm{color:#389e0d}.devic-speech-confirm.devic-input-btn:hover:not(:disabled){color:#237804}.devic-speech-confirm-wrap{align-items:center;display:inline-flex;flex-shrink:0;justify-content:center;position:relative}.devic-autostop-ring{height:calc(100% + 6px);inset:-3px;pointer-events:none;position:absolute;transform:rotate(-90deg);width:calc(100% + 6px)}.devic-autostop-ring-track{fill:none;stroke:#389e0d;stroke-opacity:.18;stroke-width:3}.devic-autostop-ring-progress{fill:none;stroke:#389e0d;stroke-width:3;stroke-linecap:round;transition:stroke-dashoffset 90ms linear}.devic-speech-confirm-wrap[data-autostop=true] .devic-speech-confirm{animation:devic-autostop-pulse 1s ease-in-out infinite}@keyframes devic-autostop-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.08)}}.devic-handoff-bar{align-items:center;background:var(--devic-primary-light,#e6f7ff);border-radius:8px;color:var(--devic-primary);display:flex;font-size:12px;gap:8px;margin-bottom:6px;padding:5px 8px}.devic-handoff-dot{animation:devic-handoff-blink 1.2s ease-in-out infinite;background:var(--devic-primary);border-radius:50%;flex-shrink:0;height:8px;width:8px}.devic-handoff-bar[data-waiting=true] .devic-handoff-dot{animation-duration:.7s}@keyframes devic-handoff-blink{0%,to{opacity:1;transform:scale(1)}50%{opacity:.35;transform:scale(.7)}}.devic-handoff-label{flex:1;font-weight:500}.devic-handoff-stop{align-items:center;background:transparent;border:none;border-radius:50%;color:inherit;cursor:pointer;display:inline-flex;height:22px;justify-content:center;opacity:.8;padding:0;width:22px}.devic-handoff-stop:hover{background:rgba(0,0,0,.06);opacity:1}.devic-handoff-pending{align-items:center;animation:devic-handoff-pending-in .18s ease-out;display:flex;flex:1;gap:10px;min-height:24px;min-width:0}@keyframes devic-handoff-pending-in{0%{opacity:0;transform:translateY(2px)}to{opacity:1;transform:translateY(0)}}.devic-handoff-pending-icon{align-items:center;animation:devic-autostop-pulse 1s ease-in-out infinite;color:var(--devic-primary);display:inline-flex;flex-shrink:0;height:36px;justify-content:center;position:relative;width:36px}.devic-handoff-ring{height:100%;inset:0;pointer-events:none;position:absolute;transform:rotate(-90deg);width:100%}.devic-handoff-ring-track{fill:none;stroke:var(--devic-primary);stroke-opacity:.18;stroke-width:3}.devic-handoff-ring-progress{fill:none;stroke:var(--devic-primary);stroke-width:3;stroke-linecap:round;transition:stroke-dashoffset 90ms linear}.devic-handoff-pending-text{display:flex;flex:1;flex-direction:column;gap:2px;min-width:0}.devic-handoff-pending-title{color:var(--devic-primary);font-size:13px;font-weight:500}.devic-handoff-pending-preview{color:var(--devic-text-secondary);font-size:12px;max-height:4.5em;overflow-wrap:anywhere;overflow-y:auto;white-space:normal;word-break:break-word}.devic-speech-cancel{color:var(--devic-text-muted)}.devic-speech-cancel.devic-input-btn:hover:not(:disabled){color:#cf1322}.devic-speech-status{color:var(--devic-text-secondary);font-size:13px}.devic-speech-spinner{animation:devic-spin .8s linear infinite;border:2px solid var(--devic-border);border-radius:50%;border-top-color:var(--devic-primary);flex-shrink:0;height:16px;width:16px}.devic-transcript-playback{align-items:center;background:hsla(0,0%,100%,.18);border-radius:999px;display:inline-flex;font-size:12px;gap:6px;line-height:1;margin-top:6px;max-width:100%;padding:3px 8px 3px 3px}.devic-message[data-role=assistant] .devic-transcript-playback{background:var(--devic-bg-secondary,rgba(0,0,0,.05))}.devic-transcript-btn{align-items:center;background:hsla(0,0%,100%,.85);border:none;border-radius:50%;color:var(--devic-primary,#6c5ce7);cursor:pointer;display:inline-flex;flex-shrink:0;height:22px;justify-content:center;padding:0;transition:background .15s ease;width:22px}.devic-transcript-btn:hover:not(:disabled){background:#fff}.devic-transcript-btn:disabled{cursor:default;opacity:.7}.devic-transcript-icon{align-items:center;display:inline-flex;opacity:.85}.devic-transcript-playback[data-playing=true] .devic-transcript-icon{animation:devic-pulse 1.2s ease-in-out infinite}.devic-transcript-label{opacity:.9;white-space:nowrap}.devic-transcript-spinner{animation:devic-spin .8s linear infinite;border:2px solid rgba(108,92,231,.3);border-radius:50%;border-top:2px solid var(--devic-primary,#6c5ce7);height:12px;width:12px}.devic-equalizer{align-items:center;display:flex;gap:3px;height:24px}.devic-equalizer-bar{background:var(--devic-primary);border-radius:2px;min-height:3px;transition:height 90ms ease-out;width:3px}.devic-equalizer[data-paused=true] .devic-equalizer-bar{background:var(--devic-text-muted);height:10%!important}.devic-file-preview{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:8px}.devic-file-preview-item{align-items:center;background:var(--devic-bg);border:1px solid var(--devic-border);border-radius:var(--devic-radius-sm);display:flex;font-size:12px;gap:6px;padding:4px 8px}.devic-file-remove{background:none;border:none;color:var(--devic-text-muted);cursor:pointer;font-size:16px;line-height:1;padding:0}.devic-file-remove:hover{color:#ff4d4f}.devic-file-preview-thumb{border-radius:var(--devic-radius-sm);display:block;height:28px;object-fit:cover;width:28px}.devic-input-area{position:relative}.devic-drop-overlay{align-items:center;background:var(--devic-bg);border:2px dashed var(--devic-primary,var(--devic-border));border-radius:var(--devic-radius);color:var(--devic-text-muted);display:flex;flex-direction:column;font-size:13px;gap:8px;inset:0;justify-content:center;pointer-events:none;position:absolute;z-index:2}.devic-pasted-cards{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:8px}.devic-pasted-card{background:var(--devic-bg);border:1px solid var(--devic-border);border-radius:var(--devic-radius);font-size:12px;max-width:240px;padding:10px;position:relative;text-align:left}.devic-pasted-card-preview{-webkit-line-clamp:5;-webkit-box-orient:vertical;color:var(--devic-text-muted);display:-webkit-box;line-height:1.4;margin:0 0 8px;overflow:hidden}.devic-pasted-card-footer{align-items:center;display:flex;gap:8px}.devic-pasted-card-badge{background:var(--devic-bg-secondary);border-radius:var(--devic-radius-sm);color:var(--devic-text);font-size:10px;font-weight:600;letter-spacing:.04em;padding:2px 6px}.devic-pasted-card-meta{color:var(--devic-text-muted);font-size:11px}.devic-pasted-card-remove{position:absolute;right:6px;top:4px}.devic-message-pasted{display:flex;flex-direction:column;gap:8px;margin-bottom:8px}.devic-message-pasted .devic-pasted-card{max-width:100%;overflow:hidden;padding:0}.devic-pasted-card-toggle{background:none;border:none;color:var(--devic-text);cursor:pointer;display:block;font:inherit;padding:10px;text-align:left;width:100%}.devic-pasted-card-full{color:var(--devic-text);font-family:var(--devic-font-mono,ui-monospace,SFMono-Regular,Menlo,monospace);font-size:11px;line-height:1.5;margin:0 0 8px;max-height:320px;overflow:auto;white-space:pre-wrap;word-break:break-word}.devic-message-file-image{border-radius:var(--devic-radius-sm);display:block;max-width:220px;overflow:hidden}.devic-message-file-image img{display:block;height:auto;width:100%}.devic-trigger{align-items:center;background:var(--devic-primary);border:none;border-radius:50%;box-shadow:var(--devic-shadow);color:#fff;cursor:pointer;display:flex;height:56px;justify-content:center;position:fixed;transition:background var(--devic-transition),transform var(--devic-transition);width:56px}.devic-trigger:hover{background:var(--devic-primary-hover);transform:scale(1.05)}.devic-trigger svg{height:24px;width:24px}.devic-error{background:#fff2f0;border:1px solid #ffccc7;border-radius:var(--devic-radius);color:#ff4d4f;font-size:13px;margin:8px 16px;padding:12px}.devic-messages-container::-webkit-scrollbar{width:6px}.devic-messages-container::-webkit-scrollbar-track{background:transparent}.devic-messages-container::-webkit-scrollbar-thumb{background:var(--devic-border);border-radius:3px}.devic-messages-container::-webkit-scrollbar-thumb:hover{background:var(--devic-text-muted)}.devic-chat-drawer[data-mode=inline]{border:1px solid var(--devic-border);bottom:auto;box-shadow:none;height:100%;left:auto;position:relative;right:auto;top:auto;transform:none}.devic-drawer-header-actions{align-items:center;display:flex;gap:4px;margin-left:auto}.devic-new-chat-btn{background:none;border:none;border-radius:var(--devic-radius-sm);color:var(--devic-text-secondary);cursor:pointer;padding:8px;transition:background var(--devic-transition),color var(--devic-transition)}.devic-new-chat-btn:hover{background:var(--devic-bg-secondary);color:var(--devic-primary)}.devic-conversation-selector{flex:1;margin:0 8px;min-width:72px;position:relative}.devic-conversation-selector-trigger{align-items:center;background:var(--devic-bg-secondary);border:1px solid var(--devic-border);border-radius:var(--devic-radius-sm);color:var(--devic-text);cursor:pointer;display:flex;font-family:var(--devic-font-family);font-size:13px;gap:6px;padding:6px 10px;text-align:left;transition:border-color var(--devic-transition);width:100%}.devic-conversation-selector-trigger:hover{border-color:var(--devic-primary)}.devic-conversation-selector-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.devic-conversation-dropdown{background:var(--devic-bg);border:1px solid var(--devic-border);border-radius:var(--devic-radius);box-shadow:var(--devic-shadow);display:flex;flex-direction:column;left:0;max-height:320px;position:absolute;right:0;top:calc(100% + 4px);z-index:10}.devic-conversation-search-wrapper{border-bottom:1px solid var(--devic-border);padding:8px}.devic-conversation-search{background:var(--devic-bg-secondary);border:1px solid var(--devic-border);border-radius:var(--devic-radius-sm);box-sizing:border-box;color:var(--devic-text);font-family:var(--devic-font-family);font-size:13px;outline:none;padding:6px 8px;width:100%}.devic-conversation-search:focus{border-color:var(--devic-primary)}.devic-conversation-list{flex:1;overflow-y:auto}.devic-conversation-item{align-items:center;background:none;border:none;color:var(--devic-text);cursor:pointer;display:flex;font-family:var(--devic-font-family);font-size:13px;justify-content:space-between;padding:8px 12px;text-align:left;transition:background .15s;width:100%}.devic-conversation-item:hover,.devic-conversation-item[data-active=true]{background:var(--devic-bg-secondary)}.devic-conversation-item-name{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.devic-conversation-item-date{color:var(--devic-text-muted);flex-shrink:0;font-size:11px;margin-left:8px}.devic-conversation-empty,.devic-conversation-loading{color:var(--devic-text-muted);font-size:13px;padding:12px;text-align:center}.devic-conversation-load-more{background:none;border:none;color:var(--devic-text-muted);cursor:pointer;display:block;font-family:var(--devic-font-family);font-size:12px;padding:8px 12px;text-align:center;transition:background .15s;width:100%}.devic-conversation-load-more:hover{background:var(--devic-bg-secondary);color:var(--devic-primary)}.devic-conversation-new{background:none;border:none;border-top:1px solid var(--devic-border);color:var(--devic-primary);cursor:pointer;display:block;font-family:var(--devic-font-family);font-size:13px;padding:10px 12px;text-align:left;transition:background .15s;width:100%}.devic-conversation-new:hover{background:var(--devic-bg-secondary)}.devic-conversation-item-check{align-items:center;color:var(--devic-primary);display:flex;flex-shrink:0;margin-right:6px}.devic-message-bubble h1,.devic-message-bubble h2,.devic-message-bubble h3,.devic-message-bubble h4,.devic-message-bubble h5,.devic-message-bubble h6{line-height:1.3;margin:8px 0 4px}.devic-message-bubble h1{font-size:1.3em}.devic-message-bubble h2{font-size:1.2em}.devic-message-bubble h3{font-size:1.1em}.devic-message-bubble p{margin:4px 0}.devic-message-bubble ol,.devic-message-bubble ul{margin:4px 0;padding-left:20px}.devic-message-bubble code{background:rgba(0,0,0,.06);border-radius:3px;color:inherit;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:.9em;padding:1px 4px}.devic-message-bubble pre{background:rgba(0,0,0,.06);border-radius:var(--devic-radius-sm);color:inherit;margin:8px 0;overflow-x:auto;padding:10px}.devic-message-bubble pre code{background:none;color:inherit;padding:0}.devic-message-bubble blockquote{border-left:3px solid var(--devic-border);color:var(--devic-text-secondary);margin:4px 0;padding-left:12px}.devic-message-bubble a{color:var(--devic-primary);text-decoration:underline}.devic-message-bubble p:first-child{margin-top:0}.devic-message-bubble p:last-child{margin-bottom:0}.devic-message[data-role=user] .devic-message-bubble a{color:inherit}.devic-message[data-role=user] .devic-message-bubble code,.devic-message[data-role=user] .devic-message-bubble pre{background:hsla(0,0%,100%,.18)}.devic-message[data-role=user] .devic-message-bubble blockquote{border-left-color:hsla(0,0%,100%,.45);color:inherit}.markdown-table{margin:8px 0;overflow-x:auto}.markdown-table table{border-collapse:collapse;font-size:13px;width:100%}.markdown-table td,.markdown-table th{border:1px solid var(--devic-border);padding:6px 10px;text-align:left}.markdown-table th{background:var(--devic-bg-secondary);font-weight:600}.devic-resize-handle{bottom:0;cursor:col-resize;position:absolute;top:0;width:6px;z-index:1}.devic-resize-handle[data-position=right]{left:0}.devic-resize-handle[data-position=left]{right:0}.devic-resize-handle:active,.devic-resize-handle:hover{background:var(--devic-primary);opacity:.3}.devic-handoff-widget{animation:devic-slideUp .3s ease-out;background:var(--devic-bg);border:1px solid var(--devic-border);border-radius:8px;display:flex;flex-direction:column;gap:10px;max-width:320px;padding:12px;width:100%}.devic-handoff-header{align-items:center;display:flex;gap:8px}.devic-handoff-agent-avatar{align-items:center;background:var(--devic-bg-secondary);border-radius:50%;display:flex;flex-shrink:0;height:24px;justify-content:center;overflow:hidden;width:24px}.devic-handoff-avatar-img{height:100%;object-fit:cover;width:100%}.devic-handoff-agent-name{color:var(--devic-text);font-size:13px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.devic-handoff-progress,.devic-handoff-state-row{align-items:center;display:flex;gap:8px}.devic-handoff-progress-bar{background:#f0f0f0;border-radius:3px;flex:1;height:6px;overflow:hidden;position:relative}.devic-handoff-progress-fill{border-radius:3px;height:100%;transition:width .4s ease}.devic-handoff-progress-fill[data-status=active]{background:var(--devic-primary)}.devic-handoff-progress-fill[data-status=success]{background:#52c41a}.devic-handoff-progress-fill[data-status=error]{background:#ff4d4f}.devic-handoff-progress-text{color:var(--devic-text-muted);flex-shrink:0;font-size:11px}.devic-handoff-progress-indeterminate{animation:devic-indeterminate 1.5s ease-in-out infinite;background:var(--devic-primary);border-radius:3px;height:100%;width:40%}@keyframes devic-indeterminate{0%{transform:translateX(-100%)}50%{transform:translateX(150%)}to{transform:translateX(-100%)}}.devic-handoff-summary{-webkit-line-clamp:2;-webkit-box-orient:vertical;color:var(--devic-text-secondary);display:-webkit-box;font-size:12px;line-height:1.4;overflow:hidden;text-overflow:ellipsis}.devic-handoff-summary-active{animation:devic-pulse 2s cubic-bezier(.4,0,.6,1) infinite}.devic-handoff-elapsed{align-items:center;color:var(--devic-text-muted);display:flex;font-size:11px;gap:4px}.devic-message[data-role=user] .devic-message-references{display:flex;flex-wrap:wrap;gap:4px;justify-content:flex-end;margin-bottom:4px}.devic-message-reference-chip{align-items:center;background:var(--devic-bg-secondary);border:1px solid var(--devic-border);border-radius:999px;color:var(--devic-text);display:inline-flex;font-size:11px;gap:4px;max-width:220px;padding:3px 8px}.devic-message-reference-chip-label{color:var(--devic-primary);font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.devic-reference-chips{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:4px;padding:6px 8px}.devic-reference-chip{align-items:center;background:var(--devic-bg-secondary);border:1px solid var(--devic-border);border-radius:999px;color:var(--devic-text);display:inline-flex;font-size:12px;gap:6px;max-width:220px;padding:4px 8px}.devic-reference-chip-label{color:var(--devic-primary);font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.devic-reference-chip-remove{align-items:center;background:transparent;border:none;border-radius:4px;color:var(--devic-text-muted);cursor:pointer;display:inline-flex;font-size:16px;line-height:1;padding:0 2px}.devic-reference-chip-remove:hover{background:rgba(0,0,0,.06);color:var(--devic-text)}.devic-input-disabled-notice{align-items:center;background:var(--devic-bg-secondary);border-radius:var(--devic-radius);color:var(--devic-text-muted);display:flex;font-size:12px;gap:6px;justify-content:center;margin-bottom:4px;padding:8px 12px}.devic-inline-widgets{display:flex;flex-direction:column;gap:8px;padding:8px 12px}.devic-inline-widget{background:var(--devic-bg-secondary);border:1px solid var(--devic-border);border-radius:var(--devic-radius);padding:12px}.devic-input-widget{padding:8px;width:100%}.devic-limit-banner{align-items:flex-start;background:#fff7e6;border:1px solid #ffd591;border-radius:var(--devic-radius);color:#ad4e00;display:flex;font-size:13px;gap:8px;margin-bottom:8px;padding:8px 12px}.devic-limit-banner-icon{color:#fa8c16;display:inline-flex;flex-shrink:0;margin-top:1px}.devic-limit-banner-text{display:flex;flex-direction:column;gap:2px;line-height:1.35}.devic-limit-banner-title{font-weight:600}.devic-limit-banner-reset{color:var(--devic-text-secondary);font-size:12px}.devic-usage-bar-wrap{display:flex;flex-direction:column;gap:6px;margin-bottom:8px}.devic-usage-bar-head{align-items:center;display:flex;gap:8px;justify-content:space-between}.devic-usage-tier{align-items:center;background:var(--devic-bg-secondary);border:1px solid var(--devic-border);border-radius:999px;color:var(--devic-text-secondary);display:inline-flex;font-size:11px;font-weight:600;letter-spacing:.02em;padding:2px 8px;text-transform:uppercase;white-space:nowrap}.devic-usage-bar-window{color:var(--devic-text-muted);white-space:nowrap}.devic-usage-bar-group{background:var(--devic-bg-secondary);border-radius:var(--devic-radius);display:flex;flex-direction:column;gap:4px;padding:5px 10px}.devic-usage-bar-group .devic-usage-bar{background:transparent;padding:0}.devic-usage-bar{align-items:center;background:var(--devic-bg-secondary);border-radius:var(--devic-radius);color:var(--devic-text-secondary);display:flex;font-size:12px;gap:8px;padding:5px 10px}.devic-usage-bar[data-empty=true]{color:var(--devic-text-muted);justify-content:space-between}.devic-usage-bar-label{font-weight:500;white-space:nowrap}.devic-usage-bar-track{background:var(--devic-border);border-radius:999px;flex:1;height:6px;overflow:hidden}.devic-usage-bar-fill{border-radius:999px;height:100%;transition:width var(--devic-transition),background-color var(--devic-transition)}.devic-usage-bar-reset{color:var(--devic-text-muted);white-space:nowrap}.devic-usage-toggle{align-items:center;background:var(--devic-bg-secondary);border:1px solid var(--devic-border);border-radius:999px;color:var(--devic-text-secondary);cursor:pointer;display:inline-flex;font-size:12px;font-weight:500;gap:6px;padding:4px 10px;transition:background var(--devic-transition),color var(--devic-transition)}.devic-usage-toggle:hover{background:var(--devic-border);color:var(--devic-text)}.devic-usage-collapse{align-items:center;background:transparent;border:none;border-radius:var(--devic-radius-sm);color:var(--devic-text-muted);cursor:pointer;display:inline-flex;font-size:16px;height:18px;justify-content:center;line-height:1;padding:0;width:18px}.devic-usage-collapse:hover{background:var(--devic-border);color:var(--devic-text)}@media (max-width:480px){.devic-chat-drawer{width:100%}}.devic-command-bar-container{--devic-cmd-bg:var(--devic-cmd-bg-override,#fff);--devic-cmd-text:var(--devic-cmd-text-override,#1f2937);--devic-cmd-text-secondary:var(--devic-cmd-text-secondary-override,#6b7280);--devic-cmd-border:var(--devic-cmd-border-override,#e5e7eb);--devic-cmd-radius:var(--devic-cmd-radius-override,12px);--devic-cmd-shadow:var(--devic-cmd-shadow-override,0 4px 20px rgba(0,0,0,.1));--devic-cmd-primary:var(--devic-cmd-primary-override,#3b82f6);--devic-cmd-font-family:var(--devic-cmd-font-family-override,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif);--devic-cmd-font-size:var(--devic-cmd-font-size-override,14px);--devic-cmd-animation-duration:var(--devic-cmd-animation-duration-override,200ms);color:var(--devic-cmd-text);display:flex;flex-direction:column;font-family:var(--devic-cmd-font-family);font-size:var(--devic-cmd-font-size);gap:8px;max-width:100%;width:400px}.devic-command-bar-container[data-position=fixed]{position:fixed}.devic-command-bar-container[data-position=inline]{position:relative}.devic-command-bar-container[data-visible=false]{opacity:0;pointer-events:none;transform:translateY(8px)}.devic-command-bar-container[data-visible=false],.devic-command-bar-container[data-visible=true]{transition:opacity var(--devic-cmd-animation-duration) ease,transform var(--devic-cmd-animation-duration) ease}.devic-command-bar-container[data-visible=true]{opacity:1;transform:translateY(0)}.devic-command-bar{align-items:center;background:var(--devic-cmd-bg);border:1px solid var(--devic-cmd-border);border-radius:var(--devic-cmd-radius);box-shadow:var(--devic-cmd-shadow);display:flex;gap:12px;padding:12px 16px}.devic-command-bar-icon{align-items:center;color:var(--devic-cmd-text-secondary);display:flex;flex-shrink:0;height:20px;justify-content:center;width:20px}.devic-command-bar-icon svg{height:100%;width:100%}.devic-command-bar-input{background:transparent;border:none;color:inherit;flex:1;font-family:inherit;font-size:inherit;min-width:0;outline:none}.devic-command-bar-input::placeholder{color:var(--devic-cmd-text-secondary)}.devic-command-bar-summary{animation:devic-cmd-pulse 1.5s ease-in-out infinite;color:var(--devic-cmd-text-secondary);flex:1;font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@keyframes devic-cmd-pulse{0%,to{opacity:1}50%{opacity:.6}}.devic-command-bar-shortcut{background:var(--devic-cmd-border);border-radius:6px;color:var(--devic-cmd-text-secondary);flex-shrink:0;font-size:12px;font-weight:500;letter-spacing:.5px;padding:4px 8px}.devic-command-bar-spinner{animation:devic-cmd-spin .8s linear infinite;border:2px solid var(--devic-cmd-border);border-radius:50%;border-top-color:var(--devic-cmd-primary);height:20px;width:20px}@keyframes devic-cmd-spin{to{transform:rotate(1turn)}}.devic-command-bar-result{animation:devic-cmd-slide-up .2s ease-out;background:var(--devic-cmd-bg);border:1px solid var(--devic-cmd-border);border-radius:var(--devic-cmd-radius);box-shadow:var(--devic-cmd-shadow);overflow:hidden}@keyframes devic-cmd-slide-up{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.devic-command-bar-result-tools{border-bottom:1px solid var(--devic-cmd-border)}.devic-command-bar-result-tools-header{align-items:center;color:var(--devic-cmd-text-secondary);cursor:pointer;display:flex;font-size:13px;gap:8px;padding:10px 14px;transition:background .15s ease;user-select:none}.devic-command-bar-result-tools-header:hover{background:rgba(0,0,0,.02)}.devic-command-bar-result-tools-chevron{height:16px;transition:transform .2s ease;width:16px}.devic-command-bar-result-tools-header[data-expanded=true] .devic-command-bar-result-tools-chevron{transform:rotate(90deg)}.devic-command-bar-result-tools-count{align-items:center;background:var(--devic-cmd-primary);border-radius:10px;color:#fff;display:inline-flex;font-size:11px;font-weight:600;height:20px;justify-content:center;min-width:20px;padding:0 6px}.devic-command-bar-result-tools-list{display:flex;flex-direction:column;gap:6px;padding:8px 14px 12px}.devic-command-bar-result-tools-list[data-expanded=false]{display:none}.devic-command-bar-result-tool-item{align-items:center;background:rgba(0,0,0,.02);border-radius:6px;display:flex;font-size:12px;gap:8px;padding:6px 10px}.devic-command-bar-result-tool-icon{color:#10b981;height:14px;width:14px}.devic-command-bar-result-tool-name{color:var(--devic-cmd-text-secondary)}.devic-command-bar-result-message{line-height:1.5;max-height:300px;overflow-y:auto;padding:14px}.devic-command-bar-result-message::-webkit-scrollbar{width:6px}.devic-command-bar-result-message::-webkit-scrollbar-track{background:transparent}.devic-command-bar-result-message::-webkit-scrollbar-thumb{background:var(--devic-cmd-border);border-radius:3px}.devic-command-bar-error{background:#fef2f2;border:1px solid #fecaca;border-radius:var(--devic-cmd-radius);color:#dc2626;font-size:13px;padding:10px 14px}.devic-command-bar-result-empty{color:var(--devic-cmd-text-secondary);font-size:13px;padding:14px;text-align:center}.devic-command-bar-dropdown{animation:devic-cmd-slide-up .2s ease-out;background:var(--devic-cmd-bg);border:1px solid var(--devic-cmd-border);border-radius:var(--devic-cmd-radius);box-shadow:var(--devic-cmd-shadow);overflow:hidden}.devic-command-bar-dropdown-header{align-items:center;border-bottom:1px solid var(--devic-cmd-border);color:var(--devic-cmd-text-secondary);display:flex;font-size:12px;font-weight:600;justify-content:space-between;letter-spacing:.5px;padding:10px 14px;text-transform:uppercase}.devic-command-bar-dropdown-hint{align-items:center;display:flex;font-weight:400;gap:4px;letter-spacing:0;text-transform:none}.devic-command-bar-dropdown-hint kbd{align-items:center;background:var(--devic-cmd-border);border-radius:4px;display:inline-flex;font-family:inherit;font-size:10px;height:18px;justify-content:center;min-width:18px;padding:0 4px}.devic-command-bar-dropdown-clear{background:none;border:none;border-radius:4px;color:var(--devic-cmd-primary);cursor:pointer;font-family:inherit;font-size:12px;font-weight:500;letter-spacing:0;padding:2px 6px;text-transform:none}.devic-command-bar-dropdown-clear:hover{background:rgba(0,0,0,.05)}.devic-command-bar-dropdown-list{max-height:250px;overflow-y:auto}.devic-command-bar-dropdown-list::-webkit-scrollbar{width:6px}.devic-command-bar-dropdown-list::-webkit-scrollbar-track{background:transparent}.devic-command-bar-dropdown-list::-webkit-scrollbar-thumb{background:var(--devic-cmd-border);border-radius:3px}.devic-command-bar-dropdown-item{align-items:center;cursor:pointer;display:flex;gap:10px;padding:10px 14px;transition:background .15s ease}.devic-command-bar-dropdown-item:hover,.devic-command-bar-dropdown-item[data-selected=true]{background:rgba(0,0,0,.04)}.devic-command-bar-dropdown-item[data-selected=true]{background:var(--devic-cmd-primary);background:rgba(59,130,246,.1)}.devic-command-bar-dropdown-icon{align-items:center;color:var(--devic-cmd-text-secondary);display:flex;flex-shrink:0;height:16px;justify-content:center;width:16px}.devic-command-bar-dropdown-keyword{color:var(--devic-cmd-text);flex-shrink:0;font-weight:600}.devic-command-bar-dropdown-desc{color:var(--devic-cmd-text-secondary);flex:1;font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.devic-command-bar-dropdown-empty{color:var(--devic-cmd-text-secondary);font-size:13px;padding:20px 14px;text-align:center}.devic-command-bar-history-item{border-bottom:1px solid rgba(0,0,0,.04)}.devic-command-bar-history-item:last-child{border-bottom:none}.devic-command-bar-history-text{flex:1;font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.devic-gen-container{--devic-gen-primary:var(--devic-gen-primary-override,#3b82f6);--devic-gen-primary-hover:var(--devic-gen-primary-hover-override,#2563eb);--devic-gen-bg:var(--devic-gen-bg-override,#fff);--devic-gen-text:var(--devic-gen-text-override,#1f2937);--devic-gen-text-secondary:var(--devic-gen-text-secondary-override,#6b7280);--devic-gen-border:var(--devic-gen-border-override,#e5e7eb);--devic-gen-radius:var(--devic-gen-radius-override,8px);--devic-gen-font-family:var(--devic-gen-font-family-override,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif);--devic-gen-font-size:var(--devic-gen-font-size-override,14px);--devic-gen-z-index:var(--devic-gen-z-index-override,10000);--devic-gen-animation-duration:var(--devic-gen-animation-duration-override,200ms);--devic-gen-modal-bg:var(--devic-gen-modal-bg-override,#fff);--devic-gen-modal-text:var(--devic-gen-modal-text-override,#1f2937);--devic-gen-modal-border:var(--devic-gen-modal-border-override,#e5e7eb);font-family:var(--devic-gen-font-family);font-size:var(--devic-gen-font-size)}.devic-gen-button{align-items:center;border:none;border-radius:var(--devic-gen-radius);cursor:pointer;display:inline-flex;font-family:inherit;font-weight:500;gap:8px;justify-content:center;transition:all var(--devic-gen-animation-duration) ease}.devic-gen-button:disabled{cursor:not-allowed;opacity:.6}.devic-gen-button[data-size=small]{font-size:12px;padding:6px 12px}.devic-gen-button[data-size=medium]{font-size:14px;padding:8px 16px}.devic-gen-button[data-size=large]{font-size:16px;padding:12px 24px}.devic-gen-button[data-variant=primary]{background:var(--devic-gen-primary);color:#fff}.devic-gen-button[data-variant=primary]:hover:not(:disabled){background:var(--devic-gen-primary-hover)}.devic-gen-button[data-variant=secondary]{background:var(--devic-gen-border);color:var(--devic-gen-text)}.devic-gen-button[data-variant=secondary]:hover:not(:disabled){background:#d1d5db}.devic-gen-button[data-variant=outline]{background:transparent;border:1px solid var(--devic-gen-primary);color:var(--devic-gen-primary)}.devic-gen-button[data-variant=outline]:hover:not(:disabled){background:rgba(59,130,246,.1)}.devic-gen-button[data-variant=ghost]{background:transparent;color:var(--devic-gen-text)}.devic-gen-button[data-variant=ghost]:hover:not(:disabled){background:rgba(0,0,0,.05)}.devic-gen-button-icon{align-items:center;display:flex;height:16px;justify-content:center;width:16px}.devic-gen-button-icon svg{height:100%;width:100%}.devic-gen-spinner{animation:devic-gen-spin .8s linear infinite;border:2px solid;border-radius:50%;border-top:2px solid transparent;height:16px;width:16px}.devic-gen-spinner-small{border-width:1.5px;height:12px;width:12px}@keyframes devic-gen-spin{to{transform:rotate(1turn)}}.devic-gen-input{background:var(--devic-gen-modal-bg);border:1px solid var(--devic-gen-modal-border);border-radius:var(--devic-gen-radius);color:var(--devic-gen-modal-text);font-family:inherit;font-size:inherit;min-height:80px;outline:none;padding:12px;resize:vertical;transition:border-color var(--devic-gen-animation-duration) ease;width:100%}.devic-gen-input:focus{border-color:var(--devic-gen-primary)}.devic-gen-input::placeholder{color:var(--devic-gen-text-secondary)}.devic-gen-error{background:#fef2f2;border:1px solid #fecaca;border-radius:var(--devic-gen-radius);color:#dc2626;font-size:13px;margin-top:8px;padding:8px 12px}.devic-gen-tooltip{animation:devic-gen-fade-in var(--devic-gen-animation-duration) ease-out;background:var(--devic-gen-modal-bg);border:1px solid var(--devic-gen-modal-border);border-radius:var(--devic-gen-radius);box-shadow:0 4px 20px rgba(0,0,0,.15);padding:12px}@keyframes devic-gen-fade-in{0%{opacity:0;transform:translateY(4px) translateX(-50%)}to{opacity:1;transform:translateY(0) translateX(-50%)}}.devic-gen-tooltip[data-placement=left],.devic-gen-tooltip[data-placement=right]{animation-name:devic-gen-fade-in-horizontal}@keyframes devic-gen-fade-in-horizontal{0%{opacity:0;transform:translateX(4px) translateY(-50%)}to{opacity:1;transform:translateX(0) translateY(-50%)}}.devic-gen-tooltip-actions{display:flex;gap:8px;justify-content:flex-end;margin-top:12px}.devic-gen-tooltip-cancel,.devic-gen-tooltip-confirm{align-items:center;border-radius:var(--devic-gen-radius);cursor:pointer;display:inline-flex;font-family:inherit;font-size:13px;font-weight:500;gap:6px;padding:6px 12px;transition:all var(--devic-gen-animation-duration) ease}.devic-gen-tooltip-cancel{background:transparent;border:1px solid var(--devic-gen-modal-border);color:var(--devic-gen-text-secondary)}.devic-gen-tooltip-cancel:hover{background:rgba(0,0,0,.05)}.devic-gen-tooltip-confirm{background:var(--devic-gen-primary);border:none;color:#fff}.devic-gen-tooltip-confirm:hover:not(:disabled){background:var(--devic-gen-primary-hover)}.devic-gen-tooltip-confirm:disabled{cursor:not-allowed;opacity:.6}.devic-gen-modal-overlay{align-items:center;animation:devic-gen-overlay-fade-in var(--devic-gen-animation-duration) ease-out;background:rgba(0,0,0,.5);display:flex;inset:0;justify-content:center;position:fixed;z-index:var(--devic-gen-z-index)}@keyframes devic-gen-overlay-fade-in{0%{opacity:0}to{opacity:1}}.devic-gen-modal{animation:devic-gen-modal-slide-up var(--devic-gen-animation-duration) ease-out;background:var(--devic-gen-modal-bg);border-radius:calc(var(--devic-gen-radius) + 4px);box-shadow:0 20px 50px rgba(0,0,0,.2);margin:16px;max-width:480px;width:100%}@keyframes devic-gen-modal-slide-up{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.devic-gen-modal-header{align-items:center;border-bottom:1px solid var(--devic-gen-modal-border);display:flex;justify-content:space-between;padding:16px 20px}.devic-gen-modal-title{color:var(--devic-gen-modal-text);font-size:18px;font-weight:600;margin:0}.devic-gen-modal-close{align-items:center;background:transparent;border:none;border-radius:6px;color:var(--devic-gen-text-secondary);cursor:pointer;display:flex;height:32px;justify-content:center;padding:0;transition:all var(--devic-gen-animation-duration) ease;width:32px}.devic-gen-modal-close:hover{background:rgba(0,0,0,.05);color:var(--devic-gen-modal-text)}.devic-gen-modal-description{color:var(--devic-gen-text-secondary);font-size:14px;line-height:1.5;margin:0;padding:12px 20px 0}.devic-gen-modal-body{padding:16px 20px}.devic-gen-modal-footer{border-top:1px solid var(--devic-gen-modal-border);display:flex;gap:12px;justify-content:flex-end;padding:16px 20px}.devic-gen-modal-cancel,.devic-gen-modal-confirm{align-items:center;border-radius:var(--devic-gen-radius);cursor:pointer;display:inline-flex;font-family:inherit;font-size:14px;font-weight:500;gap:8px;padding:10px 20px;transition:all var(--devic-gen-animation-duration) ease}.devic-gen-modal-cancel{background:transparent;border:1px solid var(--devic-gen-modal-border);color:var(--devic-gen-text-secondary)}.devic-gen-modal-cancel:hover{background:rgba(0,0,0,.05);color:var(--devic-gen-modal-text)}.devic-gen-modal-confirm{background:var(--devic-gen-primary);border:none;color:#fff}.devic-gen-modal-confirm:hover:not(:disabled){background:var(--devic-gen-primary-hover)}.devic-gen-modal-confirm:disabled{cursor:not-allowed;opacity:.6}.devic-gen-input::-webkit-scrollbar{width:6px}.devic-gen-input::-webkit-scrollbar-track{background:transparent}.devic-gen-input::-webkit-scrollbar-thumb{background:var(--devic-gen-border);border-radius:3px}.devic-gen-input:disabled{background:var(--devic-gen-border);cursor:not-allowed;opacity:.6}.devic-gen-tool-calls{background:rgba(0,0,0,.02);border:1px solid var(--devic-gen-modal-border);border-radius:var(--devic-gen-radius);display:flex;flex-direction:column;gap:6px;margin-bottom:12px;padding:10px 12px}.devic-gen-tool-item{align-items:center;color:var(--devic-gen-text-secondary);display:flex;font-size:13px;gap:8px}.devic-gen-tool-item[data-status=executing]{color:var(--devic-gen-primary)}.devic-gen-tool-item[data-status=completed] .devic-gen-tool-icon{color:#10b981}.devic-gen-tool-icon{align-items:center;display:flex;flex-shrink:0;height:16px;justify-content:center;width:16px}.devic-gen-tool-icon svg{height:100%;width:100%}.devic-gen-tool-name{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.devic-gen-tool-custom{padding:8px 0}.devic-gen-processing-status{align-items:center;background:rgba(59,130,246,.05);border:1px solid rgba(59,130,246,.2);border-radius:var(--devic-gen-radius);display:flex;gap:8px;margin-bottom:12px;padding:10px 12px}.devic-gen-processing-text{animation:devic-gen-pulse 1.5s ease-in-out infinite;color:var(--devic-gen-primary);font-size:13px}@keyframes devic-gen-pulse{0%,to{opacity:1}50%{opacity:.6}}.devic-aiwrap-container,.devic-aiwrap-tooltip,.devic-aiwrap-trigger-wrapper{--devic-aiwrap-color:#7c3aed;--devic-aiwrap-color-2:#4f46e5;--devic-aiwrap-bg:#fff;--devic-aiwrap-text:#1f2937;--devic-aiwrap-border:#e5e7eb;--devic-aiwrap-shadow:0 8px 24px rgba(0,0,0,.12)}.devic-aiwrap-container[data-highlight=true] .devic-aiwrap-content{background:rgba(124,58,237,.08);border-radius:4px;outline:1px dashed rgba(124,58,237,.45);outline-offset:2px;transition:background .15s ease,outline-color .15s ease}.devic-aiwrap-content{display:inline;transition:background .15s ease}.devic-aiwrap-trigger-wrapper{display:inline-flex}.devic-aiwrap-trigger{align-items:center;background:linear-gradient(90deg,var(--devic-aiwrap-color) 0,var(--devic-aiwrap-color-2) 100%);border:1px solid hsla(0,0%,100%,.25);box-shadow:0 4px 14px rgba(124,58,237,.35);color:#fff;cursor:pointer;display:inline-flex;font-family:inherit;font-size:13px;font-weight:500;gap:6px;padding:6px 12px;transition:transform .12s ease,box-shadow .12s ease;white-space:nowrap}.devic-aiwrap-trigger:hover{box-shadow:0 6px 18px rgba(124,58,237,.45);transform:translateY(-1px)}.devic-aiwrap-trigger:active{transform:translateY(0)}.devic-aiwrap-trigger-icon{align-items:center;display:inline-flex}.devic-aiwrap-trigger-label{line-height:1}.devic-aiwrap-tooltip{background:var(--devic-aiwrap-bg);border:1px solid var(--devic-aiwrap-border);border-radius:12px;box-shadow:var(--devic-aiwrap-shadow);color:var(--devic-aiwrap-text);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-size:14px;overflow:hidden}.devic-aiwrap-tooltip-header{align-items:center;background:rgba(124,58,237,.05);border-bottom:1px solid var(--devic-aiwrap-border);display:flex;gap:8px;justify-content:space-between;padding:10px 12px}.devic-aiwrap-tooltip-label{color:var(--devic-aiwrap-color);font-size:13px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.devic-aiwrap-tooltip-close{align-items:center;background:transparent;border:none;border-radius:4px;color:#6b7280;cursor:pointer;display:inline-flex;padding:2px}.devic-aiwrap-tooltip-close:hover{background:rgba(0,0,0,.06);color:#111827}.devic-aiwrap-tooltip-body{line-height:1.5;max-height:320px;overflow-y:auto;padding:12px}.devic-aiwrap-processing{align-items:center;color:#6b7280;display:flex;font-size:13px;gap:8px}.devic-aiwrap-spinner{animation:devic-aiwrap-spin .7s linear infinite;border:2px solid rgba(124,58,237,.25);border-radius:50%;border-top:2px solid var(--devic-aiwrap-color);flex-shrink:0;height:14px;width:14px}@keyframes devic-aiwrap-spin{to{transform:rotate(1turn)}}.devic-aiwrap-error{color:#dc2626;font-size:13px}.devic-aiwrap-answer{white-space:pre-wrap;word-break:break-word}
1
+ .devic-state-tag{align-items:center;border:1px solid;border-radius:4px;cursor:default;display:inline-flex;font-family:var(--devic-font-family,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif);font-size:12px;font-weight:500;gap:6px;line-height:20px;padding:2px 8px;position:relative;white-space:nowrap}.devic-state-tag[data-interactive=true]{cursor:pointer}.devic-state-tag[data-interactive=true]:hover{opacity:.85}.devic-state-tag[data-color=gold]{background:rgba(250,173,20,.15);border-color:rgba(250,173,20,.35);color:#faad14}.devic-state-tag[data-color=processing]{background:rgba(22,119,255,.15);border-color:rgba(22,119,255,.35);color:#4096ff}.devic-state-tag[data-color=success]{background:rgba(82,196,26,.15);border-color:rgba(82,196,26,.35);color:#52c41a}.devic-state-tag[data-color=error]{background:rgba(255,77,79,.15);border-color:rgba(255,77,79,.35);color:#ff4d4f}.devic-state-tag[data-color=default]{background:hsla(0,0%,60%,.15);border-color:hsla(0,0%,60%,.35);color:#999}.devic-state-tag[data-color=purple]{background:rgba(114,46,209,.15);border-color:rgba(114,46,209,.35);color:#b37feb}.devic-state-tag[data-color=blue]{background:rgba(22,119,255,.15);border-color:rgba(22,119,255,.35);color:#4096ff}.devic-state-tag-icon{align-items:center;display:inline-flex;flex-shrink:0}.devic-state-tag-caret{align-items:center;display:inline-flex;margin-left:2px;transition:transform .2s ease}.devic-state-tag[data-dropdown-open=true] .devic-state-tag-caret{transform:rotate(180deg)}.devic-state-spinner{animation:devic-state-spin 1s linear infinite}@keyframes devic-state-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.devic-state-tooltip{background:rgba(0,0,0,.85);border-radius:6px;bottom:calc(100% + 8px);color:#fff;font-family:SFMono-Regular,Consolas,monospace;font-size:12px;font-weight:400;line-height:1.4;max-width:280px;padding:6px 10px;pointer-events:none;white-space:normal;z-index:1060}.devic-state-tooltip,.devic-state-tooltip:after{left:50%;position:absolute;transform:translateX(-50%)}.devic-state-tooltip:after{border:5px solid transparent;border-top-color:rgba(0,0,0,.85);content:"";top:100%}.devic-state-dropdown{animation:devic-dropdownSlide .15s ease-out;background:#fff;border:1px solid #e8e8e8;border-radius:8px;box-shadow:0 6px 16px rgba(0,0,0,.08),0 3px 6px rgba(0,0,0,.06);min-width:180px;padding:4px 0;position:absolute;right:0;top:calc(100% + 4px);z-index:1050}@keyframes devic-dropdownSlide{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.devic-state-dropdown-item{align-items:center;background:none;border:none;color:#333;cursor:pointer;display:flex;font-family:inherit;font-size:13px;gap:8px;padding:8px 12px;text-align:left;transition:background .15s;width:100%}.devic-state-dropdown-item:hover{background:#f5f5f5}.devic-state-dropdown-item-icon{align-items:center;display:flex;flex-shrink:0;justify-content:center;width:18px}.devic-state-tooltip-portal{background:rgba(0,0,0,.85);border-radius:6px;color:#fff;font-family:SFMono-Regular,Consolas,monospace;font-size:12px;font-weight:400;line-height:1.4;max-width:280px;padding:6px 10px;pointer-events:none;white-space:normal;z-index:99999}.devic-state-dropdown-portal{animation:devic-dropdownSlide .15s ease-out;background:#fff;border:1px solid #e8e8e8;border-radius:8px;box-shadow:0 6px 16px rgba(0,0,0,.08),0 3px 6px rgba(0,0,0,.06);min-width:180px;padding:4px 0;z-index:99999}.devic-state-modal-overlay{align-items:center;animation:devic-fadeIn .2s ease;background:rgba(0,0,0,.45);display:flex;inset:0;justify-content:center;position:fixed;z-index:1050}@keyframes devic-fadeIn{0%{opacity:0}to{opacity:1}}.devic-state-modal{animation:devic-modalSlide .2s ease-out;background:#fff;border-radius:8px;box-shadow:0 6px 16px rgba(0,0,0,.08);display:flex;flex-direction:column;max-height:80vh;max-width:520px;width:90%}@keyframes devic-modalSlide{0%{opacity:0;transform:translateY(-16px)}to{opacity:1;transform:translateY(0)}}.devic-state-modal-header{align-items:center;border-bottom:1px solid #f0f0f0;display:flex;justify-content:space-between;padding:16px 20px}.devic-state-modal-title{align-items:center;display:flex;font-size:16px;font-weight:600;gap:8px;margin:0}.devic-state-modal-close{align-items:center;background:none;border:none;border-radius:4px;color:#999;cursor:pointer;display:flex;padding:4px}.devic-state-modal-close:hover{background:#f5f5f5;color:#333}.devic-state-modal-body{flex:1;overflow-y:auto;padding:20px}.devic-state-modal-footer{border-top:1px solid #f0f0f0;display:flex;gap:8px;justify-content:flex-end;padding:12px 20px}.devic-state-btn{align-items:center;background:#fff;border:1px solid #d9d9d9;border-radius:6px;color:#333;cursor:pointer;display:inline-flex;font-family:inherit;font-size:14px;font-weight:500;gap:6px;justify-content:center;padding:6px 16px;transition:all .2s}.devic-state-btn:hover{border-color:#1677ff;color:#1677ff}.devic-state-btn-primary{background:#1677ff;border-color:#1677ff;color:#fff}.devic-state-btn-primary:hover{background:#4096ff;border-color:#4096ff;color:#fff}.devic-state-btn-danger{background:#ff4d4f;border-color:#ff4d4f;color:#fff}.devic-state-btn-danger:hover{background:#ff7875;border-color:#ff7875;color:#fff}.devic-state-btn-success{background:#52c41a;border-color:#52c41a;color:#fff}.devic-state-btn-success:hover{background:#73d13d;border-color:#73d13d;color:#fff}.devic-state-btn:disabled{cursor:not-allowed;opacity:.5}.devic-explain-content{border:1px solid #e8e8e8;border-radius:8px;font-family:SFMono-Regular,Consolas,monospace;font-size:13px;line-height:1.6;max-height:300px;min-height:150px;overflow-y:auto;padding:12px;white-space:pre-wrap}.devic-typing-cursor{animation:devic-blink 1s step-end infinite}@keyframes devic-blink{0%,to{opacity:1}50%{opacity:0}}.devic-approval-layout{display:flex;gap:16px}.devic-approval-request{background:#fafafa;border:1px solid #e8e8e8;border-radius:8px;flex:1;font-size:13px;line-height:1.6;max-height:250px;overflow-y:auto;padding:12px}.devic-approval-actions{display:flex;flex:1;flex-direction:column;gap:12px}.devic-approval-textarea{border:1px solid #d9d9d9;border-radius:6px;box-sizing:border-box;font-family:inherit;font-size:13px;min-height:80px;outline:none;padding:8px 12px;resize:vertical;width:100%}.devic-approval-textarea:focus{border-color:#1677ff}.devic-approval-buttons{display:flex;flex-direction:column;gap:8px}.devic-completion-select{background:#fff;border:1px solid #d9d9d9;border-radius:6px;cursor:pointer;font-family:inherit;font-size:14px;outline:none;padding:8px 12px;width:100%}.devic-completion-select:focus{border-color:#1677ff}.devic-state-loading{align-items:center;display:flex;justify-content:center;padding:24px}.devic-state-loading-spinner{animation:devic-state-spin .8s linear infinite;border:2px solid #f0f0f0;border-radius:50%;border-top-color:#1677ff;height:24px;width:24px}.devic-state-warning{align-items:flex-start;color:#cf1322;display:flex;font-size:13px;font-weight:500;gap:6px;margin-top:8px}.devic-message-actions{align-items:center;display:flex;gap:4px;opacity:0;transition:opacity .15s ease}.devic-message-actions:focus-within,.devic-message:hover .devic-message-actions{opacity:1}.devic-message-actions:has(.devic-action-btn--active){opacity:1}.devic-action-btn{align-items:center;background:transparent;border:none;border-radius:var(--devic-radius-sm,6px);color:var(--devic-text-muted,#94a3b8);cursor:pointer;display:flex;height:28px;justify-content:center;padding:0;transition:all .15s ease;width:28px}.devic-action-btn:hover:not(:disabled){background:var(--devic-bg-secondary,#f8fafc);color:var(--devic-text-secondary,#64748b)}.devic-action-btn:disabled{cursor:not-allowed;opacity:.5}.devic-action-btn--active{color:var(--devic-primary,#3b82f6)}.devic-action-btn--active.devic-action-btn--positive{color:#22c55e}.devic-action-btn--active.devic-action-btn--negative{color:#ef4444}.devic-feedback-overlay{align-items:center;animation:devic-feedback-fade-in .15s ease;background:rgba(0,0,0,.4);bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:10001}@keyframes devic-feedback-fade-in{0%{opacity:0}to{opacity:1}}.devic-feedback-modal{animation:devic-feedback-slide-up .2s ease;background:var(--devic-bg,#fff);border-radius:var(--devic-radius,12px);box-shadow:0 20px 60px rgba(0,0,0,.2);margin:16px;max-width:400px;width:100%}@keyframes devic-feedback-slide-up{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.devic-feedback-modal-header{align-items:center;border-bottom:1px solid var(--devic-border,#e2e8f0);display:flex;gap:10px;padding:16px 16px 12px}.devic-feedback-modal-icon{align-items:center;background:var(--devic-bg-secondary,#f8fafc);border-radius:8px;color:var(--devic-text,#1e293b);display:flex;height:32px;justify-content:center;width:32px}.devic-feedback-modal-title{color:var(--devic-text,#1e293b);flex:1;font-size:15px;font-weight:600}.devic-feedback-modal-close{align-items:center;background:transparent;border:none;border-radius:6px;color:var(--devic-text-muted,#94a3b8);cursor:pointer;display:flex;height:28px;justify-content:center;padding:0;transition:all .15s ease;width:28px}.devic-feedback-modal-close:hover{background:var(--devic-bg-secondary,#f8fafc);color:var(--devic-text-secondary,#64748b)}.devic-feedback-textarea{background:transparent;border:none;border-bottom:1px solid var(--devic-border,#e2e8f0);box-sizing:border-box;color:var(--devic-text,#1e293b);display:block;font-family:inherit;font-size:14px;line-height:1.5;padding:12px 16px;resize:none;width:100%}.devic-feedback-textarea:focus{outline:none}.devic-feedback-textarea::placeholder{color:var(--devic-text-muted,#94a3b8)}.devic-feedback-modal-actions{display:flex;gap:8px;justify-content:flex-end;padding:12px 16px}.devic-feedback-btn{border:none;border-radius:var(--devic-radius-sm,6px);cursor:pointer;font-family:inherit;font-size:14px;font-weight:500;padding:8px 16px;transition:all .15s ease}.devic-feedback-btn:disabled{cursor:not-allowed;opacity:.6}.devic-feedback-btn--secondary{background:var(--devic-bg-secondary,#f8fafc);color:var(--devic-text-secondary,#64748b)}.devic-feedback-btn--secondary:hover:not(:disabled){background:var(--devic-border,#e2e8f0)}.devic-feedback-btn--primary{background:var(--devic-primary,#3b82f6);color:#fff}.devic-feedback-btn--primary:hover:not(:disabled){background:var(--devic-primary-hover,#2563eb)}.devic-cmd-result-actions{border-top:1px solid var(--devic-cmd-border,var(--devic-border,#e5e7eb));margin-top:8px;padding-top:8px}.devic-cmd-result-actions .devic-message-actions{opacity:1;padding-left:10px}.devic-cmd-result-actions .devic-action-btn{opacity:.7}.devic-cmd-result-actions .devic-action-btn--active,.devic-cmd-result-actions .devic-action-btn:hover{opacity:1}.devic-cm-overlay{align-items:center;background:rgba(0,0,0,.45);display:flex;inset:0;justify-content:center;position:fixed;z-index:10000}.devic-cm-modal{background:var(--devic-bg,#fff);border-radius:12px;box-shadow:0 12px 40px rgba(0,0,0,.22);color:var(--devic-text,#333);display:flex;flex-direction:column;font-size:13px;max-height:min(640px,calc(100vh - 64px));width:min(560px,calc(100vw - 32px))}.devic-cm-header{align-items:center;border-bottom:1px solid var(--devic-border,#e8e8e8);display:flex;justify-content:space-between;padding:14px 16px}.devic-cm-title{align-items:center;display:flex;font-size:15px;font-weight:600;gap:8px;margin:0}.devic-cm-title svg{color:var(--devic-recall-accent,#722ed1)}.devic-cm-close{background:transparent;border:none;border-radius:6px;color:var(--devic-text-muted,#999);cursor:pointer;font-size:20px;line-height:1;padding:2px 6px}.devic-cm-close:hover{background:var(--devic-bg-secondary,#f5f5f5);color:var(--devic-text,#333)}.devic-cm-body{display:flex;flex-direction:column;gap:12px;overflow-y:auto;padding:12px 16px}.devic-cm-error{background:rgba(255,77,79,.08);border:1px solid rgba(255,77,79,.4);border-radius:8px;color:#cf1322;font-size:12px;padding:8px 10px}.devic-cm-empty,.devic-cm-loading{color:var(--devic-text-muted,#999);padding:24px 8px;text-align:center}.devic-cm-section-title{color:var(--devic-text-muted,#999);font-size:10px;font-weight:700;letter-spacing:.6px;margin-bottom:6px;text-transform:uppercase}.devic-cm-entry{align-items:flex-start;border:1px solid var(--devic-border,#e8e8e8);border-radius:8px;display:flex;gap:8px;justify-content:space-between;margin-bottom:6px;padding:8px 10px}.devic-cm-entry-content{align-items:flex-start;display:flex;flex:1;gap:6px;white-space:pre-wrap;word-break:break-word}.devic-cm-pin{color:var(--devic-recall-accent,#722ed1);flex-shrink:0;margin-top:2px}.devic-cm-entry-actions{display:flex;flex-shrink:0;gap:4px}.devic-cm-editor{display:flex;flex:1;flex-direction:column;gap:6px}.devic-cm-textarea{background:var(--devic-bg,#fff);border:1px solid var(--devic-border,#d9d9d9);border-radius:8px;box-sizing:border-box;color:inherit;font:inherit;min-height:64px;padding:8px 10px;resize:vertical;width:100%}.devic-cm-textarea:focus{border-color:var(--devic-recall-accent,#722ed1);outline:none}.devic-cm-composer,.devic-cm-editor-actions{display:flex;gap:6px}.devic-cm-composer{flex-direction:column}.devic-cm-composer-row{display:flex;gap:6px}.devic-cm-select{color:inherit;padding:4px 8px}.devic-cm-btn,.devic-cm-select{background:var(--devic-bg,#fff);border:1px solid var(--devic-border,#d9d9d9);border-radius:6px;font:inherit}.devic-cm-btn{color:var(--devic-text,#333);cursor:pointer;font-size:12px;padding:5px 12px}.devic-cm-btn:hover:not(:disabled){border-color:var(--devic-recall-accent,#722ed1);color:var(--devic-recall-accent,#722ed1)}.devic-cm-btn:disabled{cursor:not-allowed;opacity:.5}.devic-cm-btn-primary{background:var(--devic-recall-accent,#722ed1);border-color:var(--devic-recall-accent,#722ed1);color:#fff}.devic-cm-btn-primary:hover:not(:disabled){color:#fff;opacity:.9}.devic-cm-btn-small{font-size:11px;padding:2px 8px}.devic-cm-btn-danger:hover:not(:disabled){border-color:#ff4d4f;color:#ff4d4f}.devic-cm-footer{border-top:1px solid var(--devic-border,#e8e8e8);color:var(--devic-text-muted,#999);font-size:11px;padding:10px 16px}.devic-int-overlay{align-items:center;background:rgba(0,0,0,.45);display:flex;inset:0;justify-content:center;position:fixed;z-index:10000}.devic-int-modal{background:var(--devic-bg,#fff);border-radius:12px;box-shadow:0 12px 40px rgba(0,0,0,.22);color:var(--devic-text,#333);display:flex;flex-direction:column;font-size:13px;max-height:min(660px,calc(100vh - 64px));width:min(620px,calc(100vw - 32px))}.devic-int-header{align-items:center;border-bottom:1px solid var(--devic-border,#e8e8e8);display:flex;justify-content:space-between;padding:14px 16px}.devic-int-title{align-items:center;display:flex;font-size:15px;font-weight:600;gap:8px;margin:0}.devic-int-title svg{color:var(--devic-primary,#1677ff)}.devic-int-close{background:transparent;border:none;border-radius:6px;color:var(--devic-text-muted,#999);cursor:pointer;font-size:20px;line-height:1;padding:2px 6px}.devic-int-close:hover{background:var(--devic-bg-secondary,#f5f5f5);color:var(--devic-text,#333)}.devic-int-search{align-items:center;background:var(--devic-bg-secondary,#f7f7f7);border:1px solid var(--devic-border,#e8e8e8);border-radius:8px;color:var(--devic-text-muted,#999);display:flex;gap:8px;margin:12px 16px 0;padding:7px 10px}.devic-int-search:focus-within{border-color:var(--devic-primary,#1677ff)}.devic-int-search input{-webkit-appearance:none;appearance:none;background:transparent;border:none;color:var(--devic-text,#333);flex:1;font:inherit;font-size:13px;min-width:0;outline:none}.devic-int-search input::-webkit-search-cancel-button{-webkit-appearance:none}.devic-int-search input::placeholder{color:var(--devic-text-muted,#999)}.devic-int-body{display:flex;flex-direction:column;gap:10px;overflow-y:auto;padding:12px 16px}.devic-int-error{background:rgba(255,77,79,.08);border:1px solid rgba(255,77,79,.4);border-radius:8px;color:#ff4d4f;font-size:12px;padding:8px 10px}.devic-int-notice{background:rgba(250,173,20,.1);border:1px solid rgba(250,173,20,.45);border-radius:8px;color:inherit;font-size:12px;padding:8px 10px}.devic-int-notice a{color:var(--devic-primary,#1677ff)}.devic-int-empty,.devic-int-loading{color:var(--devic-text-muted,#999);padding:24px 8px;text-align:center}.devic-int-grid{display:grid;gap:10px;grid-template-columns:repeat(auto-fill,minmax(158px,1fr))}.devic-int-card{border:1px solid var(--devic-border,#e8e8e8);border-radius:10px;display:flex;flex-direction:column;gap:6px;padding:12px}.devic-int-card[data-state=connected]{border-color:rgba(82,196,26,.45)}.devic-int-card[data-state=reconnect]{border-color:rgba(250,173,20,.5)}.devic-int-card-head{align-items:center;display:flex;gap:8px;justify-content:space-between}.devic-int-logo{background:var(--devic-bg-secondary,#f5f5f5);border-radius:8px;flex-shrink:0;height:32px;object-fit:contain;width:32px}.devic-int-logo-fallback{align-items:center;color:var(--devic-text-muted,#999);display:flex;font-weight:600;justify-content:center}.devic-int-name{font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.devic-int-state{align-items:center;color:var(--devic-text-muted,#999);display:inline-flex;font-size:11px;gap:4px;white-space:nowrap}.devic-int-card[data-state=connected] .devic-int-state{color:#52c41a}.devic-int-card[data-state=reconnect] .devic-int-state{color:#faad14}.devic-int-description{-webkit-line-clamp:2;-webkit-box-orient:vertical;color:var(--devic-text-muted,#999);display:-webkit-box;font-size:12px;line-height:1.4;overflow:hidden}.devic-int-accounts{display:flex;flex-direction:column;gap:4px;list-style:none;margin:0;padding:0}.devic-int-account{align-items:center;background:var(--devic-bg-secondary,#f7f7f7);border-radius:6px;display:flex;font-size:11px;gap:6px;padding:3px 6px}.devic-int-account-label{color:var(--devic-text-muted,#999);flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.devic-int-account-warn{color:#faad14}.devic-int-dot{background:#faad14;border-radius:50%;flex-shrink:0;height:6px;width:6px}.devic-int-dot[data-ok=true]{background:#52c41a}.devic-int-dot[data-off=true]{background:var(--devic-text-muted,#bbb)}.devic-int-unlink{background:transparent;border:none;border-radius:4px;color:var(--devic-text-muted,#999);cursor:pointer;flex-shrink:0;font-size:14px;line-height:1;padding:0 2px}.devic-int-unlink:hover:not(:disabled){color:#ff4d4f}.devic-int-unlink:disabled{cursor:not-allowed;opacity:.4}.devic-int-btn{background:var(--devic-bg,#fff);border:1px solid var(--devic-border,#d9d9d9);border-radius:6px;color:var(--devic-text,#333);cursor:pointer;flex-shrink:0;font:inherit;font-size:12px;padding:5px 12px}.devic-int-btn:hover:not(:disabled){border-color:var(--devic-primary,#1677ff);color:var(--devic-primary,#1677ff)}.devic-int-btn:disabled{cursor:not-allowed;opacity:.5}.devic-int-btn-block{margin-top:auto;text-align:center;width:100%}.devic-int-btn-primary{background:var(--devic-primary,#1677ff);border-color:var(--devic-primary,#1677ff);color:#fff}.devic-int-btn-primary:hover:not(:disabled){color:#fff;opacity:.9}.devic-int-btn-small{font-size:11px;padding:2px 8px}.devic-int-overlay-stacked{background:rgba(0,0,0,.5);z-index:10001}.devic-int-connect-dialog{background:var(--devic-bg,#fff);border-radius:12px;box-shadow:0 12px 40px rgba(0,0,0,.3);color:var(--devic-text,#333);display:flex;flex-direction:column;font-size:13px;max-height:calc(100vh - 64px);width:min(440px,calc(100vw - 32px))}.devic-int-connect-header{align-items:flex-start;border-bottom:1px solid var(--devic-border,#e8e8e8);display:flex;gap:10px;padding:14px 16px}.devic-int-connect-heading{display:flex;flex:1;flex-direction:column;gap:2px;min-width:0}.devic-int-connect-heading strong{font-size:14px}.devic-int-connect-heading span{color:var(--devic-text-muted,#999);font-size:11px;line-height:1.4}.devic-int-connect-body{display:flex;flex-direction:column;gap:14px;overflow-y:auto;padding:16px}.devic-int-connect-field{display:flex;flex-direction:column;gap:5px}.devic-int-connect-label{color:var(--devic-text,#333);font-size:12px;font-weight:500}.devic-int-connect-label em{color:var(--devic-text-muted,#999);font-style:normal;font-weight:400}.devic-int-connect-field input,.devic-int-connect-field select{background:var(--devic-bg-secondary,#fafafa);border:1px solid var(--devic-border,#d9d9d9);border-radius:8px;box-sizing:border-box;color:var(--devic-text,#333);font:inherit;font-size:13px;height:36px;line-height:normal;padding:0 10px;transition:border-color .15s,box-shadow .15s;width:100%}.devic-int-connect-field input::placeholder{color:var(--devic-text-muted,#bbb)}.devic-int-connect-field input:focus,.devic-int-connect-field select:focus{border-color:var(--devic-primary,#1677ff);box-shadow:0 0 0 3px color-mix(in srgb,var(--devic-primary,#1677ff) 18%,transparent);outline:none}.devic-int-connect-field input[data-invalid]{border-color:#ff4d4f}.devic-int-connect-field input[data-invalid]:focus{box-shadow:0 0 0 3px rgba(255,77,79,.18)}.devic-int-connect-hint{color:var(--devic-text-muted,#999);font-size:11px;line-height:1.45}.devic-int-connect-guide{color:var(--devic-primary,#1677ff);font-size:12px}.devic-int-connect-actions{justify-content:flex-end;padding:12px 16px}.devic-int-connect-actions,.devic-int-footer{border-top:1px solid var(--devic-border,#e8e8e8);display:flex;gap:8px}.devic-int-footer{align-items:center;color:var(--devic-text-muted,#999);font-size:11px;justify-content:space-between;padding:10px 16px}.devic-int-launcher{align-items:center;background:none;border:none;border-radius:var(--devic-radius-sm,6px);cursor:pointer;display:inline-flex;padding:4px 5px;transition:background var(--devic-transition,.2s)}.devic-int-launcher:hover{background:var(--devic-bg-secondary,#f5f5f5)}.devic-int-launcher-item{align-items:center;background:var(--devic-bg,#fff);border:1px solid var(--devic-border,#e8e8e8);border-radius:6px;box-sizing:border-box;display:flex;flex-shrink:0;height:22px;justify-content:center;margin-left:-4px;overflow:hidden;width:22px}.devic-int-launcher-item:first-child{margin-left:0}.devic-int-launcher-item[data-connected=false]{opacity:.55}.devic-int-logo.devic-int-launcher-logo{background:transparent;border-radius:3px;font-size:11px;height:16px;width:16px}.devic-int-launcher-more{background:var(--devic-bg-secondary,#f0f0f0);color:var(--devic-text-muted,#999);font-size:10px;font-weight:600}.devic-int-launcher-loading{cursor:default}.devic-int-launcher-loading:hover{background:none}.devic-int-launcher-skeleton{animation:devic-int-pulse 1.4s ease-in-out infinite;background:var(--devic-bg-secondary,#f0f0f0)}.devic-int-launcher-skeleton:nth-child(2){animation-delay:.16s}.devic-int-launcher-skeleton:nth-child(3){animation-delay:.32s}.devic-int-launcher-skeleton:nth-child(n+4){animation-delay:.48s}@keyframes devic-int-pulse{0%,to{opacity:.35}50%{opacity:.75}}@media (prefers-reduced-motion:reduce){.devic-int-launcher-skeleton{animation:none;opacity:.5}}.devic-int-launcher[data-dark=true] .devic-int-launcher-item{background:hsla(0,0%,100%,.92);border-color:hsla(0,0%,100%,.16)}.devic-int-launcher[data-dark=true] .devic-int-launcher-more{background:var(--devic-bg-secondary,#f0f0f0);border-color:var(--devic-border,#e8e8e8)}.devic-int-overlay[data-dark=true] .devic-int-card .devic-int-logo{background:hsla(0,0%,100%,.92)}.devic-int-overlay[data-dark=true] .devic-int-card .devic-int-logo-fallback{color:#595959}.devic-int-hint{align-items:center;background:var(--devic-bg-secondary,#f7f7f7);border:1px solid var(--devic-border,#e8e8e8);border-radius:12px;display:flex;gap:4px;margin:0 0 8px;padding:6px 8px 6px 12px;transition:opacity .2s ease,transform .2s ease}.devic-int-hint[data-leaving=true]{opacity:0;pointer-events:none;transform:translateY(-4px)}.devic-int-hint-main{align-items:center;background:none;border:none;border-radius:8px;color:inherit;cursor:pointer;display:flex;flex:1;font:inherit;gap:10px;justify-content:space-between;min-width:0;padding:2px}.devic-int-hint-label{color:var(--devic-text-muted,#8c8c8c);font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.devic-int-hint-main:hover .devic-int-hint-label{color:var(--devic-text,#333)}.devic-int-hint-logos{gap:6px}.devic-int-hint-item,.devic-int-hint-logos{align-items:center;display:flex;flex-shrink:0}.devic-int-hint-item{background:var(--devic-bg,#fff);border:1px solid var(--devic-border,#e8e8e8);border-radius:6px;box-sizing:border-box;height:24px;justify-content:center;overflow:hidden;width:24px}.devic-int-hint-item[data-connected=false]{opacity:.6}.devic-int-logo.devic-int-hint-logo{background:transparent;border-radius:3px;font-size:11px;height:17px;width:17px}.devic-int-hint-more{background:var(--devic-bg-secondary,#f0f0f0);color:var(--devic-text-muted,#999);font-size:10px;font-weight:600}.devic-int-hint-close{background:transparent;border:none;border-radius:6px;color:var(--devic-text-muted,#999);cursor:pointer;flex-shrink:0;font-size:18px;line-height:1;padding:2px 6px}.devic-int-hint-close:hover{background:var(--devic-bg,#fff);color:var(--devic-text,#333)}.devic-int-hint[data-dark=true] .devic-int-hint-item{background:hsla(0,0%,100%,.92);border-color:hsla(0,0%,100%,.16)}.devic-int-hint[data-dark=true] .devic-int-hint-more{background:var(--devic-bg,#1f1f1f);border-color:var(--devic-border,#303030)}.devic-int-hint-ghost{align-items:center;display:flex;gap:6px;pointer-events:none;position:fixed;z-index:10001}.devic-int-toggle{display:inline-flex;flex-shrink:0;position:relative}.devic-int-toggle-btn{position:relative}.devic-int-toggle-badge{background:var(--devic-primary,#1677ff);border-radius:7px;box-sizing:border-box;color:#fff;font-size:9px;font-weight:600;height:14px;line-height:14px;min-width:14px;padding:0 3px;position:absolute;right:-2px;text-align:center;top:-2px}.devic-int-toggle-popover{background:var(--devic-bg,#fff);border:1px solid var(--devic-border,#e8e8e8);border-radius:var(--devic-radius,10px);bottom:calc(100% + 8px);box-shadow:0 8px 24px rgba(0,0,0,.14);box-sizing:border-box;color:var(--devic-text,#333);left:0;max-height:320px;overflow-y:auto;padding:10px;position:absolute;width:260px;z-index:10002}.devic-int-toggle-head{border-bottom:1px solid var(--devic-border,#e8e8e8);display:flex;flex-direction:column;gap:2px;margin-bottom:6px;padding:2px 2px 8px}.devic-int-toggle-head strong{font-size:13px}.devic-int-toggle-head span{color:var(--devic-text-muted,#999);font-size:11px;line-height:1.4}.devic-int-toggle-list{list-style:none;margin:0;padding:0}.devic-int-toggle-row{align-items:center;border-radius:var(--devic-radius-sm,6px);cursor:pointer;display:flex;gap:8px;justify-content:space-between;padding:6px 4px}.devic-int-toggle-row:hover{background:var(--devic-bg-secondary,#f5f5f5)}.devic-int-toggle-app{align-items:center;display:flex;gap:8px;min-width:0}.devic-int-toggle-app .devic-int-logo{border-radius:4px;flex-shrink:0;height:18px;object-fit:contain;width:18px}.devic-int-toggle-name{font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.devic-int-toggle-switch{appearance:none;-webkit-appearance:none;background:var(--devic-border,#d9d9d9);border-radius:9px;cursor:pointer;flex-shrink:0;height:18px;margin:0;position:relative;transition:background var(--devic-transition,.2s);width:32px}.devic-int-toggle-switch:after{background:#fff;border-radius:50%;content:"";height:14px;left:2px;position:absolute;top:2px;transition:transform var(--devic-transition,.2s);width:14px}.devic-int-toggle-switch:checked{background:var(--devic-primary,#1677ff)}.devic-int-toggle-switch:checked:after{transform:translateX(14px)}.devic-int-toggle-switch:focus-visible{outline:2px solid var(--devic-primary,#1677ff);outline-offset:2px}.devic-int-toggle-manage{background:none;border:none;border-radius:0 0 var(--devic-radius-sm,6px) var(--devic-radius-sm,6px);border-top:1px solid var(--devic-border,#e8e8e8);color:var(--devic-primary,#1677ff);cursor:pointer;font:inherit;font-size:12px;margin-top:6px;padding:6px;width:100%}.devic-int-toggle-manage:hover{background:var(--devic-bg-secondary,#f5f5f5)}.devic-int-toggle[data-dark=true] .devic-int-toggle-popover{box-shadow:0 8px 24px rgba(0,0,0,.45)}.devic-int-toggle[data-dark=true] .devic-int-toggle-switch:not(:checked){background:var(--devic-border,#434343)}.devic-int-body-secondary{overflow:visible;padding-top:0}.devic-int-mcp-section{border-top:1px solid var(--devic-border,#e8e8e8);display:flex;flex-direction:column;gap:10px;padding-top:12px}.devic-int-mcp-heading h4{font-size:13px;font-weight:600;margin:0}.devic-int-mcp-heading span{color:var(--devic-text-muted,#999);display:block;font-size:12px;margin-top:2px}.devic-int-mcp-logo{border-radius:8px;flex-shrink:0;height:32px;object-fit:contain;width:32px}.devic-int-mcp-logo-fallback{align-items:center;background:var(--devic-primary,#1677ff);color:#fff;display:inline-flex;font-size:14px;font-weight:600;justify-content:center}.devic-int-mcp-note{color:var(--devic-text-muted,#999);font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.devic-int-mcp-note-warn{color:#faad14}.devic-int-mcp-add{align-self:flex-start;border-style:dashed}.devic-int-mcp-remove{border-color:rgba(255,77,79,.35);color:#ff4d4f}.devic-int-mcp-advanced{display:flex;flex-direction:column;gap:8px}.devic-int-mcp-disclosure{align-self:flex-start;font:inherit;font-size:12px}.devic-int-mcp-copy,.devic-int-mcp-disclosure{background:none;border:none;color:var(--devic-primary,#1677ff);cursor:pointer;padding:0}.devic-int-mcp-copy{font:inherit;font-size:inherit}.devic-chat-drawer{--devic-primary:#1890ff;--devic-primary-hover:#40a9ff;--devic-primary-light:#e6f7ff;--devic-bg:#fff;--devic-bg-secondary:#f5f5f5;--devic-text:#333;--devic-text-secondary:#666;--devic-text-muted:#999;--devic-border:#e8e8e8;--devic-shadow:0 4px 12px rgba(0,0,0,.15);--devic-radius:8px;--devic-radius-sm:4px;--devic-radius-lg:16px;--devic-font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;--devic-transition:0.3s ease;background:var(--devic-bg);bottom:0;box-shadow:var(--devic-shadow);color:var(--devic-text);display:flex;flex-direction:column;font-family:var(--devic-font-family);font-size:14px;line-height:1.5;position:fixed;top:0;transition:transform var(--devic-transition)}.devic-chat-drawer[data-position=right]{right:0;transform:translateX(100%)}.devic-chat-drawer[data-position=left]{left:0;transform:translateX(-100%)}.devic-chat-drawer[data-open=true]{transform:translateX(0)}.devic-drawer-overlay{background:rgba(0,0,0,.3);inset:0;opacity:0;position:fixed;transition:opacity var(--devic-transition),visibility var(--devic-transition);visibility:hidden}.devic-drawer-overlay[data-open=true]{opacity:1;visibility:visible}.devic-drawer-header{align-items:center;border-bottom:1px solid var(--devic-border);display:flex;flex-shrink:0;justify-content:space-between;padding:16px}.devic-drawer-avatar{border-radius:50%;flex-shrink:0;height:28px;object-fit:cover;width:28px}.devic-drawer-title{flex-shrink:1;font-size:16px;font-weight:600;margin:0;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.devic-drawer-close{background:none;border:none;border-radius:var(--devic-radius-sm);color:var(--devic-text-secondary);cursor:pointer;padding:8px;transition:background var(--devic-transition),color var(--devic-transition)}.devic-drawer-close:hover{background:var(--devic-bg-secondary);color:var(--devic-text)}.devic-messages-container{display:flex;flex:1;flex-direction:column;gap:12px;overflow-y:auto;padding:16px}.devic-welcome{color:var(--devic-text-secondary);padding:24px 16px;text-align:center}.devic-welcome-text{font-size:16px;margin-bottom:16px}.devic-suggested-messages{display:flex;flex-wrap:wrap;gap:8px;justify-content:center}.devic-suggested-btn{background:var(--devic-bg);border:1px solid var(--devic-border);border-radius:var(--devic-radius-lg);color:var(--devic-text);cursor:pointer;font-size:13px;padding:8px 16px;transition:border-color var(--devic-transition),background var(--devic-transition)}.devic-suggested-btn:hover{background:var(--devic-primary-light);border-color:var(--devic-primary)}.devic-message{display:flex;flex-direction:column;max-width:85%}.devic-message[data-role=user]{align-self:flex-end}.devic-message[data-role=assistant],.devic-message[data-role=tool]{align-self:flex-start}.devic-message-bubble{word-wrap:break-word;border-radius:var(--devic-radius);padding:10px 14px}.devic-message[data-role=user] .devic-message-bubble{background:var(--devic-user-bubble,var(--devic-primary));border-bottom-right-radius:var(--devic-radius-sm);color:var(--devic-user-bubble-text,#fff)}.devic-message[data-role=assistant] .devic-message-bubble{background:var(--devic-assistant-bubble,var(--devic-bg-secondary));border-bottom-left-radius:var(--devic-radius-sm);color:var(--devic-assistant-bubble-text,var(--devic-text))}.devic-message[data-role=tool] .devic-message-bubble{background:var(--devic-primary-light);border:1px solid var(--devic-primary);color:var(--devic-text);font-size:12px}.devic-message-footer{align-items:center;display:flex;gap:8px;justify-content:space-between;margin-top:4px}.devic-message-time{color:var(--devic-text-muted);font-size:11px}.devic-message[data-role=user] .devic-message-footer{justify-content:flex-end}.devic-message[data-role=user] .devic-message-time{text-align:right}.devic-message-files{display:flex;flex-wrap:wrap;gap:8px;margin-top:8px}.devic-message-file{align-items:center;background:hsla(0,0%,100%,.2);border-radius:var(--devic-radius-sm);display:flex;font-size:12px;gap:6px;padding:6px 10px}.devic-recall{align-self:flex-start;background:var(--devic-recall-bg,rgba(114,46,209,.06));border:1px solid var(--devic-recall-border,rgba(114,46,209,.3));border-radius:var(--devic-radius-sm,8px);color:var(--devic-text-secondary);flex-shrink:0;font-size:12px;margin:2px 0 8px;max-width:88%;overflow:hidden}.devic-recall-header{align-items:center;background:transparent;border:none;color:inherit;cursor:pointer;display:flex;font:inherit;gap:6px;padding:6px 10px;text-align:left;width:100%}.devic-recall-icon{color:var(--devic-recall-accent,#722ed1);flex-shrink:0}.devic-recall-title{color:var(--devic-text);font-weight:600;white-space:nowrap}.devic-recall-summary{opacity:.75;white-space:nowrap}.devic-recall-spacer{flex:1}.devic-recall-source{border:1px solid var(--devic-recall-border,rgba(114,46,209,.3));border-radius:4px;color:var(--devic-recall-accent,#722ed1);font-size:10px;line-height:16px;padding:0 6px;white-space:nowrap}.devic-recall-chevron{flex-shrink:0;opacity:.6;transition:transform .15s ease}.devic-recall-body{display:flex;flex-direction:column;gap:8px;padding:2px 10px 10px}.devic-recall-facts{display:flex;flex-direction:column;gap:6px}.devic-recall-fact{color:var(--devic-text);display:flex;flex-direction:column;gap:2px}.devic-recall-fact-meta{color:var(--devic-text-muted);font-size:10px}.devic-recall-entities{display:flex;flex-wrap:wrap;gap:4px}.devic-recall-entity{background:var(--devic-bg);border:1px solid var(--devic-border,#d9d9d9);border-radius:4px;color:var(--devic-text-secondary);font-size:10px;line-height:18px;padding:0 6px}.devic-recall-entity-type{opacity:.55}.devic-recall-turns{display:flex;flex-direction:column;gap:3px}.devic-recall-turns-title{font-size:10px;font-weight:600;letter-spacing:.4px;opacity:.7;text-transform:uppercase}.devic-recall-turn{font-size:11px;opacity:.85}.devic-recall-turn-role{font-weight:600}.devic-loading{align-self:flex-start;display:flex;gap:4px;padding:10px 14px}.devic-loading-dot{animation:devic-bounce 1.4s ease-in-out infinite both;background:var(--devic-text-muted);border-radius:50%;height:8px;width:8px}.devic-loading-dot:first-child{animation-delay:-.32s}.devic-loading-dot:nth-child(2){animation-delay:-.16s}@keyframes devic-bounce{0%,80%,to{transform:scale(0)}40%{transform:scale(1)}}.devic-tool-group{align-self:flex-start;display:flex;flex-direction:column;gap:2px;max-width:85%}.devic-tool-activity{align-items:flex-start;animation:devic-slideUp .3s ease-out;display:flex;gap:8px;padding:4px 0}.devic-tool-activity-icon{align-items:center;color:var(--devic-text-muted);display:flex;flex-shrink:0;margin-top:1px}.devic-tool-activity--active .devic-tool-activity-icon{color:var(--devic-primary)}.devic-tool-activity-text{color:var(--devic-text-secondary);font-size:13px;line-height:1.4}.devic-glow-text{animation:devic-pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes devic-pulse{0%,to{opacity:1}50%{opacity:.5}}.devic-spinner{animation:devic-spin 1s linear infinite}@keyframes devic-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes devic-slideUp{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.devic-tool-collapse-btn{align-items:center;background:none;border:none;color:var(--devic-text-muted);cursor:pointer;display:flex;font-family:var(--devic-font-family);font-size:12px;gap:6px;padding:4px 0;transition:color .2s ease}.devic-tool-collapse-btn:hover{color:var(--devic-primary)}.devic-tool-group-items{animation:devic-expandItems .4s ease-out;overflow:hidden}.devic-tool-group-items[data-expanded=true]{max-height:500px}@keyframes devic-expandItems{0%{max-height:0;opacity:0}to{max-height:500px;opacity:1}}.devic-input-area{border-top:1px solid var(--devic-border);flex-shrink:0;padding:16px}.devic-input-wrapper{--devic-input-row-height:28px;--devic-input-line-height:20px;align-items:flex-end;background:var(--devic-bg-secondary);border-radius:var(--devic-radius);display:flex;gap:8px;padding:8px 12px}.devic-input{background:none;border:none;box-sizing:border-box;color:var(--devic-text);flex:1;font-family:inherit;font-size:14px;line-height:var(--devic-input-line-height);max-height:120px;min-height:var(--devic-input-row-height);outline:none;padding:calc((var(--devic-input-row-height) - var(--devic-input-line-height))/2) 0;resize:none}.devic-input::placeholder{color:var(--devic-text-muted)}.devic-input-btn{align-items:center;background:none;border:none;border-radius:var(--devic-radius-sm);box-sizing:border-box;color:var(--devic-text-secondary);cursor:pointer;display:inline-flex;flex-shrink:0;justify-content:center;min-height:var(--devic-input-row-height,28px);padding:4px;transition:color var(--devic-transition)}.devic-input-btn:hover:not(:disabled){color:var(--devic-primary)}.devic-input-btn:disabled{cursor:not-allowed;opacity:.5}.devic-send-btn{padding:4px 12px}.devic-send-btn,.devic-stop-btn{background:var(--devic-send-btn,var(--devic-primary));border-radius:var(--devic-radius-sm);color:#fff}.devic-stop-btn{min-width:var(--devic-input-row-height,28px);padding:4px}.devic-stop-btn:hover{background:var(--devic-primary-hover);color:#fff}.devic-send-btn-wrapper{flex-shrink:0;position:relative}.devic-send-btn-custom{align-items:center;display:flex;justify-content:center;pointer-events:none}.devic-send-btn-overlay{background:transparent;border:none;cursor:pointer;inset:0;margin:0;padding:0;position:absolute}.devic-send-btn-overlay:disabled{cursor:not-allowed;opacity:.5}.devic-send-btn:hover:not(:disabled){background:var(--devic-primary-hover);color:#fff}.devic-speech-error{background:#fff1f0;border:1px solid #ffccc7;border-radius:var(--devic-radius-sm);color:#cf1322;font-size:12px;margin-bottom:8px;padding:6px 10px}.devic-speech-mic.devic-input-btn:hover:not(:disabled){color:var(--devic-primary)}.devic-speech-mic-wrap{align-items:center;display:inline-flex;flex-shrink:0;justify-content:center;position:relative}.devic-speech-mic-wrap[data-holding=true] .devic-speech-mic{color:var(--devic-primary)}.devic-mic-hold-ring{height:calc(100% + 6px);inset:-3px;pointer-events:none;position:absolute;transform:rotate(-90deg);width:calc(100% + 6px)}.devic-mic-hold-ring-track{fill:none;stroke:var(--devic-primary);stroke-opacity:.18;stroke-width:3}.devic-mic-hold-ring-progress{fill:none;stroke:var(--devic-primary);stroke-width:3;stroke-linecap:round;transition:stroke-dashoffset 90ms linear}.devic-speech-panel{align-items:center;display:flex;flex:1;gap:8px;min-height:var(--devic-input-row-height,28px)}.devic-speech-live{align-items:center;display:flex;flex:1;gap:10px;justify-content:flex-start}.devic-speech-timer{color:var(--devic-text-secondary);font-size:13px;font-variant-numeric:tabular-nums}.devic-speech-confirm{color:#389e0d}.devic-speech-confirm.devic-input-btn:hover:not(:disabled){color:#237804}.devic-speech-confirm-wrap{align-items:center;display:inline-flex;flex-shrink:0;justify-content:center;position:relative}.devic-autostop-ring{height:calc(100% + 6px);inset:-3px;pointer-events:none;position:absolute;transform:rotate(-90deg);width:calc(100% + 6px)}.devic-autostop-ring-track{fill:none;stroke:#389e0d;stroke-opacity:.18;stroke-width:3}.devic-autostop-ring-progress{fill:none;stroke:#389e0d;stroke-width:3;stroke-linecap:round;transition:stroke-dashoffset 90ms linear}.devic-speech-confirm-wrap[data-autostop=true] .devic-speech-confirm{animation:devic-autostop-pulse 1s ease-in-out infinite}@keyframes devic-autostop-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.08)}}.devic-handoff-bar{align-items:center;background:var(--devic-primary-light,#e6f7ff);border-radius:8px;color:var(--devic-primary);display:flex;font-size:12px;gap:8px;margin-bottom:6px;padding:5px 8px}.devic-handoff-dot{animation:devic-handoff-blink 1.2s ease-in-out infinite;background:var(--devic-primary);border-radius:50%;flex-shrink:0;height:8px;width:8px}.devic-handoff-bar[data-waiting=true] .devic-handoff-dot{animation-duration:.7s}@keyframes devic-handoff-blink{0%,to{opacity:1;transform:scale(1)}50%{opacity:.35;transform:scale(.7)}}.devic-handoff-label{flex:1;font-weight:500}.devic-handoff-stop{align-items:center;background:transparent;border:none;border-radius:50%;color:inherit;cursor:pointer;display:inline-flex;height:22px;justify-content:center;opacity:.8;padding:0;width:22px}.devic-handoff-stop:hover{background:rgba(0,0,0,.06);opacity:1}.devic-handoff-pending{align-items:center;animation:devic-handoff-pending-in .18s ease-out;display:flex;flex:1;gap:10px;min-height:24px;min-width:0}@keyframes devic-handoff-pending-in{0%{opacity:0;transform:translateY(2px)}to{opacity:1;transform:translateY(0)}}.devic-handoff-pending-icon{align-items:center;animation:devic-autostop-pulse 1s ease-in-out infinite;color:var(--devic-primary);display:inline-flex;flex-shrink:0;height:36px;justify-content:center;position:relative;width:36px}.devic-handoff-ring{height:100%;inset:0;pointer-events:none;position:absolute;transform:rotate(-90deg);width:100%}.devic-handoff-ring-track{fill:none;stroke:var(--devic-primary);stroke-opacity:.18;stroke-width:3}.devic-handoff-ring-progress{fill:none;stroke:var(--devic-primary);stroke-width:3;stroke-linecap:round;transition:stroke-dashoffset 90ms linear}.devic-handoff-pending-text{display:flex;flex:1;flex-direction:column;gap:2px;min-width:0}.devic-handoff-pending-title{color:var(--devic-primary);font-size:13px;font-weight:500}.devic-handoff-pending-preview{color:var(--devic-text-secondary);font-size:12px;max-height:4.5em;overflow-wrap:anywhere;overflow-y:auto;white-space:normal;word-break:break-word}.devic-speech-cancel{color:var(--devic-text-muted)}.devic-speech-cancel.devic-input-btn:hover:not(:disabled){color:#cf1322}.devic-speech-status{color:var(--devic-text-secondary);font-size:13px}.devic-speech-spinner{animation:devic-spin .8s linear infinite;border:2px solid var(--devic-border);border-radius:50%;border-top-color:var(--devic-primary);flex-shrink:0;height:16px;width:16px}.devic-transcript-playback{align-items:center;background:hsla(0,0%,100%,.18);border-radius:999px;display:inline-flex;font-size:12px;gap:6px;line-height:1;margin-top:6px;max-width:100%;padding:3px 8px 3px 3px}.devic-message[data-role=assistant] .devic-transcript-playback{background:var(--devic-bg-secondary,rgba(0,0,0,.05))}.devic-transcript-btn{align-items:center;background:hsla(0,0%,100%,.85);border:none;border-radius:50%;color:var(--devic-primary,#6c5ce7);cursor:pointer;display:inline-flex;flex-shrink:0;height:22px;justify-content:center;padding:0;transition:background .15s ease;width:22px}.devic-transcript-btn:hover:not(:disabled){background:#fff}.devic-transcript-btn:disabled{cursor:default;opacity:.7}.devic-transcript-icon{align-items:center;display:inline-flex;opacity:.85}.devic-transcript-playback[data-playing=true] .devic-transcript-icon{animation:devic-pulse 1.2s ease-in-out infinite}.devic-transcript-label{opacity:.9;white-space:nowrap}.devic-transcript-spinner{animation:devic-spin .8s linear infinite;border:2px solid rgba(108,92,231,.3);border-radius:50%;border-top:2px solid var(--devic-primary,#6c5ce7);height:12px;width:12px}.devic-equalizer{align-items:center;display:flex;gap:3px;height:24px}.devic-equalizer-bar{background:var(--devic-primary);border-radius:2px;min-height:3px;transition:height 90ms ease-out;width:3px}.devic-equalizer[data-paused=true] .devic-equalizer-bar{background:var(--devic-text-muted);height:10%!important}.devic-file-preview{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:8px}.devic-file-preview-item{align-items:center;background:var(--devic-bg);border:1px solid var(--devic-border);border-radius:var(--devic-radius-sm);display:flex;font-size:12px;gap:6px;padding:4px 8px}.devic-file-remove{background:none;border:none;color:var(--devic-text-muted);cursor:pointer;font-size:16px;line-height:1;padding:0}.devic-file-remove:hover{color:#ff4d4f}.devic-file-preview-thumb{border-radius:var(--devic-radius-sm);display:block;height:28px;object-fit:cover;width:28px}.devic-input-area{position:relative}.devic-drop-overlay{align-items:center;background:var(--devic-bg);border:2px dashed var(--devic-primary,var(--devic-border));border-radius:var(--devic-radius);color:var(--devic-text-muted);display:flex;flex-direction:column;font-size:13px;gap:8px;inset:0;justify-content:center;pointer-events:none;position:absolute;z-index:2}.devic-pasted-cards{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:8px}.devic-pasted-card{background:var(--devic-bg);border:1px solid var(--devic-border);border-radius:var(--devic-radius);font-size:12px;max-width:240px;padding:10px;position:relative;text-align:left}.devic-pasted-card-preview{-webkit-line-clamp:5;-webkit-box-orient:vertical;color:var(--devic-text-muted);display:-webkit-box;line-height:1.4;margin:0 0 8px;overflow:hidden}.devic-pasted-card-footer{align-items:center;display:flex;gap:8px}.devic-pasted-card-badge{background:var(--devic-bg-secondary);border-radius:var(--devic-radius-sm);color:var(--devic-text);font-size:10px;font-weight:600;letter-spacing:.04em;padding:2px 6px}.devic-pasted-card-meta{color:var(--devic-text-muted);font-size:11px}.devic-pasted-card-remove{position:absolute;right:6px;top:4px}.devic-message-pasted{display:flex;flex-direction:column;gap:8px;margin-bottom:8px}.devic-message-pasted .devic-pasted-card{max-width:100%;overflow:hidden;padding:0}.devic-pasted-card-toggle{background:none;border:none;color:var(--devic-text);cursor:pointer;display:block;font:inherit;padding:10px;text-align:left;width:100%}.devic-pasted-card-full{color:var(--devic-text);font-family:var(--devic-font-mono,ui-monospace,SFMono-Regular,Menlo,monospace);font-size:11px;line-height:1.5;margin:0 0 8px;max-height:320px;overflow:auto;white-space:pre-wrap;word-break:break-word}.devic-message-file-image{border-radius:var(--devic-radius-sm);display:block;max-width:220px;overflow:hidden}.devic-message-file-image img{display:block;height:auto;width:100%}.devic-trigger{align-items:center;background:var(--devic-primary);border:none;border-radius:50%;box-shadow:var(--devic-shadow);color:#fff;cursor:pointer;display:flex;height:56px;justify-content:center;position:fixed;transition:background var(--devic-transition),transform var(--devic-transition);width:56px}.devic-trigger:hover{background:var(--devic-primary-hover);transform:scale(1.05)}.devic-trigger svg{height:24px;width:24px}.devic-error{background:#fff2f0;border:1px solid #ffccc7;border-radius:var(--devic-radius);color:#ff4d4f;font-size:13px;margin:8px 16px;padding:12px}.devic-messages-container::-webkit-scrollbar{width:6px}.devic-messages-container::-webkit-scrollbar-track{background:transparent}.devic-messages-container::-webkit-scrollbar-thumb{background:var(--devic-border);border-radius:3px}.devic-messages-container::-webkit-scrollbar-thumb:hover{background:var(--devic-text-muted)}.devic-chat-drawer[data-mode=inline]{border:1px solid var(--devic-border);bottom:auto;box-shadow:none;height:100%;left:auto;position:relative;right:auto;top:auto;transform:none}.devic-drawer-header-actions{align-items:center;display:flex;gap:4px;margin-left:auto}.devic-new-chat-btn{background:none;border:none;border-radius:var(--devic-radius-sm);color:var(--devic-text-secondary);cursor:pointer;padding:8px;transition:background var(--devic-transition),color var(--devic-transition)}.devic-new-chat-btn:hover{background:var(--devic-bg-secondary);color:var(--devic-primary)}.devic-conversation-selector{flex:1;margin:0 8px;min-width:72px;position:relative}.devic-conversation-selector-trigger{align-items:center;background:var(--devic-bg-secondary);border:1px solid var(--devic-border);border-radius:var(--devic-radius-sm);color:var(--devic-text);cursor:pointer;display:flex;font-family:var(--devic-font-family);font-size:13px;gap:6px;padding:6px 10px;text-align:left;transition:border-color var(--devic-transition);width:100%}.devic-conversation-selector-trigger:hover{border-color:var(--devic-primary)}.devic-conversation-selector-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.devic-conversation-dropdown{background:var(--devic-bg);border:1px solid var(--devic-border);border-radius:var(--devic-radius);box-shadow:var(--devic-shadow);display:flex;flex-direction:column;left:0;max-height:320px;position:absolute;right:0;top:calc(100% + 4px);z-index:10}.devic-conversation-search-wrapper{border-bottom:1px solid var(--devic-border);padding:8px}.devic-conversation-search{background:var(--devic-bg-secondary);border:1px solid var(--devic-border);border-radius:var(--devic-radius-sm);box-sizing:border-box;color:var(--devic-text);font-family:var(--devic-font-family);font-size:13px;outline:none;padding:6px 8px;width:100%}.devic-conversation-search:focus{border-color:var(--devic-primary)}.devic-conversation-list{flex:1;overflow-y:auto}.devic-conversation-item{align-items:center;background:none;border:none;color:var(--devic-text);cursor:pointer;display:flex;font-family:var(--devic-font-family);font-size:13px;justify-content:space-between;padding:8px 12px;text-align:left;transition:background .15s;width:100%}.devic-conversation-item:hover,.devic-conversation-item[data-active=true]{background:var(--devic-bg-secondary)}.devic-conversation-item-name{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.devic-conversation-item-date{color:var(--devic-text-muted);flex-shrink:0;font-size:11px;margin-left:8px}.devic-conversation-empty,.devic-conversation-loading{color:var(--devic-text-muted);font-size:13px;padding:12px;text-align:center}.devic-conversation-load-more{background:none;border:none;color:var(--devic-text-muted);cursor:pointer;display:block;font-family:var(--devic-font-family);font-size:12px;padding:8px 12px;text-align:center;transition:background .15s;width:100%}.devic-conversation-load-more:hover{background:var(--devic-bg-secondary);color:var(--devic-primary)}.devic-conversation-new{background:none;border:none;border-top:1px solid var(--devic-border);color:var(--devic-primary);cursor:pointer;display:block;font-family:var(--devic-font-family);font-size:13px;padding:10px 12px;text-align:left;transition:background .15s;width:100%}.devic-conversation-new:hover{background:var(--devic-bg-secondary)}.devic-conversation-item-check{align-items:center;color:var(--devic-primary);display:flex;flex-shrink:0;margin-right:6px}.devic-message-bubble h1,.devic-message-bubble h2,.devic-message-bubble h3,.devic-message-bubble h4,.devic-message-bubble h5,.devic-message-bubble h6{line-height:1.3;margin:8px 0 4px}.devic-message-bubble h1{font-size:1.3em}.devic-message-bubble h2{font-size:1.2em}.devic-message-bubble h3{font-size:1.1em}.devic-message-bubble p{margin:4px 0}.devic-message-bubble ol,.devic-message-bubble ul{margin:4px 0;padding-left:20px}.devic-message-bubble code{background:rgba(0,0,0,.06);border-radius:3px;color:inherit;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:.9em;padding:1px 4px}.devic-message-bubble pre{background:rgba(0,0,0,.06);border-radius:var(--devic-radius-sm);color:inherit;margin:8px 0;overflow-x:auto;padding:10px}.devic-message-bubble pre code{background:none;color:inherit;padding:0}.devic-message-bubble blockquote{border-left:3px solid var(--devic-border);color:var(--devic-text-secondary);margin:4px 0;padding-left:12px}.devic-message-bubble a{color:var(--devic-primary);text-decoration:underline}.devic-message-bubble p:first-child{margin-top:0}.devic-message-bubble p:last-child{margin-bottom:0}.devic-message[data-role=user] .devic-message-bubble a{color:inherit}.devic-message[data-role=user] .devic-message-bubble code,.devic-message[data-role=user] .devic-message-bubble pre{background:hsla(0,0%,100%,.18)}.devic-message[data-role=user] .devic-message-bubble blockquote{border-left-color:hsla(0,0%,100%,.45);color:inherit}.markdown-table{margin:8px 0;overflow-x:auto}.markdown-table table{border-collapse:collapse;font-size:13px;width:100%}.markdown-table td,.markdown-table th{border:1px solid var(--devic-border);padding:6px 10px;text-align:left}.markdown-table th{background:var(--devic-bg-secondary);font-weight:600}.devic-resize-handle{bottom:0;cursor:col-resize;position:absolute;top:0;width:6px;z-index:1}.devic-resize-handle[data-position=right]{left:0}.devic-resize-handle[data-position=left]{right:0}.devic-resize-handle:active,.devic-resize-handle:hover{background:var(--devic-primary);opacity:.3}.devic-handoff-widget{animation:devic-slideUp .3s ease-out;background:var(--devic-bg);border:1px solid var(--devic-border);border-radius:8px;display:flex;flex-direction:column;gap:10px;max-width:320px;padding:12px;width:100%}.devic-handoff-header{align-items:center;display:flex;gap:8px}.devic-handoff-agent-avatar{align-items:center;background:var(--devic-bg-secondary);border-radius:50%;display:flex;flex-shrink:0;height:24px;justify-content:center;overflow:hidden;width:24px}.devic-handoff-avatar-img{height:100%;object-fit:cover;width:100%}.devic-handoff-agent-name{color:var(--devic-text);font-size:13px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.devic-handoff-progress,.devic-handoff-state-row{align-items:center;display:flex;gap:8px}.devic-handoff-progress-bar{background:#f0f0f0;border-radius:3px;flex:1;height:6px;overflow:hidden;position:relative}.devic-handoff-progress-fill{border-radius:3px;height:100%;transition:width .4s ease}.devic-handoff-progress-fill[data-status=active]{background:var(--devic-primary)}.devic-handoff-progress-fill[data-status=success]{background:#52c41a}.devic-handoff-progress-fill[data-status=error]{background:#ff4d4f}.devic-handoff-progress-text{color:var(--devic-text-muted);flex-shrink:0;font-size:11px}.devic-handoff-progress-indeterminate{animation:devic-indeterminate 1.5s ease-in-out infinite;background:var(--devic-primary);border-radius:3px;height:100%;width:40%}@keyframes devic-indeterminate{0%{transform:translateX(-100%)}50%{transform:translateX(150%)}to{transform:translateX(-100%)}}.devic-handoff-summary{-webkit-line-clamp:2;-webkit-box-orient:vertical;color:var(--devic-text-secondary);display:-webkit-box;font-size:12px;line-height:1.4;overflow:hidden;text-overflow:ellipsis}.devic-handoff-summary-active{animation:devic-pulse 2s cubic-bezier(.4,0,.6,1) infinite}.devic-handoff-elapsed{align-items:center;color:var(--devic-text-muted);display:flex;font-size:11px;gap:4px}.devic-message[data-role=user] .devic-message-references{display:flex;flex-wrap:wrap;gap:4px;justify-content:flex-end;margin-bottom:4px}.devic-message-reference-chip{align-items:center;background:var(--devic-bg-secondary);border:1px solid var(--devic-border);border-radius:999px;color:var(--devic-text);display:inline-flex;font-size:11px;gap:4px;max-width:220px;padding:3px 8px}.devic-message-reference-chip-label{color:var(--devic-primary);font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.devic-reference-chips{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:4px;padding:6px 8px}.devic-reference-chip{align-items:center;background:var(--devic-bg-secondary);border:1px solid var(--devic-border);border-radius:999px;color:var(--devic-text);display:inline-flex;font-size:12px;gap:6px;max-width:220px;padding:4px 8px}.devic-reference-chip-label{color:var(--devic-primary);font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.devic-reference-chip-remove{align-items:center;background:transparent;border:none;border-radius:4px;color:var(--devic-text-muted);cursor:pointer;display:inline-flex;font-size:16px;line-height:1;padding:0 2px}.devic-reference-chip-remove:hover{background:rgba(0,0,0,.06);color:var(--devic-text)}.devic-input-disabled-notice{align-items:center;background:var(--devic-bg-secondary);border-radius:var(--devic-radius);color:var(--devic-text-muted);display:flex;font-size:12px;gap:6px;justify-content:center;margin-bottom:4px;padding:8px 12px}.devic-inline-widgets{display:flex;flex-direction:column;gap:8px;padding:8px 12px}.devic-inline-widget{background:var(--devic-bg-secondary);border:1px solid var(--devic-border);border-radius:var(--devic-radius);padding:12px}.devic-input-widget{padding:8px;width:100%}.devic-limit-banner{align-items:flex-start;background:#fff7e6;border:1px solid #ffd591;border-radius:var(--devic-radius);color:#ad4e00;display:flex;font-size:13px;gap:8px;margin-bottom:8px;padding:8px 12px}.devic-limit-banner-icon{color:#fa8c16;display:inline-flex;flex-shrink:0;margin-top:1px}.devic-limit-banner-text{display:flex;flex-direction:column;gap:2px;line-height:1.35}.devic-limit-banner-title{font-weight:600}.devic-limit-banner-reset{color:var(--devic-text-secondary);font-size:12px}.devic-usage-bar-wrap{display:flex;flex-direction:column;gap:6px;margin-bottom:8px}.devic-usage-bar-head{align-items:center;display:flex;gap:8px;justify-content:space-between}.devic-usage-tier{align-items:center;background:var(--devic-bg-secondary);border:1px solid var(--devic-border);border-radius:999px;color:var(--devic-text-secondary);display:inline-flex;font-size:11px;font-weight:600;letter-spacing:.02em;padding:2px 8px;text-transform:uppercase;white-space:nowrap}.devic-usage-bar-window{color:var(--devic-text-muted);white-space:nowrap}.devic-usage-bar-group{background:var(--devic-bg-secondary);border-radius:var(--devic-radius);display:flex;flex-direction:column;gap:4px;padding:5px 10px}.devic-usage-bar-group .devic-usage-bar{background:transparent;padding:0}.devic-usage-bar{align-items:center;background:var(--devic-bg-secondary);border-radius:var(--devic-radius);color:var(--devic-text-secondary);display:flex;font-size:12px;gap:8px;padding:5px 10px}.devic-usage-bar[data-empty=true]{color:var(--devic-text-muted);justify-content:space-between}.devic-usage-bar-label{font-weight:500;white-space:nowrap}.devic-usage-bar-track{background:var(--devic-border);border-radius:999px;flex:1;height:6px;overflow:hidden}.devic-usage-bar-fill{border-radius:999px;height:100%;transition:width var(--devic-transition),background-color var(--devic-transition)}.devic-usage-bar-reset{color:var(--devic-text-muted);white-space:nowrap}.devic-usage-toggle{align-items:center;background:var(--devic-bg-secondary);border:1px solid var(--devic-border);border-radius:999px;color:var(--devic-text-secondary);cursor:pointer;display:inline-flex;font-size:12px;font-weight:500;gap:6px;padding:4px 10px;transition:background var(--devic-transition),color var(--devic-transition)}.devic-usage-toggle:hover{background:var(--devic-border);color:var(--devic-text)}.devic-usage-collapse{align-items:center;background:transparent;border:none;border-radius:var(--devic-radius-sm);color:var(--devic-text-muted);cursor:pointer;display:inline-flex;font-size:16px;height:18px;justify-content:center;line-height:1;padding:0;width:18px}.devic-usage-collapse:hover{background:var(--devic-border);color:var(--devic-text)}@media (max-width:480px){.devic-chat-drawer{width:100%}}.devic-command-bar-container{--devic-cmd-bg:var(--devic-cmd-bg-override,#fff);--devic-cmd-text:var(--devic-cmd-text-override,#1f2937);--devic-cmd-text-secondary:var(--devic-cmd-text-secondary-override,#6b7280);--devic-cmd-border:var(--devic-cmd-border-override,#e5e7eb);--devic-cmd-radius:var(--devic-cmd-radius-override,12px);--devic-cmd-shadow:var(--devic-cmd-shadow-override,0 4px 20px rgba(0,0,0,.1));--devic-cmd-primary:var(--devic-cmd-primary-override,#3b82f6);--devic-cmd-font-family:var(--devic-cmd-font-family-override,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif);--devic-cmd-font-size:var(--devic-cmd-font-size-override,14px);--devic-cmd-animation-duration:var(--devic-cmd-animation-duration-override,200ms);color:var(--devic-cmd-text);display:flex;flex-direction:column;font-family:var(--devic-cmd-font-family);font-size:var(--devic-cmd-font-size);gap:8px;max-width:100%;width:400px}.devic-command-bar-container[data-position=fixed]{position:fixed}.devic-command-bar-container[data-position=inline]{position:relative}.devic-command-bar-container[data-visible=false]{opacity:0;pointer-events:none;transform:translateY(8px)}.devic-command-bar-container[data-visible=false],.devic-command-bar-container[data-visible=true]{transition:opacity var(--devic-cmd-animation-duration) ease,transform var(--devic-cmd-animation-duration) ease}.devic-command-bar-container[data-visible=true]{opacity:1;transform:translateY(0)}.devic-command-bar{align-items:center;background:var(--devic-cmd-bg);border:1px solid var(--devic-cmd-border);border-radius:var(--devic-cmd-radius);box-shadow:var(--devic-cmd-shadow);display:flex;gap:12px;padding:12px 16px}.devic-command-bar-icon{align-items:center;color:var(--devic-cmd-text-secondary);display:flex;flex-shrink:0;height:20px;justify-content:center;width:20px}.devic-command-bar-icon svg{height:100%;width:100%}.devic-command-bar-input{background:transparent;border:none;color:inherit;flex:1;font-family:inherit;font-size:inherit;min-width:0;outline:none}.devic-command-bar-input::placeholder{color:var(--devic-cmd-text-secondary)}.devic-command-bar-summary{animation:devic-cmd-pulse 1.5s ease-in-out infinite;color:var(--devic-cmd-text-secondary);flex:1;font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@keyframes devic-cmd-pulse{0%,to{opacity:1}50%{opacity:.6}}.devic-command-bar-shortcut{background:var(--devic-cmd-border);border-radius:6px;color:var(--devic-cmd-text-secondary);flex-shrink:0;font-size:12px;font-weight:500;letter-spacing:.5px;padding:4px 8px}.devic-command-bar-spinner{animation:devic-cmd-spin .8s linear infinite;border:2px solid var(--devic-cmd-border);border-radius:50%;border-top-color:var(--devic-cmd-primary);height:20px;width:20px}@keyframes devic-cmd-spin{to{transform:rotate(1turn)}}.devic-command-bar-result{animation:devic-cmd-slide-up .2s ease-out;background:var(--devic-cmd-bg);border:1px solid var(--devic-cmd-border);border-radius:var(--devic-cmd-radius);box-shadow:var(--devic-cmd-shadow);overflow:hidden}@keyframes devic-cmd-slide-up{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.devic-command-bar-result-tools{border-bottom:1px solid var(--devic-cmd-border)}.devic-command-bar-result-tools-header{align-items:center;color:var(--devic-cmd-text-secondary);cursor:pointer;display:flex;font-size:13px;gap:8px;padding:10px 14px;transition:background .15s ease;user-select:none}.devic-command-bar-result-tools-header:hover{background:rgba(0,0,0,.02)}.devic-command-bar-result-tools-chevron{height:16px;transition:transform .2s ease;width:16px}.devic-command-bar-result-tools-header[data-expanded=true] .devic-command-bar-result-tools-chevron{transform:rotate(90deg)}.devic-command-bar-result-tools-count{align-items:center;background:var(--devic-cmd-primary);border-radius:10px;color:#fff;display:inline-flex;font-size:11px;font-weight:600;height:20px;justify-content:center;min-width:20px;padding:0 6px}.devic-command-bar-result-tools-list{display:flex;flex-direction:column;gap:6px;padding:8px 14px 12px}.devic-command-bar-result-tools-list[data-expanded=false]{display:none}.devic-command-bar-result-tool-item{align-items:center;background:rgba(0,0,0,.02);border-radius:6px;display:flex;font-size:12px;gap:8px;padding:6px 10px}.devic-command-bar-result-tool-icon{color:#10b981;height:14px;width:14px}.devic-command-bar-result-tool-name{color:var(--devic-cmd-text-secondary)}.devic-command-bar-result-message{line-height:1.5;max-height:300px;overflow-y:auto;padding:14px}.devic-command-bar-result-message::-webkit-scrollbar{width:6px}.devic-command-bar-result-message::-webkit-scrollbar-track{background:transparent}.devic-command-bar-result-message::-webkit-scrollbar-thumb{background:var(--devic-cmd-border);border-radius:3px}.devic-command-bar-error{background:#fef2f2;border:1px solid #fecaca;border-radius:var(--devic-cmd-radius);color:#dc2626;font-size:13px;padding:10px 14px}.devic-command-bar-result-empty{color:var(--devic-cmd-text-secondary);font-size:13px;padding:14px;text-align:center}.devic-command-bar-dropdown{animation:devic-cmd-slide-up .2s ease-out;background:var(--devic-cmd-bg);border:1px solid var(--devic-cmd-border);border-radius:var(--devic-cmd-radius);box-shadow:var(--devic-cmd-shadow);overflow:hidden}.devic-command-bar-dropdown-header{align-items:center;border-bottom:1px solid var(--devic-cmd-border);color:var(--devic-cmd-text-secondary);display:flex;font-size:12px;font-weight:600;justify-content:space-between;letter-spacing:.5px;padding:10px 14px;text-transform:uppercase}.devic-command-bar-dropdown-hint{align-items:center;display:flex;font-weight:400;gap:4px;letter-spacing:0;text-transform:none}.devic-command-bar-dropdown-hint kbd{align-items:center;background:var(--devic-cmd-border);border-radius:4px;display:inline-flex;font-family:inherit;font-size:10px;height:18px;justify-content:center;min-width:18px;padding:0 4px}.devic-command-bar-dropdown-clear{background:none;border:none;border-radius:4px;color:var(--devic-cmd-primary);cursor:pointer;font-family:inherit;font-size:12px;font-weight:500;letter-spacing:0;padding:2px 6px;text-transform:none}.devic-command-bar-dropdown-clear:hover{background:rgba(0,0,0,.05)}.devic-command-bar-dropdown-list{max-height:250px;overflow-y:auto}.devic-command-bar-dropdown-list::-webkit-scrollbar{width:6px}.devic-command-bar-dropdown-list::-webkit-scrollbar-track{background:transparent}.devic-command-bar-dropdown-list::-webkit-scrollbar-thumb{background:var(--devic-cmd-border);border-radius:3px}.devic-command-bar-dropdown-item{align-items:center;cursor:pointer;display:flex;gap:10px;padding:10px 14px;transition:background .15s ease}.devic-command-bar-dropdown-item:hover,.devic-command-bar-dropdown-item[data-selected=true]{background:rgba(0,0,0,.04)}.devic-command-bar-dropdown-item[data-selected=true]{background:var(--devic-cmd-primary);background:rgba(59,130,246,.1)}.devic-command-bar-dropdown-icon{align-items:center;color:var(--devic-cmd-text-secondary);display:flex;flex-shrink:0;height:16px;justify-content:center;width:16px}.devic-command-bar-dropdown-keyword{color:var(--devic-cmd-text);flex-shrink:0;font-weight:600}.devic-command-bar-dropdown-desc{color:var(--devic-cmd-text-secondary);flex:1;font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.devic-command-bar-dropdown-empty{color:var(--devic-cmd-text-secondary);font-size:13px;padding:20px 14px;text-align:center}.devic-command-bar-history-item{border-bottom:1px solid rgba(0,0,0,.04)}.devic-command-bar-history-item:last-child{border-bottom:none}.devic-command-bar-history-text{flex:1;font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.devic-gen-container{--devic-gen-primary:var(--devic-gen-primary-override,#3b82f6);--devic-gen-primary-hover:var(--devic-gen-primary-hover-override,#2563eb);--devic-gen-bg:var(--devic-gen-bg-override,#fff);--devic-gen-text:var(--devic-gen-text-override,#1f2937);--devic-gen-text-secondary:var(--devic-gen-text-secondary-override,#6b7280);--devic-gen-border:var(--devic-gen-border-override,#e5e7eb);--devic-gen-radius:var(--devic-gen-radius-override,8px);--devic-gen-font-family:var(--devic-gen-font-family-override,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif);--devic-gen-font-size:var(--devic-gen-font-size-override,14px);--devic-gen-z-index:var(--devic-gen-z-index-override,10000);--devic-gen-animation-duration:var(--devic-gen-animation-duration-override,200ms);--devic-gen-modal-bg:var(--devic-gen-modal-bg-override,#fff);--devic-gen-modal-text:var(--devic-gen-modal-text-override,#1f2937);--devic-gen-modal-border:var(--devic-gen-modal-border-override,#e5e7eb);font-family:var(--devic-gen-font-family);font-size:var(--devic-gen-font-size)}.devic-gen-button{align-items:center;border:none;border-radius:var(--devic-gen-radius);cursor:pointer;display:inline-flex;font-family:inherit;font-weight:500;gap:8px;justify-content:center;transition:all var(--devic-gen-animation-duration) ease}.devic-gen-button:disabled{cursor:not-allowed;opacity:.6}.devic-gen-button[data-size=small]{font-size:12px;padding:6px 12px}.devic-gen-button[data-size=medium]{font-size:14px;padding:8px 16px}.devic-gen-button[data-size=large]{font-size:16px;padding:12px 24px}.devic-gen-button[data-variant=primary]{background:var(--devic-gen-primary);color:#fff}.devic-gen-button[data-variant=primary]:hover:not(:disabled){background:var(--devic-gen-primary-hover)}.devic-gen-button[data-variant=secondary]{background:var(--devic-gen-border);color:var(--devic-gen-text)}.devic-gen-button[data-variant=secondary]:hover:not(:disabled){background:#d1d5db}.devic-gen-button[data-variant=outline]{background:transparent;border:1px solid var(--devic-gen-primary);color:var(--devic-gen-primary)}.devic-gen-button[data-variant=outline]:hover:not(:disabled){background:rgba(59,130,246,.1)}.devic-gen-button[data-variant=ghost]{background:transparent;color:var(--devic-gen-text)}.devic-gen-button[data-variant=ghost]:hover:not(:disabled){background:rgba(0,0,0,.05)}.devic-gen-button-icon{align-items:center;display:flex;height:16px;justify-content:center;width:16px}.devic-gen-button-icon svg{height:100%;width:100%}.devic-gen-spinner{animation:devic-gen-spin .8s linear infinite;border:2px solid;border-radius:50%;border-top:2px solid transparent;height:16px;width:16px}.devic-gen-spinner-small{border-width:1.5px;height:12px;width:12px}@keyframes devic-gen-spin{to{transform:rotate(1turn)}}.devic-gen-input{background:var(--devic-gen-modal-bg);border:1px solid var(--devic-gen-modal-border);border-radius:var(--devic-gen-radius);color:var(--devic-gen-modal-text);font-family:inherit;font-size:inherit;min-height:80px;outline:none;padding:12px;resize:vertical;transition:border-color var(--devic-gen-animation-duration) ease;width:100%}.devic-gen-input:focus{border-color:var(--devic-gen-primary)}.devic-gen-input::placeholder{color:var(--devic-gen-text-secondary)}.devic-gen-error{background:#fef2f2;border:1px solid #fecaca;border-radius:var(--devic-gen-radius);color:#dc2626;font-size:13px;margin-top:8px;padding:8px 12px}.devic-gen-tooltip{animation:devic-gen-fade-in var(--devic-gen-animation-duration) ease-out;background:var(--devic-gen-modal-bg);border:1px solid var(--devic-gen-modal-border);border-radius:var(--devic-gen-radius);box-shadow:0 4px 20px rgba(0,0,0,.15);padding:12px}@keyframes devic-gen-fade-in{0%{opacity:0;transform:translateY(4px) translateX(-50%)}to{opacity:1;transform:translateY(0) translateX(-50%)}}.devic-gen-tooltip[data-placement=left],.devic-gen-tooltip[data-placement=right]{animation-name:devic-gen-fade-in-horizontal}@keyframes devic-gen-fade-in-horizontal{0%{opacity:0;transform:translateX(4px) translateY(-50%)}to{opacity:1;transform:translateX(0) translateY(-50%)}}.devic-gen-tooltip-actions{display:flex;gap:8px;justify-content:flex-end;margin-top:12px}.devic-gen-tooltip-cancel,.devic-gen-tooltip-confirm{align-items:center;border-radius:var(--devic-gen-radius);cursor:pointer;display:inline-flex;font-family:inherit;font-size:13px;font-weight:500;gap:6px;padding:6px 12px;transition:all var(--devic-gen-animation-duration) ease}.devic-gen-tooltip-cancel{background:transparent;border:1px solid var(--devic-gen-modal-border);color:var(--devic-gen-text-secondary)}.devic-gen-tooltip-cancel:hover{background:rgba(0,0,0,.05)}.devic-gen-tooltip-confirm{background:var(--devic-gen-primary);border:none;color:#fff}.devic-gen-tooltip-confirm:hover:not(:disabled){background:var(--devic-gen-primary-hover)}.devic-gen-tooltip-confirm:disabled{cursor:not-allowed;opacity:.6}.devic-gen-modal-overlay{align-items:center;animation:devic-gen-overlay-fade-in var(--devic-gen-animation-duration) ease-out;background:rgba(0,0,0,.5);display:flex;inset:0;justify-content:center;position:fixed;z-index:var(--devic-gen-z-index)}@keyframes devic-gen-overlay-fade-in{0%{opacity:0}to{opacity:1}}.devic-gen-modal{animation:devic-gen-modal-slide-up var(--devic-gen-animation-duration) ease-out;background:var(--devic-gen-modal-bg);border-radius:calc(var(--devic-gen-radius) + 4px);box-shadow:0 20px 50px rgba(0,0,0,.2);margin:16px;max-width:480px;width:100%}@keyframes devic-gen-modal-slide-up{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.devic-gen-modal-header{align-items:center;border-bottom:1px solid var(--devic-gen-modal-border);display:flex;justify-content:space-between;padding:16px 20px}.devic-gen-modal-title{color:var(--devic-gen-modal-text);font-size:18px;font-weight:600;margin:0}.devic-gen-modal-close{align-items:center;background:transparent;border:none;border-radius:6px;color:var(--devic-gen-text-secondary);cursor:pointer;display:flex;height:32px;justify-content:center;padding:0;transition:all var(--devic-gen-animation-duration) ease;width:32px}.devic-gen-modal-close:hover{background:rgba(0,0,0,.05);color:var(--devic-gen-modal-text)}.devic-gen-modal-description{color:var(--devic-gen-text-secondary);font-size:14px;line-height:1.5;margin:0;padding:12px 20px 0}.devic-gen-modal-body{padding:16px 20px}.devic-gen-modal-footer{border-top:1px solid var(--devic-gen-modal-border);display:flex;gap:12px;justify-content:flex-end;padding:16px 20px}.devic-gen-modal-cancel,.devic-gen-modal-confirm{align-items:center;border-radius:var(--devic-gen-radius);cursor:pointer;display:inline-flex;font-family:inherit;font-size:14px;font-weight:500;gap:8px;padding:10px 20px;transition:all var(--devic-gen-animation-duration) ease}.devic-gen-modal-cancel{background:transparent;border:1px solid var(--devic-gen-modal-border);color:var(--devic-gen-text-secondary)}.devic-gen-modal-cancel:hover{background:rgba(0,0,0,.05);color:var(--devic-gen-modal-text)}.devic-gen-modal-confirm{background:var(--devic-gen-primary);border:none;color:#fff}.devic-gen-modal-confirm:hover:not(:disabled){background:var(--devic-gen-primary-hover)}.devic-gen-modal-confirm:disabled{cursor:not-allowed;opacity:.6}.devic-gen-input::-webkit-scrollbar{width:6px}.devic-gen-input::-webkit-scrollbar-track{background:transparent}.devic-gen-input::-webkit-scrollbar-thumb{background:var(--devic-gen-border);border-radius:3px}.devic-gen-input:disabled{background:var(--devic-gen-border);cursor:not-allowed;opacity:.6}.devic-gen-tool-calls{background:rgba(0,0,0,.02);border:1px solid var(--devic-gen-modal-border);border-radius:var(--devic-gen-radius);display:flex;flex-direction:column;gap:6px;margin-bottom:12px;padding:10px 12px}.devic-gen-tool-item{align-items:center;color:var(--devic-gen-text-secondary);display:flex;font-size:13px;gap:8px}.devic-gen-tool-item[data-status=executing]{color:var(--devic-gen-primary)}.devic-gen-tool-item[data-status=completed] .devic-gen-tool-icon{color:#10b981}.devic-gen-tool-icon{align-items:center;display:flex;flex-shrink:0;height:16px;justify-content:center;width:16px}.devic-gen-tool-icon svg{height:100%;width:100%}.devic-gen-tool-name{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.devic-gen-tool-custom{padding:8px 0}.devic-gen-processing-status{align-items:center;background:rgba(59,130,246,.05);border:1px solid rgba(59,130,246,.2);border-radius:var(--devic-gen-radius);display:flex;gap:8px;margin-bottom:12px;padding:10px 12px}.devic-gen-processing-text{animation:devic-gen-pulse 1.5s ease-in-out infinite;color:var(--devic-gen-primary);font-size:13px}@keyframes devic-gen-pulse{0%,to{opacity:1}50%{opacity:.6}}.devic-aiwrap-container,.devic-aiwrap-tooltip,.devic-aiwrap-trigger-wrapper{--devic-aiwrap-color:#7c3aed;--devic-aiwrap-color-2:#4f46e5;--devic-aiwrap-bg:#fff;--devic-aiwrap-text:#1f2937;--devic-aiwrap-border:#e5e7eb;--devic-aiwrap-shadow:0 8px 24px rgba(0,0,0,.12)}.devic-aiwrap-container[data-highlight=true] .devic-aiwrap-content{background:rgba(124,58,237,.08);border-radius:4px;outline:1px dashed rgba(124,58,237,.45);outline-offset:2px;transition:background .15s ease,outline-color .15s ease}.devic-aiwrap-content{display:inline;transition:background .15s ease}.devic-aiwrap-trigger-wrapper{display:inline-flex}.devic-aiwrap-trigger{align-items:center;background:linear-gradient(90deg,var(--devic-aiwrap-color) 0,var(--devic-aiwrap-color-2) 100%);border:1px solid hsla(0,0%,100%,.25);box-shadow:0 4px 14px rgba(124,58,237,.35);color:#fff;cursor:pointer;display:inline-flex;font-family:inherit;font-size:13px;font-weight:500;gap:6px;padding:6px 12px;transition:transform .12s ease,box-shadow .12s ease;white-space:nowrap}.devic-aiwrap-trigger:hover{box-shadow:0 6px 18px rgba(124,58,237,.45);transform:translateY(-1px)}.devic-aiwrap-trigger:active{transform:translateY(0)}.devic-aiwrap-trigger-icon{align-items:center;display:inline-flex}.devic-aiwrap-trigger-label{line-height:1}.devic-aiwrap-tooltip{background:var(--devic-aiwrap-bg);border:1px solid var(--devic-aiwrap-border);border-radius:12px;box-shadow:var(--devic-aiwrap-shadow);color:var(--devic-aiwrap-text);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-size:14px;overflow:hidden}.devic-aiwrap-tooltip-header{align-items:center;background:rgba(124,58,237,.05);border-bottom:1px solid var(--devic-aiwrap-border);display:flex;gap:8px;justify-content:space-between;padding:10px 12px}.devic-aiwrap-tooltip-label{color:var(--devic-aiwrap-color);font-size:13px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.devic-aiwrap-tooltip-close{align-items:center;background:transparent;border:none;border-radius:4px;color:#6b7280;cursor:pointer;display:inline-flex;padding:2px}.devic-aiwrap-tooltip-close:hover{background:rgba(0,0,0,.06);color:#111827}.devic-aiwrap-tooltip-body{line-height:1.5;max-height:320px;overflow-y:auto;padding:12px}.devic-aiwrap-processing{align-items:center;color:#6b7280;display:flex;font-size:13px;gap:8px}.devic-aiwrap-spinner{animation:devic-aiwrap-spin .7s linear infinite;border:2px solid rgba(124,58,237,.25);border-radius:50%;border-top:2px solid var(--devic-aiwrap-color);flex-shrink:0;height:14px;width:14px}@keyframes devic-aiwrap-spin{to{transform:rotate(1turn)}}.devic-aiwrap-error{color:#dc2626;font-size:13px}.devic-aiwrap-answer{white-space:pre-wrap;word-break:break-word}