@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
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Consume Devic's version-1 SSE snapshots, tolerating arbitrary UTF-8/chunk
3
+ * boundaries. `onActivity` fires on every chunk, keep-alive comments included,
4
+ * so the caller can tell a quiet connection from a dead one.
5
+ */
6
+ export declare function consumeChatStream<T>(response: Response, onSnapshot: (snapshot: T) => void | Promise<void>, onActivity?: () => void): Promise<void>;
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Consume Devic's version-1 SSE snapshots, tolerating arbitrary UTF-8/chunk
3
+ * boundaries. `onActivity` fires on every chunk, keep-alive comments included,
4
+ * so the caller can tell a quiet connection from a dead one.
5
+ */
6
+ async function consumeChatStream(response, onSnapshot, onActivity) {
7
+ if (!response.ok || !response.headers.get('content-type')?.includes('text/event-stream') || !response.body) {
8
+ throw new Error('Chat streaming unavailable');
9
+ }
10
+ const reader = response.body.getReader();
11
+ const decoder = new TextDecoder();
12
+ let buffer = '';
13
+ try {
14
+ while (true) {
15
+ const { value, done } = await reader.read();
16
+ if (done)
17
+ break;
18
+ onActivity?.();
19
+ buffer += decoder.decode(value, { stream: true }).replace(/\r\n/g, '\n');
20
+ if (buffer.length > 16 * 1024 * 1024)
21
+ throw new Error('Chat stream frame too large');
22
+ let boundary;
23
+ while ((boundary = buffer.indexOf('\n\n')) !== -1) {
24
+ const frame = buffer.slice(0, boundary);
25
+ buffer = buffer.slice(boundary + 2);
26
+ const lines = frame.split('\n');
27
+ if (!lines.some(line => line === 'event: snapshot'))
28
+ continue;
29
+ const data = lines.filter(line => line.startsWith('data:')).map(line => line.slice(5).trimStart()).join('\n');
30
+ if (data)
31
+ await onSnapshot(JSON.parse(data));
32
+ }
33
+ }
34
+ }
35
+ finally {
36
+ await reader.cancel().catch(() => { });
37
+ reader.releaseLock();
38
+ }
39
+ }
40
+
41
+ export { consumeChatStream };
42
+ //# sourceMappingURL=consumeChatStream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consumeChatStream.js","sources":["../../../src/utils/consumeChatStream.ts"],"sourcesContent":["/**\n * Consume Devic's version-1 SSE snapshots, tolerating arbitrary UTF-8/chunk\n * boundaries. `onActivity` fires on every chunk, keep-alive comments included,\n * so the caller can tell a quiet connection from a dead one.\n */\nexport async function consumeChatStream<T>(\n response: Response,\n onSnapshot: (snapshot: T) => void | Promise<void>,\n onActivity?: () => void,\n): Promise<void> {\n if (!response.ok || !response.headers.get('content-type')?.includes('text/event-stream') || !response.body) {\n throw new Error('Chat streaming unavailable');\n }\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n onActivity?.();\n buffer += decoder.decode(value, { stream: true }).replace(/\\r\\n/g, '\\n');\n if (buffer.length > 16 * 1024 * 1024) throw new Error('Chat stream frame too large');\n let boundary: number;\n while ((boundary = buffer.indexOf('\\n\\n')) !== -1) {\n const frame = buffer.slice(0, boundary);\n buffer = buffer.slice(boundary + 2);\n const lines = frame.split('\\n');\n if (!lines.some(line => line === 'event: snapshot')) continue;\n const data = lines.filter(line => line.startsWith('data:')).map(line => line.slice(5).trimStart()).join('\\n');\n if (data) await onSnapshot(JSON.parse(data));\n }\n }\n } finally {\n await reader.cancel().catch(() => {});\n reader.releaseLock();\n }\n}\n\n"],"names":[],"mappings":"AAAA;;;;AAIG;AACI,eAAe,iBAAiB,CACrC,QAAkB,EAClB,UAAiD,EACjD,UAAuB,EAAA;IAEvB,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,QAAQ,CAAC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AAC1G,QAAA,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC;IAC/C;IACA,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE;AACxC,IAAA,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE;IACjC,IAAI,MAAM,GAAG,EAAE;AACf,IAAA,IAAI;QACF,OAAO,IAAI,EAAE;YACX,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE;AAC3C,YAAA,IAAI,IAAI;gBAAE;YACV,UAAU,IAAI;YACd,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC;YACxE,IAAI,MAAM,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI;AAAE,gBAAA,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC;AACpF,YAAA,IAAI,QAAgB;AACpB,YAAA,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE;gBACjD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC;gBACvC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACnC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;AAC/B,gBAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,iBAAiB,CAAC;oBAAE;AACrD,gBAAA,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;AAC7G,gBAAA,IAAI,IAAI;oBAAE,MAAM,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC9C;QACF;IACF;YAAU;AACR,QAAA,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,MAAK,EAAE,CAAC,CAAC;QACrC,MAAM,CAAC,WAAW,EAAE;IACtB;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/utils/index.ts"],"sourcesContent":["export { segmentToolCalls } from './toolGroups';\nexport { createLogger } from './logger';\nexport type { DevicLogger } from './logger';\nexport type { ToolGroupSegment } from './toolGroups';\n\n/**\n * Generate a unique ID\n */\nexport function generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/**\n * Deep merge two objects\n */\nexport function deepMerge<T extends Record<string, any>>(\n target: T,\n source: Partial<T>\n): T {\n const result = { ...target };\n\n for (const key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n const sourceValue = source[key];\n const targetValue = result[key];\n\n if (\n sourceValue &&\n typeof sourceValue === 'object' &&\n !Array.isArray(sourceValue) &&\n targetValue &&\n typeof targetValue === 'object' &&\n !Array.isArray(targetValue)\n ) {\n result[key] = deepMerge(targetValue, sourceValue as any);\n } else if (sourceValue !== undefined) {\n result[key] = sourceValue as any;\n }\n }\n }\n\n return result;\n}\n\n/**\n * Debounce a function\n */\nexport function debounce<T extends (...args: any[]) => any>(\n fn: T,\n delay: number\n): (...args: Parameters<T>) => void {\n let timeoutId: ReturnType<typeof setTimeout>;\n\n return (...args: Parameters<T>) => {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => fn(...args), delay);\n };\n}\n\n/**\n * Throttle a function\n */\nexport function throttle<T extends (...args: any[]) => any>(\n fn: T,\n delay: number\n): (...args: Parameters<T>) => void {\n let lastCall = 0;\n\n return (...args: Parameters<T>) => {\n const now = Date.now();\n if (now - lastCall >= delay) {\n lastCall = now;\n fn(...args);\n }\n };\n}\n\n/**\n * Format file size for display\n */\nexport function formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 B';\n\n const units = ['B', 'KB', 'MB', 'GB'];\n const k = 1024;\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(1))} ${units[i]}`;\n}\n\n/**\n * Check if running in browser\n */\nexport function isBrowser(): boolean {\n return typeof window !== 'undefined';\n}\n\n/**\n * Local storage helper with JSON serialization\n */\nexport const storage = {\n get<T>(key: string, defaultValue?: T): T | null {\n if (!isBrowser()) return defaultValue ?? null;\n\n try {\n const item = localStorage.getItem(key);\n return item ? JSON.parse(item) : (defaultValue ?? null);\n } catch {\n return defaultValue ?? null;\n }\n },\n\n set<T>(key: string, value: T): void {\n if (!isBrowser()) return;\n\n try {\n localStorage.setItem(key, JSON.stringify(value));\n } catch {\n // Storage full or other error\n }\n },\n\n remove(key: string): void {\n if (!isBrowser()) return;\n\n try {\n localStorage.removeItem(key);\n } catch {\n // Error removing item\n }\n },\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/utils/index.ts"],"sourcesContent":["export { segmentToolCalls } from './toolGroups';\nexport { createLogger } from './logger';\nexport type { DevicLogger } from './logger';\nexport type { ToolGroupSegment } from './toolGroups';\n\n/**\n * Generate a unique ID\n */\nexport function generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/**\n * Deep merge two objects\n */\nexport function deepMerge<T extends Record<string, any>>(\n target: T,\n source: Partial<T>\n): T {\n const result = { ...target };\n\n for (const key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n const sourceValue = source[key];\n const targetValue = result[key];\n\n if (\n sourceValue &&\n typeof sourceValue === 'object' &&\n !Array.isArray(sourceValue) &&\n targetValue &&\n typeof targetValue === 'object' &&\n !Array.isArray(targetValue)\n ) {\n result[key] = deepMerge(targetValue, sourceValue as any);\n } else if (sourceValue !== undefined) {\n result[key] = sourceValue as any;\n }\n }\n }\n\n return result;\n}\n\n/**\n * Debounce a function\n */\nexport function debounce<T extends (...args: any[]) => any>(\n fn: T,\n delay: number\n): (...args: Parameters<T>) => void {\n let timeoutId: ReturnType<typeof setTimeout>;\n\n return (...args: Parameters<T>) => {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => fn(...args), delay);\n };\n}\n\n/**\n * Throttle a function\n */\nexport function throttle<T extends (...args: any[]) => any>(\n fn: T,\n delay: number\n): (...args: Parameters<T>) => void {\n let lastCall = 0;\n\n return (...args: Parameters<T>) => {\n const now = Date.now();\n if (now - lastCall >= delay) {\n lastCall = now;\n fn(...args);\n }\n };\n}\n\n/**\n * Format file size for display\n */\nexport function formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 B';\n\n const units = ['B', 'KB', 'MB', 'GB'];\n const k = 1024;\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(1))} ${units[i]}`;\n}\n\n/**\n * Check if running in browser\n */\nexport function isBrowser(): boolean {\n return typeof window !== 'undefined';\n}\n\n/**\n * Local storage helper with JSON serialization\n */\nexport const storage = {\n get<T>(key: string, defaultValue?: T): T | null {\n if (!isBrowser()) return defaultValue ?? null;\n\n try {\n const item = localStorage.getItem(key);\n return item ? JSON.parse(item) : (defaultValue ?? null);\n } catch {\n return defaultValue ?? null;\n }\n },\n\n set<T>(key: string, value: T): void {\n if (!isBrowser()) return;\n\n try {\n localStorage.setItem(key, JSON.stringify(value));\n } catch {\n // Storage full or other error\n }\n },\n\n remove(key: string): void {\n if (!isBrowser()) return;\n\n try {\n localStorage.removeItem(key);\n } catch {\n // Error removing item\n }\n },\n};\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sources":["../../../src/utils/logger.ts"],"sourcesContent":["/**\n * Conditional logger for devic-ui.\n * Only outputs when debug mode is enabled via the Provider or component props.\n */\nexport function createLogger(enabled: boolean) {\n const noop = () => {};\n return {\n log: enabled ? console.log.bind(console) : noop,\n warn: enabled ? console.warn.bind(console) : noop,\n error: enabled ? console.error.bind(console) : noop,\n };\n}\n\nexport type DevicLogger = ReturnType<typeof createLogger>;\n"],"names":[],"mappings":"AAAA;;;AAGG;AACG,SAAU,YAAY,CAAC,OAAgB,EAAA;AAC3C,IAAA,MAAM,IAAI,GAAG,MAAK,EAAE,CAAC;IACrB,OAAO;AACL,QAAA,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI;AAC/C,QAAA,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI;AACjD,QAAA,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI;KACpD;AACH;;"}
1
+ {"version":3,"file":"logger.js","sources":["../../../src/utils/logger.ts"],"sourcesContent":["/**\n * Conditional logger for devic-ui.\n * Only outputs when debug mode is enabled via the Provider or component props.\n */\nexport function createLogger(enabled: boolean) {\n const noop = () => {};\n return {\n log: enabled ? console.log.bind(console) : noop,\n warn: enabled ? console.warn.bind(console) : noop,\n error: enabled ? console.error.bind(console) : noop,\n };\n}\n\nexport type DevicLogger = ReturnType<typeof createLogger>;\n"],"names":[],"mappings":"AAAA;;;AAGG;AACG,SAAU,YAAY,CAAC,OAAgB,EAAA;AAC3C,IAAA,MAAM,IAAI,GAAG,MAAK,EAAE,CAAC;IACrB,OAAO;AACL,QAAA,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI;AAC/C,QAAA,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI;AACjD,QAAA,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI;KACpD;AACH;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"toolGroups.js","sources":["../../../src/utils/toolGroups.ts"],"sourcesContent":["import type { ToolGroupCall, ToolGroupConfig } from '../api/types';\n\nexport type ToolGroupSegment =\n | { type: 'group'; config: ToolGroupConfig; calls: ToolGroupCall[] }\n | { type: 'single'; call: ToolGroupCall; index: number };\n\n/**\n * Partition an array of tool calls into grouped and ungrouped sub-sequences\n * based on the provided toolGroups configuration.\n *\n * Consecutive calls matching the same ToolGroupConfig are accumulated into a single group segment.\n * When a call doesn't match any config, or matches a different config, the current group is flushed.\n */\nexport function segmentToolCalls(\n calls: ToolGroupCall[],\n toolGroups: ToolGroupConfig[],\n): ToolGroupSegment[] {\n const segments: ToolGroupSegment[] = [];\n let currentConfig: ToolGroupConfig | null = null;\n let currentGroup: ToolGroupCall[] = [];\n\n const flush = () => {\n if (currentGroup.length > 0 && currentConfig) {\n segments.push({ type: 'group', config: currentConfig, calls: currentGroup });\n currentGroup = [];\n currentConfig = null;\n }\n };\n\n for (let i = 0; i < calls.length; i++) {\n const call = calls[i];\n const matchingConfig = toolGroups.find((g) => g.tools.includes(call.name));\n\n if (matchingConfig) {\n if (currentConfig === matchingConfig) {\n // Same group, accumulate\n currentGroup.push(call);\n } else {\n // Different group or starting a new one\n flush();\n currentConfig = matchingConfig;\n currentGroup = [call];\n }\n } else {\n // No matching config — flush any pending group, emit as single\n flush();\n segments.push({ type: 'single', call, index: i });\n }\n }\n\n flush();\n\n return segments;\n}\n"],"names":[],"mappings":"AAMA;;;;;;AAMG;AACG,SAAU,gBAAgB,CAC9B,KAAsB,EACtB,UAA6B,EAAA;IAE7B,MAAM,QAAQ,GAAuB,EAAE;IACvC,IAAI,aAAa,GAA2B,IAAI;IAChD,IAAI,YAAY,GAAoB,EAAE;IAEtC,MAAM,KAAK,GAAG,MAAK;QACjB,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,aAAa,EAAE;AAC5C,YAAA,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;YAC5E,YAAY,GAAG,EAAE;YACjB,aAAa,GAAG,IAAI;QACtB;AACF,IAAA,CAAC;AAED,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACrC,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;QACrB,MAAM,cAAc,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE1E,IAAI,cAAc,EAAE;AAClB,YAAA,IAAI,aAAa,KAAK,cAAc,EAAE;;AAEpC,gBAAA,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;YACzB;iBAAO;;AAEL,gBAAA,KAAK,EAAE;gBACP,aAAa,GAAG,cAAc;AAC9B,gBAAA,YAAY,GAAG,CAAC,IAAI,CAAC;YACvB;QACF;aAAO;;AAEL,YAAA,KAAK,EAAE;AACP,YAAA,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QACnD;IACF;AAEA,IAAA,KAAK,EAAE;AAEP,IAAA,OAAO,QAAQ;AACjB;;"}
1
+ {"version":3,"file":"toolGroups.js","sources":["../../../src/utils/toolGroups.ts"],"sourcesContent":["import type { ToolGroupCall, ToolGroupConfig } from '../api/types';\n\nexport type ToolGroupSegment =\n | { type: 'group'; config: ToolGroupConfig; calls: ToolGroupCall[] }\n | { type: 'single'; call: ToolGroupCall; index: number };\n\n/**\n * Partition an array of tool calls into grouped and ungrouped sub-sequences\n * based on the provided toolGroups configuration.\n *\n * Consecutive calls matching the same ToolGroupConfig are accumulated into a single group segment.\n * When a call doesn't match any config, or matches a different config, the current group is flushed.\n */\nexport function segmentToolCalls(\n calls: ToolGroupCall[],\n toolGroups: ToolGroupConfig[],\n): ToolGroupSegment[] {\n const segments: ToolGroupSegment[] = [];\n let currentConfig: ToolGroupConfig | null = null;\n let currentGroup: ToolGroupCall[] = [];\n\n const flush = () => {\n if (currentGroup.length > 0 && currentConfig) {\n segments.push({ type: 'group', config: currentConfig, calls: currentGroup });\n currentGroup = [];\n currentConfig = null;\n }\n };\n\n for (let i = 0; i < calls.length; i++) {\n const call = calls[i];\n const matchingConfig = toolGroups.find((g) => g.tools.includes(call.name));\n\n if (matchingConfig) {\n if (currentConfig === matchingConfig) {\n // Same group, accumulate\n currentGroup.push(call);\n } else {\n // Different group or starting a new one\n flush();\n currentConfig = matchingConfig;\n currentGroup = [call];\n }\n } else {\n // No matching config — flush any pending group, emit as single\n flush();\n segments.push({ type: 'single', call, index: i });\n }\n }\n\n flush();\n\n return segments;\n}\n"],"names":[],"mappings":"AAMA;;;;;;AAMG;AACG,SAAU,gBAAgB,CAC9B,KAAsB,EACtB,UAA6B,EAAA;IAE7B,MAAM,QAAQ,GAAuB,EAAE;IACvC,IAAI,aAAa,GAA2B,IAAI;IAChD,IAAI,YAAY,GAAoB,EAAE;IAEtC,MAAM,KAAK,GAAG,MAAK;QACjB,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,aAAa,EAAE;AAC5C,YAAA,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;YAC5E,YAAY,GAAG,EAAE;YACjB,aAAa,GAAG,IAAI;QACtB;AACF,IAAA,CAAC;AAED,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACrC,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;QACrB,MAAM,cAAc,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE1E,IAAI,cAAc,EAAE;AAClB,YAAA,IAAI,aAAa,KAAK,cAAc,EAAE;;AAEpC,gBAAA,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;YACzB;iBAAO;;AAEL,gBAAA,KAAK,EAAE;gBACP,aAAa,GAAG,cAAc;AAC9B,gBAAA,YAAY,GAAG,CAAC,IAAI,CAAC;YACvB;QACF;aAAO;;AAEL,YAAA,KAAK,EAAE;AACP,YAAA,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QACnD;IACF;AAEA,IAAA,KAAK,EAAE;AAEP,IAAA,OAAO,QAAQ;AACjB;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@devicai/ui",
3
- "version": "0.58.0",
3
+ "version": "0.59.0",
4
4
  "type": "module",
5
5
  "description": "React component library for Devic AI assistants",
6
6
  "engines": {
@@ -26,6 +26,7 @@
26
26
  "clean": "rm -rf dist",
27
27
  "prepublishOnly": "npm run clean && npm run build",
28
28
  "typecheck": "tsc --noEmit",
29
+ "test": "node --test 'tests/*.test.cjs'",
29
30
  "yalc:publish": "npm run build && yalc publish --push",
30
31
  "yalc:watch": "npm run build && yalc publish && npm run dev"
31
32
  },
@@ -42,6 +43,7 @@
42
43
  "@types/react-dom": "^18.0.0",
43
44
  "react": "^18.0.0",
44
45
  "react-dom": "^18.0.0",
46
+ "react-test-renderer": "^18.3.1",
45
47
  "rollup": "^4.0.0",
46
48
  "rollup-plugin-postcss": "^4.0.0",
47
49
  "tslib": "^2.6.0",