@seanhogg/builderforce-memory 2026.6.18

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 (163) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +582 -0
  3. package/dist/agent/SSMAgent.d.ts +146 -0
  4. package/dist/agent/SSMAgent.d.ts.map +1 -0
  5. package/dist/agent/SSMAgent.js +231 -0
  6. package/dist/agent/SSMAgent.js.map +1 -0
  7. package/dist/agent/index.d.ts +3 -0
  8. package/dist/agent/index.d.ts.map +1 -0
  9. package/dist/agent/index.js +2 -0
  10. package/dist/agent/index.js.map +1 -0
  11. package/dist/bridges/AnthropicBridge.d.ts +47 -0
  12. package/dist/bridges/AnthropicBridge.d.ts.map +1 -0
  13. package/dist/bridges/AnthropicBridge.js +120 -0
  14. package/dist/bridges/AnthropicBridge.js.map +1 -0
  15. package/dist/bridges/CachingBridge.d.ts +44 -0
  16. package/dist/bridges/CachingBridge.d.ts.map +1 -0
  17. package/dist/bridges/CachingBridge.js +62 -0
  18. package/dist/bridges/CachingBridge.js.map +1 -0
  19. package/dist/bridges/FetchBridge.d.ts +30 -0
  20. package/dist/bridges/FetchBridge.d.ts.map +1 -0
  21. package/dist/bridges/FetchBridge.js +24 -0
  22. package/dist/bridges/FetchBridge.js.map +1 -0
  23. package/dist/bridges/OpenAIBridge.d.ts +33 -0
  24. package/dist/bridges/OpenAIBridge.d.ts.map +1 -0
  25. package/dist/bridges/OpenAIBridge.js +110 -0
  26. package/dist/bridges/OpenAIBridge.js.map +1 -0
  27. package/dist/bridges/ResponseCache.d.ts +65 -0
  28. package/dist/bridges/ResponseCache.d.ts.map +1 -0
  29. package/dist/bridges/ResponseCache.js +97 -0
  30. package/dist/bridges/ResponseCache.js.map +1 -0
  31. package/dist/bridges/SemanticCachingBridge.d.ts +31 -0
  32. package/dist/bridges/SemanticCachingBridge.d.ts.map +1 -0
  33. package/dist/bridges/SemanticCachingBridge.js +44 -0
  34. package/dist/bridges/SemanticCachingBridge.js.map +1 -0
  35. package/dist/bridges/TransformerBridge.d.ts +35 -0
  36. package/dist/bridges/TransformerBridge.d.ts.map +1 -0
  37. package/dist/bridges/TransformerBridge.js +10 -0
  38. package/dist/bridges/TransformerBridge.js.map +1 -0
  39. package/dist/bridges/index.d.ts +14 -0
  40. package/dist/bridges/index.d.ts.map +1 -0
  41. package/dist/bridges/index.js +7 -0
  42. package/dist/bridges/index.js.map +1 -0
  43. package/dist/cache/FetchSemanticCacheBackend.d.ts +40 -0
  44. package/dist/cache/FetchSemanticCacheBackend.d.ts.map +1 -0
  45. package/dist/cache/FetchSemanticCacheBackend.js +61 -0
  46. package/dist/cache/FetchSemanticCacheBackend.js.map +1 -0
  47. package/dist/cache/SemanticCache.d.ts +105 -0
  48. package/dist/cache/SemanticCache.d.ts.map +1 -0
  49. package/dist/cache/SemanticCache.js +130 -0
  50. package/dist/cache/SemanticCache.js.map +1 -0
  51. package/dist/cache/index.d.ts +5 -0
  52. package/dist/cache/index.d.ts.map +1 -0
  53. package/dist/cache/index.js +3 -0
  54. package/dist/cache/index.js.map +1 -0
  55. package/dist/distillation/DistillationEngine.d.ts +107 -0
  56. package/dist/distillation/DistillationEngine.d.ts.map +1 -0
  57. package/dist/distillation/DistillationEngine.js +152 -0
  58. package/dist/distillation/DistillationEngine.js.map +1 -0
  59. package/dist/distillation/index.d.ts +3 -0
  60. package/dist/distillation/index.d.ts.map +1 -0
  61. package/dist/distillation/index.js +2 -0
  62. package/dist/distillation/index.js.map +1 -0
  63. package/dist/errors/SSMError.d.ts +14 -0
  64. package/dist/errors/SSMError.d.ts.map +1 -0
  65. package/dist/errors/SSMError.js +18 -0
  66. package/dist/errors/SSMError.js.map +1 -0
  67. package/dist/errors/index.d.ts +3 -0
  68. package/dist/errors/index.d.ts.map +1 -0
  69. package/dist/errors/index.js +2 -0
  70. package/dist/errors/index.js.map +1 -0
  71. package/dist/index.d.ts +65 -0
  72. package/dist/index.d.ts.map +1 -0
  73. package/dist/index.js +59 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/memory/MemoryStore.d.ts +152 -0
  76. package/dist/memory/MemoryStore.d.ts.map +1 -0
  77. package/dist/memory/MemoryStore.js +290 -0
  78. package/dist/memory/MemoryStore.js.map +1 -0
  79. package/dist/memory/index.d.ts +3 -0
  80. package/dist/memory/index.d.ts.map +1 -0
  81. package/dist/memory/index.js +2 -0
  82. package/dist/memory/index.js.map +1 -0
  83. package/dist/router/InferenceRouter.d.ts +92 -0
  84. package/dist/router/InferenceRouter.d.ts.map +1 -0
  85. package/dist/router/InferenceRouter.js +113 -0
  86. package/dist/router/InferenceRouter.js.map +1 -0
  87. package/dist/router/index.d.ts +3 -0
  88. package/dist/router/index.d.ts.map +1 -0
  89. package/dist/router/index.js +2 -0
  90. package/dist/router/index.js.map +1 -0
  91. package/dist/runtime/SSMRuntime.d.ts +167 -0
  92. package/dist/runtime/SSMRuntime.d.ts.map +1 -0
  93. package/dist/runtime/SSMRuntime.js +199 -0
  94. package/dist/runtime/SSMRuntime.js.map +1 -0
  95. package/dist/runtime/index.d.ts +3 -0
  96. package/dist/runtime/index.d.ts.map +1 -0
  97. package/dist/runtime/index.js +2 -0
  98. package/dist/runtime/index.js.map +1 -0
  99. package/dist/session/errors.d.ts +10 -0
  100. package/dist/session/errors.d.ts.map +1 -0
  101. package/dist/session/errors.js +14 -0
  102. package/dist/session/errors.js.map +1 -0
  103. package/dist/session/index.d.ts +11 -0
  104. package/dist/session/index.d.ts.map +1 -0
  105. package/dist/session/index.js +7 -0
  106. package/dist/session/index.js.map +1 -0
  107. package/dist/session/persistence.d.ts +14 -0
  108. package/dist/session/persistence.d.ts.map +1 -0
  109. package/dist/session/persistence.js +100 -0
  110. package/dist/session/persistence.js.map +1 -0
  111. package/dist/session/presets.d.ts +31 -0
  112. package/dist/session/presets.d.ts.map +1 -0
  113. package/dist/session/presets.js +91 -0
  114. package/dist/session/presets.js.map +1 -0
  115. package/dist/session/session.d.ts +186 -0
  116. package/dist/session/session.d.ts.map +1 -0
  117. package/dist/session/session.js +358 -0
  118. package/dist/session/session.js.map +1 -0
  119. package/dist/session/streaming.d.ts +13 -0
  120. package/dist/session/streaming.d.ts.map +1 -0
  121. package/dist/session/streaming.js +74 -0
  122. package/dist/session/streaming.js.map +1 -0
  123. package/dist/session/tokenizer.d.ts +18 -0
  124. package/dist/session/tokenizer.d.ts.map +1 -0
  125. package/dist/session/tokenizer.js +11 -0
  126. package/dist/session/tokenizer.js.map +1 -0
  127. package/dist/similarity/index.d.ts +19 -0
  128. package/dist/similarity/index.d.ts.map +1 -0
  129. package/dist/similarity/index.js +42 -0
  130. package/dist/similarity/index.js.map +1 -0
  131. package/package.json +120 -0
  132. package/src/agent/SSMAgent.ts +327 -0
  133. package/src/agent/index.ts +2 -0
  134. package/src/bridges/AnthropicBridge.ts +166 -0
  135. package/src/bridges/CachingBridge.ts +79 -0
  136. package/src/bridges/FetchBridge.ts +41 -0
  137. package/src/bridges/OpenAIBridge.ts +143 -0
  138. package/src/bridges/ResponseCache.ts +131 -0
  139. package/src/bridges/SemanticCachingBridge.ts +60 -0
  140. package/src/bridges/TransformerBridge.ts +38 -0
  141. package/src/bridges/index.ts +13 -0
  142. package/src/cache/FetchSemanticCacheBackend.ts +79 -0
  143. package/src/cache/SemanticCache.ts +196 -0
  144. package/src/cache/index.ts +9 -0
  145. package/src/distillation/DistillationEngine.ts +248 -0
  146. package/src/distillation/index.ts +2 -0
  147. package/src/errors/SSMError.ts +26 -0
  148. package/src/errors/index.ts +2 -0
  149. package/src/index.ts +128 -0
  150. package/src/memory/MemoryStore.ts +408 -0
  151. package/src/memory/index.ts +2 -0
  152. package/src/router/InferenceRouter.ts +201 -0
  153. package/src/router/index.ts +2 -0
  154. package/src/runtime/SSMRuntime.ts +309 -0
  155. package/src/runtime/index.ts +2 -0
  156. package/src/session/errors.ts +24 -0
  157. package/src/session/index.ts +25 -0
  158. package/src/session/persistence.ts +142 -0
  159. package/src/session/presets.ts +122 -0
  160. package/src/session/session.ts +657 -0
  161. package/src/session/streaming.ts +97 -0
  162. package/src/session/tokenizer.ts +18 -0
  163. package/src/similarity/index.ts +42 -0
@@ -0,0 +1,167 @@
1
+ /**
2
+ * SSMRuntime – core runtime class for SSM.js.
3
+ *
4
+ * Wraps a MambaSession and adds:
5
+ * - Hybrid inference routing (SSM ↔ transformer bridge)
6
+ * - Unified generate / stream API
7
+ * - Perplexity-aware routing (InferenceRouter auto mode)
8
+ * - Thin save/load pass-throughs for MemoryStore integration
9
+ *
10
+ * GPU lifecycle is owned entirely by this class via the underlying session.
11
+ */
12
+ import { type MambaSessionOptions, type CompleteOptions, type AdaptOptions, type AdaptResult, type SaveOptions, type LoadOptions, type CreateCallbacks } from '../session/index.js';
13
+ import { type RoutingStrategy, type RoutingAuditEntry } from '../router/InferenceRouter.js';
14
+ import type { DistillationLog } from '../distillation/DistillationEngine.js';
15
+ import type { TransformerBridge, BridgeGenerateOptions } from '../bridges/TransformerBridge.js';
16
+ export type GenerateOptions = CompleteOptions & {
17
+ /**
18
+ * Options forwarded to the transformer bridge when the router selects it.
19
+ * Ignored when SSM is selected.
20
+ */
21
+ bridgeOpts?: BridgeGenerateOptions;
22
+ /**
23
+ * Stable system / context prefix, kept separate from the volatile `input`.
24
+ *
25
+ * Splitting it out is what makes transformer-side prompt caching possible:
26
+ * on the SSM path it is prepended to `input` (reproducing the single-string
27
+ * trained prompt format, so SSM behaviour is unchanged), while on the
28
+ * transformer path it is sent as the cacheable `system` field rather than
29
+ * being concatenated into the user message. A bridge can then cache it
30
+ * across turns; concatenating it into the per-turn input could never cache.
31
+ */
32
+ system?: string;
33
+ };
34
+ export interface SSMRuntimeOptions {
35
+ /**
36
+ * Options forwarded verbatim to MambaSession.create().
37
+ * Controls model size, SSM variant, tokenizer, and checkpoint URL.
38
+ */
39
+ session: MambaSessionOptions;
40
+ /**
41
+ * Optional transformer bridge. When absent, all requests go to the SSM
42
+ * and distillation is unavailable.
43
+ */
44
+ bridge?: TransformerBridge;
45
+ /**
46
+ * Routing strategy when a bridge is present.
47
+ * Default: 'auto'
48
+ */
49
+ routingStrategy?: RoutingStrategy;
50
+ /**
51
+ * Character length above which auto-routing prefers the transformer.
52
+ * Default: 1200
53
+ */
54
+ longInputThreshold?: number;
55
+ /**
56
+ * SSM perplexity above which auto-routing prefers the transformer.
57
+ * Default: 80
58
+ */
59
+ perplexityThreshold?: number;
60
+ /**
61
+ * MambaSession.create() progress callbacks.
62
+ */
63
+ callbacks?: CreateCallbacks;
64
+ }
65
+ export declare class SSMRuntime {
66
+ private readonly _session;
67
+ private readonly _bridge;
68
+ private readonly _router;
69
+ private _destroyed;
70
+ private constructor();
71
+ /**
72
+ * Creates and initialises a new SSMRuntime.
73
+ *
74
+ * Delegates to MambaSession.create() — can throw SessionError for
75
+ * GPU / tokenizer failures.
76
+ */
77
+ static create(opts: SSMRuntimeOptions): Promise<SSMRuntime>;
78
+ /**
79
+ * Generates a full response for the given input.
80
+ * Routes to SSM or transformer bridge based on the configured strategy.
81
+ */
82
+ generate(input: string, opts?: GenerateOptions): Promise<string>;
83
+ /**
84
+ * Streaming token generation.
85
+ *
86
+ * Routing note: streaming always uses the SSM path for consistent
87
+ * latency characteristics. Use `generate()` if transformer streaming
88
+ * is needed (bridgeOpts.stream, handled by the bridge's own `stream()` method).
89
+ */
90
+ stream(input: string, opts?: GenerateOptions): AsyncIterable<string>;
91
+ /**
92
+ * Hybrid streaming: routes to SSM or transformer bridge stream.
93
+ * Falls back to `generate()` for bridges that don't support streaming.
94
+ */
95
+ streamHybrid(input: string, opts?: GenerateOptions): AsyncIterable<string>;
96
+ /**
97
+ * Combines the stable `system` prefix with the volatile `input` for the SSM
98
+ * path, reproducing the single-string format the model was trained on.
99
+ */
100
+ private _ssmInput;
101
+ /**
102
+ * Maps the top-level `system` prefix onto the bridge's `systemPrompt` so the
103
+ * transformer receives it as a cacheable `system` field. An explicit
104
+ * `bridgeOpts.systemPrompt` wins if the caller set one.
105
+ */
106
+ private _bridgeOptsWithSystem;
107
+ /**
108
+ * Fine-tunes the SSM on the provided text.
109
+ * Pass-through to MambaSession.adapt().
110
+ */
111
+ adapt(data: string, opts?: AdaptOptions): Promise<AdaptResult>;
112
+ /**
113
+ * Evaluates SSM perplexity on the provided text.
114
+ * Exposed for power users and InferenceRouter's perplexity probe.
115
+ */
116
+ evaluate(text: string): Promise<number>;
117
+ /**
118
+ * Returns an L2-normalised SSM embedding for `text`.
119
+ * Pass-through to MambaSession.embed(). Consumed by MemoryStore.recallSimilar
120
+ * for SSM-based semantic search.
121
+ */
122
+ embed(text: string): Promise<Float32Array>;
123
+ /**
124
+ * Saves SSM weights. Pass-through to MambaSession.save().
125
+ * Accepts a `key` option used by MemoryStore to save under a custom key.
126
+ */
127
+ save(opts?: SaveOptions & {
128
+ key?: string;
129
+ }): Promise<void>;
130
+ /**
131
+ * Loads SSM weights. Pass-through to MambaSession.load().
132
+ * Returns false when no checkpoint exists.
133
+ */
134
+ load(opts?: LoadOptions & {
135
+ key?: string;
136
+ }): Promise<boolean>;
137
+ /**
138
+ * Returns a copy of the in-memory routing audit log.
139
+ * Delegates to the internal InferenceRouter.
140
+ */
141
+ getRoutingAuditLog(): RoutingAuditEntry[];
142
+ /**
143
+ * Returns the distillation log if a DistillationEngine has been attached.
144
+ * Returns an empty array when no distillation engine is available.
145
+ *
146
+ * Note: DistillationEngine is a separate object — attach it by calling
147
+ * `new DistillationEngine(runtime, bridge)` and keeping a reference.
148
+ * This method is a stub for future inline engine support.
149
+ */
150
+ getDistillationLog(): DistillationLog[];
151
+ /** The transformer bridge attached to this runtime, if any. */
152
+ get bridge(): TransformerBridge | undefined;
153
+ /** Whether this runtime has been destroyed. */
154
+ get destroyed(): boolean;
155
+ /**
156
+ * Escape hatch to the underlying MambaSession internals.
157
+ * Use sparingly — the SSMRuntime API covers the common cases.
158
+ */
159
+ get internals(): import("../session/session.js").SessionInternals;
160
+ /**
161
+ * Destroys the underlying MambaSession and releases all GPU resources.
162
+ * After calling this, all methods throw SSMError('RUNTIME_DESTROYED').
163
+ */
164
+ destroy(): void;
165
+ private _checkAlive;
166
+ }
167
+ //# sourceMappingURL=SSMRuntime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SSMRuntime.d.ts","sourceRoot":"","sources":["../../src/runtime/SSMRuntime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,199 @@
1
+ /**
2
+ * SSMRuntime – core runtime class for SSM.js.
3
+ *
4
+ * Wraps a MambaSession and adds:
5
+ * - Hybrid inference routing (SSM ↔ transformer bridge)
6
+ * - Unified generate / stream API
7
+ * - Perplexity-aware routing (InferenceRouter auto mode)
8
+ * - Thin save/load pass-throughs for MemoryStore integration
9
+ *
10
+ * GPU lifecycle is owned entirely by this class via the underlying session.
11
+ */
12
+ import { MambaSession, } from '../session/index.js';
13
+ import { InferenceRouter } from '../router/InferenceRouter.js';
14
+ import { SSMError } from '../errors/SSMError.js';
15
+ // ── SSMRuntime ────────────────────────────────────────────────────────────────
16
+ export class SSMRuntime {
17
+ _session;
18
+ _bridge;
19
+ _router;
20
+ _destroyed = false;
21
+ constructor(session, bridge, router) {
22
+ this._session = session;
23
+ this._bridge = bridge;
24
+ this._router = router;
25
+ }
26
+ // ── Factory ───────────────────────────────────────────────────────────────
27
+ /**
28
+ * Creates and initialises a new SSMRuntime.
29
+ *
30
+ * Delegates to MambaSession.create() — can throw SessionError for
31
+ * GPU / tokenizer failures.
32
+ */
33
+ static async create(opts) {
34
+ const session = await MambaSession.create(opts.session, opts.callbacks);
35
+ const router = new InferenceRouter({
36
+ strategy: opts.routingStrategy,
37
+ longInputThreshold: opts.longInputThreshold,
38
+ perplexityThreshold: opts.perplexityThreshold,
39
+ hasBridge: !!opts.bridge,
40
+ // Pass perplexity probe as callback — avoids circular import
41
+ perplexityProbe: opts.bridge
42
+ ? (text) => session.evaluate(text)
43
+ : undefined,
44
+ });
45
+ return new SSMRuntime(session, opts.bridge, router);
46
+ }
47
+ // ── Inference ─────────────────────────────────────────────────────────────
48
+ /**
49
+ * Generates a full response for the given input.
50
+ * Routes to SSM or transformer bridge based on the configured strategy.
51
+ */
52
+ async generate(input, opts = {}) {
53
+ this._checkAlive();
54
+ const decision = await this._router.route(input);
55
+ if (decision.target === 'transformer' && this._bridge) {
56
+ return this._bridge.generate(input, this._bridgeOptsWithSystem(opts));
57
+ }
58
+ // SSM path — extract only CompleteOptions fields
59
+ const { bridgeOpts: _b, system, ...completeOpts } = opts;
60
+ return this._session.complete(this._ssmInput(input, system), completeOpts);
61
+ }
62
+ /**
63
+ * Streaming token generation.
64
+ *
65
+ * Routing note: streaming always uses the SSM path for consistent
66
+ * latency characteristics. Use `generate()` if transformer streaming
67
+ * is needed (bridgeOpts.stream, handled by the bridge's own `stream()` method).
68
+ */
69
+ async *stream(input, opts = {}) {
70
+ this._checkAlive();
71
+ const { bridgeOpts: _b, system, ...completeOpts } = opts;
72
+ yield* this._session.completeStream(this._ssmInput(input, system), completeOpts);
73
+ }
74
+ /**
75
+ * Hybrid streaming: routes to SSM or transformer bridge stream.
76
+ * Falls back to `generate()` for bridges that don't support streaming.
77
+ */
78
+ async *streamHybrid(input, opts = {}) {
79
+ this._checkAlive();
80
+ const decision = await this._router.route(input);
81
+ if (decision.target === 'transformer' && this._bridge) {
82
+ const bridgeOpts = this._bridgeOptsWithSystem(opts);
83
+ if (this._bridge.supportsStreaming && this._bridge.stream) {
84
+ yield* this._bridge.stream(input, bridgeOpts);
85
+ }
86
+ else {
87
+ yield await this._bridge.generate(input, bridgeOpts);
88
+ }
89
+ return;
90
+ }
91
+ const { bridgeOpts: _b, system, ...completeOpts } = opts;
92
+ yield* this._session.completeStream(this._ssmInput(input, system), completeOpts);
93
+ }
94
+ // ── Prompt-prefix helpers ─────────────────────────────────────────────────
95
+ /**
96
+ * Combines the stable `system` prefix with the volatile `input` for the SSM
97
+ * path, reproducing the single-string format the model was trained on.
98
+ */
99
+ _ssmInput(input, system) {
100
+ return system ? `${system}\n${input}` : input;
101
+ }
102
+ /**
103
+ * Maps the top-level `system` prefix onto the bridge's `systemPrompt` so the
104
+ * transformer receives it as a cacheable `system` field. An explicit
105
+ * `bridgeOpts.systemPrompt` wins if the caller set one.
106
+ */
107
+ _bridgeOptsWithSystem(opts) {
108
+ return {
109
+ ...opts.bridgeOpts,
110
+ systemPrompt: opts.bridgeOpts?.systemPrompt ?? opts.system,
111
+ };
112
+ }
113
+ // ── Adaptation ────────────────────────────────────────────────────────────
114
+ /**
115
+ * Fine-tunes the SSM on the provided text.
116
+ * Pass-through to MambaSession.adapt().
117
+ */
118
+ async adapt(data, opts) {
119
+ this._checkAlive();
120
+ return this._session.adapt(data, opts);
121
+ }
122
+ /**
123
+ * Evaluates SSM perplexity on the provided text.
124
+ * Exposed for power users and InferenceRouter's perplexity probe.
125
+ */
126
+ async evaluate(text) {
127
+ this._checkAlive();
128
+ return this._session.evaluate(text);
129
+ }
130
+ /**
131
+ * Returns an L2-normalised SSM embedding for `text`.
132
+ * Pass-through to MambaSession.embed(). Consumed by MemoryStore.recallSimilar
133
+ * for SSM-based semantic search.
134
+ */
135
+ async embed(text) {
136
+ this._checkAlive();
137
+ return this._session.embed(text);
138
+ }
139
+ // ── Persistence ───────────────────────────────────────────────────────────
140
+ /**
141
+ * Saves SSM weights. Pass-through to MambaSession.save().
142
+ * Accepts a `key` option used by MemoryStore to save under a custom key.
143
+ */
144
+ async save(opts) {
145
+ this._checkAlive();
146
+ await this._session.save(opts);
147
+ }
148
+ /**
149
+ * Loads SSM weights. Pass-through to MambaSession.load().
150
+ * Returns false when no checkpoint exists.
151
+ */
152
+ async load(opts) {
153
+ this._checkAlive();
154
+ return this._session.load(opts);
155
+ }
156
+ // ── Accessors ─────────────────────────────────────────────────────────────
157
+ /**
158
+ * Returns a copy of the in-memory routing audit log.
159
+ * Delegates to the internal InferenceRouter.
160
+ */
161
+ getRoutingAuditLog() {
162
+ return this._router.getAuditLog();
163
+ }
164
+ /**
165
+ * Returns the distillation log if a DistillationEngine has been attached.
166
+ * Returns an empty array when no distillation engine is available.
167
+ *
168
+ * Note: DistillationEngine is a separate object — attach it by calling
169
+ * `new DistillationEngine(runtime, bridge)` and keeping a reference.
170
+ * This method is a stub for future inline engine support.
171
+ */
172
+ getDistillationLog() {
173
+ return [];
174
+ }
175
+ /** The transformer bridge attached to this runtime, if any. */
176
+ get bridge() { return this._bridge; }
177
+ /** Whether this runtime has been destroyed. */
178
+ get destroyed() { return this._destroyed; }
179
+ /**
180
+ * Escape hatch to the underlying MambaSession internals.
181
+ * Use sparingly — the SSMRuntime API covers the common cases.
182
+ */
183
+ get internals() { return this._session.internals; }
184
+ // ── Lifecycle ─────────────────────────────────────────────────────────────
185
+ /**
186
+ * Destroys the underlying MambaSession and releases all GPU resources.
187
+ * After calling this, all methods throw SSMError('RUNTIME_DESTROYED').
188
+ */
189
+ destroy() {
190
+ this._session.destroy();
191
+ this._destroyed = true;
192
+ }
193
+ _checkAlive() {
194
+ if (this._destroyed) {
195
+ throw new SSMError('RUNTIME_DESTROYED', 'SSMRuntime has been destroyed.');
196
+ }
197
+ }
198
+ }
199
+ //# sourceMappingURL=SSMRuntime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SSMRuntime.js","sourceRoot":"","sources":["../../src/runtime/SSMRuntime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { SSMRuntime } from './SSMRuntime.js';
2
+ export type { SSMRuntimeOptions, GenerateOptions } from './SSMRuntime.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { SSMRuntime } from './SSMRuntime.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * errors.ts – Typed error class for the MambaSession layer.
3
+ */
4
+ export type SessionErrorCode = 'GPU_UNAVAILABLE' | 'TOKENIZER_LOAD_FAILED' | 'CHECKPOINT_FETCH_FAILED' | 'CHECKPOINT_INVALID' | 'INPUT_TOO_SHORT' | 'STORAGE_UNAVAILABLE' | 'SESSION_DESTROYED' | 'UNKNOWN';
5
+ export declare class SessionError extends Error {
6
+ readonly code: SessionErrorCode;
7
+ readonly cause?: unknown | undefined;
8
+ constructor(code: SessionErrorCode, message: string, cause?: unknown | undefined);
9
+ }
10
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/session/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,gBAAgB,GACtB,iBAAiB,GACjB,uBAAuB,GACvB,yBAAyB,GACzB,oBAAoB,GACpB,iBAAiB,GACjB,qBAAqB,GACrB,mBAAmB,GACnB,SAAS,CAAC;AAEhB,qBAAa,YAAa,SAAQ,KAAK;aAEf,IAAI,EAAE,gBAAgB;aAEtB,KAAK,CAAC,EAAE,OAAO;gBAFf,IAAI,EAAE,gBAAgB,EACtC,OAAO,EAAE,MAAM,EACC,KAAK,CAAC,EAAE,OAAO,YAAA;CAKtC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * errors.ts – Typed error class for the MambaSession layer.
3
+ */
4
+ export class SessionError extends Error {
5
+ code;
6
+ cause;
7
+ constructor(code, message, cause) {
8
+ super(message);
9
+ this.code = code;
10
+ this.cause = cause;
11
+ this.name = 'SessionError';
12
+ }
13
+ }
14
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/session/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH,MAAM,OAAO,YAAa,SAAQ,KAAK;IAEf;IAEA;IAHpB,YACoB,IAAsB,EACtC,OAAe,EACC,KAAe;QAE/B,KAAK,CAAC,OAAO,CAAC,CAAC;QAJC,SAAI,GAAJ,IAAI,CAAkB;QAEtB,UAAK,GAAL,KAAK,CAAU;QAG/B,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC/B,CAAC;CACJ"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * session/index.ts – barrel export for the MambaSession layer.
3
+ */
4
+ export { MambaSession } from './session.js';
5
+ export { SessionError } from './errors.js';
6
+ export { MODEL_PRESETS, resolveLayerSchedule, resolveModelConfig } from './presets.js';
7
+ export type { SessionErrorCode } from './errors.js';
8
+ export type { LayerSchedulePreset } from './presets.js';
9
+ export type { MambaSessionOptions, CompleteOptions, AdaptOptions, AdaptResult, SaveOptions, LoadOptions, StorageTarget, CreateProgressEvent, CreateStage, CreateCallbacks, SessionInternals, GpuMode, } from './session.js';
10
+ export type { Tokenizer } from './tokenizer.js';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAmB,cAAc,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAmB,aAAa,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEvF,YAAY,EAAE,gBAAgB,EAAE,MAAU,aAAa,CAAC;AACxD,YAAY,EAAE,mBAAmB,EAAE,MAAO,cAAc,CAAC;AACzD,YAAY,EACR,mBAAmB,EACnB,eAAe,EACf,YAAY,EACZ,WAAW,EACX,WAAW,EACX,WAAW,EACX,aAAa,EACb,mBAAmB,EACnB,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,OAAO,GACV,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * session/index.ts – barrel export for the MambaSession layer.
3
+ */
4
+ export { MambaSession } from './session.js';
5
+ export { SessionError } from './errors.js';
6
+ export { MODEL_PRESETS, resolveLayerSchedule, resolveModelConfig } from './presets.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAmB,cAAc,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAmB,aAAa,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * persistence.ts – Storage helpers for the MambaSession layer.
3
+ *
4
+ * Supports three storage targets:
5
+ * - IndexedDB (browser default)
6
+ * - Download (Blob URL trigger)
7
+ * - File System Access API
8
+ */
9
+ export declare function saveToIndexedDB(key: string, buffer: ArrayBuffer, idb?: IDBFactory): Promise<void>;
10
+ export declare function loadFromIndexedDB(key: string, idb?: IDBFactory): Promise<ArrayBuffer | undefined>;
11
+ export declare function triggerDownload(filename: string, buffer: ArrayBuffer): Promise<void>;
12
+ export declare function saveViaFileSystemAPI(filename: string, buffer: ArrayBuffer): Promise<void>;
13
+ export declare function loadViaFileSystemAPI(): Promise<ArrayBuffer>;
14
+ //# sourceMappingURL=persistence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../src/session/persistence.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAuCH,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAevG;AAED,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAiBvG;AAOD,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAe1F;AAID,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB/F;AAED,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,WAAW,CAAC,CAgBjE"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * persistence.ts – Storage helpers for the MambaSession layer.
3
+ *
4
+ * Supports three storage targets:
5
+ * - IndexedDB (browser default)
6
+ * - Download (Blob URL trigger)
7
+ * - File System Access API
8
+ */
9
+ import { SessionError } from './errors.js';
10
+ const DB_NAME = 'ssmjs-session';
11
+ const DB_VERSION = 1;
12
+ const STORE_NAME = 'checkpoints';
13
+ // ── IndexedDB helpers ─────────────────────────────────────────────────────────
14
+ function openDB(idb) {
15
+ return new Promise((resolve, reject) => {
16
+ const factory = idb ?? (typeof indexedDB !== 'undefined' ? indexedDB : undefined);
17
+ if (!factory) {
18
+ reject(new SessionError('STORAGE_UNAVAILABLE', 'IndexedDB is not available in this environment. Pass an idbFactory option (e.g. from fake-indexeddb) for Node.js support.'));
19
+ return;
20
+ }
21
+ const req = factory.open(DB_NAME, DB_VERSION);
22
+ req.onupgradeneeded = (e) => {
23
+ const db = e.target.result;
24
+ if (!db.objectStoreNames.contains(STORE_NAME)) {
25
+ db.createObjectStore(STORE_NAME);
26
+ }
27
+ };
28
+ req.onsuccess = () => resolve(req.result);
29
+ req.onerror = () => reject(new SessionError('STORAGE_UNAVAILABLE', `Failed to open IndexedDB database "${DB_NAME}": ${req.error?.message ?? 'unknown error'}`, req.error));
30
+ });
31
+ }
32
+ export async function saveToIndexedDB(key, buffer, idb) {
33
+ const db = await openDB(idb);
34
+ return new Promise((resolve, reject) => {
35
+ const tx = db.transaction(STORE_NAME, 'readwrite');
36
+ const store = tx.objectStore(STORE_NAME);
37
+ const req = store.put(buffer, key);
38
+ req.onsuccess = () => resolve();
39
+ req.onerror = () => reject(new SessionError('STORAGE_UNAVAILABLE', `Failed to write checkpoint to IndexedDB (key="${key}"): ${req.error?.message ?? 'unknown error'}`, req.error));
40
+ tx.oncomplete = () => db.close();
41
+ });
42
+ }
43
+ export async function loadFromIndexedDB(key, idb) {
44
+ const db = await openDB(idb);
45
+ return new Promise((resolve, reject) => {
46
+ const tx = db.transaction(STORE_NAME, 'readonly');
47
+ const store = tx.objectStore(STORE_NAME);
48
+ const req = store.get(key);
49
+ req.onsuccess = () => {
50
+ db.close();
51
+ resolve(req.result);
52
+ };
53
+ req.onerror = () => reject(new SessionError('STORAGE_UNAVAILABLE', `Failed to read checkpoint from IndexedDB (key="${key}"): ${req.error?.message ?? 'unknown error'}`, req.error));
54
+ });
55
+ }
56
+ /** Milliseconds a download Blob URL is kept alive before being revoked. */
57
+ const DOWNLOAD_URL_TTL_MS = 10_000;
58
+ // ── Download helper ───────────────────────────────────────────────────────────
59
+ export async function triggerDownload(filename, buffer) {
60
+ const blob = new Blob([buffer], { type: 'application/octet-stream' });
61
+ const url = URL.createObjectURL(blob);
62
+ const anchor = document.createElement('a');
63
+ anchor.href = url;
64
+ anchor.download = filename;
65
+ anchor.style.display = 'none';
66
+ document.body.appendChild(anchor);
67
+ anchor.click();
68
+ document.body.removeChild(anchor);
69
+ // Release the object URL after the TTL to allow the download to start
70
+ setTimeout(() => URL.revokeObjectURL(url), DOWNLOAD_URL_TTL_MS);
71
+ }
72
+ // ── File System Access API helpers ────────────────────────────────────────────
73
+ export async function saveViaFileSystemAPI(filename, buffer) {
74
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
75
+ const win = window;
76
+ if (typeof win.showSaveFilePicker !== 'function') {
77
+ throw new SessionError('STORAGE_UNAVAILABLE', 'File System Access API (showSaveFilePicker) is not available in this browser.');
78
+ }
79
+ const handle = await win.showSaveFilePicker({
80
+ suggestedName: filename,
81
+ types: [{ description: 'MambaSession Checkpoint', accept: { 'application/octet-stream': ['.bin'] } }],
82
+ });
83
+ const writable = await handle.createWritable();
84
+ await writable.write(buffer);
85
+ await writable.close();
86
+ }
87
+ export async function loadViaFileSystemAPI() {
88
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
89
+ const win = window;
90
+ if (typeof win.showOpenFilePicker !== 'function') {
91
+ throw new SessionError('STORAGE_UNAVAILABLE', 'File System Access API (showOpenFilePicker) is not available in this browser.');
92
+ }
93
+ const [handle] = await win.showOpenFilePicker({
94
+ types: [{ description: 'MambaSession Checkpoint', accept: { 'application/octet-stream': ['.bin'] } }],
95
+ multiple: false,
96
+ });
97
+ const file = await handle.getFile();
98
+ return file.arrayBuffer();
99
+ }
100
+ //# sourceMappingURL=persistence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../src/session/persistence.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,OAAO,GAAM,eAAe,CAAC;AACnC,MAAM,UAAU,GAAG,CAAC,CAAC;AACrB,MAAM,UAAU,GAAG,aAAa,CAAC;AAEjC,iFAAiF;AAEjF,SAAS,MAAM,CAAC,GAAgB;IAC5B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACnC,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,OAAO,SAAS,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAClF,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,MAAM,CAAC,IAAI,YAAY,CACnB,qBAAqB,EACrB,2HAA2H,CAC9H,CAAC,CAAC;YACH,OAAO;QACX,CAAC;QAED,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAE9C,GAAG,CAAC,eAAe,GAAG,CAAC,CAAC,EAAE,EAAE;YACxB,MAAM,EAAE,GAAI,CAAC,CAAC,MAA2B,CAAC,MAAM,CAAC;YACjD,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC5C,EAAE,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;YACrC,CAAC;QACL,CAAC,CAAC;QAEF,GAAG,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1C,GAAG,CAAC,OAAO,GAAK,GAAI,EAAE,CAAC,MAAM,CAAC,IAAI,YAAY,CAC1C,qBAAqB,EACrB,sCAAsC,OAAO,MAAM,GAAG,CAAC,KAAK,EAAE,OAAO,IAAI,eAAe,EAAE,EAC1F,GAAG,CAAC,KAAK,CACZ,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAW,EAAE,MAAmB,EAAE,GAAgB;IACpF,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACnC,MAAM,EAAE,GAAM,EAAE,CAAC,WAAW,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QACzC,MAAM,GAAG,GAAK,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAErC,GAAG,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;QAChC,GAAG,CAAC,OAAO,GAAK,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,YAAY,CACzC,qBAAqB,EACrB,iDAAiD,GAAG,OAAO,GAAG,CAAC,KAAK,EAAE,OAAO,IAAI,eAAe,EAAE,EAClG,GAAG,CAAC,KAAK,CACZ,CAAC,CAAC;QACH,EAAE,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IACrC,CAAC,CAAC,CAAC;AACP,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAW,EAAE,GAAgB;IACjE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACnC,MAAM,EAAE,GAAM,EAAE,CAAC,WAAW,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QACzC,MAAM,GAAG,GAAK,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAE7B,GAAG,CAAC,SAAS,GAAG,GAAG,EAAE;YACjB,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,MAAiC,CAAC,CAAC;QACnD,CAAC,CAAC;QACF,GAAG,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,YAAY,CACvC,qBAAqB,EACrB,kDAAkD,GAAG,OAAO,GAAG,CAAC,KAAK,EAAE,OAAO,IAAI,eAAe,EAAE,EACnG,GAAG,CAAC,KAAK,CACZ,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC;AAED,2EAA2E;AAC3E,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAEnC,iFAAiF;AAEjF,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAgB,EAAE,MAAmB;IACvE,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,0BAA0B,EAAE,CAAC,CAAC;IACtE,MAAM,GAAG,GAAI,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IAEvC,MAAM,MAAM,GAAS,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IACjD,MAAM,CAAC,IAAI,GAAU,GAAG,CAAC;IACzB,MAAM,CAAC,QAAQ,GAAM,QAAQ,CAAC;IAC9B,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;IAE9B,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,CAAC,KAAK,EAAE,CAAC;IACf,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAElC,sEAAsE;IACtE,UAAU,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,mBAAmB,CAAC,CAAC;AACpE,CAAC;AAED,iFAAiF;AAEjF,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,QAAgB,EAAE,MAAmB;IAC5E,8DAA8D;IAC9D,MAAM,GAAG,GAAG,MAAa,CAAC;IAC1B,IAAI,OAAO,GAAG,CAAC,kBAAkB,KAAK,UAAU,EAAE,CAAC;QAC/C,MAAM,IAAI,YAAY,CAClB,qBAAqB,EACrB,+EAA+E,CAClF,CAAC;IACN,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,kBAAkB,CAAC;QACxC,aAAa,EAAE,QAAQ;QACvB,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,yBAAyB,EAAE,MAAM,EAAE,EAAE,0BAA0B,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;KACxG,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,cAAc,EAAE,CAAC;IAC/C,MAAM,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7B,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACtC,8DAA8D;IAC9D,MAAM,GAAG,GAAG,MAAa,CAAC;IAC1B,IAAI,OAAO,GAAG,CAAC,kBAAkB,KAAK,UAAU,EAAE,CAAC;QAC/C,MAAM,IAAI,YAAY,CAClB,qBAAqB,EACrB,+EAA+E,CAClF,CAAC;IACN,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,kBAAkB,CAAC;QAC1C,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,yBAAyB,EAAE,MAAM,EAAE,EAAE,0BAA0B,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACrG,QAAQ,EAAE,KAAK;KAClB,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;IACpC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * presets.ts – Model size presets and config resolver for the MambaSession layer.
3
+ */
4
+ import type { HybridMambaModelConfig, LayerSpec, LayerType } from '@seanhogg/builderforce-memory-engine';
5
+ import type { MambaSessionOptions } from './session.js';
6
+ /**
7
+ * Pre-defined model size presets.
8
+ * nHeads is used by Mamba-2/3 and Attention layers; ignored for Mamba-1.
9
+ */
10
+ export declare const MODEL_PRESETS: Record<string, Partial<HybridMambaModelConfig>>;
11
+ export type LayerSchedulePreset = 'jamba' | 'zamba';
12
+ /**
13
+ * Resolve a layer schedule from a preset name, explicit array, or undefined.
14
+ *
15
+ * 'jamba' — Jamba-style: every 4th layer (index 3, 7, 11…) is attention, rest mamba2
16
+ * 'zamba' — Zamba-style: every 6th layer (index 5, 11…) is attention, rest mamba3
17
+ */
18
+ export declare function resolveLayerSchedule(schedule: LayerSpec[] | LayerSchedulePreset | undefined, numLayers: number, defaultType: LayerType): LayerSpec[];
19
+ /**
20
+ * Resolves a fully-populated HybridMambaModelConfig from session options and
21
+ * the actual tokenizer vocab size.
22
+ *
23
+ * Resolution order:
24
+ * 1. Preset fields (default: 'nano')
25
+ * 2. modelConfig overrides (only applied when modelSize === 'custom')
26
+ * 3. vocabSize from the tokenizer
27
+ * 4. mambaVersion → default layer type for schedule resolution
28
+ * 5. layerSchedule → per-layer type array (preset string or explicit array)
29
+ */
30
+ export declare function resolveModelConfig(options: MambaSessionOptions, vocabSize: number): HybridMambaModelConfig;
31
+ //# sourceMappingURL=presets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presets.d.ts","sourceRoot":"","sources":["../../src/session/presets.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAC;AACzG,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAIxD;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,sBAAsB,CAAC,CAKzE,CAAC;AAMF,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,OAAO,CAAC;AAEpD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAChC,QAAQ,EAAK,SAAS,EAAE,GAAG,mBAAmB,GAAG,SAAS,EAC1D,SAAS,EAAI,MAAM,EACnB,WAAW,EAAE,SAAS,GACvB,SAAS,EAAE,CAkBb;AAID;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAC9B,OAAO,EAAI,mBAAmB,EAC9B,SAAS,EAAE,MAAM,GAClB,sBAAsB,CAiDxB"}