@tryhamster/gerbil 1.0.3 → 1.0.5
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/cli.mjs +10 -10
- package/dist/cli.mjs.map +1 -1
- package/dist/frameworks/express.d.mts +1 -1
- package/dist/frameworks/express.mjs +1 -1
- package/dist/frameworks/fastify.d.mts +1 -1
- package/dist/frameworks/fastify.mjs +1 -1
- package/dist/frameworks/hono.d.mts +1 -1
- package/dist/frameworks/hono.mjs +1 -1
- package/dist/frameworks/next.d.mts +3 -3
- package/dist/frameworks/next.mjs +1 -1
- package/dist/frameworks/react.d.mts +1 -1
- package/dist/frameworks/trpc.d.mts +1 -1
- package/dist/frameworks/trpc.mjs +1 -1
- package/dist/gerbil-BgppGzKa.mjs +4 -0
- package/dist/{gerbil-D4eIu8hx.mjs → gerbil-CZYYq4Sq.mjs} +4 -4
- package/dist/{gerbil-D4eIu8hx.mjs.map → gerbil-CZYYq4Sq.mjs.map} +1 -1
- package/dist/{gerbil-BetB5xb0.d.mts → gerbil-CvNqpVg0.d.mts} +3 -3
- package/dist/{gerbil-BetB5xb0.d.mts.map → gerbil-CvNqpVg0.d.mts.map} +1 -1
- package/dist/gpu/hooks.d.mts +2 -2
- package/dist/gpu/hooks.d.mts.map +1 -1
- package/dist/gpu/hooks.mjs +4 -5
- package/dist/gpu/hooks.mjs.map +1 -1
- package/dist/gpu/index.d.mts +1 -1
- package/dist/gpu/index.mjs +2 -3
- package/dist/{gpu-rziY7czu.mjs → gpu-Ch2VuLdN.mjs} +25 -4
- package/dist/gpu-Ch2VuLdN.mjs.map +1 -0
- package/dist/{index-Dgmb2kE3.d.mts → index-Dy_9rDd5.d.mts} +2 -2
- package/dist/{index-Dgmb2kE3.d.mts.map → index-Dy_9rDd5.d.mts.map} +1 -1
- package/dist/{index-DukkJRMj.d.mts → index-Nl40RdSs.d.mts} +1 -1
- package/dist/{index-DukkJRMj.d.mts.map → index-Nl40RdSs.d.mts.map} +1 -1
- package/dist/index.d.mts +5 -5
- package/dist/index.mjs +8 -9
- package/dist/index.mjs.map +1 -1
- package/dist/{indexeddb-store-BWIMtxxH.mjs → indexeddb-store-BEylGAex.mjs} +2 -2
- package/dist/{indexeddb-store-BWIMtxxH.mjs.map → indexeddb-store-BEylGAex.mjs.map} +1 -1
- package/dist/indexeddb-store-ClSHQxwz.mjs +4 -0
- package/dist/integrations/ai-sdk.d.mts +1 -1
- package/dist/integrations/ai-sdk.mjs +1 -1
- package/dist/integrations/langchain.d.mts +1 -1
- package/dist/integrations/langchain.mjs +1 -1
- package/dist/integrations/llamaindex.d.mts +1 -1
- package/dist/integrations/llamaindex.mjs +1 -1
- package/dist/integrations/mcp-client.mjs +1 -1
- package/dist/integrations/mcp.d.mts +3 -3
- package/dist/integrations/mcp.mjs +4 -4
- package/dist/{mcp-DujeDKfA.mjs → mcp-DUgk28Kp.mjs} +3 -3
- package/dist/{mcp-DujeDKfA.mjs.map → mcp-DUgk28Kp.mjs.map} +1 -1
- package/dist/memory/index.d.mts +2 -2
- package/dist/memory/index.mjs +4 -4
- package/dist/memory-CGRo6zY5.mjs +4 -0
- package/dist/{memory-DVN0MnIG.mjs → memory-Deo99oKh.mjs} +2 -2
- package/dist/{memory-DVN0MnIG.mjs.map → memory-Deo99oKh.mjs.map} +1 -1
- package/dist/{memory-Dj0J1v88.mjs → memory-wgo2ZK3M.mjs} +2 -2
- package/dist/{memory-Dj0J1v88.mjs.map → memory-wgo2ZK3M.mjs.map} +1 -1
- package/dist/moonshine-stt-DFIP4tIb.mjs +4 -0
- package/dist/{moonshine-stt-BdccCmYH.mjs → moonshine-stt-DR0-JbVW.mjs} +2 -6
- package/dist/{moonshine-stt-BdccCmYH.mjs.map → moonshine-stt-DR0-JbVW.mjs.map} +1 -1
- package/dist/{one-liner-D8cM1Mg2.mjs → one-liner-sTDG9Hum.mjs} +2 -2
- package/dist/{one-liner-D8cM1Mg2.mjs.map → one-liner-sTDG9Hum.mjs.map} +1 -1
- package/dist/repl-njlFQs4-.mjs +9 -0
- package/dist/skills/index.d.mts +3 -3
- package/dist/skills/index.mjs +3 -3
- package/dist/{skills-FEBy8-pu.mjs → skills-CEUuOUlm.mjs} +2 -2
- package/dist/{skills-FEBy8-pu.mjs.map → skills-CEUuOUlm.mjs.map} +1 -1
- package/dist/{tools-DQ1mPUw5.mjs → tools-DbbNCJ5y.mjs} +1 -1
- package/dist/{tools-DQ1mPUw5.mjs.map → tools-DbbNCJ5y.mjs.map} +1 -1
- package/dist/{types-LlyYILII.d.mts → types-Bxwe_uS7.d.mts} +1 -1
- package/dist/{types-LlyYILII.d.mts.map → types-Bxwe_uS7.d.mts.map} +1 -1
- package/dist/{types-DQBe2lFo.d.mts → types-D7kn-0i2.d.mts} +1 -1
- package/dist/{types-DQBe2lFo.d.mts.map → types-D7kn-0i2.d.mts.map} +1 -1
- package/dist/{vector-B0panuy6.mjs → vector-C1U9vVVS.mjs} +1 -1
- package/dist/{vector-B0panuy6.mjs.map → vector-C1U9vVVS.mjs.map} +1 -1
- package/package.json +1 -1
- package/dist/defaults-9komdrbY.mjs +0 -24
- package/dist/defaults-9komdrbY.mjs.map +0 -1
- package/dist/gerbil-Dk6sTA7P.mjs +0 -4
- package/dist/gpu-rziY7czu.mjs.map +0 -1
- package/dist/indexeddb-store-ClH12Xnl.mjs +0 -4
- package/dist/memory-D1P7Tmda.mjs +0 -4
- package/dist/moonshine-stt-CBX849nI.mjs +0 -4
- package/dist/repl-DuACpxEj.mjs +0 -9
- /package/dist/{auto-update-BVaLXcDE.mjs → auto-update-DNbr3GLz.mjs} +0 -0
- /package/dist/{microphone-Bqmoz9_K.mjs → microphone-sj_bnRm-.mjs} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-Dj0J1v88.mjs","names":["chunks: string[]","candidates: { item: MemoryRecord; vector: Float32Array }[]","ranked: Scored<MemoryRecord>[]","out: MemoryRecord[]","records: MemoryRecord[]","packed: MemoryRecord[]"],"sources":["../src/memory/chunking.ts","../src/memory/redaction.ts","../src/memory/stores/memory-store.ts","../src/memory/tokens.ts","../src/memory/memory.ts"],"sourcesContent":["/**\n * Document chunking: split long text into overlapping windows before\n * embedding so retrieval can target relevant passages.\n */\n\nimport type { ChunkOptions } from \"./types.js\";\n\nconst DEFAULT_CHUNK_SIZE = 1000;\nconst DEFAULT_OVERLAP = 200;\n\n/**\n * Split `text` into overlapping character windows.\n *\n * Chunks are `chunkSize` characters with `overlap` characters shared between\n * consecutive chunks, which preserves context across boundaries. Whitespace\n * is trimmed and empty chunks are dropped. Short text returns a single chunk.\n *\n * @throws if `overlap` is not less than `chunkSize` (would loop forever).\n */\nexport function chunkText(text: string, options: ChunkOptions = {}): string[] {\n const chunkSize = options.chunkSize ?? DEFAULT_CHUNK_SIZE;\n const overlap = options.overlap ?? DEFAULT_OVERLAP;\n\n if (chunkSize <= 0) {\n throw new Error(\"chunkSize must be greater than 0\");\n }\n if (overlap < 0 || overlap >= chunkSize) {\n throw new Error(\"overlap must be >= 0 and < chunkSize\");\n }\n\n const trimmed = text.trim();\n if (trimmed.length <= chunkSize) {\n return trimmed.length > 0 ? [trimmed] : [];\n }\n\n const stride = chunkSize - overlap;\n const chunks: string[] = [];\n for (let start = 0; start < trimmed.length; start += stride) {\n const chunk = trimmed.slice(start, start + chunkSize).trim();\n if (chunk.length > 0) {\n chunks.push(chunk);\n }\n if (start + chunkSize >= trimmed.length) {\n break;\n }\n }\n return chunks;\n}\n","/**\n * Privacy redaction applied to memory text on write.\n */\n\nimport type { Redactor } from \"./types.js\";\n\nconst REDACTION_PLACEHOLDER = \"[REDACTED]\";\n\n/**\n * Apply a {@link Redactor} to `text`.\n *\n * - A {@link RegExp} replaces all matches with `[REDACTED]` (the `g` flag is\n * forced so replacement is global regardless of the supplied flags).\n * - A function is invoked and its return value used.\n * - `undefined` returns the text unchanged.\n */\nexport function applyRedaction(text: string, redact?: Redactor): string {\n if (!redact) {\n return text;\n }\n if (typeof redact === \"function\") {\n return redact(text);\n }\n const global = redact.global ? redact : new RegExp(redact.source, `${redact.flags}g`);\n return text.replace(global, REDACTION_PLACEHOLDER);\n}\n","/**\n * In-memory {@link MemoryStore} — the default backend.\n *\n * Works in both Node and the browser. Holds records in a `Map` and performs\n * a brute-force cosine top-k scan on search. Records are expected to carry\n * pre-normalized embeddings (the {@link Memory} facade normalizes on insert).\n */\n\nimport { matchesFilter } from \"../serialize.js\";\nimport type {\n MemoryRecord,\n MemorySearchResult,\n MemoryStore,\n MetadataFilter,\n StoreSearchOptions,\n} from \"../types.js\";\nimport { type Scored, topK } from \"../vector.js\";\n\nconst DEFAULT_K = 5;\n\n/** Brute-force, embedding-agnostic in-memory vector store. */\nexport class InMemoryStore implements MemoryStore {\n private readonly records = new Map<string, MemoryRecord>();\n\n add(record: MemoryRecord): Promise<void> {\n this.records.set(record.id, record);\n return Promise.resolve();\n }\n\n addMany(records: MemoryRecord[]): Promise<void> {\n for (const record of records) {\n this.records.set(record.id, record);\n }\n return Promise.resolve();\n }\n\n get(id: string): Promise<MemoryRecord | undefined> {\n return Promise.resolve(this.records.get(id));\n }\n\n search(\n queryVector: Float32Array,\n options: StoreSearchOptions = {},\n ): Promise<MemorySearchResult[]> {\n const k = options.k ?? DEFAULT_K;\n const candidates: { item: MemoryRecord; vector: Float32Array }[] = [];\n for (const record of this.records.values()) {\n if (!record.embedding) {\n continue;\n }\n if (!matchesFilter(record.metadata, options.filter)) {\n continue;\n }\n candidates.push({ item: record, vector: record.embedding });\n }\n const ranked: Scored<MemoryRecord>[] = topK(queryVector, candidates, k, options.minScore);\n return Promise.resolve(ranked.map((entry) => ({ record: entry.item, score: entry.score })));\n }\n\n delete(id: string): Promise<boolean> {\n return Promise.resolve(this.records.delete(id));\n }\n\n list(filter?: MetadataFilter): Promise<MemoryRecord[]> {\n const out: MemoryRecord[] = [];\n for (const record of this.records.values()) {\n if (matchesFilter(record.metadata, filter)) {\n out.push(record);\n }\n }\n return Promise.resolve(out);\n }\n\n clear(): Promise<void> {\n this.records.clear();\n return Promise.resolve();\n }\n\n size(): Promise<number> {\n return Promise.resolve(this.records.size);\n }\n}\n\n/** Create an {@link InMemoryStore}. */\nexport function createInMemoryStore(): MemoryStore {\n return new InMemoryStore();\n}\n","/**\n * Approximate token counting for context packing.\n *\n * We deliberately avoid a real tokenizer dependency here. The heuristic is\n * the widely used \"~4 characters per token\" rule for English-ish text, with\n * a small floor so very short strings still cost at least one token. This is\n * an estimate used only for budgeting — slightly conservative is fine, since\n * the goal is to stay under a model's context window, not to be exact.\n */\n\nconst CHARS_PER_TOKEN = 4;\n\n/**\n * Estimate the number of tokens in `text`.\n *\n * Uses the ~4-chars-per-token heuristic. Returns 0 for empty strings.\n */\nexport function estimateTokens(text: string): number {\n if (text.length === 0) {\n return 0;\n }\n return Math.max(1, Math.ceil(text.length / CHARS_PER_TOKEN));\n}\n","/**\n * The {@link Memory} facade: the small, obvious public API over a pluggable\n * {@link MemoryStore} and an injected {@link Embedder}.\n *\n * Lifecycle of a write: redact -> (optional) chunk -> embed -> normalize ->\n * store. Reads embed the query once and delegate cosine top-k to the store.\n * {@link Memory.recall} adds token-budgeted context packing on top of search.\n */\n\nimport { chunkText } from \"./chunking.js\";\nimport { applyRedaction } from \"./redaction.js\";\nimport { deserializeRecord, serializeRecord } from \"./serialize.js\";\nimport { createInMemoryStore } from \"./stores/memory-store.js\";\nimport { estimateTokens } from \"./tokens.js\";\nimport type {\n AddOptions,\n ChunkOptions,\n Embedder,\n MemoryExport,\n MemoryOptions,\n MemoryRecord,\n MemorySearchResult,\n MemoryStore,\n MetadataFilter,\n RecallOptions,\n RecallResult,\n Redactor,\n SearchOptions,\n} from \"./types.js\";\nimport { normalize } from \"./vector.js\";\n\nconst DEFAULT_RECALL_K = 20;\nconst DEFAULT_TOKEN_BUDGET = 1024;\nconst DEFAULT_SEPARATOR = \"\\n\\n\";\n\nfunction generateId(): string {\n // crypto.randomUUID exists in modern Node (>=16) and browsers.\n const cryptoObj = globalThis.crypto;\n if (cryptoObj?.randomUUID) {\n return cryptoObj.randomUUID();\n }\n return `mem-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\n/**\n * On-device persistent memory with semantic recall.\n *\n * Construct via {@link createMemory}. Engine-agnostic: bring any\n * {@link Embedder} (Gerbil's native embeddings by default) and any\n * {@link MemoryStore} backend.\n */\nexport class Memory {\n private readonly embedder: Embedder;\n private readonly store: MemoryStore;\n private readonly redact?: Redactor;\n private readonly defaultChunk?: ChunkOptions;\n\n constructor(options: MemoryOptions) {\n if (typeof options.embed !== \"function\") {\n throw new Error(\"createMemory requires an `embed` function\");\n }\n this.embedder = options.embed;\n this.store = options.store ?? createInMemoryStore();\n this.redact = options.redact;\n this.defaultChunk = options.chunk;\n }\n\n /** The underlying store, for advanced use (custom queries, swapping). */\n get backend(): MemoryStore {\n return this.store;\n }\n\n /**\n * Add text to memory. Long text can be split into overlapping chunks\n * (one record per chunk). Returns the ids of the created record(s).\n */\n async add(text: string, options: AddOptions = {}): Promise<string[]> {\n const redacted = applyRedaction(text, this.redact);\n\n const chunkConfig = this.resolveChunking(options.chunk);\n const pieces = chunkConfig ? chunkText(redacted, chunkConfig) : [redacted];\n const nonEmpty = pieces.filter((piece) => piece.length > 0);\n if (nonEmpty.length === 0) {\n return [];\n }\n\n if (options.id && nonEmpty.length > 1) {\n throw new Error(\"Cannot use an explicit `id` when text is split into multiple chunks\");\n }\n\n const vectors = await this.embedder(nonEmpty);\n const createdAt = Date.now();\n const metadata = options.metadata ?? {};\n const records: MemoryRecord[] = nonEmpty.map((piece, index) => ({\n id: index === 0 && options.id ? options.id : generateId(),\n text: piece,\n embedding: normalize(vectors[index]),\n metadata,\n createdAt,\n }));\n\n await this.store.addMany(records);\n return records.map((record) => record.id);\n }\n\n private resolveChunking(chunk: AddOptions[\"chunk\"]): ChunkOptions | undefined {\n if (chunk === true) {\n return this.defaultChunk ?? {};\n }\n if (chunk && typeof chunk === \"object\") {\n return chunk;\n }\n return;\n }\n\n /** Fetch a record by id. */\n get(id: string): Promise<MemoryRecord | undefined> {\n return this.store.get(id);\n }\n\n /** Semantic search: returns the top-k records by cosine similarity. */\n async search(query: string, options: SearchOptions = {}): Promise<MemorySearchResult[]> {\n const [vector] = await this.embedder([query]);\n return this.store.search(normalize(vector), {\n k: options.k,\n filter: options.filter,\n minScore: options.minScore,\n });\n }\n\n /**\n * Retrieve relevant memories and greedily pack them into a token-budgeted\n * context block, highest-scoring first, stopping before the budget is\n * exceeded. This is the per-turn context-rebuild step that turns the store\n * into agent memory. Token counts are approximate (see {@link estimateTokens}).\n */\n async recall(query: string, options: RecallOptions = {}): Promise<RecallResult> {\n const budget = options.tokenBudget ?? DEFAULT_TOKEN_BUDGET;\n const separator = options.separator ?? DEFAULT_SEPARATOR;\n const candidates = await this.search(query, {\n k: options.k ?? DEFAULT_RECALL_K,\n filter: options.filter,\n minScore: options.minScore,\n });\n\n const separatorTokens = estimateTokens(separator);\n const packed: MemoryRecord[] = [];\n let tokensUsed = 0;\n for (const { record } of candidates) {\n const recordTokens = estimateTokens(record.text);\n const withSeparator = packed.length === 0 ? recordTokens : recordTokens + separatorTokens;\n if (tokensUsed + withSeparator > budget) {\n continue; // Try smaller later candidates rather than stop outright.\n }\n packed.push(record);\n tokensUsed += withSeparator;\n }\n\n return {\n context: packed.map((record) => record.text).join(separator),\n records: packed,\n tokensUsed,\n };\n }\n\n /** Delete a record by id. Returns `true` if it existed. */\n delete(id: string): Promise<boolean> {\n return this.store.delete(id);\n }\n\n /** List all records, optionally filtered by metadata. */\n list(filter?: MetadataFilter): Promise<MemoryRecord[]> {\n return this.store.list(filter);\n }\n\n /** Remove all records. */\n clear(): Promise<void> {\n return this.store.clear();\n }\n\n /** Total number of stored records. */\n size(): Promise<number> {\n return this.store.size();\n }\n\n /** Export the full corpus as a JSON-serializable snapshot. */\n async export(): Promise<MemoryExport> {\n const records = await this.store.list();\n return {\n version: 1,\n records: records.map(serializeRecord),\n };\n }\n\n /**\n * Import records from a snapshot produced by {@link Memory.export}.\n * Existing records with the same id are overwritten.\n */\n async import(snapshot: MemoryExport): Promise<void> {\n const records = snapshot.records.map(deserializeRecord);\n await this.store.addMany(records);\n }\n}\n\n/**\n * Create a {@link Memory} instance.\n *\n * @example\n * ```ts\n * const mem = createMemory({ embed, store });\n * await mem.add(\"Paris is the capital of France\", { metadata: { topic: \"geo\" } });\n * const hits = await mem.search(\"French capital\", { k: 3 });\n * const { context } = await mem.recall(\"French capital\", { tokenBudget: 512 });\n * ```\n */\nexport function createMemory(options: MemoryOptions): Memory {\n return new Memory(options);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"memory-wgo2ZK3M.mjs","names":["chunks: string[]","candidates: { item: MemoryRecord; vector: Float32Array }[]","ranked: Scored<MemoryRecord>[]","out: MemoryRecord[]","records: MemoryRecord[]","packed: MemoryRecord[]"],"sources":["../src/memory/chunking.ts","../src/memory/redaction.ts","../src/memory/stores/memory-store.ts","../src/memory/tokens.ts","../src/memory/memory.ts"],"sourcesContent":["/**\n * Document chunking: split long text into overlapping windows before\n * embedding so retrieval can target relevant passages.\n */\n\nimport type { ChunkOptions } from \"./types.js\";\n\nconst DEFAULT_CHUNK_SIZE = 1000;\nconst DEFAULT_OVERLAP = 200;\n\n/**\n * Split `text` into overlapping character windows.\n *\n * Chunks are `chunkSize` characters with `overlap` characters shared between\n * consecutive chunks, which preserves context across boundaries. Whitespace\n * is trimmed and empty chunks are dropped. Short text returns a single chunk.\n *\n * @throws if `overlap` is not less than `chunkSize` (would loop forever).\n */\nexport function chunkText(text: string, options: ChunkOptions = {}): string[] {\n const chunkSize = options.chunkSize ?? DEFAULT_CHUNK_SIZE;\n const overlap = options.overlap ?? DEFAULT_OVERLAP;\n\n if (chunkSize <= 0) {\n throw new Error(\"chunkSize must be greater than 0\");\n }\n if (overlap < 0 || overlap >= chunkSize) {\n throw new Error(\"overlap must be >= 0 and < chunkSize\");\n }\n\n const trimmed = text.trim();\n if (trimmed.length <= chunkSize) {\n return trimmed.length > 0 ? [trimmed] : [];\n }\n\n const stride = chunkSize - overlap;\n const chunks: string[] = [];\n for (let start = 0; start < trimmed.length; start += stride) {\n const chunk = trimmed.slice(start, start + chunkSize).trim();\n if (chunk.length > 0) {\n chunks.push(chunk);\n }\n if (start + chunkSize >= trimmed.length) {\n break;\n }\n }\n return chunks;\n}\n","/**\n * Privacy redaction applied to memory text on write.\n */\n\nimport type { Redactor } from \"./types.js\";\n\nconst REDACTION_PLACEHOLDER = \"[REDACTED]\";\n\n/**\n * Apply a {@link Redactor} to `text`.\n *\n * - A {@link RegExp} replaces all matches with `[REDACTED]` (the `g` flag is\n * forced so replacement is global regardless of the supplied flags).\n * - A function is invoked and its return value used.\n * - `undefined` returns the text unchanged.\n */\nexport function applyRedaction(text: string, redact?: Redactor): string {\n if (!redact) {\n return text;\n }\n if (typeof redact === \"function\") {\n return redact(text);\n }\n const global = redact.global ? redact : new RegExp(redact.source, `${redact.flags}g`);\n return text.replace(global, REDACTION_PLACEHOLDER);\n}\n","/**\n * In-memory {@link MemoryStore} — the default backend.\n *\n * Works in both Node and the browser. Holds records in a `Map` and performs\n * a brute-force cosine top-k scan on search. Records are expected to carry\n * pre-normalized embeddings (the {@link Memory} facade normalizes on insert).\n */\n\nimport { matchesFilter } from \"../serialize.js\";\nimport type {\n MemoryRecord,\n MemorySearchResult,\n MemoryStore,\n MetadataFilter,\n StoreSearchOptions,\n} from \"../types.js\";\nimport { type Scored, topK } from \"../vector.js\";\n\nconst DEFAULT_K = 5;\n\n/** Brute-force, embedding-agnostic in-memory vector store. */\nexport class InMemoryStore implements MemoryStore {\n private readonly records = new Map<string, MemoryRecord>();\n\n add(record: MemoryRecord): Promise<void> {\n this.records.set(record.id, record);\n return Promise.resolve();\n }\n\n addMany(records: MemoryRecord[]): Promise<void> {\n for (const record of records) {\n this.records.set(record.id, record);\n }\n return Promise.resolve();\n }\n\n get(id: string): Promise<MemoryRecord | undefined> {\n return Promise.resolve(this.records.get(id));\n }\n\n search(\n queryVector: Float32Array,\n options: StoreSearchOptions = {},\n ): Promise<MemorySearchResult[]> {\n const k = options.k ?? DEFAULT_K;\n const candidates: { item: MemoryRecord; vector: Float32Array }[] = [];\n for (const record of this.records.values()) {\n if (!record.embedding) {\n continue;\n }\n if (!matchesFilter(record.metadata, options.filter)) {\n continue;\n }\n candidates.push({ item: record, vector: record.embedding });\n }\n const ranked: Scored<MemoryRecord>[] = topK(queryVector, candidates, k, options.minScore);\n return Promise.resolve(ranked.map((entry) => ({ record: entry.item, score: entry.score })));\n }\n\n delete(id: string): Promise<boolean> {\n return Promise.resolve(this.records.delete(id));\n }\n\n list(filter?: MetadataFilter): Promise<MemoryRecord[]> {\n const out: MemoryRecord[] = [];\n for (const record of this.records.values()) {\n if (matchesFilter(record.metadata, filter)) {\n out.push(record);\n }\n }\n return Promise.resolve(out);\n }\n\n clear(): Promise<void> {\n this.records.clear();\n return Promise.resolve();\n }\n\n size(): Promise<number> {\n return Promise.resolve(this.records.size);\n }\n}\n\n/** Create an {@link InMemoryStore}. */\nexport function createInMemoryStore(): MemoryStore {\n return new InMemoryStore();\n}\n","/**\n * Approximate token counting for context packing.\n *\n * We deliberately avoid a real tokenizer dependency here. The heuristic is\n * the widely used \"~4 characters per token\" rule for English-ish text, with\n * a small floor so very short strings still cost at least one token. This is\n * an estimate used only for budgeting — slightly conservative is fine, since\n * the goal is to stay under a model's context window, not to be exact.\n */\n\nconst CHARS_PER_TOKEN = 4;\n\n/**\n * Estimate the number of tokens in `text`.\n *\n * Uses the ~4-chars-per-token heuristic. Returns 0 for empty strings.\n */\nexport function estimateTokens(text: string): number {\n if (text.length === 0) {\n return 0;\n }\n return Math.max(1, Math.ceil(text.length / CHARS_PER_TOKEN));\n}\n","/**\n * The {@link Memory} facade: the small, obvious public API over a pluggable\n * {@link MemoryStore} and an injected {@link Embedder}.\n *\n * Lifecycle of a write: redact -> (optional) chunk -> embed -> normalize ->\n * store. Reads embed the query once and delegate cosine top-k to the store.\n * {@link Memory.recall} adds token-budgeted context packing on top of search.\n */\n\nimport { chunkText } from \"./chunking.js\";\nimport { applyRedaction } from \"./redaction.js\";\nimport { deserializeRecord, serializeRecord } from \"./serialize.js\";\nimport { createInMemoryStore } from \"./stores/memory-store.js\";\nimport { estimateTokens } from \"./tokens.js\";\nimport type {\n AddOptions,\n ChunkOptions,\n Embedder,\n MemoryExport,\n MemoryOptions,\n MemoryRecord,\n MemorySearchResult,\n MemoryStore,\n MetadataFilter,\n RecallOptions,\n RecallResult,\n Redactor,\n SearchOptions,\n} from \"./types.js\";\nimport { normalize } from \"./vector.js\";\n\nconst DEFAULT_RECALL_K = 20;\nconst DEFAULT_TOKEN_BUDGET = 1024;\nconst DEFAULT_SEPARATOR = \"\\n\\n\";\n\nfunction generateId(): string {\n // crypto.randomUUID exists in modern Node (>=16) and browsers.\n const cryptoObj = globalThis.crypto;\n if (cryptoObj?.randomUUID) {\n return cryptoObj.randomUUID();\n }\n return `mem-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\n/**\n * On-device persistent memory with semantic recall.\n *\n * Construct via {@link createMemory}. Engine-agnostic: bring any\n * {@link Embedder} (Gerbil's native embeddings by default) and any\n * {@link MemoryStore} backend.\n */\nexport class Memory {\n private readonly embedder: Embedder;\n private readonly store: MemoryStore;\n private readonly redact?: Redactor;\n private readonly defaultChunk?: ChunkOptions;\n\n constructor(options: MemoryOptions) {\n if (typeof options.embed !== \"function\") {\n throw new Error(\"createMemory requires an `embed` function\");\n }\n this.embedder = options.embed;\n this.store = options.store ?? createInMemoryStore();\n this.redact = options.redact;\n this.defaultChunk = options.chunk;\n }\n\n /** The underlying store, for advanced use (custom queries, swapping). */\n get backend(): MemoryStore {\n return this.store;\n }\n\n /**\n * Add text to memory. Long text can be split into overlapping chunks\n * (one record per chunk). Returns the ids of the created record(s).\n */\n async add(text: string, options: AddOptions = {}): Promise<string[]> {\n const redacted = applyRedaction(text, this.redact);\n\n const chunkConfig = this.resolveChunking(options.chunk);\n const pieces = chunkConfig ? chunkText(redacted, chunkConfig) : [redacted];\n const nonEmpty = pieces.filter((piece) => piece.length > 0);\n if (nonEmpty.length === 0) {\n return [];\n }\n\n if (options.id && nonEmpty.length > 1) {\n throw new Error(\"Cannot use an explicit `id` when text is split into multiple chunks\");\n }\n\n const vectors = await this.embedder(nonEmpty);\n const createdAt = Date.now();\n const metadata = options.metadata ?? {};\n const records: MemoryRecord[] = nonEmpty.map((piece, index) => ({\n id: index === 0 && options.id ? options.id : generateId(),\n text: piece,\n embedding: normalize(vectors[index]),\n metadata,\n createdAt,\n }));\n\n await this.store.addMany(records);\n return records.map((record) => record.id);\n }\n\n private resolveChunking(chunk: AddOptions[\"chunk\"]): ChunkOptions | undefined {\n if (chunk === true) {\n return this.defaultChunk ?? {};\n }\n if (chunk && typeof chunk === \"object\") {\n return chunk;\n }\n return;\n }\n\n /** Fetch a record by id. */\n get(id: string): Promise<MemoryRecord | undefined> {\n return this.store.get(id);\n }\n\n /** Semantic search: returns the top-k records by cosine similarity. */\n async search(query: string, options: SearchOptions = {}): Promise<MemorySearchResult[]> {\n const [vector] = await this.embedder([query]);\n return this.store.search(normalize(vector), {\n k: options.k,\n filter: options.filter,\n minScore: options.minScore,\n });\n }\n\n /**\n * Retrieve relevant memories and greedily pack them into a token-budgeted\n * context block, highest-scoring first, stopping before the budget is\n * exceeded. This is the per-turn context-rebuild step that turns the store\n * into agent memory. Token counts are approximate (see {@link estimateTokens}).\n */\n async recall(query: string, options: RecallOptions = {}): Promise<RecallResult> {\n const budget = options.tokenBudget ?? DEFAULT_TOKEN_BUDGET;\n const separator = options.separator ?? DEFAULT_SEPARATOR;\n const candidates = await this.search(query, {\n k: options.k ?? DEFAULT_RECALL_K,\n filter: options.filter,\n minScore: options.minScore,\n });\n\n const separatorTokens = estimateTokens(separator);\n const packed: MemoryRecord[] = [];\n let tokensUsed = 0;\n for (const { record } of candidates) {\n const recordTokens = estimateTokens(record.text);\n const withSeparator = packed.length === 0 ? recordTokens : recordTokens + separatorTokens;\n if (tokensUsed + withSeparator > budget) {\n continue; // Try smaller later candidates rather than stop outright.\n }\n packed.push(record);\n tokensUsed += withSeparator;\n }\n\n return {\n context: packed.map((record) => record.text).join(separator),\n records: packed,\n tokensUsed,\n };\n }\n\n /** Delete a record by id. Returns `true` if it existed. */\n delete(id: string): Promise<boolean> {\n return this.store.delete(id);\n }\n\n /** List all records, optionally filtered by metadata. */\n list(filter?: MetadataFilter): Promise<MemoryRecord[]> {\n return this.store.list(filter);\n }\n\n /** Remove all records. */\n clear(): Promise<void> {\n return this.store.clear();\n }\n\n /** Total number of stored records. */\n size(): Promise<number> {\n return this.store.size();\n }\n\n /** Export the full corpus as a JSON-serializable snapshot. */\n async export(): Promise<MemoryExport> {\n const records = await this.store.list();\n return {\n version: 1,\n records: records.map(serializeRecord),\n };\n }\n\n /**\n * Import records from a snapshot produced by {@link Memory.export}.\n * Existing records with the same id are overwritten.\n */\n async import(snapshot: MemoryExport): Promise<void> {\n const records = snapshot.records.map(deserializeRecord);\n await this.store.addMany(records);\n }\n}\n\n/**\n * Create a {@link Memory} instance.\n *\n * @example\n * ```ts\n * const mem = createMemory({ embed, store });\n * await mem.add(\"Paris is the capital of France\", { metadata: { topic: \"geo\" } });\n * const hits = await mem.search(\"French capital\", { k: 3 });\n * const { context } = await mem.recall(\"French capital\", { tokenBudget: 512 });\n * ```\n */\nexport function createMemory(options: MemoryOptions): Memory {\n return new Memory(options);\n}\n"],"mappings":"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"}
|
|
@@ -10444,10 +10444,6 @@ var CacheWeightStore = class CacheWeightStore {
|
|
|
10444
10444
|
await Promise.all(keys.map((k) => idbDelete(k).catch(() => void 0)));
|
|
10445
10445
|
}
|
|
10446
10446
|
};
|
|
10447
|
-
/** True when the browser CacheStorage API is available (i.e. not Node). */
|
|
10448
|
-
function cacheStorageAvailable() {
|
|
10449
|
-
return typeof caches !== "undefined";
|
|
10450
|
-
}
|
|
10451
10447
|
|
|
10452
10448
|
//#endregion
|
|
10453
10449
|
//#region src/gpu/model-loader.ts
|
|
@@ -11002,7 +10998,7 @@ async function loadModel(options) {
|
|
|
11002
10998
|
const safetensorsFiles = await discoverSafetensorsFiles(baseURL, hfToken, resolvedCacheDir);
|
|
11003
10999
|
const streamFlag = globalThis.GERBIL_STREAM_WEIGHTS;
|
|
11004
11000
|
const streamOptIn = streamFlag === true || typeof location !== "undefined" && typeof URLSearchParams !== "undefined" && new URLSearchParams(location.search).has("stream");
|
|
11005
|
-
const cacheStore = streamFlag !== false && (streamOptIn || isMobileUA) &&
|
|
11001
|
+
const cacheStore = streamFlag !== false && (streamOptIn || isMobileUA) && idbCacheAvailable() ? new CacheWeightStore() : null;
|
|
11006
11002
|
const store = cacheStore ?? new HeapWeightStore();
|
|
11007
11003
|
let filesLoaded = 0;
|
|
11008
11004
|
const totalFiles = safetensorsFiles.length;
|
|
@@ -11978,4 +11974,4 @@ function selectGraphWeights(graph, weights) {
|
|
|
11978
11974
|
|
|
11979
11975
|
//#endregion
|
|
11980
11976
|
export { loadMoonshine as a, MATMUL_BIAS_F16C_SPEC as c, createStorageBuffer as d, createUniformBuffer as f, verifyGPU as g, initGPU as h, loadModel as i, clearPipelineCache as l, getOrCreatePipeline as m, MoonshineEncoderExecutor as n, Executor as o, destroyBuffers as p, loadKaniTTS as r, KERNEL_REGISTRY as s, MoonshineSTT as t, createBindGroup as u };
|
|
11981
|
-
//# sourceMappingURL=moonshine-stt-
|
|
11977
|
+
//# sourceMappingURL=moonshine-stt-DR0-JbVW.mjs.map
|