@devicai/ui 0.58.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 (153) hide show
  1. package/README.md +24 -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 +2 -1
  7. package/dist/cjs/components/AICommandBar/AICommandBar.js.map +1 -1
  8. package/dist/cjs/components/AICommandBar/useAICommandBar.js +5 -1
  9. package/dist/cjs/components/AICommandBar/useAICommandBar.js.map +1 -1
  10. package/dist/cjs/components/AIElementWrapper/AIElementWrapper.js +2 -1
  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 +5 -1
  14. package/dist/cjs/components/AIElementWrapper/useAIElementWrapper.js.map +1 -1
  15. package/dist/cjs/components/AIGenerationButton/AIGenerationButton.js +2 -1
  16. package/dist/cjs/components/AIGenerationButton/AIGenerationButton.js.map +1 -1
  17. package/dist/cjs/components/AIGenerationButton/useAIGenerationButton.js +5 -1
  18. package/dist/cjs/components/AIGenerationButton/useAIGenerationButton.js.map +1 -1
  19. package/dist/cjs/components/ChatDrawer/ChatDrawer.js +2 -1
  20. package/dist/cjs/components/ChatDrawer/ChatDrawer.js.map +1 -1
  21. package/dist/cjs/components/ChatDrawer/ChatInput.js.map +1 -1
  22. package/dist/cjs/components/ChatDrawer/ChatMessages.js.map +1 -1
  23. package/dist/cjs/components/ChatDrawer/CompactionWidget.js.map +1 -1
  24. package/dist/cjs/components/ChatDrawer/ConversationSelector.js.map +1 -1
  25. package/dist/cjs/components/ChatDrawer/ErrorBoundary.js.map +1 -1
  26. package/dist/cjs/components/ChatDrawer/GuardrailNotice.js.map +1 -1
  27. package/dist/cjs/components/ChatDrawer/HandoffSubagentWidget.js.map +1 -1
  28. package/dist/cjs/components/ChatDrawer/LimitBanner.js.map +1 -1
  29. package/dist/cjs/components/ChatDrawer/QueueNotice.js.map +1 -1
  30. package/dist/cjs/components/ChatDrawer/RecalledMemoriesWidget.js.map +1 -1
  31. package/dist/cjs/components/ChatDrawer/ReferenceChip.js.map +1 -1
  32. package/dist/cjs/components/ChatDrawer/ToolTimeline.js.map +1 -1
  33. package/dist/cjs/components/ChatDrawer/UsageBar.js.map +1 -1
  34. package/dist/cjs/components/ChatDrawer/pastedText.js.map +1 -1
  35. package/dist/cjs/components/CoreMemoryModal/CoreMemoryModal.js.map +1 -1
  36. package/dist/cjs/components/Feedback/FeedbackModal.js.map +1 -1
  37. package/dist/cjs/components/Feedback/MessageActions.js.map +1 -1
  38. package/dist/cjs/components/IntegrationsModal/ConnectFieldsForm.js.map +1 -1
  39. package/dist/cjs/components/IntegrationsModal/IntegrationLogo.js.map +1 -1
  40. package/dist/cjs/components/IntegrationsModal/IntegrationsHint.js.map +1 -1
  41. package/dist/cjs/components/IntegrationsModal/IntegrationsLauncher.js.map +1 -1
  42. package/dist/cjs/components/IntegrationsModal/IntegrationsModal.js.map +1 -1
  43. package/dist/cjs/components/IntegrationsModal/IntegrationsPanel.js.map +1 -1
  44. package/dist/cjs/components/IntegrationsModal/IntegrationsToggle.js.map +1 -1
  45. package/dist/cjs/components/IntegrationsModal/McpConnectForm.js.map +1 -1
  46. package/dist/cjs/components/IntegrationsModal/McpServersSection.js.map +1 -1
  47. package/dist/cjs/components/IntegrationsModal/integrationChoice.js.map +1 -1
  48. package/dist/cjs/components/IntegrationsModal/useIntegrations.js.map +1 -1
  49. package/dist/cjs/components/IntegrationsModal/useTenantMcp.js.map +1 -1
  50. package/dist/cjs/components/ThreadStateTag/ThreadStateTag.js.map +1 -1
  51. package/dist/cjs/components/theme.js.map +1 -1
  52. package/dist/cjs/hooks/useDevicChat.js +10 -2
  53. package/dist/cjs/hooks/useDevicChat.js.map +1 -1
  54. package/dist/cjs/hooks/useModelInterface.js.map +1 -1
  55. package/dist/cjs/hooks/usePolling.js +117 -7
  56. package/dist/cjs/hooks/usePolling.js.map +1 -1
  57. package/dist/cjs/hooks/useSpeechRecording.js.map +1 -1
  58. package/dist/cjs/i18n/translate.js.map +1 -1
  59. package/dist/cjs/i18n/useTranslations.js.map +1 -1
  60. package/dist/cjs/provider/DevicContext.js.map +1 -1
  61. package/dist/cjs/provider/DevicProvider.js +3 -1
  62. package/dist/cjs/provider/DevicProvider.js.map +1 -1
  63. package/dist/cjs/provider/sharedSession.js.map +1 -1
  64. package/dist/cjs/utils/avatar.js.map +1 -1
  65. package/dist/cjs/utils/consumeChatStream.js +44 -0
  66. package/dist/cjs/utils/consumeChatStream.js.map +1 -0
  67. package/dist/cjs/utils/index.js.map +1 -1
  68. package/dist/cjs/utils/logger.js.map +1 -1
  69. package/dist/cjs/utils/toolGroups.js.map +1 -1
  70. package/dist/esm/api/assistantInfo.js.map +1 -1
  71. package/dist/esm/api/client.d.ts +5 -1
  72. package/dist/esm/api/client.js +17 -1
  73. package/dist/esm/api/client.js.map +1 -1
  74. package/dist/esm/api/types.d.ts +2 -0
  75. package/dist/esm/api/types.js.map +1 -1
  76. package/dist/esm/components/AICommandBar/AICommandBar.js +2 -1
  77. package/dist/esm/components/AICommandBar/AICommandBar.js.map +1 -1
  78. package/dist/esm/components/AICommandBar/AICommandBar.types.d.ts +6 -0
  79. package/dist/esm/components/AICommandBar/useAICommandBar.d.ts +2 -0
  80. package/dist/esm/components/AICommandBar/useAICommandBar.js +6 -2
  81. package/dist/esm/components/AICommandBar/useAICommandBar.js.map +1 -1
  82. package/dist/esm/components/AIElementWrapper/AIElementWrapper.js +2 -1
  83. package/dist/esm/components/AIElementWrapper/AIElementWrapper.js.map +1 -1
  84. package/dist/esm/components/AIElementWrapper/AIElementWrapper.types.d.ts +6 -0
  85. package/dist/esm/components/AIElementWrapper/activeWrapperRegistry.js.map +1 -1
  86. package/dist/esm/components/AIElementWrapper/useAIElementWrapper.d.ts +2 -0
  87. package/dist/esm/components/AIElementWrapper/useAIElementWrapper.js +6 -2
  88. package/dist/esm/components/AIElementWrapper/useAIElementWrapper.js.map +1 -1
  89. package/dist/esm/components/AIGenerationButton/AIGenerationButton.js +2 -1
  90. package/dist/esm/components/AIGenerationButton/AIGenerationButton.js.map +1 -1
  91. package/dist/esm/components/AIGenerationButton/AIGenerationButton.types.d.ts +6 -0
  92. package/dist/esm/components/AIGenerationButton/useAIGenerationButton.d.ts +2 -0
  93. package/dist/esm/components/AIGenerationButton/useAIGenerationButton.js +6 -2
  94. package/dist/esm/components/AIGenerationButton/useAIGenerationButton.js.map +1 -1
  95. package/dist/esm/components/ChatDrawer/ChatDrawer.js +2 -1
  96. package/dist/esm/components/ChatDrawer/ChatDrawer.js.map +1 -1
  97. package/dist/esm/components/ChatDrawer/ChatDrawer.types.d.ts +8 -0
  98. package/dist/esm/components/ChatDrawer/ChatInput.js.map +1 -1
  99. package/dist/esm/components/ChatDrawer/ChatMessages.js.map +1 -1
  100. package/dist/esm/components/ChatDrawer/CompactionWidget.js.map +1 -1
  101. package/dist/esm/components/ChatDrawer/ConversationSelector.js.map +1 -1
  102. package/dist/esm/components/ChatDrawer/ErrorBoundary.js.map +1 -1
  103. package/dist/esm/components/ChatDrawer/GuardrailNotice.js.map +1 -1
  104. package/dist/esm/components/ChatDrawer/HandoffSubagentWidget.js.map +1 -1
  105. package/dist/esm/components/ChatDrawer/LimitBanner.js.map +1 -1
  106. package/dist/esm/components/ChatDrawer/QueueNotice.js.map +1 -1
  107. package/dist/esm/components/ChatDrawer/RecalledMemoriesWidget.js.map +1 -1
  108. package/dist/esm/components/ChatDrawer/ReferenceChip.js.map +1 -1
  109. package/dist/esm/components/ChatDrawer/ToolTimeline.js.map +1 -1
  110. package/dist/esm/components/ChatDrawer/UsageBar.js.map +1 -1
  111. package/dist/esm/components/ChatDrawer/pastedText.js.map +1 -1
  112. package/dist/esm/components/CoreMemoryModal/CoreMemoryModal.js.map +1 -1
  113. package/dist/esm/components/Feedback/FeedbackModal.js.map +1 -1
  114. package/dist/esm/components/Feedback/MessageActions.js.map +1 -1
  115. package/dist/esm/components/IntegrationsModal/ConnectFieldsForm.js.map +1 -1
  116. package/dist/esm/components/IntegrationsModal/IntegrationLogo.js.map +1 -1
  117. package/dist/esm/components/IntegrationsModal/IntegrationsHint.js.map +1 -1
  118. package/dist/esm/components/IntegrationsModal/IntegrationsLauncher.js.map +1 -1
  119. package/dist/esm/components/IntegrationsModal/IntegrationsModal.js.map +1 -1
  120. package/dist/esm/components/IntegrationsModal/IntegrationsPanel.js.map +1 -1
  121. package/dist/esm/components/IntegrationsModal/IntegrationsToggle.js.map +1 -1
  122. package/dist/esm/components/IntegrationsModal/McpConnectForm.js.map +1 -1
  123. package/dist/esm/components/IntegrationsModal/McpServersSection.js.map +1 -1
  124. package/dist/esm/components/IntegrationsModal/integrationChoice.js.map +1 -1
  125. package/dist/esm/components/IntegrationsModal/useIntegrations.js.map +1 -1
  126. package/dist/esm/components/IntegrationsModal/useTenantMcp.js.map +1 -1
  127. package/dist/esm/components/ThreadStateTag/ThreadStateTag.js.map +1 -1
  128. package/dist/esm/components/theme.js.map +1 -1
  129. package/dist/esm/hooks/index.d.ts +1 -1
  130. package/dist/esm/hooks/useDevicChat.d.ts +6 -0
  131. package/dist/esm/hooks/useDevicChat.js +12 -4
  132. package/dist/esm/hooks/useDevicChat.js.map +1 -1
  133. package/dist/esm/hooks/useModelInterface.js.map +1 -1
  134. package/dist/esm/hooks/usePolling.d.ts +35 -0
  135. package/dist/esm/hooks/usePolling.js +114 -8
  136. package/dist/esm/hooks/usePolling.js.map +1 -1
  137. package/dist/esm/hooks/useSpeechRecording.js.map +1 -1
  138. package/dist/esm/i18n/translate.js.map +1 -1
  139. package/dist/esm/i18n/useTranslations.js.map +1 -1
  140. package/dist/esm/provider/DevicContext.js.map +1 -1
  141. package/dist/esm/provider/DevicProvider.d.ts +1 -1
  142. package/dist/esm/provider/DevicProvider.js +3 -1
  143. package/dist/esm/provider/DevicProvider.js.map +1 -1
  144. package/dist/esm/provider/sharedSession.js.map +1 -1
  145. package/dist/esm/provider/types.d.ts +18 -0
  146. package/dist/esm/utils/avatar.js.map +1 -1
  147. package/dist/esm/utils/consumeChatStream.d.ts +6 -0
  148. package/dist/esm/utils/consumeChatStream.js +42 -0
  149. package/dist/esm/utils/consumeChatStream.js.map +1 -0
  150. package/dist/esm/utils/index.js.map +1 -1
  151. package/dist/esm/utils/logger.js.map +1 -1
  152. package/dist/esm/utils/toolGroups.js.map +1 -1
  153. package/package.json +3 -1
@@ -1 +1 @@
1
- {"version":3,"file":"integrationChoice.js","sources":["../../../../src/components/IntegrationsModal/integrationChoice.ts"],"sourcesContent":["import { storage } from \"../../utils\";\n\n/**\n * What the end user switched off, remembered between visits.\n *\n * Held in the browser and nowhere else: it is a preference of whoever is at\n * this keyboard, not of the tenant, and the server deliberately keeps nothing\n * beyond the turn it was sent for.\n *\n * The key names the assistant AND the tenant it was made under, because a\n * choice about one end user's Gmail means nothing to the next one — and a\n * widget that switched an app off for a colleague who happens to share a\n * browser profile would be a bug with a very long tail.\n */\nconst PREFIX = \"devic:integrations:off\";\n\nexport function integrationChoiceKey(\n assistantId: string,\n tenantId?: string,\n subtenantId?: string\n): string {\n return `${PREFIX}:${assistantId}:${tenantId ?? \"\"}:${subtenantId ?? \"\"}`;\n}\n\n/** Reads the remembered list, tolerating anything that is not one. */\nexport function readIntegrationChoice(key: string): string[] {\n const stored = storage.get<unknown>(key);\n if (!Array.isArray(stored)) return [];\n return stored.filter((id): id is string => typeof id === \"string\" && !!id);\n}\n\nexport function writeIntegrationChoice(key: string, disabled: string[]): void {\n // An empty list is the default, and leaving a `[]` behind in every visitor's\n // storage for every assistant they ever opened is litter.\n if (disabled.length === 0) storage.remove(key);\n else storage.set(key, disabled);\n}\n\n/**\n * Drops what is no longer on offer.\n *\n * Without this, remembering the choice would quietly reintroduce the bug the\n * switch was written to avoid: disconnect an app, connect it again months\n * later, and find it switched off for reasons nobody can reconstruct. The same\n * goes for an MCP server the tenant removed.\n *\n * Returns the SAME array when nothing was stale, so a caller can use identity\n * to avoid a pointless render.\n */\nexport function pruneIntegrationChoice(\n disabled: string[],\n liveIds: string[]\n): string[] {\n if (disabled.length === 0) return disabled;\n const live = new Set(liveIds);\n const next = disabled.filter((id) => live.has(id));\n return next.length === disabled.length ? disabled : next;\n}\n"],"names":[],"mappings":";;AAEA;;;;;;;;;;;AAWG;AACH,MAAM,MAAM,GAAG,wBAAwB;SAEvB,oBAAoB,CAClC,WAAmB,EACnB,QAAiB,EACjB,WAAoB,EAAA;AAEpB,IAAA,OAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA,EAAI,QAAQ,IAAI,EAAE,CAAA,CAAA,EAAI,WAAW,IAAI,EAAE,EAAE;AAC1E;AAEA;AACM,SAAU,qBAAqB,CAAC,GAAW,EAAA;IAC/C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAU,GAAG,CAAC;AACxC,IAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;AAAE,QAAA,OAAO,EAAE;AACrC,IAAA,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,KAAmB,OAAO,EAAE,KAAK,QAAQ,IAAI,CAAC,CAAC,EAAE,CAAC;AAC5E;AAEM,SAAU,sBAAsB,CAAC,GAAW,EAAE,QAAkB,EAAA;;;AAGpE,IAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;AAAE,QAAA,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;;AACzC,QAAA,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC;AACjC;AAEA;;;;;;;;;;AAUG;AACG,SAAU,sBAAsB,CACpC,QAAkB,EAClB,OAAiB,EAAA;AAEjB,IAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;AAAE,QAAA,OAAO,QAAQ;AAC1C,IAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC;AAC7B,IAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClD,IAAA,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,GAAG,QAAQ,GAAG,IAAI;AAC1D;;"}
1
+ {"version":3,"file":"integrationChoice.js","sources":["../../../../src/components/IntegrationsModal/integrationChoice.ts"],"sourcesContent":["import { storage } from \"../../utils\";\n\n/**\n * What the end user switched off, remembered between visits.\n *\n * Held in the browser and nowhere else: it is a preference of whoever is at\n * this keyboard, not of the tenant, and the server deliberately keeps nothing\n * beyond the turn it was sent for.\n *\n * The key names the assistant AND the tenant it was made under, because a\n * choice about one end user's Gmail means nothing to the next one — and a\n * widget that switched an app off for a colleague who happens to share a\n * browser profile would be a bug with a very long tail.\n */\nconst PREFIX = \"devic:integrations:off\";\n\nexport function integrationChoiceKey(\n assistantId: string,\n tenantId?: string,\n subtenantId?: string\n): string {\n return `${PREFIX}:${assistantId}:${tenantId ?? \"\"}:${subtenantId ?? \"\"}`;\n}\n\n/** Reads the remembered list, tolerating anything that is not one. */\nexport function readIntegrationChoice(key: string): string[] {\n const stored = storage.get<unknown>(key);\n if (!Array.isArray(stored)) return [];\n return stored.filter((id): id is string => typeof id === \"string\" && !!id);\n}\n\nexport function writeIntegrationChoice(key: string, disabled: string[]): void {\n // An empty list is the default, and leaving a `[]` behind in every visitor's\n // storage for every assistant they ever opened is litter.\n if (disabled.length === 0) storage.remove(key);\n else storage.set(key, disabled);\n}\n\n/**\n * Drops what is no longer on offer.\n *\n * Without this, remembering the choice would quietly reintroduce the bug the\n * switch was written to avoid: disconnect an app, connect it again months\n * later, and find it switched off for reasons nobody can reconstruct. The same\n * goes for an MCP server the tenant removed.\n *\n * Returns the SAME array when nothing was stale, so a caller can use identity\n * to avoid a pointless render.\n */\nexport function pruneIntegrationChoice(\n disabled: string[],\n liveIds: string[]\n): string[] {\n if (disabled.length === 0) return disabled;\n const live = new Set(liveIds);\n const next = disabled.filter((id) => live.has(id));\n return next.length === disabled.length ? disabled : next;\n}\n"],"names":[],"mappings":";;AAEA;;;;;;;;;;;AAWG;AACH,MAAM,MAAM,GAAG,wBAAwB;SAEvB,oBAAoB,CAClC,WAAmB,EACnB,QAAiB,EACjB,WAAoB,EAAA;AAEpB,IAAA,OAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA,EAAI,QAAQ,IAAI,EAAE,CAAA,CAAA,EAAI,WAAW,IAAI,EAAE,EAAE;AAC1E;AAEA;AACM,SAAU,qBAAqB,CAAC,GAAW,EAAA;IAC/C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAU,GAAG,CAAC;AACxC,IAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;AAAE,QAAA,OAAO,EAAE;AACrC,IAAA,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,KAAmB,OAAO,EAAE,KAAK,QAAQ,IAAI,CAAC,CAAC,EAAE,CAAC;AAC5E;AAEM,SAAU,sBAAsB,CAAC,GAAW,EAAE,QAAkB,EAAA;;;AAGpE,IAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;AAAE,QAAA,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;;AACzC,QAAA,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC;AACjC;AAEA;;;;;;;;;;AAUG;AACG,SAAU,sBAAsB,CACpC,QAAkB,EAClB,OAAiB,EAAA;AAEjB,IAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;AAAE,QAAA,OAAO,QAAQ;AAC1C,IAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC;AAC7B,IAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClD,IAAA,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,GAAG,QAAQ,GAAG,IAAI;AAC1D;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useIntegrations.js","sources":["../../../../src/components/IntegrationsModal/useIntegrations.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { DevicApiError } from \"../../api/client\";\nimport { DevicApiClient } from \"../../api/client\";\nimport type { Integration } from \"../../api/types\";\nimport { useOptionalDevicContext } from \"../../provider\";\nimport { useTranslations } from \"../../i18n\";\n\n/** What identifies the end user in front of the widget. */\nexport interface IntegrationsScope {\n assistantId: string;\n tenantId?: string;\n subtenantId?: string;\n}\n\nexport interface UseIntegrationsOptions extends IntegrationsScope {\n /** API key override (falls back to the provider's). */\n apiKey?: string;\n /** Base URL override (falls back to the provider's). */\n baseUrl?: string;\n /**\n * Fetch when this turns true, and only then. The launcher passes the drawer's\n * open state so a widget nobody opens costs no request at all.\n */\n enabled?: boolean;\n}\n\nexport interface IntegrationsState {\n integrations: Integration[];\n loading: boolean;\n error: string | null;\n /**\n * Whether this assistant offers connected apps to its tenants at all.\n *\n * False before the first answer arrives, and false again if the server said\n * no — which it does for a disabled catalogue, a missing tenant, and an\n * assistant that does not exist, deliberately without distinguishing them.\n * Anything that hangs off this flag stays hidden until the server has said\n * yes, so nothing ever appears and then disappears.\n */\n offered: boolean;\n /** True once a first answer (or refusal) has arrived. */\n settled: boolean;\n refresh: (dropCache?: boolean) => Promise<void>;\n client: DevicApiClient | null;\n scope: IntegrationsScope;\n}\n\n/** A 4xx here means \"not for you\", not \"something broke\". */\nfunction isRefusal(err: unknown): boolean {\n const status = (err as DevicApiError)?.statusCode;\n return typeof status === \"number\" && status >= 400 && status < 500;\n}\n\n/**\n * The apps an assistant offers to its tenants, with the accounts THIS tenant\n * has connected — loaded once and shared.\n *\n * Both the header button and the modal need the same listing: the button to\n * know whether it should exist and which logos to show, the modal to fill\n * itself. Fetching it in each of them would double every round trip and let the\n * two disagree for a moment after connecting an account.\n */\nexport function useIntegrations(\n options: UseIntegrationsOptions\n): IntegrationsState {\n const {\n assistantId,\n tenantId,\n subtenantId,\n apiKey,\n baseUrl,\n enabled = true,\n } = options;\n\n const t = useTranslations();\n const context = useOptionalDevicContext();\n const resolvedBaseUrl = baseUrl || context?.baseUrl || \"https://api.devic.ai\";\n const resolvedTenantId = tenantId || context?.tenantId;\n const resolvedSubtenantId = subtenantId || context?.subtenantId;\n\n const resolvedApiKey = apiKey || context?.apiKey;\n const resolvedTenantSession = context?.getTenantSession;\n const onSessionExpired = context?.onSessionExpired;\n\n const client = useMemo(\n () =>\n resolvedApiKey || resolvedTenantSession\n ? new DevicApiClient({\n apiKey: resolvedApiKey,\n baseUrl: resolvedBaseUrl,\n getTenantSession: resolvedTenantSession,\n onSessionExpired,\n })\n : null,\n [resolvedApiKey, resolvedTenantSession, resolvedBaseUrl]\n );\n\n const scope = useMemo(\n () => ({\n assistantId,\n tenantId: resolvedTenantId || undefined,\n subtenantId: resolvedSubtenantId || undefined,\n }),\n [assistantId, resolvedTenantId, resolvedSubtenantId]\n );\n\n const [integrations, setIntegrations] = useState<Integration[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [offered, setOffered] = useState(false);\n const [settled, setSettled] = useState(false);\n\n const refresh = useCallback(\n async (dropCache = false) => {\n if (!client) {\n setError(t(\"No credentials configured\"));\n setSettled(true);\n return;\n }\n setLoading(true);\n setError(null);\n try {\n // The server caches a scope's connections briefly; after an OAuth round\n // trip that cache is exactly one step behind, so drop it first.\n if (dropCache) {\n await client.refreshIntegrations(scope).catch(() => undefined);\n }\n const list = await client.getIntegrations(scope);\n setIntegrations(list);\n setOffered(list.length > 0);\n } catch (err) {\n setIntegrations([]);\n setOffered(false);\n setError(err instanceof Error ? err.message : String(err));\n if (!isRefusal(err)) {\n // A refusal is an ordinary answer and stays quiet. A 500 or a dead\n // network is not, and swallowing it entirely would leave an\n // integrator with a button that never appears and no reason why.\n console.warn(\"[devic-ui] could not load connected apps\", err);\n }\n } finally {\n setLoading(false);\n setSettled(true);\n }\n },\n [client, scope]\n );\n\n // Once per scope, not once per render of whatever switched it on. A new\n // assistant or tenant is a different listing altogether, so it loads again —\n // and the previous tenant's apps are dropped first, because showing them\n // while the new ones arrive would name accounts that are not this user's.\n const key = `${client ? \"k\" : \"-\"}|${scope.assistantId}|${scope.tenantId ?? \"\"}|${scope.subtenantId ?? \"\"}`;\n const loadedKeyRef = useRef<string | null>(null);\n useEffect(() => {\n if (!enabled || loadedKeyRef.current === key) return;\n if (loadedKeyRef.current !== null) {\n setIntegrations([]);\n setOffered(false);\n setSettled(false);\n }\n loadedKeyRef.current = key;\n void refresh();\n }, [enabled, key, refresh]);\n\n return {\n integrations,\n loading,\n error,\n offered,\n settled,\n refresh,\n client,\n scope,\n };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useIntegrations.js","sources":["../../../../src/components/IntegrationsModal/useIntegrations.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { DevicApiError } from \"../../api/client\";\nimport { DevicApiClient } from \"../../api/client\";\nimport type { Integration } from \"../../api/types\";\nimport { useOptionalDevicContext } from \"../../provider\";\nimport { useTranslations } from \"../../i18n\";\n\n/** What identifies the end user in front of the widget. */\nexport interface IntegrationsScope {\n assistantId: string;\n tenantId?: string;\n subtenantId?: string;\n}\n\nexport interface UseIntegrationsOptions extends IntegrationsScope {\n /** API key override (falls back to the provider's). */\n apiKey?: string;\n /** Base URL override (falls back to the provider's). */\n baseUrl?: string;\n /**\n * Fetch when this turns true, and only then. The launcher passes the drawer's\n * open state so a widget nobody opens costs no request at all.\n */\n enabled?: boolean;\n}\n\nexport interface IntegrationsState {\n integrations: Integration[];\n loading: boolean;\n error: string | null;\n /**\n * Whether this assistant offers connected apps to its tenants at all.\n *\n * False before the first answer arrives, and false again if the server said\n * no — which it does for a disabled catalogue, a missing tenant, and an\n * assistant that does not exist, deliberately without distinguishing them.\n * Anything that hangs off this flag stays hidden until the server has said\n * yes, so nothing ever appears and then disappears.\n */\n offered: boolean;\n /** True once a first answer (or refusal) has arrived. */\n settled: boolean;\n refresh: (dropCache?: boolean) => Promise<void>;\n client: DevicApiClient | null;\n scope: IntegrationsScope;\n}\n\n/** A 4xx here means \"not for you\", not \"something broke\". */\nfunction isRefusal(err: unknown): boolean {\n const status = (err as DevicApiError)?.statusCode;\n return typeof status === \"number\" && status >= 400 && status < 500;\n}\n\n/**\n * The apps an assistant offers to its tenants, with the accounts THIS tenant\n * has connected — loaded once and shared.\n *\n * Both the header button and the modal need the same listing: the button to\n * know whether it should exist and which logos to show, the modal to fill\n * itself. Fetching it in each of them would double every round trip and let the\n * two disagree for a moment after connecting an account.\n */\nexport function useIntegrations(\n options: UseIntegrationsOptions\n): IntegrationsState {\n const {\n assistantId,\n tenantId,\n subtenantId,\n apiKey,\n baseUrl,\n enabled = true,\n } = options;\n\n const t = useTranslations();\n const context = useOptionalDevicContext();\n const resolvedBaseUrl = baseUrl || context?.baseUrl || \"https://api.devic.ai\";\n const resolvedTenantId = tenantId || context?.tenantId;\n const resolvedSubtenantId = subtenantId || context?.subtenantId;\n\n const resolvedApiKey = apiKey || context?.apiKey;\n const resolvedTenantSession = context?.getTenantSession;\n const onSessionExpired = context?.onSessionExpired;\n\n const client = useMemo(\n () =>\n resolvedApiKey || resolvedTenantSession\n ? new DevicApiClient({\n apiKey: resolvedApiKey,\n baseUrl: resolvedBaseUrl,\n getTenantSession: resolvedTenantSession,\n onSessionExpired,\n })\n : null,\n [resolvedApiKey, resolvedTenantSession, resolvedBaseUrl]\n );\n\n const scope = useMemo(\n () => ({\n assistantId,\n tenantId: resolvedTenantId || undefined,\n subtenantId: resolvedSubtenantId || undefined,\n }),\n [assistantId, resolvedTenantId, resolvedSubtenantId]\n );\n\n const [integrations, setIntegrations] = useState<Integration[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [offered, setOffered] = useState(false);\n const [settled, setSettled] = useState(false);\n\n const refresh = useCallback(\n async (dropCache = false) => {\n if (!client) {\n setError(t(\"No credentials configured\"));\n setSettled(true);\n return;\n }\n setLoading(true);\n setError(null);\n try {\n // The server caches a scope's connections briefly; after an OAuth round\n // trip that cache is exactly one step behind, so drop it first.\n if (dropCache) {\n await client.refreshIntegrations(scope).catch(() => undefined);\n }\n const list = await client.getIntegrations(scope);\n setIntegrations(list);\n setOffered(list.length > 0);\n } catch (err) {\n setIntegrations([]);\n setOffered(false);\n setError(err instanceof Error ? err.message : String(err));\n if (!isRefusal(err)) {\n // A refusal is an ordinary answer and stays quiet. A 500 or a dead\n // network is not, and swallowing it entirely would leave an\n // integrator with a button that never appears and no reason why.\n console.warn(\"[devic-ui] could not load connected apps\", err);\n }\n } finally {\n setLoading(false);\n setSettled(true);\n }\n },\n [client, scope]\n );\n\n // Once per scope, not once per render of whatever switched it on. A new\n // assistant or tenant is a different listing altogether, so it loads again —\n // and the previous tenant's apps are dropped first, because showing them\n // while the new ones arrive would name accounts that are not this user's.\n const key = `${client ? \"k\" : \"-\"}|${scope.assistantId}|${scope.tenantId ?? \"\"}|${scope.subtenantId ?? \"\"}`;\n const loadedKeyRef = useRef<string | null>(null);\n useEffect(() => {\n if (!enabled || loadedKeyRef.current === key) return;\n if (loadedKeyRef.current !== null) {\n setIntegrations([]);\n setOffered(false);\n setSettled(false);\n }\n loadedKeyRef.current = key;\n void refresh();\n }, [enabled, key, refresh]);\n\n return {\n integrations,\n loading,\n error,\n offered,\n settled,\n refresh,\n client,\n scope,\n };\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useTenantMcp.js","sources":["../../../../src/components/IntegrationsModal/useTenantMcp.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { DevicApiError } from \"../../api/client\";\nimport { DevicApiClient } from \"../../api/client\";\nimport type { TenantMcpListing, TenantMcpServer } from \"../../api/types\";\nimport { useOptionalDevicContext } from \"../../provider\";\nimport type { IntegrationsScope } from \"./useIntegrations\";\nimport { useTranslations } from \"../../i18n\";\n\nexport interface UseTenantMcpOptions extends IntegrationsScope {\n apiKey?: string;\n baseUrl?: string;\n /**\n * Fetch when this turns true, and only then. The modal passes its own open\n * state, so a panel nobody opens costs no request at all.\n */\n enabled?: boolean;\n}\n\nexport interface TenantMcpState {\n servers: TenantMcpServer[];\n loading: boolean;\n error: string | null;\n /** Whether this assistant offers MCP servers to its tenants at all. */\n offered: boolean;\n /** Whether the end user may add a server of their own. */\n allowCustom: boolean;\n limits: { maxServers: number; maxToolsPerServer: number; used: number };\n /** True once a first answer (or refusal) has arrived. */\n settled: boolean;\n refresh: () => Promise<void>;\n client: DevicApiClient | null;\n scope: IntegrationsScope;\n}\n\n/** A 4xx here means \"not for you\", not \"something broke\". */\nfunction isRefusal(err: unknown): boolean {\n const status = (err as DevicApiError)?.statusCode;\n return typeof status === \"number\" && status >= 400 && status < 500;\n}\n\nconst NO_LIMITS = { maxServers: 0, maxToolsPerServer: 0, used: 0 };\n\n/**\n * The MCP servers an assistant offers its tenants, together with the ones this\n * tenant has connected — loaded once and shared.\n *\n * Deliberately a sibling of `useIntegrations` rather than part of it: the two\n * answer different endpoints, and folding them together would mean an assistant\n * that offers only one of them pays for both on every open.\n */\nexport function useTenantMcp(options: UseTenantMcpOptions): TenantMcpState {\n const { assistantId, tenantId, subtenantId, apiKey, baseUrl, enabled = true } =\n options;\n\n const t = useTranslations();\n const context = useOptionalDevicContext();\n const resolvedBaseUrl = baseUrl || context?.baseUrl || \"https://api.devic.ai\";\n const resolvedTenantId = tenantId || context?.tenantId;\n const resolvedSubtenantId = subtenantId || context?.subtenantId;\n const resolvedApiKey = apiKey || context?.apiKey;\n const resolvedTenantSession = context?.getTenantSession;\n const onSessionExpired = context?.onSessionExpired;\n\n const client = useMemo(\n () =>\n resolvedApiKey || resolvedTenantSession\n ? new DevicApiClient({\n apiKey: resolvedApiKey,\n baseUrl: resolvedBaseUrl,\n getTenantSession: resolvedTenantSession,\n onSessionExpired,\n })\n : null,\n [resolvedApiKey, resolvedTenantSession, resolvedBaseUrl]\n );\n\n const scope = useMemo(\n () => ({\n assistantId,\n tenantId: resolvedTenantId || undefined,\n subtenantId: resolvedSubtenantId || undefined,\n }),\n [assistantId, resolvedTenantId, resolvedSubtenantId]\n );\n\n const [listing, setListing] = useState<TenantMcpListing | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [settled, setSettled] = useState(false);\n\n const refresh = useCallback(async () => {\n if (!client) {\n setError(t(\"No credentials configured\"));\n setSettled(true);\n return;\n }\n setLoading(true);\n setError(null);\n try {\n setListing(await client.getMcpServers(scope));\n } catch (err) {\n setListing(null);\n setError(err instanceof Error ? err.message : String(err));\n if (!isRefusal(err)) {\n // A refusal is an ordinary answer — a disabled feature, a missing\n // tenant — and stays quiet. A 500 is not, and swallowing it would\n // leave an integrator with a panel that never appears and no reason.\n console.warn(\"[devic-ui] could not load MCP servers\", err);\n }\n } finally {\n setLoading(false);\n setSettled(true);\n }\n }, [client, scope]);\n\n // Once per scope, not once per render of whatever switched it on. A different\n // tenant is a different listing, and the previous one is dropped first:\n // showing it while the new one arrives would name servers that are not this\n // user's.\n const key = `${client ? \"k\" : \"-\"}|${scope.assistantId}|${scope.tenantId ?? \"\"}|${scope.subtenantId ?? \"\"}`;\n const loadedKeyRef = useRef<string | null>(null);\n useEffect(() => {\n if (!enabled || loadedKeyRef.current === key) return;\n if (loadedKeyRef.current !== null) {\n setListing(null);\n setSettled(false);\n }\n loadedKeyRef.current = key;\n void refresh();\n }, [enabled, key, refresh]);\n\n return {\n servers: listing?.servers ?? [],\n loading,\n error,\n // Offered only once the server has said so. Anything hanging off this stays\n // hidden until then, so nothing appears and then disappears.\n offered: !!listing?.offered,\n allowCustom: !!listing?.allowCustom,\n limits: listing?.limits ?? NO_LIMITS,\n settled,\n refresh,\n client,\n scope,\n };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useTenantMcp.js","sources":["../../../../src/components/IntegrationsModal/useTenantMcp.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { DevicApiError } from \"../../api/client\";\nimport { DevicApiClient } from \"../../api/client\";\nimport type { TenantMcpListing, TenantMcpServer } from \"../../api/types\";\nimport { useOptionalDevicContext } from \"../../provider\";\nimport type { IntegrationsScope } from \"./useIntegrations\";\nimport { useTranslations } from \"../../i18n\";\n\nexport interface UseTenantMcpOptions extends IntegrationsScope {\n apiKey?: string;\n baseUrl?: string;\n /**\n * Fetch when this turns true, and only then. The modal passes its own open\n * state, so a panel nobody opens costs no request at all.\n */\n enabled?: boolean;\n}\n\nexport interface TenantMcpState {\n servers: TenantMcpServer[];\n loading: boolean;\n error: string | null;\n /** Whether this assistant offers MCP servers to its tenants at all. */\n offered: boolean;\n /** Whether the end user may add a server of their own. */\n allowCustom: boolean;\n limits: { maxServers: number; maxToolsPerServer: number; used: number };\n /** True once a first answer (or refusal) has arrived. */\n settled: boolean;\n refresh: () => Promise<void>;\n client: DevicApiClient | null;\n scope: IntegrationsScope;\n}\n\n/** A 4xx here means \"not for you\", not \"something broke\". */\nfunction isRefusal(err: unknown): boolean {\n const status = (err as DevicApiError)?.statusCode;\n return typeof status === \"number\" && status >= 400 && status < 500;\n}\n\nconst NO_LIMITS = { maxServers: 0, maxToolsPerServer: 0, used: 0 };\n\n/**\n * The MCP servers an assistant offers its tenants, together with the ones this\n * tenant has connected — loaded once and shared.\n *\n * Deliberately a sibling of `useIntegrations` rather than part of it: the two\n * answer different endpoints, and folding them together would mean an assistant\n * that offers only one of them pays for both on every open.\n */\nexport function useTenantMcp(options: UseTenantMcpOptions): TenantMcpState {\n const { assistantId, tenantId, subtenantId, apiKey, baseUrl, enabled = true } =\n options;\n\n const t = useTranslations();\n const context = useOptionalDevicContext();\n const resolvedBaseUrl = baseUrl || context?.baseUrl || \"https://api.devic.ai\";\n const resolvedTenantId = tenantId || context?.tenantId;\n const resolvedSubtenantId = subtenantId || context?.subtenantId;\n const resolvedApiKey = apiKey || context?.apiKey;\n const resolvedTenantSession = context?.getTenantSession;\n const onSessionExpired = context?.onSessionExpired;\n\n const client = useMemo(\n () =>\n resolvedApiKey || resolvedTenantSession\n ? new DevicApiClient({\n apiKey: resolvedApiKey,\n baseUrl: resolvedBaseUrl,\n getTenantSession: resolvedTenantSession,\n onSessionExpired,\n })\n : null,\n [resolvedApiKey, resolvedTenantSession, resolvedBaseUrl]\n );\n\n const scope = useMemo(\n () => ({\n assistantId,\n tenantId: resolvedTenantId || undefined,\n subtenantId: resolvedSubtenantId || undefined,\n }),\n [assistantId, resolvedTenantId, resolvedSubtenantId]\n );\n\n const [listing, setListing] = useState<TenantMcpListing | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [settled, setSettled] = useState(false);\n\n const refresh = useCallback(async () => {\n if (!client) {\n setError(t(\"No credentials configured\"));\n setSettled(true);\n return;\n }\n setLoading(true);\n setError(null);\n try {\n setListing(await client.getMcpServers(scope));\n } catch (err) {\n setListing(null);\n setError(err instanceof Error ? err.message : String(err));\n if (!isRefusal(err)) {\n // A refusal is an ordinary answer — a disabled feature, a missing\n // tenant — and stays quiet. A 500 is not, and swallowing it would\n // leave an integrator with a panel that never appears and no reason.\n console.warn(\"[devic-ui] could not load MCP servers\", err);\n }\n } finally {\n setLoading(false);\n setSettled(true);\n }\n }, [client, scope]);\n\n // Once per scope, not once per render of whatever switched it on. A different\n // tenant is a different listing, and the previous one is dropped first:\n // showing it while the new one arrives would name servers that are not this\n // user's.\n const key = `${client ? \"k\" : \"-\"}|${scope.assistantId}|${scope.tenantId ?? \"\"}|${scope.subtenantId ?? \"\"}`;\n const loadedKeyRef = useRef<string | null>(null);\n useEffect(() => {\n if (!enabled || loadedKeyRef.current === key) return;\n if (loadedKeyRef.current !== null) {\n setListing(null);\n setSettled(false);\n }\n loadedKeyRef.current = key;\n void refresh();\n }, [enabled, key, refresh]);\n\n return {\n servers: listing?.servers ?? [],\n loading,\n error,\n // Offered only once the server has said so. Anything hanging off this stays\n // hidden until then, so nothing appears and then disappears.\n offered: !!listing?.offered,\n allowCustom: !!listing?.allowCustom,\n limits: listing?.limits ?? NO_LIMITS,\n settled,\n refresh,\n client,\n scope,\n };\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadStateTag.js","sources":["../../../../src/components/ThreadStateTag/ThreadStateTag.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useOptionalDevicContext } from '../../provider';\nimport { DevicApiClient } from '../../api/client';\nimport { AgentThreadState } from '../../api/types';\nimport type { ThreadStateTagProps, StateConfig } from './ThreadStateTag.types';\nimport { useTranslations, type Translator } from '../../i18n';\nimport './ThreadStateTag.css';\n\n/* ── State configuration map ── */\n\nfunction getStateConfig(\n t: Translator,\n state: string,\n subthreadCount?: number\n): StateConfig {\n const configs: Record<string, StateConfig> = {\n [AgentThreadState.QUEUED]: {\n color: 'gold', bgColor: '#fffbe6', borderColor: '#ffe58f',\n text: t('Queued'), iconType: null,\n },\n [AgentThreadState.PROCESSING]: {\n color: 'processing', bgColor: '#e6f4ff', borderColor: '#91caff',\n text: t('Processing'), iconType: 'spinner',\n },\n [AgentThreadState.COMPLETED]: {\n color: 'success', bgColor: '#f6ffed', borderColor: '#b7eb8f',\n text: t('Completed'), iconType: null,\n },\n [AgentThreadState.FAILED]: {\n color: 'error', bgColor: '#fff2f0', borderColor: '#ffa39e',\n text: t('Failed'), iconType: null,\n },\n [AgentThreadState.TERMINATED]: {\n color: 'default', bgColor: '#fafafa', borderColor: '#d9d9d9',\n text: t('Terminated'), iconType: null,\n },\n [AgentThreadState.GUARDRAIL_TRIGGER]: {\n color: 'error', bgColor: '#fff2f0', borderColor: '#ffa39e',\n text: t('Guardrail Triggered'), iconType: 'shield',\n },\n [AgentThreadState.PAUSED]: {\n color: 'purple', bgColor: '#f9f0ff', borderColor: '#d3adf7',\n text: t('Paused'), iconType: 'pause',\n },\n [AgentThreadState.PAUSED_FOR_APPROVAL]: {\n color: 'gold', bgColor: '#fffbe6', borderColor: '#ffe58f',\n text: t('Waiting for approval'), iconType: 'warning',\n },\n [AgentThreadState.APPROVAL_REJECTED]: {\n color: 'error', bgColor: '#fff2f0', borderColor: '#ffa39e',\n text: t('Approval rejected'), iconType: null,\n },\n [AgentThreadState.WAITING_FOR_RESPONSE]: {\n color: 'gold', bgColor: '#fffbe6', borderColor: '#ffe58f',\n text: t('Waiting for response'), iconType: 'envelope',\n },\n [AgentThreadState.PAUSED_FOR_RESUME]: {\n color: 'blue', bgColor: '#e6f4ff', borderColor: '#91caff',\n text: t('Resume scheduled'), iconType: 'clock',\n },\n [AgentThreadState.HANDED_OFF]: {\n color: 'blue', bgColor: '#e6f4ff', borderColor: '#91caff',\n text:\n subthreadCount && subthreadCount > 1\n ? t('Handed off ({count})', { count: subthreadCount })\n : t('Handed off'),\n iconType: 'handoff',\n },\n };\n\n return (\n configs[state] || {\n color: 'default',\n bgColor: '#fafafa',\n borderColor: '#d9d9d9',\n text: t('Unknown'),\n iconType: null,\n }\n );\n}\n\n/* ── SVG Icons ── */\n\nfunction SpinnerIcon(): JSX.Element {\n return (\n <svg className=\"devic-state-spinner\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\">\n <path d=\"M12 2v4M12 18v4M4.93 4.93l2.83 2.83M16.24 16.24l2.83 2.83M2 12h4M18 12h4M4.93 19.07l2.83-2.83M16.24 7.76l2.83-2.83\" />\n </svg>\n );\n}\n\nfunction PauseIcon(): JSX.Element {\n return (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <rect x=\"6\" y=\"4\" width=\"4\" height=\"16\" rx=\"1\" />\n <rect x=\"14\" y=\"4\" width=\"4\" height=\"16\" rx=\"1\" />\n </svg>\n );\n}\n\nfunction PlayIcon(): JSX.Element {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M8 5v14l11-7z\" />\n </svg>\n );\n}\n\nfunction WarningIcon(): JSX.Element {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\" />\n </svg>\n );\n}\n\nfunction EnvelopeIcon(): JSX.Element {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"2\" />\n <path d=\"M22 7l-10 7L2 7\" />\n </svg>\n );\n}\n\nfunction ClockIcon(): JSX.Element {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <polyline points=\"12,6 12,12 16,14\" />\n </svg>\n );\n}\n\nfunction ShieldIcon(): JSX.Element {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n );\n}\n\nfunction HandoffIcon(): JSX.Element {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm-1 6h2a3 3 0 0 1 3 3v3h-2v-3a1 1 0 0 0-1-1h-2a1 1 0 0 0-1 1v3H8v-3a3 3 0 0 1 3-3z\" />\n <path d=\"M16 16l4-2-4-2v4z\" opacity=\"0.8\" />\n </svg>\n );\n}\n\nfunction CaretDownIcon(): JSX.Element {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"5 8 14 9\" fill=\"currentColor\">\n <path d=\"M7 10l5 5 5-5z\" />\n </svg>\n );\n}\n\nfunction WrenchIcon(): JSX.Element {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z\" />\n </svg>\n );\n}\n\nfunction EyeIcon(): JSX.Element {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n );\n}\n\nfunction SendIcon(): JSX.Element {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\" />\n <polygon points=\"22 2 15 22 11 13 2 9 22 2\" />\n </svg>\n );\n}\n\nfunction LightbulbIcon(): JSX.Element {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"#FFC000\" stroke=\"#FFC000\" strokeWidth=\"1\">\n <path d=\"M9 21h6M12 3a6 6 0 0 0-4 10.5V17h8v-3.5A6 6 0 0 0 12 3z\" fill=\"#FFC000\" stroke=\"none\" />\n </svg>\n );\n}\n\nfunction RobotIcon(): JSX.Element {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <rect x=\"4\" y=\"8\" width=\"16\" height=\"12\" rx=\"2\" />\n <circle cx=\"9\" cy=\"14\" r=\"2\" fill=\"#fff\" />\n <circle cx=\"15\" cy=\"14\" r=\"2\" fill=\"#fff\" />\n <line x1=\"12\" y1=\"2\" x2=\"12\" y2=\"8\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <circle cx=\"12\" cy=\"2\" r=\"1.5\" />\n </svg>\n );\n}\n\nfunction UserIcon(): JSX.Element {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z\" />\n </svg>\n );\n}\n\nfunction CloseIcon(): JSX.Element {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n );\n}\n\nfunction InfoIcon(): JSX.Element {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z\" />\n </svg>\n );\n}\n\n/* ── Helper: render icon by type ── */\n\nfunction StateIcon({ iconType }: { iconType: string | null }): JSX.Element | null {\n switch (iconType) {\n case 'spinner': return <SpinnerIcon />;\n case 'pause': return <PauseIcon />;\n case 'warning': return <WarningIcon />;\n case 'envelope': return <EnvelopeIcon />;\n case 'clock': return <ClockIcon />;\n case 'shield': return <ShieldIcon />;\n case 'handoff': return <HandoffIcon />;\n default: return null;\n }\n}\n\n/* ── Modal component ── */\n\nfunction Modal({\n open,\n onClose,\n title,\n titleIcon,\n children,\n footer,\n}: {\n open: boolean;\n onClose: () => void;\n title: string;\n titleIcon?: React.ReactNode;\n children: React.ReactNode;\n footer?: React.ReactNode;\n}): JSX.Element | null {\n if (!open) return null;\n\n return createPortal(\n <div className=\"devic-state-modal-overlay\" onClick={onClose}>\n <div className=\"devic-state-modal\" onClick={(e) => e.stopPropagation()}>\n <div className=\"devic-state-modal-header\">\n <h3 className=\"devic-state-modal-title\">\n {titleIcon}\n {title}\n </h3>\n <button className=\"devic-state-modal-close\" onClick={onClose} type=\"button\">\n <CloseIcon />\n </button>\n </div>\n <div className=\"devic-state-modal-body\">\n {children}\n </div>\n {footer && (\n <div className=\"devic-state-modal-footer\">\n {footer}\n </div>\n )}\n </div>\n </div>,\n document.body\n );\n}\n\n/* ── Explain Modal with typing effect ── */\n\nfunction ExplainModal({\n open,\n onClose,\n explanation,\n isLoading,\n agentName,\n}: {\n open: boolean;\n onClose: () => void;\n explanation: string | null;\n isLoading: boolean;\n agentName: string;\n}): JSX.Element | null {\n const t = useTranslations();\n const [displayedText, setDisplayedText] = useState('');\n const [fullTextDisplayed, setFullTextDisplayed] = useState(false);\n const charIndexRef = useRef(0);\n\n useEffect(() => {\n if (!explanation || isLoading) {\n setDisplayedText('');\n charIndexRef.current = 0;\n setFullTextDisplayed(false);\n return;\n }\n\n if (charIndexRef.current < explanation.length) {\n const timer = setTimeout(() => {\n charIndexRef.current++;\n setDisplayedText(explanation.slice(0, charIndexRef.current));\n if (charIndexRef.current >= explanation.length) {\n setFullTextDisplayed(true);\n }\n }, 20);\n return () => clearTimeout(timer);\n }\n }, [explanation, isLoading, displayedText]);\n\n const handleClose = () => {\n setDisplayedText('');\n charIndexRef.current = 0;\n setFullTextDisplayed(false);\n onClose();\n };\n\n return (\n <Modal\n open={open}\n onClose={handleClose}\n title={t('Thread execution description of \"{agent}\"', {\n agent: agentName,\n })}\n titleIcon={<LightbulbIcon />}\n >\n {isLoading ? (\n <div className=\"devic-state-loading\">\n <div className=\"devic-state-loading-spinner\" />\n </div>\n ) : (\n <div className=\"devic-explain-content\">\n {displayedText}\n {!fullTextDisplayed && <span className=\"devic-typing-cursor\">|</span>}\n </div>\n )}\n </Modal>\n );\n}\n\n/* ── Approval Modal ── */\n\nfunction ApprovalModal({\n open,\n onClose,\n onApprove,\n isLoading,\n pausedReason,\n}: {\n open: boolean;\n onClose: () => void;\n onApprove: (action: 'approved' | 'rejected', retry: boolean, message?: string) => void;\n isLoading: boolean;\n pausedReason?: string;\n}): JSX.Element | null {\n const t = useTranslations();\n const [feedback, setFeedback] = useState('');\n\n const handleClose = () => {\n setFeedback('');\n onClose();\n };\n\n return (\n <Modal\n open={open}\n onClose={handleClose}\n title={t('Review Agent Request')}\n titleIcon={<EyeIcon />}\n >\n <div className=\"devic-approval-layout\">\n <div className=\"devic-approval-request\">\n <div style={{ fontWeight: 600, marginBottom: 8, fontSize: 13 }}>\n {t(\"Agent's request:\")}\n </div>\n <div style={{ whiteSpace: 'pre-wrap' }}>\n {pausedReason ||\n t('Agent is waiting for approval to resume execution.')}\n </div>\n </div>\n <div className=\"devic-approval-actions\">\n <div style={{ fontWeight: 600, fontSize: 13 }}>\n {t('Your feedback:')}\n </div>\n <textarea\n className=\"devic-approval-textarea\"\n value={feedback}\n onChange={(e) => setFeedback(e.target.value)}\n placeholder={t('Optional feedback for the agent...')}\n />\n <div className=\"devic-approval-buttons\">\n <button\n className=\"devic-state-btn devic-state-btn-danger\"\n onClick={() => onApprove('rejected', false, feedback)}\n disabled={isLoading}\n type=\"button\"\n >\n {t('Reject and finish')}\n </button>\n <button\n className=\"devic-state-btn devic-state-btn-primary\"\n onClick={() => onApprove('rejected', true, feedback)}\n disabled={isLoading || !feedback.trim()}\n type=\"button\"\n >\n {t('Continue with feedback')}\n </button>\n <button\n className=\"devic-state-btn devic-state-btn-success\"\n onClick={() => onApprove('approved', false)}\n disabled={isLoading}\n type=\"button\"\n >\n {t('Approve')}\n </button>\n </div>\n </div>\n </div>\n </Modal>\n );\n}\n\n/* ── Send Message Modal ── */\n\nfunction SendMessageModal({\n open,\n onClose,\n onSend,\n isLoading,\n state,\n}: {\n open: boolean;\n onClose: () => void;\n onSend: (message: string) => void;\n isLoading: boolean;\n state: AgentThreadState | string;\n}): JSX.Element | null {\n const t = useTranslations();\n const [message, setMessage] = useState('');\n\n const handleClose = () => {\n setMessage('');\n onClose();\n };\n\n const isRunning =\n state === AgentThreadState.PROCESSING || state === AgentThreadState.QUEUED;\n\n return (\n <Modal\n open={open}\n onClose={handleClose}\n title={t('Send message to thread')}\n titleIcon={<SendIcon />}\n footer={\n <>\n <button className=\"devic-state-btn\" onClick={handleClose} type=\"button\">\n {t('Cancel')}\n </button>\n <button\n className=\"devic-state-btn devic-state-btn-primary\"\n onClick={() => onSend(message)}\n disabled={isLoading || !message.trim()}\n type=\"button\"\n >\n {t('Send')}\n </button>\n </>\n }\n >\n <div style={{ marginBottom: 12 }}>\n <p style={{ margin: '4px 0 12px', color: '#666', fontSize: 13 }}>\n {isRunning\n ? t(\n 'The agent is still running. Your message will be considered on its next turn, right after the current tool response.'\n )\n : t(\n 'This will add your message and re-queue the thread so the agent runs again with it.'\n )}\n </p>\n <textarea\n className=\"devic-approval-textarea\"\n value={message}\n onChange={(e) => setMessage(e.target.value)}\n placeholder={t('Type a message to continue the thread...')}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && (e.ctrlKey || e.metaKey) && message.trim()) {\n e.preventDefault();\n onSend(message);\n }\n }}\n />\n </div>\n </Modal>\n );\n}\n\n/* ── Complete Thread Modal ── */\n\nfunction CompleteModal({\n open,\n onClose,\n onComplete,\n}: {\n open: boolean;\n onClose: () => void;\n onComplete: (state: string) => void;\n}): JSX.Element | null {\n const t = useTranslations();\n const [completionState, setCompletionState] = useState('terminated');\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n title={t('Complete Execution Manually')}\n titleIcon={<WrenchIcon />}\n footer={\n <>\n <button className=\"devic-state-btn\" onClick={onClose} type=\"button\">\n {t('Cancel')}\n </button>\n <button className=\"devic-state-btn devic-state-btn-danger\" onClick={() => onComplete(completionState)} type=\"button\">\n {t('Complete')}\n </button>\n </>\n }\n >\n <div style={{ marginBottom: 12 }}>\n <div style={{ fontWeight: 600, marginBottom: 4 }}>\n {t('Confirm Manual Completion')}\n </div>\n <p style={{ margin: '4px 0 12px', color: '#666', fontSize: 13 }}>\n {t(\"You are about to manually complete this agent's execution.\")}\n </p>\n <div style={{ marginBottom: 12 }}>\n <div style={{ fontWeight: 500, marginBottom: 6, fontSize: 13 }}>\n {t('Complete as:')}\n </div>\n <select\n className=\"devic-completion-select\"\n value={completionState}\n onChange={(e) => setCompletionState(e.target.value)}\n >\n <option value=\"terminated\">\n {t('Terminated - Finish thread as manually terminated')}\n </option>\n <option value=\"completed\">\n {t('Completed - Finish thread as successfully completed')}\n </option>\n <option value=\"failed\">\n {t('Failed - Finish thread as failed or with errors')}\n </option>\n </select>\n </div>\n <div className=\"devic-state-warning\">\n <InfoIcon />\n <span>\n {t(\n 'This action will immediately terminate all ongoing processes. The execution cannot be resumed after completion.'\n )}\n </span>\n </div>\n </div>\n </Modal>\n );\n}\n\n/* ── Confirm Modal (Pause/Resume) ── */\n\nfunction ConfirmModal({\n open,\n onClose,\n onConfirm,\n title,\n icon,\n message,\n confirmText,\n}: {\n open: boolean;\n onClose: () => void;\n onConfirm: () => void;\n title: string;\n icon: React.ReactNode;\n message: string;\n confirmText: string;\n}): JSX.Element | null {\n const t = useTranslations();\n return (\n <Modal\n open={open}\n onClose={onClose}\n title={title}\n titleIcon={icon}\n footer={\n <>\n <button className=\"devic-state-btn\" onClick={onClose} type=\"button\">\n {t('Cancel')}\n </button>\n <button className=\"devic-state-btn devic-state-btn-primary\" onClick={onConfirm} type=\"button\">\n {confirmText}\n </button>\n </>\n }\n >\n <p style={{ margin: 0, color: '#666', fontSize: 14 }}>{message}</p>\n </Modal>\n );\n}\n\n/* ── Main ThreadStateTag ── */\n\nexport function ThreadStateTag({\n state,\n threadId,\n agentName,\n showIcon = true,\n customIcon,\n pausedReason,\n approvalRejectedMessage,\n finishReason,\n onActionComplete,\n pauseUntil,\n subthreadCount,\n showAdminActions = false,\n apiKey,\n baseUrl,\n interactive = true,\n}: ThreadStateTagProps): JSX.Element {\n const t = useTranslations();\n const context = useOptionalDevicContext();\n const resolvedApiKey = apiKey || context?.apiKey;\n const resolvedTenantSession = context?.getTenantSession;\n const onSessionExpired = context?.onSessionExpired;\n const resolvedBaseUrl = baseUrl || context?.baseUrl || 'https://api.devic.ai';\n\n // State\n const [dropdownOpen, setDropdownOpen] = useState(false);\n const [showTooltip, setShowTooltip] = useState(false);\n const [explainModalOpen, setExplainModalOpen] = useState(false);\n const [threadExplanation, setThreadExplanation] = useState<string | null>(null);\n const [isLoadingExplanation, setIsLoadingExplanation] = useState(false);\n const [pauseModalOpen, setPauseModalOpen] = useState(false);\n const [resumeModalOpen, setResumeModalOpen] = useState(false);\n const [reviewModalOpen, setReviewModalOpen] = useState(false);\n const [isLoadingApproval, setIsLoadingApproval] = useState(false);\n const [completeModalOpen, setCompleteModalOpen] = useState(false);\n const [sendMessageModalOpen, setSendMessageModalOpen] = useState(false);\n const [isSendingMessage, setIsSendingMessage] = useState(false);\n\n const tagRef = useRef<HTMLDivElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const [tooltipStyle, setTooltipStyle] = useState<React.CSSProperties>({});\n const [dropdownStyle, setDropdownStyle] = useState<React.CSSProperties>({});\n\n // Close dropdown on click outside\n useEffect(() => {\n if (!dropdownOpen) return;\n const handleClick = (e: MouseEvent) => {\n const target = e.target as Node;\n if (\n tagRef.current && !tagRef.current.contains(target) &&\n (!dropdownRef.current || !dropdownRef.current.contains(target))\n ) {\n setDropdownOpen(false);\n }\n };\n document.addEventListener('mousedown', handleClick);\n return () => document.removeEventListener('mousedown', handleClick);\n }, [dropdownOpen]);\n\n // API client\n const getClient = useCallback((): DevicApiClient | null => {\n if (!resolvedApiKey && !resolvedTenantSession) return null;\n return new DevicApiClient({\n apiKey: resolvedApiKey,\n baseUrl: resolvedBaseUrl,\n getTenantSession: resolvedTenantSession,\n onSessionExpired,\n });\n }, [resolvedApiKey, resolvedTenantSession, resolvedBaseUrl]);\n\n // Config\n const config = getStateConfig(t, state, subthreadCount);\n\n if (!state) {\n return (\n <span className=\"devic-state-tag\" data-color=\"default\">\n {t('Unknown')}\n </span>\n );\n }\n\n // Icon\n const renderIcon = () => {\n if (!showIcon) return null;\n if (customIcon) return <span className=\"devic-state-tag-icon\">{customIcon}</span>;\n const icon = <StateIcon iconType={config.iconType} />;\n return icon ? <span className=\"devic-state-tag-icon\">{icon}</span> : null;\n };\n\n // Tooltip content\n const getTooltipContent = (): string | null => {\n switch (state) {\n case AgentThreadState.PAUSED_FOR_APPROVAL:\n return t('Agent is waiting for approval to resume execution');\n case AgentThreadState.PAUSED_FOR_RESUME:\n if (pauseUntil) {\n const timeDiff = new Date(pauseUntil).getTime() - Date.now();\n const hours = Math.floor(timeDiff / 3600000);\n const minutes = Math.floor(timeDiff / 60000);\n const timeStr =\n hours > 0\n ? t('{count} hours', { count: hours })\n : t('{count} minutes', { count: minutes });\n return t('Agent paused, will resume at {when} ({in})', {\n when: new Date(pauseUntil).toLocaleString(),\n in: timeStr,\n });\n }\n return t('Agent paused, will resume at a scheduled time');\n case AgentThreadState.WAITING_FOR_RESPONSE:\n return pausedReason || t('Agent is waiting for response');\n case AgentThreadState.COMPLETED:\n case AgentThreadState.FAILED:\n case AgentThreadState.TERMINATED:\n return finishReason || t('Manually finished thread');\n case AgentThreadState.APPROVAL_REJECTED:\n return approvalRejectedMessage || t('Approval was rejected');\n case AgentThreadState.GUARDRAIL_TRIGGER:\n return t('Agent execution paused due to guardrail trigger');\n default:\n return null;\n }\n };\n\n // Handlers\n const handleExplain = async () => {\n setDropdownOpen(false);\n setExplainModalOpen(true);\n setIsLoadingExplanation(true);\n setThreadExplanation(null);\n\n const client = getClient();\n if (!client) {\n setThreadExplanation(t('API key not configured.'));\n setIsLoadingExplanation(false);\n return;\n }\n\n try {\n const explanation = await client.explainAgentThread(threadId);\n setThreadExplanation(explanation);\n } catch {\n setThreadExplanation(t('Could not obtain the thread explanation.'));\n } finally {\n setIsLoadingExplanation(false);\n }\n };\n\n const handlePause = async () => {\n const client = getClient();\n if (!client) return;\n try {\n await client.pauseResumeThread(threadId, 'paused');\n setPauseModalOpen(false);\n onActionComplete?.();\n } catch (err) {\n console.error('Error pausing thread:', err);\n }\n };\n\n const handleResume = async () => {\n const client = getClient();\n if (!client) return;\n try {\n await client.pauseResumeThread(threadId, 'queued');\n setResumeModalOpen(false);\n onActionComplete?.();\n } catch (err) {\n console.error('Error resuming thread:', err);\n }\n };\n\n const handleApproval = async (action: 'approved' | 'rejected', retry: boolean, message?: string) => {\n const client = getClient();\n if (!client) return;\n setIsLoadingApproval(true);\n try {\n await client.handleThreadApproval(threadId, action === 'approved', retry, message || '');\n setReviewModalOpen(false);\n onActionComplete?.();\n } catch (err) {\n console.error('Error handling thread approval:', err);\n } finally {\n setIsLoadingApproval(false);\n }\n };\n\n const handleComplete = async (completionState: string) => {\n const client = getClient();\n if (!client) return;\n try {\n await client.completeThread(threadId, completionState);\n setCompleteModalOpen(false);\n onActionComplete?.();\n } catch (err) {\n console.error('Error completing thread:', err);\n }\n };\n\n const handleSendMessage = async (message: string) => {\n const text = message.trim();\n if (!text) return;\n const client = getClient();\n if (!client) return;\n setIsSendingMessage(true);\n try {\n await client.sendThreadMessage(threadId, text);\n setSendMessageModalOpen(false);\n onActionComplete?.();\n } catch (err) {\n console.error('Error sending message to thread:', err);\n } finally {\n setIsSendingMessage(false);\n }\n };\n\n // States that can't be continued with a free user message (approval decision,\n // handed off to a subagent, or still being created).\n const canSendMessage =\n !!threadId &&\n ![\n AgentThreadState.PAUSED_FOR_APPROVAL,\n AgentThreadState.HANDED_OFF,\n ].includes(state as AgentThreadState) &&\n state !== 'under_construction';\n\n // Build dropdown items\n const dropdownItems: Array<{ key: string; icon: React.ReactNode; label: string; onClick: () => void }> = [];\n\n if (showAdminActions && [AgentThreadState.PROCESSING, AgentThreadState.QUEUED, AgentThreadState.WAITING_FOR_RESPONSE].includes(state as AgentThreadState)) {\n dropdownItems.push({\n key: 'complete',\n icon: <WrenchIcon />,\n label: t('Complete manually'),\n onClick: () => { setDropdownOpen(false); setCompleteModalOpen(true); },\n });\n }\n\n if (state === AgentThreadState.QUEUED) {\n dropdownItems.push({\n key: 'pause',\n icon: <PauseIcon />,\n label: t('Pause'),\n onClick: () => { setDropdownOpen(false); setPauseModalOpen(true); },\n });\n }\n\n if (state === AgentThreadState.PAUSED || state === AgentThreadState.PAUSED_FOR_RESUME) {\n dropdownItems.push({\n key: 'resume',\n icon: <PlayIcon />,\n label: t('Resume'),\n onClick: () => { setDropdownOpen(false); setResumeModalOpen(true); },\n });\n }\n\n if (state === AgentThreadState.PAUSED_FOR_APPROVAL) {\n dropdownItems.push({\n key: 'review',\n icon: <EyeIcon />,\n label: t('Review'),\n onClick: () => { setDropdownOpen(false); setReviewModalOpen(true); },\n });\n }\n\n if (canSendMessage) {\n dropdownItems.push({\n key: 'send_message',\n icon: <SendIcon />,\n label: t('Send message...'),\n onClick: () => { setDropdownOpen(false); setSendMessageModalOpen(true); },\n });\n }\n\n dropdownItems.push({\n key: 'explain',\n icon: <LightbulbIcon />,\n label: t('Explain thread...'),\n onClick: handleExplain,\n });\n\n const canInteract = interactive && threadId;\n const tooltipContent = getTooltipContent();\n\n return (\n <>\n <div\n ref={tagRef}\n className=\"devic-state-tag\"\n data-color={config.color}\n data-interactive={String(!!canInteract)}\n data-dropdown-open={String(dropdownOpen)}\n onClick={canInteract ? () => {\n if (!dropdownOpen) {\n const rect = tagRef.current?.getBoundingClientRect();\n if (rect) {\n setDropdownStyle({\n position: 'fixed',\n top: rect.bottom + 4,\n right: window.innerWidth - rect.right,\n });\n }\n }\n setDropdownOpen(!dropdownOpen);\n } : undefined}\n onMouseEnter={() => {\n if (!dropdownOpen && tooltipContent) {\n const rect = tagRef.current?.getBoundingClientRect();\n if (rect) {\n setTooltipStyle({\n position: 'fixed',\n top: rect.top - 8,\n left: rect.left + rect.width / 2,\n transform: 'translate(-50%, -100%)',\n });\n }\n setShowTooltip(true);\n }\n }}\n onMouseLeave={() => setShowTooltip(false)}\n >\n {renderIcon()}\n {config.text}\n {canInteract && (\n <span className=\"devic-state-tag-caret\">\n <CaretDownIcon />\n </span>\n )}\n\n </div>\n\n {/* Tooltip - portal to escape overflow/transform containers */}\n {showTooltip && tooltipContent && !dropdownOpen && createPortal(\n <div className=\"devic-state-tooltip-portal\" style={tooltipStyle}>{tooltipContent}</div>,\n document.body\n )}\n\n {/* Dropdown - portal to escape overflow/transform containers */}\n {dropdownOpen && canInteract && createPortal(\n <div ref={dropdownRef} className=\"devic-state-dropdown-portal\" style={dropdownStyle}>\n {dropdownItems.map((item) => (\n <button\n key={item.key}\n className=\"devic-state-dropdown-item\"\n onClick={(e) => { e.stopPropagation(); item.onClick(); }}\n type=\"button\"\n >\n <span className=\"devic-state-dropdown-item-icon\">{item.icon}</span>\n {item.label}\n </button>\n ))}\n </div>,\n document.body\n )}\n\n {/* Modals */}\n <ExplainModal\n open={explainModalOpen}\n onClose={() => setExplainModalOpen(false)}\n explanation={threadExplanation}\n isLoading={isLoadingExplanation}\n agentName={agentName}\n />\n\n <CompleteModal\n open={completeModalOpen}\n onClose={() => setCompleteModalOpen(false)}\n onComplete={handleComplete}\n />\n\n <ConfirmModal\n open={pauseModalOpen}\n onClose={() => setPauseModalOpen(false)}\n onConfirm={handlePause}\n title={t('Pause Thread')}\n icon={<PauseIcon />}\n message={t(\n 'You are about to pause this queued thread. It can be resumed later.'\n )}\n confirmText={t('Pause')}\n />\n\n <ConfirmModal\n open={resumeModalOpen}\n onClose={() => setResumeModalOpen(false)}\n onConfirm={handleResume}\n title={t('Resume Thread')}\n icon={<PlayIcon />}\n message={t(\n 'You are about to resume this thread. It will go back to the queue and be processed when possible.'\n )}\n confirmText={t('Resume')}\n />\n\n <ApprovalModal\n open={reviewModalOpen}\n onClose={() => setReviewModalOpen(false)}\n onApprove={handleApproval}\n isLoading={isLoadingApproval}\n pausedReason={pausedReason}\n />\n\n <SendMessageModal\n open={sendMessageModalOpen}\n onClose={() => setSendMessageModalOpen(false)}\n onSend={handleSendMessage}\n isLoading={isSendingMessage}\n state={state}\n />\n </>\n );\n}\n"],"names":["_jsx","_jsxs","_Fragment"],"mappings":"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"}
1
+ {"version":3,"file":"ThreadStateTag.js","sources":["../../../../src/components/ThreadStateTag/ThreadStateTag.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useOptionalDevicContext } from '../../provider';\nimport { DevicApiClient } from '../../api/client';\nimport { AgentThreadState } from '../../api/types';\nimport type { ThreadStateTagProps, StateConfig } from './ThreadStateTag.types';\nimport { useTranslations, type Translator } from '../../i18n';\nimport './ThreadStateTag.css';\n\n/* ── State configuration map ── */\n\nfunction getStateConfig(\n t: Translator,\n state: string,\n subthreadCount?: number\n): StateConfig {\n const configs: Record<string, StateConfig> = {\n [AgentThreadState.QUEUED]: {\n color: 'gold', bgColor: '#fffbe6', borderColor: '#ffe58f',\n text: t('Queued'), iconType: null,\n },\n [AgentThreadState.PROCESSING]: {\n color: 'processing', bgColor: '#e6f4ff', borderColor: '#91caff',\n text: t('Processing'), iconType: 'spinner',\n },\n [AgentThreadState.COMPLETED]: {\n color: 'success', bgColor: '#f6ffed', borderColor: '#b7eb8f',\n text: t('Completed'), iconType: null,\n },\n [AgentThreadState.FAILED]: {\n color: 'error', bgColor: '#fff2f0', borderColor: '#ffa39e',\n text: t('Failed'), iconType: null,\n },\n [AgentThreadState.TERMINATED]: {\n color: 'default', bgColor: '#fafafa', borderColor: '#d9d9d9',\n text: t('Terminated'), iconType: null,\n },\n [AgentThreadState.GUARDRAIL_TRIGGER]: {\n color: 'error', bgColor: '#fff2f0', borderColor: '#ffa39e',\n text: t('Guardrail Triggered'), iconType: 'shield',\n },\n [AgentThreadState.PAUSED]: {\n color: 'purple', bgColor: '#f9f0ff', borderColor: '#d3adf7',\n text: t('Paused'), iconType: 'pause',\n },\n [AgentThreadState.PAUSED_FOR_APPROVAL]: {\n color: 'gold', bgColor: '#fffbe6', borderColor: '#ffe58f',\n text: t('Waiting for approval'), iconType: 'warning',\n },\n [AgentThreadState.APPROVAL_REJECTED]: {\n color: 'error', bgColor: '#fff2f0', borderColor: '#ffa39e',\n text: t('Approval rejected'), iconType: null,\n },\n [AgentThreadState.WAITING_FOR_RESPONSE]: {\n color: 'gold', bgColor: '#fffbe6', borderColor: '#ffe58f',\n text: t('Waiting for response'), iconType: 'envelope',\n },\n [AgentThreadState.PAUSED_FOR_RESUME]: {\n color: 'blue', bgColor: '#e6f4ff', borderColor: '#91caff',\n text: t('Resume scheduled'), iconType: 'clock',\n },\n [AgentThreadState.HANDED_OFF]: {\n color: 'blue', bgColor: '#e6f4ff', borderColor: '#91caff',\n text:\n subthreadCount && subthreadCount > 1\n ? t('Handed off ({count})', { count: subthreadCount })\n : t('Handed off'),\n iconType: 'handoff',\n },\n };\n\n return (\n configs[state] || {\n color: 'default',\n bgColor: '#fafafa',\n borderColor: '#d9d9d9',\n text: t('Unknown'),\n iconType: null,\n }\n );\n}\n\n/* ── SVG Icons ── */\n\nfunction SpinnerIcon(): JSX.Element {\n return (\n <svg className=\"devic-state-spinner\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\">\n <path d=\"M12 2v4M12 18v4M4.93 4.93l2.83 2.83M16.24 16.24l2.83 2.83M2 12h4M18 12h4M4.93 19.07l2.83-2.83M16.24 7.76l2.83-2.83\" />\n </svg>\n );\n}\n\nfunction PauseIcon(): JSX.Element {\n return (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <rect x=\"6\" y=\"4\" width=\"4\" height=\"16\" rx=\"1\" />\n <rect x=\"14\" y=\"4\" width=\"4\" height=\"16\" rx=\"1\" />\n </svg>\n );\n}\n\nfunction PlayIcon(): JSX.Element {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M8 5v14l11-7z\" />\n </svg>\n );\n}\n\nfunction WarningIcon(): JSX.Element {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\" />\n </svg>\n );\n}\n\nfunction EnvelopeIcon(): JSX.Element {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"2\" />\n <path d=\"M22 7l-10 7L2 7\" />\n </svg>\n );\n}\n\nfunction ClockIcon(): JSX.Element {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <polyline points=\"12,6 12,12 16,14\" />\n </svg>\n );\n}\n\nfunction ShieldIcon(): JSX.Element {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n );\n}\n\nfunction HandoffIcon(): JSX.Element {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm-1 6h2a3 3 0 0 1 3 3v3h-2v-3a1 1 0 0 0-1-1h-2a1 1 0 0 0-1 1v3H8v-3a3 3 0 0 1 3-3z\" />\n <path d=\"M16 16l4-2-4-2v4z\" opacity=\"0.8\" />\n </svg>\n );\n}\n\nfunction CaretDownIcon(): JSX.Element {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"5 8 14 9\" fill=\"currentColor\">\n <path d=\"M7 10l5 5 5-5z\" />\n </svg>\n );\n}\n\nfunction WrenchIcon(): JSX.Element {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z\" />\n </svg>\n );\n}\n\nfunction EyeIcon(): JSX.Element {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n );\n}\n\nfunction SendIcon(): JSX.Element {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\" />\n <polygon points=\"22 2 15 22 11 13 2 9 22 2\" />\n </svg>\n );\n}\n\nfunction LightbulbIcon(): JSX.Element {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"#FFC000\" stroke=\"#FFC000\" strokeWidth=\"1\">\n <path d=\"M9 21h6M12 3a6 6 0 0 0-4 10.5V17h8v-3.5A6 6 0 0 0 12 3z\" fill=\"#FFC000\" stroke=\"none\" />\n </svg>\n );\n}\n\nfunction RobotIcon(): JSX.Element {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <rect x=\"4\" y=\"8\" width=\"16\" height=\"12\" rx=\"2\" />\n <circle cx=\"9\" cy=\"14\" r=\"2\" fill=\"#fff\" />\n <circle cx=\"15\" cy=\"14\" r=\"2\" fill=\"#fff\" />\n <line x1=\"12\" y1=\"2\" x2=\"12\" y2=\"8\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <circle cx=\"12\" cy=\"2\" r=\"1.5\" />\n </svg>\n );\n}\n\nfunction UserIcon(): JSX.Element {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z\" />\n </svg>\n );\n}\n\nfunction CloseIcon(): JSX.Element {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n );\n}\n\nfunction InfoIcon(): JSX.Element {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z\" />\n </svg>\n );\n}\n\n/* ── Helper: render icon by type ── */\n\nfunction StateIcon({ iconType }: { iconType: string | null }): JSX.Element | null {\n switch (iconType) {\n case 'spinner': return <SpinnerIcon />;\n case 'pause': return <PauseIcon />;\n case 'warning': return <WarningIcon />;\n case 'envelope': return <EnvelopeIcon />;\n case 'clock': return <ClockIcon />;\n case 'shield': return <ShieldIcon />;\n case 'handoff': return <HandoffIcon />;\n default: return null;\n }\n}\n\n/* ── Modal component ── */\n\nfunction Modal({\n open,\n onClose,\n title,\n titleIcon,\n children,\n footer,\n}: {\n open: boolean;\n onClose: () => void;\n title: string;\n titleIcon?: React.ReactNode;\n children: React.ReactNode;\n footer?: React.ReactNode;\n}): JSX.Element | null {\n if (!open) return null;\n\n return createPortal(\n <div className=\"devic-state-modal-overlay\" onClick={onClose}>\n <div className=\"devic-state-modal\" onClick={(e) => e.stopPropagation()}>\n <div className=\"devic-state-modal-header\">\n <h3 className=\"devic-state-modal-title\">\n {titleIcon}\n {title}\n </h3>\n <button className=\"devic-state-modal-close\" onClick={onClose} type=\"button\">\n <CloseIcon />\n </button>\n </div>\n <div className=\"devic-state-modal-body\">\n {children}\n </div>\n {footer && (\n <div className=\"devic-state-modal-footer\">\n {footer}\n </div>\n )}\n </div>\n </div>,\n document.body\n );\n}\n\n/* ── Explain Modal with typing effect ── */\n\nfunction ExplainModal({\n open,\n onClose,\n explanation,\n isLoading,\n agentName,\n}: {\n open: boolean;\n onClose: () => void;\n explanation: string | null;\n isLoading: boolean;\n agentName: string;\n}): JSX.Element | null {\n const t = useTranslations();\n const [displayedText, setDisplayedText] = useState('');\n const [fullTextDisplayed, setFullTextDisplayed] = useState(false);\n const charIndexRef = useRef(0);\n\n useEffect(() => {\n if (!explanation || isLoading) {\n setDisplayedText('');\n charIndexRef.current = 0;\n setFullTextDisplayed(false);\n return;\n }\n\n if (charIndexRef.current < explanation.length) {\n const timer = setTimeout(() => {\n charIndexRef.current++;\n setDisplayedText(explanation.slice(0, charIndexRef.current));\n if (charIndexRef.current >= explanation.length) {\n setFullTextDisplayed(true);\n }\n }, 20);\n return () => clearTimeout(timer);\n }\n }, [explanation, isLoading, displayedText]);\n\n const handleClose = () => {\n setDisplayedText('');\n charIndexRef.current = 0;\n setFullTextDisplayed(false);\n onClose();\n };\n\n return (\n <Modal\n open={open}\n onClose={handleClose}\n title={t('Thread execution description of \"{agent}\"', {\n agent: agentName,\n })}\n titleIcon={<LightbulbIcon />}\n >\n {isLoading ? (\n <div className=\"devic-state-loading\">\n <div className=\"devic-state-loading-spinner\" />\n </div>\n ) : (\n <div className=\"devic-explain-content\">\n {displayedText}\n {!fullTextDisplayed && <span className=\"devic-typing-cursor\">|</span>}\n </div>\n )}\n </Modal>\n );\n}\n\n/* ── Approval Modal ── */\n\nfunction ApprovalModal({\n open,\n onClose,\n onApprove,\n isLoading,\n pausedReason,\n}: {\n open: boolean;\n onClose: () => void;\n onApprove: (action: 'approved' | 'rejected', retry: boolean, message?: string) => void;\n isLoading: boolean;\n pausedReason?: string;\n}): JSX.Element | null {\n const t = useTranslations();\n const [feedback, setFeedback] = useState('');\n\n const handleClose = () => {\n setFeedback('');\n onClose();\n };\n\n return (\n <Modal\n open={open}\n onClose={handleClose}\n title={t('Review Agent Request')}\n titleIcon={<EyeIcon />}\n >\n <div className=\"devic-approval-layout\">\n <div className=\"devic-approval-request\">\n <div style={{ fontWeight: 600, marginBottom: 8, fontSize: 13 }}>\n {t(\"Agent's request:\")}\n </div>\n <div style={{ whiteSpace: 'pre-wrap' }}>\n {pausedReason ||\n t('Agent is waiting for approval to resume execution.')}\n </div>\n </div>\n <div className=\"devic-approval-actions\">\n <div style={{ fontWeight: 600, fontSize: 13 }}>\n {t('Your feedback:')}\n </div>\n <textarea\n className=\"devic-approval-textarea\"\n value={feedback}\n onChange={(e) => setFeedback(e.target.value)}\n placeholder={t('Optional feedback for the agent...')}\n />\n <div className=\"devic-approval-buttons\">\n <button\n className=\"devic-state-btn devic-state-btn-danger\"\n onClick={() => onApprove('rejected', false, feedback)}\n disabled={isLoading}\n type=\"button\"\n >\n {t('Reject and finish')}\n </button>\n <button\n className=\"devic-state-btn devic-state-btn-primary\"\n onClick={() => onApprove('rejected', true, feedback)}\n disabled={isLoading || !feedback.trim()}\n type=\"button\"\n >\n {t('Continue with feedback')}\n </button>\n <button\n className=\"devic-state-btn devic-state-btn-success\"\n onClick={() => onApprove('approved', false)}\n disabled={isLoading}\n type=\"button\"\n >\n {t('Approve')}\n </button>\n </div>\n </div>\n </div>\n </Modal>\n );\n}\n\n/* ── Send Message Modal ── */\n\nfunction SendMessageModal({\n open,\n onClose,\n onSend,\n isLoading,\n state,\n}: {\n open: boolean;\n onClose: () => void;\n onSend: (message: string) => void;\n isLoading: boolean;\n state: AgentThreadState | string;\n}): JSX.Element | null {\n const t = useTranslations();\n const [message, setMessage] = useState('');\n\n const handleClose = () => {\n setMessage('');\n onClose();\n };\n\n const isRunning =\n state === AgentThreadState.PROCESSING || state === AgentThreadState.QUEUED;\n\n return (\n <Modal\n open={open}\n onClose={handleClose}\n title={t('Send message to thread')}\n titleIcon={<SendIcon />}\n footer={\n <>\n <button className=\"devic-state-btn\" onClick={handleClose} type=\"button\">\n {t('Cancel')}\n </button>\n <button\n className=\"devic-state-btn devic-state-btn-primary\"\n onClick={() => onSend(message)}\n disabled={isLoading || !message.trim()}\n type=\"button\"\n >\n {t('Send')}\n </button>\n </>\n }\n >\n <div style={{ marginBottom: 12 }}>\n <p style={{ margin: '4px 0 12px', color: '#666', fontSize: 13 }}>\n {isRunning\n ? t(\n 'The agent is still running. Your message will be considered on its next turn, right after the current tool response.'\n )\n : t(\n 'This will add your message and re-queue the thread so the agent runs again with it.'\n )}\n </p>\n <textarea\n className=\"devic-approval-textarea\"\n value={message}\n onChange={(e) => setMessage(e.target.value)}\n placeholder={t('Type a message to continue the thread...')}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && (e.ctrlKey || e.metaKey) && message.trim()) {\n e.preventDefault();\n onSend(message);\n }\n }}\n />\n </div>\n </Modal>\n );\n}\n\n/* ── Complete Thread Modal ── */\n\nfunction CompleteModal({\n open,\n onClose,\n onComplete,\n}: {\n open: boolean;\n onClose: () => void;\n onComplete: (state: string) => void;\n}): JSX.Element | null {\n const t = useTranslations();\n const [completionState, setCompletionState] = useState('terminated');\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n title={t('Complete Execution Manually')}\n titleIcon={<WrenchIcon />}\n footer={\n <>\n <button className=\"devic-state-btn\" onClick={onClose} type=\"button\">\n {t('Cancel')}\n </button>\n <button className=\"devic-state-btn devic-state-btn-danger\" onClick={() => onComplete(completionState)} type=\"button\">\n {t('Complete')}\n </button>\n </>\n }\n >\n <div style={{ marginBottom: 12 }}>\n <div style={{ fontWeight: 600, marginBottom: 4 }}>\n {t('Confirm Manual Completion')}\n </div>\n <p style={{ margin: '4px 0 12px', color: '#666', fontSize: 13 }}>\n {t(\"You are about to manually complete this agent's execution.\")}\n </p>\n <div style={{ marginBottom: 12 }}>\n <div style={{ fontWeight: 500, marginBottom: 6, fontSize: 13 }}>\n {t('Complete as:')}\n </div>\n <select\n className=\"devic-completion-select\"\n value={completionState}\n onChange={(e) => setCompletionState(e.target.value)}\n >\n <option value=\"terminated\">\n {t('Terminated - Finish thread as manually terminated')}\n </option>\n <option value=\"completed\">\n {t('Completed - Finish thread as successfully completed')}\n </option>\n <option value=\"failed\">\n {t('Failed - Finish thread as failed or with errors')}\n </option>\n </select>\n </div>\n <div className=\"devic-state-warning\">\n <InfoIcon />\n <span>\n {t(\n 'This action will immediately terminate all ongoing processes. The execution cannot be resumed after completion.'\n )}\n </span>\n </div>\n </div>\n </Modal>\n );\n}\n\n/* ── Confirm Modal (Pause/Resume) ── */\n\nfunction ConfirmModal({\n open,\n onClose,\n onConfirm,\n title,\n icon,\n message,\n confirmText,\n}: {\n open: boolean;\n onClose: () => void;\n onConfirm: () => void;\n title: string;\n icon: React.ReactNode;\n message: string;\n confirmText: string;\n}): JSX.Element | null {\n const t = useTranslations();\n return (\n <Modal\n open={open}\n onClose={onClose}\n title={title}\n titleIcon={icon}\n footer={\n <>\n <button className=\"devic-state-btn\" onClick={onClose} type=\"button\">\n {t('Cancel')}\n </button>\n <button className=\"devic-state-btn devic-state-btn-primary\" onClick={onConfirm} type=\"button\">\n {confirmText}\n </button>\n </>\n }\n >\n <p style={{ margin: 0, color: '#666', fontSize: 14 }}>{message}</p>\n </Modal>\n );\n}\n\n/* ── Main ThreadStateTag ── */\n\nexport function ThreadStateTag({\n state,\n threadId,\n agentName,\n showIcon = true,\n customIcon,\n pausedReason,\n approvalRejectedMessage,\n finishReason,\n onActionComplete,\n pauseUntil,\n subthreadCount,\n showAdminActions = false,\n apiKey,\n baseUrl,\n interactive = true,\n}: ThreadStateTagProps): JSX.Element {\n const t = useTranslations();\n const context = useOptionalDevicContext();\n const resolvedApiKey = apiKey || context?.apiKey;\n const resolvedTenantSession = context?.getTenantSession;\n const onSessionExpired = context?.onSessionExpired;\n const resolvedBaseUrl = baseUrl || context?.baseUrl || 'https://api.devic.ai';\n\n // State\n const [dropdownOpen, setDropdownOpen] = useState(false);\n const [showTooltip, setShowTooltip] = useState(false);\n const [explainModalOpen, setExplainModalOpen] = useState(false);\n const [threadExplanation, setThreadExplanation] = useState<string | null>(null);\n const [isLoadingExplanation, setIsLoadingExplanation] = useState(false);\n const [pauseModalOpen, setPauseModalOpen] = useState(false);\n const [resumeModalOpen, setResumeModalOpen] = useState(false);\n const [reviewModalOpen, setReviewModalOpen] = useState(false);\n const [isLoadingApproval, setIsLoadingApproval] = useState(false);\n const [completeModalOpen, setCompleteModalOpen] = useState(false);\n const [sendMessageModalOpen, setSendMessageModalOpen] = useState(false);\n const [isSendingMessage, setIsSendingMessage] = useState(false);\n\n const tagRef = useRef<HTMLDivElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const [tooltipStyle, setTooltipStyle] = useState<React.CSSProperties>({});\n const [dropdownStyle, setDropdownStyle] = useState<React.CSSProperties>({});\n\n // Close dropdown on click outside\n useEffect(() => {\n if (!dropdownOpen) return;\n const handleClick = (e: MouseEvent) => {\n const target = e.target as Node;\n if (\n tagRef.current && !tagRef.current.contains(target) &&\n (!dropdownRef.current || !dropdownRef.current.contains(target))\n ) {\n setDropdownOpen(false);\n }\n };\n document.addEventListener('mousedown', handleClick);\n return () => document.removeEventListener('mousedown', handleClick);\n }, [dropdownOpen]);\n\n // API client\n const getClient = useCallback((): DevicApiClient | null => {\n if (!resolvedApiKey && !resolvedTenantSession) return null;\n return new DevicApiClient({\n apiKey: resolvedApiKey,\n baseUrl: resolvedBaseUrl,\n getTenantSession: resolvedTenantSession,\n onSessionExpired,\n });\n }, [resolvedApiKey, resolvedTenantSession, resolvedBaseUrl]);\n\n // Config\n const config = getStateConfig(t, state, subthreadCount);\n\n if (!state) {\n return (\n <span className=\"devic-state-tag\" data-color=\"default\">\n {t('Unknown')}\n </span>\n );\n }\n\n // Icon\n const renderIcon = () => {\n if (!showIcon) return null;\n if (customIcon) return <span className=\"devic-state-tag-icon\">{customIcon}</span>;\n const icon = <StateIcon iconType={config.iconType} />;\n return icon ? <span className=\"devic-state-tag-icon\">{icon}</span> : null;\n };\n\n // Tooltip content\n const getTooltipContent = (): string | null => {\n switch (state) {\n case AgentThreadState.PAUSED_FOR_APPROVAL:\n return t('Agent is waiting for approval to resume execution');\n case AgentThreadState.PAUSED_FOR_RESUME:\n if (pauseUntil) {\n const timeDiff = new Date(pauseUntil).getTime() - Date.now();\n const hours = Math.floor(timeDiff / 3600000);\n const minutes = Math.floor(timeDiff / 60000);\n const timeStr =\n hours > 0\n ? t('{count} hours', { count: hours })\n : t('{count} minutes', { count: minutes });\n return t('Agent paused, will resume at {when} ({in})', {\n when: new Date(pauseUntil).toLocaleString(),\n in: timeStr,\n });\n }\n return t('Agent paused, will resume at a scheduled time');\n case AgentThreadState.WAITING_FOR_RESPONSE:\n return pausedReason || t('Agent is waiting for response');\n case AgentThreadState.COMPLETED:\n case AgentThreadState.FAILED:\n case AgentThreadState.TERMINATED:\n return finishReason || t('Manually finished thread');\n case AgentThreadState.APPROVAL_REJECTED:\n return approvalRejectedMessage || t('Approval was rejected');\n case AgentThreadState.GUARDRAIL_TRIGGER:\n return t('Agent execution paused due to guardrail trigger');\n default:\n return null;\n }\n };\n\n // Handlers\n const handleExplain = async () => {\n setDropdownOpen(false);\n setExplainModalOpen(true);\n setIsLoadingExplanation(true);\n setThreadExplanation(null);\n\n const client = getClient();\n if (!client) {\n setThreadExplanation(t('API key not configured.'));\n setIsLoadingExplanation(false);\n return;\n }\n\n try {\n const explanation = await client.explainAgentThread(threadId);\n setThreadExplanation(explanation);\n } catch {\n setThreadExplanation(t('Could not obtain the thread explanation.'));\n } finally {\n setIsLoadingExplanation(false);\n }\n };\n\n const handlePause = async () => {\n const client = getClient();\n if (!client) return;\n try {\n await client.pauseResumeThread(threadId, 'paused');\n setPauseModalOpen(false);\n onActionComplete?.();\n } catch (err) {\n console.error('Error pausing thread:', err);\n }\n };\n\n const handleResume = async () => {\n const client = getClient();\n if (!client) return;\n try {\n await client.pauseResumeThread(threadId, 'queued');\n setResumeModalOpen(false);\n onActionComplete?.();\n } catch (err) {\n console.error('Error resuming thread:', err);\n }\n };\n\n const handleApproval = async (action: 'approved' | 'rejected', retry: boolean, message?: string) => {\n const client = getClient();\n if (!client) return;\n setIsLoadingApproval(true);\n try {\n await client.handleThreadApproval(threadId, action === 'approved', retry, message || '');\n setReviewModalOpen(false);\n onActionComplete?.();\n } catch (err) {\n console.error('Error handling thread approval:', err);\n } finally {\n setIsLoadingApproval(false);\n }\n };\n\n const handleComplete = async (completionState: string) => {\n const client = getClient();\n if (!client) return;\n try {\n await client.completeThread(threadId, completionState);\n setCompleteModalOpen(false);\n onActionComplete?.();\n } catch (err) {\n console.error('Error completing thread:', err);\n }\n };\n\n const handleSendMessage = async (message: string) => {\n const text = message.trim();\n if (!text) return;\n const client = getClient();\n if (!client) return;\n setIsSendingMessage(true);\n try {\n await client.sendThreadMessage(threadId, text);\n setSendMessageModalOpen(false);\n onActionComplete?.();\n } catch (err) {\n console.error('Error sending message to thread:', err);\n } finally {\n setIsSendingMessage(false);\n }\n };\n\n // States that can't be continued with a free user message (approval decision,\n // handed off to a subagent, or still being created).\n const canSendMessage =\n !!threadId &&\n ![\n AgentThreadState.PAUSED_FOR_APPROVAL,\n AgentThreadState.HANDED_OFF,\n ].includes(state as AgentThreadState) &&\n state !== 'under_construction';\n\n // Build dropdown items\n const dropdownItems: Array<{ key: string; icon: React.ReactNode; label: string; onClick: () => void }> = [];\n\n if (showAdminActions && [AgentThreadState.PROCESSING, AgentThreadState.QUEUED, AgentThreadState.WAITING_FOR_RESPONSE].includes(state as AgentThreadState)) {\n dropdownItems.push({\n key: 'complete',\n icon: <WrenchIcon />,\n label: t('Complete manually'),\n onClick: () => { setDropdownOpen(false); setCompleteModalOpen(true); },\n });\n }\n\n if (state === AgentThreadState.QUEUED) {\n dropdownItems.push({\n key: 'pause',\n icon: <PauseIcon />,\n label: t('Pause'),\n onClick: () => { setDropdownOpen(false); setPauseModalOpen(true); },\n });\n }\n\n if (state === AgentThreadState.PAUSED || state === AgentThreadState.PAUSED_FOR_RESUME) {\n dropdownItems.push({\n key: 'resume',\n icon: <PlayIcon />,\n label: t('Resume'),\n onClick: () => { setDropdownOpen(false); setResumeModalOpen(true); },\n });\n }\n\n if (state === AgentThreadState.PAUSED_FOR_APPROVAL) {\n dropdownItems.push({\n key: 'review',\n icon: <EyeIcon />,\n label: t('Review'),\n onClick: () => { setDropdownOpen(false); setReviewModalOpen(true); },\n });\n }\n\n if (canSendMessage) {\n dropdownItems.push({\n key: 'send_message',\n icon: <SendIcon />,\n label: t('Send message...'),\n onClick: () => { setDropdownOpen(false); setSendMessageModalOpen(true); },\n });\n }\n\n dropdownItems.push({\n key: 'explain',\n icon: <LightbulbIcon />,\n label: t('Explain thread...'),\n onClick: handleExplain,\n });\n\n const canInteract = interactive && threadId;\n const tooltipContent = getTooltipContent();\n\n return (\n <>\n <div\n ref={tagRef}\n className=\"devic-state-tag\"\n data-color={config.color}\n data-interactive={String(!!canInteract)}\n data-dropdown-open={String(dropdownOpen)}\n onClick={canInteract ? () => {\n if (!dropdownOpen) {\n const rect = tagRef.current?.getBoundingClientRect();\n if (rect) {\n setDropdownStyle({\n position: 'fixed',\n top: rect.bottom + 4,\n right: window.innerWidth - rect.right,\n });\n }\n }\n setDropdownOpen(!dropdownOpen);\n } : undefined}\n onMouseEnter={() => {\n if (!dropdownOpen && tooltipContent) {\n const rect = tagRef.current?.getBoundingClientRect();\n if (rect) {\n setTooltipStyle({\n position: 'fixed',\n top: rect.top - 8,\n left: rect.left + rect.width / 2,\n transform: 'translate(-50%, -100%)',\n });\n }\n setShowTooltip(true);\n }\n }}\n onMouseLeave={() => setShowTooltip(false)}\n >\n {renderIcon()}\n {config.text}\n {canInteract && (\n <span className=\"devic-state-tag-caret\">\n <CaretDownIcon />\n </span>\n )}\n\n </div>\n\n {/* Tooltip - portal to escape overflow/transform containers */}\n {showTooltip && tooltipContent && !dropdownOpen && createPortal(\n <div className=\"devic-state-tooltip-portal\" style={tooltipStyle}>{tooltipContent}</div>,\n document.body\n )}\n\n {/* Dropdown - portal to escape overflow/transform containers */}\n {dropdownOpen && canInteract && createPortal(\n <div ref={dropdownRef} className=\"devic-state-dropdown-portal\" style={dropdownStyle}>\n {dropdownItems.map((item) => (\n <button\n key={item.key}\n className=\"devic-state-dropdown-item\"\n onClick={(e) => { e.stopPropagation(); item.onClick(); }}\n type=\"button\"\n >\n <span className=\"devic-state-dropdown-item-icon\">{item.icon}</span>\n {item.label}\n </button>\n ))}\n </div>,\n document.body\n )}\n\n {/* Modals */}\n <ExplainModal\n open={explainModalOpen}\n onClose={() => setExplainModalOpen(false)}\n explanation={threadExplanation}\n isLoading={isLoadingExplanation}\n agentName={agentName}\n />\n\n <CompleteModal\n open={completeModalOpen}\n onClose={() => setCompleteModalOpen(false)}\n onComplete={handleComplete}\n />\n\n <ConfirmModal\n open={pauseModalOpen}\n onClose={() => setPauseModalOpen(false)}\n onConfirm={handlePause}\n title={t('Pause Thread')}\n icon={<PauseIcon />}\n message={t(\n 'You are about to pause this queued thread. It can be resumed later.'\n )}\n confirmText={t('Pause')}\n />\n\n <ConfirmModal\n open={resumeModalOpen}\n onClose={() => setResumeModalOpen(false)}\n onConfirm={handleResume}\n title={t('Resume Thread')}\n icon={<PlayIcon />}\n message={t(\n 'You are about to resume this thread. It will go back to the queue and be processed when possible.'\n )}\n confirmText={t('Resume')}\n />\n\n <ApprovalModal\n open={reviewModalOpen}\n onClose={() => setReviewModalOpen(false)}\n onApprove={handleApproval}\n isLoading={isLoadingApproval}\n pausedReason={pausedReason}\n />\n\n <SendMessageModal\n open={sendMessageModalOpen}\n onClose={() => setSendMessageModalOpen(false)}\n onSend={handleSendMessage}\n isLoading={isSendingMessage}\n state={state}\n />\n </>\n );\n}\n"],"names":["_jsx","_jsxs","_Fragment"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"theme.js","sources":["../../../src/components/theme.ts"],"sourcesContent":["import type { CSSProperties } from \"react\";\n\n/**\n * Colours and font a component should paint itself with.\n *\n * The same names the drawer's options use, so passing them through is a\n * one-liner and an integrator who already themed the drawer has nothing new to\n * learn.\n */\nexport interface DevicTheme {\n /** Accent: primary buttons, focus rings, links. */\n color?: string;\n fontFamily?: string;\n /** Surface the component sits on. */\n backgroundColor?: string;\n textColor?: string;\n /** Secondary surface: rows, chips, hover states. */\n secondaryBackgroundColor?: string;\n borderColor?: string;\n /** Muted text: captions, timestamps, empty states. */\n mutedTextColor?: string;\n}\n\n/**\n * A theme as inline CSS variables.\n *\n * Needed because the modals render through a portal into `document.body`: the\n * drawer sets these variables on its own element, and a portal is not inside\n * it, so nothing cascades down. A white dialog then opens over a dark\n * application, which is what this exists to prevent.\n *\n * Only the values actually given are emitted — an absent one must fall through\n * to the stylesheet default rather than be pinned to `undefined`.\n */\nexport function themeVars(theme?: DevicTheme): CSSProperties {\n if (!theme) return {};\n const vars: Record<string, string> = {};\n const set = (name: string, value?: string) => {\n if (value) vars[name] = value;\n };\n\n set(\"--devic-primary\", theme.color);\n set(\"--devic-font-family\", theme.fontFamily);\n set(\"--devic-bg\", theme.backgroundColor);\n set(\"--devic-text\", theme.textColor);\n set(\"--devic-bg-secondary\", theme.secondaryBackgroundColor);\n set(\"--devic-border\", theme.borderColor);\n set(\"--devic-text-muted\", theme.mutedTextColor);\n\n return vars as CSSProperties;\n}\n\n/** Relative luminance of a CSS colour, or null when it cannot be read. */\nfunction luminance(color?: string): number | null {\n if (!color) return null;\n const value = color.trim().toLowerCase();\n\n let r: number, g: number, b: number;\n const hex = value.match(/^#([0-9a-f]{3}|[0-9a-f]{6})$/);\n if (hex) {\n const digits =\n hex[1].length === 3\n ? hex[1]\n .split(\"\")\n .map((d) => d + d)\n .join(\"\")\n : hex[1];\n r = parseInt(digits.slice(0, 2), 16);\n g = parseInt(digits.slice(2, 4), 16);\n b = parseInt(digits.slice(4, 6), 16);\n } else {\n const rgb = value.match(/^rgba?\\(\\s*([\\d.]+)[\\s,]+([\\d.]+)[\\s,]+([\\d.]+)/);\n if (!rgb) return null;\n [r, g, b] = [Number(rgb[1]), Number(rgb[2]), Number(rgb[3])];\n }\n\n // Perceived brightness, good enough to tell a dark surface from a light one.\n return (0.299 * r + 0.587 * g + 0.114 * b) / 255;\n}\n\n/**\n * Whether this theme paints on a dark surface.\n *\n * Used for the one thing CSS variables cannot express: third-party app logos.\n * Many are solid black with a transparent background, and on a dark chip they\n * turn into a smudge — so on a dark theme the chip behind them goes light.\n * Unknown or unreadable colours count as light, which is the default anyway.\n */\nexport function isDarkTheme(theme?: DevicTheme): boolean {\n const l = luminance(theme?.backgroundColor) ?? luminance(theme?.secondaryBackgroundColor);\n return l !== null && l < 0.45;\n}\n"],"names":[],"mappings":"AAuBA;;;;;;;;;;AAUG;AACG,SAAU,SAAS,CAAC,KAAkB,EAAA;AAC1C,IAAA,IAAI,CAAC,KAAK;AAAE,QAAA,OAAO,EAAE;IACrB,MAAM,IAAI,GAA2B,EAAE;AACvC,IAAA,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,KAAc,KAAI;AAC3C,QAAA,IAAI,KAAK;AAAE,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK;AAC/B,IAAA,CAAC;AAED,IAAA,GAAG,CAAC,iBAAiB,EAAE,KAAK,CAAC,KAAK,CAAC;AACnC,IAAA,GAAG,CAAC,qBAAqB,EAAE,KAAK,CAAC,UAAU,CAAC;AAC5C,IAAA,GAAG,CAAC,YAAY,EAAE,KAAK,CAAC,eAAe,CAAC;AACxC,IAAA,GAAG,CAAC,cAAc,EAAE,KAAK,CAAC,SAAS,CAAC;AACpC,IAAA,GAAG,CAAC,sBAAsB,EAAE,KAAK,CAAC,wBAAwB,CAAC;AAC3D,IAAA,GAAG,CAAC,gBAAgB,EAAE,KAAK,CAAC,WAAW,CAAC;AACxC,IAAA,GAAG,CAAC,oBAAoB,EAAE,KAAK,CAAC,cAAc,CAAC;AAE/C,IAAA,OAAO,IAAqB;AAC9B;AAEA;AACA,SAAS,SAAS,CAAC,KAAc,EAAA;AAC/B,IAAA,IAAI,CAAC,KAAK;AAAE,QAAA,OAAO,IAAI;IACvB,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE;AAExC,IAAA,IAAI,CAAS,EAAE,CAAS,EAAE,CAAS;IACnC,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,8BAA8B,CAAC;IACvD,IAAI,GAAG,EAAE;QACP,MAAM,MAAM,GACV,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK;AAChB,cAAE,GAAG,CAAC,CAAC;iBACF,KAAK,CAAC,EAAE;iBACR,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;iBAChB,IAAI,CAAC,EAAE;AACZ,cAAE,GAAG,CAAC,CAAC,CAAC;AACZ,QAAA,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;AACpC,QAAA,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;AACpC,QAAA,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;IACtC;SAAO;QACL,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,iDAAiD,CAAC;AAC1E,QAAA,IAAI,CAAC,GAAG;AAAE,YAAA,OAAO,IAAI;AACrB,QAAA,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D;;AAGA,IAAA,OAAO,CAAC,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,IAAI,GAAG;AAClD;AAEA;;;;;;;AAOG;AACG,SAAU,WAAW,CAAC,KAAkB,EAAA;AAC5C,IAAA,MAAM,CAAC,GAAG,SAAS,CAAC,KAAK,EAAE,eAAe,CAAC,IAAI,SAAS,CAAC,KAAK,EAAE,wBAAwB,CAAC;AACzF,IAAA,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,IAAI;AAC/B;;"}
1
+ {"version":3,"file":"theme.js","sources":["../../../src/components/theme.ts"],"sourcesContent":["import type { CSSProperties } from \"react\";\n\n/**\n * Colours and font a component should paint itself with.\n *\n * The same names the drawer's options use, so passing them through is a\n * one-liner and an integrator who already themed the drawer has nothing new to\n * learn.\n */\nexport interface DevicTheme {\n /** Accent: primary buttons, focus rings, links. */\n color?: string;\n fontFamily?: string;\n /** Surface the component sits on. */\n backgroundColor?: string;\n textColor?: string;\n /** Secondary surface: rows, chips, hover states. */\n secondaryBackgroundColor?: string;\n borderColor?: string;\n /** Muted text: captions, timestamps, empty states. */\n mutedTextColor?: string;\n}\n\n/**\n * A theme as inline CSS variables.\n *\n * Needed because the modals render through a portal into `document.body`: the\n * drawer sets these variables on its own element, and a portal is not inside\n * it, so nothing cascades down. A white dialog then opens over a dark\n * application, which is what this exists to prevent.\n *\n * Only the values actually given are emitted — an absent one must fall through\n * to the stylesheet default rather than be pinned to `undefined`.\n */\nexport function themeVars(theme?: DevicTheme): CSSProperties {\n if (!theme) return {};\n const vars: Record<string, string> = {};\n const set = (name: string, value?: string) => {\n if (value) vars[name] = value;\n };\n\n set(\"--devic-primary\", theme.color);\n set(\"--devic-font-family\", theme.fontFamily);\n set(\"--devic-bg\", theme.backgroundColor);\n set(\"--devic-text\", theme.textColor);\n set(\"--devic-bg-secondary\", theme.secondaryBackgroundColor);\n set(\"--devic-border\", theme.borderColor);\n set(\"--devic-text-muted\", theme.mutedTextColor);\n\n return vars as CSSProperties;\n}\n\n/** Relative luminance of a CSS colour, or null when it cannot be read. */\nfunction luminance(color?: string): number | null {\n if (!color) return null;\n const value = color.trim().toLowerCase();\n\n let r: number, g: number, b: number;\n const hex = value.match(/^#([0-9a-f]{3}|[0-9a-f]{6})$/);\n if (hex) {\n const digits =\n hex[1].length === 3\n ? hex[1]\n .split(\"\")\n .map((d) => d + d)\n .join(\"\")\n : hex[1];\n r = parseInt(digits.slice(0, 2), 16);\n g = parseInt(digits.slice(2, 4), 16);\n b = parseInt(digits.slice(4, 6), 16);\n } else {\n const rgb = value.match(/^rgba?\\(\\s*([\\d.]+)[\\s,]+([\\d.]+)[\\s,]+([\\d.]+)/);\n if (!rgb) return null;\n [r, g, b] = [Number(rgb[1]), Number(rgb[2]), Number(rgb[3])];\n }\n\n // Perceived brightness, good enough to tell a dark surface from a light one.\n return (0.299 * r + 0.587 * g + 0.114 * b) / 255;\n}\n\n/**\n * Whether this theme paints on a dark surface.\n *\n * Used for the one thing CSS variables cannot express: third-party app logos.\n * Many are solid black with a transparent background, and on a dark chip they\n * turn into a smudge — so on a dark theme the chip behind them goes light.\n * Unknown or unreadable colours count as light, which is the default anyway.\n */\nexport function isDarkTheme(theme?: DevicTheme): boolean {\n const l = luminance(theme?.backgroundColor) ?? luminance(theme?.secondaryBackgroundColor);\n return l !== null && l < 0.45;\n}\n"],"names":[],"mappings":"AAuBA;;;;;;;;;;AAUG;AACG,SAAU,SAAS,CAAC,KAAkB,EAAA;AAC1C,IAAA,IAAI,CAAC,KAAK;AAAE,QAAA,OAAO,EAAE;IACrB,MAAM,IAAI,GAA2B,EAAE;AACvC,IAAA,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,KAAc,KAAI;AAC3C,QAAA,IAAI,KAAK;AAAE,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK;AAC/B,IAAA,CAAC;AAED,IAAA,GAAG,CAAC,iBAAiB,EAAE,KAAK,CAAC,KAAK,CAAC;AACnC,IAAA,GAAG,CAAC,qBAAqB,EAAE,KAAK,CAAC,UAAU,CAAC;AAC5C,IAAA,GAAG,CAAC,YAAY,EAAE,KAAK,CAAC,eAAe,CAAC;AACxC,IAAA,GAAG,CAAC,cAAc,EAAE,KAAK,CAAC,SAAS,CAAC;AACpC,IAAA,GAAG,CAAC,sBAAsB,EAAE,KAAK,CAAC,wBAAwB,CAAC;AAC3D,IAAA,GAAG,CAAC,gBAAgB,EAAE,KAAK,CAAC,WAAW,CAAC;AACxC,IAAA,GAAG,CAAC,oBAAoB,EAAE,KAAK,CAAC,cAAc,CAAC;AAE/C,IAAA,OAAO,IAAqB;AAC9B;AAEA;AACA,SAAS,SAAS,CAAC,KAAc,EAAA;AAC/B,IAAA,IAAI,CAAC,KAAK;AAAE,QAAA,OAAO,IAAI;IACvB,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE;AAExC,IAAA,IAAI,CAAS,EAAE,CAAS,EAAE,CAAS;IACnC,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,8BAA8B,CAAC;IACvD,IAAI,GAAG,EAAE;QACP,MAAM,MAAM,GACV,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK;AAChB,cAAE,GAAG,CAAC,CAAC;iBACF,KAAK,CAAC,EAAE;iBACR,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;iBAChB,IAAI,CAAC,EAAE;AACZ,cAAE,GAAG,CAAC,CAAC,CAAC;AACZ,QAAA,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;AACpC,QAAA,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;AACpC,QAAA,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;IACtC;SAAO;QACL,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,iDAAiD,CAAC;AAC1E,QAAA,IAAI,CAAC,GAAG;AAAE,YAAA,OAAO,IAAI;AACrB,QAAA,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D;;AAGA,IAAA,OAAO,CAAC,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,IAAI,GAAG;AAClD;AAEA;;;;;;;AAOG;AACG,SAAU,WAAW,CAAC,KAAkB,EAAA;AAC5C,IAAA,MAAM,CAAC,GAAG,SAAS,CAAC,KAAK,EAAE,eAAe,CAAC,IAAI,SAAS,CAAC,KAAK,EAAE,wBAAwB,CAAC;AACzF,IAAA,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,IAAI;AAC/B;;;;"}
@@ -1,6 +1,6 @@
1
1
  export { useDevicChat } from './useDevicChat';
2
2
  export type { UseDevicChatOptions, UseDevicChatResult, SendMessageResult, StopResult, } from './useDevicChat';
3
- export { usePolling, resolvePollingInterval, DEFAULT_POLLING_INTERVAL_MS, MIN_POLLING_INTERVAL_MS, } from './usePolling';
3
+ export { usePolling, resolvePollingInterval, resolveStreaming, DEFAULT_STREAMING, DEFAULT_POLLING_INTERVAL_MS, MIN_POLLING_INTERVAL_MS, } from './usePolling';
4
4
  export type { UsePollingOptions, UsePollingResult } from './usePolling';
5
5
  export { useModelInterface } from './useModelInterface';
6
6
  export type { UseModelInterfaceOptions, UseModelInterfaceResult, PendingWidgetCall, HandleToolCallsResult, } from './useModelInterface';
@@ -65,6 +65,12 @@ export interface UseDevicChatOptions {
65
65
  * @default 1000
66
66
  */
67
67
  pollingInterval?: number;
68
+ /**
69
+ * Follow the conversation over a server-sent event stream instead of
70
+ * polling it. Overrides the DevicProvider's `streaming`.
71
+ * @default false
72
+ */
73
+ streaming?: boolean;
68
74
  /**
69
75
  * Callback when a message is sent
70
76
  */
@@ -1,9 +1,9 @@
1
- import { useRef, useMemo, useState, useCallback, useEffect } from 'react';
1
+ import { useRef, useMemo, useState, useEffect, useCallback } from 'react';
2
2
  import 'react/jsx-runtime';
3
3
  import { useOptionalDevicContext } from '../provider/DevicContext.js';
4
4
  import { DevicApiClient, DevicApiError } from '../api/client.js';
5
5
  import { createLogger } from '../utils/logger.js';
6
- import { resolvePollingInterval, usePolling } from './usePolling.js';
6
+ import { resolvePollingInterval, resolveStreaming, usePolling } from './usePolling.js';
7
7
  import { useModelInterface } from './useModelInterface.js';
8
8
  import { useAssistantInfo } from '../api/assistantInfo.js';
9
9
  import { useTranslations } from '../i18n/useTranslations.js';
@@ -48,7 +48,7 @@ const normalizeText = (text) => (text ?? '').trim();
48
48
  * ```
49
49
  */
50
50
  function useDevicChat(options) {
51
- const { assistantId, chatUid: initialChatUid, apiKey: propsApiKey, baseUrl: propsBaseUrl, tenantId, tenantMetadata, subtenantId, subtenantMetadata, tags, enabledTools, disabledIntegrations, modelInterfaceTools = [], pollingInterval: propsPollingInterval, onMessageSent, onMessageReceived, onToolCall, onError, onChatCreated, onFileUpload, messageQueue, debug: propsDebug, } = options;
51
+ const { assistantId, chatUid: initialChatUid, apiKey: propsApiKey, baseUrl: propsBaseUrl, tenantId, tenantMetadata, subtenantId, subtenantMetadata, tags, enabledTools, disabledIntegrations, modelInterfaceTools = [], pollingInterval: propsPollingInterval, streaming: propsStreaming, onMessageSent, onMessageReceived, onToolCall, onError, onChatCreated, onFileUpload, messageQueue, debug: propsDebug, } = options;
52
52
  // Get context (may be null if not wrapped in provider)
53
53
  const t = useTranslations();
54
54
  // Read through a ref inside the polling callbacks: they are built once and
@@ -71,6 +71,7 @@ function useDevicChat(options) {
71
71
  // Provider tags + hook tags, deduped. Per-message tags are merged at send time.
72
72
  const resolvedTags = useMemo(() => Array.from(new Set([...(context?.tags ?? []), ...(tags ?? [])])), [context?.tags, tags]);
73
73
  const pollingInterval = resolvePollingInterval(propsPollingInterval, context?.pollingInterval);
74
+ const streaming = resolveStreaming(propsStreaming, context?.streaming);
74
75
  const handoffPollingInterval = resolvePollingInterval(propsPollingInterval, context?.pollingInterval, DEFAULT_HANDOFF_POLL_INTERVAL_MS);
75
76
  const debug = propsDebug ?? context?.debug ?? false;
76
77
  const log = useMemo(() => createLogger(debug), [debug]);
@@ -78,7 +79,9 @@ function useDevicChat(options) {
78
79
  logRef.current = log;
79
80
  // State
80
81
  const [messages, setMessages] = useState([]);
82
+ const [streamingMessage, setStreamingMessage] = useState(null);
81
83
  const [chatUid, setChatUid] = useState(initialChatUid || null);
84
+ useEffect(() => { setStreamingMessage(null); }, [chatUid]);
82
85
  const [isLoading, setIsLoading] = useState(false);
83
86
  const [status, setStatus] = useState('idle');
84
87
  const [error, setError] = useState(null);
@@ -307,6 +310,10 @@ function useDevicChat(options) {
307
310
  return result;
308
311
  }, {
309
312
  interval: pollingInterval,
313
+ // Only when asked for: the poll is the default until the flag flips.
314
+ streamFn: streaming
315
+ ? (onSnapshot, signal, onActivity) => clientRef.current.streamRealtimeHistory(assistantId, chatUid, onSnapshot, signal, onActivity)
316
+ : undefined,
310
317
  enabled: shouldPoll,
311
318
  stopStatuses: [
312
319
  'completed',
@@ -316,6 +323,7 @@ function useDevicChat(options) {
316
323
  'limit_exceeded',
317
324
  ],
318
325
  onUpdate: async (data) => {
326
+ setStreamingMessage(data.status === 'processing' ? data.streamingMessage || null : null);
319
327
  logRef.current.log('[useDevicChat] onUpdate called, status:', data.status);
320
328
  // An assistant message written after something was queued from here is
321
329
  // the answer that was being waited for.
@@ -919,7 +927,7 @@ function useDevicChat(options) {
919
927
  };
920
928
  }, [assistantId, resetQueueState]);
921
929
  return {
922
- messages,
930
+ messages: streamingMessage && isLoading ? [...messages, streamingMessage] : messages,
923
931
  chatUid,
924
932
  isLoading,
925
933
  status,