@tryhamster/gerbil 1.0.0-rc.9 → 1.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.
- package/LICENSE +1 -1
- package/README.md +247 -84
- package/dist/architectures-C1I5V3Dt.mjs +6070 -0
- package/dist/architectures-C1I5V3Dt.mjs.map +1 -0
- package/dist/browser/index.d.ts +264 -588
- package/dist/browser/index.d.ts.map +1 -1
- package/dist/browser/index.js +585 -2334
- package/dist/browser/index.js.map +1 -1
- package/dist/cli.mjs +625 -1098
- package/dist/cli.mjs.map +1 -1
- package/dist/defaults-9komdrbY.mjs +24 -0
- package/dist/defaults-9komdrbY.mjs.map +1 -0
- package/dist/frameworks/express.d.mts +1 -3
- package/dist/frameworks/express.d.mts.map +1 -1
- package/dist/frameworks/express.mjs +7 -7
- package/dist/frameworks/express.mjs.map +1 -1
- package/dist/frameworks/fastify.d.mts +1 -1
- package/dist/frameworks/fastify.d.mts.map +1 -1
- package/dist/frameworks/fastify.mjs +3 -3
- package/dist/frameworks/fastify.mjs.map +1 -1
- package/dist/frameworks/hono.d.mts +1 -1
- package/dist/frameworks/hono.d.mts.map +1 -1
- package/dist/frameworks/hono.mjs +4 -4
- package/dist/frameworks/hono.mjs.map +1 -1
- package/dist/frameworks/next.d.mts +3 -2
- package/dist/frameworks/next.d.mts.map +1 -1
- package/dist/frameworks/next.mjs +4 -4
- package/dist/frameworks/next.mjs.map +1 -1
- package/dist/frameworks/react.d.mts +1 -1
- package/dist/frameworks/trpc.d.mts +1 -1
- package/dist/frameworks/trpc.d.mts.map +1 -1
- package/dist/frameworks/trpc.mjs +4 -4
- package/dist/frameworks/trpc.mjs.map +1 -1
- package/dist/gerbil-BHrJJIa4.mjs +1656 -0
- package/dist/gerbil-BHrJJIa4.mjs.map +1 -0
- package/dist/gerbil-BT9fCydo.d.mts +488 -0
- package/dist/gerbil-BT9fCydo.d.mts.map +1 -0
- package/dist/gerbil-DomNfIr1.mjs +4 -0
- package/dist/gpu/hooks.d.mts +520 -0
- package/dist/gpu/hooks.d.mts.map +1 -0
- package/dist/gpu/hooks.mjs +1188 -0
- package/dist/gpu/hooks.mjs.map +1 -0
- package/dist/gpu/index.d.mts +2 -0
- package/dist/gpu/index.mjs +6 -0
- package/dist/gpu-33qCAtHW.mjs +3615 -0
- package/dist/gpu-33qCAtHW.mjs.map +1 -0
- package/dist/index-Dgmb2kE3.d.mts +245 -0
- package/dist/index-Dgmb2kE3.d.mts.map +1 -0
- package/dist/index-jEAL2s-A.d.mts +2022 -0
- package/dist/index-jEAL2s-A.d.mts.map +1 -0
- package/dist/index.d.mts +22 -487
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +13 -8
- package/dist/index.mjs.map +1 -1
- package/dist/indexeddb-store-BWIMtxxH.mjs +103 -0
- package/dist/indexeddb-store-BWIMtxxH.mjs.map +1 -0
- package/dist/indexeddb-store-ClH12Xnl.mjs +4 -0
- package/dist/integrations/ai-sdk.d.mts +75 -6
- package/dist/integrations/ai-sdk.d.mts.map +1 -1
- package/dist/integrations/ai-sdk.mjs +131 -15
- package/dist/integrations/ai-sdk.mjs.map +1 -1
- package/dist/integrations/langchain.d.mts +1 -1
- package/dist/integrations/langchain.d.mts.map +1 -1
- package/dist/integrations/langchain.mjs +5 -5
- package/dist/integrations/langchain.mjs.map +1 -1
- package/dist/integrations/llamaindex.d.mts +1 -1
- package/dist/integrations/llamaindex.d.mts.map +1 -1
- package/dist/integrations/llamaindex.mjs +5 -5
- package/dist/integrations/llamaindex.mjs.map +1 -1
- package/dist/integrations/mcp-client.mjs +3 -3
- package/dist/integrations/mcp-client.mjs.map +1 -1
- package/dist/integrations/mcp.d.mts +3 -2
- package/dist/integrations/mcp.d.mts.map +1 -1
- package/dist/integrations/mcp.mjs +5 -5
- package/dist/{mcp-BvbriaBy.mjs → mcp-1DaMsaBc.mjs} +4 -4
- package/dist/mcp-1DaMsaBc.mjs.map +1 -0
- package/dist/memory/index.d.mts +3 -0
- package/dist/memory/index.mjs +6 -0
- package/dist/memory-D1P7Tmda.mjs +4 -0
- package/dist/memory-DVN0MnIG.mjs +132 -0
- package/dist/memory-DVN0MnIG.mjs.map +1 -0
- package/dist/memory-Dj0J1v88.mjs +294 -0
- package/dist/memory-Dj0J1v88.mjs.map +1 -0
- package/dist/moonshine-stt-BLyVoRpB.mjs +4 -0
- package/dist/moonshine-stt-v_P_Ci_m.mjs +11936 -0
- package/dist/moonshine-stt-v_P_Ci_m.mjs.map +1 -0
- package/dist/{one-liner-s-lD8rCC.mjs → one-liner-DnQn7HJK.mjs} +14 -16
- package/dist/one-liner-DnQn7HJK.mjs.map +1 -0
- package/dist/repl-jV5gcJFA.mjs +9 -0
- package/dist/skills/index.d.mts +270 -320
- package/dist/skills/index.d.mts.map +1 -1
- package/dist/skills/index.mjs +5 -5
- package/dist/{skills-CD3Orlex.mjs → skills-DX8D59UH.mjs} +187 -32
- package/dist/skills-DX8D59UH.mjs.map +1 -0
- package/dist/{tools-Bi1P7Xoy.mjs → tools-DQ1mPUw5.mjs} +34 -22
- package/dist/tools-DQ1mPUw5.mjs.map +1 -0
- package/dist/{types-CiTc7ez3.d.mts → types-D6FiR_oh.d.mts} +106 -12
- package/dist/types-D6FiR_oh.d.mts.map +1 -0
- package/dist/types-DQBe2lFo.d.mts +165 -0
- package/dist/types-DQBe2lFo.d.mts.map +1 -0
- package/dist/{utils-CZBZ8dgR.mjs → utils-DKO55ZmZ.mjs} +1 -1
- package/dist/{utils-CZBZ8dgR.mjs.map → utils-DKO55ZmZ.mjs.map} +1 -1
- package/dist/vector-B0panuy6.mjs +95 -0
- package/dist/vector-B0panuy6.mjs.map +1 -0
- package/docs/PROJECT-STATE.md +321 -0
- package/docs/adding-a-model-family.md +280 -0
- package/docs/ai-sdk.md +70 -61
- package/docs/architecture/overview.md +17 -7
- package/docs/browser.md +203 -8
- package/docs/embeddings.md +156 -0
- package/docs/gerbil-site-native-migration.md +217 -0
- package/docs/gpu-engine/architectures.md +398 -0
- package/docs/gpu-engine/ir.md +372 -0
- package/docs/gpu-engine/kernels.md +718 -0
- package/docs/gpu-engine/paper.html +1759 -0
- package/docs/gpu-engine/paper.md +2109 -0
- package/docs/gpu-engine/safetensors.md +312 -0
- package/docs/gpu-engine/tokenizer.md +302 -0
- package/docs/memory-rag.md +91 -0
- package/docs/metal-safari-intel.md +190 -0
- package/docs/mobile-failure-diagnosis.md +124 -0
- package/docs/mobile.md +99 -0
- package/docs/observability.md +230 -0
- package/docs/onnx-removal-plan.md +339 -0
- package/docs/research/autoresearch-portable.md +904 -0
- package/docs/research/dispatch-reduction-hivemind.md +84 -0
- package/docs/research/ios-safari-model-caching.md +117 -0
- package/docs/research/mobile-webgpu-speed-fusion.md +135 -0
- package/docs/research/native-stt-model-selection.md +49 -0
- package/docs/research/native-tts-model-selection.md +90 -0
- package/docs/research/native-vs-chromium-decision.md +152 -0
- package/docs/research/nemotron-mamba2-inference.md +910 -0
- package/docs/research/qwen35-multimodal.md +293 -0
- package/docs/research/qwen36-gemma4-targets.md +337 -0
- package/docs/research/sota-embedding-models.md +179 -0
- package/docs/research/sota-mobile-models-2026.md +263 -0
- package/docs/research/sota-modality-models.md +202 -0
- package/docs/research/tps-baselines.md +71 -0
- package/docs/research/webgpu-m4-reference.md +104 -0
- package/docs/site-update-plan.md +155 -0
- package/docs/structured-output.md +123 -0
- package/docs/stt.md +63 -446
- package/docs/tts.md +77 -499
- package/docs/vision.md +100 -338
- package/package.json +22 -7
- package/dist/chrome-backend-CORwaIyC.mjs +0 -1212
- package/dist/chrome-backend-CORwaIyC.mjs.map +0 -1
- package/dist/chrome-backend-DIKYoWj-.mjs +0 -3
- package/dist/gerbil-CJ3ifloF.mjs +0 -4
- package/dist/gerbil-Dw4Qj77e.mjs +0 -1631
- package/dist/gerbil-Dw4Qj77e.mjs.map +0 -1
- package/dist/gerbil-qOTe1nl2.d.mts +0 -431
- package/dist/gerbil-qOTe1nl2.d.mts.map +0 -1
- package/dist/kokoro-BNTb6egA.mjs +0 -20210
- package/dist/kokoro-BNTb6egA.mjs.map +0 -1
- package/dist/kokoro-CMOGDSgT.js +0 -20212
- package/dist/kokoro-CMOGDSgT.js.map +0 -1
- package/dist/mcp-BvbriaBy.mjs.map +0 -1
- package/dist/one-liner-s-lD8rCC.mjs.map +0 -1
- package/dist/repl-DveXw36T.mjs +0 -9
- package/dist/skills-CD3Orlex.mjs.map +0 -1
- package/dist/stt-Bu-E23Sc.js +0 -433
- package/dist/stt-Bu-E23Sc.js.map +0 -1
- package/dist/stt-CpLYbGFd.mjs +0 -433
- package/dist/stt-CpLYbGFd.mjs.map +0 -1
- package/dist/stt-DRPLEEHB.mjs +0 -3
- package/dist/tools-Bi1P7Xoy.mjs.map +0 -1
- package/dist/transformers.web-DiD1gTwk.js +0 -44695
- package/dist/transformers.web-DiD1gTwk.js.map +0 -1
- package/dist/transformers.web-u34VxRFM.js +0 -3
- package/dist/tts-CqroPaSK.js +0 -724
- package/dist/tts-CqroPaSK.js.map +0 -1
- package/dist/tts-DXgsKGCe.mjs +0 -3
- package/dist/tts-DeGANMNV.mjs +0 -730
- package/dist/tts-DeGANMNV.mjs.map +0 -1
- package/dist/types-CiTc7ez3.d.mts.map +0 -1
- /package/dist/{auto-update-S9s5-g0C.mjs → auto-update-BVaLXcDE.mjs} +0 -0
- /package/dist/{chunk-CkXuGtQK.mjs → chunk-B9cbKln6.mjs} +0 -0
- /package/dist/{microphone-DaMZFRuR.mjs → microphone-Bqmoz9_K.mjs} +0 -0
|
@@ -0,0 +1,520 @@
|
|
|
1
|
+
import { c as MemorySearchResult, d as RecallOptions, f as RecallResult, m as SearchOptions, s as MemoryRecord, t as AddOptions } from "../types-DQBe2lFo.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/browser/use-engine.d.ts
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* React hook for native WebGPU inference in the browser.
|
|
7
|
+
*
|
|
8
|
+
* Uses gerbil's WebGPUEngine directly on the main thread — no web worker,
|
|
9
|
+
* no ONNX Runtime, no transformers.js. Pure WGSL compute shaders.
|
|
10
|
+
*
|
|
11
|
+
* Handles the full engine lifecycle for you:
|
|
12
|
+
* - loads the model (lazily or on mount),
|
|
13
|
+
* - hot-swaps when you change `model`/`dtype`/`enableVision`/`embedding`,
|
|
14
|
+
* - SHARES one engine across every component that asks for the same config
|
|
15
|
+
* (reference-counted) so you never upload the same weights to the GPU twice,
|
|
16
|
+
* - disposes when the last consumer unmounts.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```tsx
|
|
20
|
+
* import { useEngine } from "@tryhamster/gerbil/browser";
|
|
21
|
+
*
|
|
22
|
+
* function App() {
|
|
23
|
+
* const { complete, completion, isLoading, isGenerating, tps } = useEngine({
|
|
24
|
+
* model: "mlx-community/Qwen3.5-0.8B-4bit",
|
|
25
|
+
* autoLoad: true,
|
|
26
|
+
* });
|
|
27
|
+
*
|
|
28
|
+
* if (isLoading) return <div>Loading model...</div>;
|
|
29
|
+
* return (
|
|
30
|
+
* <div>
|
|
31
|
+
* <button onClick={() => complete("What is 2+2?")}>Generate</button>
|
|
32
|
+
* <p>{completion}</p>
|
|
33
|
+
* {isGenerating && <span>{tps?.toFixed(1)} tok/s</span>}
|
|
34
|
+
* </div>
|
|
35
|
+
* );
|
|
36
|
+
* }
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
/** A single conversation turn (matches the engine's chat message shape). */
|
|
40
|
+
interface ChatMessage {
|
|
41
|
+
role: "system" | "user" | "assistant";
|
|
42
|
+
content: string;
|
|
43
|
+
}
|
|
44
|
+
type EngineErrorKind = "no-webgpu" | "no-adapter" | "device-lost" | "oom" | "network" | "timeout" | "unknown";
|
|
45
|
+
interface UseEngineOptions {
|
|
46
|
+
/**
|
|
47
|
+
* HuggingFace repo ID (e.g., "mlx-community/Qwen3.5-0.8B-4bit"). Optional —
|
|
48
|
+
* defaults to the built-in model for the requested capability (text, vision,
|
|
49
|
+
* or embeddings).
|
|
50
|
+
*/
|
|
51
|
+
model?: string;
|
|
52
|
+
/** Max sequence length (default: auto — 2048 on mobile, 4096 on desktop). */
|
|
53
|
+
maxSeqLen?: number;
|
|
54
|
+
/**
|
|
55
|
+
* Weight dtype. Default "auto": int4 on mobile (fits device memory), the
|
|
56
|
+
* repo's native precision on desktop. Already-quantized repos stay q4.
|
|
57
|
+
*/
|
|
58
|
+
dtype?: "auto" | "f32" | "q4";
|
|
59
|
+
/** Auto-load the model on mount (default: false). */
|
|
60
|
+
autoLoad?: boolean;
|
|
61
|
+
/** Build the vision encoder so `describeImage()` works (vision checkpoints only). */
|
|
62
|
+
enableVision?: boolean;
|
|
63
|
+
/** Load as an embedding model so `embed()`/`similarity()` work. */
|
|
64
|
+
embedding?: boolean;
|
|
65
|
+
/** Loading timeout in ms (default: 300000 = 5 minutes). */
|
|
66
|
+
loadingTimeout?: number;
|
|
67
|
+
/** Called when the engine is ready. */
|
|
68
|
+
onReady?: () => void;
|
|
69
|
+
/** Called on error, with a coarse error kind for UI messaging. */
|
|
70
|
+
onError?: (error: Error, kind: EngineErrorKind) => void;
|
|
71
|
+
}
|
|
72
|
+
interface CompleteOptions {
|
|
73
|
+
/** Max tokens to generate (default: 256). */
|
|
74
|
+
maxTokens?: number;
|
|
75
|
+
/** Temperature (0 = greedy, default: 0.7). */
|
|
76
|
+
temperature?: number;
|
|
77
|
+
/** System prompt. */
|
|
78
|
+
system?: string;
|
|
79
|
+
/** Stop sequences. */
|
|
80
|
+
stopSequences?: string[];
|
|
81
|
+
}
|
|
82
|
+
interface DescribeImageOptions extends CompleteOptions {
|
|
83
|
+
/** Override the maximum tokens generated for the description. */
|
|
84
|
+
maxTokens?: number;
|
|
85
|
+
}
|
|
86
|
+
/** Validator for {@link UseEngineReturn.generateObject}: a schema object or predicate. */
|
|
87
|
+
type ObjectValidator<T = unknown> = {
|
|
88
|
+
required?: string[];
|
|
89
|
+
properties?: Record<string, unknown>;
|
|
90
|
+
[key: string]: unknown;
|
|
91
|
+
} | ((o: T) => boolean);
|
|
92
|
+
interface GenerateObjectOptions extends CompleteOptions {
|
|
93
|
+
/**
|
|
94
|
+
* Validation target. Either a predicate `(o) => boolean` or a minimal
|
|
95
|
+
* JSON-schema-ish object with `required` keys. Omit to require valid JSON only.
|
|
96
|
+
*/
|
|
97
|
+
schema?: ObjectValidator;
|
|
98
|
+
/** Max retries after the first attempt (default: 4). */
|
|
99
|
+
maxRetries?: number;
|
|
100
|
+
}
|
|
101
|
+
interface UseEngineReturn {
|
|
102
|
+
/** Generate a completion for a prompt. Returns the full text. */
|
|
103
|
+
complete: (prompt: string | ChatMessage[], options?: CompleteOptions) => Promise<string>;
|
|
104
|
+
/**
|
|
105
|
+
* Describe an image (image-in → text-out). Requires `enableVision: true`.
|
|
106
|
+
* `image` may be a data/http(s) URL or pre-decoded RGB pixels.
|
|
107
|
+
*/
|
|
108
|
+
describeImage: (image: string | {
|
|
109
|
+
pixels: Uint8ClampedArray | Uint8Array | Float32Array;
|
|
110
|
+
width: number;
|
|
111
|
+
height: number;
|
|
112
|
+
}, prompt?: string, options?: DescribeImageOptions) => Promise<string>;
|
|
113
|
+
/**
|
|
114
|
+
* Generate a structured object: generate → parse JSON → validate → retry
|
|
115
|
+
* until valid. Returns the parsed object plus the attempt count.
|
|
116
|
+
*/
|
|
117
|
+
generateObject: <T = unknown>(prompt: string, options?: GenerateObjectOptions) => Promise<{
|
|
118
|
+
object: T;
|
|
119
|
+
attempts: number;
|
|
120
|
+
}>;
|
|
121
|
+
/** Embed text into an L2-normalized vector. Requires `embedding: true`. */
|
|
122
|
+
embed: (text: string, options?: {
|
|
123
|
+
taskType?: "query" | "document";
|
|
124
|
+
}) => Promise<Float32Array>;
|
|
125
|
+
/** Cosine similarity between two texts. Requires `embedding: true`. */
|
|
126
|
+
similarity: (a: string, b: string) => Promise<number>;
|
|
127
|
+
/** Current completion text (streams in token by token). */
|
|
128
|
+
completion: string;
|
|
129
|
+
/** Whether the model is loading. */
|
|
130
|
+
isLoading: boolean;
|
|
131
|
+
/** Loading progress info. */
|
|
132
|
+
loadingProgress: {
|
|
133
|
+
status: string;
|
|
134
|
+
progress?: number;
|
|
135
|
+
} | null;
|
|
136
|
+
/** Whether generation is in progress. */
|
|
137
|
+
isGenerating: boolean;
|
|
138
|
+
/** Current tokens per second. */
|
|
139
|
+
tps: number | null;
|
|
140
|
+
/** Attempts taken by the last `generateObject` call (0 until one runs). */
|
|
141
|
+
attempts: number;
|
|
142
|
+
/** Current error message. */
|
|
143
|
+
error: string | null;
|
|
144
|
+
/** Coarse error kind, for tailored UI messaging. */
|
|
145
|
+
errorKind: EngineErrorKind | null;
|
|
146
|
+
/** Whether the engine is ready. */
|
|
147
|
+
isReady: boolean;
|
|
148
|
+
/** Manually load the model. */
|
|
149
|
+
load: () => Promise<void>;
|
|
150
|
+
/** Stop current generation. */
|
|
151
|
+
stop: () => void;
|
|
152
|
+
/** Release this consumer's hold on the engine (disposes when no holders remain). */
|
|
153
|
+
dispose: () => void;
|
|
154
|
+
}
|
|
155
|
+
declare function useEngine(options?: UseEngineOptions): UseEngineReturn;
|
|
156
|
+
//#endregion
|
|
157
|
+
//#region src/browser/use-memory.d.ts
|
|
158
|
+
interface UseMemoryOptions {
|
|
159
|
+
/** Embedding model repo (default: the built-in EmbeddingGemma). */
|
|
160
|
+
model?: string;
|
|
161
|
+
/** IndexedDB database name — use distinct names to isolate memories. */
|
|
162
|
+
namespace?: string;
|
|
163
|
+
}
|
|
164
|
+
interface UseMemoryReturn {
|
|
165
|
+
/** Store text (optionally chunked + tagged). Returns the new record id(s). */
|
|
166
|
+
add: (text: string, options?: AddOptions) => Promise<string[]>;
|
|
167
|
+
/** Retrieve a token-budgeted context block for a query. */
|
|
168
|
+
recall: (query: string, options?: RecallOptions) => Promise<RecallResult>;
|
|
169
|
+
/** Rank stored entries by similarity to a query. */
|
|
170
|
+
search: (query: string, options?: SearchOptions) => Promise<MemorySearchResult[]>;
|
|
171
|
+
/** Get a single record by id. */
|
|
172
|
+
get: (id: string) => Promise<MemoryRecord | undefined>;
|
|
173
|
+
/** Delete a record by id. */
|
|
174
|
+
remove: (id: string) => Promise<boolean>;
|
|
175
|
+
/** Clear all memories in this namespace. */
|
|
176
|
+
clear: () => Promise<void>;
|
|
177
|
+
/** Number of stored records. */
|
|
178
|
+
size: () => Promise<number>;
|
|
179
|
+
/** Whether the embedding model is downloading. */
|
|
180
|
+
isLoading: boolean;
|
|
181
|
+
loadingProgress: {
|
|
182
|
+
status: string;
|
|
183
|
+
progress?: number;
|
|
184
|
+
} | null;
|
|
185
|
+
/** Whether memory is ready (the embedding model has loaded). */
|
|
186
|
+
isReady: boolean;
|
|
187
|
+
error: string | null;
|
|
188
|
+
}
|
|
189
|
+
declare function useMemory(options?: UseMemoryOptions): UseMemoryReturn;
|
|
190
|
+
//#endregion
|
|
191
|
+
//#region src/browser/use-modalities.d.ts
|
|
192
|
+
/** Options common to the modality hooks (the capability flag is set for you). */
|
|
193
|
+
type ModalityOptions = Omit<UseEngineOptions, "enableVision" | "embedding">;
|
|
194
|
+
interface UseTextReturn {
|
|
195
|
+
complete: (prompt: string, options?: CompleteOptions) => Promise<string>;
|
|
196
|
+
completion: string;
|
|
197
|
+
isLoading: boolean;
|
|
198
|
+
loadingProgress: {
|
|
199
|
+
status: string;
|
|
200
|
+
progress?: number;
|
|
201
|
+
} | null;
|
|
202
|
+
isGenerating: boolean;
|
|
203
|
+
tps: number | null;
|
|
204
|
+
error: string | null;
|
|
205
|
+
errorKind: EngineErrorKind | null;
|
|
206
|
+
isReady: boolean;
|
|
207
|
+
load: () => Promise<void>;
|
|
208
|
+
stop: () => void;
|
|
209
|
+
dispose: () => void;
|
|
210
|
+
}
|
|
211
|
+
/** Text generation. */
|
|
212
|
+
declare function useText(options?: ModalityOptions): UseTextReturn;
|
|
213
|
+
interface UseObjectReturn<T = unknown> {
|
|
214
|
+
/** The last successfully parsed + validated object (null until one is produced). */
|
|
215
|
+
object: T | null;
|
|
216
|
+
/**
|
|
217
|
+
* Generate, parse JSON, validate against `schema`, and retry until valid.
|
|
218
|
+
* Loads the model first if needed. Returns the parsed object.
|
|
219
|
+
*/
|
|
220
|
+
generate: (prompt: string, options?: GenerateObjectOptions) => Promise<T>;
|
|
221
|
+
/** Attempts the last `generate` call took (1 = first try). */
|
|
222
|
+
attempts: number;
|
|
223
|
+
isLoading: boolean;
|
|
224
|
+
loadingProgress: {
|
|
225
|
+
status: string;
|
|
226
|
+
progress?: number;
|
|
227
|
+
} | null;
|
|
228
|
+
isGenerating: boolean;
|
|
229
|
+
error: string | null;
|
|
230
|
+
errorKind: EngineErrorKind | null;
|
|
231
|
+
isReady: boolean;
|
|
232
|
+
load: () => Promise<void>;
|
|
233
|
+
stop: () => void;
|
|
234
|
+
dispose: () => void;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Structured-output generation — generate, parse JSON, validate, and RETRY
|
|
238
|
+
* until valid. On-device tokens are free, so re-rolling malformed JSON is cheap.
|
|
239
|
+
*
|
|
240
|
+
* ```tsx
|
|
241
|
+
* const { object, generate, isGenerating } = useObject<{ name: string; age: number }>();
|
|
242
|
+
* await generate('Extract {name, age} from: "I am Sarah, 28"', {
|
|
243
|
+
* schema: { required: ["name", "age"] },
|
|
244
|
+
* });
|
|
245
|
+
* // object === { name: "Sarah", age: 28 }
|
|
246
|
+
* ```
|
|
247
|
+
*/
|
|
248
|
+
declare function useObject<T = unknown>(options?: ModalityOptions): UseObjectReturn<T>;
|
|
249
|
+
interface UseVisionReturn {
|
|
250
|
+
describeImage: UseEngineReturnLike["describeImage"];
|
|
251
|
+
completion: string;
|
|
252
|
+
isLoading: boolean;
|
|
253
|
+
loadingProgress: {
|
|
254
|
+
status: string;
|
|
255
|
+
progress?: number;
|
|
256
|
+
} | null;
|
|
257
|
+
isGenerating: boolean;
|
|
258
|
+
tps: number | null;
|
|
259
|
+
error: string | null;
|
|
260
|
+
errorKind: EngineErrorKind | null;
|
|
261
|
+
isReady: boolean;
|
|
262
|
+
load: () => Promise<void>;
|
|
263
|
+
stop: () => void;
|
|
264
|
+
dispose: () => void;
|
|
265
|
+
}
|
|
266
|
+
type UseEngineReturnLike = ReturnType<typeof useEngine>;
|
|
267
|
+
/** Image understanding (image in → text out). Builds the vision tower. */
|
|
268
|
+
declare function useVision(options?: ModalityOptions): UseVisionReturn;
|
|
269
|
+
interface UseEmbeddingReturn {
|
|
270
|
+
embed: UseEngineReturnLike["embed"];
|
|
271
|
+
similarity: UseEngineReturnLike["similarity"];
|
|
272
|
+
isLoading: boolean;
|
|
273
|
+
loadingProgress: {
|
|
274
|
+
status: string;
|
|
275
|
+
progress?: number;
|
|
276
|
+
} | null;
|
|
277
|
+
error: string | null;
|
|
278
|
+
errorKind: EngineErrorKind | null;
|
|
279
|
+
isReady: boolean;
|
|
280
|
+
load: () => Promise<void>;
|
|
281
|
+
dispose: () => void;
|
|
282
|
+
}
|
|
283
|
+
/** Text embeddings + similarity. */
|
|
284
|
+
declare function useEmbedding(options?: ModalityOptions): UseEmbeddingReturn;
|
|
285
|
+
interface UseChatOptions extends ModalityOptions {
|
|
286
|
+
/** System prompt prepended to every turn. */
|
|
287
|
+
system?: string;
|
|
288
|
+
}
|
|
289
|
+
/** Chat lifecycle status (mirrors the Vercel AI SDK's `useChat` status). */
|
|
290
|
+
type ChatStatus = "ready" | "submitted" | "streaming" | "error";
|
|
291
|
+
interface UseChatReturn {
|
|
292
|
+
/** The running conversation (user + assistant turns). */
|
|
293
|
+
messages: ChatMessage[];
|
|
294
|
+
/** Send a user message; the assistant reply streams in and is returned. */
|
|
295
|
+
send: (text: string, options?: CompleteOptions) => Promise<string>;
|
|
296
|
+
/** Alias of `send` (AI SDK-compatible name). */
|
|
297
|
+
sendMessage: (text: string, options?: CompleteOptions) => Promise<string>;
|
|
298
|
+
/** Re-run the last user turn (drops the previous assistant reply). */
|
|
299
|
+
regenerate: (options?: CompleteOptions) => Promise<string>;
|
|
300
|
+
/** Replace the conversation (value or updater). */
|
|
301
|
+
setMessages: (next: ChatMessage[] | ((prev: ChatMessage[]) => ChatMessage[])) => void;
|
|
302
|
+
/** Clear the conversation. */
|
|
303
|
+
clear: () => void;
|
|
304
|
+
/** Coarse lifecycle status: ready → submitted → streaming (→ error). */
|
|
305
|
+
status: ChatStatus;
|
|
306
|
+
isGenerating: boolean;
|
|
307
|
+
isLoading: boolean;
|
|
308
|
+
loadingProgress: {
|
|
309
|
+
status: string;
|
|
310
|
+
progress?: number;
|
|
311
|
+
} | null;
|
|
312
|
+
isReady: boolean;
|
|
313
|
+
tps: number | null;
|
|
314
|
+
error: string | null;
|
|
315
|
+
errorKind: EngineErrorKind | null;
|
|
316
|
+
stop: () => void;
|
|
317
|
+
load: () => Promise<void>;
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Conversational chat hook — manages the message list and streams replies.
|
|
321
|
+
* Multi-turn context is handled for you (the full history is sent each turn).
|
|
322
|
+
*
|
|
323
|
+
* ```tsx
|
|
324
|
+
* const { messages, send, isGenerating } = useChat();
|
|
325
|
+
* <button onClick={() => send("Hello!")}>Send</button>
|
|
326
|
+
* ```
|
|
327
|
+
*/
|
|
328
|
+
declare function useChat(options?: UseChatOptions): UseChatReturn;
|
|
329
|
+
interface UseCompletionReturn {
|
|
330
|
+
/** The streamed completion text. */
|
|
331
|
+
completion: string;
|
|
332
|
+
/** Generate a completion for a prompt (loads the model if needed). */
|
|
333
|
+
complete: (prompt: string, options?: CompleteOptions) => Promise<string>;
|
|
334
|
+
/** Controlled input value (AI SDK-style). */
|
|
335
|
+
input: string;
|
|
336
|
+
setInput: (value: string) => void;
|
|
337
|
+
handleInputChange: (e: {
|
|
338
|
+
target: {
|
|
339
|
+
value: string;
|
|
340
|
+
};
|
|
341
|
+
}) => void;
|
|
342
|
+
handleSubmit: (e?: {
|
|
343
|
+
preventDefault?: () => void;
|
|
344
|
+
}) => void;
|
|
345
|
+
isLoading: boolean;
|
|
346
|
+
isReady: boolean;
|
|
347
|
+
loadingProgress: {
|
|
348
|
+
status: string;
|
|
349
|
+
progress?: number;
|
|
350
|
+
} | null;
|
|
351
|
+
stop: () => void;
|
|
352
|
+
error: string | null;
|
|
353
|
+
load: () => Promise<void>;
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Single-prompt streaming completion with built-in input state — a near
|
|
357
|
+
* drop-in for the Vercel AI SDK's `useCompletion`, running on-device.
|
|
358
|
+
*/
|
|
359
|
+
declare function useCompletion(options?: ModalityOptions): UseCompletionReturn;
|
|
360
|
+
//#endregion
|
|
361
|
+
//#region src/browser/use-stt.d.ts
|
|
362
|
+
/**
|
|
363
|
+
* React hook for native speech-to-text in the browser.
|
|
364
|
+
*
|
|
365
|
+
* Wraps `MoonshineSTT` — raw 16 kHz mono PCM in, transcript out (encoder-decoder
|
|
366
|
+
* ASR, no streaming/partial API). This hook captures mic audio between
|
|
367
|
+
* start/stop, resamples it to 16 kHz mono, and runs a single transcribe() on the
|
|
368
|
+
* finalized utterance. The GPU engine is dynamically imported so it stays out of
|
|
369
|
+
* the main bundle until STT is actually used.
|
|
370
|
+
*
|
|
371
|
+
* @example
|
|
372
|
+
* ```tsx
|
|
373
|
+
* import { useSTT } from "@tryhamster/gerbil/gpu/hooks";
|
|
374
|
+
*
|
|
375
|
+
* const { startRecording, stopRecording, transcript, isRecording } = useSTT();
|
|
376
|
+
* ```
|
|
377
|
+
*/
|
|
378
|
+
interface UseSTTOptions {
|
|
379
|
+
/** HF repo for the STT model (default: the built-in Moonshine). */
|
|
380
|
+
repo?: string;
|
|
381
|
+
/** Auto-load the model on mount (default: false — loads on first record). */
|
|
382
|
+
autoLoad?: boolean;
|
|
383
|
+
onReady?: () => void;
|
|
384
|
+
onError?: (error: Error) => void;
|
|
385
|
+
}
|
|
386
|
+
interface UseSTTReturn {
|
|
387
|
+
load: () => Promise<void>;
|
|
388
|
+
startRecording: () => Promise<void>;
|
|
389
|
+
stopRecording: () => Promise<void>;
|
|
390
|
+
dispose: () => void;
|
|
391
|
+
isLoading: boolean;
|
|
392
|
+
loadingProgress: {
|
|
393
|
+
status: string;
|
|
394
|
+
progress?: number;
|
|
395
|
+
} | null;
|
|
396
|
+
isReady: boolean;
|
|
397
|
+
isRecording: boolean;
|
|
398
|
+
isTranscribing: boolean;
|
|
399
|
+
transcript: string;
|
|
400
|
+
audioSeconds: number | null;
|
|
401
|
+
error: string | null;
|
|
402
|
+
}
|
|
403
|
+
declare function useSTT(options?: UseSTTOptions): UseSTTReturn;
|
|
404
|
+
//#endregion
|
|
405
|
+
//#region src/browser/use-tts.d.ts
|
|
406
|
+
/**
|
|
407
|
+
* React hook for native text-to-speech in the browser.
|
|
408
|
+
*
|
|
409
|
+
* Wraps the engine's `speak()` (Kani-TTS-2) — the codec-LM backbone emits
|
|
410
|
+
* NanoCodec audio tokens, the NanoCodec decoder turns them into 22.05 kHz mono
|
|
411
|
+
* PCM, and this hook plays it through the Web Audio API (and keeps the clip for
|
|
412
|
+
* instant replay). The GPU engine is dynamically imported so it stays out of the
|
|
413
|
+
* main bundle until TTS is actually used.
|
|
414
|
+
*
|
|
415
|
+
* @example
|
|
416
|
+
* ```tsx
|
|
417
|
+
* import { useTTS } from "@tryhamster/gerbil/gpu/hooks";
|
|
418
|
+
*
|
|
419
|
+
* const { speak, isSynthesizing, isPlaying } = useTTS();
|
|
420
|
+
* <button onClick={() => speak("Hello from on-device TTS.")}>Speak</button>
|
|
421
|
+
* ```
|
|
422
|
+
*/
|
|
423
|
+
/**
|
|
424
|
+
* Built-in voices. Kani-TTS-2-en takes an `en_us`-style language tag prepended
|
|
425
|
+
* to the text; the English checkpoint ships the US-English voice.
|
|
426
|
+
*/
|
|
427
|
+
declare const KANI_VOICES: readonly [{
|
|
428
|
+
readonly value: "en_us";
|
|
429
|
+
readonly label: "English (US)";
|
|
430
|
+
}];
|
|
431
|
+
type KaniVoice = (typeof KANI_VOICES)[number]["value"];
|
|
432
|
+
interface SpeakOptions {
|
|
433
|
+
/** Language/accent tag, e.g. "en_us". Prepended as "{tag}: {text}". */
|
|
434
|
+
voice?: string;
|
|
435
|
+
/** Sampling temperature (default 1.0). Higher = more expressive/varied. */
|
|
436
|
+
temperature?: number;
|
|
437
|
+
/** Top-p nucleus threshold (default 0.95). */
|
|
438
|
+
topP?: number;
|
|
439
|
+
/** Repetition penalty (default 1.1). */
|
|
440
|
+
repetitionPenalty?: number;
|
|
441
|
+
}
|
|
442
|
+
interface UseTTSOptions {
|
|
443
|
+
/** HF repo for the TTS model (default: the built-in Kani-TTS-2). */
|
|
444
|
+
repo?: string;
|
|
445
|
+
/** Auto-load the model on mount (default: false — loads on first speak). */
|
|
446
|
+
autoLoad?: boolean;
|
|
447
|
+
onReady?: () => void;
|
|
448
|
+
onError?: (error: Error) => void;
|
|
449
|
+
}
|
|
450
|
+
interface UseTTSReturn {
|
|
451
|
+
load: () => Promise<void>;
|
|
452
|
+
/** Synthesize + play `text`. Lazily loads the model on first call. */
|
|
453
|
+
speak: (text: string, options?: SpeakOptions) => Promise<void>;
|
|
454
|
+
/** Replay the most recently synthesized clip (no re-synthesis). */
|
|
455
|
+
replay: () => Promise<void>;
|
|
456
|
+
/** Stop any in-progress playback. */
|
|
457
|
+
stop: () => void;
|
|
458
|
+
dispose: () => void;
|
|
459
|
+
isLoading: boolean;
|
|
460
|
+
loadingProgress: {
|
|
461
|
+
status: string;
|
|
462
|
+
progress?: number;
|
|
463
|
+
} | null;
|
|
464
|
+
isReady: boolean;
|
|
465
|
+
/** Synthesizing PCM (running the codec-LM + NanoCodec). */
|
|
466
|
+
isSynthesizing: boolean;
|
|
467
|
+
/** Audio is currently playing. */
|
|
468
|
+
isPlaying: boolean;
|
|
469
|
+
/** True once a clip has been synthesized and is available for replay. */
|
|
470
|
+
hasAudio: boolean;
|
|
471
|
+
/** Duration (seconds) of the last synthesized clip. */
|
|
472
|
+
audioSeconds: number | null;
|
|
473
|
+
/** Real-time factor of the last synthesis (audio-sec per wall-sec). */
|
|
474
|
+
rtf: number | null;
|
|
475
|
+
error: string | null;
|
|
476
|
+
}
|
|
477
|
+
declare function useTTS(options?: UseTTSOptions): UseTTSReturn;
|
|
478
|
+
//#endregion
|
|
479
|
+
//#region src/browser/use-voice-chat.d.ts
|
|
480
|
+
interface UseVoiceChatOptions extends UseChatOptions {
|
|
481
|
+
/** Speech-to-text model repo (default: built-in Moonshine). */
|
|
482
|
+
sttModel?: string;
|
|
483
|
+
/** Text-to-speech model repo (default: built-in Kani-TTS-2). */
|
|
484
|
+
ttsModel?: string;
|
|
485
|
+
/** Voice for spoken replies (e.g. "en_us"). */
|
|
486
|
+
voice?: string;
|
|
487
|
+
/** Speak replies aloud (default: true). Set false for text-only. */
|
|
488
|
+
speak?: boolean;
|
|
489
|
+
}
|
|
490
|
+
interface UseVoiceChatReturn {
|
|
491
|
+
/** The running conversation. */
|
|
492
|
+
messages: ChatMessage[];
|
|
493
|
+
/** Start listening (opens the mic). */
|
|
494
|
+
start: () => Promise<void>;
|
|
495
|
+
/** Stop listening → transcribe → reply → speak. */
|
|
496
|
+
stop: () => Promise<void>;
|
|
497
|
+
/** Stop playback of the current spoken reply. */
|
|
498
|
+
stopSpeaking: () => void;
|
|
499
|
+
/** Clear the conversation. */
|
|
500
|
+
clear: () => void;
|
|
501
|
+
/** Mic is open and capturing. */
|
|
502
|
+
isListening: boolean;
|
|
503
|
+
/** Transcribing the captured audio. */
|
|
504
|
+
isTranscribing: boolean;
|
|
505
|
+
/** The model is generating a reply. */
|
|
506
|
+
isThinking: boolean;
|
|
507
|
+
/** A reply is being synthesized or played. */
|
|
508
|
+
isSpeaking: boolean;
|
|
509
|
+
/** The most recent transcribed user utterance. */
|
|
510
|
+
transcript: string;
|
|
511
|
+
/** Any model is still downloading. */
|
|
512
|
+
isLoading: boolean;
|
|
513
|
+
/** The chat model is ready. */
|
|
514
|
+
isReady: boolean;
|
|
515
|
+
error: string | null;
|
|
516
|
+
}
|
|
517
|
+
declare function useVoiceChat(options?: UseVoiceChatOptions): UseVoiceChatReturn;
|
|
518
|
+
//#endregion
|
|
519
|
+
export { type ChatMessage, type ChatStatus, type CompleteOptions, type DescribeImageOptions, type EngineErrorKind, type GenerateObjectOptions, KANI_VOICES, type KaniVoice, type ModalityOptions, type ObjectValidator, type SpeakOptions, type UseChatOptions, type UseChatReturn, type UseCompletionReturn, type UseEmbeddingReturn, type UseEngineOptions, type UseEngineReturn, type UseMemoryOptions, type UseMemoryReturn, type UseObjectReturn, type UseSTTOptions, type UseSTTReturn, type UseTTSOptions, type UseTTSReturn, type UseTextReturn, type UseVisionReturn, type UseVoiceChatOptions, type UseVoiceChatReturn, useChat, useCompletion, useEmbedding, useEngine, useMemory, useObject, useSTT, useTTS, useText, useVision, useVoiceChat };
|
|
520
|
+
//# sourceMappingURL=hooks.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.d.mts","names":[],"sources":["../../src/browser/use-engine.ts","../../src/browser/use-memory.ts","../../src/browser/use-modalities.ts","../../src/browser/use-stt.ts","../../src/browser/use-tts.ts","../../src/browser/use-voice-chat.ts"],"sourcesContent":[],"mappings":";;;;;;;AA2CA;AAKA;AASA;AA4BA;AAWA;AAMA;AAIA;AAUA;;;;;;;;;;;;;;;;;;AAiNA;;;;AC3RA;AAOA;;AAE+C,UDR9B,WAAA,CCQ8B;EAEX,IAAA,EAAA,QAAA,GAAA,MAAA,GAAA,WAAA;EAA0B,OAAA,EAAA,MAAA;;AAE1B,KDPxB,eAAA,GCOwB,WAAA,GAAA,YAAA,GAAA,aAAA,GAAA,KAAA,GAAA,SAAA,GAAA,SAAA,GAAA,SAAA;AAA0B,UDE7C,gBAAA,CCF6C;EAAR;;;;;EAQxC,KAAA,CAAA,EAAA,MAAA;EAAO;EASL,SAAA,CAAA,EAAS,MAAA;;;;AC1CzB;EAEiB,KAAA,CAAA,EAAA,MAAA,GAAa,KAAA,GAAA,IAAA;EACS;EAAoB,QAAA,CAAA,EAAA,OAAA;EAO9C;EAEC,YAAA,CAAA,EAAA,OAAA;EAAO;EAML,SAAA,CAAO,EAAA,OAAA;EAkBN;EAEP,cAAA,CAAA,EAAA,MAAA;EAK6B;EAAkC,OAAA,CAAA,EAAA,GAAA,GAAA,IAAA;EAAR;EAOpD,OAAA,CAAA,EAAA,CAAA,KAAA,EFEO,KEFP,EAAA,IAAA,EFEoB,eEFpB,EAAA,GAAA,IAAA;;AAEQ,UFGJ,eAAA,CEHI;EAiBL;EAAgC,SAAA,CAAA,EAAA,MAAA;EAAuC;EAAhB,WAAA,CAAA,EAAA,MAAA;EAAe;EA8BrE,MAAA,CAAA,EAAA,MAAA;EACA;EAOJ,aAAA,CAAA,EAAA,MAAA,EAAA;;AAEQ,UF3CJ,oBAAA,SAA6B,eE2CzB,CAAA;EAOhB;EAGW,SAAA,CAAA,EAAS,MAAA;AAkBzB;;AAEc,KFnEF,eEmEE,CAAA,IAAA,OAAA,CAAA,GAAA;EAID,QAAA,CAAA,EAAA,MAAA,EAAA;EAEC,UAAA,CAAA,EFxE0B,MEwE1B,CAAA,MAAA,EAAA,OAAA,CAAA;EAAO,CAAA,GAAA,EAAA,MAAA,CAAA,EAAA,OAAA;AAKrB,CAAA,GAAgB,CAAA,CAAA,CAAA,EF5EP,CE4EO,EAAA,GAAA,OAAY,CAAA;AAeX,UFzFA,qBAAA,SAA8B,eEyFQ,CAAA;EAM3C;AAEZ;;;EAIqD,MAAA,CAAA,EFhG1C,eEgG0C;EAEb;EAAoB,UAAA,CAAA,EAAA,MAAA;;AAEf,UF/F5B,eAAA,CE+F4B;EAEvB;EAAwB,QAAA,EAAA,CAAA,MAAA,EAAA,MAAA,GF/FhB,WE+FgB,EAAA,EAAA,OAAA,CAAA,EF/FS,eE+FT,EAAA,GF/F6B,OE+F7B,CAAA,MAAA,CAAA;EAAkB;;;;EAa3C,aAAA,EAAA,CAAA,KAAA,EAAA,MAAA,GAAA;IAYL,MAAO,EFhHL,iBEgHe,GFhHK,UEgHiB,GFhHJ,YEgHiB;IA+FnD,KAAA,EAAA,MAAA;IAIsB,MAAA,EAAA,MAAA;EAAoB,CAAA,EAAA,MAAA,CAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EFjN7C,oBEiN6C,EAAA,GFhNpD,OEgNoD,CAAA,MAAA,CAAA;EAW7C;;AAOd;;0DF3Nc,0BACP;YAAkB;IGjHR,QAAA,EAAA,MAAa;EASb,CAAA,CAAA;EACH;EACU,KAAA,EAAA,CAAA,IAAA,EAAA,MAAA,EAAA,OACM,CADN,EAAA;IACD,QAAA,CAAA,EAAA,OAAA,GAAA,UAAA;EAAO,CAAA,EAAA,GHuG4C,OGvG5C,CHuGoD,YGvGpD,CAAA;EAiCd;wCHwEwB;;;EIhH3B;EAED,SAAA,EAAA,OAAS;EAEJ;EAWA,eAAA,EAAa;IASb,MAAA,EAAA,MAAY;IACf,QAAA,CAAA,EAAA,MAAA;EAEoB,CAAA,GAAA,IAAA;EAAiB;EAEnC,YAAA,EAAA,OAAA;EAAO;EA2BP,GAAA,EAAA,MAAM,GAAA,IAAA;;;;EC7DL,KAAA,EAAA,MAAA,GAAA,IAAA;EAWA;EAEL,SAAA,ELwHC,eKxHD,GAAA,IAAA;EAEG;EAED,OAAA,EAAA,OAAA;EAAO;EAsBL,IAAA,EAAA,GAAA,GLkGF,OKlGc,CAAA,IAAA,CAAA;;;;;;iBLsQZ,SAAA,WAAmB,mBAAwB;;;AA7L7C,UC9FG,gBAAA,CD8FH;EACW;EAAlB,KAAA,CAAA,EAAA,MAAA;EAE2E;EAAR,SAAA,CAAA,EAAA,MAAA;;AAkB7D,UC5GI,eAAA,CD4GJ;EAIC;EAAO,GAAA,EAAA,CAAA,IAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EC9GW,UD8GX,EAAA,GC9G0B,OD8G1B,CAAA,MAAA,EAAA,CAAA;EAoKL;oCChRoB,kBAAkB,QAAQ;;oCAE1B,kBAAkB,QAAQ;EAb7C;EAOA,GAAA,EAAA,CAAA,EAAA,EAAA,MAAA,EAAe,GAQT,OARS,CAQD,YARC,GAAA,SAAA,CAAA;EAEA;EAAe,MAAA,EAAA,CAAA,EAAA,EAAA,MAAA,EAAA,GAQrB,OARqB,CAAA,OAAA,CAAA;EAEX;EAA0B,KAAA,EAAA,GAAA,GAQ/C,OAR+C,CAAA,IAAA,CAAA;EAAR;EAElB,IAAA,EAAA,GAAA,GAQtB,OARsB,CAAA,MAAA,CAAA;EAA0B;EAAR,SAAA,EAAA,OAAA;EAEvB,eAAA,EAAA;IAAR,MAAA,EAAA,MAAA;IAEG,QAAA,CAAA,EAAA,MAAA;EAEX,CAAA,GAAA,IAAA;EAED;EAAO,OAAA,EAAA,OAAA;EASL,KAAA,EAAA,MAAS,GAAA,IAAA;;iBAAT,SAAA,WAAmB,mBAAwB;;;;ADiElC,KE3Gb,eAAA,GAAkB,IF2GL,CE3GU,gBF2GV,EAAA,cAAA,GAAA,WAAA,CAAA;AAAlB,UEzGU,aAAA,CFyGV;EAE2E,QAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EE1G3C,eF0G2C,EAAA,GE1GvB,OF0GuB,CAAA,MAAA,CAAA;EAAR,UAAA,EAAA,MAAA;EAElC,SAAA,EAAA,OAAA;EAgB3B,eAAA,EAAA;IAIC,MAAA,EAAA,MAAA;IAAO,QAAA,CAAA,EAAA,MAAA;EAoKL,CAAA,GAAA,IAAA;;;;EC3RC,SAAA,ECFJ,eDEoB,GAAA,IAAA;EAOhB,OAAA,EAAA,OAAA;EAEe,IAAA,EAAA,GAAA,GCTlB,ODSkB,CAAA,IAAA,CAAA;EAAe,IAAA,EAAA,GAAA,GAAA,IAAA;EAEX,OAAA,EAAA,GAAA,GAAA,IAAA;;;AAEA,iBCPpB,OAAA,CDOoB,OAAA,CAAA,ECPH,eDOG,CAAA,ECPoB,aDOpB;AAA0B,UCW7C,eDX6C,CAAA,IAAA,OAAA,CAAA,CAAA;EAAR;EAEvB,MAAA,ECWrB,CDXqB,GAAA,IAAA;EAAR;;;;EAMF,QAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,OAAA,CAAA,ECUkB,qBDVlB,EAAA,GCU4C,ODV5C,CCUoD,CDVpD,CAAA;EASL;;;;IC1CJ,MAAA,EAAA,MAAe;IAEV,QAAA,CAAA,EAAA,MAAa;EACS,CAAA,GAAA,IAAA;EAAoB,YAAA,EAAA,OAAA;EAO9C,KAAA,EAAA,MAAA,GAAA,IAAA;EAEC,SAAA,EAsCD,eAtCC,GAAA,IAAA;EAAO,OAAA,EAAA,OAAA;EAML,IAAA,EAAA,GAAA,GAkCF,OAlCS,CAAA,IAAU,CAAA;EAkBhB,IAAA,EAAA,GAAA,GAAA,IAAA;EAEP,OAAA,EAAA,GAAA,GAAA,IAAA;;;;;;;AA+BV;;;;;AA8BA;;AAQa,iBAtCG,SAsCH,CAAA,IAAA,OAAA,CAAA,CAAA,OAAA,CAAA,EAtCmC,eAsCnC,CAAA,EAtC0D,eAsC1D,CAtC0E,CAsC1E,CAAA;AAEC,UAVG,eAAA,CAUH;EAAO,aAAA,EATJ,mBASI,CAAA,eAAA,CAAA;EAOhB,UAAA,EAAA,MAAA;EAGW,SAAA,EAAA,OAAS;EAkBR,eAAA,EAAA;IACR,MAAA,EAAA,MAAA;IACK,QAAA,CAAA,EAAA,MAAA;EAID,CAAA,GAAA,IAAA;EAEC,YAAA,EAAA,OAAA;EAAO,GAAA,EAAA,MAAA,GAAA,IAAA;EAKL,KAAA,EAAA,MAAA,GAAY,IAAA;EAeX,SAAA,EA1DJ,eA0DmB,GAAA,IAAQ;EAM5B,OAAA,EAAA,OAAU;EAEL,IAAA,EAAA,GAAA,GAhEH,OAgEgB,CAAA,IAAA,CAAA;EAElB,IAAA,EAAA,GAAA,GAAA,IAAA;EAEqB,OAAA,EAAA,GAAA,GAAA,IAAA;;KA7D5B,mBAAA,GAAsB,UA+Da,CAAA,OA/DK,SA+DL,CAAA;;AAEf,iBA9DT,SAAA,CA8DS,OAAA,CAAA,EA9DU,eA8DV,CAAA,EA9DiC,eA8DjC;AAAoB,UA5C5B,kBAAA,CA4C4B;EAEvB,KAAA,EA7Cb,mBA6Ca,CAAA,OAAA,CAAA;EAAwB,UAAA,EA5ChC,mBA4CgC,CAAA,YAAA,CAAA;EAAkB,SAAA,EAAA,OAAA;EAItD,eAAA,EAAA;IAOG,MAAA,EAAA,MAAA;IAEC,QAAA,CAAA,EAAA,MAAA;EAAO,CAAA,GAAA,IAAA;EAYL,KAAA,EAAA,MAAO,GAAA,IAAA;EA+FN,SAAA,EAhKJ,eAgKuB,GAAA,IAAA;EAIG,OAAA,EAAA,OAAA;EAAoB,IAAA,EAAA,GAAA,GAlK7C,OAkK6C,CAAA,IAAA,CAAA;EAW7C,OAAA,EAAA,GAAA,GAAA,IAAA;;AAOd;iBA/KgB,YAAA,WAAsB,kBAAuB;UAe5C,cAAA,SAAuB;;EC3KvB,MAAA,CAAA,EAAA,MAAA;AASjB;;AAEwB,KDsKZ,UAAA,GCtKY,OAAA,GAAA,WAAA,GAAA,WAAA,GAAA,OAAA;AACD,UDuKN,aAAA,CCvKM;EAAO;EAiCd,QAAA,EDwIJ,WCxIU,EAAU;;iCD0IC,oBAAoB;;EElLxC,WAAA,EAAA,CAAkE,IAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EFoLvC,eEpLuC,EAAA,GFoLnB,OEpLmB,CAAA,MAAA,CAAA;EAEnE;EAEK,UAAA,EAAA,CAAA,OAAY,CAAA,EFkLJ,eElLI,EAAA,GFkLgB,OElLhB,CAAA,MAAA,CAAA;EAWZ;EASA,WAAA,EAAA,CAAA,IAAY,EFgKP,WEhKO,EAAA,GAAA,CAAA,CAAA,IAAA,EFgKiB,WEhKjB,EAAA,EAAA,GFgKmC,WEhKnC,EAAA,CAAA,EAAA,GAAA,IAAA;EACf;EAEoB,KAAA,EAAA,GAAA,GAAA,IAAA;EAAiB;EAEnC,MAAA,EF+JN,UE/JM;EAAO,YAAA,EAAA,OAAA;EA2BP,SAAM,EAAA,OAAA;;;;EC7DL,CAAA,GAAA,IAAA;EAWA,OAAA,EAAA,OAAA;EAEL,GAAA,EAAA,MAAA,GAAA,IAAA;EAEG,KAAA,EAAA,MAAA,GAAA,IAAA;EAED,SAAA,EHuLD,eGvLC,GAAA,IAAA;EAAO,IAAA,EAAA,GAAA,GAAA,IAAA;EAsBL,IAAA,EAAA,GAAA,GHmKF,OGnKc,CAAA,IAAA,CAAA;;;;;;;;;;;iBH+KZ,OAAA,WAAiB,iBAAsB;UA+FtC,mBAAA;;;;uCAIsB,oBAAoB;;;;;;;;;;;;;;;;;;;;cAW7C;;;;;;iBAOE,aAAA,WAAuB,kBAAuB;;;;;;AFxT9D;AAKA;AASA;AA4BA;AAWA;AAMA;AAIA;AAUA;;;;;;AAUmD,UGtGlC,aAAA,CHsGkC;EAErC;EACP,IAAA,CAAA,EAAA,MAAA;EAOO;EACW,QAAA,CAAA,EAAA,OAAA;EAAlB,OAAA,CAAA,EAAA,GAAA,GAAA,IAAA;EAE2E,OAAA,CAAA,EAAA,CAAA,KAAA,EG7G9D,KH6G8D,EAAA,GAAA,IAAA;;AAE1C,UG5GvB,YAAA,CH4GuB;EAgB3B,IAAA,EAAA,GAAA,GG3HC,OH2HD,CAAA,IAAA,CAAA;EAIC,cAAA,EAAA,GAAA,GG9HU,OH8HV,CAAA,IAAA,CAAA;EAAO,aAAA,EAAA,GAAA,GG7HE,OH6HF,CAAA,IAAA,CAAA;EAoKL,OAAA,EAAA,GAAS,GAAA,IAAA;;;;IC3RR,QAAA,CAAA,EAAA,MAAgB;EAOhB,CAAA,GAAA,IAAA;EAEe,OAAA,EAAA,OAAA;EAAe,WAAA,EAAA,OAAA;EAEX,cAAA,EAAA,OAAA;EAA0B,UAAA,EAAA,MAAA;EAAR,YAAA,EAAA,MAAA,GAAA,IAAA;EAElB,KAAA,EAAA,MAAA,GAAA,IAAA;;AAAkB,iBEctC,MAAA,CFdsC,OAAA,CAAA,EEctB,aFdsB,CAAA,EEcD,YFdC;;;;;;ADZtD;AAKA;AASA;AA4BA;AAWA;AAMA;AAIA;AAUA;;;;;;;;;;;AAqBO,cI5GM,WJ4GN,EAAA,SAAA,CAAA;EAE2E,SAAA,KAAA,EAAA,OAAA;EAAR,SAAA,KAAA,EAAA,cAAA;CAElC,CAAA;AAgB3B,KI9HD,SAAA,GJ8HC,CAAA,OI9HmB,WJ8HnB,CAAA,CAAA,MAAA,CAAA,CAAA,OAAA,CAAA;AAIC,UIhIG,YAAA,CJgIH;EAAO;EAoKL,KAAA,CAAA,EAAA,MAAS;;;;EC3RR,IAAA,CAAA,EAAA,MAAA;EAOA;EAEe,iBAAA,CAAA,EAAA,MAAA;;AAEI,UGTnB,aAAA,CHSmB;EAA0B;EAAR,IAAA,CAAA,EAAA,MAAA;EAElB;EAA0B,QAAA,CAAA,EAAA,OAAA;EAAR,OAAA,CAAA,EAAA,GAAA,GAAA,IAAA;EAEvB,OAAA,CAAA,EAAA,CAAA,KAAA,EGPX,KHOW,EAAA,GAAA,IAAA;;AAEL,UGNT,YAAA,CHMS;EAEX,IAAA,EAAA,GAAA,GGPD,OHOC,CAAA,IAAA,CAAA;EAED;EAAO,KAAA,EAAA,CAAA,IAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EGPa,YHOb,EAAA,GGP8B,OHO9B,CAAA,IAAA,CAAA;EASL;gBGdA;;;EF5BJ,OAAA,EAAA,GAAA,GAAA,IAAe;EAEV,SAAA,EAAA,OAAa;EACS,eAAA,EAAA;IAAoB,MAAA,EAAA,MAAA;IAO9C,QAAA,CAAA,EAAA,MAAA;EAEC,CAAA,GAAA,IAAA;EAAO,OAAA,EAAA,OAAA;EAML;EAkBC,cAAA,EAAA,OAAe;EAEtB;EAK6B,SAAA,EAAA,OAAA;EAAkC;EAAR,QAAA,EAAA,OAAA;EAOpD;EAEC,YAAA,EAAA,MAAA,GAAA,IAAA;EAAO;EAiBL,GAAA,EAAA,MAAA,GAAS,IAAA;EAAuB,KAAA,EAAA,MAAA,GAAA,IAAA;;AAAuB,iBEdvD,MAAA,CFcuD,OAAA,CAAA,EEdvC,aFcuC,CAAA,EEdlB,YFckB;;;AFqCzD,UKhHG,mBAAA,SAA4B,cLgH/B,CAAA;EACW;EAAlB,QAAA,CAAA,EAAA,MAAA;EAE2E;EAAR,QAAA,CAAA,EAAA,MAAA;EAElC;EAgB3B,KAAA,CAAA,EAAA,MAAA;EAIC;EAAO,KAAA,CAAA,EAAA,OAAA;AAoKrB;UKlSiB,kBAAA;;YAEL;EJKK;EAOA,KAAA,EAAA,GAAA,GIVF,OJUiB,CAAA,IAAA,CAAA;EAEA;EAAe,IAAA,EAAA,GAAA,GIVjC,OJUiC,CAAA,IAAA,CAAA;EAEX;EAA0B,YAAA,EAAA,GAAA,GAAA,IAAA;EAAR;EAElB,KAAA,EAAA,GAAA,GAAA,IAAA;EAA0B;EAAR,WAAA,EAAA,OAAA;EAEvB;EAAR,cAAA,EAAA,OAAA;EAEG;EAEX,UAAA,EAAA,OAAA;EAED;EAAO,UAAA,EAAA,OAAA;EASL;;;;EC1CJ;EAEK,OAAA,EAAA,OAAa;EACS,KAAA,EAAA,MAAA,GAAA,IAAA;;AAO1B,iBGuBG,YAAA,CHvBH,OAAA,CAAA,EGuByB,mBHvBzB,CAAA,EGuBoD,kBHvBpD"}
|