@soulcraft/sdk 3.3.7 → 3.3.9
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 +2 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +3 -1
- package/dist/client/index.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/modules/auth/products.d.ts +11 -0
- package/dist/modules/auth/products.d.ts.map +1 -1
- package/dist/modules/auth/products.js +11 -0
- package/dist/modules/auth/products.js.map +1 -1
- package/dist/modules/brainy/errors.d.ts +29 -0
- package/dist/modules/brainy/errors.d.ts.map +1 -1
- package/dist/modules/brainy/errors.js +35 -0
- package/dist/modules/brainy/errors.js.map +1 -1
- package/dist/namespaces.d.ts +219 -0
- package/dist/namespaces.d.ts.map +1 -1
- package/dist/read-only.d.ts +56 -0
- package/dist/read-only.d.ts.map +1 -0
- package/dist/read-only.js +108 -0
- package/dist/read-only.js.map +1 -0
- package/dist/server/handlers/imagine.d.ts +140 -0
- package/dist/server/handlers/imagine.d.ts.map +1 -0
- package/dist/server/handlers/imagine.js +310 -0
- package/dist/server/handlers/imagine.js.map +1 -0
- package/dist/server/handlers/index.d.ts +2 -0
- package/dist/server/handlers/index.d.ts.map +1 -1
- package/dist/server/handlers/index.js +2 -0
- package/dist/server/handlers/index.js.map +1 -1
- package/dist/server/index.d.ts +3 -2
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +3 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/read-only.d.ts +61 -0
- package/dist/server/read-only.d.ts.map +1 -0
- package/dist/server/read-only.js +67 -0
- package/dist/server/read-only.js.map +1 -0
- package/dist/server/ws-handler.d.ts.map +1 -1
- package/dist/server/ws-handler.js +5 -0
- package/dist/server/ws-handler.js.map +1 -1
- package/dist/transports/read-only.d.ts +68 -0
- package/dist/transports/read-only.d.ts.map +1 -0
- package/dist/transports/read-only.js +101 -0
- package/dist/transports/read-only.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module read-only
|
|
3
|
+
* @description Shared read-only enforcement for @soulcraft/sdk.
|
|
4
|
+
*
|
|
5
|
+
* Defines the canonical registry of mutation methods per SDK namespace. Both the
|
|
6
|
+
* client-side {@link ReadOnlyTransport} (blocks before the wire) and the server-side
|
|
7
|
+
* {@link createReadOnlyAuthorize} helper (blocks after the wire) import from this
|
|
8
|
+
* module to guarantee the same methods are blocked on both sides.
|
|
9
|
+
*
|
|
10
|
+
* ## Architecture
|
|
11
|
+
*
|
|
12
|
+
* ```
|
|
13
|
+
* Browser (Workshop) Server (Venue)
|
|
14
|
+
* ┌─────────────────┐ ┌─────────────────┐
|
|
15
|
+
* │ ReadOnlyTransport│ ── wire ──▶│ authorize() │
|
|
16
|
+
* │ blocks before │ │ blocks after │
|
|
17
|
+
* │ callNs() │ │ dispatch() │
|
|
18
|
+
* └────────┬────────┘ └────────┬────────┘
|
|
19
|
+
* │ │
|
|
20
|
+
* └──── both use ────────────────┘
|
|
21
|
+
* isWriteMethod()
|
|
22
|
+
* from @soulcraft/sdk
|
|
23
|
+
* ```
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```typescript
|
|
27
|
+
* import { isWriteMethod } from '@soulcraft/sdk'
|
|
28
|
+
*
|
|
29
|
+
* isWriteMethod('brainy', 'find') // false (read)
|
|
30
|
+
* isWriteMethod('brainy', 'add') // true (write)
|
|
31
|
+
* isWriteMethod('brainy.vfs', 'readdir') // false (read)
|
|
32
|
+
* isWriteMethod('brainy.vfs', 'writeFile') // true (write)
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export { SDKReadOnlyError } from './modules/brainy/errors.js';
|
|
36
|
+
/**
|
|
37
|
+
* Known mutation methods per SDK namespace. Any `callNs(ns, method)` matching
|
|
38
|
+
* an entry here is considered a write operation.
|
|
39
|
+
*
|
|
40
|
+
* Methods not in this registry are considered reads — the default is "allow".
|
|
41
|
+
* This registry is the single source of truth for both client-side
|
|
42
|
+
* {@link ReadOnlyTransport} and server-side {@link createReadOnlyAuthorize}.
|
|
43
|
+
*/
|
|
44
|
+
export declare const WRITE_METHODS: Readonly<Record<string, ReadonlySet<string>>>;
|
|
45
|
+
/**
|
|
46
|
+
* Check whether a namespace + method combination is a known write operation.
|
|
47
|
+
*
|
|
48
|
+
* Used by both {@link ReadOnlyTransport} (client) and
|
|
49
|
+
* {@link createReadOnlyAuthorize} (server) to enforce read-only mode.
|
|
50
|
+
*
|
|
51
|
+
* @param ns - The target namespace (e.g. `'brainy'`, `'brainy.vfs'`).
|
|
52
|
+
* @param method - The method name (e.g. `'add'`, `'readdir'`).
|
|
53
|
+
* @returns `true` if the method mutates data, `false` if it's a read or unknown.
|
|
54
|
+
*/
|
|
55
|
+
export declare function isWriteMethod(ns: string, method: string): boolean;
|
|
56
|
+
//# sourceMappingURL=read-only.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-only.d.ts","sourceRoot":"","sources":["../src/read-only.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAM7D;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CA2DvE,CAAA;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAEjE"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module read-only
|
|
3
|
+
* @description Shared read-only enforcement for @soulcraft/sdk.
|
|
4
|
+
*
|
|
5
|
+
* Defines the canonical registry of mutation methods per SDK namespace. Both the
|
|
6
|
+
* client-side {@link ReadOnlyTransport} (blocks before the wire) and the server-side
|
|
7
|
+
* {@link createReadOnlyAuthorize} helper (blocks after the wire) import from this
|
|
8
|
+
* module to guarantee the same methods are blocked on both sides.
|
|
9
|
+
*
|
|
10
|
+
* ## Architecture
|
|
11
|
+
*
|
|
12
|
+
* ```
|
|
13
|
+
* Browser (Workshop) Server (Venue)
|
|
14
|
+
* ┌─────────────────┐ ┌─────────────────┐
|
|
15
|
+
* │ ReadOnlyTransport│ ── wire ──▶│ authorize() │
|
|
16
|
+
* │ blocks before │ │ blocks after │
|
|
17
|
+
* │ callNs() │ │ dispatch() │
|
|
18
|
+
* └────────┬────────┘ └────────┬────────┘
|
|
19
|
+
* │ │
|
|
20
|
+
* └──── both use ────────────────┘
|
|
21
|
+
* isWriteMethod()
|
|
22
|
+
* from @soulcraft/sdk
|
|
23
|
+
* ```
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```typescript
|
|
27
|
+
* import { isWriteMethod } from '@soulcraft/sdk'
|
|
28
|
+
*
|
|
29
|
+
* isWriteMethod('brainy', 'find') // false (read)
|
|
30
|
+
* isWriteMethod('brainy', 'add') // true (write)
|
|
31
|
+
* isWriteMethod('brainy.vfs', 'readdir') // false (read)
|
|
32
|
+
* isWriteMethod('brainy.vfs', 'writeFile') // true (write)
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
// Re-export the error class for convenience
|
|
36
|
+
export { SDKReadOnlyError } from './modules/brainy/errors.js';
|
|
37
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
38
|
+
// Write method registry
|
|
39
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
40
|
+
/**
|
|
41
|
+
* Known mutation methods per SDK namespace. Any `callNs(ns, method)` matching
|
|
42
|
+
* an entry here is considered a write operation.
|
|
43
|
+
*
|
|
44
|
+
* Methods not in this registry are considered reads — the default is "allow".
|
|
45
|
+
* This registry is the single source of truth for both client-side
|
|
46
|
+
* {@link ReadOnlyTransport} and server-side {@link createReadOnlyAuthorize}.
|
|
47
|
+
*/
|
|
48
|
+
export const WRITE_METHODS = {
|
|
49
|
+
// Brainy core — entity CRUD + relationship mutations
|
|
50
|
+
'brainy': new Set([
|
|
51
|
+
'add', 'update', 'remove', 'upsert', 'batch',
|
|
52
|
+
'relate', 'unrelate', 'flush',
|
|
53
|
+
]),
|
|
54
|
+
// Brainy VFS — file system mutations
|
|
55
|
+
'brainy.vfs': new Set([
|
|
56
|
+
'writeFile', 'deleteFile', 'mkdir', 'rename',
|
|
57
|
+
]),
|
|
58
|
+
// Brainy versions — commit/revert
|
|
59
|
+
'brainy.versions': new Set([
|
|
60
|
+
'commit', 'revert', 'createBranch', 'deleteBranch', 'checkout',
|
|
61
|
+
]),
|
|
62
|
+
// Graph — node deletion
|
|
63
|
+
'graph': new Set(['deleteNode']),
|
|
64
|
+
// Collections — CRUD + membership
|
|
65
|
+
'collections': new Set([
|
|
66
|
+
'create', 'update', 'delete',
|
|
67
|
+
'addMember', 'removeMember',
|
|
68
|
+
'loadSampleData', 'clearSampleData',
|
|
69
|
+
]),
|
|
70
|
+
// Annotations — CRUD
|
|
71
|
+
'annotations': new Set(['create', 'update', 'delete']),
|
|
72
|
+
// Import — file ingestion
|
|
73
|
+
'import': new Set(['uploadFiles', 'importData', 'cancel']),
|
|
74
|
+
// Workspace — mutations (but not reads)
|
|
75
|
+
'workspace': new Set([
|
|
76
|
+
'create', 'update', 'delete',
|
|
77
|
+
'backup', 'restore', 'connectVenue', 'updateSettings',
|
|
78
|
+
]),
|
|
79
|
+
// Publish — link/deploy mutations
|
|
80
|
+
'publish': new Set([
|
|
81
|
+
'createLink', 'deleteLink',
|
|
82
|
+
'deployToVenue', 'publishToAcademy', 'to',
|
|
83
|
+
]),
|
|
84
|
+
// Settings — key/config mutations
|
|
85
|
+
'settings': new Set(['saveApiKey', 'deleteApiKey', 'updateSettings']),
|
|
86
|
+
// Media — upload/delete
|
|
87
|
+
'media': new Set(['upload', 'delete']),
|
|
88
|
+
// Commerce — transactional mutations
|
|
89
|
+
'commerce': new Set(['createProduct', 'checkout']),
|
|
90
|
+
// Certification — issuance
|
|
91
|
+
'certification': new Set(['issue', 'revoke']),
|
|
92
|
+
// Pulse — event tracking (write-only namespace)
|
|
93
|
+
'pulse': new Set(['track']),
|
|
94
|
+
};
|
|
95
|
+
/**
|
|
96
|
+
* Check whether a namespace + method combination is a known write operation.
|
|
97
|
+
*
|
|
98
|
+
* Used by both {@link ReadOnlyTransport} (client) and
|
|
99
|
+
* {@link createReadOnlyAuthorize} (server) to enforce read-only mode.
|
|
100
|
+
*
|
|
101
|
+
* @param ns - The target namespace (e.g. `'brainy'`, `'brainy.vfs'`).
|
|
102
|
+
* @param method - The method name (e.g. `'add'`, `'readdir'`).
|
|
103
|
+
* @returns `true` if the method mutates data, `false` if it's a read or unknown.
|
|
104
|
+
*/
|
|
105
|
+
export function isWriteMethod(ns, method) {
|
|
106
|
+
return WRITE_METHODS[ns]?.has(method) === true;
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=read-only.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-only.js","sourceRoot":"","sources":["../src/read-only.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,4CAA4C;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAE7D,gFAAgF;AAChF,wBAAwB;AACxB,gFAAgF;AAEhF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,aAAa,GAAkD;IAC1E,qDAAqD;IACrD,QAAQ,EAAE,IAAI,GAAG,CAAC;QAChB,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO;QAC5C,QAAQ,EAAE,UAAU,EAAE,OAAO;KAC9B,CAAC;IAEF,qCAAqC;IACrC,YAAY,EAAE,IAAI,GAAG,CAAC;QACpB,WAAW,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ;KAC7C,CAAC;IAEF,kCAAkC;IAClC,iBAAiB,EAAE,IAAI,GAAG,CAAC;QACzB,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,cAAc,EAAE,UAAU;KAC/D,CAAC;IAEF,wBAAwB;IACxB,OAAO,EAAE,IAAI,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC;IAEhC,kCAAkC;IAClC,aAAa,EAAE,IAAI,GAAG,CAAC;QACrB,QAAQ,EAAE,QAAQ,EAAE,QAAQ;QAC5B,WAAW,EAAE,cAAc;QAC3B,gBAAgB,EAAE,iBAAiB;KACpC,CAAC;IAEF,qBAAqB;IACrB,aAAa,EAAE,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAEtD,0BAA0B;IAC1B,QAAQ,EAAE,IAAI,GAAG,CAAC,CAAC,aAAa,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;IAE1D,wCAAwC;IACxC,WAAW,EAAE,IAAI,GAAG,CAAC;QACnB,QAAQ,EAAE,QAAQ,EAAE,QAAQ;QAC5B,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,gBAAgB;KACtD,CAAC;IAEF,kCAAkC;IAClC,SAAS,EAAE,IAAI,GAAG,CAAC;QACjB,YAAY,EAAE,YAAY;QAC1B,eAAe,EAAE,kBAAkB,EAAE,IAAI;KAC1C,CAAC;IAEF,kCAAkC;IAClC,UAAU,EAAE,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,cAAc,EAAE,gBAAgB,CAAC,CAAC;IAErE,wBAAwB;IACxB,OAAO,EAAE,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAEtC,qCAAqC;IACrC,UAAU,EAAE,IAAI,GAAG,CAAC,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;IAElD,2BAA2B;IAC3B,eAAe,EAAE,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAE7C,gDAAgD;IAChD,OAAO,EAAE,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;CAC5B,CAAA;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa,CAAC,EAAU,EAAE,MAAc;IACtD,OAAO,aAAa,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,CAAA;AAChD,CAAC"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module server/handlers/imagine
|
|
3
|
+
* @description Imagine namespace handler — generate, list, search, and manage
|
|
4
|
+
* images via a GPU inference backend.
|
|
5
|
+
*
|
|
6
|
+
* The handler delegates image generation to an injected {@link ImagineBackend}
|
|
7
|
+
* interface and stores results as Brainy noun entities with VFS-backed PNG files.
|
|
8
|
+
* The backend is the Rust ONNX sidecar (imagine-gpu binary) or any HTTP service
|
|
9
|
+
* that implements the generate contract.
|
|
10
|
+
*
|
|
11
|
+
* Storage is fully Brainy-native: each image is a `media` noun entity with prompt
|
|
12
|
+
* metadata (searchable via semantic search) and a VFS file at `/images/{id}.png`.
|
|
13
|
+
*
|
|
14
|
+
* Methods:
|
|
15
|
+
* - `generate` — Generate images and store in Brainy
|
|
16
|
+
* - `generateStream` — Streaming generation with progress events
|
|
17
|
+
* - `list` — List/search user's image gallery
|
|
18
|
+
* - `get` — Get single image metadata
|
|
19
|
+
* - `getBytes` — Get raw PNG bytes
|
|
20
|
+
* - `delete` — Delete image (entity + VFS file)
|
|
21
|
+
* - `getPresets` — Available style and size presets
|
|
22
|
+
* - `health` — GPU backend health check
|
|
23
|
+
*/
|
|
24
|
+
import type { NamespaceProvider } from '../namespace-router.js';
|
|
25
|
+
/**
|
|
26
|
+
* @description GPU inference backend interface. Implemented by the Imagine
|
|
27
|
+
* service's `gpu-client.ts` and injected via handler options.
|
|
28
|
+
*
|
|
29
|
+
* Products that host the imagine namespace (i.e. imagine.soulcraft.com itself)
|
|
30
|
+
* provide this backend. Products that *consume* the imagine namespace (Workshop,
|
|
31
|
+
* Venue) call it via the SDK transport — they never see this interface.
|
|
32
|
+
*/
|
|
33
|
+
export interface ImagineBackend {
|
|
34
|
+
/**
|
|
35
|
+
* @description Generate a single image from a fully-resolved prompt.
|
|
36
|
+
* @param params - Generation parameters with resolved dimensions.
|
|
37
|
+
* @param userId - The requesting user's ID for tracking.
|
|
38
|
+
* @returns Raw PNG bytes, the seed used, and the resolved dimensions.
|
|
39
|
+
*/
|
|
40
|
+
generate(params: {
|
|
41
|
+
prompt: string;
|
|
42
|
+
width: number;
|
|
43
|
+
height: number;
|
|
44
|
+
steps: number;
|
|
45
|
+
guidance: number;
|
|
46
|
+
seed: number;
|
|
47
|
+
}, userId: string): Promise<{
|
|
48
|
+
bytes: ArrayBuffer;
|
|
49
|
+
seed: number;
|
|
50
|
+
width: number;
|
|
51
|
+
height: number;
|
|
52
|
+
}>;
|
|
53
|
+
/**
|
|
54
|
+
* @description Stream generation progress events.
|
|
55
|
+
* @param params - Generation parameters.
|
|
56
|
+
* @param userId - The requesting user's ID.
|
|
57
|
+
* @returns Async iterable of progress/complete/error events.
|
|
58
|
+
*/
|
|
59
|
+
generateStream?(params: {
|
|
60
|
+
prompt: string;
|
|
61
|
+
width: number;
|
|
62
|
+
height: number;
|
|
63
|
+
steps: number;
|
|
64
|
+
guidance: number;
|
|
65
|
+
seed: number;
|
|
66
|
+
}, userId: string): AsyncIterable<{
|
|
67
|
+
type: 'progress';
|
|
68
|
+
step: number;
|
|
69
|
+
total: number;
|
|
70
|
+
} | {
|
|
71
|
+
type: 'complete';
|
|
72
|
+
bytes: ArrayBuffer;
|
|
73
|
+
seed: number;
|
|
74
|
+
width: number;
|
|
75
|
+
height: number;
|
|
76
|
+
} | {
|
|
77
|
+
type: 'error';
|
|
78
|
+
message: string;
|
|
79
|
+
}>;
|
|
80
|
+
/**
|
|
81
|
+
* @description Check GPU backend health.
|
|
82
|
+
* @returns Health status object.
|
|
83
|
+
*/
|
|
84
|
+
health(): Promise<{
|
|
85
|
+
status: 'ok' | 'unavailable';
|
|
86
|
+
gpu?: string;
|
|
87
|
+
info?: string;
|
|
88
|
+
}>;
|
|
89
|
+
/**
|
|
90
|
+
* @description Get available style presets.
|
|
91
|
+
* @returns Array of style presets.
|
|
92
|
+
*/
|
|
93
|
+
getStylePresets(): Array<{
|
|
94
|
+
key: string;
|
|
95
|
+
label: string;
|
|
96
|
+
description: string;
|
|
97
|
+
prefix: string;
|
|
98
|
+
}>;
|
|
99
|
+
/**
|
|
100
|
+
* @description Get available size presets.
|
|
101
|
+
* @returns Array of size presets.
|
|
102
|
+
*/
|
|
103
|
+
getSizePresets(): Array<{
|
|
104
|
+
key: string;
|
|
105
|
+
label: string;
|
|
106
|
+
width: number;
|
|
107
|
+
height: number;
|
|
108
|
+
}>;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* @description Options for {@link createImagineHandler}.
|
|
112
|
+
*/
|
|
113
|
+
export interface ImagineHandlerOptions {
|
|
114
|
+
/** The GPU inference backend implementation. */
|
|
115
|
+
backend: ImagineBackend;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* @description Creates the `imagine` namespace handler.
|
|
119
|
+
*
|
|
120
|
+
* The handler uses `ctx.brain` for per-user image storage (Brainy noun entities
|
|
121
|
+
* + VFS files) and delegates GPU inference to the injected {@link ImagineBackend}.
|
|
122
|
+
*
|
|
123
|
+
* @param options - Handler dependencies. If omitted, all methods throw.
|
|
124
|
+
* @returns A {@link NamespaceProvider} implementing {@link ImagineNamespace}.
|
|
125
|
+
*
|
|
126
|
+
* @example Wiring in Imagine's hooks.server.ts
|
|
127
|
+
* ```typescript
|
|
128
|
+
* import { createImagineHandler } from '@soulcraft/sdk/server'
|
|
129
|
+
* import { imagineBackend } from '$lib/server/gpu-client.js'
|
|
130
|
+
*
|
|
131
|
+
* export const routerConfig = {
|
|
132
|
+
* resolveBrain: async (ctx) => getUserBrain(ctx.user.id, ctx.user.email),
|
|
133
|
+
* providers: {
|
|
134
|
+
* imagine: createImagineHandler({ backend: imagineBackend }),
|
|
135
|
+
* },
|
|
136
|
+
* }
|
|
137
|
+
* ```
|
|
138
|
+
*/
|
|
139
|
+
export declare function createImagineHandler(options?: ImagineHandlerOptions): NamespaceProvider;
|
|
140
|
+
//# sourceMappingURL=imagine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"imagine.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/imagine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAkB,MAAM,wBAAwB,CAAA;AAM/E;;;;;;;GAOG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;;OAKG;IACH,QAAQ,CACN,MAAM,EAAE;QACN,MAAM,EAAE,MAAM,CAAA;QACd,KAAK,EAAE,MAAM,CAAA;QACb,MAAM,EAAE,MAAM,CAAA;QACd,KAAK,EAAE,MAAM,CAAA;QACb,QAAQ,EAAE,MAAM,CAAA;QAChB,IAAI,EAAE,MAAM,CAAA;KACb,EACD,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;QAAE,KAAK,EAAE,WAAW,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAE/E;;;;;OAKG;IACH,cAAc,CAAC,CACb,MAAM,EAAE;QACN,MAAM,EAAE,MAAM,CAAA;QACd,KAAK,EAAE,MAAM,CAAA;QACb,MAAM,EAAE,MAAM,CAAA;QACd,KAAK,EAAE,MAAM,CAAA;QACb,QAAQ,EAAE,MAAM,CAAA;QAChB,IAAI,EAAE,MAAM,CAAA;KACb,EACD,MAAM,EAAE,MAAM,GACb,aAAa,CACZ;QAAE,IAAI,EAAE,UAAU,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GACjD;QAAE,IAAI,EAAE,UAAU,CAAC;QAAC,KAAK,EAAE,WAAW,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GACrF;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CACrC,CAAA;IAED;;;OAGG;IACH,MAAM,IAAI,OAAO,CAAC;QAAE,MAAM,EAAE,IAAI,GAAG,aAAa,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAEhF;;;OAGG;IACH,eAAe,IAAI,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAE7F;;;OAGG;IACH,cAAc,IAAI,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACvF;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,gDAAgD;IAChD,OAAO,EAAE,cAAc,CAAA;CACxB;AAwGD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,iBAAiB,CAqOvF"}
|
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module server/handlers/imagine
|
|
3
|
+
* @description Imagine namespace handler — generate, list, search, and manage
|
|
4
|
+
* images via a GPU inference backend.
|
|
5
|
+
*
|
|
6
|
+
* The handler delegates image generation to an injected {@link ImagineBackend}
|
|
7
|
+
* interface and stores results as Brainy noun entities with VFS-backed PNG files.
|
|
8
|
+
* The backend is the Rust ONNX sidecar (imagine-gpu binary) or any HTTP service
|
|
9
|
+
* that implements the generate contract.
|
|
10
|
+
*
|
|
11
|
+
* Storage is fully Brainy-native: each image is a `media` noun entity with prompt
|
|
12
|
+
* metadata (searchable via semantic search) and a VFS file at `/images/{id}.png`.
|
|
13
|
+
*
|
|
14
|
+
* Methods:
|
|
15
|
+
* - `generate` — Generate images and store in Brainy
|
|
16
|
+
* - `generateStream` — Streaming generation with progress events
|
|
17
|
+
* - `list` — List/search user's image gallery
|
|
18
|
+
* - `get` — Get single image metadata
|
|
19
|
+
* - `getBytes` — Get raw PNG bytes
|
|
20
|
+
* - `delete` — Delete image (entity + VFS file)
|
|
21
|
+
* - `getPresets` — Available style and size presets
|
|
22
|
+
* - `health` — GPU backend health check
|
|
23
|
+
*/
|
|
24
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
25
|
+
// Constants
|
|
26
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
27
|
+
/** VFS directory where generated images are stored. */
|
|
28
|
+
const IMAGES_VFS_PATH = '/images';
|
|
29
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
30
|
+
// Internal helpers
|
|
31
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
32
|
+
/**
|
|
33
|
+
* @description Resolve a style preset key to its prompt prefix.
|
|
34
|
+
* @param key - Style preset key.
|
|
35
|
+
* @param backend - The GPU backend (for preset lookup).
|
|
36
|
+
* @returns The prefix string (empty for "none").
|
|
37
|
+
*/
|
|
38
|
+
function resolveStylePrefix(key, backend) {
|
|
39
|
+
const presets = backend.getStylePresets();
|
|
40
|
+
const preset = presets.find((s) => s.key === key);
|
|
41
|
+
return preset?.prefix ?? '';
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* @description Resolve a size preset key to dimensions.
|
|
45
|
+
* @param key - Size preset key.
|
|
46
|
+
* @param backend - The GPU backend (for preset lookup).
|
|
47
|
+
* @returns Width and height in pixels.
|
|
48
|
+
*/
|
|
49
|
+
function resolveDimensions(key, backend) {
|
|
50
|
+
const presets = backend.getSizePresets();
|
|
51
|
+
const preset = presets.find((s) => s.key === key);
|
|
52
|
+
return preset ?? { width: 1024, height: 576 };
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* @description Extract image metadata from a Brainy Result or Entity.
|
|
56
|
+
* @param r - A result from brain.find() or brain.get().
|
|
57
|
+
* @returns Normalized image metadata.
|
|
58
|
+
*/
|
|
59
|
+
function toImageMeta(r) {
|
|
60
|
+
const d = (r.data ?? {});
|
|
61
|
+
return {
|
|
62
|
+
id: r.id,
|
|
63
|
+
prompt: d['prompt'] ?? '',
|
|
64
|
+
style: d['style'] ?? 'none',
|
|
65
|
+
size: d['size'] ?? 'landscape',
|
|
66
|
+
steps: d['steps'] ?? 25,
|
|
67
|
+
guidance: d['guidance'] ?? 7.5,
|
|
68
|
+
seed: d['seed'] ?? 0,
|
|
69
|
+
width: d['width'] ?? 1024,
|
|
70
|
+
height: d['height'] ?? 576,
|
|
71
|
+
elapsed: d['elapsed'] ?? 0,
|
|
72
|
+
createdAt: d['createdAt'] ?? 0,
|
|
73
|
+
filename: `${r.id}.png`,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* @description Store a generated image in Brainy (entity + VFS file).
|
|
78
|
+
* @returns The entity ID.
|
|
79
|
+
*/
|
|
80
|
+
async function storeImage(brain, imageBytes, meta) {
|
|
81
|
+
const id = await brain.add({
|
|
82
|
+
data: {
|
|
83
|
+
prompt: meta.prompt,
|
|
84
|
+
style: meta.style,
|
|
85
|
+
size: meta.size,
|
|
86
|
+
steps: meta.steps,
|
|
87
|
+
guidance: meta.guidance,
|
|
88
|
+
seed: meta.seed,
|
|
89
|
+
width: meta.width,
|
|
90
|
+
height: meta.height,
|
|
91
|
+
elapsed: meta.elapsed,
|
|
92
|
+
createdAt: Date.now(),
|
|
93
|
+
},
|
|
94
|
+
type: 'media',
|
|
95
|
+
metadata: {
|
|
96
|
+
name: meta.prompt.slice(0, 100),
|
|
97
|
+
mediaType: 'image/png',
|
|
98
|
+
},
|
|
99
|
+
});
|
|
100
|
+
// Write PNG to VFS
|
|
101
|
+
const vfsPath = `${IMAGES_VFS_PATH}/${id}.png`;
|
|
102
|
+
await brain.vfs.mkdir(IMAGES_VFS_PATH, { recursive: true });
|
|
103
|
+
await brain.vfs.writeFile(vfsPath, Buffer.from(imageBytes));
|
|
104
|
+
return id;
|
|
105
|
+
}
|
|
106
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
107
|
+
// Handler factory
|
|
108
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
109
|
+
/**
|
|
110
|
+
* @description Creates the `imagine` namespace handler.
|
|
111
|
+
*
|
|
112
|
+
* The handler uses `ctx.brain` for per-user image storage (Brainy noun entities
|
|
113
|
+
* + VFS files) and delegates GPU inference to the injected {@link ImagineBackend}.
|
|
114
|
+
*
|
|
115
|
+
* @param options - Handler dependencies. If omitted, all methods throw.
|
|
116
|
+
* @returns A {@link NamespaceProvider} implementing {@link ImagineNamespace}.
|
|
117
|
+
*
|
|
118
|
+
* @example Wiring in Imagine's hooks.server.ts
|
|
119
|
+
* ```typescript
|
|
120
|
+
* import { createImagineHandler } from '@soulcraft/sdk/server'
|
|
121
|
+
* import { imagineBackend } from '$lib/server/gpu-client.js'
|
|
122
|
+
*
|
|
123
|
+
* export const routerConfig = {
|
|
124
|
+
* resolveBrain: async (ctx) => getUserBrain(ctx.user.id, ctx.user.email),
|
|
125
|
+
* providers: {
|
|
126
|
+
* imagine: createImagineHandler({ backend: imagineBackend }),
|
|
127
|
+
* },
|
|
128
|
+
* }
|
|
129
|
+
* ```
|
|
130
|
+
*/
|
|
131
|
+
export function createImagineHandler(options) {
|
|
132
|
+
const backend = options?.backend;
|
|
133
|
+
function requireBackend() {
|
|
134
|
+
if (!backend) {
|
|
135
|
+
throw new Error('imagine namespace is not configured — provide an ImagineBackend via providers.imagine. ' +
|
|
136
|
+
'The imagine backend is hosted by imagine.soulcraft.com.');
|
|
137
|
+
}
|
|
138
|
+
return backend;
|
|
139
|
+
}
|
|
140
|
+
return {
|
|
141
|
+
async generate(params, ctx) {
|
|
142
|
+
const gpu = requireBackend();
|
|
143
|
+
const { brain } = ctx;
|
|
144
|
+
const count = Math.min(Math.max(params.count ?? 1, 1), 4);
|
|
145
|
+
const style = params.style ?? 'none';
|
|
146
|
+
const sizeKey = params.size ?? 'landscape';
|
|
147
|
+
const steps = params.steps ?? 25;
|
|
148
|
+
const guidance = params.guidance ?? 7.5;
|
|
149
|
+
const prefix = resolveStylePrefix(style, gpu);
|
|
150
|
+
const { width, height } = resolveDimensions(sizeKey, gpu);
|
|
151
|
+
const fullPrompt = prefix + params.prompt;
|
|
152
|
+
const images = [];
|
|
153
|
+
for (let i = 0; i < count; i++) {
|
|
154
|
+
const seed = params.seed != null
|
|
155
|
+
? params.seed + i
|
|
156
|
+
: Math.floor(Math.random() * 2147483647);
|
|
157
|
+
const start = performance.now();
|
|
158
|
+
const result = await gpu.generate({ prompt: fullPrompt, width, height, steps, guidance, seed }, ctx.user.id);
|
|
159
|
+
const elapsed = (performance.now() - start) / 1000;
|
|
160
|
+
const id = await storeImage(brain, result.bytes, {
|
|
161
|
+
prompt: params.prompt,
|
|
162
|
+
style,
|
|
163
|
+
size: sizeKey,
|
|
164
|
+
steps,
|
|
165
|
+
guidance,
|
|
166
|
+
seed: result.seed,
|
|
167
|
+
width: result.width,
|
|
168
|
+
height: result.height,
|
|
169
|
+
elapsed,
|
|
170
|
+
});
|
|
171
|
+
images.push({
|
|
172
|
+
id,
|
|
173
|
+
prompt: params.prompt,
|
|
174
|
+
style,
|
|
175
|
+
size: sizeKey,
|
|
176
|
+
steps,
|
|
177
|
+
guidance,
|
|
178
|
+
seed: result.seed,
|
|
179
|
+
width: result.width,
|
|
180
|
+
height: result.height,
|
|
181
|
+
elapsed,
|
|
182
|
+
createdAt: Date.now(),
|
|
183
|
+
filename: `${id}.png`,
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
return images;
|
|
187
|
+
},
|
|
188
|
+
async *generateStream(params, ctx) {
|
|
189
|
+
const gpu = requireBackend();
|
|
190
|
+
const { brain } = ctx;
|
|
191
|
+
const style = params.style ?? 'none';
|
|
192
|
+
const sizeKey = params.size ?? 'landscape';
|
|
193
|
+
const steps = params.steps ?? 25;
|
|
194
|
+
const guidance = params.guidance ?? 7.5;
|
|
195
|
+
const seed = params.seed ?? Math.floor(Math.random() * 2147483647);
|
|
196
|
+
const prefix = resolveStylePrefix(style, gpu);
|
|
197
|
+
const { width, height } = resolveDimensions(sizeKey, gpu);
|
|
198
|
+
const fullPrompt = prefix + params.prompt;
|
|
199
|
+
if (gpu.generateStream) {
|
|
200
|
+
const start = performance.now();
|
|
201
|
+
let resultBytes = null;
|
|
202
|
+
let resultSeed = seed;
|
|
203
|
+
let resultWidth = width;
|
|
204
|
+
let resultHeight = height;
|
|
205
|
+
for await (const event of gpu.generateStream({ prompt: fullPrompt, width, height, steps, guidance, seed }, ctx.user.id)) {
|
|
206
|
+
if (event.type === 'progress') {
|
|
207
|
+
yield { type: 'progress', step: event.step, total: event.total };
|
|
208
|
+
}
|
|
209
|
+
else if (event.type === 'complete') {
|
|
210
|
+
resultBytes = event.bytes;
|
|
211
|
+
resultSeed = event.seed;
|
|
212
|
+
resultWidth = event.width;
|
|
213
|
+
resultHeight = event.height;
|
|
214
|
+
}
|
|
215
|
+
else if (event.type === 'error') {
|
|
216
|
+
yield { type: 'error', message: event.message };
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
if (resultBytes) {
|
|
221
|
+
const elapsed = (performance.now() - start) / 1000;
|
|
222
|
+
const id = await storeImage(brain, resultBytes, {
|
|
223
|
+
prompt: params.prompt, style, size: sizeKey, steps, guidance,
|
|
224
|
+
seed: resultSeed, width: resultWidth, height: resultHeight, elapsed,
|
|
225
|
+
});
|
|
226
|
+
yield {
|
|
227
|
+
type: 'complete',
|
|
228
|
+
images: [{
|
|
229
|
+
id,
|
|
230
|
+
prompt: params.prompt, style, size: sizeKey, steps, guidance,
|
|
231
|
+
seed: resultSeed, width: resultWidth, height: resultHeight,
|
|
232
|
+
elapsed, createdAt: Date.now(), filename: `${id}.png`,
|
|
233
|
+
}],
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
// Fallback: non-streaming generate with simulated progress
|
|
239
|
+
for (let step = 1; step <= steps; step++) {
|
|
240
|
+
yield { type: 'progress', step, total: steps };
|
|
241
|
+
}
|
|
242
|
+
const start = performance.now();
|
|
243
|
+
const result = await gpu.generate({ prompt: fullPrompt, width, height, steps, guidance, seed }, ctx.user.id);
|
|
244
|
+
const elapsed = (performance.now() - start) / 1000;
|
|
245
|
+
const id = await storeImage(brain, result.bytes, {
|
|
246
|
+
prompt: params.prompt, style, size: sizeKey, steps, guidance,
|
|
247
|
+
seed: result.seed, width: result.width, height: result.height, elapsed,
|
|
248
|
+
});
|
|
249
|
+
yield {
|
|
250
|
+
type: 'complete',
|
|
251
|
+
images: [{
|
|
252
|
+
id,
|
|
253
|
+
prompt: params.prompt, style, size: sizeKey, steps, guidance,
|
|
254
|
+
seed: result.seed, width: result.width, height: result.height,
|
|
255
|
+
elapsed, createdAt: Date.now(), filename: `${id}.png`,
|
|
256
|
+
}],
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
},
|
|
260
|
+
async list(options, ctx) {
|
|
261
|
+
const { brain } = ctx;
|
|
262
|
+
const limit = options?.limit ?? 50;
|
|
263
|
+
const results = options?.query
|
|
264
|
+
? await brain.find({ query: options.query, where: { noun: 'media' }, limit })
|
|
265
|
+
: await brain.find({ where: { noun: 'media' }, limit });
|
|
266
|
+
return results.map(toImageMeta);
|
|
267
|
+
},
|
|
268
|
+
async get(imageId, ctx) {
|
|
269
|
+
const entity = await ctx.brain.get(imageId);
|
|
270
|
+
if (!entity)
|
|
271
|
+
return null;
|
|
272
|
+
return toImageMeta(entity);
|
|
273
|
+
},
|
|
274
|
+
async getBytes(imageId, ctx) {
|
|
275
|
+
try {
|
|
276
|
+
const buffer = await ctx.brain.vfs.readFile(`${IMAGES_VFS_PATH}/${imageId}.png`);
|
|
277
|
+
// Return as ArrayBuffer
|
|
278
|
+
if (buffer instanceof ArrayBuffer)
|
|
279
|
+
return buffer;
|
|
280
|
+
if (Buffer.isBuffer(buffer))
|
|
281
|
+
return buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength);
|
|
282
|
+
return null;
|
|
283
|
+
}
|
|
284
|
+
catch {
|
|
285
|
+
return null;
|
|
286
|
+
}
|
|
287
|
+
},
|
|
288
|
+
async delete(imageId, ctx) {
|
|
289
|
+
await ctx.brain.delete(imageId);
|
|
290
|
+
try {
|
|
291
|
+
await ctx.brain.vfs.unlink(`${IMAGES_VFS_PATH}/${imageId}.png`);
|
|
292
|
+
}
|
|
293
|
+
catch {
|
|
294
|
+
// VFS file may already be gone
|
|
295
|
+
}
|
|
296
|
+
},
|
|
297
|
+
async getPresets() {
|
|
298
|
+
const gpu = requireBackend();
|
|
299
|
+
return {
|
|
300
|
+
styles: gpu.getStylePresets().map(({ key, label, description }) => ({ key, label, description })),
|
|
301
|
+
sizes: gpu.getSizePresets(),
|
|
302
|
+
};
|
|
303
|
+
},
|
|
304
|
+
async health() {
|
|
305
|
+
const gpu = requireBackend();
|
|
306
|
+
return gpu.health();
|
|
307
|
+
},
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
//# sourceMappingURL=imagine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"imagine.js","sourceRoot":"","sources":["../../../src/server/handlers/imagine.ts"],"names":[],"mappings":"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"}
|
|
@@ -46,6 +46,8 @@ export type { ExportPipeline, ExportHandlerOptions } from './export.js';
|
|
|
46
46
|
export { createFormatsHandler } from './formats.js';
|
|
47
47
|
export type { FormatConverter, FormatsHandlerOptions } from './formats.js';
|
|
48
48
|
export { createGraphHandler } from './graph.js';
|
|
49
|
+
export { createImagineHandler } from './imagine.js';
|
|
50
|
+
export type { ImagineBackend, ImagineHandlerOptions } from './imagine.js';
|
|
49
51
|
export { createImportHandler } from './import.js';
|
|
50
52
|
export type { ImportPipeline, ImportHandlerOptions } from './import.js';
|
|
51
53
|
export { createMediaHandler } from './media.js';
|