@soulcraft/sdk 1.0.0 → 1.2.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 (112) hide show
  1. package/dist/client/index.d.ts +3 -0
  2. package/dist/client/index.d.ts.map +1 -1
  3. package/dist/client/index.js +2 -0
  4. package/dist/client/index.js.map +1 -1
  5. package/dist/index.d.ts +7 -6
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +1 -0
  8. package/dist/index.js.map +1 -1
  9. package/dist/modules/auth/service-token.d.ts +62 -0
  10. package/dist/modules/auth/service-token.d.ts.map +1 -0
  11. package/dist/modules/auth/service-token.js +99 -0
  12. package/dist/modules/auth/service-token.js.map +1 -0
  13. package/dist/modules/billing/firestore-provider.d.ts +60 -0
  14. package/dist/modules/billing/firestore-provider.d.ts.map +1 -0
  15. package/dist/modules/billing/firestore-provider.js +314 -0
  16. package/dist/modules/billing/firestore-provider.js.map +1 -0
  17. package/dist/modules/billing/index.d.ts +58 -0
  18. package/dist/modules/billing/index.d.ts.map +1 -0
  19. package/dist/modules/billing/index.js +164 -0
  20. package/dist/modules/billing/index.js.map +1 -0
  21. package/dist/modules/billing/local-provider.d.ts +38 -0
  22. package/dist/modules/billing/local-provider.d.ts.map +1 -0
  23. package/dist/modules/billing/local-provider.js +242 -0
  24. package/dist/modules/billing/local-provider.js.map +1 -0
  25. package/dist/modules/billing/portal-provider.d.ts +70 -0
  26. package/dist/modules/billing/portal-provider.d.ts.map +1 -0
  27. package/dist/modules/billing/portal-provider.js +204 -0
  28. package/dist/modules/billing/portal-provider.js.map +1 -0
  29. package/dist/modules/billing/types.d.ts +323 -3
  30. package/dist/modules/billing/types.d.ts.map +1 -1
  31. package/dist/modules/billing/types.js +22 -2
  32. package/dist/modules/billing/types.js.map +1 -1
  33. package/dist/modules/billing/usage-buffer.d.ts +72 -0
  34. package/dist/modules/billing/usage-buffer.d.ts.map +1 -0
  35. package/dist/modules/billing/usage-buffer.js +141 -0
  36. package/dist/modules/billing/usage-buffer.js.map +1 -0
  37. package/dist/modules/formats/types.d.ts +65 -3
  38. package/dist/modules/formats/types.d.ts.map +1 -1
  39. package/dist/modules/formats/types.js +40 -3
  40. package/dist/modules/formats/types.js.map +1 -1
  41. package/dist/modules/formats/wdoc.d.ts +263 -0
  42. package/dist/modules/formats/wdoc.d.ts.map +1 -0
  43. package/dist/modules/formats/wdoc.js +21 -0
  44. package/dist/modules/formats/wdoc.js.map +1 -0
  45. package/dist/modules/formats/wquiz.d.ts +122 -0
  46. package/dist/modules/formats/wquiz.d.ts.map +1 -0
  47. package/dist/modules/formats/wquiz.js +23 -0
  48. package/dist/modules/formats/wquiz.js.map +1 -0
  49. package/dist/modules/formats/wslide.d.ts +130 -0
  50. package/dist/modules/formats/wslide.d.ts.map +1 -0
  51. package/dist/modules/formats/wslide.js +23 -0
  52. package/dist/modules/formats/wslide.js.map +1 -0
  53. package/dist/modules/formats/wviz.d.ts +114 -0
  54. package/dist/modules/formats/wviz.d.ts.map +1 -0
  55. package/dist/modules/formats/wviz.js +21 -0
  56. package/dist/modules/formats/wviz.js.map +1 -0
  57. package/dist/modules/hall/browser.d.ts +88 -0
  58. package/dist/modules/hall/browser.d.ts.map +1 -0
  59. package/dist/modules/hall/browser.js +265 -0
  60. package/dist/modules/hall/browser.js.map +1 -0
  61. package/dist/modules/hall/protocol.d.ts +39 -0
  62. package/dist/modules/hall/protocol.d.ts.map +1 -0
  63. package/dist/modules/hall/protocol.js +52 -0
  64. package/dist/modules/hall/protocol.js.map +1 -0
  65. package/dist/modules/hall/server.d.ts +172 -0
  66. package/dist/modules/hall/server.d.ts.map +1 -0
  67. package/dist/modules/hall/server.js +457 -0
  68. package/dist/modules/hall/server.js.map +1 -0
  69. package/dist/modules/hall/types.d.ts +502 -31
  70. package/dist/modules/hall/types.d.ts.map +1 -1
  71. package/dist/modules/hall/types.js +13 -8
  72. package/dist/modules/hall/types.js.map +1 -1
  73. package/dist/modules/kits/index.d.ts +41 -0
  74. package/dist/modules/kits/index.d.ts.map +1 -0
  75. package/dist/modules/kits/index.js +85 -0
  76. package/dist/modules/kits/index.js.map +1 -0
  77. package/dist/modules/kits/types.d.ts +107 -3
  78. package/dist/modules/kits/types.d.ts.map +1 -1
  79. package/dist/modules/kits/types.js +15 -2
  80. package/dist/modules/kits/types.js.map +1 -1
  81. package/dist/modules/license/index.d.ts +53 -0
  82. package/dist/modules/license/index.d.ts.map +1 -0
  83. package/dist/modules/license/index.js +233 -0
  84. package/dist/modules/license/index.js.map +1 -0
  85. package/dist/modules/license/types.d.ts +222 -3
  86. package/dist/modules/license/types.d.ts.map +1 -1
  87. package/dist/modules/license/types.js +21 -2
  88. package/dist/modules/license/types.js.map +1 -1
  89. package/dist/modules/notifications/index.d.ts +40 -0
  90. package/dist/modules/notifications/index.d.ts.map +1 -0
  91. package/dist/modules/notifications/index.js +280 -0
  92. package/dist/modules/notifications/index.js.map +1 -0
  93. package/dist/modules/notifications/types.d.ts +152 -3
  94. package/dist/modules/notifications/types.d.ts.map +1 -1
  95. package/dist/modules/notifications/types.js +21 -2
  96. package/dist/modules/notifications/types.js.map +1 -1
  97. package/dist/server/create-sdk.d.ts +4 -0
  98. package/dist/server/create-sdk.d.ts.map +1 -1
  99. package/dist/server/create-sdk.js +19 -26
  100. package/dist/server/create-sdk.js.map +1 -1
  101. package/dist/server/hall-handlers.d.ts +90 -151
  102. package/dist/server/hall-handlers.d.ts.map +1 -1
  103. package/dist/server/hall-handlers.js +84 -204
  104. package/dist/server/hall-handlers.js.map +1 -1
  105. package/dist/server/index.d.ts +10 -2
  106. package/dist/server/index.d.ts.map +1 -1
  107. package/dist/server/index.js +9 -2
  108. package/dist/server/index.js.map +1 -1
  109. package/dist/types.d.ts +35 -25
  110. package/dist/types.d.ts.map +1 -1
  111. package/docs/USAGE.md +224 -1
  112. package/package.json +13 -5
@@ -1,7 +1,156 @@
1
1
  /**
2
2
  * @module notifications/types
3
- * @description Type definitions for sdk.notifications.*
4
- * Implementation: Phase 5 per ADR-001.
3
+ * @description Type definitions for sdk.notifications.* — the platform notification system.
4
+ *
5
+ * The notifications module provides a provider-agnostic interface for sending
6
+ * transactional email (via Postmark) and SMS (via Twilio). In development
7
+ * environments where neither API key is configured, a console-logging dev sender
8
+ * is used automatically.
9
+ *
10
+ * The `NotificationSender` interface is the central abstraction: every sender
11
+ * implementation (Postmark, Twilio, dev console, composite) implements it.
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * const sender = sdk.notifications.getSender()
16
+ * await sender.send({
17
+ * type: 'email',
18
+ * to: 'customer@example.com',
19
+ * subject: 'Booking Confirmed',
20
+ * htmlBody: '<h1>Your booking is confirmed!</h1>',
21
+ * textBody: 'Your booking is confirmed.',
22
+ * })
23
+ * ```
5
24
  */
6
- export type {};
25
+ /**
26
+ * An email notification to be sent via the configured email provider (Postmark).
27
+ */
28
+ export interface EmailNotification {
29
+ /** Channel discriminant. Always `'email'`. */
30
+ type: 'email';
31
+ /** Recipient email address. */
32
+ to: string;
33
+ /**
34
+ * Sender email address.
35
+ * Defaults to `POSTMARK_FROM_EMAIL` when omitted.
36
+ */
37
+ from?: string;
38
+ /** Email subject line. */
39
+ subject: string;
40
+ /** HTML email body. */
41
+ htmlBody: string;
42
+ /** Plain-text fallback body (required for deliverability). */
43
+ textBody: string;
44
+ /** Optional reply-to email address. */
45
+ replyTo?: string;
46
+ }
47
+ /**
48
+ * An SMS notification to be sent via the configured SMS provider (Twilio).
49
+ */
50
+ export interface SmsNotification {
51
+ /** Channel discriminant. Always `'sms'`. */
52
+ type: 'sms';
53
+ /**
54
+ * Recipient phone number in E.164 format, e.g. `'+17045551234'`.
55
+ * Must include country code.
56
+ */
57
+ to: string;
58
+ /**
59
+ * Sender phone number or Twilio messaging service SID.
60
+ * Defaults to `TWILIO_FROM_NUMBER` when omitted.
61
+ */
62
+ from?: string;
63
+ /** SMS message body. Maximum 1,600 characters for long SMS. */
64
+ body: string;
65
+ }
66
+ /**
67
+ * Union of all notification payload types.
68
+ * Discriminate on the `type` field.
69
+ */
70
+ export type Notification = EmailNotification | SmsNotification;
71
+ /**
72
+ * The result of a notification send attempt.
73
+ */
74
+ export interface NotificationResult {
75
+ /** Whether the notification was accepted by the provider. */
76
+ success: boolean;
77
+ /**
78
+ * Provider-specific message identifier.
79
+ * - Postmark: `MessageID` (UUID)
80
+ * - Twilio: `sid` (e.g. `'SM...'`)
81
+ * - Dev sender: synthetic `'dev-{timestamp}-{random}'`
82
+ */
83
+ messageId?: string;
84
+ /** Human-readable error message if `success` is `false`. */
85
+ error?: string;
86
+ }
87
+ /**
88
+ * Interface implemented by all notification provider classes.
89
+ *
90
+ * Consumers of the SDK receive a `NotificationSender` from
91
+ * `sdk.notifications.getSender()` and call `send()` without needing to
92
+ * know which provider is configured underneath.
93
+ */
94
+ export interface NotificationSender {
95
+ /**
96
+ * Send a notification via this provider.
97
+ *
98
+ * @param notification - The email or SMS notification payload.
99
+ * @returns A result indicating success/failure and the provider message ID.
100
+ */
101
+ send(notification: Notification): Promise<NotificationResult>;
102
+ }
103
+ /**
104
+ * The `sdk.notifications.*` namespace.
105
+ */
106
+ export interface NotificationsModule {
107
+ /**
108
+ * Returns the configured notification sender for the current environment.
109
+ *
110
+ * - When `POSTMARK_SERVER_TOKEN` and/or `TWILIO_ACCOUNT_SID` + `TWILIO_AUTH_TOKEN`
111
+ * are set, returns a `CompositeNotificationSender` wiring Postmark (email) and
112
+ * Twilio (SMS) to the correct channel.
113
+ * - When neither is configured, returns a `DevSender` that logs notifications to
114
+ * the console — ideal for local development without real API credentials.
115
+ *
116
+ * @returns A `NotificationSender` ready to use.
117
+ *
118
+ * @example
119
+ * ```typescript
120
+ * const sender = sdk.notifications.getSender()
121
+ * const result = await sender.send({ type: 'sms', to: '+17045551234', body: 'Your code is 123456' })
122
+ * if (!result.success) console.error(result.error)
123
+ * ```
124
+ */
125
+ getSender(): NotificationSender;
126
+ /**
127
+ * Create a Postmark email sender explicitly.
128
+ *
129
+ * Use when you need to send from a specific server token rather than the
130
+ * environment-configured default.
131
+ *
132
+ * @param serverToken - Postmark server API token.
133
+ * @param defaultFrom - Default sender email address.
134
+ * @returns A `NotificationSender` that only handles email.
135
+ */
136
+ createPostmarkSender(serverToken: string, defaultFrom: string): NotificationSender;
137
+ /**
138
+ * Create a Twilio SMS sender explicitly.
139
+ *
140
+ * @param accountSid - Twilio account SID.
141
+ * @param authToken - Twilio auth token.
142
+ * @param defaultFrom - Default sender phone number in E.164 format.
143
+ * @returns A `NotificationSender` that only handles SMS.
144
+ */
145
+ createTwilioSender(accountSid: string, authToken: string, defaultFrom: string): NotificationSender;
146
+ /**
147
+ * Create a development console sender.
148
+ *
149
+ * Logs all notifications to stdout with ANSI formatting. Returns a synthetic
150
+ * message ID. Never makes network calls.
151
+ *
152
+ * @returns A `NotificationSender` that logs to the console.
153
+ */
154
+ createDevSender(): NotificationSender;
155
+ }
7
156
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/modules/notifications/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,YAAY,EAAE,CAAA"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/modules/notifications/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAMH;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,8CAA8C;IAC9C,IAAI,EAAE,OAAO,CAAA;IACb,+BAA+B;IAC/B,EAAE,EAAE,MAAM,CAAA;IACV;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,0BAA0B;IAC1B,OAAO,EAAE,MAAM,CAAA;IACf,uBAAuB;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,8DAA8D;IAC9D,QAAQ,EAAE,MAAM,CAAA;IAChB,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,4CAA4C;IAC5C,IAAI,EAAE,KAAK,CAAA;IACX;;;OAGG;IACH,EAAE,EAAE,MAAM,CAAA;IACV;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAA;CACb;AAED;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,iBAAiB,GAAG,eAAe,CAAA;AAM9D;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,6DAA6D;IAC7D,OAAO,EAAE,OAAO,CAAA;IAChB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAMD;;;;;;GAMG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;;;OAKG;IACH,IAAI,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAA;CAC9D;AAMD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;;;;;;;;;;;;;;OAiBG;IACH,SAAS,IAAI,kBAAkB,CAAA;IAE/B;;;;;;;;;OASG;IACH,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,kBAAkB,CAAA;IAElF;;;;;;;OAOG;IACH,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,kBAAkB,CAAA;IAElG;;;;;;;OAOG;IACH,eAAe,IAAI,kBAAkB,CAAA;CACtC"}
@@ -1,7 +1,26 @@
1
1
  /**
2
2
  * @module notifications/types
3
- * @description Type definitions for sdk.notifications.*
4
- * Implementation: Phase 5 per ADR-001.
3
+ * @description Type definitions for sdk.notifications.* — the platform notification system.
4
+ *
5
+ * The notifications module provides a provider-agnostic interface for sending
6
+ * transactional email (via Postmark) and SMS (via Twilio). In development
7
+ * environments where neither API key is configured, a console-logging dev sender
8
+ * is used automatically.
9
+ *
10
+ * The `NotificationSender` interface is the central abstraction: every sender
11
+ * implementation (Postmark, Twilio, dev console, composite) implements it.
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * const sender = sdk.notifications.getSender()
16
+ * await sender.send({
17
+ * type: 'email',
18
+ * to: 'customer@example.com',
19
+ * subject: 'Booking Confirmed',
20
+ * htmlBody: '<h1>Your booking is confirmed!</h1>',
21
+ * textBody: 'Your booking is confirmed.',
22
+ * })
23
+ * ```
5
24
  */
6
25
  export {};
7
26
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/modules/notifications/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/modules/notifications/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG"}
@@ -52,6 +52,10 @@ export interface CreateSDKOptions {
52
52
  * `sdk.ai.*` calls go directly to the Anthropic API (requires `ANTHROPIC_API_KEY`).
53
53
  * `sdk.skills.*` reads from the Brainy VFS and falls back to `@soulcraft/kits`.
54
54
  * `sdk.events` is a local EventEmitter — events do not cross process boundaries.
55
+ * `sdk.billing.*` stores usage locally (dev) or in Firestore (prod via `FIREBASE_SERVICE_ACCOUNT_KEY`).
56
+ * `sdk.license.*` activates via `@soulcraft/cortex` and delegates credit metering to `sdk.billing`.
57
+ * `sdk.kits.*` reads from the `@soulcraft/kits` registry (optional peer dependency).
58
+ * `sdk.notifications.*` sends via Postmark/Twilio or logs to the console in dev mode.
55
59
  *
56
60
  * @param options - SDK creation options.
57
61
  * @returns A fully assembled `SoulcraftSDK` instance.
@@ -1 +1 @@
1
- {"version":3,"file":"create-sdk.d.ts","sourceRoot":"","sources":["../../src/server/create-sdk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAO/C,OAAO,KAAK,EAAE,YAAY,EAAyC,MAAM,aAAa,CAAA;AAOtF;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;;;OAMG;IACH,KAAK,EAAE,MAAM,CAAA;CACd;AAMD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,YAAY,CAiDjE"}
1
+ {"version":3,"file":"create-sdk.d.ts","sourceRoot":"","sources":["../../src/server/create-sdk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAW/C,OAAO,KAAK,EAAE,YAAY,EAAyC,MAAM,aAAa,CAAA;AAOtF;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;;;OAMG;IACH,KAAK,EAAE,MAAM,CAAA;CACd;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,YAAY,CAqDjE"}
@@ -33,6 +33,10 @@ import { createBrainyProxy } from '../modules/brainy/proxy.js';
33
33
  import { createEventsModule } from '../modules/events/index.js';
34
34
  import { createAiModule } from '../modules/ai/index.js';
35
35
  import { createSkillsModule } from '../modules/skills/index.js';
36
+ import { createLicenseModule } from '../modules/license/index.js';
37
+ import { createKitsModule } from '../modules/kits/index.js';
38
+ import { createBillingModule } from '../modules/billing/index.js';
39
+ import { createNotificationsModule } from '../modules/notifications/index.js';
36
40
  import { createCapabilityToken, verifyCapabilityToken } from '../modules/brainy/auth.js';
37
41
  // ─────────────────────────────────────────────────────────────────────────────
38
42
  // Factory
@@ -46,6 +50,10 @@ import { createCapabilityToken, verifyCapabilityToken } from '../modules/brainy/
46
50
  * `sdk.ai.*` calls go directly to the Anthropic API (requires `ANTHROPIC_API_KEY`).
47
51
  * `sdk.skills.*` reads from the Brainy VFS and falls back to `@soulcraft/kits`.
48
52
  * `sdk.events` is a local EventEmitter — events do not cross process boundaries.
53
+ * `sdk.billing.*` stores usage locally (dev) or in Firestore (prod via `FIREBASE_SERVICE_ACCOUNT_KEY`).
54
+ * `sdk.license.*` activates via `@soulcraft/cortex` and delegates credit metering to `sdk.billing`.
55
+ * `sdk.kits.*` reads from the `@soulcraft/kits` registry (optional peer dependency).
56
+ * `sdk.notifications.*` sends via Postmark/Twilio or logs to the console in dev mode.
49
57
  *
50
58
  * @param options - SDK creation options.
51
59
  * @returns A fully assembled `SoulcraftSDK` instance.
@@ -73,6 +81,10 @@ export function createSDK(options) {
73
81
  const events = createEventsModule();
74
82
  const ai = createAiModule();
75
83
  const skills = createSkillsModule(brain);
84
+ const billing = createBillingModule();
85
+ const license = createLicenseModule({ billing });
86
+ const kits = createKitsModule();
87
+ const notifications = createNotificationsModule();
76
88
  const auth = {
77
89
  verifyToken: (token, secret) => verifyCapabilityToken(token, secret),
78
90
  createToken: (opts) => createCapabilityToken(opts),
@@ -85,13 +97,14 @@ export function createSDK(options) {
85
97
  events,
86
98
  ai,
87
99
  skills,
88
- // Stubs for unimplemented modules — will throw if called
89
- license: _unimplementedModule('license'),
90
- kits: _unimplementedModule('kits'),
91
- formats: _unimplementedModule('formats'),
92
- billing: _unimplementedModule('billing'),
93
- notifications: _unimplementedModule('notifications'),
100
+ license,
101
+ kits,
102
+ billing,
103
+ notifications,
94
104
  async shutdown() {
105
+ billing.stopFlush();
106
+ await billing.flush();
107
+ license.stopHeartbeat();
95
108
  await brain.flush();
96
109
  },
97
110
  async flush(scopeKey) {
@@ -102,24 +115,4 @@ export function createSDK(options) {
102
115
  },
103
116
  };
104
117
  }
105
- // ─────────────────────────────────────────────────────────────────────────────
106
- // Internal helpers
107
- // ─────────────────────────────────────────────────────────────────────────────
108
- /**
109
- * Creates a Proxy that throws a descriptive error for any property access
110
- * on an unimplemented SDK module. This makes missing modules fail fast and
111
- * informatively rather than silently returning undefined.
112
- *
113
- * @param moduleName - The module name shown in the error message.
114
- * @returns A Proxy that throws on any property access.
115
- */
116
- function _unimplementedModule(moduleName) {
117
- return new Proxy({}, {
118
- get(_target, prop) {
119
- throw new Error(`sdk.${moduleName}.${String(prop)} is not yet implemented. ` +
120
- `The '${moduleName}' module is planned for a future SDK release. ` +
121
- `See docs/ADR-001-sdk-design.md for the implementation roadmap.`);
122
- },
123
- });
124
- }
125
118
  //# sourceMappingURL=create-sdk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-sdk.js","sourceRoot":"","sources":["../../src/server/create-sdk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AAsBxF,gFAAgF;AAChF,UAAU;AACV,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,SAAS,CAAC,OAAyB;IACjD,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAA;IAEzB,MAAM,SAAS,GAAG,IAAI,cAAc,CAAC,KAAK,CAAC,CAAA;IAC3C,MAAM,WAAW,GAAG,iBAAiB,CAAC,SAAS,CAAoB,CAAA;IAEnE,wEAAwE;IACxE,2EAA2E;IAC3E,8DAA8D;IAC9D,MAAM,GAAG,GAAI,WAAmB,CAAC,GAAgB,CAAA;IACjD,8DAA8D;IAC9D,MAAM,QAAQ,GAAI,WAAmB,CAAC,QAA0B,CAAA;IAEhE,MAAM,MAAM,GAAG,kBAAkB,EAAE,CAAA;IACnC,MAAM,EAAE,GAAG,cAAc,EAAE,CAAA;IAC3B,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAA;IAExC,MAAM,IAAI,GAAe;QACvB,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,qBAAqB,CAAC,KAAK,EAAE,MAAM,CAAC;QACpE,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC;KACnD,CAAA;IAED,OAAO;QACL,MAAM,EAAE,WAAW;QACnB,GAAG;QACH,QAAQ;QACR,IAAI;QACJ,MAAM;QACN,EAAE;QACF,MAAM;QAEN,yDAAyD;QACzD,OAAO,EAAE,oBAAoB,CAAC,SAAS,CAAC;QACxC,IAAI,EAAE,oBAAoB,CAAC,MAAM,CAAC;QAClC,OAAO,EAAE,oBAAoB,CAAC,SAAS,CAAC;QACxC,OAAO,EAAE,oBAAoB,CAAC,SAAS,CAAC;QACxC,aAAa,EAAE,oBAAoB,CAAC,eAAe,CAAC;QAEpD,KAAK,CAAC,QAAQ;YACZ,MAAM,KAAK,CAAC,KAAK,EAAE,CAAA;QACrB,CAAC;QAED,KAAK,CAAC,KAAK,CAAC,QAAgB;YAC1B,qEAAqE;YACrE,qEAAqE;YACrE,KAAK,QAAQ,CAAA;YACb,MAAM,KAAK,CAAC,KAAK,EAAE,CAAA;QACrB,CAAC;KACF,CAAA;AACH,CAAC;AAED,gFAAgF;AAChF,mBAAmB;AACnB,gFAAgF;AAEhF;;;;;;;GAOG;AACH,SAAS,oBAAoB,CAAC,UAAkB;IAC9C,OAAO,IAAI,KAAK,CAAC,EAA6B,EAAE;QAC9C,GAAG,CAAC,OAAO,EAAE,IAAqB;YAChC,MAAM,IAAI,KAAK,CACb,OAAO,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,2BAA2B;gBAC5D,QAAQ,UAAU,gDAAgD;gBAClE,gEAAgE,CACjE,CAAA;QACH,CAAC;KACF,CAAC,CAAA;AACJ,CAAC"}
1
+ {"version":3,"file":"create-sdk.js","sourceRoot":"","sources":["../../src/server/create-sdk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AACjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAA;AAC7E,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AAsBxF,gFAAgF;AAChF,UAAU;AACV,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,UAAU,SAAS,CAAC,OAAyB;IACjD,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAA;IAEzB,MAAM,SAAS,GAAG,IAAI,cAAc,CAAC,KAAK,CAAC,CAAA;IAC3C,MAAM,WAAW,GAAG,iBAAiB,CAAC,SAAS,CAAoB,CAAA;IAEnE,wEAAwE;IACxE,2EAA2E;IAC3E,8DAA8D;IAC9D,MAAM,GAAG,GAAI,WAAmB,CAAC,GAAgB,CAAA;IACjD,8DAA8D;IAC9D,MAAM,QAAQ,GAAI,WAAmB,CAAC,QAA0B,CAAA;IAEhE,MAAM,MAAM,GAAG,kBAAkB,EAAE,CAAA;IACnC,MAAM,EAAE,GAAG,cAAc,EAAE,CAAA;IAC3B,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAA;IACxC,MAAM,OAAO,GAAG,mBAAmB,EAAE,CAAA;IACrC,MAAM,OAAO,GAAG,mBAAmB,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;IAChD,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAA;IAC/B,MAAM,aAAa,GAAG,yBAAyB,EAAE,CAAA;IAEjD,MAAM,IAAI,GAAe;QACvB,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,qBAAqB,CAAC,KAAK,EAAE,MAAM,CAAC;QACpE,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC;KACnD,CAAA;IAED,OAAO;QACL,MAAM,EAAE,WAAW;QACnB,GAAG;QACH,QAAQ;QACR,IAAI;QACJ,MAAM;QACN,EAAE;QACF,MAAM;QACN,OAAO;QACP,IAAI;QACJ,OAAO;QACP,aAAa;QAEb,KAAK,CAAC,QAAQ;YACZ,OAAO,CAAC,SAAS,EAAE,CAAA;YACnB,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;YACrB,OAAO,CAAC,aAAa,EAAE,CAAA;YACvB,MAAM,KAAK,CAAC,KAAK,EAAE,CAAA;QACrB,CAAC;QAED,KAAK,CAAC,KAAK,CAAC,QAAgB;YAC1B,qEAAqE;YACrE,qEAAqE;YACrE,KAAK,QAAQ,CAAA;YACb,MAAM,KAAK,CAAC,KAAK,EAAE,CAAA;QACrB,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -1,139 +1,97 @@
1
1
  /**
2
2
  * @module server/hall-handlers
3
- * @description Factory functions for mounting Hall WebRTC signaling over WebSocket.
3
+ * @description Hall module factory and TURN credential utilities for product backends.
4
4
  *
5
- * Hall uses a lightweight JSON signaling protocol over WebSocket:
5
+ * Hall is a standalone server products connect to it over WebSocket rather than
6
+ * running signaling in-process. This module exports:
6
7
  *
7
- * Client Server:
8
- * { type: 'offer', sdp: string } SDP offer (first message from peer)
9
- * { type: 'ice', candidate: string } — ICE candidate trickle
10
- * { type: 'data', channel: string, data: number[] } — data channel message
11
- * { type: 'leave' } — graceful peer disconnect
8
+ * - `createHallModule` — creates a server-side Hall control-plane client
9
+ * - `generateTurnCredentials`generates time-limited TURN credentials if a product
10
+ * needs to expose TURN info independently (e.g. for a custom ICE server list)
12
11
  *
13
- * Server Client:
14
- * { type: 'answer', sdp: string } — SDP answer
15
- * { type: 'ice', candidate: string } — ICE candidate from SFU
16
- * { type: 'speaker_changed', speakerId: string }
17
- * { type: 'concept_mention', ...ConceptEvent }
18
- * { type: 'relation_proposed', ...RelationProposedEvent }
19
- * { type: 'transcript', peerId, text, isFinal, sessionMs }
20
- * { type: 'attention', ...AttentionEvent }
21
- * { type: 'track_added', peerId, trackId, kind }
22
- * { type: 'track_removed', peerId, trackId }
23
- * { type: 'error', message: string }
12
+ * The signaling WebSocket (offer/answer/ICE) is handled directly by the Hall server,
13
+ * not by the product backend. Products only manage the control plane:
14
+ * room creation, session token minting, and recording control.
24
15
  *
25
- * Products mount a single WebSocket route (e.g. `GET /api/hall/rooms/:roomId/signal`)
26
- * and delegate to the handler returned by createHallRoomHandler().
27
- *
28
- * @example Hono mounting
16
+ * @example Academy startup
29
17
  * ```typescript
30
- * import { createHallRoomHandler } from '@soulcraft/sdk/server'
18
+ * import { createHallModule } from '@soulcraft/sdk/server'
31
19
  *
32
- * const hallHandler = createHallRoomHandler({
33
- * server: hallServer,
34
- * authenticate: async (req) => getSessionUser(req),
35
- * resolvePeerId: (req, user) => (user as { id: string }).id,
36
- * resolveRoomId: (req) => new URL(req.url).pathname.split('/').at(-2)!,
20
+ * const hall = createHallModule({
21
+ * url: process.env.HALL_URL!, // wss://hall.soulcraft.com
22
+ * productName: 'academy',
23
+ * secret: process.env.HALL_ACADEMY_SECRET!,
37
24
  * })
25
+ * await hall.connect()
38
26
  *
39
- * app.get('/api/hall/rooms/:roomId/signal', upgradeWebSocket((c) => {
40
- * const session = await hallHandler.handleUpgrade(c.req.raw)
41
- * if (!session) return { onClose: () => {} }
42
- * return {
43
- * onMessage: (event, ws) => hallHandler.handleMessage(session, event.data as string, (m) => ws.send(m)),
44
- * onClose: () => hallHandler.handleClose(session),
27
+ * hall.onDisconnect((reason) => {
28
+ * console.error('[Hall] disconnected:', reason)
29
+ * })
30
+ * hall.onReconnect(async () => {
31
+ * // Re-create any active rooms after reconnect
32
+ * for (const session of activeSessions) {
33
+ * await hall.createRoom(session.id, session.roomOptions)
45
34
  * }
46
- * }))
35
+ * })
36
+ * ```
37
+ *
38
+ * @example Lesson join route
39
+ * ```typescript
40
+ * app.post('/api/lessons/:id/join', requireAuth, async (c) => {
41
+ * const { id } = c.req.param()
42
+ * const user = c.get('user')!
43
+ *
44
+ * // Create room if it doesn't already exist
45
+ * if (!hall.getRoom(id)) {
46
+ * await hall.createRoom(id, {
47
+ * enableTranscription: true,
48
+ * concepts: await loadLessonConcepts(id),
49
+ * })
50
+ * }
51
+ *
52
+ * // Mint a short-lived token for this browser peer
53
+ * const { token } = await hall.createSessionToken(id, user.id, 3600)
54
+ * return c.json({ token, hallUrl: process.env.HALL_URL })
55
+ * })
47
56
  * ```
48
57
  */
49
- import type { HallServer, Room } from '@soulcraft/hall';
50
- /**
51
- * @description An active peer connection managed by the Hall signaling handler.
52
- * Returned by handleUpgrade() and passed to every subsequent call.
53
- */
54
- export interface HallSession {
55
- /** The authenticated peer ID (e.g. user ID). */
56
- readonly peerId: string;
57
- /** The room this peer is joining. */
58
- readonly room: Room;
59
- /** Whether the peer has completed the SDP offer/answer handshake. */
60
- joined: boolean;
61
- }
62
- /**
63
- * @description Configuration for createHallRoomHandler().
64
- */
65
- export interface HallRoomHandlerConfig {
66
- /**
67
- * The running HallServer instance to use for room management.
68
- */
69
- server: HallServer;
70
- /**
71
- * Authenticates an incoming WebSocket upgrade request.
72
- * Return the authenticated user object (any shape), or null/undefined to reject.
73
- * @param request - The HTTP upgrade request.
74
- * @returns Authenticated user or null/undefined.
75
- */
76
- authenticate(request: Request): Promise<unknown> | unknown;
77
- /**
78
- * Derives the peer ID from the request and the authenticated user.
79
- * @param request - The HTTP upgrade request.
80
- * @param user - The result of authenticate().
81
- * @returns The peer ID string (e.g. user.id, session.userId).
82
- */
83
- resolvePeerId(request: Request, user: unknown): string;
84
- /**
85
- * Derives the room ID from the request.
86
- * @param request - The HTTP upgrade request.
87
- * @returns The room ID string (e.g. from URL path parameter).
88
- */
89
- resolveRoomId(request: Request): string;
90
- /**
91
- * Optional room options applied when the room does not already exist.
92
- * @param request - The HTTP upgrade request.
93
- * @param user - The authenticated user.
94
- * @returns RoomOptions or undefined to use defaults.
95
- */
96
- roomOptions?(request: Request, user: unknown): import('@soulcraft/hall').RoomOptions | undefined;
97
- }
58
+ import { HallClient } from '../modules/hall/server.js';
59
+ import type { HallConnectionOptions, HallModule } from '../modules/hall/types.js';
60
+ export { HallClient };
61
+ export type { HallConnectionOptions, HallModule };
98
62
  /**
99
- * @description The object returned by createHallRoomHandler(). Products pass incoming
100
- * WebSocket connections through this handler for complete Hall signaling management.
63
+ * Create a server-side Hall module connected to the Hall standalone server.
64
+ *
65
+ * Returns a `HallModule` backed by a persistent WebSocket connection. Call `connect()`
66
+ * once at process startup — the client auto-reconnects on unexpected disconnects.
67
+ *
68
+ * @param options - Hall server URL, product name, and shared secret.
69
+ * @returns A `HallModule` instance (not yet connected — call `module.connect()`).
70
+ *
71
+ * @example
72
+ * ```typescript
73
+ * const hall = createHallModule({
74
+ * url: process.env.HALL_URL!,
75
+ * productName: 'academy',
76
+ * secret: process.env.HALL_ACADEMY_SECRET!,
77
+ * })
78
+ * await hall.connect()
79
+ * ```
101
80
  */
102
- export interface HallRoomHandler {
103
- /**
104
- * Authenticates the upgrade request and resolves the room/peer. Call this when
105
- * the WebSocket connection is established.
106
- * @param request - The HTTP upgrade request.
107
- * @returns A HallSession if authentication succeeded, or null to reject.
108
- */
109
- handleUpgrade(request: Request): Promise<HallSession | null>;
110
- /**
111
- * Processes an incoming signaling message from a peer.
112
- * @param session - The HallSession returned by handleUpgrade().
113
- * @param data - Raw JSON string from the WebSocket message event.
114
- * @param send - Callback to send a JSON string back to this peer's client.
115
- */
116
- handleMessage(session: HallSession, data: string, send: (message: string) => void): Promise<void>;
117
- /**
118
- * Cleans up when a peer disconnects. Always call this on WebSocket close/error.
119
- * @param session - The HallSession to clean up.
120
- */
121
- handleClose(session: HallSession): Promise<void>;
122
- }
81
+ export declare function createHallModule(options: HallConnectionOptions): HallModule;
123
82
  /**
124
- * @description TURN credential options for generateTurnCredentials().
83
+ * Options for {@link generateTurnCredentials}.
125
84
  */
126
85
  export interface TurnCredentialOptions {
127
- /** The HMAC-SHA1 secret shared between this server and the TURN server. */
86
+ /** The HMAC-SHA1 secret shared with the TURN server (i.e. `TURN_SECRET` from `hall.toml`). */
128
87
  secret: string;
129
- /** Peer/user identifier embedded in the credential username. */
88
+ /** Peer or user identifier embedded in the credential username. */
130
89
  peerId: string;
131
90
  /** Credential TTL in seconds (default: 86400 — 24 hours). */
132
91
  ttlSeconds?: number;
133
92
  }
134
93
  /**
135
- * @description Time-limited TURN credentials for a peer, suitable for passing to
136
- * RTCPeerConnection as iceServers configuration.
94
+ * Time-limited TURN credentials, ready for use in `RTCPeerConnection.iceServers`.
137
95
  */
138
96
  export interface TurnCredentials {
139
97
  /** Username in the form `{expiryTimestamp}:{peerId}`. */
@@ -144,52 +102,33 @@ export interface TurnCredentials {
144
102
  expiresAt: number;
145
103
  }
146
104
  /**
147
- * @description Generates time-limited TURN credentials using the TURN REST API
148
- * authentication mechanism (RFC draft-uberti-behave-turn-rest-00).
105
+ * Generate time-limited TURN credentials using the TURN REST API authentication
106
+ * mechanism (RFC draft-uberti-behave-turn-rest-00).
149
107
  *
150
- * The TURN server must be configured with the same shared secret. Credentials
151
- * expire after ttlSeconds and cannot be reused after that time.
108
+ * Hall's in-process TURN server uses the same shared `TURN_SECRET` from `hall.toml`.
109
+ * Call this if you need to expose TURN credentials via a product API endpoint
110
+ * (e.g. for a custom ICE server list in a legacy client). In most cases the browser
111
+ * SDK handles TURN automatically via the Hall signaling connection.
152
112
  *
153
- * @param options - Secret, peer ID, and optional TTL.
154
- * @returns Time-limited TURN credentials ready for RTCPeerConnection.iceServers.
113
+ * @param options - TURN secret, peer ID, and optional TTL.
114
+ * @returns Time-limited TURN credentials.
155
115
  *
156
116
  * @example
157
117
  * ```typescript
158
- * const creds = generateTurnCredentials({
159
- * secret: process.env.TURN_SECRET!,
160
- * peerId: user.id,
161
- * ttlSeconds: 3600,
118
+ * app.get('/api/turn-credentials', requireAuth, (c) => {
119
+ * const user = c.get('user')!
120
+ * const creds = generateTurnCredentials({
121
+ * secret: process.env.TURN_SECRET!,
122
+ * peerId: user.id,
123
+ * ttlSeconds: 3600,
124
+ * })
125
+ * return c.json({
126
+ * urls: 'turn:hall.soulcraft.com:3478',
127
+ * username: creds.username,
128
+ * credential: creds.password,
129
+ * })
162
130
  * })
163
- * // Pass to client:
164
- * return c.json({ turnUsername: creds.username, turnPassword: creds.password })
165
131
  * ```
166
132
  */
167
133
  export declare function generateTurnCredentials(options: TurnCredentialOptions): TurnCredentials;
168
- /**
169
- * @description Factory that creates a framework-agnostic Hall WebRTC signaling
170
- * handler. Products mount the returned handler at a WebSocket route and delegate
171
- * upgrade, message, and close lifecycle events to it.
172
- *
173
- * The handler owns the full signaling lifecycle:
174
- * - Authenticates the upgrade request
175
- * - Resolves or creates the Room via HallServer
176
- * - Forwards SDP offer → gets SDP answer from the NAPI SFU
177
- * - Forwards ICE candidates in both directions
178
- * - Wires Room events (transcript, concept_mention, relation_proposed, etc.) to the peer's send callback
179
- * - Cleans up on disconnect
180
- *
181
- * @param config - Handler configuration.
182
- * @returns A HallRoomHandler with handleUpgrade / handleMessage / handleClose.
183
- *
184
- * @example
185
- * ```typescript
186
- * const hallHandler = createHallRoomHandler({
187
- * server: hallServer,
188
- * authenticate: (req) => verifySession(req.headers.get('cookie') ?? ''),
189
- * resolvePeerId: (_req, user) => (user as { id: string }).id,
190
- * resolveRoomId: (req) => new URL(req.url).pathname.split('/').at(-2)!,
191
- * })
192
- * ```
193
- */
194
- export declare function createHallRoomHandler(config: HallRoomHandlerConfig): HallRoomHandler;
195
134
  //# sourceMappingURL=hall-handlers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"hall-handlers.d.ts","sourceRoot":"","sources":["../../src/server/hall-handlers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AAEH,OAAO,KAAK,EACV,UAAU,EACV,IAAI,EAIL,MAAM,iBAAiB,CAAA;AAOxB;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,gDAAgD;IAChD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,qCAAqC;IACrC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;IACnB,qEAAqE;IACrE,MAAM,EAAE,OAAO,CAAA;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,MAAM,EAAE,UAAU,CAAA;IAElB;;;;;OAKG;IACH,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAA;IAE1D;;;;;OAKG;IACH,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CAAA;IAEtD;;;;OAIG;IACH,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAAA;IAEvC;;;;;OAKG;IACH,WAAW,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,iBAAiB,EAAE,WAAW,GAAG,SAAS,CAAA;CACjG;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;;OAKG;IACH,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAA;IAE5D;;;;;OAKG;IACH,aAAa,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAEjG;;;OAGG;IACH,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACjD;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,2EAA2E;IAC3E,MAAM,EAAE,MAAM,CAAA;IACd,gEAAgE;IAChE,MAAM,EAAE,MAAM,CAAA;IACd,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,yDAAyD;IACzD,QAAQ,EAAE,MAAM,CAAA;IAChB,sEAAsE;IACtE,QAAQ,EAAE,MAAM,CAAA;IAChB,8DAA8D;IAC9D,SAAS,EAAE,MAAM,CAAA;CAClB;AAMD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,qBAAqB,GAAG,eAAe,CAQvF;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,qBAAqB,GAAG,eAAe,CAqJpF"}
1
+ {"version":3,"file":"hall-handlers.d.ts","sourceRoot":"","sources":["../../src/server/hall-handlers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AAGH,OAAO,EAAE,UAAU,EAAyC,MAAM,2BAA2B,CAAA;AAC7F,OAAO,KAAK,EAAE,qBAAqB,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAEjF,OAAO,EAAE,UAAU,EAAE,CAAA;AACrB,YAAY,EAAE,qBAAqB,EAAE,UAAU,EAAE,CAAA;AAEjD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,qBAAqB,GAAG,UAAU,CAE3E;AAID;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,8FAA8F;IAC9F,MAAM,EAAE,MAAM,CAAA;IACd,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAA;IACd,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,yDAAyD;IACzD,QAAQ,EAAE,MAAM,CAAA;IAChB,sEAAsE;IACtE,QAAQ,EAAE,MAAM,CAAA;IAChB,8DAA8D;IAC9D,SAAS,EAAE,MAAM,CAAA;CAClB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,qBAAqB,GAAG,eAAe,CAMvF"}