@soulcraft/sdk 2.0.1 → 2.0.2

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 (88) hide show
  1. package/dist/client/index.d.ts +5 -38
  2. package/dist/client/index.d.ts.map +1 -1
  3. package/dist/client/index.js +5 -47
  4. package/dist/client/index.js.map +1 -1
  5. package/dist/client/namespace-proxy.d.ts +3 -4
  6. package/dist/client/namespace-proxy.d.ts.map +1 -1
  7. package/dist/client/namespace-proxy.js +3 -4
  8. package/dist/client/namespace-proxy.js.map +1 -1
  9. package/dist/index.d.ts +6 -6
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +4 -4
  12. package/dist/index.js.map +1 -1
  13. package/dist/modules/hall/browser.d.ts +83 -27
  14. package/dist/modules/hall/browser.d.ts.map +1 -1
  15. package/dist/modules/hall/browser.js +238 -49
  16. package/dist/modules/hall/browser.js.map +1 -1
  17. package/dist/modules/hall/media.d.ts +164 -0
  18. package/dist/modules/hall/media.d.ts.map +1 -0
  19. package/dist/modules/hall/media.js +182 -0
  20. package/dist/modules/hall/media.js.map +1 -0
  21. package/dist/modules/hall/server.d.ts +83 -6
  22. package/dist/modules/hall/server.d.ts.map +1 -1
  23. package/dist/modules/hall/server.js +206 -9
  24. package/dist/modules/hall/server.js.map +1 -1
  25. package/dist/modules/hall/types.d.ts +548 -25
  26. package/dist/modules/hall/types.d.ts.map +1 -1
  27. package/dist/modules/hall/types.js +12 -7
  28. package/dist/modules/hall/types.js.map +1 -1
  29. package/dist/server/hall-handlers.d.ts +40 -12
  30. package/dist/server/hall-handlers.d.ts.map +1 -1
  31. package/dist/server/hall-handlers.js +40 -12
  32. package/dist/server/hall-handlers.js.map +1 -1
  33. package/dist/server/hono-router.d.ts +2 -9
  34. package/dist/server/hono-router.d.ts.map +1 -1
  35. package/dist/server/hono-router.js +2 -46
  36. package/dist/server/hono-router.js.map +1 -1
  37. package/dist/server/index.d.ts +4 -19
  38. package/dist/server/index.d.ts.map +1 -1
  39. package/dist/server/index.js +10 -29
  40. package/dist/server/index.js.map +1 -1
  41. package/dist/types.d.ts +2 -41
  42. package/dist/types.d.ts.map +1 -1
  43. package/docs/ADR-005-hall-integration.md +449 -0
  44. package/package.json +1 -1
  45. package/dist/client/create-client-sdk.d.ts +0 -113
  46. package/dist/client/create-client-sdk.d.ts.map +0 -1
  47. package/dist/client/create-client-sdk.js +0 -169
  48. package/dist/client/create-client-sdk.js.map +0 -1
  49. package/dist/modules/app-context/index.d.ts +0 -214
  50. package/dist/modules/app-context/index.d.ts.map +0 -1
  51. package/dist/modules/app-context/index.js +0 -569
  52. package/dist/modules/app-context/index.js.map +0 -1
  53. package/dist/modules/billing/firestore-provider.d.ts +0 -60
  54. package/dist/modules/billing/firestore-provider.d.ts.map +0 -1
  55. package/dist/modules/billing/firestore-provider.js +0 -315
  56. package/dist/modules/billing/firestore-provider.js.map +0 -1
  57. package/dist/modules/brainy/proxy.d.ts +0 -48
  58. package/dist/modules/brainy/proxy.d.ts.map +0 -1
  59. package/dist/modules/brainy/proxy.js +0 -95
  60. package/dist/modules/brainy/proxy.js.map +0 -1
  61. package/dist/server/create-sdk.d.ts +0 -74
  62. package/dist/server/create-sdk.d.ts.map +0 -1
  63. package/dist/server/create-sdk.js +0 -104
  64. package/dist/server/create-sdk.js.map +0 -1
  65. package/dist/server/from-license.d.ts +0 -252
  66. package/dist/server/from-license.d.ts.map +0 -1
  67. package/dist/server/from-license.js +0 -349
  68. package/dist/server/from-license.js.map +0 -1
  69. package/dist/server/handlers.d.ts +0 -312
  70. package/dist/server/handlers.d.ts.map +0 -1
  71. package/dist/server/handlers.js +0 -376
  72. package/dist/server/handlers.js.map +0 -1
  73. package/dist/server/postmessage-handler.d.ts +0 -152
  74. package/dist/server/postmessage-handler.d.ts.map +0 -1
  75. package/dist/server/postmessage-handler.js +0 -138
  76. package/dist/server/postmessage-handler.js.map +0 -1
  77. package/dist/transports/http.d.ts +0 -86
  78. package/dist/transports/http.d.ts.map +0 -1
  79. package/dist/transports/http.js +0 -137
  80. package/dist/transports/http.js.map +0 -1
  81. package/dist/transports/postmessage.d.ts +0 -159
  82. package/dist/transports/postmessage.d.ts.map +0 -1
  83. package/dist/transports/postmessage.js +0 -207
  84. package/dist/transports/postmessage.js.map +0 -1
  85. package/dist/transports/workshop.d.ts +0 -173
  86. package/dist/transports/workshop.d.ts.map +0 -1
  87. package/dist/transports/workshop.js +0 -307
  88. package/dist/transports/workshop.js.map +0 -1
@@ -1,569 +0,0 @@
1
- /**
2
- * @module modules/app-context
3
- * @description Factory for building a full {@link AppRuntimeContext} from minimal options.
4
- *
5
- * `createAppContext()` is the single entry point kit apps use to get a fully-wired
6
- * runtime context. Both Workshop (dev, WebContainer iframe) and Venue (production,
7
- * same-origin HTTP) call the same factory — the only difference is which transport
8
- * the host provides.
9
- *
10
- * **Workshop** passes a {@link WorkshopTransport} → all non-brainy API calls go
11
- * through PostMessage to the parent frame's relay in PreviewFrame.svelte.
12
- *
13
- * **Venue** omits `workshopTransport` → all API calls use HTTP fetch to `baseUrl`.
14
- *
15
- * Each property (brainy, ai, hall, pulse, files, notify, services, auth) is built
16
- * by a dedicated proxy builder that accepts either transport mode. The brainy property
17
- * is built from the provided Brainy transport (PostMessage or HTTP) via the existing
18
- * `createBrainyProxy()`.
19
- *
20
- * @example Workshop kit app (WebContainer iframe)
21
- * ```typescript
22
- * import { createAppContext, PostMessageTransport, WorkshopTransport } from '@soulcraft/sdk/client'
23
- *
24
- * const origin = document.referrer ? new URL(document.referrer).origin : '*'
25
- * const soulcraft = createAppContext({
26
- * transport: new PostMessageTransport(origin),
27
- * workshopTransport: new WorkshopTransport(origin),
28
- * })
29
- *
30
- * // Full API surface:
31
- * const items = await soulcraft.brainy.find({ query: 'test' })
32
- * for await (const token of soulcraft.ai.chat([{ role: 'user', content: 'hello' }])) { ... }
33
- * soulcraft.pulse.track('page_view', { page: '/home' })
34
- * ```
35
- *
36
- * @example Venue production app (same-origin HTTP)
37
- * ```typescript
38
- * import { createAppContext } from '@soulcraft/sdk/client'
39
- *
40
- * const soulcraft = createAppContext({
41
- * brainy: existingBrainyProxy,
42
- * auth: { user, role, can, signOut, getToken },
43
- * kit: kitManifest,
44
- * slot: '/app',
45
- * credentials: true,
46
- * })
47
- * ```
48
- */
49
- import { WorkshopTransport } from '../../transports/workshop.js';
50
- import { createBrainyProxy } from '../brainy/proxy.js';
51
- /**
52
- * Helper: perform an HTTP fetch with standard JSON conventions.
53
- *
54
- * @param config - HTTP proxy config with baseUrl and credentials flag.
55
- * @param path - API endpoint path.
56
- * @param method - HTTP method.
57
- * @param body - Request body (string or FormData).
58
- * @param extraHeaders - Additional headers.
59
- * @returns Parsed JSON response.
60
- */
61
- async function httpCall(config, path, method, body, extraHeaders) {
62
- const headers = { ...extraHeaders };
63
- if (typeof body === 'string' && !headers['Content-Type']) {
64
- headers['Content-Type'] = 'application/json';
65
- }
66
- const res = await fetch(`${config.baseUrl}${path}`, {
67
- method,
68
- headers,
69
- credentials: config.credentials ? 'include' : 'same-origin',
70
- ...(body != null ? { body } : {}),
71
- });
72
- if (!res.ok) {
73
- const text = await res.text();
74
- throw new Error(`${path} failed (${res.status}): ${text}`);
75
- }
76
- const contentType = res.headers.get('content-type') ?? '';
77
- if (contentType.includes('application/json')) {
78
- return res.json();
79
- }
80
- return undefined;
81
- }
82
- /**
83
- * Helper: perform an HTTP SSE streaming fetch.
84
- *
85
- * @param config - HTTP proxy config.
86
- * @param path - API endpoint path.
87
- * @param method - HTTP method.
88
- * @param body - JSON request body.
89
- * @returns Async iterable of parsed SSE data payloads.
90
- */
91
- async function* httpStream(config, path, method, body) {
92
- const res = await fetch(`${config.baseUrl}${path}`, {
93
- method,
94
- headers: { 'Content-Type': 'application/json' },
95
- credentials: config.credentials ? 'include' : 'same-origin',
96
- ...(body != null ? { body } : {}),
97
- });
98
- if (!res.ok) {
99
- const text = await res.text();
100
- throw new Error(`${path} failed (${res.status}): ${text}`);
101
- }
102
- const reader = res.body?.getReader();
103
- if (!reader)
104
- throw new Error(`No response body from ${path}`);
105
- const decoder = new TextDecoder();
106
- let buffer = '';
107
- while (true) {
108
- const { done, value } = await reader.read();
109
- if (done)
110
- break;
111
- buffer += decoder.decode(value, { stream: true });
112
- const lines = buffer.split('\n');
113
- buffer = lines.pop() ?? '';
114
- for (const line of lines) {
115
- if (!line.startsWith('data: '))
116
- continue;
117
- const payload = line.slice(6).trim();
118
- if (payload === '[DONE]')
119
- return;
120
- yield payload;
121
- }
122
- }
123
- }
124
- // ── AI proxy ────────────────────────────────────────────────────────────────
125
- /**
126
- * Build the AI context proxy.
127
- *
128
- * - Workshop (PostMessage): streams via `workshop:stream` chunks
129
- * - Venue (HTTP): streams via SSE fetch to `/api/ai/chat`
130
- *
131
- * @param t - Transport (WorkshopTransport or HTTP config).
132
- * @returns AI context with `chat()` (async iterable) and `embed()`.
133
- */
134
- function createAIProxy(t) {
135
- if (t instanceof WorkshopTransport) {
136
- return {
137
- async *chat(messages, opts) {
138
- const body = JSON.stringify({ messages, ...opts });
139
- for await (const chunk of t.stream('/api/ai/chat', 'POST', body)) {
140
- // Each chunk is the raw SSE data payload (JSON string).
141
- // Parse to extract the token, matching Venue's wire format.
142
- try {
143
- const parsed = JSON.parse(chunk);
144
- if (parsed.error)
145
- throw new Error(parsed.error);
146
- if (parsed.token)
147
- yield parsed.token;
148
- }
149
- catch (e) {
150
- if (e instanceof SyntaxError)
151
- continue;
152
- throw e;
153
- }
154
- }
155
- },
156
- async embed(text) {
157
- return t.call('/api/ai/embed', 'POST', JSON.stringify({ text }));
158
- },
159
- };
160
- }
161
- // HTTP mode (Venue)
162
- return {
163
- async *chat(messages, opts) {
164
- const body = JSON.stringify({ messages, ...opts });
165
- for await (const payload of httpStream(t, '/api/ai/chat', 'POST', body)) {
166
- try {
167
- const parsed = JSON.parse(payload);
168
- if (parsed.error)
169
- throw new Error(parsed.error);
170
- if (parsed.token)
171
- yield parsed.token;
172
- }
173
- catch (e) {
174
- if (e instanceof SyntaxError)
175
- continue;
176
- throw e;
177
- }
178
- }
179
- },
180
- async embed(text) {
181
- return httpCall(t, '/api/ai/embed', 'POST', JSON.stringify({ text }));
182
- },
183
- };
184
- }
185
- // ── Hall proxy ──────────────────────────────────────────────────────────────
186
- /**
187
- * Build the Hall context proxy.
188
- *
189
- * Manages single-room-at-a-time state. `joinRoom()` calls the backend to get a
190
- * session token; the actual WebRTC connection is left to the kit app (it can use
191
- * `joinHallRoom()` from `@soulcraft/sdk/client` with the returned token).
192
- *
193
- * @param t - Transport (WorkshopTransport or HTTP config).
194
- * @returns Hall context with join/leave/on methods.
195
- */
196
- function createHallProxy(t) {
197
- let hallConnected = false;
198
- let hallRoomId = null;
199
- const listeners = new Map();
200
- async function callJoin(roomId, options) {
201
- const body = JSON.stringify({ roomId, ...options });
202
- if (t instanceof WorkshopTransport) {
203
- return t.call(`/api/hall/rooms/${encodeURIComponent(roomId)}/join`, 'POST', body);
204
- }
205
- return httpCall(t, `/api/hall/rooms/${encodeURIComponent(roomId)}/join`, 'POST', body);
206
- }
207
- const proxy = {
208
- async joinRoom(roomId, options) {
209
- if (hallConnected)
210
- proxy.leaveRoom();
211
- await callJoin(roomId, options);
212
- hallConnected = true;
213
- hallRoomId = roomId;
214
- },
215
- leaveRoom() {
216
- hallConnected = false;
217
- hallRoomId = null;
218
- },
219
- get connected() {
220
- return hallConnected;
221
- },
222
- get roomId() {
223
- return hallRoomId;
224
- },
225
- on(event, handler) {
226
- if (!listeners.has(event))
227
- listeners.set(event, new Set());
228
- listeners.get(event).add(handler);
229
- return () => {
230
- listeners.get(event)?.delete(handler);
231
- };
232
- },
233
- };
234
- return proxy;
235
- }
236
- // ── Pulse proxy ─────────────────────────────────────────────────────────────
237
- /**
238
- * Build the Pulse analytics context proxy.
239
- *
240
- * All methods are fire-and-forget — they never throw.
241
- * In HTTP mode, uses `navigator.sendBeacon` when available for page-unload safety.
242
- *
243
- * @param t - Transport (WorkshopTransport or HTTP config).
244
- * @returns Pulse context with `track()` and `identify()`.
245
- */
246
- function createPulseProxy(t) {
247
- function send(payload) {
248
- const body = JSON.stringify(payload);
249
- if (t instanceof WorkshopTransport) {
250
- t.call('/api/pulse/track', 'POST', body).catch(() => {
251
- /* fire-and-forget */
252
- });
253
- return;
254
- }
255
- // HTTP mode — prefer sendBeacon for page-unload resilience.
256
- if (typeof navigator !== 'undefined' && navigator.sendBeacon) {
257
- navigator.sendBeacon(`${t.baseUrl}/api/pulse/track`, new Blob([body], { type: 'application/json' }));
258
- }
259
- else {
260
- fetch(`${t.baseUrl}/api/pulse/track`, {
261
- method: 'POST',
262
- headers: { 'Content-Type': 'application/json' },
263
- credentials: t.credentials ? 'include' : 'same-origin',
264
- body,
265
- keepalive: true,
266
- }).catch(() => {
267
- /* fire-and-forget */
268
- });
269
- }
270
- }
271
- return {
272
- track(event, properties) {
273
- send({ type: 'track', event, properties });
274
- },
275
- identify(userId, traits) {
276
- send({ type: 'identify', userId, traits });
277
- },
278
- };
279
- }
280
- // ── Files proxy ─────────────────────────────────────────────────────────────
281
- /**
282
- * Build the Files context proxy.
283
- *
284
- * In Workshop: routes through PostMessage relay to `/api/files/*` which adapts
285
- * to Brainy VFS under the hood.
286
- * In Venue: routes to `/api/files/{slot}` which serves from Venue's CDN VFS.
287
- *
288
- * @param t - Transport (WorkshopTransport or HTTP config).
289
- * @param slot - App slot path for Venue file namespacing.
290
- * @returns Files context with upload/read/delete/list.
291
- */
292
- function createFilesProxy(t, slot) {
293
- const filePath = slot ? `/api/files/${slot}` : '/api/files';
294
- if (t instanceof WorkshopTransport) {
295
- return {
296
- async upload(file, path) {
297
- // Convert File/Blob to base64 for PostMessage serialization.
298
- const buffer = await file.arrayBuffer();
299
- const bytes = new Uint8Array(buffer);
300
- let binary = '';
301
- for (let i = 0; i < bytes.length; i++) {
302
- binary += String.fromCharCode(bytes[i]);
303
- }
304
- const base64 = btoa(binary);
305
- const result = (await t.call(`${filePath}`, 'POST', JSON.stringify({
306
- op: 'upload',
307
- path,
308
- data: base64,
309
- mimeType: file instanceof File ? file.type : 'application/octet-stream',
310
- })));
311
- return result.url ?? path;
312
- },
313
- async read(path) {
314
- const result = (await t.call(`${filePath}?op=read&path=${encodeURIComponent(path)}`, 'GET'));
315
- return new Blob([result.content], { type: 'application/octet-stream' });
316
- },
317
- async delete(path) {
318
- await t.call(`${filePath}?path=${encodeURIComponent(path)}`, 'DELETE');
319
- },
320
- async list(prefix) {
321
- return (await t.call(`${filePath}?op=list&prefix=${encodeURIComponent(prefix)}`, 'GET'));
322
- },
323
- };
324
- }
325
- // HTTP mode (Venue)
326
- return {
327
- async upload(file, path) {
328
- const fd = new FormData();
329
- fd.append('file', file);
330
- fd.append('path', path);
331
- const result = (await httpCall(t, filePath, 'POST', fd));
332
- return result.url;
333
- },
334
- async read(path) {
335
- const res = await fetch(`${t.baseUrl}${filePath}?op=read&path=${encodeURIComponent(path)}`, { credentials: t.credentials ? 'include' : 'same-origin' });
336
- if (!res.ok)
337
- throw new Error(`Read failed (${res.status}): ${path}`);
338
- return res.blob();
339
- },
340
- async delete(path) {
341
- await httpCall(t, `${filePath}?path=${encodeURIComponent(path)}`, 'DELETE');
342
- },
343
- async list(prefix) {
344
- return httpCall(t, `${filePath}?op=list&prefix=${encodeURIComponent(prefix)}`, 'GET');
345
- },
346
- };
347
- }
348
- // ── Notify proxy ────────────────────────────────────────────────────────────
349
- /**
350
- * Build the Notify context proxy.
351
- *
352
- * @param t - Transport (WorkshopTransport or HTTP config).
353
- * @returns Notify context with email/sms/push.
354
- */
355
- function createNotifyProxy(t) {
356
- async function post(path, body) {
357
- const json = JSON.stringify(body);
358
- if (t instanceof WorkshopTransport) {
359
- await t.call(path, 'POST', json);
360
- }
361
- else {
362
- await httpCall(t, path, 'POST', json);
363
- }
364
- }
365
- return {
366
- async email(to, subject, body, opts) {
367
- await post('/api/notify/email', { to, subject, body, ...opts });
368
- },
369
- async sms(to, message) {
370
- await post('/api/notify/sms', { to, message });
371
- },
372
- async push(userId, payload) {
373
- await post('/api/notify/push', { userId, payload });
374
- },
375
- };
376
- }
377
- // ── Services proxy ──────────────────────────────────────────────────────────
378
- /**
379
- * Build the Services context proxy.
380
- *
381
- * Services are Venue-only. In Workshop, every method throws a descriptive error
382
- * directing the kit author to publish to Venue. In Venue, methods delegate to
383
- * `/api/manage/*` endpoints.
384
- *
385
- * @param t - Transport (WorkshopTransport or HTTP config).
386
- * @returns Services context with all Venue service namespaces.
387
- */
388
- function createServicesProxy(t) {
389
- // In PostMessage mode (Workshop), services are not available — the backend
390
- // has no /api/manage/* routes. Return descriptive error throwers.
391
- if (t instanceof WorkshopTransport) {
392
- const unavailable = (service) => new Proxy({}, {
393
- get: (_target, method) => {
394
- if (typeof method !== 'string')
395
- return undefined;
396
- return () => {
397
- throw new Error(`services.${service}.${method}() is only available when published to Venue`);
398
- };
399
- },
400
- });
401
- return {
402
- bookings: unavailable('bookings'),
403
- transactions: unavailable('transactions'),
404
- inventory: unavailable('inventory'),
405
- customers: unavailable('customers'),
406
- subscriptions: unavailable('subscriptions'),
407
- support: unavailable('support'),
408
- loyalty: unavailable('loyalty'),
409
- analytics: unavailable('analytics'),
410
- };
411
- }
412
- // HTTP mode (Venue) — delegate to /api/manage/* endpoints.
413
- async function managePost(path, body) {
414
- return httpCall(t, path, 'POST', JSON.stringify(body));
415
- }
416
- async function manageGet(path, params) {
417
- const url = new URL(path, t.baseUrl || window.location.origin);
418
- if (params) {
419
- for (const [k, v] of Object.entries(params))
420
- url.searchParams.set(k, v);
421
- }
422
- return httpCall(t, `${url.pathname}${url.search}`, 'GET');
423
- }
424
- return {
425
- bookings: {
426
- list: (filters) => manageGet('/api/manage/bookings', filters),
427
- cancel: (bookingId) => managePost('/api/manage/bookings', { _action: 'cancel', bookingId }),
428
- addNotes: (bookingId, notes) => managePost('/api/manage/bookings', { _action: 'addNotes', bookingId, notes }),
429
- markNoShow: (bookingId) => managePost('/api/manage/bookings', { _action: 'markNoShow', bookingId }),
430
- markCompleted: (bookingId) => managePost('/api/manage/bookings', { _action: 'markCompleted', bookingId }),
431
- },
432
- transactions: {
433
- list: (params) => manageGet('/api/manage/financials', params),
434
- reconcile: (transactionId) => managePost('/api/manage/financials', { _action: 'reconcile', transactionId }),
435
- },
436
- inventory: {
437
- list: () => manageGet('/api/manage/inventory'),
438
- adjust: (itemId, adjustment, reason) => managePost('/api/manage/inventory', { _action: 'adjust', itemId, adjustment, reason }),
439
- create: (fields) => managePost('/api/manage/inventory', { _action: 'create', ...fields }),
440
- update: (itemId, fields) => managePost('/api/manage/inventory', { _action: 'update', itemId, ...fields }),
441
- deactivate: (itemId) => managePost('/api/manage/inventory', { _action: 'deactivate', itemId }),
442
- },
443
- customers: {
444
- search: (q) => manageGet('/api/manage/customers', { q }),
445
- getById: (id) => manageGet('/api/manage/customers', { id }),
446
- merge: (sourceId, targetId) => managePost('/api/manage/customers', { _action: 'merge', sourceId, targetId }),
447
- },
448
- subscriptions: {
449
- list: (params) => manageGet('/api/manage/subscriptions', params),
450
- cancel: (subscriptionId) => managePost('/api/manage/subscriptions', { _action: 'cancel', subscriptionId }),
451
- pause: (subscriptionId) => managePost('/api/manage/subscriptions', { _action: 'pause', subscriptionId }),
452
- resume: (subscriptionId) => managePost('/api/manage/subscriptions', { _action: 'resume', subscriptionId }),
453
- },
454
- loyalty: {
455
- getAccount: (customerId) => manageGet('/api/manage/loyalty', { customerId }),
456
- adjust: (customerId, points, reason) => managePost('/api/manage/loyalty', { _action: 'adjust', customerId, points, reason }),
457
- },
458
- analytics: {
459
- dashboard: () => manageGet('/api/manage/dashboard'),
460
- financials: (month) => manageGet('/api/manage/financials', month ? { month } : undefined),
461
- },
462
- support: {
463
- list: () => Promise.reject(new Error('support.list() requires the support feature to be enabled')),
464
- },
465
- };
466
- }
467
- // ── Auth proxy ──────────────────────────────────────────────────────────────
468
- /**
469
- * Build the Auth context, merging caller-provided auth data with default stubs.
470
- *
471
- * In Workshop, auth is minimal (dev user from Workshop's session).
472
- * In Venue, the caller provides the full auth context from page data.
473
- *
474
- * @param t - Transport (WorkshopTransport or HTTP config).
475
- * @param initial - Partial auth context provided by the host.
476
- * @returns Full auth context with all required methods.
477
- */
478
- function createAuthProxy(t, initial) {
479
- return {
480
- user: initial?.user ?? null,
481
- role: initial?.role ?? null,
482
- can: initial?.can ?? (() => false),
483
- signOut: initial?.signOut ?? (async () => {
484
- if (t instanceof WorkshopTransport) {
485
- throw new Error('signOut() is not available in Workshop dev mode');
486
- }
487
- await fetch(`${t.baseUrl}/api/auth/sign-out`, {
488
- method: 'POST',
489
- credentials: 'include',
490
- });
491
- window.location.href = '/';
492
- }),
493
- getToken: initial?.getToken ?? (async () => {
494
- if (t instanceof WorkshopTransport) {
495
- const result = await t.call('/api/auth/app-token', 'POST');
496
- return result.token;
497
- }
498
- const result = await httpCall(t, '/api/auth/app-token', 'POST');
499
- return result.token;
500
- }),
501
- };
502
- }
503
- // ── WebSocket noop ──────────────────────────────────────────────────────────
504
- /**
505
- * No-op WebSocket context.
506
- *
507
- * Real-time events in Workshop go through the SSE bridge and Brainy's
508
- * `onDataChange()` — there's no app-level WebSocket in either Workshop or
509
- * this initial SDK version. Venue can override this with its WS bridge later.
510
- */
511
- const noopWs = {
512
- on: (_event, _handler) => () => { },
513
- emit: (_event, _data) => { },
514
- connected: false,
515
- };
516
- // ─────────────────────────────────────────────────────────────────────────────
517
- // Factory
518
- // ─────────────────────────────────────────────────────────────────────────────
519
- /**
520
- * Build a full {@link AppContext} (structurally matches `AppRuntimeContext`)
521
- * from minimal options.
522
- *
523
- * @param options - Configuration for the app context.
524
- * @returns A fully-wired app runtime context.
525
- *
526
- * @example Workshop kit app
527
- * ```typescript
528
- * export const soulcraft = createAppContext({
529
- * transport: new PostMessageTransport(origin),
530
- * workshopTransport: new WorkshopTransport(origin),
531
- * })
532
- * // soulcraft.brainy, soulcraft.ai, soulcraft.pulse, etc.
533
- * ```
534
- *
535
- * @example Venue production app
536
- * ```typescript
537
- * const soulcraft = createAppContext({
538
- * brainy: existingProxy,
539
- * auth: appAuth,
540
- * kit: kitManifest,
541
- * credentials: true,
542
- * })
543
- * ```
544
- */
545
- export function createAppContext(options) {
546
- const { baseUrl = '', brainy: providedBrainy, transport, workshopTransport, auth: initialAuth, kit, slot, config, credentials = false, } = options;
547
- // Build the Brainy proxy from transport, or use the provided one.
548
- const brainy = providedBrainy ?? (transport ? createBrainyProxy(transport) : null);
549
- if (!brainy) {
550
- throw new Error('createAppContext: either `brainy` or `transport` must be provided');
551
- }
552
- // Determine the proxy transport for non-brainy calls.
553
- const proxyTransport = workshopTransport ?? { baseUrl, credentials };
554
- return {
555
- brainy,
556
- auth: createAuthProxy(proxyTransport, initialAuth),
557
- kit: kit ?? {},
558
- ws: noopWs,
559
- services: createServicesProxy(proxyTransport),
560
- ai: createAIProxy(proxyTransport),
561
- files: createFilesProxy(proxyTransport, slot),
562
- notify: createNotifyProxy(proxyTransport),
563
- hall: createHallProxy(proxyTransport),
564
- pulse: createPulseProxy(proxyTransport),
565
- config,
566
- slot,
567
- };
568
- }
569
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/modules/app-context/index.ts"],"names":[],"mappings":"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"}
@@ -1,60 +0,0 @@
1
- /**
2
- * @module billing/firestore-provider
3
- * @description Firestore-backed billing provider for production deployments.
4
- *
5
- * Reads subscription and license data from the `licenses` Firestore collection
6
- * managed by Portal (`soulcraft.com`). Workshop, Venue, and Academy all write
7
- * usage counters to the same document so Portal's Admin can see cross-product usage.
8
- *
9
- * This provider is activated when `FIREBASE_SERVICE_ACCOUNT_KEY` is set in the
10
- * environment. `firebase-admin` is loaded lazily via dynamic import so that the
11
- * SDK does not require the package when using the local provider.
12
- *
13
- * **Firestore document structure:**
14
- * ```
15
- * licenses/{docId}
16
- * email: string (user email — used to look up the doc)
17
- * product: 'workshop' | 'venue' | 'academy'
18
- * status: 'active' | 'past_due' | 'canceled' | 'trialing'
19
- * plan: 'standard' | 'byok'
20
- * credits: {
21
- * monthlyIncluded: number
22
- * monthlyUsed: number (SDK increments this)
23
- * topUpBalance: number (SDK decrements this)
24
- * inputTokens: number
25
- * outputTokens: number
26
- * byModel: Record<model, { input, output }>
27
- * periodStart: Timestamp
28
- * periodEnd: Timestamp
29
- * lastUpdated: Timestamp
30
- * }
31
- * stripeCustomerId: string
32
- * stripeSubscriptionId: string
33
- * cancelAtPeriodEnd: boolean
34
- * ```
35
- *
36
- * Note: The `userId` passed to provider methods is the user's email address when
37
- * using Firestore, since the `licenses` collection is keyed by email. Products
38
- * must pass `user.email` (not `user.id`) when constructing the SDK in Firestore mode.
39
- */
40
- import type { BillingProvider, UsageData, SubscriptionData, LimitCheckResult, UsageStatus, BatchIncrementData } from './types.js';
41
- /**
42
- * Firestore-backed billing provider for production deployments.
43
- *
44
- * The `userId` parameter on all methods must be the user's **email address**,
45
- * since the Firestore `licenses` collection is indexed by email.
46
- */
47
- export declare class FirestoreBillingProvider implements BillingProvider {
48
- checkLimit(userId: string, hasPersonalKey: boolean): Promise<LimitCheckResult>;
49
- getUsage(userId: string): Promise<UsageData>;
50
- getUsageStatus(userId: string, hasPersonalKey: boolean): Promise<UsageStatus>;
51
- incrementUsage(userId: string, inputTokens: number, outputTokens: number, model: string, useTopUp: boolean): Promise<void>;
52
- batchIncrementUsage(userId: string, batch: BatchIncrementData): Promise<void>;
53
- getSubscription(userId: string): Promise<SubscriptionData | undefined>;
54
- hasActiveSubscription(userId: string): Promise<boolean>;
55
- getTopUpBalance(userId: string): Promise<number>;
56
- canAccessPaidFeature(userId: string): Promise<boolean>;
57
- private _toSubscription;
58
- private _resetPeriod;
59
- }
60
- //# sourceMappingURL=firestore-provider.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"firestore-provider.d.ts","sourceRoot":"","sources":["../../../src/modules/billing/firestore-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,SAAS,EACT,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACX,kBAAkB,EACnB,MAAM,YAAY,CAAA;AAmJnB;;;;;GAKG;AACH,qBAAa,wBAAyB,YAAW,eAAe;IACxD,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA8B9E,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAiB5C,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC;IAgC7E,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB1H,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB7E,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAMtE,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAOvD,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAOhD,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAM5D,OAAO,CAAC,eAAe;YA2BT,YAAY;CAe3B"}