@ezychat/web 0.0.0-stage → 0.1.39

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 (186) hide show
  1. package/dist-lib/assets/font-1be3448e292f.woff2 +0 -0
  2. package/dist-lib/assets/font-3100e775e861.woff2 +0 -0
  3. package/dist-lib/assets/font-34b9c504cab7.woff2 +0 -0
  4. package/dist-lib/assets/font-5c66f9e07e90.woff2 +0 -0
  5. package/dist-lib/assets/font-6e9e020a25f9.woff2 +0 -0
  6. package/dist-lib/assets/font-71d5ee93cc1e.woff2 +0 -0
  7. package/dist-lib/assets/font-ca157063339a.woff2 +0 -0
  8. package/dist-lib/chunks/admin-BPgvUcQO.js +602 -0
  9. package/dist-lib/chunks/admin-B_hIZ1Sp.js +603 -0
  10. package/dist-lib/chunks/app-C2A7ZZsu.js +97 -0
  11. package/dist-lib/chunks/app-RX8Fy2Oz.js +97 -0
  12. package/dist-lib/chunks/auth-Cif_yktU.js +127 -0
  13. package/dist-lib/chunks/auth-DJBQd10l.js +127 -0
  14. package/dist-lib/chunks/common-BwLWsyiW.js +80 -0
  15. package/dist-lib/chunks/common-CDytP7HK.js +80 -0
  16. package/dist-lib/chunks/errors-BIyy5VTn.js +39 -0
  17. package/dist-lib/chunks/errors-CEweqDjm.js +39 -0
  18. package/dist-lib/chunks/inbox-IiNeuwOm.js +487 -0
  19. package/dist-lib/chunks/inbox-VvClcCZP.js +487 -0
  20. package/dist-lib/chunks/registerSW-Gn8zt2XY.js +16 -0
  21. package/dist-lib/ezychat-web.css +2 -0
  22. package/dist-lib/index.js +16732 -0
  23. package/dist-lib/public/apple-touch-icon.png +0 -0
  24. package/dist-lib/public/brand/ezychat-logo.png +0 -0
  25. package/dist-lib/public/favicon.ico +0 -0
  26. package/dist-lib/public/icon-192.png +0 -0
  27. package/dist-lib/public/icon-512.png +0 -0
  28. package/dist-lib/public/icon-maskable-512.png +0 -0
  29. package/dist-lib/public/illustrations/empty-inbox.png +0 -0
  30. package/dist-lib/public/illustrations/link-whatsapp.png +0 -0
  31. package/dist-lib/public/illustrations/no-results.png +0 -0
  32. package/dist-lib/public/illustrations/tunnel.png +0 -0
  33. package/dist-lib/public/illustrations/welcome.png +0 -0
  34. package/dist-lib/public/share-app.svg +16 -0
  35. package/dist-lib/sw.ts +71 -0
  36. package/dist-lib/types/App.d.ts +2 -0
  37. package/dist-lib/types/access/AccessGate.d.ts +24 -0
  38. package/dist-lib/types/access/BannerSlot.d.ts +35 -0
  39. package/dist-lib/types/access/events.d.ts +16 -0
  40. package/dist-lib/types/admin/AdminLayout.d.ts +36 -0
  41. package/dist-lib/types/admin/AiConnectionBanner.d.ts +7 -0
  42. package/dist-lib/types/admin/AiConnectionSection.d.ts +3 -0
  43. package/dist-lib/types/admin/AiContextPanel.d.ts +11 -0
  44. package/dist-lib/types/admin/AiEditDialog.d.ts +13 -0
  45. package/dist-lib/types/admin/AiMemberPage.d.ts +1 -0
  46. package/dist-lib/types/admin/AiQuickConnect.d.ts +22 -0
  47. package/dist-lib/types/admin/AiTryIt.d.ts +8 -0
  48. package/dist-lib/types/admin/AiVoiceSection.d.ts +2 -0
  49. package/dist-lib/types/admin/AuditPage.d.ts +1 -0
  50. package/dist-lib/types/admin/CloudflareSetup.d.ts +5 -0
  51. package/dist-lib/types/admin/CreateTokenDialog.d.ts +13 -0
  52. package/dist-lib/types/admin/CustomerEnrichmentSection.d.ts +1 -0
  53. package/dist-lib/types/admin/EnrichmentAuditScore.d.ts +4 -0
  54. package/dist-lib/types/admin/IntegrationsSection.d.ts +7 -0
  55. package/dist-lib/types/admin/MembersPage.d.ts +2 -0
  56. package/dist-lib/types/admin/QuickRepliesPage.d.ts +2 -0
  57. package/dist-lib/types/admin/ResolveAllChatsCard.d.ts +1 -0
  58. package/dist-lib/types/admin/SettingsPage.d.ts +2 -0
  59. package/dist-lib/types/admin/TokenConnectSteps.d.ts +12 -0
  60. package/dist-lib/types/admin/TunnelPage.d.ts +1 -0
  61. package/dist-lib/types/admin/WhatsAppPage.d.ts +11 -0
  62. package/dist-lib/types/admin/adminUi.d.ts +62 -0
  63. package/dist-lib/types/admin/ai-status.d.ts +12 -0
  64. package/dist-lib/types/admin/audit-actions.d.ts +10 -0
  65. package/dist-lib/types/admin/line-diff.d.ts +26 -0
  66. package/dist-lib/types/admin/use-chatgpt-sign-in.d.ts +14 -0
  67. package/dist-lib/types/api/ai.d.ts +174 -0
  68. package/dist-lib/types/api/client.d.ts +22 -0
  69. package/dist-lib/types/api/enrichment.d.ts +8 -0
  70. package/dist-lib/types/api/queries.d.ts +664 -0
  71. package/dist-lib/types/api/resume-reconnect.d.ts +15 -0
  72. package/dist-lib/types/api/socket.d.ts +19 -0
  73. package/dist-lib/types/api/voice.d.ts +33 -0
  74. package/dist-lib/types/auth/AuthProvider.d.ts +15 -0
  75. package/dist-lib/types/auth/AuthShell.d.ts +28 -0
  76. package/dist-lib/types/auth/ChangePasswordPage.d.ts +2 -0
  77. package/dist-lib/types/auth/LoginPage.d.ts +2 -0
  78. package/dist-lib/types/auth/RequireAuth.d.ts +12 -0
  79. package/dist-lib/types/auth/UserMenu.d.ts +5 -0
  80. package/dist-lib/types/components/app/AboutDialog.d.ts +7 -0
  81. package/dist-lib/types/components/app/AppCredits.d.ts +8 -0
  82. package/dist-lib/types/components/app/DesktopUpdates.d.ts +3 -0
  83. package/dist-lib/types/components/app/DevBuildBadge.d.ts +5 -0
  84. package/dist-lib/types/components/app/ErrorBoundary.d.ts +23 -0
  85. package/dist-lib/types/components/app/FeatureRequestAction.d.ts +7 -0
  86. package/dist-lib/types/components/app/SearchField.d.ts +7 -0
  87. package/dist-lib/types/components/app/SegmentedControl.d.ts +19 -0
  88. package/dist-lib/types/components/app/ShareAppAction.d.ts +5 -0
  89. package/dist-lib/types/components/app/index.d.ts +81 -0
  90. package/dist-lib/types/components/ui/alert-dialog.d.ts +18 -0
  91. package/dist-lib/types/components/ui/avatar.d.ts +11 -0
  92. package/dist-lib/types/components/ui/badge.d.ts +9 -0
  93. package/dist-lib/types/components/ui/button.d.ts +10 -0
  94. package/dist-lib/types/components/ui/card.d.ts +9 -0
  95. package/dist-lib/types/components/ui/checkbox.d.ts +4 -0
  96. package/dist-lib/types/components/ui/command.d.ts +18 -0
  97. package/dist-lib/types/components/ui/dialog.d.ts +17 -0
  98. package/dist-lib/types/components/ui/drawer.d.ts +13 -0
  99. package/dist-lib/types/components/ui/dropdown-menu.d.ts +25 -0
  100. package/dist-lib/types/components/ui/input.d.ts +3 -0
  101. package/dist-lib/types/components/ui/label.d.ts +4 -0
  102. package/dist-lib/types/components/ui/popover.d.ts +10 -0
  103. package/dist-lib/types/components/ui/progress.d.ts +4 -0
  104. package/dist-lib/types/components/ui/radio-group.d.ts +5 -0
  105. package/dist-lib/types/components/ui/scroll-area.d.ts +5 -0
  106. package/dist-lib/types/components/ui/select.d.ts +15 -0
  107. package/dist-lib/types/components/ui/separator.d.ts +4 -0
  108. package/dist-lib/types/components/ui/sheet.d.ts +14 -0
  109. package/dist-lib/types/components/ui/skeleton.d.ts +2 -0
  110. package/dist-lib/types/components/ui/sonner.d.ts +4 -0
  111. package/dist-lib/types/components/ui/switch.d.ts +6 -0
  112. package/dist-lib/types/components/ui/table.d.ts +10 -0
  113. package/dist-lib/types/components/ui/tabs.d.ts +11 -0
  114. package/dist-lib/types/components/ui/textarea.d.ts +3 -0
  115. package/dist-lib/types/components/ui/tooltip.d.ts +7 -0
  116. package/dist-lib/types/create-app.d.ts +20 -0
  117. package/dist-lib/types/extensions/context.d.ts +8 -0
  118. package/dist-lib/types/extensions/i18n.d.ts +15 -0
  119. package/dist-lib/types/extensions/index.d.ts +4 -0
  120. package/dist-lib/types/extensions/routes.d.ts +12 -0
  121. package/dist-lib/types/extensions/types.d.ts +116 -0
  122. package/dist-lib/types/i18n/LanguageSelect.d.ts +4 -0
  123. package/dist-lib/types/i18n/LocaleSync.d.ts +2 -0
  124. package/dist-lib/types/i18n/date-locale.d.ts +5 -0
  125. package/dist-lib/types/i18n/index.d.ts +17 -0
  126. package/dist-lib/types/i18n/locale-store.d.ts +26 -0
  127. package/dist-lib/types/i18n/resources.d.ts +1711 -0
  128. package/dist-lib/types/i18n/use-change-locale.d.ts +9 -0
  129. package/dist-lib/types/inbox/ChatAvatar.d.ts +13 -0
  130. package/dist-lib/types/inbox/ChatFilters.d.ts +6 -0
  131. package/dist-lib/types/inbox/ChatList.d.ts +9 -0
  132. package/dist-lib/types/inbox/ChatListItem.d.ts +13 -0
  133. package/dist-lib/types/inbox/Composer.d.ts +30 -0
  134. package/dist-lib/types/inbox/Conversation.d.ts +7 -0
  135. package/dist-lib/types/inbox/ConversationHeader.d.ts +25 -0
  136. package/dist-lib/types/inbox/CustomerPanel.d.ts +32 -0
  137. package/dist-lib/types/inbox/EmojiPicker.d.ts +6 -0
  138. package/dist-lib/types/inbox/EventItem.d.ts +14 -0
  139. package/dist-lib/types/inbox/GettingStartedCard.d.ts +10 -0
  140. package/dist-lib/types/inbox/GroupPanel.d.ts +19 -0
  141. package/dist-lib/types/inbox/InboxPage.d.ts +2 -0
  142. package/dist-lib/types/inbox/MediaView.d.ts +8 -0
  143. package/dist-lib/types/inbox/MessageBubble.d.ts +31 -0
  144. package/dist-lib/types/inbox/MessageList.d.ts +21 -0
  145. package/dist-lib/types/inbox/NotesPanel.d.ts +15 -0
  146. package/dist-lib/types/inbox/PanelHeader.d.ts +13 -0
  147. package/dist-lib/types/inbox/ProfileImageContext.d.ts +5 -0
  148. package/dist-lib/types/inbox/QuickReplyPicker.d.ts +18 -0
  149. package/dist-lib/types/inbox/ReconnectBanner.d.ts +8 -0
  150. package/dist-lib/types/inbox/TagInput.d.ts +14 -0
  151. package/dist-lib/types/inbox/TypingIndicator.d.ts +6 -0
  152. package/dist-lib/types/inbox/VoiceNote.d.ts +36 -0
  153. package/dist-lib/types/inbox/WaBanner.d.ts +9 -0
  154. package/dist-lib/types/inbox/chat-title.d.ts +4 -0
  155. package/dist-lib/types/inbox/navigation-guard.d.ts +17 -0
  156. package/dist-lib/types/inbox/timeline.d.ts +26 -0
  157. package/dist-lib/types/inbox/useCanonicalChatRedirect.d.ts +2 -0
  158. package/dist-lib/types/inbox/useDirectory.d.ts +21 -0
  159. package/dist-lib/types/inbox/useSwipeReply.d.ts +11 -0
  160. package/dist-lib/types/index.d.ts +43 -0
  161. package/dist-lib/types/lib/ai-handoff.d.ts +4 -0
  162. package/dist-lib/types/lib/app-links.d.ts +9 -0
  163. package/dist-lib/types/lib/desktop-updates.d.ts +15 -0
  164. package/dist-lib/types/lib/error-reporter.d.ts +6 -0
  165. package/dist-lib/types/lib/format.d.ts +20 -0
  166. package/dist-lib/types/lib/jid.d.ts +15 -0
  167. package/dist-lib/types/lib/links.d.ts +40 -0
  168. package/dist-lib/types/lib/share-app.d.ts +18 -0
  169. package/dist-lib/types/lib/theme.d.ts +29 -0
  170. package/dist-lib/types/lib/use-media-query.d.ts +2 -0
  171. package/dist-lib/types/lib/utils.d.ts +2 -0
  172. package/dist-lib/types/lib/version.d.ts +12 -0
  173. package/dist-lib/types/lib/voice-recorder.d.ts +26 -0
  174. package/dist-lib/types/pwa/InstallHint.d.ts +9 -0
  175. package/dist-lib/types/pwa/PushToggle.d.ts +20 -0
  176. package/dist-lib/types/pwa/desktop-notifications.d.ts +18 -0
  177. package/dist-lib/types/pwa/push.d.ts +13 -0
  178. package/dist-lib/types/setup/AiAssistantStep.d.ts +9 -0
  179. package/dist-lib/types/setup/SetupWizard.d.ts +3 -0
  180. package/dist-lib/types/setup/WaLinkStep.d.ts +8 -0
  181. package/dist-lib/types/setup/agent-name.d.ts +8 -0
  182. package/dist-lib/types/setup/connected-label.d.ts +7 -0
  183. package/dist-lib/types/setup/username.d.ts +9 -0
  184. package/dist-lib/types/wa/PhoneLink.d.ts +4 -0
  185. package/package.json +81 -4
  186. package/README.md +0 -3
Binary file
Binary file
Binary file
@@ -0,0 +1,16 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="1080" height="1080" viewBox="0 0 1080 1080">
2
+ <title>EzyChat Lite — free WhatsApp team inbox</title>
3
+ <desc>Runs on your computer. You own your data. github.com/ossmalaysia/ezychat-lite</desc>
4
+ <rect width="1080" height="1080" fill="#F8FAFC"/>
5
+ <rect x="64" y="64" width="952" height="952" rx="40" fill="#FFFFFF" stroke="#E2E8F0" stroke-width="2"/>
6
+ <image x="128" y="128" width="160" height="160" href="data:image/png;base64,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"/>
7
+ <g font-family="Arial, Helvetica, sans-serif" fill="#0F172A">
8
+ <text x="328" y="219" font-size="52" font-weight="700">EzyChat Lite</text>
9
+ <text x="128" y="422" font-size="68" font-weight="700">Free WhatsApp</text>
10
+ <text x="128" y="506" font-size="68" font-weight="700">team inbox.</text>
11
+ <text x="128" y="637" font-size="42">Runs on your computer.</text>
12
+ <text x="128" y="701" font-size="42" fill="#0F766E" font-weight="700">You own your data.</text>
13
+ <text x="128" y="810" font-size="30" fill="#475569">One number. One shared inbox.</text>
14
+ <text x="128" y="906" font-size="28" fill="#475569">github.com/ossmalaysia/ezychat-lite</text>
15
+ </g>
16
+ </svg>
package/dist-lib/sw.ts ADDED
@@ -0,0 +1,71 @@
1
+ /// <reference lib="webworker" />
2
+ // Service worker (built by vite-plugin-pwa, strategies: 'injectManifest').
3
+ import { cleanupOutdatedCaches, precacheAndRoute } from 'workbox-precaching';
4
+
5
+ declare let self: ServiceWorkerGlobalScope & {
6
+ __WB_MANIFEST: Array<string | { url: string; revision: string | null }>;
7
+ };
8
+
9
+ /** Payload sent by the server's PushService (packages/server/src/push). */
10
+ interface PushPayload {
11
+ title?: string;
12
+ body?: string;
13
+ url?: string;
14
+ tag?: string;
15
+ }
16
+
17
+ cleanupOutdatedCaches();
18
+ precacheAndRoute(self.__WB_MANIFEST);
19
+
20
+ // registerType 'autoUpdate': activate new versions immediately.
21
+ self.addEventListener('install', () => {
22
+ void self.skipWaiting();
23
+ });
24
+ self.addEventListener('activate', (event) => {
25
+ event.waitUntil(self.clients.claim());
26
+ });
27
+
28
+ self.addEventListener('push', (event) => {
29
+ let data: PushPayload;
30
+ try {
31
+ data = (event.data?.json() as PushPayload | undefined) ?? {};
32
+ } catch {
33
+ data = { body: event.data?.text() };
34
+ }
35
+ const title = data.title || 'EzyChat Lite';
36
+ const options: NotificationOptions = {
37
+ body: data.body ?? '',
38
+ tag: data.tag,
39
+ icon: '/icon-192.png',
40
+ badge: '/icon-192.png',
41
+ data: { url: data.url ?? '/' },
42
+ };
43
+ event.waitUntil(self.registration.showNotification(title, options));
44
+ });
45
+
46
+ self.addEventListener('notificationclick', (event) => {
47
+ event.notification.close();
48
+ const raw = (event.notification.data as { url?: string } | null)?.url ?? '/';
49
+ const target = new URL(raw, self.location.origin).href;
50
+
51
+ event.waitUntil(
52
+ (async () => {
53
+ const windows = await self.clients.matchAll({ type: 'window', includeUncontrolled: true });
54
+ const sameOrigin = windows.filter((c) => new URL(c.url).origin === self.location.origin);
55
+ const existing = sameOrigin.find((c) => c.focused) ?? sameOrigin[0];
56
+ if (existing) {
57
+ await existing.focus();
58
+ if (existing.url !== target) {
59
+ try {
60
+ await existing.navigate(target);
61
+ } catch {
62
+ // navigate() fails for uncontrolled clients; ask the page to route instead.
63
+ existing.postMessage({ type: 'navigate', url: raw });
64
+ }
65
+ }
66
+ return;
67
+ }
68
+ await self.clients.openWindow(target);
69
+ })(),
70
+ );
71
+ });
@@ -0,0 +1,2 @@
1
+ export declare function App(): import("react").JSX.Element;
2
+ export default App;
@@ -0,0 +1,24 @@
1
+ import { type ReactNode } from 'react';
2
+ import { type AccessStatus } from '@ezychat/shared';
3
+ import { type WebExtensionLockScreenProps } from '../extensions';
4
+ /** How often a closed gate reads GET /api/access again. */
5
+ export declare const ACCESS_POLL_MS = 60000;
6
+ /**
7
+ * GET /api/access without the shared API client (no 401/403 side effects). A server that does not
8
+ * answer it (an older build, a network error) counts as open: the gate never locks anyone out by
9
+ * itself; the server enforces access.
10
+ */
11
+ export declare function readAccessStatus(signal?: AbortSignal): Promise<AccessStatus | null>;
12
+ /**
13
+ * Shows the app while the server's access gate is open and a lock screen (the extension's, or the
14
+ * core "paused" screen) while it is closed. It reads GET /api/access on start, every minute while
15
+ * closed and whenever asked; API calls answering 403 with the gate code close it at once. When a
16
+ * closed gate opens again the page reloads, so every query and the socket start fresh.
17
+ */
18
+ export declare function AccessGate({ children, reload, }: {
19
+ children: ReactNode;
20
+ /** Called when a closed gate opens again; tests pass a spy. */
21
+ reload?: () => void;
22
+ }): import("react").JSX.Element;
23
+ /** Core lock screen: the app is paused; WhatsApp keeps receiving messages meanwhile. */
24
+ export declare function PausedScreen({ code, recheck }: WebExtensionLockScreenProps): import("react").JSX.Element;
@@ -0,0 +1,35 @@
1
+ import { type ReactNode } from 'react';
2
+ /**
3
+ * The one slim bar at the top of the signed-in shell (inbox and admin). Every extension banner is
4
+ * rendered in order; the first one that renders anything is shown and the rest stay hidden, so at
5
+ * most one bar takes space. A crashing banner hides itself only.
6
+ */
7
+ export declare function ExtensionBannerSlot(): import("react").JSX.Element | null;
8
+ declare const SLIM_TONE: {
9
+ readonly info: {
10
+ readonly cls: "border-info/30 bg-info/10";
11
+ readonly Icon: import("lucide-react").LucideIcon;
12
+ readonly icon: "text-info";
13
+ };
14
+ readonly warning: {
15
+ readonly cls: "border-warning/40 bg-warning/10";
16
+ readonly Icon: import("lucide-react").LucideIcon;
17
+ readonly icon: "text-warning";
18
+ };
19
+ readonly danger: {
20
+ readonly cls: "border-danger/30 bg-danger/10";
21
+ readonly Icon: import("lucide-react").LucideIcon;
22
+ readonly icon: "text-danger";
23
+ };
24
+ };
25
+ /**
26
+ * A slim one-line bar for `WebExtension.banners`: icon, one line of text (truncated on small
27
+ * screens) and an optional action such as a link button.
28
+ */
29
+ export declare function SlimBanner({ tone, children, action, className, }: {
30
+ tone?: keyof typeof SLIM_TONE;
31
+ children: ReactNode;
32
+ action?: ReactNode;
33
+ className?: string;
34
+ }): import("react").JSX.Element;
35
+ export {};
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Access gate signals between the API client / socket and the `AccessGate` component. An edition
3
+ * may close the server's access gate (e.g. no licence): every /api call then answers 403 with the
4
+ * gate's code as a plain string (`{ error: "<code>" }`), unlike ordinary errors
5
+ * (`{ error: { code, message } }`).
6
+ */
7
+ export declare const ACCESS_CLOSED_EVENT = "ezychat:access-closed";
8
+ /** Ask the gate to read GET /api/access again (e.g. the realtime socket was refused). */
9
+ export declare const ACCESS_RECHECK_EVENT = "ezychat:access-recheck";
10
+ export interface AccessClosedDetail {
11
+ code: string;
12
+ }
13
+ /** The gate code in a 403 body, or null when the body is an ordinary error. */
14
+ export declare function accessGateCode(status: number, body: unknown): string | null;
15
+ export declare function dispatchAccessClosed(code: string): void;
16
+ export declare function dispatchAccessRecheck(): void;
@@ -0,0 +1,36 @@
1
+ import { type LucideIcon } from 'lucide-react';
2
+ import { type WebExtension, type WebExtensionAdminSection } from '../extensions';
3
+ /** `labelKey` is a translation key in the `admin` namespace. */
4
+ export declare const ADMIN_NAV: readonly [{
5
+ readonly to: "members";
6
+ readonly labelKey: "nav.members";
7
+ readonly icon: LucideIcon;
8
+ }, {
9
+ readonly to: "quick-replies";
10
+ readonly labelKey: "nav.quickReplies";
11
+ readonly icon: LucideIcon;
12
+ }, {
13
+ readonly to: "whatsapp";
14
+ readonly labelKey: "nav.whatsapp";
15
+ readonly icon: LucideIcon;
16
+ }, {
17
+ readonly to: "tunnel";
18
+ readonly labelKey: "nav.tunnel";
19
+ readonly icon: LucideIcon;
20
+ }, {
21
+ readonly to: "settings";
22
+ readonly labelKey: "nav.settings";
23
+ readonly icon: LucideIcon;
24
+ }, {
25
+ readonly to: "audit";
26
+ readonly labelKey: "nav.audit";
27
+ readonly icon: LucideIcon;
28
+ }];
29
+ /** The core section an extension admin route declares for this path (e.g. `members`). */
30
+ export declare function extensionSectionOf(extensions: readonly WebExtension[], pathname: string): WebExtensionAdminSection | undefined;
31
+ /**
32
+ * Admin shell. Side nav on >= md; on phones a top bar with a Sheet menu.
33
+ * Mounted by App.tsx at `/admin/*`; non-admins are redirected to `/`.
34
+ */
35
+ export declare function AdminLayout(): import("react").JSX.Element;
36
+ export default AdminLayout;
@@ -0,0 +1,7 @@
1
+ import type React from 'react';
2
+ import type { AiMemberStatus } from '@ezychat/shared';
3
+ /** The one banner for a ChatGPT connection that expired or stopped working. */
4
+ export declare function AiConnectionBanner({ status, action, }: {
5
+ status: AiMemberStatus;
6
+ action?: React.ReactNode;
7
+ }): React.JSX.Element | null;
@@ -0,0 +1,3 @@
1
+ import type React from 'react';
2
+ /** Settings → AI: the inbox-wide AI connection, edited in place (no popup). */
3
+ export declare function AiConnectionSection(): React.JSX.Element;
@@ -0,0 +1,11 @@
1
+ import { type AiDocument } from '@ezychat/shared';
2
+ /**
3
+ * Business context as a list of items (uploaded files and text content), like a project
4
+ * knowledge panel: search, multi-select delete, and Add ▾ (upload or text). Items belong to the
5
+ * AI member, so `ensureMember` saves a draft member first when there is none yet.
6
+ */
7
+ export declare function AiContextPanel({ documents, ensureMember, disabled, }: {
8
+ documents: AiDocument[];
9
+ ensureMember: () => Promise<boolean>;
10
+ disabled?: boolean;
11
+ }): import("react").JSX.Element;
@@ -0,0 +1,13 @@
1
+ import { type AiEditField } from '@ezychat/shared';
2
+ /**
3
+ * Edit with AI: the admin describes a change to one box, reviews the suggested rewrite as a line
4
+ * diff and applies it to the page's draft. Applying never saves; the page's Save does.
5
+ */
6
+ export declare function AiEditDialog({ field, current, open, onOpenChange, onApply, }: {
7
+ field: AiEditField;
8
+ /** The box's current (possibly unsaved) text. */
9
+ current: string;
10
+ open: boolean;
11
+ onOpenChange: (open: boolean) => void;
12
+ onApply: (text: string) => void;
13
+ }): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ export declare function AiMemberPage(): import("react").JSX.Element;
@@ -0,0 +1,22 @@
1
+ import type { TFunction } from 'i18next';
2
+ import { type AiKeyTestError, type AiMemberStatus } from '@ezychat/shared';
3
+ /** Checks an OpenAI API key with one small request; the server never stores or logs it. */
4
+ export declare function useTestApiKey(): import("@tanstack/react-query").UseMutationResult<{
5
+ ok: boolean;
6
+ error: "rate_limited" | "forbidden" | "invalid_key" | "unreachable" | null;
7
+ }, Error, string, unknown>;
8
+ /**
9
+ * Only a key OpenAI rejected outright (401) is refused. Any other failed test may be a key that still
10
+ * answers customers (no Models permission, a region block, a passing limit), so it can be saved anyway.
11
+ */
12
+ export declare function keyTestBlocks(error: AiKeyTestError | null | undefined): boolean;
13
+ /** The message for a failed key test (`ok: false`). */
14
+ export declare function keyTestMessage(t: TFunction<'admin'>, error: AiKeyTestError | null | undefined): string;
15
+ /**
16
+ * One compact "connect the AI" block, used by the setup wizard and the Sales Agent page.
17
+ * Sign in with ChatGPT first (recommended); an OpenAI API key is the secondary option and is
18
+ * tested before it is saved.
19
+ */
20
+ export declare function AiQuickConnect({ status }: {
21
+ status: AiMemberStatus;
22
+ }): import("react").JSX.Element;
@@ -0,0 +1,8 @@
1
+ import type { AiKnowledgeDraft } from './ai-status';
2
+ /**
3
+ * Asks the AI a test question with the page's current (possibly unsaved) name and instructions;
4
+ * the server answers from the saved Business context items.
5
+ */
6
+ export declare function AiTryIt({ draft }: {
7
+ draft: AiKnowledgeDraft;
8
+ }): import("react").JSX.Element;
@@ -0,0 +1,2 @@
1
+ /** Settings → AI → Voice messages: transcription engine and the local Whisper model. */
2
+ export declare function AiVoiceSection(): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ export declare function AuditPage(): import("react").JSX.Element;
@@ -0,0 +1,5 @@
1
+ import { type TunnelStatus } from '@ezychat/shared';
2
+ /** Guided account authorization and explicit publication. Credentials remain on the server. */
3
+ export declare function CloudflareSetup({ tunnel }: {
4
+ tunnel: TunnelStatus;
5
+ }): import("react").JSX.Element;
@@ -0,0 +1,13 @@
1
+ import type React from 'react';
2
+ /**
3
+ * Create a token, then show its secret and the connect steps exactly once. The secret lives only
4
+ * in this component's state and is cleared whenever the dialog closes (Done, Escape or outside).
5
+ */
6
+ export declare function CreateTokenDialog({ open, onOpenChange, endpoint, localOnly, }: {
7
+ open: boolean;
8
+ onOpenChange: (open: boolean) => void;
9
+ /** Full MCP URL an assistant connects to. */
10
+ endpoint: string;
11
+ /** True when no tunnel runs, so the URL only works on this computer. */
12
+ localOnly: boolean;
13
+ }): React.JSX.Element;
@@ -0,0 +1 @@
1
+ export declare function CustomerEnrichmentSection(): import("react").JSX.Element;
@@ -0,0 +1,4 @@
1
+ import { type AuditEntry } from '@ezychat/shared';
2
+ export declare function EnrichmentAuditScore({ entry }: Readonly<{
3
+ entry: AuditEntry;
4
+ }>): import("react").JSX.Element | null;
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Base URL an assistant uses: the tunnel when one runs, else the server's loopback address on the
3
+ * port it actually listens on (reported by the server, not the saved port setting).
4
+ */
5
+ export declare function assistantBaseUrl(publicUrl: string | null, localUrl: string): string;
6
+ /** Settings → Integrations: read-only AI assistant (MCP) access and its access tokens. */
7
+ export declare function IntegrationsSection(): import("react").JSX.Element;
@@ -0,0 +1,2 @@
1
+ import type React from 'react';
2
+ export declare function MembersPage(): React.JSX.Element;
@@ -0,0 +1,2 @@
1
+ import type React from 'react';
2
+ export declare function QuickRepliesPage(): React.JSX.Element;
@@ -0,0 +1 @@
1
+ export declare function ResolveAllChatsCard(): import("react").JSX.Element;
@@ -0,0 +1,2 @@
1
+ import type React from 'react';
2
+ export declare function SettingsPage(): React.JSX.Element;
@@ -0,0 +1,12 @@
1
+ /** Command snippets are never translated: they are pasted into a terminal or a JSON file. */
2
+ export declare function claudeCodeCommand(endpoint: string, secret: string): string;
3
+ export declare function geminiSettings(endpoint: string, secret: string): string;
4
+ /**
5
+ * "Connect your assistant": ready-to-paste setup per client. `endpoint` is the full MCP URL; the
6
+ * secret is only ever passed in as a prop from the dialog that created it.
7
+ */
8
+ export declare function TokenConnectSteps({ endpoint, secret, localOnly, }: {
9
+ endpoint: string;
10
+ secret: string;
11
+ localOnly: boolean;
12
+ }): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ export declare function TunnelPage(): import("react").JSX.Element;
@@ -0,0 +1,11 @@
1
+ /** WhatsApp connection state → translation key in the `admin` namespace. */
2
+ export declare const WA_STATE_LABEL_KEY: {
3
+ readonly open: "whatsapp.state.open";
4
+ readonly connecting: "whatsapp.state.connecting";
5
+ readonly qr: "whatsapp.state.qr";
6
+ readonly disconnected: "whatsapp.state.disconnected";
7
+ readonly logged_out: "whatsapp.state.loggedOut";
8
+ readonly replaced: "whatsapp.state.replaced";
9
+ readonly blocked: "whatsapp.state.blocked";
10
+ };
11
+ export declare function WhatsAppPage(): import("react").JSX.Element;
@@ -0,0 +1,62 @@
1
+ import * as React from 'react';
2
+ /** Props a Field hands to its control so label, hint and error are wired up for a11y. */
3
+ export interface FieldControlProps {
4
+ id: string;
5
+ 'aria-describedby'?: string;
6
+ 'aria-invalid'?: true;
7
+ }
8
+ /** Label + control + hint/error text. The control is rendered by `children(props)`. */
9
+ export declare function Field({ label, hint, error, className, labelClassName, children, }: {
10
+ label: React.ReactNode;
11
+ hint?: React.ReactNode;
12
+ error?: React.ReactNode;
13
+ className?: string;
14
+ /** For example `sr-only` when a card title already shows the same words. */
15
+ labelClassName?: string;
16
+ children: (props: FieldControlProps) => React.ReactNode;
17
+ }): React.JSX.Element;
18
+ /**
19
+ * The one place Save lives on admin forms: right-aligned at the end of the form, full width on
20
+ * phones, and pinned to the bottom of the screen with an "Unsaved" marker while there are edits.
21
+ * `inset` matches the horizontal padding of the surface it sits in (page or card).
22
+ */
23
+ export declare function SaveBar({ dirty, inset, children, }: {
24
+ dirty: boolean;
25
+ inset?: 'page' | 'card';
26
+ children: React.ReactNode;
27
+ }): React.JSX.Element;
28
+ /** Spinner shown inside a pending button. */
29
+ export declare function Pending({ show }: {
30
+ show: boolean;
31
+ }): React.JSX.Element | null;
32
+ export declare function copyText(text: string): Promise<boolean>;
33
+ /** Copies `text` and confirms with a toast. */
34
+ export declare function CopyButton({ text, label, variant, className, }: {
35
+ text: string;
36
+ label?: string;
37
+ variant?: 'outline' | 'secondary' | 'default' | 'ghost';
38
+ className?: string;
39
+ }): React.JSX.Element;
40
+ /** AlertDialog confirmation for destructive / disruptive actions. Stays open while pending. */
41
+ export declare function ConfirmDialog({ open, title, children, confirmLabel, danger, loading, error, onConfirm, onClose, }: {
42
+ open: boolean;
43
+ title: React.ReactNode;
44
+ children?: React.ReactNode;
45
+ confirmLabel?: string;
46
+ danger?: boolean;
47
+ loading?: boolean;
48
+ error?: unknown;
49
+ onConfirm: () => void;
50
+ onClose: () => void;
51
+ }): React.JSX.Element;
52
+ /** Generates a readable random password (no ambiguous characters). */
53
+ export declare function canGeneratePassword(): boolean;
54
+ export declare function generatePassword(length?: number): string;
55
+ export declare function ErrorState({ error, onRetry }: {
56
+ error: unknown;
57
+ onRetry?: () => void;
58
+ }): React.JSX.Element;
59
+ /** Skeleton placeholder rows for lists/tables while loading. */
60
+ export declare function ListSkeleton({ rows }: {
61
+ rows?: number;
62
+ }): React.JSX.Element;
@@ -0,0 +1,12 @@
1
+ import type { AiDocument, AiMemberStatus, AiSettings } from '@ezychat/shared';
2
+ /** Only the official ChatGPT sign-in hosts may be opened from the app. */
3
+ export declare function officialLoginUrl(raw: string | null): string | null;
4
+ /** The saved connection can answer customers right now. */
5
+ export declare function connectionReady(status: AiMemberStatus): boolean;
6
+ export type AiKnowledgeDraft = Pick<AiSettings, 'displayName' | 'instructions'> & {
7
+ handoffRules: string;
8
+ };
9
+ /** Business facts to answer from: a context item with text. Instructions alone are not enough. */
10
+ export declare function hasKnowledge(documents: readonly AiDocument[]): boolean;
11
+ export type AiPill = 'off' | 'on' | 'needsConnection' | 'needsKnowledge';
12
+ export declare function memberPill(status: AiMemberStatus): AiPill;
@@ -0,0 +1,10 @@
1
+ import type { TFunction } from 'i18next';
2
+ /** Human label for an audit action; an action the catalog does not know yet is spelled out in words. */
3
+ export declare function auditActionLabel(action: string, t: TFunction<'admin'>): string;
4
+ /** Routine sign-ins and sign-outs, which the audit page can hide. Failed sign-ins stay visible. */
5
+ export declare function isSignInAction(action: string): boolean;
6
+ /**
7
+ * One readable line for an audit entry's details: names instead of ids, phone numbers instead of
8
+ * JIDs, "Changed a, b" instead of arrays and flags. Empty values are left out.
9
+ */
10
+ export declare function auditDetails(meta: Record<string, unknown>, t: TFunction<'admin'>, userName: (id: number) => string | undefined): string;