@soulcraft/sdk 1.1.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.
- package/dist/client/index.d.ts +3 -0
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +2 -0
- package/dist/client/index.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/modules/auth/service-token.d.ts +62 -0
- package/dist/modules/auth/service-token.d.ts.map +1 -0
- package/dist/modules/auth/service-token.js +99 -0
- package/dist/modules/auth/service-token.js.map +1 -0
- package/dist/modules/billing/index.d.ts +17 -5
- package/dist/modules/billing/index.d.ts.map +1 -1
- package/dist/modules/billing/index.js +24 -9
- package/dist/modules/billing/index.js.map +1 -1
- package/dist/modules/billing/portal-provider.d.ts +70 -0
- package/dist/modules/billing/portal-provider.d.ts.map +1 -0
- package/dist/modules/billing/portal-provider.js +204 -0
- package/dist/modules/billing/portal-provider.js.map +1 -0
- package/dist/modules/billing/types.d.ts +4 -3
- package/dist/modules/billing/types.d.ts.map +1 -1
- package/dist/modules/billing/types.js +4 -3
- package/dist/modules/billing/types.js.map +1 -1
- package/dist/modules/hall/browser.d.ts +88 -0
- package/dist/modules/hall/browser.d.ts.map +1 -0
- package/dist/modules/hall/browser.js +265 -0
- package/dist/modules/hall/browser.js.map +1 -0
- package/dist/modules/hall/protocol.d.ts +39 -0
- package/dist/modules/hall/protocol.d.ts.map +1 -0
- package/dist/modules/hall/protocol.js +52 -0
- package/dist/modules/hall/protocol.js.map +1 -0
- package/dist/modules/hall/server.d.ts +172 -0
- package/dist/modules/hall/server.d.ts.map +1 -0
- package/dist/modules/hall/server.js +457 -0
- package/dist/modules/hall/server.js.map +1 -0
- package/dist/modules/hall/types.d.ts +502 -31
- package/dist/modules/hall/types.d.ts.map +1 -1
- package/dist/modules/hall/types.js +13 -8
- package/dist/modules/hall/types.js.map +1 -1
- package/dist/server/hall-handlers.d.ts +90 -151
- package/dist/server/hall-handlers.d.ts.map +1 -1
- package/dist/server/hall-handlers.js +84 -204
- package/dist/server/hall-handlers.js.map +1 -1
- package/dist/server/index.d.ts +4 -2
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +4 -2
- package/dist/server/index.js.map +1 -1
- package/dist/types.d.ts +22 -18
- package/dist/types.d.ts.map +1 -1
- package/docs/USAGE.md +224 -1
- package/package.json +1 -6
package/dist/server/index.d.ts
CHANGED
|
@@ -36,12 +36,14 @@ export { BrainyInstancePool, BrainyInitializingError, computeEmailHash, } from '
|
|
|
36
36
|
export type { InstancePoolConfig, InstancePoolStats, } from './instance-pool.js';
|
|
37
37
|
export { createBrainyHandler, createBrainyWsHandler, } from './handlers.js';
|
|
38
38
|
export type { BrainyHandlerConfig, BrainyWsHandlerConfig, BrainyWsHandler, WsSession, } from './handlers.js';
|
|
39
|
-
export {
|
|
40
|
-
export type {
|
|
39
|
+
export { createHallModule, generateTurnCredentials, HallClient, } from './hall-handlers.js';
|
|
40
|
+
export type { HallConnectionOptions, HallModule, TurnCredentialOptions, TurnCredentials, } from './hall-handlers.js';
|
|
41
|
+
export type { HallRoom, HallRoomEvents, RoomOptions, ConceptInput, RecordingManifest, TranscriptEvent, ConceptMentionEvent, RelationProposedEvent, SpeakerChangedEvent, PeerJoinedEvent, PeerLeftEvent, } from '../modules/hall/types.js';
|
|
41
42
|
export { createAuthMiddleware, createRemoteSessionVerifier, AUTH_USER_KEY, } from '../modules/auth/middleware.js';
|
|
42
43
|
export type { AuthMiddlewareOptions, AuthMiddleware, AuthContext, BetterAuthLike, RemoteSessionVerifierOptions, } from '../modules/auth/middleware.js';
|
|
43
44
|
export { createBackchannelLogoutHandler } from '../modules/auth/backchannel.js';
|
|
44
45
|
export type { BackchannelLogoutConfig, BackchannelAuthLike, } from '../modules/auth/backchannel.js';
|
|
46
|
+
export { verifyServiceToken, extractBearerToken, } from '../modules/auth/service-token.js';
|
|
45
47
|
export { SOULCRAFT_USER_FIELDS, SOULCRAFT_SESSION_CONFIG, getAuthMode, getOIDCClientConfig, } from '../modules/auth/config.js';
|
|
46
48
|
export { createSDK } from './create-sdk.js';
|
|
47
49
|
export type { CreateSDKOptions } from './create-sdk.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAGH,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,gBAAgB,GACjB,MAAM,oBAAoB,CAAA;AAC3B,YAAY,EACV,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,oBAAoB,CAAA;AAG3B,OAAO,EACL,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,eAAe,CAAA;AACtB,YAAY,EACV,mBAAmB,EACnB,qBAAqB,EACrB,eAAe,EACf,SAAS,GACV,MAAM,eAAe,CAAA;AAGtB,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAGH,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,gBAAgB,GACjB,MAAM,oBAAoB,CAAA;AAC3B,YAAY,EACV,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,oBAAoB,CAAA;AAG3B,OAAO,EACL,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,eAAe,CAAA;AACtB,YAAY,EACV,mBAAmB,EACnB,qBAAqB,EACrB,eAAe,EACf,SAAS,GACV,MAAM,eAAe,CAAA;AAGtB,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,UAAU,GACX,MAAM,oBAAoB,CAAA;AAC3B,YAAY,EACV,qBAAqB,EACrB,UAAU,EACV,qBAAqB,EACrB,eAAe,GAChB,MAAM,oBAAoB,CAAA;AAC3B,YAAY,EACV,QAAQ,EACR,cAAc,EACd,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,EACf,aAAa,GACd,MAAM,0BAA0B,CAAA;AAGjC,OAAO,EACL,oBAAoB,EACpB,2BAA2B,EAC3B,aAAa,GACd,MAAM,+BAA+B,CAAA;AACtC,YAAY,EACV,qBAAqB,EACrB,cAAc,EACd,WAAW,EACX,cAAc,EACd,4BAA4B,GAC7B,MAAM,+BAA+B,CAAA;AACtC,OAAO,EAAE,8BAA8B,EAAE,MAAM,gCAAgC,CAAA;AAC/E,YAAY,EACV,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,gCAAgC,CAAA;AAGvC,OAAO,EACL,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,kCAAkC,CAAA;AAGzC,OAAO,EACL,qBAAqB,EACrB,wBAAwB,EACxB,WAAW,EACX,mBAAmB,GACpB,MAAM,2BAA2B,CAAA;AAGlC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAGvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AACjE,YAAY,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAA;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AACjE,YAAY,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAA;AAC7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAA;AAG7E,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AACnD,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AACxF,YAAY,EAAE,4BAA4B,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AACpG,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA"}
|
package/dist/server/index.js
CHANGED
|
@@ -36,11 +36,13 @@
|
|
|
36
36
|
export { BrainyInstancePool, BrainyInitializingError, computeEmailHash, } from './instance-pool.js';
|
|
37
37
|
// ── Handler factories ─────────────────────────────────────────────────────────
|
|
38
38
|
export { createBrainyHandler, createBrainyWsHandler, } from './handlers.js';
|
|
39
|
-
// ── Hall
|
|
40
|
-
export {
|
|
39
|
+
// ── Hall module factory + TURN utilities ─────────────────────────────────────
|
|
40
|
+
export { createHallModule, generateTurnCredentials, HallClient, } from './hall-handlers.js';
|
|
41
41
|
// ── Auth middleware + backchannel logout ──────────────────────────────────────
|
|
42
42
|
export { createAuthMiddleware, createRemoteSessionVerifier, AUTH_USER_KEY, } from '../modules/auth/middleware.js';
|
|
43
43
|
export { createBackchannelLogoutHandler } from '../modules/auth/backchannel.js';
|
|
44
|
+
// ── Service token verification ────────────────────────────────────────────────
|
|
45
|
+
export { verifyServiceToken, extractBearerToken, } from '../modules/auth/service-token.js';
|
|
44
46
|
// ── Auth config helpers (also on shared entry, duplicated here for convenience) ─
|
|
45
47
|
export { SOULCRAFT_USER_FIELDS, SOULCRAFT_SESSION_CONFIG, getAuthMode, getOIDCClientConfig, } from '../modules/auth/config.js';
|
|
46
48
|
// ── createSDK factory ─────────────────────────────────────────────────────────
|
package/dist/server/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,iFAAiF;AACjF,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,gBAAgB,GACjB,MAAM,oBAAoB,CAAA;AAM3B,iFAAiF;AACjF,OAAO,EACL,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,eAAe,CAAA;AAQtB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,iFAAiF;AACjF,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,gBAAgB,GACjB,MAAM,oBAAoB,CAAA;AAM3B,iFAAiF;AACjF,OAAO,EACL,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,eAAe,CAAA;AAQtB,gFAAgF;AAChF,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,UAAU,GACX,MAAM,oBAAoB,CAAA;AAqB3B,iFAAiF;AACjF,OAAO,EACL,oBAAoB,EACpB,2BAA2B,EAC3B,aAAa,GACd,MAAM,+BAA+B,CAAA;AAQtC,OAAO,EAAE,8BAA8B,EAAE,MAAM,gCAAgC,CAAA;AAM/E,iFAAiF;AACjF,OAAO,EACL,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,kCAAkC,CAAA;AAEzC,mFAAmF;AACnF,OAAO,EACL,qBAAqB,EACrB,wBAAwB,EACxB,WAAW,EACX,mBAAmB,GACpB,MAAM,2BAA2B,CAAA;AAElC,iFAAiF;AACjF,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAG3C,qFAAqF;AACrF,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AAEjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AAEjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAA;AAI7E,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AAExF,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA"}
|
package/dist/types.d.ts
CHANGED
|
@@ -118,26 +118,30 @@ export interface ServerSDKOptions extends SDKOptions {
|
|
|
118
118
|
};
|
|
119
119
|
/**
|
|
120
120
|
* Optional Hall real-time communication configuration.
|
|
121
|
-
* When present, the SDK
|
|
122
|
-
*
|
|
121
|
+
* When present, the SDK connects to the Hall standalone server and exposes `sdk.hall`.
|
|
122
|
+
* No additional packages required — Hall support is built into `@soulcraft/sdk`.
|
|
123
123
|
*/
|
|
124
124
|
hall?: {
|
|
125
|
-
/**
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
/**
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
125
|
+
/**
|
|
126
|
+
* Hall server WebSocket URL (e.g. `"wss://hall.soulcraft.com"`).
|
|
127
|
+
* Defaults to `process.env.HALL_URL` if not set.
|
|
128
|
+
*/
|
|
129
|
+
url: string;
|
|
130
|
+
/**
|
|
131
|
+
* Product name as configured in `[auth.products]` in `hall.toml`.
|
|
132
|
+
* e.g. `"academy"`, `"workshop"`, `"venue"`.
|
|
133
|
+
*/
|
|
134
|
+
productName: string;
|
|
135
|
+
/**
|
|
136
|
+
* Shared secret for this product. Set via `HALL_<PRODUCT>_SECRET` env var.
|
|
137
|
+
* Never expose this to browsers.
|
|
138
|
+
*/
|
|
139
|
+
secret: string;
|
|
140
|
+
/**
|
|
141
|
+
* Milliseconds to wait before a reconnect attempt after an unexpected disconnect.
|
|
142
|
+
* Default: 2000.
|
|
143
|
+
*/
|
|
144
|
+
reconnectDelayMs?: number;
|
|
141
145
|
};
|
|
142
146
|
}
|
|
143
147
|
/**
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,wEAAwE;AACxE,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,CAAA;AAE1E,0CAA0C;AAC1C,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,YAAY,GAAG,WAAW,CAAA;AAEtE,uDAAuD;AACvD,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,IAAI,GAAG,KAAK,GAAG,OAAO,CAAA;AAEvD;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,qFAAqF;IACrF,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;IAC7B,mFAAmF;IACnF,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAA;IACvB,mEAAmE;IACnE,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAA;IACjC,oEAAoE;IACpE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;IACzB,kEAAkE;IAClE,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAA;IAC/B,kFAAkF;IAClF,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAA;IACrB,sFAAsF;IACtF,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;IAC7B,6EAA6E;IAC7E,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;IAC7B,wEAAwE;IACxE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;IACzB,0EAA0E;IAC1E,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAA;IAC/B,wEAAwE;IACxE,QAAQ,CAAC,aAAa,EAAE,mBAAmB,CAAA;IAC3C;;;OAGG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,CAAA;IAE1B,qFAAqF;IACrF,QAAQ,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1B,mFAAmF;IACnF,KAAK,CAAC,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACvC,yDAAyD;IACzD,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACzB,iDAAiD;IACjD,UAAU,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CAC7B;AAED,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAChE,OAAO,KAAK,EAAE,SAAS,IAAI,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACrE,OAAO,KAAK,EAAE,cAAc,IAAI,eAAe,EAAE,MAAM,6BAA6B,CAAA;AACpF,OAAO,KAAK,EAAE,UAAU,IAAI,WAAW,EAAE,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/docs/USAGE.md
CHANGED
|
@@ -24,7 +24,8 @@ the Soulcraft platform. It covers every implemented module with working examples
|
|
|
24
24
|
10. [BrainyInstancePool — Instance Lifecycle](#brainyinstancepool--instance-lifecycle)
|
|
25
25
|
11. [Capability Tokens — Cross-Product Access](#capability-tokens--cross-product-access)
|
|
26
26
|
12. [Auth Middleware](#auth-middleware)
|
|
27
|
-
13. [
|
|
27
|
+
13. [sdk.hall — Real-Time Communication](#sdkhall--real-time-communication)
|
|
28
|
+
14. [For AI Assistants](#for-ai-assistants)
|
|
28
29
|
|
|
29
30
|
---
|
|
30
31
|
|
|
@@ -586,6 +587,223 @@ app.post('/api/auth/backchannel-logout', backchannelHandler)
|
|
|
586
587
|
|
|
587
588
|
---
|
|
588
589
|
|
|
590
|
+
## sdk.hall — Real-Time Communication
|
|
591
|
+
|
|
592
|
+
Hall is the Soulcraft real-time communication layer: WebRTC SFU, Whisper ASR transcription,
|
|
593
|
+
BERT concept matching, and session recording. It runs as a standalone Rust binary at
|
|
594
|
+
`hall.soulcraft.com` and is accessed via `sdk.hall.*` on the server and `joinHallRoom()`
|
|
595
|
+
in the browser.
|
|
596
|
+
|
|
597
|
+
**Architecture overview:**
|
|
598
|
+
|
|
599
|
+
```
|
|
600
|
+
Product backend ──(shared secret)──► Hall server ◄──(session token)── Browser
|
|
601
|
+
│ │
|
|
602
|
+
sdk.hall.* joinHallRoom()
|
|
603
|
+
(HallModule) (HallRoomHandle)
|
|
604
|
+
```
|
|
605
|
+
|
|
606
|
+
- The **product secret** (`HALL_WORKSHOP_SECRET` etc.) is server-to-server only — never sent to browsers.
|
|
607
|
+
- The **session token** is a short-lived JWT issued by `sdk.hall.createSessionToken()` — safe to pass to browsers.
|
|
608
|
+
|
|
609
|
+
### Server setup
|
|
610
|
+
|
|
611
|
+
```typescript
|
|
612
|
+
import { createSDK, createHallModule } from '@soulcraft/sdk/server'
|
|
613
|
+
|
|
614
|
+
// Create the Hall module at startup (one per process):
|
|
615
|
+
const hall = createHallModule({
|
|
616
|
+
url: process.env.HALL_URL ?? 'wss://hall.soulcraft.com',
|
|
617
|
+
productName: 'workshop', // must match hall.toml [auth.products]
|
|
618
|
+
secret: process.env.HALL_WORKSHOP_SECRET!, // never sent to browsers
|
|
619
|
+
reconnectDelayMs: 2000, // default
|
|
620
|
+
})
|
|
621
|
+
|
|
622
|
+
await hall.connect()
|
|
623
|
+
|
|
624
|
+
// Lifecycle hooks:
|
|
625
|
+
hall.onDisconnect(() => console.warn('Hall: disconnected'))
|
|
626
|
+
hall.onReconnect(() => console.log('Hall: reconnected'))
|
|
627
|
+
```
|
|
628
|
+
|
|
629
|
+
### Creating and managing rooms
|
|
630
|
+
|
|
631
|
+
```typescript
|
|
632
|
+
import type { RoomOptions } from '@soulcraft/sdk'
|
|
633
|
+
|
|
634
|
+
// Create a room (e.g. when a learning session starts):
|
|
635
|
+
const room = await hall.createRoom('session-abc123', {
|
|
636
|
+
maxPeers: 6,
|
|
637
|
+
enableTranscription: true,
|
|
638
|
+
enableRecording: false,
|
|
639
|
+
entityId: 'entity-uuid', // Brainy entity to attach AI events to
|
|
640
|
+
concepts: [ // BERT concept matching inputs
|
|
641
|
+
{ nodeId: 'node-1', name: 'Maillard reaction', nounType: 'concept' },
|
|
642
|
+
{ nodeId: 'node-2', name: 'fermentation', nounType: 'concept' },
|
|
643
|
+
],
|
|
644
|
+
})
|
|
645
|
+
|
|
646
|
+
// Listen to room events on the server side:
|
|
647
|
+
room.on('transcriptEvent', (event) => {
|
|
648
|
+
// event: { sessionId, speakerId, peerId, text, isFinal, timestampMs, confidence }
|
|
649
|
+
if (event.isFinal) saveTranscriptLine(event.text)
|
|
650
|
+
})
|
|
651
|
+
|
|
652
|
+
room.on('conceptMentionEvent', (event) => {
|
|
653
|
+
// event: { sessionId, nodeId, name, confidence, timestampMs, transcriptSnippet }
|
|
654
|
+
console.log(`Concept mentioned: "${event.name}" (${event.confidence.toFixed(2)})`)
|
|
655
|
+
})
|
|
656
|
+
|
|
657
|
+
room.on('relationProposedEvent', (event) => {
|
|
658
|
+
// event: { sessionId, fromNodeId, toNodeId, verb, confidence, evidence }
|
|
659
|
+
// Automatically proposed by Hall based on transcript — accept or discard:
|
|
660
|
+
if (event.confidence > 0.75) {
|
|
661
|
+
await sdk.brainy.relate({ from: event.fromNodeId, to: event.toNodeId, type: event.verb })
|
|
662
|
+
}
|
|
663
|
+
})
|
|
664
|
+
|
|
665
|
+
room.on('speakerChangedEvent', (event) => {
|
|
666
|
+
// event: { sessionId, peerId, speakerId, timestampMs }
|
|
667
|
+
updateActiveSpeaker(event.peerId)
|
|
668
|
+
})
|
|
669
|
+
|
|
670
|
+
room.on('peerJoinedEvent', (event) => {
|
|
671
|
+
// event: { sessionId, peerId, displayName }
|
|
672
|
+
})
|
|
673
|
+
|
|
674
|
+
room.on('peerLeftEvent', (event) => {
|
|
675
|
+
// event: { sessionId, peerId }
|
|
676
|
+
checkIfRoomEmpty(event.sessionId)
|
|
677
|
+
})
|
|
678
|
+
|
|
679
|
+
// Get or close rooms:
|
|
680
|
+
const existing = await hall.getRoom('session-abc123') // HallRoom | null
|
|
681
|
+
const all = await hall.listRooms() // string[]
|
|
682
|
+
await hall.closeRoom('session-abc123')
|
|
683
|
+
```
|
|
684
|
+
|
|
685
|
+
### Issuing session tokens for browsers
|
|
686
|
+
|
|
687
|
+
The product backend issues a short-lived token so the browser can join a room without
|
|
688
|
+
ever seeing the product secret:
|
|
689
|
+
|
|
690
|
+
```typescript
|
|
691
|
+
app.post('/api/hall/token', requireAuth, async (c) => {
|
|
692
|
+
const user = c.get('user')!
|
|
693
|
+
const { roomId } = await c.req.json()
|
|
694
|
+
|
|
695
|
+
const token = await hall.createSessionToken({
|
|
696
|
+
roomId,
|
|
697
|
+
userId: user.id,
|
|
698
|
+
displayName: user.name ?? user.email,
|
|
699
|
+
// ttlMs: 300_000 // default: 5 minutes
|
|
700
|
+
})
|
|
701
|
+
|
|
702
|
+
return c.json({ token })
|
|
703
|
+
})
|
|
704
|
+
```
|
|
705
|
+
|
|
706
|
+
### Recording
|
|
707
|
+
|
|
708
|
+
```typescript
|
|
709
|
+
// Start recording (returns when recording is underway):
|
|
710
|
+
await hall.startRecording('session-abc123')
|
|
711
|
+
|
|
712
|
+
// Stop and get the manifest:
|
|
713
|
+
room.on('recordingManifest', (manifest) => {
|
|
714
|
+
// manifest: { sessionId, startedAt, endedAt, audioTracks, videoTracks }
|
|
715
|
+
// audioTracks: Array<{ peerId, url, durationMs }>
|
|
716
|
+
// videoTracks: Array<{ peerId, url, durationMs }>
|
|
717
|
+
saveRecordingManifest(manifest)
|
|
718
|
+
})
|
|
719
|
+
|
|
720
|
+
await hall.stopRecording('session-abc123')
|
|
721
|
+
```
|
|
722
|
+
|
|
723
|
+
### Browser — joinHallRoom
|
|
724
|
+
|
|
725
|
+
```typescript
|
|
726
|
+
import { joinHallRoom } from '@soulcraft/sdk/client'
|
|
727
|
+
import type { HallRoomHandle } from '@soulcraft/sdk'
|
|
728
|
+
|
|
729
|
+
// 1. Get a session token from your backend:
|
|
730
|
+
const { token } = await fetch('/api/hall/token', {
|
|
731
|
+
method: 'POST',
|
|
732
|
+
headers: { 'Content-Type': 'application/json' },
|
|
733
|
+
body: JSON.stringify({ roomId: 'session-abc123' }),
|
|
734
|
+
}).then(r => r.json())
|
|
735
|
+
|
|
736
|
+
// 2. Join the room:
|
|
737
|
+
const room: HallRoomHandle = await joinHallRoom({
|
|
738
|
+
url: 'wss://hall.soulcraft.com',
|
|
739
|
+
roomId: 'session-abc123',
|
|
740
|
+
token, // short-lived JWT, not the product secret
|
|
741
|
+
})
|
|
742
|
+
|
|
743
|
+
// 3. Add local media stream:
|
|
744
|
+
const stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: true })
|
|
745
|
+
room.addStream(stream)
|
|
746
|
+
|
|
747
|
+
// 4. Listen to events — same event names as the server-side HallRoom:
|
|
748
|
+
room.on('trackAdded', ({ peerId, track, stream }) => {
|
|
749
|
+
// Attach track to a <video> or <audio> element
|
|
750
|
+
const el = document.getElementById(`peer-${peerId}`) as HTMLVideoElement
|
|
751
|
+
el.srcObject = stream
|
|
752
|
+
})
|
|
753
|
+
|
|
754
|
+
room.on('trackRemoved', ({ peerId, track }) => {
|
|
755
|
+
removeTrackFromUI(peerId, track)
|
|
756
|
+
})
|
|
757
|
+
|
|
758
|
+
room.on('transcriptEvent', (event) => {
|
|
759
|
+
appendSubtitle(event.text, event.isFinal)
|
|
760
|
+
})
|
|
761
|
+
|
|
762
|
+
room.on('conceptMentionEvent', (event) => {
|
|
763
|
+
highlightConcept(event.nodeId, event.confidence)
|
|
764
|
+
})
|
|
765
|
+
|
|
766
|
+
room.on('relationProposedEvent', (event) => {
|
|
767
|
+
showRelationSuggestion(event)
|
|
768
|
+
})
|
|
769
|
+
|
|
770
|
+
room.on('speakerChangedEvent', (event) => {
|
|
771
|
+
setActiveSpeakerIndicator(event.peerId)
|
|
772
|
+
})
|
|
773
|
+
|
|
774
|
+
room.on('peerJoinedEvent', ({ peerId, displayName }) => {
|
|
775
|
+
addParticipant(peerId, displayName)
|
|
776
|
+
})
|
|
777
|
+
|
|
778
|
+
room.on('peerLeftEvent', ({ peerId }) => {
|
|
779
|
+
removeParticipant(peerId)
|
|
780
|
+
})
|
|
781
|
+
|
|
782
|
+
// 5. Clean up:
|
|
783
|
+
room.close()
|
|
784
|
+
```
|
|
785
|
+
|
|
786
|
+
### Environment variables
|
|
787
|
+
|
|
788
|
+
| Variable | Description | Required |
|
|
789
|
+
|----------|-------------|----------|
|
|
790
|
+
| `HALL_URL` | Hall server WebSocket URL | Yes (or pass `url` in config) |
|
|
791
|
+
| `HALL_WORKSHOP_SECRET` | Shared secret for Workshop | If product is `workshop` |
|
|
792
|
+
| `HALL_VENUE_SECRET` | Shared secret for Venue | If product is `venue` |
|
|
793
|
+
| `HALL_ACADEMY_SECRET` | Shared secret for Academy | If product is `academy` |
|
|
794
|
+
|
|
795
|
+
The secret name follows the convention `HALL_<PRODUCT_UPPERCASE>_SECRET`. It is defined
|
|
796
|
+
in `hall.toml` on the Hall server side under `[auth.products]`.
|
|
797
|
+
|
|
798
|
+
### Security rules
|
|
799
|
+
|
|
800
|
+
1. **Product secrets are server-side only.** Never pass `HALL_*_SECRET` to browsers or kit code.
|
|
801
|
+
2. **Session tokens are short-lived** (default 5 minutes). Always issue fresh tokens per session.
|
|
802
|
+
3. **`roomId` is opaque** — the browser can only join rooms that the backend creates. Kit code cannot create rooms directly.
|
|
803
|
+
4. Hall validates the token signature on every WebSocket connection, so stolen tokens cannot be replayed after expiry.
|
|
804
|
+
|
|
805
|
+
---
|
|
806
|
+
|
|
589
807
|
## For AI Assistants
|
|
590
808
|
|
|
591
809
|
When helping implement Soulcraft server code, follow this checklist:
|
|
@@ -627,6 +845,7 @@ sdk.events.emit('custom:event', payload)
|
|
|
627
845
|
| `sdk.events.*` | ✅ Implemented | EventEmitter, typed, local to SDK instance |
|
|
628
846
|
| `sdk.skills.*` | ✅ Implemented | VFS + bundled registry fallback |
|
|
629
847
|
| `sdk.versions.*` | ✅ Types only | Runtime proxy works; Brainy versions API |
|
|
848
|
+
| `sdk.hall.*` | ✅ Implemented | Server: `createHallModule()`. Browser: `joinHallRoom()` |
|
|
630
849
|
| `sdk.license.*` | ❌ Not yet | Will throw if accessed |
|
|
631
850
|
| `sdk.kits.*` | ❌ Not yet | Will throw if accessed |
|
|
632
851
|
| `sdk.formats.*` | ❌ Not yet | Will throw if accessed |
|
|
@@ -644,3 +863,7 @@ sdk.events.emit('custom:event', payload)
|
|
|
644
863
|
| `BETTER_AUTH_SECRET` | better-auth | Yes |
|
|
645
864
|
| `BRAINY_DATA_PATH` | BrainyInstancePool | Yes (defaults to `./brainy-data`) |
|
|
646
865
|
| `STORAGE_TYPE` | BrainyInstancePool | Yes (`filesystem` or `mmap-filesystem`) |
|
|
866
|
+
| `HALL_URL` | `sdk.hall` | Yes if Hall is enabled |
|
|
867
|
+
| `HALL_WORKSHOP_SECRET` | `sdk.hall` (Workshop) | If product is `workshop` |
|
|
868
|
+
| `HALL_VENUE_SECRET` | `sdk.hall` (Venue) | If product is `venue` |
|
|
869
|
+
| `HALL_ACADEMY_SECRET` | `sdk.hall` (Academy) | If product is `academy` |
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@soulcraft/sdk",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "The unified Soulcraft platform SDK — data, auth, AI, billing, and notifications",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"publishConfig": {
|
|
@@ -38,15 +38,11 @@
|
|
|
38
38
|
"peerDependencies": {
|
|
39
39
|
"@soulcraft/brainy": ">=7.17.0",
|
|
40
40
|
"@soulcraft/cortex": ">=2.1.5",
|
|
41
|
-
"@soulcraft/hall": ">=0.1.0",
|
|
42
41
|
"@soulcraft/kit-schema": ">=2.0.0",
|
|
43
42
|
"@soulcraft/kits": ">=1.0.0",
|
|
44
43
|
"firebase-admin": ">=12.0.0"
|
|
45
44
|
},
|
|
46
45
|
"peerDependenciesMeta": {
|
|
47
|
-
"@soulcraft/hall": {
|
|
48
|
-
"optional": true
|
|
49
|
-
},
|
|
50
46
|
"@soulcraft/kit-schema": {
|
|
51
47
|
"optional": true
|
|
52
48
|
},
|
|
@@ -65,7 +61,6 @@
|
|
|
65
61
|
"stripe": "^20.4.0"
|
|
66
62
|
},
|
|
67
63
|
"devDependencies": {
|
|
68
|
-
"@soulcraft/hall": "link:@soulcraft/hall",
|
|
69
64
|
"@types/node": "^22.0.0",
|
|
70
65
|
"hono": "^4.12.3",
|
|
71
66
|
"typescript": "^5.7.0",
|