@happyvertical/smrt-messages 0.55.9 → 0.55.11

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 (41) hide show
  1. package/README.md +37 -0
  2. package/dist/chunks/{AccountCollection-DhANBhva.js → AccountCollection-BI-osnRy.js} +2 -2
  3. package/dist/chunks/{AccountCollection-DhANBhva.js.map → AccountCollection-BI-osnRy.js.map} +1 -1
  4. package/dist/chunks/{Email-C4cUUFNI.js → Email-BWTPou1O.js} +3 -3
  5. package/dist/chunks/{Email-C4cUUFNI.js.map → Email-BWTPou1O.js.map} +1 -1
  6. package/dist/chunks/{EmailFolder-qoUUSqKI.js → EmailFolder-acO0l4c0.js} +2 -2
  7. package/dist/chunks/{EmailFolder-qoUUSqKI.js.map → EmailFolder-acO0l4c0.js.map} +1 -1
  8. package/dist/chunks/{Message-Bd_2XiIC.js → Message-CX5L_ANS.js} +4 -4
  9. package/dist/chunks/{Message-Bd_2XiIC.js.map → Message-CX5L_ANS.js.map} +1 -1
  10. package/dist/chunks/{MessageCollection-B9MqCWdi.js → MessageCollection-CmKXEeiT.js} +2 -2
  11. package/dist/chunks/{MessageCollection-B9MqCWdi.js.map → MessageCollection-CmKXEeiT.js.map} +1 -1
  12. package/dist/chunks/__smrt-register__-BwaxW-WF.js +6 -0
  13. package/dist/chunks/__smrt-register__-BwaxW-WF.js.map +1 -0
  14. package/dist/index.d.ts +1 -0
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +145 -11
  17. package/dist/index.js.map +1 -1
  18. package/dist/manifest.json +199 -1
  19. package/dist/playground.js +9 -0
  20. package/dist/playground.js.map +1 -1
  21. package/dist/recipes.d.ts +135 -0
  22. package/dist/recipes.d.ts.map +1 -0
  23. package/dist/smrt-knowledge.json +201 -3
  24. package/dist/svelte/components/MailboxDemo.svelte +65 -0
  25. package/dist/svelte/components/MailboxDemo.svelte.d.ts +4 -0
  26. package/dist/svelte/components/MailboxDemo.svelte.d.ts.map +1 -0
  27. package/dist/svelte/i18n.messages.d.ts +8 -0
  28. package/dist/svelte/i18n.messages.d.ts.map +1 -1
  29. package/dist/svelte/i18n.messages.js +8 -0
  30. package/dist/svelte/index.d.ts +3 -0
  31. package/dist/svelte/index.d.ts.map +1 -1
  32. package/dist/svelte/index.js +2 -0
  33. package/dist/svelte/notifications.d.ts +35 -0
  34. package/dist/svelte/notifications.d.ts.map +1 -0
  35. package/dist/svelte/notifications.js +62 -0
  36. package/dist/svelte/playground.d.ts +34 -0
  37. package/dist/svelte/playground.d.ts.map +1 -1
  38. package/dist/svelte/playground.js +9 -0
  39. package/package.json +9 -9
  40. package/dist/chunks/__smrt-register__-DUoO196-.js +0 -6
  41. package/dist/chunks/__smrt-register__-DUoO196-.js.map +0 -1
@@ -0,0 +1,65 @@
1
+ <script lang="ts">
2
+ import { useI18n } from '@happyvertical/smrt-ui/i18n';
3
+ import { Button } from '@happyvertical/smrt-ui/ui';
4
+ import { M } from '../i18n.messages.js';
5
+ import type { AccountData, ComposeState, MessageData } from '../types.js';
6
+ import ComposeForm from './ComposeForm.svelte';
7
+ import MessageDetail from './MessageDetail.svelte';
8
+ import MessageList from './MessageList.svelte';
9
+
10
+ const { t } = useI18n();
11
+ const accounts = $state<AccountData[]>([
12
+ {
13
+ id: 'demo-account',
14
+ name: t(M['messages.mailbox_demo.inbox']),
15
+ providerType: 'email',
16
+ email: 'you@example.com',
17
+ isActive: true,
18
+ },
19
+ ]);
20
+ $effect(() => {
21
+ accounts[0].name = t(M['messages.mailbox_demo.inbox']);
22
+ });
23
+ let wasRead = $state(false);
24
+ const messages = $derived<MessageData[]>([
25
+ {
26
+ id: 'demo-welcome',
27
+ type: 'email',
28
+ accountId: 'demo-account',
29
+ subject: t(M['messages.mailbox_demo.subject']),
30
+ body: t(M['messages.mailbox_demo.body']),
31
+ senderName: t(M['messages.mailbox_demo.sender']),
32
+ senderAddress: 'colleague@example.com',
33
+ recipientAddresses: [{ address: 'you@example.com' }],
34
+ date: '2026-01-01T12:00:00Z',
35
+ isRead: wasRead,
36
+ isFlagged: false,
37
+ hasAttachments: false,
38
+ },
39
+ ]);
40
+ let selectedId = $state<string | null>(null);
41
+ const selected = $derived(
42
+ messages.find((message) => message.id === selectedId),
43
+ );
44
+ let composing = $state(false);
45
+ let sentSubject = $state<string | null>(null);
46
+ function send(state: ComposeState) {
47
+ sentSubject = state.subject;
48
+ composing = false;
49
+ }
50
+ function open(message: MessageData) {
51
+ selectedId = message.id;
52
+ wasRead = true;
53
+ }
54
+ </script>
55
+ <p>{t(M['messages.mailbox_demo.disclaimer'])}</p>
56
+ <Button onclick={() => { composing = true; sentSubject = null; }}>{t(M['messages.mailbox_demo.compose'])}</Button>
57
+ {#if sentSubject !== null}<p role="status">{t(M['messages.mailbox_demo.sent'], { subject: sentSubject })}</p>{/if}
58
+ {#if composing}
59
+ <ComposeForm {accounts} onsend={send} ondiscard={() => (composing = false)} />
60
+ {:else if selected}
61
+ <Button onclick={() => (selectedId = null)}>{t(M['messages.mailbox_demo.back'])}</Button>
62
+ <MessageDetail message={selected} account={accounts[0]} onreply={() => (composing = true)} />
63
+ {:else}
64
+ <MessageList {messages} {accounts} onmessageclick={open} />
65
+ {/if}
@@ -0,0 +1,4 @@
1
+ declare const MailboxDemo: import("svelte").Component<Record<string, never>, {}, "">;
2
+ type MailboxDemo = ReturnType<typeof MailboxDemo>;
3
+ export default MailboxDemo;
4
+ //# sourceMappingURL=MailboxDemo.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MailboxDemo.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/components/MailboxDemo.svelte.ts"],"names":[],"mappings":"AA+EA,QAAA,MAAM,WAAW,2DAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
@@ -1,4 +1,12 @@
1
1
  export declare const M: {
2
+ readonly 'messages.mailbox_demo.disclaimer': "messages.mailbox_demo.disclaimer";
3
+ readonly 'messages.mailbox_demo.compose': "messages.mailbox_demo.compose";
4
+ readonly 'messages.mailbox_demo.back': "messages.mailbox_demo.back";
5
+ readonly 'messages.mailbox_demo.sent': "messages.mailbox_demo.sent";
6
+ readonly 'messages.mailbox_demo.inbox': "messages.mailbox_demo.inbox";
7
+ readonly 'messages.mailbox_demo.subject': "messages.mailbox_demo.subject";
8
+ readonly 'messages.mailbox_demo.body': "messages.mailbox_demo.body";
9
+ readonly 'messages.mailbox_demo.sender': "messages.mailbox_demo.sender";
2
10
  readonly 'messages.message_status_indicator.status': "messages.message_status_indicator.status";
3
11
  readonly 'messages.message_status_indicator.unread': "messages.message_status_indicator.unread";
4
12
  readonly 'messages.message_status_indicator.flagged': "messages.message_status_indicator.flagged";
@@ -1 +1 @@
1
- {"version":3,"file":"i18n.messages.d.ts","sourceRoot":"","sources":["../../src/svelte/i18n.messages.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8FZ,CAAC"}
1
+ {"version":3,"file":"i18n.messages.d.ts","sourceRoot":"","sources":["../../src/svelte/i18n.messages.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyGZ,CAAC"}
@@ -7,6 +7,14 @@
7
7
  */
8
8
  import { defineMessages } from '@happyvertical/smrt-ui/i18n';
9
9
  export const M = defineMessages({
10
+ 'messages.mailbox_demo.disclaimer': 'Demo mailbox. Sending is mocked; no mail server is contacted.',
11
+ 'messages.mailbox_demo.compose': 'Compose',
12
+ 'messages.mailbox_demo.back': 'Back to mailbox',
13
+ 'messages.mailbox_demo.sent': 'Mock send complete: {subject}. No email was delivered.',
14
+ 'messages.mailbox_demo.inbox': 'Demo Inbox',
15
+ 'messages.mailbox_demo.subject': 'Welcome to your mailbox',
16
+ 'messages.mailbox_demo.body': 'Open this message, or compose a mock reply. Nothing leaves this browser.',
17
+ 'messages.mailbox_demo.sender': 'Demo colleague',
10
18
  // MessageStatusIndicator
11
19
  'messages.message_status_indicator.status': 'Message status',
12
20
  'messages.message_status_indicator.unread': 'Unread',
@@ -7,6 +7,8 @@
7
7
  * @packageDocumentation
8
8
  */
9
9
  import type { ComponentProps } from 'svelte';
10
+ export type { NotificationBellItem, UserNotificationBellProvider, UserNotificationBellProviderOptions, } from './notifications.js';
11
+ export { createUserNotificationBellProvider } from './notifications.js';
10
12
  import AccountAvatar from './components/AccountAvatar.svelte';
11
13
  import AccountCard from './components/AccountCard.svelte';
12
14
  import AccountList from './components/AccountList.svelte';
@@ -53,4 +55,5 @@ export type ReplyFormProps = ComponentProps<typeof ReplyForm>;
53
55
  export type SendStatusBadgeProps = ComponentProps<typeof SendStatusBadge>;
54
56
  export type ThreadViewProps = ComponentProps<typeof ThreadView>;
55
57
  export type { AccountData, AttachmentData, BlacklistEntry, BulkAction, ComposeState, DraftData, EmailAccountData, FolderData, MessageData, MessageFilterState, MessageSort, MessageType, RecipientEntry, SendStatusDisplay, WhitelistEntry, } from './types.js';
58
+ export { default as MailboxDemo } from './components/MailboxDemo.svelte';
56
59
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/svelte/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/svelte/index.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,7 @@
8
8
  */
9
9
  import { ModuleUIRegistry } from '@happyvertical/smrt-ui/registry';
10
10
  import { MESSAGES_MODULE_META } from '../ui.js';
11
+ export { createUserNotificationBellProvider } from './notifications.js';
11
12
  // Import components
12
13
  import AccountAvatar from './components/AccountAvatar.svelte';
13
14
  import AccountCard from './components/AccountCard.svelte';
@@ -44,3 +45,4 @@ ModuleUIRegistry.register('@happyvertical/smrt-messages', 'thread-view', ThreadV
44
45
  ModuleUIRegistry.register('@happyvertical/smrt-messages', 'compose-form', ComposeForm);
45
46
  ModuleUIRegistry.register('@happyvertical/smrt-messages', 'reply-form', ReplyForm);
46
47
  ModuleUIRegistry.register('@happyvertical/smrt-messages', 'messaging-settings', MessagingSettingsPanel);
48
+ export { default as MailboxDemo } from './components/MailboxDemo.svelte';
@@ -0,0 +1,35 @@
1
+ import type { UserNotificationService } from '../services/UserNotificationService.js';
2
+ export interface NotificationBellItem {
3
+ id: string;
4
+ title: string;
5
+ body?: string;
6
+ href?: string | null;
7
+ severity?: 'info' | 'success' | 'warning' | 'error';
8
+ occurredAt: string;
9
+ readAt?: string | null;
10
+ }
11
+ /** Structural counterpart of smrt-svelte's NotificationProvider; no UI dependency. */
12
+ export interface UserNotificationBellProvider {
13
+ getUnreadCount(): Promise<number>;
14
+ list(options?: {
15
+ limit?: number;
16
+ }): Promise<NotificationBellItem[]>;
17
+ markRead(id: string): Promise<void>;
18
+ markAllRead(): Promise<void>;
19
+ subscribe(listener: () => void): () => void;
20
+ }
21
+ export interface UserNotificationBellProviderOptions {
22
+ service: UserNotificationService;
23
+ /** Signed-in recipient, fixed at provider construction. */
24
+ userId: string;
25
+ /** Authorized tenant set, fixed at provider construction. */
26
+ tenantIds: readonly string[];
27
+ /** Host-owned live transport. It must only signal that the caller should reload. */
28
+ subscribe?: (listener: () => void) => () => void;
29
+ }
30
+ /**
31
+ * Creates a provider for `NotificationBell` from the recipient-scoped service.
32
+ * The user and tenant scope are closed over so browser callers cannot alter them.
33
+ */
34
+ export declare function createUserNotificationBellProvider(options: UserNotificationBellProviderOptions): UserNotificationBellProvider;
35
+ //# sourceMappingURL=notifications.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../src/svelte/notifications.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AAEtF,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;IACpD,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,sFAAsF;AACtF,MAAM,WAAW,4BAA4B;IAC3C,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAClC,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAC;IACpE,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;CAC7C;AAED,MAAM,WAAW,mCAAmC;IAClD,OAAO,EAAE,uBAAuB,CAAC;IACjC,2DAA2D;IAC3D,MAAM,EAAE,MAAM,CAAC;IACf,6DAA6D;IAC7D,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,oFAAoF;IACpF,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;CAClD;AAcD;;;GAGG;AACH,wBAAgB,kCAAkC,CAChD,OAAO,EAAE,mCAAmC,GAC3C,4BAA4B,CA+C9B"}
@@ -0,0 +1,62 @@
1
+ function project(notification) {
2
+ return {
3
+ id: String(notification.id),
4
+ title: notification.title,
5
+ body: notification.body || undefined,
6
+ href: notification.href,
7
+ severity: notification.severity,
8
+ occurredAt: notification.occurredAt.toISOString(),
9
+ readAt: notification.readAt?.toISOString() ?? null,
10
+ };
11
+ }
12
+ /**
13
+ * Creates a provider for `NotificationBell` from the recipient-scoped service.
14
+ * The user and tenant scope are closed over so browser callers cannot alter them.
15
+ */
16
+ export function createUserNotificationBellProvider(options) {
17
+ const userId = options.userId.trim();
18
+ const tenantIds = [...new Set(options.tenantIds.filter(Boolean))];
19
+ if (!userId)
20
+ throw new Error('Notification bell provider requires a user id.');
21
+ if (tenantIds.length === 0)
22
+ throw new Error('Notification bell provider requires tenant ids.');
23
+ const listeners = new Set();
24
+ const emit = () => {
25
+ for (const listener of listeners)
26
+ listener();
27
+ };
28
+ const notificationScopes = new Map();
29
+ return {
30
+ async getUnreadCount() {
31
+ return options.service.countUnread(userId, { tenantIds });
32
+ },
33
+ async list(listOptions) {
34
+ const rows = await options.service.listForUser(userId, {
35
+ tenantIds,
36
+ limit: listOptions?.limit,
37
+ });
38
+ for (const row of rows)
39
+ notificationScopes.set(String(row.id), row.tenantId);
40
+ return rows.map(project);
41
+ },
42
+ async markRead(id) {
43
+ const tenantId = notificationScopes.get(id);
44
+ if (!tenantId)
45
+ throw new Error('Notification must be loaded before it can be marked read.');
46
+ await options.service.markRead(userId, [id], { tenantId });
47
+ emit();
48
+ },
49
+ async markAllRead() {
50
+ await options.service.markAllRead(userId, { tenantIds });
51
+ emit();
52
+ },
53
+ subscribe(listener) {
54
+ listeners.add(listener);
55
+ const stopHost = options.subscribe?.(emit);
56
+ return () => {
57
+ listeners.delete(listener);
58
+ stopHost?.();
59
+ };
60
+ },
61
+ };
62
+ }
@@ -4,6 +4,40 @@ declare const _default: {
4
4
  description: string | undefined;
5
5
  moduleMeta: import("@happyvertical/smrt-types").SmrtModuleMeta;
6
6
  entries: ({
7
+ id: string;
8
+ title: string;
9
+ description: string;
10
+ loadComponent: () => Promise<typeof import("./components/MailboxDemo.svelte")>;
11
+ order: number;
12
+ props: {
13
+ accounts?: undefined;
14
+ onaccountclick?: undefined;
15
+ onsync?: undefined;
16
+ onremove?: undefined;
17
+ messages?: undefined;
18
+ activeMessageId?: undefined;
19
+ showAccount?: undefined;
20
+ onmessageclick?: undefined;
21
+ onselect?: undefined;
22
+ onflag?: undefined;
23
+ message?: undefined;
24
+ attachments?: undefined;
25
+ account?: undefined;
26
+ onreply?: undefined;
27
+ onforward?: undefined;
28
+ ondelete?: undefined;
29
+ type?: undefined;
30
+ initialState?: undefined;
31
+ onsend?: undefined;
32
+ onsavedraft?: undefined;
33
+ ondiscard?: undefined;
34
+ };
35
+ modes: {
36
+ mock: {
37
+ label: string;
38
+ };
39
+ };
40
+ } | {
7
41
  id: string;
8
42
  title: string;
9
43
  description: string;
@@ -1 +1 @@
1
- {"version":3,"file":"playground.d.ts","sourceRoot":"","sources":["../../src/svelte/playground.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmFA,wBAiGE"}
1
+ {"version":3,"file":"playground.d.ts","sourceRoot":"","sources":["../../src/svelte/playground.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmFA,wBA2GE"}
@@ -81,6 +81,15 @@ export default {
81
81
  description: MESSAGES_MODULE_META.description,
82
82
  moduleMeta: MESSAGES_MODULE_META,
83
83
  entries: [
84
+ {
85
+ id: 'mailbox',
86
+ title: 'Mailbox',
87
+ description: 'Interactive fictional inbox. Compose and send are mocked; no mail is delivered.',
88
+ loadComponent: () => import('./components/MailboxDemo.svelte'),
89
+ order: 0,
90
+ props: {},
91
+ modes: { mock: { label: 'Mock sending' } },
92
+ },
84
93
  {
85
94
  id: 'account-list',
86
95
  title: 'Account List',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@happyvertical/smrt-messages",
3
- "version": "0.55.9",
3
+ "version": "0.55.11",
4
4
  "smrtJsdoc": "strict",
5
5
  "description": "Unified multi-channel messaging with STI-based hierarchies",
6
6
  "type": "module",
@@ -62,12 +62,12 @@
62
62
  "@happyvertical/files": "^0.103.1",
63
63
  "@happyvertical/logger": "^0.103.1",
64
64
  "@happyvertical/messages": "^0.103.1",
65
- "@happyvertical/smrt-core": "0.55.9",
66
- "@happyvertical/smrt-types": "0.55.9",
67
- "@happyvertical/smrt-secrets": "0.55.9",
68
- "@happyvertical/smrt-tenancy": "0.55.9",
69
- "@happyvertical/smrt-ui": "0.55.9",
70
- "@happyvertical/smrt-users": "0.55.9",
65
+ "@happyvertical/smrt-core": "0.55.11",
66
+ "@happyvertical/smrt-types": "0.55.11",
67
+ "@happyvertical/smrt-secrets": "0.55.11",
68
+ "@happyvertical/smrt-tenancy": "0.55.11",
69
+ "@happyvertical/smrt-ui": "0.55.11",
70
+ "@happyvertical/smrt-users": "0.55.11",
71
71
  "@happyvertical/sql": "^0.103.1",
72
72
  "@happyvertical/utils": "^0.103.1"
73
73
  },
@@ -84,8 +84,8 @@
84
84
  }
85
85
  },
86
86
  "devDependencies": {
87
- "@happyvertical/smrt-ledgers": "0.55.9",
88
- "@happyvertical/smrt-vitest": "0.55.9",
87
+ "@happyvertical/smrt-ledgers": "0.55.11",
88
+ "@happyvertical/smrt-vitest": "0.55.11",
89
89
  "@sveltejs/package": "^2.5.8",
90
90
  "@sveltejs/vite-plugin-svelte": "^7.3.0",
91
91
  "@types/node": "24.13.6",