@devicai/ui 0.57.0 → 0.59.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 (223) hide show
  1. package/README.md +186 -0
  2. package/dist/cjs/api/assistantInfo.js.map +1 -1
  3. package/dist/cjs/api/client.js +17 -1
  4. package/dist/cjs/api/client.js.map +1 -1
  5. package/dist/cjs/api/types.js.map +1 -1
  6. package/dist/cjs/components/AICommandBar/AICommandBar.js +12 -8
  7. package/dist/cjs/components/AICommandBar/AICommandBar.js.map +1 -1
  8. package/dist/cjs/components/AICommandBar/useAICommandBar.js +12 -6
  9. package/dist/cjs/components/AICommandBar/useAICommandBar.js.map +1 -1
  10. package/dist/cjs/components/AIElementWrapper/AIElementWrapper.js +19 -15
  11. package/dist/cjs/components/AIElementWrapper/AIElementWrapper.js.map +1 -1
  12. package/dist/cjs/components/AIElementWrapper/activeWrapperRegistry.js.map +1 -1
  13. package/dist/cjs/components/AIElementWrapper/useAIElementWrapper.js +12 -6
  14. package/dist/cjs/components/AIElementWrapper/useAIElementWrapper.js.map +1 -1
  15. package/dist/cjs/components/AIGenerationButton/AIGenerationButton.js +13 -7
  16. package/dist/cjs/components/AIGenerationButton/AIGenerationButton.js.map +1 -1
  17. package/dist/cjs/components/AIGenerationButton/useAIGenerationButton.js +11 -5
  18. package/dist/cjs/components/AIGenerationButton/useAIGenerationButton.js.map +1 -1
  19. package/dist/cjs/components/ChatDrawer/ChatDrawer.js +28 -13
  20. package/dist/cjs/components/ChatDrawer/ChatDrawer.js.map +1 -1
  21. package/dist/cjs/components/ChatDrawer/ChatInput.js +21 -15
  22. package/dist/cjs/components/ChatDrawer/ChatInput.js.map +1 -1
  23. package/dist/cjs/components/ChatDrawer/ChatMessages.js +54 -13
  24. package/dist/cjs/components/ChatDrawer/ChatMessages.js.map +1 -1
  25. package/dist/cjs/components/ChatDrawer/CompactionWidget.js +13 -4
  26. package/dist/cjs/components/ChatDrawer/CompactionWidget.js.map +1 -1
  27. package/dist/cjs/components/ChatDrawer/ConversationSelector.js +6 -4
  28. package/dist/cjs/components/ChatDrawer/ConversationSelector.js.map +1 -1
  29. package/dist/cjs/components/ChatDrawer/ErrorBoundary.js.map +1 -1
  30. package/dist/cjs/components/ChatDrawer/GuardrailNotice.js +40 -0
  31. package/dist/cjs/components/ChatDrawer/GuardrailNotice.js.map +1 -0
  32. package/dist/cjs/components/ChatDrawer/HandoffSubagentWidget.js +3 -1
  33. package/dist/cjs/components/ChatDrawer/HandoffSubagentWidget.js.map +1 -1
  34. package/dist/cjs/components/ChatDrawer/LimitBanner.js +19 -9
  35. package/dist/cjs/components/ChatDrawer/LimitBanner.js.map +1 -1
  36. package/dist/cjs/components/ChatDrawer/QueueNotice.js +19 -7
  37. package/dist/cjs/components/ChatDrawer/QueueNotice.js.map +1 -1
  38. package/dist/cjs/components/ChatDrawer/RecalledMemoriesWidget.js +17 -5
  39. package/dist/cjs/components/ChatDrawer/RecalledMemoriesWidget.js.map +1 -1
  40. package/dist/cjs/components/ChatDrawer/ReferenceChip.js +3 -1
  41. package/dist/cjs/components/ChatDrawer/ReferenceChip.js.map +1 -1
  42. package/dist/cjs/components/ChatDrawer/ToolTimeline.js.map +1 -1
  43. package/dist/cjs/components/ChatDrawer/UsageBar.js +23 -18
  44. package/dist/cjs/components/ChatDrawer/UsageBar.js.map +1 -1
  45. package/dist/cjs/components/ChatDrawer/pastedText.js.map +1 -1
  46. package/dist/cjs/components/CoreMemoryModal/CoreMemoryModal.js +20 -9
  47. package/dist/cjs/components/CoreMemoryModal/CoreMemoryModal.js.map +1 -1
  48. package/dist/cjs/components/Feedback/FeedbackModal.js +5 -1
  49. package/dist/cjs/components/Feedback/FeedbackModal.js.map +1 -1
  50. package/dist/cjs/components/Feedback/MessageActions.js +3 -1
  51. package/dist/cjs/components/Feedback/MessageActions.js.map +1 -1
  52. package/dist/cjs/components/IntegrationsModal/ConnectFieldsForm.js +12 -8
  53. package/dist/cjs/components/IntegrationsModal/ConnectFieldsForm.js.map +1 -1
  54. package/dist/cjs/components/IntegrationsModal/IntegrationLogo.js.map +1 -1
  55. package/dist/cjs/components/IntegrationsModal/IntegrationsHint.js +5 -3
  56. package/dist/cjs/components/IntegrationsModal/IntegrationsHint.js.map +1 -1
  57. package/dist/cjs/components/IntegrationsModal/IntegrationsLauncher.js +12 -3
  58. package/dist/cjs/components/IntegrationsModal/IntegrationsLauncher.js.map +1 -1
  59. package/dist/cjs/components/IntegrationsModal/IntegrationsModal.js.map +1 -1
  60. package/dist/cjs/components/IntegrationsModal/IntegrationsPanel.js +34 -24
  61. package/dist/cjs/components/IntegrationsModal/IntegrationsPanel.js.map +1 -1
  62. package/dist/cjs/components/IntegrationsModal/IntegrationsToggle.js +15 -6
  63. package/dist/cjs/components/IntegrationsModal/IntegrationsToggle.js.map +1 -1
  64. package/dist/cjs/components/IntegrationsModal/McpConnectForm.js +15 -7
  65. package/dist/cjs/components/IntegrationsModal/McpConnectForm.js.map +1 -1
  66. package/dist/cjs/components/IntegrationsModal/McpServersSection.js +32 -19
  67. package/dist/cjs/components/IntegrationsModal/McpServersSection.js.map +1 -1
  68. package/dist/cjs/components/IntegrationsModal/integrationChoice.js.map +1 -1
  69. package/dist/cjs/components/IntegrationsModal/useIntegrations.js +3 -1
  70. package/dist/cjs/components/IntegrationsModal/useIntegrations.js.map +1 -1
  71. package/dist/cjs/components/IntegrationsModal/useTenantMcp.js +3 -1
  72. package/dist/cjs/components/IntegrationsModal/useTenantMcp.js.map +1 -1
  73. package/dist/cjs/components/ThreadStateTag/ThreadStateTag.js +63 -40
  74. package/dist/cjs/components/ThreadStateTag/ThreadStateTag.js.map +1 -1
  75. package/dist/cjs/components/theme.js.map +1 -1
  76. package/dist/cjs/hooks/useDevicChat.js +21 -7
  77. package/dist/cjs/hooks/useDevicChat.js.map +1 -1
  78. package/dist/cjs/hooks/useModelInterface.js.map +1 -1
  79. package/dist/cjs/hooks/usePolling.js +117 -7
  80. package/dist/cjs/hooks/usePolling.js.map +1 -1
  81. package/dist/cjs/hooks/useSpeechRecording.js +8 -4
  82. package/dist/cjs/hooks/useSpeechRecording.js.map +1 -1
  83. package/dist/cjs/i18n/translate.js +48 -0
  84. package/dist/cjs/i18n/translate.js.map +1 -0
  85. package/dist/cjs/i18n/useTranslations.js +57 -0
  86. package/dist/cjs/i18n/useTranslations.js.map +1 -0
  87. package/dist/cjs/index.js +11 -0
  88. package/dist/cjs/index.js.map +1 -1
  89. package/dist/cjs/provider/DevicContext.js.map +1 -1
  90. package/dist/cjs/provider/DevicProvider.js +5 -1
  91. package/dist/cjs/provider/DevicProvider.js.map +1 -1
  92. package/dist/cjs/provider/sharedSession.js.map +1 -1
  93. package/dist/cjs/styles.css +1 -1
  94. package/dist/cjs/utils/avatar.js.map +1 -1
  95. package/dist/cjs/utils/consumeChatStream.js +44 -0
  96. package/dist/cjs/utils/consumeChatStream.js.map +1 -0
  97. package/dist/cjs/utils/index.js.map +1 -1
  98. package/dist/cjs/utils/logger.js.map +1 -1
  99. package/dist/cjs/utils/toolGroups.js.map +1 -1
  100. package/dist/esm/api/assistantInfo.js.map +1 -1
  101. package/dist/esm/api/client.d.ts +5 -1
  102. package/dist/esm/api/client.js +17 -1
  103. package/dist/esm/api/client.js.map +1 -1
  104. package/dist/esm/api/types.d.ts +12 -1
  105. package/dist/esm/api/types.js.map +1 -1
  106. package/dist/esm/components/AICommandBar/AICommandBar.js +13 -9
  107. package/dist/esm/components/AICommandBar/AICommandBar.js.map +1 -1
  108. package/dist/esm/components/AICommandBar/AICommandBar.types.d.ts +16 -0
  109. package/dist/esm/components/AICommandBar/useAICommandBar.d.ts +2 -0
  110. package/dist/esm/components/AICommandBar/useAICommandBar.js +13 -7
  111. package/dist/esm/components/AICommandBar/useAICommandBar.js.map +1 -1
  112. package/dist/esm/components/AIElementWrapper/AIElementWrapper.js +19 -15
  113. package/dist/esm/components/AIElementWrapper/AIElementWrapper.js.map +1 -1
  114. package/dist/esm/components/AIElementWrapper/AIElementWrapper.types.d.ts +16 -0
  115. package/dist/esm/components/AIElementWrapper/activeWrapperRegistry.js.map +1 -1
  116. package/dist/esm/components/AIElementWrapper/useAIElementWrapper.d.ts +2 -0
  117. package/dist/esm/components/AIElementWrapper/useAIElementWrapper.js +13 -7
  118. package/dist/esm/components/AIElementWrapper/useAIElementWrapper.js.map +1 -1
  119. package/dist/esm/components/AIGenerationButton/AIGenerationButton.js +14 -8
  120. package/dist/esm/components/AIGenerationButton/AIGenerationButton.js.map +1 -1
  121. package/dist/esm/components/AIGenerationButton/AIGenerationButton.types.d.ts +16 -0
  122. package/dist/esm/components/AIGenerationButton/useAIGenerationButton.d.ts +2 -0
  123. package/dist/esm/components/AIGenerationButton/useAIGenerationButton.js +12 -6
  124. package/dist/esm/components/AIGenerationButton/useAIGenerationButton.js.map +1 -1
  125. package/dist/esm/components/ChatDrawer/ChatDrawer.js +29 -14
  126. package/dist/esm/components/ChatDrawer/ChatDrawer.js.map +1 -1
  127. package/dist/esm/components/ChatDrawer/ChatDrawer.types.d.ts +41 -0
  128. package/dist/esm/components/ChatDrawer/ChatInput.js +21 -15
  129. package/dist/esm/components/ChatDrawer/ChatInput.js.map +1 -1
  130. package/dist/esm/components/ChatDrawer/ChatMessages.d.ts +1 -1
  131. package/dist/esm/components/ChatDrawer/ChatMessages.js +54 -13
  132. package/dist/esm/components/ChatDrawer/ChatMessages.js.map +1 -1
  133. package/dist/esm/components/ChatDrawer/CompactionWidget.js +13 -4
  134. package/dist/esm/components/ChatDrawer/CompactionWidget.js.map +1 -1
  135. package/dist/esm/components/ChatDrawer/ConversationSelector.js +6 -4
  136. package/dist/esm/components/ChatDrawer/ConversationSelector.js.map +1 -1
  137. package/dist/esm/components/ChatDrawer/ErrorBoundary.js.map +1 -1
  138. package/dist/esm/components/ChatDrawer/GuardrailNotice.d.ts +36 -0
  139. package/dist/esm/components/ChatDrawer/GuardrailNotice.js +38 -0
  140. package/dist/esm/components/ChatDrawer/GuardrailNotice.js.map +1 -0
  141. package/dist/esm/components/ChatDrawer/HandoffSubagentWidget.js +3 -1
  142. package/dist/esm/components/ChatDrawer/HandoffSubagentWidget.js.map +1 -1
  143. package/dist/esm/components/ChatDrawer/LimitBanner.js +19 -9
  144. package/dist/esm/components/ChatDrawer/LimitBanner.js.map +1 -1
  145. package/dist/esm/components/ChatDrawer/QueueNotice.js +19 -7
  146. package/dist/esm/components/ChatDrawer/QueueNotice.js.map +1 -1
  147. package/dist/esm/components/ChatDrawer/RecalledMemoriesWidget.js +17 -5
  148. package/dist/esm/components/ChatDrawer/RecalledMemoriesWidget.js.map +1 -1
  149. package/dist/esm/components/ChatDrawer/ReferenceChip.js +3 -1
  150. package/dist/esm/components/ChatDrawer/ReferenceChip.js.map +1 -1
  151. package/dist/esm/components/ChatDrawer/ToolTimeline.js.map +1 -1
  152. package/dist/esm/components/ChatDrawer/UsageBar.js +23 -18
  153. package/dist/esm/components/ChatDrawer/UsageBar.js.map +1 -1
  154. package/dist/esm/components/ChatDrawer/index.d.ts +2 -0
  155. package/dist/esm/components/ChatDrawer/pastedText.js.map +1 -1
  156. package/dist/esm/components/CoreMemoryModal/CoreMemoryModal.js +20 -9
  157. package/dist/esm/components/CoreMemoryModal/CoreMemoryModal.js.map +1 -1
  158. package/dist/esm/components/Feedback/FeedbackModal.js +5 -1
  159. package/dist/esm/components/Feedback/FeedbackModal.js.map +1 -1
  160. package/dist/esm/components/Feedback/MessageActions.js +3 -1
  161. package/dist/esm/components/Feedback/MessageActions.js.map +1 -1
  162. package/dist/esm/components/IntegrationsModal/ConnectFieldsForm.js +12 -8
  163. package/dist/esm/components/IntegrationsModal/ConnectFieldsForm.js.map +1 -1
  164. package/dist/esm/components/IntegrationsModal/IntegrationLogo.js.map +1 -1
  165. package/dist/esm/components/IntegrationsModal/IntegrationsHint.js +5 -3
  166. package/dist/esm/components/IntegrationsModal/IntegrationsHint.js.map +1 -1
  167. package/dist/esm/components/IntegrationsModal/IntegrationsLauncher.js +12 -3
  168. package/dist/esm/components/IntegrationsModal/IntegrationsLauncher.js.map +1 -1
  169. package/dist/esm/components/IntegrationsModal/IntegrationsModal.js.map +1 -1
  170. package/dist/esm/components/IntegrationsModal/IntegrationsPanel.d.ts +1 -1
  171. package/dist/esm/components/IntegrationsModal/IntegrationsPanel.js +34 -24
  172. package/dist/esm/components/IntegrationsModal/IntegrationsPanel.js.map +1 -1
  173. package/dist/esm/components/IntegrationsModal/IntegrationsToggle.d.ts +1 -1
  174. package/dist/esm/components/IntegrationsModal/IntegrationsToggle.js +15 -6
  175. package/dist/esm/components/IntegrationsModal/IntegrationsToggle.js.map +1 -1
  176. package/dist/esm/components/IntegrationsModal/McpConnectForm.js +15 -7
  177. package/dist/esm/components/IntegrationsModal/McpConnectForm.js.map +1 -1
  178. package/dist/esm/components/IntegrationsModal/McpServersSection.js +32 -19
  179. package/dist/esm/components/IntegrationsModal/McpServersSection.js.map +1 -1
  180. package/dist/esm/components/IntegrationsModal/integrationChoice.js.map +1 -1
  181. package/dist/esm/components/IntegrationsModal/useIntegrations.js +3 -1
  182. package/dist/esm/components/IntegrationsModal/useIntegrations.js.map +1 -1
  183. package/dist/esm/components/IntegrationsModal/useTenantMcp.js +3 -1
  184. package/dist/esm/components/IntegrationsModal/useTenantMcp.js.map +1 -1
  185. package/dist/esm/components/ThreadStateTag/ThreadStateTag.js +63 -40
  186. package/dist/esm/components/ThreadStateTag/ThreadStateTag.js.map +1 -1
  187. package/dist/esm/components/theme.js.map +1 -1
  188. package/dist/esm/hooks/index.d.ts +1 -1
  189. package/dist/esm/hooks/useDevicChat.d.ts +6 -0
  190. package/dist/esm/hooks/useDevicChat.js +23 -9
  191. package/dist/esm/hooks/useDevicChat.js.map +1 -1
  192. package/dist/esm/hooks/useModelInterface.js.map +1 -1
  193. package/dist/esm/hooks/usePolling.d.ts +35 -0
  194. package/dist/esm/hooks/usePolling.js +114 -8
  195. package/dist/esm/hooks/usePolling.js.map +1 -1
  196. package/dist/esm/hooks/useSpeechRecording.js +8 -4
  197. package/dist/esm/hooks/useSpeechRecording.js.map +1 -1
  198. package/dist/esm/i18n/index.d.ts +4 -0
  199. package/dist/esm/i18n/translate.d.ts +23 -0
  200. package/dist/esm/i18n/translate.js +43 -0
  201. package/dist/esm/i18n/translate.js.map +1 -0
  202. package/dist/esm/i18n/types.d.ts +27 -0
  203. package/dist/esm/i18n/useTranslations.d.ts +32 -0
  204. package/dist/esm/i18n/useTranslations.js +53 -0
  205. package/dist/esm/i18n/useTranslations.js.map +1 -0
  206. package/dist/esm/index.d.ts +4 -2
  207. package/dist/esm/index.js +3 -0
  208. package/dist/esm/index.js.map +1 -1
  209. package/dist/esm/provider/DevicContext.js.map +1 -1
  210. package/dist/esm/provider/DevicProvider.d.ts +1 -1
  211. package/dist/esm/provider/DevicProvider.js +5 -1
  212. package/dist/esm/provider/DevicProvider.js.map +1 -1
  213. package/dist/esm/provider/sharedSession.js.map +1 -1
  214. package/dist/esm/provider/types.d.ts +51 -0
  215. package/dist/esm/styles.css +1 -1
  216. package/dist/esm/utils/avatar.js.map +1 -1
  217. package/dist/esm/utils/consumeChatStream.d.ts +6 -0
  218. package/dist/esm/utils/consumeChatStream.js +42 -0
  219. package/dist/esm/utils/consumeChatStream.js.map +1 -0
  220. package/dist/esm/utils/index.js.map +1 -1
  221. package/dist/esm/utils/logger.js.map +1 -1
  222. package/dist/esm/utils/toolGroups.js.map +1 -1
  223. package/package.json +3 -1
@@ -1 +1 @@
1
- {"version":3,"file":"DevicContext.js","sources":["../../../../src/provider/DevicContext.ts"],"sourcesContent":["import { createContext, useContext } from 'react';\nimport type { DevicContextValue } from './types';\n\n/**\n * Context for Devic configuration\n */\nexport const DevicContext = createContext<DevicContextValue | null>(null);\n\n/**\n * Hook to access the Devic context\n * @throws Error if used outside of DevicProvider\n */\nexport function useDevicContext(): DevicContextValue {\n const context = useContext(DevicContext);\n if (!context) {\n throw new Error(\n 'useDevicContext must be used within a DevicProvider. ' +\n 'Make sure to wrap your component tree with <DevicProvider>.'\n );\n }\n return context;\n}\n\n/**\n * Hook to optionally access the Devic context\n * Returns null if not within a provider (for components that can work standalone)\n */\nexport function useOptionalDevicContext(): DevicContextValue | null {\n return useContext(DevicContext);\n}\n"],"names":["createContext","useContext"],"mappings":";;;;AAGA;;AAEG;MACU,YAAY,GAAGA,mBAAa,CAA2B,IAAI;AAExE;;;AAGG;SACa,eAAe,GAAA;AAC7B,IAAA,MAAM,OAAO,GAAGC,gBAAU,CAAC,YAAY,CAAC;IACxC,IAAI,CAAC,OAAO,EAAE;QACZ,MAAM,IAAI,KAAK,CACb,uDAAuD;AACvD,YAAA,6DAA6D,CAC9D;IACH;AACA,IAAA,OAAO,OAAO;AAChB;AAEA;;;AAGG;SACa,uBAAuB,GAAA;AACrC,IAAA,OAAOA,gBAAU,CAAC,YAAY,CAAC;AACjC;;;;"}
1
+ {"version":3,"file":"DevicContext.js","sources":["../../../../src/provider/DevicContext.ts"],"sourcesContent":["import { createContext, useContext } from 'react';\nimport type { DevicContextValue } from './types';\n\n/**\n * Context for Devic configuration\n */\nexport const DevicContext = createContext<DevicContextValue | null>(null);\n\n/**\n * Hook to access the Devic context\n * @throws Error if used outside of DevicProvider\n */\nexport function useDevicContext(): DevicContextValue {\n const context = useContext(DevicContext);\n if (!context) {\n throw new Error(\n 'useDevicContext must be used within a DevicProvider. ' +\n 'Make sure to wrap your component tree with <DevicProvider>.'\n );\n }\n return context;\n}\n\n/**\n * Hook to optionally access the Devic context\n * Returns null if not within a provider (for components that can work standalone)\n */\nexport function useOptionalDevicContext(): DevicContextValue | null {\n return useContext(DevicContext);\n}\n"],"names":["createContext","useContext"],"mappings":";;;;AAGA;;AAEG;MACU,YAAY,GAAGA,mBAAa,CAA2B,IAAI;AAExE;;;AAGG;SACa,eAAe,GAAA;AAC7B,IAAA,MAAM,OAAO,GAAGC,gBAAU,CAAC,YAAY,CAAC;IACxC,IAAI,CAAC,OAAO,EAAE;QACZ,MAAM,IAAI,KAAK,CACb,uDAAuD;AACvD,YAAA,6DAA6D,CAC9D;IACH;AACA,IAAA,OAAO,OAAO;AAChB;AAEA;;;AAGG;SACa,uBAAuB,GAAA;AACrC,IAAA,OAAOA,gBAAU,CAAC,YAAY,CAAC;AACjC;;;;;;"}
@@ -23,7 +23,7 @@ const DEFAULT_BASE_URL = 'https://api.devic.ai';
23
23
  * </DevicProvider>
24
24
  * ```
25
25
  */
26
- function DevicProvider({ apiKey, getTenantSession, onSessionExpired, baseUrl = DEFAULT_BASE_URL, tenantId, tenantMetadata, subtenantId, subtenantMetadata, tags, pollingInterval, debug, children, }) {
26
+ function DevicProvider({ apiKey, getTenantSession, onSessionExpired, baseUrl = DEFAULT_BASE_URL, tenantId, tenantMetadata, subtenantId, subtenantMetadata, tags, pollingInterval, streaming, translations, debug, children, }) {
27
27
  const [references, setReferences] = React.useState([]);
28
28
  const drawerRef = React.useRef(null);
29
29
  const addReference = React.useCallback((ref) => {
@@ -83,6 +83,8 @@ function DevicProvider({ apiKey, getTenantSession, onSessionExpired, baseUrl = D
83
83
  subtenantMetadata,
84
84
  tags,
85
85
  pollingInterval,
86
+ streaming,
87
+ translations,
86
88
  isConfigured: !!apiKey || usesSessions,
87
89
  debug,
88
90
  references,
@@ -104,6 +106,8 @@ function DevicProvider({ apiKey, getTenantSession, onSessionExpired, baseUrl = D
104
106
  subtenantMetadata,
105
107
  tags,
106
108
  pollingInterval,
109
+ streaming,
110
+ translations,
107
111
  debug,
108
112
  references,
109
113
  addReference,
@@ -1 +1 @@
1
- {"version":3,"file":"DevicProvider.js","sources":["../../../../src/provider/DevicProvider.tsx"],"sourcesContent":["import React, { useMemo, useState, useRef, useCallback } from 'react';\nimport { DevicContext } from './DevicContext';\nimport { DevicApiClient } from '../api/client';\nimport { createSharedSession } from './sharedSession';\nimport { generateId } from '../utils';\nimport type {\n DevicProviderProps,\n DevicContextValue,\n AIReference,\n DrawerRegistration,\n} from './types';\n\nconst DEFAULT_BASE_URL = 'https://api.devic.ai';\n\n/**\n * Provider component for Devic UI configuration\n *\n * @example\n * ```tsx\n * <DevicProvider\n * apiKey=\"devic-xxx\"\n * baseUrl=\"https://api.devic.ai\"\n * tenantId=\"tenant-123\"\n * tenantMetadata={{ userId: '456' }}\n * >\n * <App />\n * </DevicProvider>\n * ```\n */\nexport function DevicProvider({\n apiKey,\n getTenantSession,\n onSessionExpired,\n baseUrl = DEFAULT_BASE_URL,\n tenantId,\n tenantMetadata,\n subtenantId,\n subtenantMetadata,\n tags,\n pollingInterval,\n debug,\n children,\n}: DevicProviderProps): JSX.Element {\n const [references, setReferences] = useState<AIReference[]>([]);\n const drawerRef = useRef<DrawerRegistration | null>(null);\n\n const addReference = useCallback((ref: Omit<AIReference, 'id'>): string => {\n const id = generateId();\n setReferences((prev) => [...prev, { ...ref, id }]);\n return id;\n }, []);\n\n const removeReference = useCallback((id: string) => {\n setReferences((prev) => prev.filter((r) => r.id !== id));\n }, []);\n\n const clearReferences = useCallback(() => {\n setReferences([]);\n }, []);\n\n const registerDrawer = useCallback((handle: DrawerRegistration) => {\n drawerRef.current = handle;\n return () => {\n if (drawerRef.current === handle) {\n drawerRef.current = null;\n }\n };\n }, []);\n\n const openDrawer = useCallback(() => {\n drawerRef.current?.open();\n }, []);\n\n // Both callbacks are read through a ref and handed on as stable wrappers.\n // An inline `getTenantSession={() => …}` is a new function on every render,\n // and passing it straight through would rebuild the client — throwing away\n // the session it holds, so the page fetches a token per render — and rebuild\n // the context, so every component below it would do the same.\n const sessionSourceRef = useRef(getTenantSession);\n sessionSourceRef.current = getTenantSession;\n const expiredRef = useRef(onSessionExpired);\n expiredRef.current = onSessionExpired;\n const usesSessions = !!getTenantSession;\n\n // One session for the whole tree: every component below builds its own API\n // client, and each dedupes only its own renewals — so without this, N clients\n // ask for N tokens. See `createSharedSession`.\n const tenantSession = useMemo(\n () =>\n usesSessions\n ? createSharedSession(() => sessionSourceRef.current!())\n : undefined,\n [usesSessions]\n );\n const sessionExpired = useMemo(() => () => expiredRef.current?.(), []);\n\n const client = useMemo(\n () =>\n new DevicApiClient({\n apiKey,\n baseUrl,\n getTenantSession: tenantSession,\n onSessionExpired: sessionExpired,\n }),\n [apiKey, baseUrl, tenantSession, sessionExpired]\n );\n\n const contextValue = useMemo<DevicContextValue>(\n () => ({\n client,\n apiKey,\n getTenantSession: tenantSession,\n onSessionExpired: sessionExpired,\n baseUrl,\n tenantId,\n tenantMetadata,\n subtenantId,\n subtenantMetadata,\n tags,\n pollingInterval,\n isConfigured: !!apiKey || usesSessions,\n debug,\n references,\n addReference,\n removeReference,\n clearReferences,\n registerDrawer,\n openDrawer,\n }),\n [\n client,\n apiKey,\n tenantSession,\n sessionExpired,\n usesSessions,\n baseUrl,\n tenantId,\n tenantMetadata,\n subtenantId,\n subtenantMetadata,\n tags,\n pollingInterval,\n debug,\n references,\n addReference,\n removeReference,\n clearReferences,\n registerDrawer,\n openDrawer,\n ]\n );\n\n return (\n <DevicContext.Provider value={contextValue}>\n {children}\n </DevicContext.Provider>\n );\n}\n"],"names":["useState","useRef","useCallback","generateId","useMemo","createSharedSession","client","DevicApiClient","_jsx","DevicContext"],"mappings":";;;;;;;;;AAYA,MAAM,gBAAgB,GAAG,sBAAsB;AAE/C;;;;;;;;;;;;;;AAcG;AACG,SAAU,aAAa,CAAC,EAC5B,MAAM,EACN,gBAAgB,EAChB,gBAAgB,EAChB,OAAO,GAAG,gBAAgB,EAC1B,QAAQ,EACR,cAAc,EACd,WAAW,EACX,iBAAiB,EACjB,IAAI,EACJ,eAAe,EACf,KAAK,EACL,QAAQ,GACW,EAAA;IACnB,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAGA,cAAQ,CAAgB,EAAE,CAAC;AAC/D,IAAA,MAAM,SAAS,GAAGC,YAAM,CAA4B,IAAI,CAAC;AAEzD,IAAA,MAAM,YAAY,GAAGC,iBAAW,CAAC,CAAC,GAA4B,KAAY;AACxE,QAAA,MAAM,EAAE,GAAGC,gBAAU,EAAE;AACvB,QAAA,aAAa,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,IAAI,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;AAClD,QAAA,OAAO,EAAE;IACX,CAAC,EAAE,EAAE,CAAC;AAEN,IAAA,MAAM,eAAe,GAAGD,iBAAW,CAAC,CAAC,EAAU,KAAI;QACjD,aAAa,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1D,CAAC,EAAE,EAAE,CAAC;AAEN,IAAA,MAAM,eAAe,GAAGA,iBAAW,CAAC,MAAK;QACvC,aAAa,CAAC,EAAE,CAAC;IACnB,CAAC,EAAE,EAAE,CAAC;AAEN,IAAA,MAAM,cAAc,GAAGA,iBAAW,CAAC,CAAC,MAA0B,KAAI;AAChE,QAAA,SAAS,CAAC,OAAO,GAAG,MAAM;AAC1B,QAAA,OAAO,MAAK;AACV,YAAA,IAAI,SAAS,CAAC,OAAO,KAAK,MAAM,EAAE;AAChC,gBAAA,SAAS,CAAC,OAAO,GAAG,IAAI;YAC1B;AACF,QAAA,CAAC;IACH,CAAC,EAAE,EAAE,CAAC;AAEN,IAAA,MAAM,UAAU,GAAGA,iBAAW,CAAC,MAAK;AAClC,QAAA,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE;IAC3B,CAAC,EAAE,EAAE,CAAC;;;;;;AAON,IAAA,MAAM,gBAAgB,GAAGD,YAAM,CAAC,gBAAgB,CAAC;AACjD,IAAA,gBAAgB,CAAC,OAAO,GAAG,gBAAgB;AAC3C,IAAA,MAAM,UAAU,GAAGA,YAAM,CAAC,gBAAgB,CAAC;AAC3C,IAAA,UAAU,CAAC,OAAO,GAAG,gBAAgB;AACrC,IAAA,MAAM,YAAY,GAAG,CAAC,CAAC,gBAAgB;;;;AAKvC,IAAA,MAAM,aAAa,GAAGG,aAAO,CAC3B,MACE;UACIC,iCAAmB,CAAC,MAAM,gBAAgB,CAAC,OAAQ,EAAE;AACvD,UAAE,SAAS,EACf,CAAC,YAAY,CAAC,CACf;AACD,IAAA,MAAM,cAAc,GAAGD,aAAO,CAAC,MAAM,MAAM,UAAU,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;IAEtE,MAAME,QAAM,GAAGF,aAAO,CACpB,MACE,IAAIG,qBAAc,CAAC;QACjB,MAAM;QACN,OAAO;AACP,QAAA,gBAAgB,EAAE,aAAa;AAC/B,QAAA,gBAAgB,EAAE,cAAc;KACjC,CAAC,EACJ,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,cAAc,CAAC,CACjD;AAED,IAAA,MAAM,YAAY,GAAGH,aAAO,CAC1B,OAAO;gBACLE,QAAM;QACN,MAAM;AACN,QAAA,gBAAgB,EAAE,aAAa;AAC/B,QAAA,gBAAgB,EAAE,cAAc;QAChC,OAAO;QACP,QAAQ;QACR,cAAc;QACd,WAAW;QACX,iBAAiB;QACjB,IAAI;QACJ,eAAe;AACf,QAAA,YAAY,EAAE,CAAC,CAAC,MAAM,IAAI,YAAY;QACtC,KAAK;QACL,UAAU;QACV,YAAY;QACZ,eAAe;QACf,eAAe;QACf,cAAc;QACd,UAAU;AACX,KAAA,CAAC,EACF;QACEA,QAAM;QACN,MAAM;QACN,aAAa;QACb,cAAc;QACd,YAAY;QACZ,OAAO;QACP,QAAQ;QACR,cAAc;QACd,WAAW;QACX,iBAAiB;QACjB,IAAI;QACJ,eAAe;QACf,KAAK;QACL,UAAU;QACV,YAAY;QACZ,eAAe;QACf,eAAe;QACf,cAAc;QACd,UAAU;AACX,KAAA,CACF;AAED,IAAA,QACEE,cAAA,CAACC,yBAAY,CAAC,QAAQ,EAAA,EAAC,KAAK,EAAE,YAAY,EAAA,QAAA,EACvC,QAAQ,EAAA,CACa;AAE5B;;"}
1
+ {"version":3,"file":"DevicProvider.js","sources":["../../../../src/provider/DevicProvider.tsx"],"sourcesContent":["import React, { useMemo, useState, useRef, useCallback } from 'react';\nimport { DevicContext } from './DevicContext';\nimport { DevicApiClient } from '../api/client';\nimport { createSharedSession } from './sharedSession';\nimport { generateId } from '../utils';\nimport type {\n DevicProviderProps,\n DevicContextValue,\n AIReference,\n DrawerRegistration,\n} from './types';\n\nconst DEFAULT_BASE_URL = 'https://api.devic.ai';\n\n/**\n * Provider component for Devic UI configuration\n *\n * @example\n * ```tsx\n * <DevicProvider\n * apiKey=\"devic-xxx\"\n * baseUrl=\"https://api.devic.ai\"\n * tenantId=\"tenant-123\"\n * tenantMetadata={{ userId: '456' }}\n * >\n * <App />\n * </DevicProvider>\n * ```\n */\nexport function DevicProvider({\n apiKey,\n getTenantSession,\n onSessionExpired,\n baseUrl = DEFAULT_BASE_URL,\n tenantId,\n tenantMetadata,\n subtenantId,\n subtenantMetadata,\n tags,\n pollingInterval,\n streaming,\n translations,\n debug,\n children,\n}: DevicProviderProps): JSX.Element {\n const [references, setReferences] = useState<AIReference[]>([]);\n const drawerRef = useRef<DrawerRegistration | null>(null);\n\n const addReference = useCallback((ref: Omit<AIReference, 'id'>): string => {\n const id = generateId();\n setReferences((prev) => [...prev, { ...ref, id }]);\n return id;\n }, []);\n\n const removeReference = useCallback((id: string) => {\n setReferences((prev) => prev.filter((r) => r.id !== id));\n }, []);\n\n const clearReferences = useCallback(() => {\n setReferences([]);\n }, []);\n\n const registerDrawer = useCallback((handle: DrawerRegistration) => {\n drawerRef.current = handle;\n return () => {\n if (drawerRef.current === handle) {\n drawerRef.current = null;\n }\n };\n }, []);\n\n const openDrawer = useCallback(() => {\n drawerRef.current?.open();\n }, []);\n\n // Both callbacks are read through a ref and handed on as stable wrappers.\n // An inline `getTenantSession={() => …}` is a new function on every render,\n // and passing it straight through would rebuild the client — throwing away\n // the session it holds, so the page fetches a token per render — and rebuild\n // the context, so every component below it would do the same.\n const sessionSourceRef = useRef(getTenantSession);\n sessionSourceRef.current = getTenantSession;\n const expiredRef = useRef(onSessionExpired);\n expiredRef.current = onSessionExpired;\n const usesSessions = !!getTenantSession;\n\n // One session for the whole tree: every component below builds its own API\n // client, and each dedupes only its own renewals — so without this, N clients\n // ask for N tokens. See `createSharedSession`.\n const tenantSession = useMemo(\n () =>\n usesSessions\n ? createSharedSession(() => sessionSourceRef.current!())\n : undefined,\n [usesSessions]\n );\n const sessionExpired = useMemo(() => () => expiredRef.current?.(), []);\n\n const client = useMemo(\n () =>\n new DevicApiClient({\n apiKey,\n baseUrl,\n getTenantSession: tenantSession,\n onSessionExpired: sessionExpired,\n }),\n [apiKey, baseUrl, tenantSession, sessionExpired]\n );\n\n const contextValue = useMemo<DevicContextValue>(\n () => ({\n client,\n apiKey,\n getTenantSession: tenantSession,\n onSessionExpired: sessionExpired,\n baseUrl,\n tenantId,\n tenantMetadata,\n subtenantId,\n subtenantMetadata,\n tags,\n pollingInterval,\n streaming,\n translations,\n isConfigured: !!apiKey || usesSessions,\n debug,\n references,\n addReference,\n removeReference,\n clearReferences,\n registerDrawer,\n openDrawer,\n }),\n [\n client,\n apiKey,\n tenantSession,\n sessionExpired,\n usesSessions,\n baseUrl,\n tenantId,\n tenantMetadata,\n subtenantId,\n subtenantMetadata,\n tags,\n pollingInterval,\n streaming,\n translations,\n debug,\n references,\n addReference,\n removeReference,\n clearReferences,\n registerDrawer,\n openDrawer,\n ]\n );\n\n return (\n <DevicContext.Provider value={contextValue}>\n {children}\n </DevicContext.Provider>\n );\n}\n"],"names":["useState","useRef","useCallback","generateId","useMemo","createSharedSession","client","DevicApiClient","_jsx","DevicContext"],"mappings":";;;;;;;;;AAYA,MAAM,gBAAgB,GAAG,sBAAsB;AAE/C;;;;;;;;;;;;;;AAcG;AACG,SAAU,aAAa,CAAC,EAC5B,MAAM,EACN,gBAAgB,EAChB,gBAAgB,EAChB,OAAO,GAAG,gBAAgB,EAC1B,QAAQ,EACR,cAAc,EACd,WAAW,EACX,iBAAiB,EACjB,IAAI,EACJ,eAAe,EACf,SAAS,EACT,YAAY,EACZ,KAAK,EACL,QAAQ,GACW,EAAA;IACnB,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAGA,cAAQ,CAAgB,EAAE,CAAC;AAC/D,IAAA,MAAM,SAAS,GAAGC,YAAM,CAA4B,IAAI,CAAC;AAEzD,IAAA,MAAM,YAAY,GAAGC,iBAAW,CAAC,CAAC,GAA4B,KAAY;AACxE,QAAA,MAAM,EAAE,GAAGC,gBAAU,EAAE;AACvB,QAAA,aAAa,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,IAAI,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;AAClD,QAAA,OAAO,EAAE;IACX,CAAC,EAAE,EAAE,CAAC;AAEN,IAAA,MAAM,eAAe,GAAGD,iBAAW,CAAC,CAAC,EAAU,KAAI;QACjD,aAAa,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1D,CAAC,EAAE,EAAE,CAAC;AAEN,IAAA,MAAM,eAAe,GAAGA,iBAAW,CAAC,MAAK;QACvC,aAAa,CAAC,EAAE,CAAC;IACnB,CAAC,EAAE,EAAE,CAAC;AAEN,IAAA,MAAM,cAAc,GAAGA,iBAAW,CAAC,CAAC,MAA0B,KAAI;AAChE,QAAA,SAAS,CAAC,OAAO,GAAG,MAAM;AAC1B,QAAA,OAAO,MAAK;AACV,YAAA,IAAI,SAAS,CAAC,OAAO,KAAK,MAAM,EAAE;AAChC,gBAAA,SAAS,CAAC,OAAO,GAAG,IAAI;YAC1B;AACF,QAAA,CAAC;IACH,CAAC,EAAE,EAAE,CAAC;AAEN,IAAA,MAAM,UAAU,GAAGA,iBAAW,CAAC,MAAK;AAClC,QAAA,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE;IAC3B,CAAC,EAAE,EAAE,CAAC;;;;;;AAON,IAAA,MAAM,gBAAgB,GAAGD,YAAM,CAAC,gBAAgB,CAAC;AACjD,IAAA,gBAAgB,CAAC,OAAO,GAAG,gBAAgB;AAC3C,IAAA,MAAM,UAAU,GAAGA,YAAM,CAAC,gBAAgB,CAAC;AAC3C,IAAA,UAAU,CAAC,OAAO,GAAG,gBAAgB;AACrC,IAAA,MAAM,YAAY,GAAG,CAAC,CAAC,gBAAgB;;;;AAKvC,IAAA,MAAM,aAAa,GAAGG,aAAO,CAC3B,MACE;UACIC,iCAAmB,CAAC,MAAM,gBAAgB,CAAC,OAAQ,EAAE;AACvD,UAAE,SAAS,EACf,CAAC,YAAY,CAAC,CACf;AACD,IAAA,MAAM,cAAc,GAAGD,aAAO,CAAC,MAAM,MAAM,UAAU,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;IAEtE,MAAME,QAAM,GAAGF,aAAO,CACpB,MACE,IAAIG,qBAAc,CAAC;QACjB,MAAM;QACN,OAAO;AACP,QAAA,gBAAgB,EAAE,aAAa;AAC/B,QAAA,gBAAgB,EAAE,cAAc;KACjC,CAAC,EACJ,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,cAAc,CAAC,CACjD;AAED,IAAA,MAAM,YAAY,GAAGH,aAAO,CAC1B,OAAO;gBACLE,QAAM;QACN,MAAM;AACN,QAAA,gBAAgB,EAAE,aAAa;AAC/B,QAAA,gBAAgB,EAAE,cAAc;QAChC,OAAO;QACP,QAAQ;QACR,cAAc;QACd,WAAW;QACX,iBAAiB;QACjB,IAAI;QACJ,eAAe;QACf,SAAS;QACT,YAAY;AACZ,QAAA,YAAY,EAAE,CAAC,CAAC,MAAM,IAAI,YAAY;QACtC,KAAK;QACL,UAAU;QACV,YAAY;QACZ,eAAe;QACf,eAAe;QACf,cAAc;QACd,UAAU;AACX,KAAA,CAAC,EACF;QACEA,QAAM;QACN,MAAM;QACN,aAAa;QACb,cAAc;QACd,YAAY;QACZ,OAAO;QACP,QAAQ;QACR,cAAc;QACd,WAAW;QACX,iBAAiB;QACjB,IAAI;QACJ,eAAe;QACf,SAAS;QACT,YAAY;QACZ,KAAK;QACL,UAAU;QACV,YAAY;QACZ,eAAe;QACf,eAAe;QACf,cAAc;QACd,UAAU;AACX,KAAA,CACF;AAED,IAAA,QACEE,cAAA,CAACC,yBAAY,CAAC,QAAQ,EAAA,EAAC,KAAK,EAAE,YAAY,EAAA,QAAA,EACvC,QAAQ,EAAA,CACa;AAE5B;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"sharedSession.js","sources":["../../../../src/provider/sharedSession.ts"],"sourcesContent":["import type { TenantSessionToken } from '../api/client';\n\n/**\n * Renew this long before expiry. A little wider than the client's own margin,\n * so the sharing decides when to renew and the clients find a live token rather\n * than each reaching for one.\n */\nconst RENEWAL_MARGIN_MS = 90_000;\n\n/** The `exp` inside a JWT, in epoch ms. Unknown when it cannot be read. */\nfunction expiryOf(token: string): number | undefined {\n try {\n const payload = token.split('.')[1];\n if (!payload) return undefined;\n const json = atob(payload.replace(/-/g, '+').replace(/_/g, '/'));\n const exp = JSON.parse(json)?.exp;\n return typeof exp === 'number' ? exp * 1000 : undefined;\n } catch {\n return undefined;\n }\n}\n\n/** Whatever the integrator returned, as a token with an expiry we can compare. */\nexport function normaliseSession(\n result: string | TenantSessionToken,\n): TenantSessionToken {\n if (typeof result === 'string') {\n return { token: result, expiresAt: expiryOf(result) };\n }\n const declared =\n result.expiresAt ??\n (result.expiresIn ? Date.now() + result.expiresIn * 1000 : undefined);\n return { ...result, expiresAt: declared ?? expiryOf(result.token) };\n}\n\n/**\n * One session for a whole tree of components.\n *\n * Every component in this library builds its own API client, and each of those\n * dedupes only its own renewals — so N clients ask for N tokens. Opening the\n * drawer fired three requests at the integrator's backend before anyone had\n * said a word. The sharing belongs where there is exactly one of something,\n * which is the provider, and not in each client, where there is not.\n *\n * `force` is what a client passes after the API refused the token it just used.\n * The cached answer is then known to be dead, so it is skipped: without that, a\n * shared cache would hand the refused token straight back and turn a\n * recoverable 401 into a widget that never speaks again.\n */\nexport function createSharedSession(\n source: () => Promise<string | TenantSessionToken>,\n): (force?: boolean) => Promise<TenantSessionToken> {\n let value: TenantSessionToken | undefined;\n let inFlight: Promise<TenantSessionToken> | undefined;\n\n return (force = false) => {\n const stillGood =\n value &&\n (value.expiresAt === undefined ||\n value.expiresAt - Date.now() > RENEWAL_MARGIN_MS);\n if (stillGood && !force) return Promise.resolve(value!);\n\n if (!inFlight) {\n inFlight = Promise.resolve(source())\n .then((result) => {\n value = normaliseSession(result);\n return value;\n })\n .finally(() => {\n inFlight = undefined;\n });\n }\n return inFlight;\n };\n}\n"],"names":[],"mappings":";;AAEA;;;;AAIG;AACH,MAAM,iBAAiB,GAAG,KAAM;AAEhC;AACA,SAAS,QAAQ,CAAC,KAAa,EAAA;AAC7B,IAAA,IAAI;QACF,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACnC,QAAA,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,SAAS;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAChE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG;AACjC,QAAA,OAAO,OAAO,GAAG,KAAK,QAAQ,GAAG,GAAG,GAAG,IAAI,GAAG,SAAS;IACzD;AAAE,IAAA,MAAM;AACN,QAAA,OAAO,SAAS;IAClB;AACF;AAEA;AACM,SAAU,gBAAgB,CAC9B,MAAmC,EAAA;AAEnC,IAAA,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;AAC9B,QAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE;IACvD;AACA,IAAA,MAAM,QAAQ,GACZ,MAAM,CAAC,SAAS;SACf,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,SAAS,GAAG,IAAI,GAAG,SAAS,CAAC;AACvE,IAAA,OAAO,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,QAAQ,IAAI,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;AACrE;AAEA;;;;;;;;;;;;;AAaG;AACG,SAAU,mBAAmB,CACjC,MAAkD,EAAA;AAElD,IAAA,IAAI,KAAqC;AACzC,IAAA,IAAI,QAAiD;AAErD,IAAA,OAAO,CAAC,KAAK,GAAG,KAAK,KAAI;QACvB,MAAM,SAAS,GACb,KAAK;AACL,aAAC,KAAK,CAAC,SAAS,KAAK,SAAS;gBAC5B,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,iBAAiB,CAAC;QACrD,IAAI,SAAS,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,OAAO,CAAC,OAAO,CAAC,KAAM,CAAC;QAEvD,IAAI,CAAC,QAAQ,EAAE;AACb,YAAA,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE;AAChC,iBAAA,IAAI,CAAC,CAAC,MAAM,KAAI;AACf,gBAAA,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC;AAChC,gBAAA,OAAO,KAAK;AACd,YAAA,CAAC;iBACA,OAAO,CAAC,MAAK;gBACZ,QAAQ,GAAG,SAAS;AACtB,YAAA,CAAC,CAAC;QACN;AACA,QAAA,OAAO,QAAQ;AACjB,IAAA,CAAC;AACH;;;"}
1
+ {"version":3,"file":"sharedSession.js","sources":["../../../../src/provider/sharedSession.ts"],"sourcesContent":["import type { TenantSessionToken } from '../api/client';\n\n/**\n * Renew this long before expiry. A little wider than the client's own margin,\n * so the sharing decides when to renew and the clients find a live token rather\n * than each reaching for one.\n */\nconst RENEWAL_MARGIN_MS = 90_000;\n\n/** The `exp` inside a JWT, in epoch ms. Unknown when it cannot be read. */\nfunction expiryOf(token: string): number | undefined {\n try {\n const payload = token.split('.')[1];\n if (!payload) return undefined;\n const json = atob(payload.replace(/-/g, '+').replace(/_/g, '/'));\n const exp = JSON.parse(json)?.exp;\n return typeof exp === 'number' ? exp * 1000 : undefined;\n } catch {\n return undefined;\n }\n}\n\n/** Whatever the integrator returned, as a token with an expiry we can compare. */\nexport function normaliseSession(\n result: string | TenantSessionToken,\n): TenantSessionToken {\n if (typeof result === 'string') {\n return { token: result, expiresAt: expiryOf(result) };\n }\n const declared =\n result.expiresAt ??\n (result.expiresIn ? Date.now() + result.expiresIn * 1000 : undefined);\n return { ...result, expiresAt: declared ?? expiryOf(result.token) };\n}\n\n/**\n * One session for a whole tree of components.\n *\n * Every component in this library builds its own API client, and each of those\n * dedupes only its own renewals — so N clients ask for N tokens. Opening the\n * drawer fired three requests at the integrator's backend before anyone had\n * said a word. The sharing belongs where there is exactly one of something,\n * which is the provider, and not in each client, where there is not.\n *\n * `force` is what a client passes after the API refused the token it just used.\n * The cached answer is then known to be dead, so it is skipped: without that, a\n * shared cache would hand the refused token straight back and turn a\n * recoverable 401 into a widget that never speaks again.\n */\nexport function createSharedSession(\n source: () => Promise<string | TenantSessionToken>,\n): (force?: boolean) => Promise<TenantSessionToken> {\n let value: TenantSessionToken | undefined;\n let inFlight: Promise<TenantSessionToken> | undefined;\n\n return (force = false) => {\n const stillGood =\n value &&\n (value.expiresAt === undefined ||\n value.expiresAt - Date.now() > RENEWAL_MARGIN_MS);\n if (stillGood && !force) return Promise.resolve(value!);\n\n if (!inFlight) {\n inFlight = Promise.resolve(source())\n .then((result) => {\n value = normaliseSession(result);\n return value;\n })\n .finally(() => {\n inFlight = undefined;\n });\n }\n return inFlight;\n };\n}\n"],"names":[],"mappings":";;AAEA;;;;AAIG;AACH,MAAM,iBAAiB,GAAG,KAAM;AAEhC;AACA,SAAS,QAAQ,CAAC,KAAa,EAAA;AAC7B,IAAA,IAAI;QACF,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACnC,QAAA,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,SAAS;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAChE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG;AACjC,QAAA,OAAO,OAAO,GAAG,KAAK,QAAQ,GAAG,GAAG,GAAG,IAAI,GAAG,SAAS;IACzD;AAAE,IAAA,MAAM;AACN,QAAA,OAAO,SAAS;IAClB;AACF;AAEA;AACM,SAAU,gBAAgB,CAC9B,MAAmC,EAAA;AAEnC,IAAA,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;AAC9B,QAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE;IACvD;AACA,IAAA,MAAM,QAAQ,GACZ,MAAM,CAAC,SAAS;SACf,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,SAAS,GAAG,IAAI,GAAG,SAAS,CAAC;AACvE,IAAA,OAAO,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,QAAQ,IAAI,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;AACrE;AAEA;;;;;;;;;;;;;AAaG;AACG,SAAU,mBAAmB,CACjC,MAAkD,EAAA;AAElD,IAAA,IAAI,KAAqC;AACzC,IAAA,IAAI,QAAiD;AAErD,IAAA,OAAO,CAAC,KAAK,GAAG,KAAK,KAAI;QACvB,MAAM,SAAS,GACb,KAAK;AACL,aAAC,KAAK,CAAC,SAAS,KAAK,SAAS;gBAC5B,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,iBAAiB,CAAC;QACrD,IAAI,SAAS,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,OAAO,CAAC,OAAO,CAAC,KAAM,CAAC;QAEvD,IAAI,CAAC,QAAQ,EAAE;AACb,YAAA,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE;AAChC,iBAAA,IAAI,CAAC,CAAC,MAAM,KAAI;AACf,gBAAA,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC;AAChC,gBAAA,OAAO,KAAK;AACd,YAAA,CAAC;iBACA,OAAO,CAAC,MAAK;gBACZ,QAAQ,GAAG,SAAS;AACtB,YAAA,CAAC,CAAC;QACN;AACA,QAAA,OAAO,QAAQ;AACjB,IAAA,CAAC;AACH;;;;;"}
@@ -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-panel{background:var(--devic-bg,#fff);color:var(--devic-text,#333);display:flex;flex-direction:column;font-size:13px;min-width:0;width:100%}.devic-int-modal{border-radius:12px;box-shadow:0 12px 40px rgba(0,0,0,.22);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-initial{align-items:center;display:inline-flex;font-size:10px;font-weight:600;justify-content:center;line-height:1}.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-panel[data-dark=true] .devic-int-card .devic-int-logo{background:hsla(0,0%,100%,.92)}.devic-int-panel[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-group{border-top:1px solid var(--devic-border,hsla(0,0%,50%,.22));font-size:10px;letter-spacing:.06em;margin-top:6px;opacity:.55;padding:10px 4px 4px;text-transform:uppercase}.devic-int-toggle-mcp-logo{border-radius:4px;flex-shrink:0;height:18px;object-fit:contain;width:18px}.devic-int-toggle-mcp-fallback{align-items:center;background:var(--devic-surface-2,hsla(0,0%,50%,.18));color:inherit;display:inline-flex;font-size:10px;font-weight:600;justify-content:center}.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-int-toggle-btn-loading{animation:devic-int-toggle-pulse 1.4s ease-in-out infinite;cursor:default;opacity:.35}@keyframes devic-int-toggle-pulse{0%,to{opacity:.25}50%{opacity:.5}}.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-error:#ff4d4f;--devic-queued-accent:var(--devic-text-muted);--devic-queued-bubble-bg:transparent;--devic-queued-border:var(--devic-border);--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[data-queued=true] .devic-message-bubble{background:var(--devic-queued-bubble-bg);border:1px dashed var(--devic-queued-border);color:var(--devic-text);opacity:.85}.devic-message-queued-label{align-items:center;color:var(--devic-queued-accent);display:inline-flex;font-size:11px;gap:4px}.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-queue-notice{align-items:center;background:var(--devic-bg-secondary);border:1px dashed var(--devic-queued-border);border-radius:var(--devic-radius);color:var(--devic-text-secondary);display:flex;font-size:12px;gap:6px;line-height:1.4;margin-bottom:4px;padding:8px 12px}.devic-queue-notice-icon{color:var(--devic-queued-accent);display:flex;flex-shrink:0}.devic-queue-notice[data-alert=true]{border-color:var(--devic-error,#ff4d4f);border-style:solid;color:var(--devic-text)}.devic-queue-notice[data-alert=true] .devic-queue-notice-icon{color:var(--devic-error,#ff4d4f)}.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-compaction{color:var(--devic-text-secondary);flex-shrink:0;font-size:12px;margin:10px 0;width:100%}.devic-compaction-head,.devic-compaction-running{align-items:center;display:flex;gap:8px}.devic-compaction-rule{background:var(--devic-compaction-border,rgba(114,46,209,.3));flex:1;height:1px}.devic-compaction-pill{align-items:center;background:var(--devic-compaction-bg,rgba(114,46,209,.06));border:1px solid var(--devic-compaction-border,rgba(114,46,209,.3));border-radius:999px;color:inherit;cursor:pointer;display:flex;flex-shrink:0;font:inherit;gap:8px;max-width:100%;overflow:hidden;padding:4px 12px;white-space:nowrap}.devic-compaction-pill-static,.devic-compaction-running .devic-compaction-pill{cursor:default}.devic-compaction-icon{color:var(--devic-compaction-accent,#722ed1);flex-shrink:0}.devic-compaction-title{color:var(--devic-text);font-weight:600}.devic-compaction-meta{opacity:.75;overflow:hidden;text-overflow:ellipsis}.devic-compaction-tag{border:1px solid var(--devic-compaction-border,rgba(114,46,209,.3));border-radius:4px;font-size:10px;line-height:16px;opacity:.8;padding:0 6px}.devic-compaction-chevron{flex-shrink:0;opacity:.6;transition:transform .15s ease}.devic-compaction-dots{display:inline-flex;flex-shrink:0;gap:3px}.devic-compaction-dots i{animation:devic-compaction-blink 1.2s ease-in-out infinite;background:var(--devic-compaction-accent,#722ed1);border-radius:50%;height:4px;width:4px}.devic-compaction-dots i:nth-child(2){animation-delay:.2s}.devic-compaction-dots i:nth-child(3){animation-delay:.4s}@keyframes devic-compaction-blink{0%,80%,to{opacity:.25}40%{opacity:1}}.devic-compaction-body{background:var(--devic-compaction-bg,rgba(114,46,209,.06));border:1px solid var(--devic-compaction-border,rgba(114,46,209,.3));border-radius:var(--devic-radius-sm,8px);display:flex;flex-direction:column;gap:10px;margin-top:8px;padding:10px 12px}.devic-compaction-note{color:var(--devic-text-muted);font-size:11px}.devic-compaction-section{color:var(--devic-text);display:flex;flex-direction:column;gap:3px}.devic-compaction-section-title{font-size:10px;font-weight:600;letter-spacing:.5px;opacity:.7;text-transform:uppercase}.devic-compaction-list{margin:0;padding-left:18px}.devic-compaction-raw{white-space:pre-wrap}.devic-compaction-facts{display:flex;flex-wrap:wrap;gap:4px}.devic-compaction-fact{border:1px solid var(--devic-compaction-border,rgba(114,46,209,.3));border-radius:4px;font-family:var(--devic-font-mono,ui-monospace,SFMono-Regular,monospace);font-size:11px;line-height:18px;padding:0 6px}.devic-compaction-fact-label{opacity:.65}.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-panel{background:var(--devic-bg,#fff);color:var(--devic-text,#333);display:flex;flex-direction:column;font-size:13px;min-width:0;width:100%}.devic-int-modal{border-radius:12px;box-shadow:0 12px 40px rgba(0,0,0,.22);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-initial{align-items:center;display:inline-flex;font-size:10px;font-weight:600;justify-content:center;line-height:1}.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-panel[data-dark=true] .devic-int-card .devic-int-logo{background:hsla(0,0%,100%,.92)}.devic-int-panel[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-group{border-top:1px solid var(--devic-border,hsla(0,0%,50%,.22));font-size:10px;letter-spacing:.06em;margin-top:6px;opacity:.55;padding:10px 4px 4px;text-transform:uppercase}.devic-int-toggle-mcp-logo{border-radius:4px;flex-shrink:0;height:18px;object-fit:contain;width:18px}.devic-int-toggle-mcp-fallback{align-items:center;background:var(--devic-surface-2,hsla(0,0%,50%,.18));color:inherit;display:inline-flex;font-size:10px;font-weight:600;justify-content:center}.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-int-toggle-btn-loading{animation:devic-int-toggle-pulse 1.4s ease-in-out infinite;cursor:default;opacity:.35}@keyframes devic-int-toggle-pulse{0%,to{opacity:.25}50%{opacity:.5}}.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-error:#ff4d4f;--devic-queued-accent:var(--devic-text-muted);--devic-queued-bubble-bg:transparent;--devic-queued-border:var(--devic-border);--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[data-queued=true] .devic-message-bubble{background:var(--devic-queued-bubble-bg);border:1px dashed var(--devic-queued-border);color:var(--devic-text);opacity:.85}.devic-message-queued-label{align-items:center;color:var(--devic-queued-accent);display:inline-flex;font-size:11px;gap:4px}.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-queue-notice{align-items:center;background:var(--devic-bg-secondary);border:1px dashed var(--devic-queued-border);border-radius:var(--devic-radius);color:var(--devic-text-secondary);display:flex;font-size:12px;gap:6px;line-height:1.4;margin-bottom:4px;padding:8px 12px}.devic-queue-notice-icon{color:var(--devic-queued-accent);display:flex;flex-shrink:0}.devic-queue-notice[data-alert=true]{border-color:var(--devic-error,#ff4d4f);border-style:solid;color:var(--devic-text)}.devic-queue-notice[data-alert=true] .devic-queue-notice-icon{color:var(--devic-error,#ff4d4f)}.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-compaction{color:var(--devic-text-secondary);flex-shrink:0;font-size:12px;margin:10px 0;width:100%}.devic-compaction-head,.devic-compaction-running{align-items:center;display:flex;gap:8px}.devic-compaction-rule{background:var(--devic-compaction-border,rgba(114,46,209,.3));flex:1;height:1px}.devic-compaction-pill{align-items:center;background:var(--devic-compaction-bg,rgba(114,46,209,.06));border:1px solid var(--devic-compaction-border,rgba(114,46,209,.3));border-radius:999px;color:inherit;cursor:pointer;display:flex;flex-shrink:0;font:inherit;gap:8px;max-width:100%;overflow:hidden;padding:4px 12px;white-space:nowrap}.devic-compaction-pill-static,.devic-compaction-running .devic-compaction-pill{cursor:default}.devic-compaction-icon{color:var(--devic-compaction-accent,#722ed1);flex-shrink:0}.devic-compaction-title{color:var(--devic-text);font-weight:600}.devic-compaction-meta{opacity:.75;overflow:hidden;text-overflow:ellipsis}.devic-compaction-tag{border:1px solid var(--devic-compaction-border,rgba(114,46,209,.3));border-radius:4px;font-size:10px;line-height:16px;opacity:.8;padding:0 6px}.devic-compaction-chevron{flex-shrink:0;opacity:.6;transition:transform .15s ease}.devic-compaction-dots{display:inline-flex;flex-shrink:0;gap:3px}.devic-compaction-dots i{animation:devic-compaction-blink 1.2s ease-in-out infinite;background:var(--devic-compaction-accent,#722ed1);border-radius:50%;height:4px;width:4px}.devic-compaction-dots i:nth-child(2){animation-delay:.2s}.devic-compaction-dots i:nth-child(3){animation-delay:.4s}@keyframes devic-compaction-blink{0%,80%,to{opacity:.25}40%{opacity:1}}.devic-compaction-body{background:var(--devic-compaction-bg,rgba(114,46,209,.06));border:1px solid var(--devic-compaction-border,rgba(114,46,209,.3));border-radius:var(--devic-radius-sm,8px);display:flex;flex-direction:column;gap:10px;margin-top:8px;padding:10px 12px}.devic-compaction-note{color:var(--devic-text-muted);font-size:11px}.devic-compaction-section{color:var(--devic-text);display:flex;flex-direction:column;gap:3px}.devic-compaction-section-title{font-size:10px;font-weight:600;letter-spacing:.5px;opacity:.7;text-transform:uppercase}.devic-compaction-list{margin:0;padding-left:18px}.devic-compaction-raw{white-space:pre-wrap}.devic-compaction-facts{display:flex;flex-wrap:wrap;gap:4px}.devic-compaction-fact{border:1px solid var(--devic-compaction-border,rgba(114,46,209,.3));border-radius:4px;font-family:var(--devic-font-mono,ui-monospace,SFMono-Regular,monospace);font-size:11px;line-height:18px;padding:0 6px}.devic-compaction-fact-label{opacity:.65}.devic-guardrail-notice{align-items:center;background:var(--devic-guardrail-bg,rgba(255,77,79,.06));border:1px solid var(--devic-guardrail-border,rgba(255,77,79,.25));border-radius:var(--devic-radius);color:var(--devic-text-secondary);display:flex;flex-shrink:0;font-size:12px;gap:6px;justify-content:center;line-height:1.4;margin:10px 0;padding:8px 12px;text-align:center;width:100%}.devic-guardrail-notice-icon{color:var(--devic-error,#ff4d4f);display:flex;flex-shrink:0}.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 +1 @@
1
- {"version":3,"file":"avatar.js","sources":["../../../../src/utils/avatar.ts"],"sourcesContent":["import { blobatarUri } from 'blobatar/uri';\nimport type { BlobatarOptions } from 'blobatar';\n\n/**\n * The generated avatar an agent or an assistant falls back to when it has no\n * uploaded image.\n *\n * Derived from the entity's id, and the platform derives it the same way from\n * the same value — so an assistant embedded here wears the face its owner sees\n * in the console. `AvatarStyle` is only what has been pinned on top of that:\n * an absent field keeps following the id.\n */\nexport type AvatarShape =\n | 'round'\n | 'organic'\n | 'boxy'\n | 'nub'\n | 'cloud'\n | 'sun';\n\nexport type AvatarTone =\n | 'pastel'\n | 'neutral'\n | 'mid'\n | 'deep'\n | 'bright'\n | 'ink';\n\nexport interface AvatarStyle {\n shape?: AvatarShape;\n /** Hue in degrees, 0-359. */\n hue?: number;\n tone?: AvatarTone;\n}\n\n/**\n * Where each name sits in the renderer's 0-1 trait space — the middle of each\n * band, so a pinned value lands nowhere near a threshold. Kept identical to the\n * platform's mapping: the same style must resolve to the same avatar in both.\n */\nconst SHAPE_POSITION: Record<AvatarShape, number> = {\n round: 0.14,\n organic: 0.43,\n boxy: 0.65,\n nub: 0.78,\n cloud: 0.885,\n sun: 0.965,\n};\n\nconst TONE_POSITION: Record<AvatarTone, number> = {\n pastel: 0.1,\n neutral: 0.28,\n mid: 0.49,\n deep: 0.71,\n bright: 0.865,\n ink: 0.965,\n};\n\nfunction blobatarOptions(style?: AvatarStyle): BlobatarOptions {\n const opts: BlobatarOptions = {};\n if (style?.shape) opts.traits = { shape: SHAPE_POSITION[style.shape] };\n if (typeof style?.hue === 'number') opts.hue = style.hue;\n if (style?.tone) opts.tone = TONE_POSITION[style.tone];\n return opts;\n}\n\n/**\n * Memoised: a drawer header and every hand-off card in the transcript can be\n * asking for the same few avatars, and each one is a few hundred bytes of path\n * data to solve. Bounded, since a long conversation can hand off to many\n * subagents.\n */\nconst cache = new Map<string, string>();\nconst CACHE_LIMIT = 100;\n\nexport function avatarUri(seed: string, style?: AvatarStyle): string {\n const key = `${seed}|${style?.shape ?? ''}|${style?.hue ?? ''}|${style?.tone ?? ''}`;\n const hit = cache.get(key);\n if (hit) return hit;\n\n const uri = blobatarUri(seed, blobatarOptions(style));\n if (cache.size >= CACHE_LIMIT) {\n const oldest = cache.keys().next().value;\n if (oldest !== undefined) cache.delete(oldest);\n }\n cache.set(key, uri);\n return uri;\n}\n"],"names":["uri","blobatarUri"],"mappings":";;;;AAmCA;;;;AAIG;AACH,MAAM,cAAc,GAAgC;AAClD,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,OAAO,EAAE,IAAI;AACb,IAAA,IAAI,EAAE,IAAI;AACV,IAAA,GAAG,EAAE,IAAI;AACT,IAAA,KAAK,EAAE,KAAK;AACZ,IAAA,GAAG,EAAE,KAAK;CACX;AAED,MAAM,aAAa,GAA+B;AAChD,IAAA,MAAM,EAAE,GAAG;AACX,IAAA,OAAO,EAAE,IAAI;AACb,IAAA,GAAG,EAAE,IAAI;AACT,IAAA,IAAI,EAAE,IAAI;AACV,IAAA,MAAM,EAAE,KAAK;AACb,IAAA,GAAG,EAAE,KAAK;CACX;AAED,SAAS,eAAe,CAAC,KAAmB,EAAA;IAC1C,MAAM,IAAI,GAAoB,EAAE;IAChC,IAAI,KAAK,EAAE,KAAK;AAAE,QAAA,IAAI,CAAC,MAAM,GAAG,EAAE,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;AACtE,IAAA,IAAI,OAAO,KAAK,EAAE,GAAG,KAAK,QAAQ;AAAE,QAAA,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG;IACxD,IAAI,KAAK,EAAE,IAAI;QAAE,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC;AACtD,IAAA,OAAO,IAAI;AACb;AAEA;;;;;AAKG;AACH,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB;AACvC,MAAM,WAAW,GAAG,GAAG;AAEjB,SAAU,SAAS,CAAC,IAAY,EAAE,KAAmB,EAAA;IACzD,MAAM,GAAG,GAAG,CAAA,EAAG,IAAI,IAAI,KAAK,EAAE,KAAK,IAAI,EAAE,CAAA,CAAA,EAAI,KAAK,EAAE,GAAG,IAAI,EAAE,CAAA,CAAA,EAAI,KAAK,EAAE,IAAI,IAAI,EAAE,CAAA,CAAE;IACpF,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;AAC1B,IAAA,IAAI,GAAG;AAAE,QAAA,OAAO,GAAG;IAEnB,MAAMA,KAAG,GAAGC,eAAW,CAAC,IAAI,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC;AACrD,IAAA,IAAI,KAAK,CAAC,IAAI,IAAI,WAAW,EAAE;QAC7B,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK;QACxC,IAAI,MAAM,KAAK,SAAS;AAAE,YAAA,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;IAChD;AACA,IAAA,KAAK,CAAC,GAAG,CAAC,GAAG,EAAED,KAAG,CAAC;AACnB,IAAA,OAAOA,KAAG;AACZ;;"}
1
+ {"version":3,"file":"avatar.js","sources":["../../../../src/utils/avatar.ts"],"sourcesContent":["import { blobatarUri } from 'blobatar/uri';\nimport type { BlobatarOptions } from 'blobatar';\n\n/**\n * The generated avatar an agent or an assistant falls back to when it has no\n * uploaded image.\n *\n * Derived from the entity's id, and the platform derives it the same way from\n * the same value — so an assistant embedded here wears the face its owner sees\n * in the console. `AvatarStyle` is only what has been pinned on top of that:\n * an absent field keeps following the id.\n */\nexport type AvatarShape =\n | 'round'\n | 'organic'\n | 'boxy'\n | 'nub'\n | 'cloud'\n | 'sun';\n\nexport type AvatarTone =\n | 'pastel'\n | 'neutral'\n | 'mid'\n | 'deep'\n | 'bright'\n | 'ink';\n\nexport interface AvatarStyle {\n shape?: AvatarShape;\n /** Hue in degrees, 0-359. */\n hue?: number;\n tone?: AvatarTone;\n}\n\n/**\n * Where each name sits in the renderer's 0-1 trait space — the middle of each\n * band, so a pinned value lands nowhere near a threshold. Kept identical to the\n * platform's mapping: the same style must resolve to the same avatar in both.\n */\nconst SHAPE_POSITION: Record<AvatarShape, number> = {\n round: 0.14,\n organic: 0.43,\n boxy: 0.65,\n nub: 0.78,\n cloud: 0.885,\n sun: 0.965,\n};\n\nconst TONE_POSITION: Record<AvatarTone, number> = {\n pastel: 0.1,\n neutral: 0.28,\n mid: 0.49,\n deep: 0.71,\n bright: 0.865,\n ink: 0.965,\n};\n\nfunction blobatarOptions(style?: AvatarStyle): BlobatarOptions {\n const opts: BlobatarOptions = {};\n if (style?.shape) opts.traits = { shape: SHAPE_POSITION[style.shape] };\n if (typeof style?.hue === 'number') opts.hue = style.hue;\n if (style?.tone) opts.tone = TONE_POSITION[style.tone];\n return opts;\n}\n\n/**\n * Memoised: a drawer header and every hand-off card in the transcript can be\n * asking for the same few avatars, and each one is a few hundred bytes of path\n * data to solve. Bounded, since a long conversation can hand off to many\n * subagents.\n */\nconst cache = new Map<string, string>();\nconst CACHE_LIMIT = 100;\n\nexport function avatarUri(seed: string, style?: AvatarStyle): string {\n const key = `${seed}|${style?.shape ?? ''}|${style?.hue ?? ''}|${style?.tone ?? ''}`;\n const hit = cache.get(key);\n if (hit) return hit;\n\n const uri = blobatarUri(seed, blobatarOptions(style));\n if (cache.size >= CACHE_LIMIT) {\n const oldest = cache.keys().next().value;\n if (oldest !== undefined) cache.delete(oldest);\n }\n cache.set(key, uri);\n return uri;\n}\n"],"names":["uri","blobatarUri"],"mappings":";;;;AAmCA;;;;AAIG;AACH,MAAM,cAAc,GAAgC;AAClD,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,OAAO,EAAE,IAAI;AACb,IAAA,IAAI,EAAE,IAAI;AACV,IAAA,GAAG,EAAE,IAAI;AACT,IAAA,KAAK,EAAE,KAAK;AACZ,IAAA,GAAG,EAAE,KAAK;CACX;AAED,MAAM,aAAa,GAA+B;AAChD,IAAA,MAAM,EAAE,GAAG;AACX,IAAA,OAAO,EAAE,IAAI;AACb,IAAA,GAAG,EAAE,IAAI;AACT,IAAA,IAAI,EAAE,IAAI;AACV,IAAA,MAAM,EAAE,KAAK;AACb,IAAA,GAAG,EAAE,KAAK;CACX;AAED,SAAS,eAAe,CAAC,KAAmB,EAAA;IAC1C,MAAM,IAAI,GAAoB,EAAE;IAChC,IAAI,KAAK,EAAE,KAAK;AAAE,QAAA,IAAI,CAAC,MAAM,GAAG,EAAE,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;AACtE,IAAA,IAAI,OAAO,KAAK,EAAE,GAAG,KAAK,QAAQ;AAAE,QAAA,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG;IACxD,IAAI,KAAK,EAAE,IAAI;QAAE,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC;AACtD,IAAA,OAAO,IAAI;AACb;AAEA;;;;;AAKG;AACH,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB;AACvC,MAAM,WAAW,GAAG,GAAG;AAEjB,SAAU,SAAS,CAAC,IAAY,EAAE,KAAmB,EAAA;IACzD,MAAM,GAAG,GAAG,CAAA,EAAG,IAAI,IAAI,KAAK,EAAE,KAAK,IAAI,EAAE,CAAA,CAAA,EAAI,KAAK,EAAE,GAAG,IAAI,EAAE,CAAA,CAAA,EAAI,KAAK,EAAE,IAAI,IAAI,EAAE,CAAA,CAAE;IACpF,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;AAC1B,IAAA,IAAI,GAAG;AAAE,QAAA,OAAO,GAAG;IAEnB,MAAMA,KAAG,GAAGC,eAAW,CAAC,IAAI,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC;AACrD,IAAA,IAAI,KAAK,CAAC,IAAI,IAAI,WAAW,EAAE;QAC7B,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK;QACxC,IAAI,MAAM,KAAK,SAAS;AAAE,YAAA,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;IAChD;AACA,IAAA,KAAK,CAAC,GAAG,CAAC,GAAG,EAAED,KAAG,CAAC;AACnB,IAAA,OAAOA,KAAG;AACZ;;;;"}
@@ -0,0 +1,44 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Consume Devic's version-1 SSE snapshots, tolerating arbitrary UTF-8/chunk
5
+ * boundaries. `onActivity` fires on every chunk, keep-alive comments included,
6
+ * so the caller can tell a quiet connection from a dead one.
7
+ */
8
+ async function consumeChatStream(response, onSnapshot, onActivity) {
9
+ if (!response.ok || !response.headers.get('content-type')?.includes('text/event-stream') || !response.body) {
10
+ throw new Error('Chat streaming unavailable');
11
+ }
12
+ const reader = response.body.getReader();
13
+ const decoder = new TextDecoder();
14
+ let buffer = '';
15
+ try {
16
+ while (true) {
17
+ const { value, done } = await reader.read();
18
+ if (done)
19
+ break;
20
+ onActivity?.();
21
+ buffer += decoder.decode(value, { stream: true }).replace(/\r\n/g, '\n');
22
+ if (buffer.length > 16 * 1024 * 1024)
23
+ throw new Error('Chat stream frame too large');
24
+ let boundary;
25
+ while ((boundary = buffer.indexOf('\n\n')) !== -1) {
26
+ const frame = buffer.slice(0, boundary);
27
+ buffer = buffer.slice(boundary + 2);
28
+ const lines = frame.split('\n');
29
+ if (!lines.some(line => line === 'event: snapshot'))
30
+ continue;
31
+ const data = lines.filter(line => line.startsWith('data:')).map(line => line.slice(5).trimStart()).join('\n');
32
+ if (data)
33
+ await onSnapshot(JSON.parse(data));
34
+ }
35
+ }
36
+ }
37
+ finally {
38
+ await reader.cancel().catch(() => { });
39
+ reader.releaseLock();
40
+ }
41
+ }
42
+
43
+ exports.consumeChatStream = consumeChatStream;
44
+ //# sourceMappingURL=consumeChatStream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consumeChatStream.js","sources":["../../../../src/utils/consumeChatStream.ts"],"sourcesContent":["/**\n * Consume Devic's version-1 SSE snapshots, tolerating arbitrary UTF-8/chunk\n * boundaries. `onActivity` fires on every chunk, keep-alive comments included,\n * so the caller can tell a quiet connection from a dead one.\n */\nexport async function consumeChatStream<T>(\n response: Response,\n onSnapshot: (snapshot: T) => void | Promise<void>,\n onActivity?: () => void,\n): Promise<void> {\n if (!response.ok || !response.headers.get('content-type')?.includes('text/event-stream') || !response.body) {\n throw new Error('Chat streaming unavailable');\n }\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n onActivity?.();\n buffer += decoder.decode(value, { stream: true }).replace(/\\r\\n/g, '\\n');\n if (buffer.length > 16 * 1024 * 1024) throw new Error('Chat stream frame too large');\n let boundary: number;\n while ((boundary = buffer.indexOf('\\n\\n')) !== -1) {\n const frame = buffer.slice(0, boundary);\n buffer = buffer.slice(boundary + 2);\n const lines = frame.split('\\n');\n if (!lines.some(line => line === 'event: snapshot')) continue;\n const data = lines.filter(line => line.startsWith('data:')).map(line => line.slice(5).trimStart()).join('\\n');\n if (data) await onSnapshot(JSON.parse(data));\n }\n }\n } finally {\n await reader.cancel().catch(() => {});\n reader.releaseLock();\n }\n}\n\n"],"names":[],"mappings":";;AAAA;;;;AAIG;AACI,eAAe,iBAAiB,CACrC,QAAkB,EAClB,UAAiD,EACjD,UAAuB,EAAA;IAEvB,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,QAAQ,CAAC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AAC1G,QAAA,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC;IAC/C;IACA,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE;AACxC,IAAA,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE;IACjC,IAAI,MAAM,GAAG,EAAE;AACf,IAAA,IAAI;QACF,OAAO,IAAI,EAAE;YACX,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE;AAC3C,YAAA,IAAI,IAAI;gBAAE;YACV,UAAU,IAAI;YACd,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC;YACxE,IAAI,MAAM,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI;AAAE,gBAAA,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC;AACpF,YAAA,IAAI,QAAgB;AACpB,YAAA,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE;gBACjD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC;gBACvC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACnC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;AAC/B,gBAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,iBAAiB,CAAC;oBAAE;AACrD,gBAAA,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;AAC7G,gBAAA,IAAI,IAAI;oBAAE,MAAM,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC9C;QACF;IACF;YAAU;AACR,QAAA,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,MAAK,EAAE,CAAC,CAAC;QACrC,MAAM,CAAC,WAAW,EAAE;IACtB;AACF;;;;"}