@soulcraft/sdk 1.6.2 → 2.0.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 (176) hide show
  1. package/dist/client/create-client-sdk.d.ts +16 -2
  2. package/dist/client/create-client-sdk.d.ts.map +1 -1
  3. package/dist/client/create-client-sdk.js +2 -7
  4. package/dist/client/create-client-sdk.js.map +1 -1
  5. package/dist/client/index.d.ts +48 -37
  6. package/dist/client/index.d.ts.map +1 -1
  7. package/dist/client/index.js +61 -42
  8. package/dist/client/index.js.map +1 -1
  9. package/dist/client/namespace-proxy.d.ts +108 -0
  10. package/dist/client/namespace-proxy.d.ts.map +1 -0
  11. package/dist/client/namespace-proxy.js +151 -0
  12. package/dist/client/namespace-proxy.js.map +1 -0
  13. package/dist/index.d.ts +3 -0
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js.map +1 -1
  16. package/dist/modules/app-context/index.d.ts +214 -0
  17. package/dist/modules/app-context/index.d.ts.map +1 -0
  18. package/dist/modules/app-context/index.js +569 -0
  19. package/dist/modules/app-context/index.js.map +1 -0
  20. package/dist/modules/auth/products.d.ts +208 -0
  21. package/dist/modules/auth/products.d.ts.map +1 -0
  22. package/dist/modules/auth/products.js +165 -0
  23. package/dist/modules/auth/products.js.map +1 -0
  24. package/dist/namespaces.d.ts +2942 -0
  25. package/dist/namespaces.d.ts.map +1 -0
  26. package/dist/namespaces.js +37 -0
  27. package/dist/namespaces.js.map +1 -0
  28. package/dist/rpc.d.ts +156 -0
  29. package/dist/rpc.d.ts.map +1 -0
  30. package/dist/rpc.js +26 -0
  31. package/dist/rpc.js.map +1 -0
  32. package/dist/server/create-sdk.d.ts.map +1 -1
  33. package/dist/server/create-sdk.js +3 -13
  34. package/dist/server/create-sdk.js.map +1 -1
  35. package/dist/server/handlers/annotations.d.ts +52 -0
  36. package/dist/server/handlers/annotations.d.ts.map +1 -0
  37. package/dist/server/handlers/annotations.js +204 -0
  38. package/dist/server/handlers/annotations.js.map +1 -0
  39. package/dist/server/handlers/auth.d.ts +53 -0
  40. package/dist/server/handlers/auth.d.ts.map +1 -0
  41. package/dist/server/handlers/auth.js +66 -0
  42. package/dist/server/handlers/auth.js.map +1 -0
  43. package/dist/server/handlers/certification.d.ts +32 -0
  44. package/dist/server/handlers/certification.d.ts.map +1 -0
  45. package/dist/server/handlers/certification.js +253 -0
  46. package/dist/server/handlers/certification.js.map +1 -0
  47. package/dist/server/handlers/chat/conversations.d.ts +91 -0
  48. package/dist/server/handlers/chat/conversations.d.ts.map +1 -0
  49. package/dist/server/handlers/chat/conversations.js +314 -0
  50. package/dist/server/handlers/chat/conversations.js.map +1 -0
  51. package/dist/server/handlers/chat/delegator.d.ts +144 -0
  52. package/dist/server/handlers/chat/delegator.d.ts.map +1 -0
  53. package/dist/server/handlers/chat/delegator.js +431 -0
  54. package/dist/server/handlers/chat/delegator.js.map +1 -0
  55. package/dist/server/handlers/chat/engine.d.ts +81 -0
  56. package/dist/server/handlers/chat/engine.d.ts.map +1 -0
  57. package/dist/server/handlers/chat/engine.js +442 -0
  58. package/dist/server/handlers/chat/engine.js.map +1 -0
  59. package/dist/server/handlers/chat/executor.d.ts +65 -0
  60. package/dist/server/handlers/chat/executor.d.ts.map +1 -0
  61. package/dist/server/handlers/chat/executor.js +375 -0
  62. package/dist/server/handlers/chat/executor.js.map +1 -0
  63. package/dist/server/handlers/chat/index.d.ts +62 -0
  64. package/dist/server/handlers/chat/index.d.ts.map +1 -0
  65. package/dist/server/handlers/chat/index.js +182 -0
  66. package/dist/server/handlers/chat/index.js.map +1 -0
  67. package/dist/server/handlers/chat/memory.d.ts +91 -0
  68. package/dist/server/handlers/chat/memory.d.ts.map +1 -0
  69. package/dist/server/handlers/chat/memory.js +293 -0
  70. package/dist/server/handlers/chat/memory.js.map +1 -0
  71. package/dist/server/handlers/chat/models.d.ts +180 -0
  72. package/dist/server/handlers/chat/models.d.ts.map +1 -0
  73. package/dist/server/handlers/chat/models.js +304 -0
  74. package/dist/server/handlers/chat/models.js.map +1 -0
  75. package/dist/server/handlers/chat/planner.d.ts +116 -0
  76. package/dist/server/handlers/chat/planner.d.ts.map +1 -0
  77. package/dist/server/handlers/chat/planner.js +344 -0
  78. package/dist/server/handlers/chat/planner.js.map +1 -0
  79. package/dist/server/handlers/chat/types.d.ts +500 -0
  80. package/dist/server/handlers/chat/types.d.ts.map +1 -0
  81. package/dist/server/handlers/chat/types.js +11 -0
  82. package/dist/server/handlers/chat/types.js.map +1 -0
  83. package/dist/server/handlers/collections.d.ts +67 -0
  84. package/dist/server/handlers/collections.d.ts.map +1 -0
  85. package/dist/server/handlers/collections.js +484 -0
  86. package/dist/server/handlers/collections.js.map +1 -0
  87. package/dist/server/handlers/commerce.d.ts +106 -0
  88. package/dist/server/handlers/commerce.d.ts.map +1 -0
  89. package/dist/server/handlers/commerce.js +62 -0
  90. package/dist/server/handlers/commerce.js.map +1 -0
  91. package/dist/server/handlers/config.d.ts +112 -0
  92. package/dist/server/handlers/config.d.ts.map +1 -0
  93. package/dist/server/handlers/config.js +122 -0
  94. package/dist/server/handlers/config.js.map +1 -0
  95. package/dist/server/handlers/export.d.ts +72 -0
  96. package/dist/server/handlers/export.d.ts.map +1 -0
  97. package/dist/server/handlers/export.js +175 -0
  98. package/dist/server/handlers/export.js.map +1 -0
  99. package/dist/server/handlers/formats.d.ts +77 -0
  100. package/dist/server/handlers/formats.d.ts.map +1 -0
  101. package/dist/server/handlers/formats.js +65 -0
  102. package/dist/server/handlers/formats.js.map +1 -0
  103. package/dist/server/handlers/graph.d.ts +31 -0
  104. package/dist/server/handlers/graph.d.ts.map +1 -0
  105. package/dist/server/handlers/graph.js +490 -0
  106. package/dist/server/handlers/graph.js.map +1 -0
  107. package/dist/server/handlers/import.d.ts +96 -0
  108. package/dist/server/handlers/import.d.ts.map +1 -0
  109. package/dist/server/handlers/import.js +108 -0
  110. package/dist/server/handlers/import.js.map +1 -0
  111. package/dist/server/handlers/index.d.ts +68 -0
  112. package/dist/server/handlers/index.d.ts.map +1 -0
  113. package/dist/server/handlers/index.js +71 -0
  114. package/dist/server/handlers/index.js.map +1 -0
  115. package/dist/server/handlers/media.d.ts +76 -0
  116. package/dist/server/handlers/media.d.ts.map +1 -0
  117. package/dist/server/handlers/media.js +53 -0
  118. package/dist/server/handlers/media.js.map +1 -0
  119. package/dist/server/handlers/project.d.ts +45 -0
  120. package/dist/server/handlers/project.d.ts.map +1 -0
  121. package/dist/server/handlers/project.js +181 -0
  122. package/dist/server/handlers/project.js.map +1 -0
  123. package/dist/server/handlers/publish.d.ts +102 -0
  124. package/dist/server/handlers/publish.d.ts.map +1 -0
  125. package/dist/server/handlers/publish.js +130 -0
  126. package/dist/server/handlers/publish.js.map +1 -0
  127. package/dist/server/handlers/pulse.d.ts +39 -0
  128. package/dist/server/handlers/pulse.d.ts.map +1 -0
  129. package/dist/server/handlers/pulse.js +78 -0
  130. package/dist/server/handlers/pulse.js.map +1 -0
  131. package/dist/server/handlers/realtime.d.ts +55 -0
  132. package/dist/server/handlers/realtime.d.ts.map +1 -0
  133. package/dist/server/handlers/realtime.js +49 -0
  134. package/dist/server/handlers/realtime.js.map +1 -0
  135. package/dist/server/handlers/search.d.ts +21 -0
  136. package/dist/server/handlers/search.d.ts.map +1 -0
  137. package/dist/server/handlers/search.js +237 -0
  138. package/dist/server/handlers/search.js.map +1 -0
  139. package/dist/server/handlers/session.d.ts +47 -0
  140. package/dist/server/handlers/session.d.ts.map +1 -0
  141. package/dist/server/handlers/session.js +286 -0
  142. package/dist/server/handlers/session.js.map +1 -0
  143. package/dist/server/handlers/settings.d.ts +97 -0
  144. package/dist/server/handlers/settings.d.ts.map +1 -0
  145. package/dist/server/handlers/settings.js +131 -0
  146. package/dist/server/handlers/settings.js.map +1 -0
  147. package/dist/server/handlers/workspace.d.ts +78 -0
  148. package/dist/server/handlers/workspace.d.ts.map +1 -0
  149. package/dist/server/handlers/workspace.js +270 -0
  150. package/dist/server/handlers/workspace.js.map +1 -0
  151. package/dist/server/hono-router.d.ts +66 -0
  152. package/dist/server/hono-router.d.ts.map +1 -0
  153. package/dist/server/hono-router.js +203 -0
  154. package/dist/server/hono-router.js.map +1 -0
  155. package/dist/server/index.d.ts +29 -19
  156. package/dist/server/index.d.ts.map +1 -1
  157. package/dist/server/index.js +33 -19
  158. package/dist/server/index.js.map +1 -1
  159. package/dist/server/namespace-router.d.ts +204 -0
  160. package/dist/server/namespace-router.d.ts.map +1 -0
  161. package/dist/server/namespace-router.js +262 -0
  162. package/dist/server/namespace-router.js.map +1 -0
  163. package/dist/transports/http-namespace.d.ts +210 -0
  164. package/dist/transports/http-namespace.d.ts.map +1 -0
  165. package/dist/transports/http-namespace.js +514 -0
  166. package/dist/transports/http-namespace.js.map +1 -0
  167. package/dist/transports/workshop.d.ts +173 -0
  168. package/dist/transports/workshop.d.ts.map +1 -0
  169. package/dist/transports/workshop.js +307 -0
  170. package/dist/transports/workshop.js.map +1 -0
  171. package/dist/types.d.ts +65 -67
  172. package/dist/types.d.ts.map +1 -1
  173. package/dist/types.js +7 -3
  174. package/dist/types.js.map +1 -1
  175. package/docs/ADR-004-product-registry.md +108 -0
  176. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hono-router.d.ts","sourceRoot":"","sources":["../../src/server/hono-router.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,KAAK,EAAE,qBAAqB,EAAkB,MAAM,uBAAuB,CAAA;AAGlF;;;;GAIG;AACH,MAAM,MAAM,qBAAqB,GAAG,qBAAqB,CAAA;AAEzD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,qBAAqB,GAAG,IAAI,CAyFzE"}
@@ -0,0 +1,203 @@
1
+ /**
2
+ * @module server/hono-router
3
+ * @description Hono integration factory for the Soulcraft SDK namespace router.
4
+ *
5
+ * Creates a Hono app with three routes:
6
+ *
7
+ * - `POST /api/rpc` — Unified namespace RPC endpoint. Accepts the
8
+ * {@link SoulcraftRPC} envelope and dispatches via the namespace router.
9
+ * Streaming responses are delivered as SSE (`text/event-stream`).
10
+ *
11
+ * - `POST /api/brainy/rpc` — Legacy backward-compatible endpoint. Injects
12
+ * `ns: 'brainy'` and forwards to the same namespace router.
13
+ *
14
+ * - `GET /api/events` — SSE subscription for real-time change events (TBD,
15
+ * route registered but handler deferred to Phase 1b).
16
+ *
17
+ * Products mount this router in their Hono app with `app.route('', sdkRouter)`.
18
+ *
19
+ * @example Workshop server-hono.ts
20
+ * ```typescript
21
+ * import { createSoulcraftRouter } from '@soulcraft/sdk/server'
22
+ *
23
+ * const sdkRouter = createSoulcraftRouter({
24
+ * resolveBrain: async (ctx) => getUserBrainy(ctx.user!.emailHash, ctx.workspaceId),
25
+ * authenticate: async (ctx) => verifySession(ctx.request),
26
+ * providers: {
27
+ * chat: chatHandler,
28
+ * graph: graphHandler,
29
+ * search: searchHandler,
30
+ * },
31
+ * })
32
+ *
33
+ * app.route('', sdkRouter)
34
+ * ```
35
+ */
36
+ import { Hono } from 'hono';
37
+ import { createNamespaceRouter } from './namespace-router.js';
38
+ /**
39
+ * Creates a Hono app with the unified Soulcraft RPC routes.
40
+ *
41
+ * The returned Hono app should be mounted at the root of your product server
42
+ * (not under a prefix) since it defines its own `/api/rpc` and `/api/brainy/rpc`
43
+ * paths.
44
+ *
45
+ * @param config - Namespace router configuration.
46
+ * @returns A Hono app ready to be mounted with `app.route('', sdkRouter)`.
47
+ *
48
+ * @example
49
+ * ```typescript
50
+ * const sdkRouter = createSoulcraftRouter({
51
+ * resolveBrain: async (ctx) => pool.forUser(ctx.user!.emailHash, ctx.workspaceId),
52
+ * authenticate: async (ctx) => verifySession(ctx.request),
53
+ * providers: { chat: chatHandler },
54
+ * })
55
+ *
56
+ * app.route('', sdkRouter)
57
+ * ```
58
+ */
59
+ export function createSoulcraftRouter(config) {
60
+ const router = createNamespaceRouter(config);
61
+ const app = new Hono();
62
+ // ── POST /api/rpc — Unified namespace RPC ────────────────────────────────
63
+ app.post('/api/rpc', async (c) => {
64
+ let body;
65
+ try {
66
+ body = await c.req.json();
67
+ }
68
+ catch {
69
+ return c.json({ error: { code: 'BAD_REQUEST', message: 'Request body must be valid JSON' } }, 400);
70
+ }
71
+ // Validate required fields.
72
+ if (typeof body.ns !== 'string' || typeof body.method !== 'string' || !Array.isArray(body.args)) {
73
+ return c.json({ error: { code: 'BAD_REQUEST', message: '{ ns: string, method: string, args: unknown[] } required' } }, 400);
74
+ }
75
+ const rpc = {
76
+ id: typeof body.id === 'string' ? body.id : crypto.randomUUID(),
77
+ ns: body.ns,
78
+ method: body.method,
79
+ args: body.args,
80
+ stream: body.stream ?? false,
81
+ };
82
+ const result = await router.dispatch(rpc, c.req.raw);
83
+ return _sendResult(c, result);
84
+ });
85
+ // ── POST /api/brainy/rpc — Legacy backward-compat ─────────────────────────
86
+ app.post('/api/brainy/rpc', async (c) => {
87
+ let body;
88
+ try {
89
+ body = await c.req.json();
90
+ }
91
+ catch {
92
+ return c.json({ error: { code: 'BAD_REQUEST', message: 'Request body must be valid JSON' } }, 400);
93
+ }
94
+ if (typeof body.method !== 'string' || !Array.isArray(body.args)) {
95
+ return c.json({ error: { code: 'BAD_REQUEST', message: '{ method: string, args: unknown[] } required' } }, 400);
96
+ }
97
+ // Inject ns: 'brainy' for legacy callers.
98
+ // If the method starts with 'vfs.' or 'versions.', promote to the sub-namespace.
99
+ let ns = 'brainy';
100
+ let method = body.method;
101
+ for (const prefix of ['vfs.', 'versions.']) {
102
+ if (method.startsWith(prefix)) {
103
+ ns = `brainy.${prefix.slice(0, -1)}`;
104
+ method = method.slice(prefix.length);
105
+ break;
106
+ }
107
+ }
108
+ const rpc = {
109
+ id: crypto.randomUUID(),
110
+ ns,
111
+ method,
112
+ args: body.args,
113
+ };
114
+ const result = await router.dispatch(rpc, c.req.raw);
115
+ return _sendResult(c, result);
116
+ });
117
+ // ── GET /api/events — SSE subscription (placeholder for Phase 1b) ────────
118
+ app.get('/api/events', (c) => {
119
+ // SSE event stream — implemented in Phase 1b when event handlers are ready.
120
+ return c.text('SSE endpoint registered — handler deferred to Phase 1b', 501);
121
+ });
122
+ return app;
123
+ }
124
+ // ─────────────────────────────────────────────────────────────────────────────
125
+ // Response helpers
126
+ // ─────────────────────────────────────────────────────────────────────────────
127
+ /**
128
+ * Converts a {@link DispatchResult} into a Hono Response.
129
+ *
130
+ * For `response` results, returns JSON.
131
+ * For `stream` results, returns an SSE stream.
132
+ *
133
+ * @param c - Hono context.
134
+ * @param result - The dispatch result from the namespace router.
135
+ * @returns A Response.
136
+ */
137
+ function _sendResult(c, result) {
138
+ if (result.type === 'response') {
139
+ const { response } = result;
140
+ const status = response.error ? _errorStatusCode(response.error.code) : 200;
141
+ return new Response(JSON.stringify(response), {
142
+ status,
143
+ headers: { 'Content-Type': 'application/json' },
144
+ });
145
+ }
146
+ // Streaming result — deliver as SSE.
147
+ const { id, iterable } = result;
148
+ const stream = new ReadableStream({
149
+ async start(controller) {
150
+ const encoder = new TextEncoder();
151
+ try {
152
+ for await (const chunk of iterable) {
153
+ const frame = { id, chunk };
154
+ controller.enqueue(encoder.encode(`data: ${JSON.stringify(frame)}\n\n`));
155
+ }
156
+ // Send done signal.
157
+ const doneFrame = { id, done: true };
158
+ controller.enqueue(encoder.encode(`data: ${JSON.stringify(doneFrame)}\n\n`));
159
+ }
160
+ catch (err) {
161
+ const message = err instanceof Error ? err.message : String(err);
162
+ const errorFrame = { id, error: message };
163
+ controller.enqueue(encoder.encode(`data: ${JSON.stringify(errorFrame)}\n\n`));
164
+ }
165
+ finally {
166
+ controller.close();
167
+ }
168
+ },
169
+ });
170
+ return new Response(stream, {
171
+ status: 200,
172
+ headers: {
173
+ 'Content-Type': 'text/event-stream',
174
+ 'Cache-Control': 'no-cache',
175
+ 'Connection': 'keep-alive',
176
+ },
177
+ });
178
+ }
179
+ /**
180
+ * Maps error codes to HTTP status codes for JSON responses.
181
+ *
182
+ * @param code - The error code from the RPC response.
183
+ * @returns The appropriate HTTP status code.
184
+ */
185
+ function _errorStatusCode(code) {
186
+ switch (code) {
187
+ case 'UNAUTHORIZED':
188
+ case 'AUTH_ERROR':
189
+ return 401;
190
+ case 'FORBIDDEN':
191
+ return 403;
192
+ case 'NAMESPACE_NOT_FOUND':
193
+ case 'METHOD_NOT_FOUND':
194
+ return 404;
195
+ case 'BRAIN_UNAVAILABLE':
196
+ return 503;
197
+ case 'BAD_REQUEST':
198
+ return 400;
199
+ default:
200
+ return 500;
201
+ }
202
+ }
203
+ //# sourceMappingURL=hono-router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hono-router.js","sourceRoot":"","sources":["../../src/server/hono-router.ts"],"names":[],"mappings":"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"}
@@ -3,32 +3,32 @@
3
3
  * @description Server entry point for @soulcraft/sdk. Exports everything needed to
4
4
  * run the SDK in a product backend (Hono, SvelteKit, or any Bun/Node server).
5
5
  *
6
- * Includes: Brainy instance pool, HTTP and WebSocket RPC handler factories, and
7
- * capability token utilities.
6
+ * ## SDK 2.0 Namespace router (recommended)
7
+ *
8
+ * Use `createSoulcraftRouter()` to mount a single Hono router that handles ALL
9
+ * 25 SDK namespaces via a unified `/api/rpc` endpoint. Products configure which
10
+ * namespaces are active via `NamespaceProviders`.
11
+ *
12
+ * ## Legacy — Brainy-only handlers
13
+ *
14
+ * `createBrainyHandler()` and `createBrainyWsHandler()` still work for backward
15
+ * compatibility but only handle the `brainy` namespace.
8
16
  *
9
17
  * This entry point must never be imported in browser bundles — it has hard
10
18
  * server-only dependencies (`@soulcraft/brainy`, `lru-cache`, `crypto`, `fs`).
11
19
  *
12
- * @example Workshop server setup
20
+ * @example SDK 2.0 — unified router
13
21
  * ```typescript
14
- * import { BrainyInstancePool, createBrainyHandler, createBrainyWsHandler, computeEmailHash } from '@soulcraft/sdk/server'
15
- * import { verifyCapabilityToken } from '@soulcraft/sdk'
22
+ * import { createSoulcraftRouter, BrainyInstancePool } from '@soulcraft/sdk/server'
16
23
  *
17
- * const pool = new BrainyInstancePool({
18
- * storage: 'mmap-filesystem',
19
- * dataPath: '/mnt/brainy-data',
20
- * strategy: 'per-user',
21
- * maxInstances: 200,
22
- * })
24
+ * const pool = new BrainyInstancePool({ storage: 'filesystem', dataPath: './data', strategy: 'per-user' })
23
25
  *
24
- * const rpcHandler = createBrainyHandler({
25
- * resolveBrain: (req) => {
26
- * const userId = req.headers.get('x-email-hash') ?? ''
27
- * const workspaceId = req.headers.get('x-workspace-id') ?? ''
28
- * return pool.forUser(userId, workspaceId)
29
- * },
30
- * authenticate: (req) => verifySession(req.headers.get('cookie') ?? ''),
26
+ * const router = createSoulcraftRouter({
27
+ * resolveBrain: async (ctx) => pool.forUser(ctx.user.emailHash, ctx.workspaceId),
28
+ * authenticate: async (ctx) => verifySession(ctx.request),
29
+ * providers: { ai: { client: anthropic }, billing, hall, ... },
31
30
  * })
31
+ * app.route('', router)
32
32
  * ```
33
33
  */
34
34
  export { BrainyInstancePool, computeEmailHash, } from './instance-pool.js';
@@ -47,6 +47,8 @@ export { createBackchannelLogoutHandler } from '../modules/auth/backchannel.js';
47
47
  export type { BackchannelLogoutConfig, BackchannelAuthLike, } from '../modules/auth/backchannel.js';
48
48
  export { verifyServiceToken, extractBearerToken, } from '../modules/auth/service-token.js';
49
49
  export { SOULCRAFT_USER_FIELDS, SOULCRAFT_SESSION_CONFIG, getAuthMode, getOIDCClientConfig, } from '../modules/auth/config.js';
50
+ export { SOULCRAFT_PRODUCTS, deriveOrigins, deriveRedirectUrls, } from '../modules/auth/products.js';
51
+ export type { ProductRegistration, SoulcraftProduct, } from '../modules/auth/products.js';
50
52
  export { createSDK } from './create-sdk.js';
51
53
  export type { CreateSDKOptions } from './create-sdk.js';
52
54
  export { createServerSDK } from './from-license.js';
@@ -57,8 +59,16 @@ export { createLicenseModule } from '../modules/license/index.js';
57
59
  export type { CreateLicenseModuleOptions } from '../modules/license/index.js';
58
60
  export { createKitsModule } from '../modules/kits/index.js';
59
61
  export { createNotificationsModule } from '../modules/notifications/index.js';
60
- export type { ServerSDKOptions } from '../types.js';
62
+ export type { SoulcraftSDK, ServerSDKOptions } from '../types.js';
63
+ export type { SoulcraftNamespaces } from '../namespaces.js';
61
64
  export { createCapabilityToken, verifyCapabilityToken } from '../modules/brainy/auth.js';
62
65
  export type { CreateCapabilityTokenOptions, CapabilityTokenClaims } from '../modules/brainy/auth.js';
63
66
  export { LocalTransport } from '../transports/local.js';
67
+ export { createNamespaceRouter } from './namespace-router.js';
68
+ export type { NamespaceRouterConfig, NamespaceRouter, NamespaceProvider, NamespaceProviders, RequestContext, UserContext, HandlerContext, DispatchResult, } from './namespace-router.js';
69
+ export { createSoulcraftRouter } from './hono-router.js';
70
+ export type { SoulcraftRouterConfig } from './hono-router.js';
71
+ export { createAnnotationsHandler, createAuthHandler, createChatHandler, createCertificationHandler, createCollectionsHandler, createCommerceHandler, createConfigHandler, createExportHandler, createFormatsHandler, createGraphHandler, createImportHandler, createMediaHandler, createProjectHandler, createPublishHandler, createPulseHandler, createRealtimeHandler, createSearchHandler, createSessionHandler, createSettingsHandler, createWorkspaceHandler, } from './handlers/index.js';
72
+ export type { AnnotationAiClient, AnnotationsHandlerOptions, ChatHandlerOptions, ChatAIClient, AnthropicStreamEvent, ToolDefinition, ToolExecutor, ToolExecutionContext, SystemPromptBuilder, SystemPromptContext, ChatBillingCheck, ChatEventEmitter, ModelSelector, TieredRouting, RetrievedMemory, UserExpertiseProfile, AIPlan, PlanStep, StepProgress, PlanExecutionResult, CapabilityTokenFactory, AuthHandlerOptions, SampleDataProvider, CollectionsHandlerOptions, PaymentProvider, CommerceHandlerOptions, ConfigService, ConfigBillingService, ConfigHandlerOptions, ExportPipeline, ExportHandlerOptions, FormatConverter, FormatsHandlerOptions, ImportPipeline, ImportHandlerOptions, MediaBackend, MediaHandlerOptions, KitLoader, ProjectHandlerOptions, PublishBackend, VenueDeployService, AcademyPublishService, PublishHandlerOptions, PulseHandlerOptions, RealtimeBackend, RealtimeHandlerOptions, SessionEventEmitter, SessionHandlerOptions, ApiKeyService, SettingsBillingService, StorageTracker, StorageLimitResolver, SettingsHandlerOptions, WorkspaceManager, WorkspaceHandlerOptions, } from './handlers/index.js';
73
+ export { analyzeComplexity, calculateComplexityScore, selectTieredRouting, createDefaultModelSelector, estimateCost, formatCost, DEFAULT_MODELS, DEFAULT_MODEL_TIERS, streamMessage, sendMessage, } from './handlers/index.js';
64
74
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAGH,OAAO,EACL,kBAAkB,EAClB,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,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAA;AAG/D,OAAO,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAA;AACzE,YAAY,EACV,8BAA8B,EAC9B,wBAAwB,GACzB,MAAM,0BAA0B,CAAA;AAGjC,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,wBAAwB,EACxB,qBAAqB,EACrB,uBAAuB,EACvB,yBAAyB,EACzB,yBAAyB,EACzB,aAAa,GACd,MAAM,+BAA+B,CAAA;AACtC,YAAY,EACV,qBAAqB,EACrB,cAAc,EACd,WAAW,EACX,cAAc,EACd,eAAe,EACf,4BAA4B,EAC5B,yBAAyB,EACzB,sBAAsB,EACtB,0BAA0B,GAC3B,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,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,YAAY,EACV,SAAS,EACT,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,mBAAmB,CAAA;AAG1B,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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
@@ -3,32 +3,32 @@
3
3
  * @description Server entry point for @soulcraft/sdk. Exports everything needed to
4
4
  * run the SDK in a product backend (Hono, SvelteKit, or any Bun/Node server).
5
5
  *
6
- * Includes: Brainy instance pool, HTTP and WebSocket RPC handler factories, and
7
- * capability token utilities.
6
+ * ## SDK 2.0 Namespace router (recommended)
7
+ *
8
+ * Use `createSoulcraftRouter()` to mount a single Hono router that handles ALL
9
+ * 25 SDK namespaces via a unified `/api/rpc` endpoint. Products configure which
10
+ * namespaces are active via `NamespaceProviders`.
11
+ *
12
+ * ## Legacy — Brainy-only handlers
13
+ *
14
+ * `createBrainyHandler()` and `createBrainyWsHandler()` still work for backward
15
+ * compatibility but only handle the `brainy` namespace.
8
16
  *
9
17
  * This entry point must never be imported in browser bundles — it has hard
10
18
  * server-only dependencies (`@soulcraft/brainy`, `lru-cache`, `crypto`, `fs`).
11
19
  *
12
- * @example Workshop server setup
20
+ * @example SDK 2.0 — unified router
13
21
  * ```typescript
14
- * import { BrainyInstancePool, createBrainyHandler, createBrainyWsHandler, computeEmailHash } from '@soulcraft/sdk/server'
15
- * import { verifyCapabilityToken } from '@soulcraft/sdk'
16
- *
17
- * const pool = new BrainyInstancePool({
18
- * storage: 'mmap-filesystem',
19
- * dataPath: '/mnt/brainy-data',
20
- * strategy: 'per-user',
21
- * maxInstances: 200,
22
- * })
22
+ * import { createSoulcraftRouter, BrainyInstancePool } from '@soulcraft/sdk/server'
23
+ *
24
+ * const pool = new BrainyInstancePool({ storage: 'filesystem', dataPath: './data', strategy: 'per-user' })
23
25
  *
24
- * const rpcHandler = createBrainyHandler({
25
- * resolveBrain: (req) => {
26
- * const userId = req.headers.get('x-email-hash') ?? ''
27
- * const workspaceId = req.headers.get('x-workspace-id') ?? ''
28
- * return pool.forUser(userId, workspaceId)
29
- * },
30
- * authenticate: (req) => verifySession(req.headers.get('cookie') ?? ''),
26
+ * const router = createSoulcraftRouter({
27
+ * resolveBrain: async (ctx) => pool.forUser(ctx.user.emailHash, ctx.workspaceId),
28
+ * authenticate: async (ctx) => verifySession(ctx.request),
29
+ * providers: { ai: { client: anthropic }, billing, hall, ... },
31
30
  * })
31
+ * app.route('', router)
32
32
  * ```
33
33
  */
34
34
  // ── Instance pool ─────────────────────────────────────────────────────────────
@@ -48,6 +48,8 @@ export { createBackchannelLogoutHandler } from '../modules/auth/backchannel.js';
48
48
  export { verifyServiceToken, extractBearerToken, } from '../modules/auth/service-token.js';
49
49
  // ── Auth config helpers (also on shared entry, duplicated here for convenience) ─
50
50
  export { SOULCRAFT_USER_FIELDS, SOULCRAFT_SESSION_CONFIG, getAuthMode, getOIDCClientConfig, } from '../modules/auth/config.js';
51
+ // ── Product registry — single source of truth for all Soulcraft products ─────
52
+ export { SOULCRAFT_PRODUCTS, deriveOrigins, deriveRedirectUrls, } from '../modules/auth/products.js';
51
53
  // ── createSDK factory ─────────────────────────────────────────────────────────
52
54
  export { createSDK } from './create-sdk.js';
53
55
  // ── createServerSDK.fromLicense() — license-driven server SDK ─────────────────
@@ -59,4 +61,16 @@ export { createKitsModule } from '../modules/kits/index.js';
59
61
  export { createNotificationsModule } from '../modules/notifications/index.js';
60
62
  export { createCapabilityToken, verifyCapabilityToken } from '../modules/brainy/auth.js';
61
63
  export { LocalTransport } from '../transports/local.js';
64
+ // ── Namespace router (Symmetrical SDK 2.0) ──────────────────────────────────
65
+ export { createNamespaceRouter } from './namespace-router.js';
66
+ // ── Hono router factory (Symmetrical SDK 2.0) ──────────────────────────────
67
+ export { createSoulcraftRouter } from './hono-router.js';
68
+ // ── Namespace handler factories (Symmetrical SDK 2.0) ───────────────────────
69
+ // Each factory creates a NamespaceProvider wired into `providers` on the router.
70
+ export {
71
+ // Handler factories
72
+ createAnnotationsHandler, createAuthHandler, createChatHandler, createCertificationHandler, createCollectionsHandler, createCommerceHandler, createConfigHandler, createExportHandler, createFormatsHandler, createGraphHandler, createImportHandler, createMediaHandler, createProjectHandler, createPublishHandler, createPulseHandler, createRealtimeHandler, createSearchHandler, createSessionHandler, createSettingsHandler, createWorkspaceHandler, } from './handlers/index.js';
73
+ export {
74
+ // Chat engine utilities
75
+ analyzeComplexity, calculateComplexityScore, selectTieredRouting, createDefaultModelSelector, estimateCost, formatCost, DEFAULT_MODELS, DEFAULT_MODEL_TIERS, streamMessage, sendMessage, } from './handlers/index.js';
62
76
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,iFAAiF;AACjF,OAAO,EACL,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,oBAAoB,CAAA;AAM3B,iFAAiF;AACjF,OAAO,EACL,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,eAAe,CAAA;AAQtB,iFAAiF;AACjF,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAA;AAE/D,iFAAiF;AACjF,OAAO,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAA;AAMzE,gFAAgF;AAChF,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,UAAU,GACX,MAAM,oBAAoB,CAAA;AAqB3B,iFAAiF;AACjF,OAAO,EACL,oBAAoB,EACpB,2BAA2B,EAC3B,wBAAwB,EACxB,qBAAqB,EACrB,uBAAuB,EACvB,yBAAyB,EACzB,yBAAyB,EACzB,aAAa,GACd,MAAM,+BAA+B,CAAA;AAYtC,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,iFAAiF;AACjF,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAQnD,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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,iFAAiF;AACjF,OAAO,EACL,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,oBAAoB,CAAA;AAM3B,iFAAiF;AACjF,OAAO,EACL,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,eAAe,CAAA;AAQtB,iFAAiF;AACjF,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAA;AAE/D,iFAAiF;AACjF,OAAO,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAA;AAMzE,gFAAgF;AAChF,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,UAAU,GACX,MAAM,oBAAoB,CAAA;AAqB3B,iFAAiF;AACjF,OAAO,EACL,oBAAoB,EACpB,2BAA2B,EAC3B,wBAAwB,EACxB,qBAAqB,EACrB,uBAAuB,EACvB,yBAAyB,EACzB,yBAAyB,EACzB,aAAa,GACd,MAAM,+BAA+B,CAAA;AAYtC,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,gFAAgF;AAChF,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,kBAAkB,GACnB,MAAM,6BAA6B,CAAA;AAMpC,iFAAiF;AACjF,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAG3C,iFAAiF;AACjF,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAQnD,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;AAK7E,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AAExF,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAEvD,+EAA+E;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAY7D,8EAA8E;AAC9E,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AAGxD,+EAA+E;AAC/E,iFAAiF;AACjF,OAAO;AACL,oBAAoB;AACpB,wBAAwB,EACxB,iBAAiB,EACjB,iBAAiB,EACjB,0BAA0B,EAC1B,wBAAwB,EACxB,qBAAqB,EACrB,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,qBAAqB,CAAA;AA2D5B,OAAO;AACL,wBAAwB;AACxB,iBAAiB,EACjB,wBAAwB,EACxB,mBAAmB,EACnB,0BAA0B,EAC1B,YAAY,EACZ,UAAU,EACV,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,WAAW,GACZ,MAAM,qBAAqB,CAAA"}
@@ -0,0 +1,204 @@
1
+ /**
2
+ * @module server/namespace-router
3
+ * @description Universal namespace-aware RPC dispatcher for the Soulcraft SDK.
4
+ *
5
+ * Receives requests in the {@link SoulcraftRPC} envelope format, authenticates the
6
+ * caller, resolves the target namespace, and dispatches to the appropriate handler.
7
+ *
8
+ * ## Dispatch model
9
+ *
10
+ * - `brainy` / `brainy.vfs` / `brainy.versions` → {@link LocalTransport} dispatch
11
+ * against the resolved Brainy instance (same proven RPC path as SDK 1.x).
12
+ * - All other namespaces → provider-based dispatch. Each namespace's provider is a
13
+ * plain object whose methods match the namespace contract in `namespaces.ts`.
14
+ *
15
+ * ## Streaming
16
+ *
17
+ * When `stream: true` is set on the request, the handler is expected to return an
18
+ * `AsyncIterable`. The router converts each yielded value into a
19
+ * {@link SoulcraftRPCStream} frame and delivers it via the transport-appropriate
20
+ * mechanism (SSE, PostMessage chunks, or WebSocket frames).
21
+ *
22
+ * ## Error handling
23
+ *
24
+ * All errors are caught at the dispatch level and returned as `SoulcraftRPCResponse`
25
+ * with an `error` field. Handler code does not need to wrap logic in try/catch.
26
+ *
27
+ * @example Hono integration
28
+ * ```typescript
29
+ * import { createNamespaceRouter } from '@soulcraft/sdk/server'
30
+ *
31
+ * const router = createNamespaceRouter({
32
+ * resolveBrain: async (ctx) => pool.forUser(ctx.userId, ctx.workspaceId),
33
+ * authenticate: async (ctx) => verifySession(ctx.request),
34
+ * providers: { chat: chatProvider, graph: graphProvider },
35
+ * })
36
+ *
37
+ * const response = await router.dispatch({ ns: 'brainy', method: 'find', args: [...] }, requestContext)
38
+ * ```
39
+ */
40
+ import type { Brainy } from '@soulcraft/brainy';
41
+ import type { SoulcraftRPC, SoulcraftRPCResponse } from '../rpc.js';
42
+ /**
43
+ * Context extracted from an incoming request. Passed to `authenticate` and
44
+ * `resolveBrain` callbacks so they can inspect headers, cookies, etc.
45
+ */
46
+ export interface RequestContext {
47
+ /** The raw HTTP Request (for header inspection). */
48
+ request: Request;
49
+ /** User identity populated by `authenticate()`. `null` before auth. */
50
+ user: UserContext | null;
51
+ /** Workspace ID extracted from the `X-Workspace-Id` header or query param. */
52
+ workspaceId: string;
53
+ }
54
+ /**
55
+ * Authenticated user context returned by the `authenticate` callback.
56
+ */
57
+ export interface UserContext {
58
+ /** Unique user identifier. */
59
+ id: string;
60
+ /** User's email address. */
61
+ email: string;
62
+ /** User's display name. */
63
+ name: string;
64
+ /** Email hash for per-user isolation. */
65
+ emailHash: string;
66
+ /** Platform role. */
67
+ role?: string | undefined;
68
+ /** Whether the user has a BYOK (Bring Your Own Key) API key. */
69
+ hasByok?: boolean | undefined;
70
+ /** Additional user fields passed through from the auth provider. */
71
+ [key: string]: unknown;
72
+ }
73
+ /**
74
+ * A namespace provider is a plain object whose methods match the corresponding
75
+ * namespace interface in `namespaces.ts`.
76
+ *
77
+ * Each method receives the RPC args array spread as positional params, plus
78
+ * a context object as the last argument for server-side operations that need
79
+ * the authenticated user or Brainy instance.
80
+ */
81
+ export type NamespaceProvider = Record<string, ((...args: any[]) => any) | undefined>;
82
+ /**
83
+ * Context passed to every namespace handler method.
84
+ *
85
+ * Providers use this to access the authenticated user, resolved Brainy instance,
86
+ * and workspace ID without needing to parse headers themselves.
87
+ */
88
+ export interface HandlerContext {
89
+ /** The authenticated user. */
90
+ user: UserContext;
91
+ /** Workspace ID. */
92
+ workspaceId: string;
93
+ /** Brainy instance for this request (resolved lazily on first access). */
94
+ brain: Brainy;
95
+ /** The raw HTTP request (for advanced cases). */
96
+ request: Request;
97
+ }
98
+ /**
99
+ * Registry of namespace providers. Keys are namespace names (e.g. `'chat'`,
100
+ * `'graph'`), values are provider objects.
101
+ *
102
+ * The `brainy` namespace does NOT need a provider — it is handled internally
103
+ * via `LocalTransport` dispatch against the resolved Brainy instance.
104
+ */
105
+ export type NamespaceProviders = Record<string, NamespaceProvider | undefined>;
106
+ /**
107
+ * Configuration for {@link createNamespaceRouter}.
108
+ */
109
+ export interface NamespaceRouterConfig {
110
+ /**
111
+ * Resolves the Brainy instance for this request context.
112
+ *
113
+ * Called when the target namespace is `brainy`, `brainy.vfs`, or
114
+ * `brainy.versions`, or when a Tier 2 handler needs a brain instance.
115
+ *
116
+ * @param ctx - The request context with authenticated user and workspace ID.
117
+ * @returns The Brainy instance for this user + workspace.
118
+ */
119
+ resolveBrain: (ctx: RequestContext) => Promise<Brainy>;
120
+ /**
121
+ * Authenticates the incoming request.
122
+ *
123
+ * Called before any dispatch. Return a {@link UserContext} on success,
124
+ * or `null` to reject with 401.
125
+ *
126
+ * @param ctx - The request context with the raw HTTP request.
127
+ * @returns The authenticated user, or `null`.
128
+ */
129
+ authenticate: (ctx: RequestContext) => Promise<UserContext | null>;
130
+ /**
131
+ * Optional per-call authorization check.
132
+ *
133
+ * Called after authentication succeeds. Return `false` to reject with 403.
134
+ *
135
+ * @param ns - The target namespace.
136
+ * @param method - The method within the namespace.
137
+ * @param args - The call arguments.
138
+ * @param user - The authenticated user.
139
+ * @returns `true` to allow, `false` to deny.
140
+ */
141
+ authorize?: (ns: string, method: string, args: unknown[], user: UserContext) => Promise<boolean> | boolean;
142
+ /**
143
+ * Namespace providers — one per Tier 2 namespace.
144
+ * The `brainy` namespace is handled internally and does not need a provider.
145
+ */
146
+ providers: NamespaceProviders;
147
+ /**
148
+ * Brainy RPC methods that are blocked for all callers.
149
+ *
150
+ * @default []
151
+ */
152
+ blockedBrainyMethods?: string[];
153
+ }
154
+ /** Discriminated union of dispatch outcomes. */
155
+ export type DispatchResult = {
156
+ type: 'response';
157
+ response: SoulcraftRPCResponse;
158
+ } | {
159
+ type: 'stream';
160
+ id: string;
161
+ iterable: AsyncIterable<unknown>;
162
+ };
163
+ /**
164
+ * The namespace router returned by {@link createNamespaceRouter}.
165
+ */
166
+ export interface NamespaceRouter {
167
+ /**
168
+ * Dispatch an RPC request through the namespace router.
169
+ *
170
+ * Handles authentication, authorization, namespace resolution, and error
171
+ * wrapping. Returns either a single response or a stream.
172
+ *
173
+ * @param rpc - The parsed RPC request envelope.
174
+ * @param request - The raw HTTP request for auth/header inspection.
175
+ * @returns A response or stream result.
176
+ */
177
+ dispatch(rpc: SoulcraftRPC, request: Request): Promise<DispatchResult>;
178
+ }
179
+ /**
180
+ * Creates a namespace-aware RPC router that dispatches to Brainy or provider
181
+ * handler methods based on the `ns` field in the request.
182
+ *
183
+ * @param config - Router configuration.
184
+ * @returns A {@link NamespaceRouter} with a `dispatch()` method.
185
+ *
186
+ * @example
187
+ * ```typescript
188
+ * const router = createNamespaceRouter({
189
+ * resolveBrain: (ctx) => pool.forUser(ctx.user!.emailHash, ctx.workspaceId),
190
+ * authenticate: (ctx) => verifySession(ctx.request),
191
+ * providers: {
192
+ * chat: chatHandler,
193
+ * graph: graphHandler,
194
+ * },
195
+ * })
196
+ *
197
+ * const result = await router.dispatch(
198
+ * { id: '1', ns: 'brainy', method: 'find', args: [{ query: 'test' }] },
199
+ * request,
200
+ * )
201
+ * ```
202
+ */
203
+ export declare function createNamespaceRouter(config: NamespaceRouterConfig): NamespaceRouter;
204
+ //# sourceMappingURL=namespace-router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"namespace-router.d.ts","sourceRoot":"","sources":["../../src/server/namespace-router.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAE/C,OAAO,KAAK,EACV,YAAY,EACZ,oBAAoB,EAErB,MAAM,WAAW,CAAA;AAMlB;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,oDAAoD;IACpD,OAAO,EAAE,OAAO,CAAA;IAChB,uEAAuE;IACvE,IAAI,EAAE,WAAW,GAAG,IAAI,CAAA;IACxB,8EAA8E;IAC9E,WAAW,EAAE,MAAM,CAAA;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,8BAA8B;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,4BAA4B;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,yCAAyC;IACzC,SAAS,EAAE,MAAM,CAAA;IACjB,qBAAqB;IACrB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACzB,gEAAgE;IAChE,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IAC7B,oEAAoE;IACpE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAMD;;;;;;;GAOG;AAEH,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,GAAG,SAAS,CAAC,CAAA;AAErF;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,8BAA8B;IAC9B,IAAI,EAAE,WAAW,CAAA;IACjB,oBAAoB;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,0EAA0E;IAC1E,KAAK,EAAE,MAAM,CAAA;IACb,iDAAiD;IACjD,OAAO,EAAE,OAAO,CAAA;CACjB;AAED;;;;;;GAMG;AACH,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,iBAAiB,GAAG,SAAS,CAAC,CAAA;AAM9E;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;;;;;;OAQG;IACH,YAAY,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;IAEtD;;;;;;;;OAQG;IACH,YAAY,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAA;IAElE;;;;;;;;;;OAUG;IACH,SAAS,CAAC,EAAE,CACV,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,OAAO,EAAE,EACf,IAAI,EAAE,WAAW,KACd,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAA;IAE/B;;;OAGG;IACH,SAAS,EAAE,kBAAkB,CAAA;IAE7B;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAA;CAChC;AAMD,gDAAgD;AAChD,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,oBAAoB,CAAA;CAAE,GACpD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC,CAAA;CAAE,CAAA;AAMpE;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;;;;;;OASG;IACH,QAAQ,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,CAAA;CACvE;AAuBD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,qBAAqB,GAAG,eAAe,CAqGpF"}