@galaxy-stack/ai-coder-core 0.3.0-alpha.16 → 0.3.0-alpha.17
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/CHANGELOG.d/2026-09-26-binary-review-pipe-guidance-finalization-test.md +14 -0
- package/CHANGELOG.d/2026-09-26-cache-capability-and-mcp-reconnect.md +16 -0
- package/CHANGELOG.d/2026-09-26-cache-hit-harness.md +13 -0
- package/CHANGELOG.d/2026-09-26-cache-hit-rate-and-inhistory-option.md +12 -0
- package/CHANGELOG.d/2026-09-26-cumulative-cache-hit.md +13 -0
- package/CHANGELOG.d/2026-09-26-finalization-prefix-and-verified-inhistory.md +12 -0
- package/CHANGELOG.d/2026-09-26-generated-state-and-churn-guard.md +17 -0
- package/CHANGELOG.d/2026-09-26-mcp-reconnect-fixture.md +11 -0
- package/CHANGELOG.d/2026-09-26-memory-hybrid-semantic-consolidation.md +16 -0
- package/CHANGELOG.d/2026-09-26-memory-recall-benchmark.md +12 -0
- package/CHANGELOG.d/2026-09-26-ollama-cache-usage.md +14 -0
- package/CHANGELOG.d/2026-09-26-ollama-embeddings-provider.md +13 -0
- package/CHANGELOG.d/2026-09-26-skill-index-signing.md +11 -0
- package/CHANGELOG.d/2026-09-26-skill-version-and-marketplace.md +14 -0
- package/dist/adapters/node/config/manual-provider-config.d.ts +3 -0
- package/dist/adapters/node/config/manual-provider-config.d.ts.map +1 -1
- package/dist/adapters/node/config/manual-provider-config.js +4 -0
- package/dist/adapters/node/config/manual-provider-config.js.map +1 -1
- package/dist/adapters/node/host/node-workspace-evidence-verifier.d.ts.map +1 -1
- package/dist/adapters/node/host/node-workspace-evidence-verifier.js +10 -13
- package/dist/adapters/node/host/node-workspace-evidence-verifier.js.map +1 -1
- package/dist/adapters/node/host/node-workspace-snapshot.d.ts.map +1 -1
- package/dist/adapters/node/host/node-workspace-snapshot.js +5 -15
- package/dist/adapters/node/host/node-workspace-snapshot.js.map +1 -1
- package/dist/adapters/node/host/workspace-generated-state.d.ts +22 -0
- package/dist/adapters/node/host/workspace-generated-state.d.ts.map +1 -0
- package/dist/adapters/node/host/workspace-generated-state.js +56 -0
- package/dist/adapters/node/host/workspace-generated-state.js.map +1 -0
- package/dist/adapters/node/mcp/mcp-client.d.ts +7 -2
- package/dist/adapters/node/mcp/mcp-client.d.ts.map +1 -1
- package/dist/adapters/node/mcp/mcp-client.js +41 -6
- package/dist/adapters/node/mcp/mcp-client.js.map +1 -1
- package/dist/adapters/node/memory/ollama-embeddings.d.ts +26 -0
- package/dist/adapters/node/memory/ollama-embeddings.d.ts.map +1 -0
- package/dist/adapters/node/memory/ollama-embeddings.js +98 -0
- package/dist/adapters/node/memory/ollama-embeddings.js.map +1 -0
- package/dist/adapters/node/memory/sqlite-memory.d.ts +16 -3
- package/dist/adapters/node/memory/sqlite-memory.d.ts.map +1 -1
- package/dist/adapters/node/memory/sqlite-memory.js +138 -16
- package/dist/adapters/node/memory/sqlite-memory.js.map +1 -1
- package/dist/adapters/node/provider/ollama-chat-stream.d.ts.map +1 -1
- package/dist/adapters/node/provider/ollama-chat-stream.js +4 -0
- package/dist/adapters/node/provider/ollama-chat-stream.js.map +1 -1
- package/dist/adapters/node/provider/ollama-coding-model.d.ts +9 -0
- package/dist/adapters/node/provider/ollama-coding-model.d.ts.map +1 -1
- package/dist/adapters/node/provider/ollama-coding-model.js +18 -0
- package/dist/adapters/node/provider/ollama-coding-model.js.map +1 -1
- package/dist/adapters/node/skills/directory-skills.d.ts.map +1 -1
- package/dist/adapters/node/skills/directory-skills.js +16 -1
- package/dist/adapters/node/skills/directory-skills.js.map +1 -1
- package/dist/adapters/node/skills/skill-marketplace.d.ts +71 -0
- package/dist/adapters/node/skills/skill-marketplace.d.ts.map +1 -0
- package/dist/adapters/node/skills/skill-marketplace.js +259 -0
- package/dist/adapters/node/skills/skill-marketplace.js.map +1 -0
- package/dist/adapters/node/tools/workspace-review.d.ts.map +1 -1
- package/dist/adapters/node/tools/workspace-review.js +23 -9
- package/dist/adapters/node/tools/workspace-review.js.map +1 -1
- package/dist/agent/index.d.ts +17 -0
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js.map +1 -1
- package/dist/context/context-manager.d.ts +4 -1
- package/dist/context/context-manager.d.ts.map +1 -1
- package/dist/context/context-manager.js +25 -5
- package/dist/context/context-manager.js.map +1 -1
- package/dist/context/token-ledger.d.ts +9 -0
- package/dist/context/token-ledger.d.ts.map +1 -1
- package/dist/context/token-ledger.js +8 -0
- package/dist/context/token-ledger.js.map +1 -1
- package/dist/ports/capability-port.d.ts +8 -0
- package/dist/ports/capability-port.d.ts.map +1 -1
- package/dist/prompt/prompt-assembler.d.ts +1 -1
- package/dist/prompt/prompt-assembler.d.ts.map +1 -1
- package/dist/prompt/prompt-assembler.js +6 -4
- package/dist/prompt/prompt-assembler.js.map +1 -1
- package/dist/runtime/run-controller.d.ts.map +1 -1
- package/dist/runtime/run-controller.js +56 -7
- package/dist/runtime/run-controller.js.map +1 -1
- package/dist/runtime/runtime-types.d.ts +10 -0
- package/dist/runtime/runtime-types.d.ts.map +1 -1
- package/docs/CACHE_HIT.md +109 -0
- package/docs/SKILL_MARKETPLACE.md +59 -0
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-generated-state.js","sourceRoot":"","sources":["../../../../src/adapters/node/host/workspace-generated-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,+FAA+F;AAC/F,MAAM,CAAC,MAAM,+BAA+B,GAAsB,MAAM,CAAC,MAAM,CAAC;IAC9E,YAAY;IACZ,QAAQ;IACR,SAAS;IACT,aAAa;IACb,OAAO;IACP,eAAe;IACf,eAAe;IACf,QAAQ;IACR,OAAO;IACP,aAAa;IACb,OAAO;IACP,UAAU;IACV,MAAM;IACN,cAAc;IACd,KAAK;IACL,QAAQ;CACT,CAAC,CAAC;AAEH,kFAAkF;AAClF,MAAM,CAAC,MAAM,iCAAiC,GAAsB,MAAM,CAAC,MAAM,CAAC;IAChF,cAAc;CACf,CAAC,CAAC;AAEH,gCAAgC;AAChC,MAAM,CAAC,MAAM,8BAA8B,GAAsB,MAAM,CAAC,MAAM,CAAC;IAC7E,WAAW;IACX,cAAc;CACf,CAAC,CAAC;AAEH,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,+BAA+B,CAAC,CAAC;AACjE,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,8BAA8B,CAAC,CAAC;AAE3D,MAAM,UAAU,iCAAiC,CAAC,IAAY;IAC5D,OAAO,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,IAAY;IACvD,OAAO,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;WACtB,iCAAiC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AACjF,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,wBAAwB,CAAC,QAA2B;IAClE,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1E,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC3C,OAAO,IAAI,KAAK,SAAS,IAAI,4BAA4B,CAAC,IAAI,CAAC,CAAC;AAClE,CAAC"}
|
|
@@ -22,9 +22,11 @@ export type McpConnection = {
|
|
|
22
22
|
});
|
|
23
23
|
/** Server annotations are display hints, never authorization or verified runtime effects. */
|
|
24
24
|
export declare class McpAgentClient {
|
|
25
|
-
private readonly
|
|
26
|
-
readonly name: string;
|
|
25
|
+
private readonly config;
|
|
27
26
|
private readonly timeout;
|
|
27
|
+
private readonly provider;
|
|
28
|
+
private client;
|
|
29
|
+
readonly name: string;
|
|
28
30
|
private constructor();
|
|
29
31
|
static connect(config: McpConnection, signal?: AbortSignal, options?: McpConnectOptions): Promise<McpAgentClient>;
|
|
30
32
|
private static open;
|
|
@@ -201,6 +203,9 @@ export declare class McpAgentClient {
|
|
|
201
203
|
} | undefined;
|
|
202
204
|
description?: string | undefined;
|
|
203
205
|
}>;
|
|
206
|
+
/** Reopen the transport after a failure; the config and credentials are reused. */
|
|
207
|
+
private reconnect;
|
|
208
|
+
private call;
|
|
204
209
|
close(): Promise<void>;
|
|
205
210
|
}
|
|
206
211
|
//# sourceMappingURL=mcp-client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-client.d.ts","sourceRoot":"","sources":["../../../../src/adapters/node/mcp/mcp-client.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp-client.d.ts","sourceRoot":"","sources":["../../../../src/adapters/node/mcp/mcp-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,13 +7,17 @@ import { createHash } from "node:crypto";
|
|
|
7
7
|
import { FileOAuthProvider } from "./oauth-provider.js";
|
|
8
8
|
/** Server annotations are display hints, never authorization or verified runtime effects. */
|
|
9
9
|
export class McpAgentClient {
|
|
10
|
+
config;
|
|
11
|
+
timeout;
|
|
12
|
+
provider;
|
|
10
13
|
client;
|
|
11
14
|
name;
|
|
12
|
-
timeout
|
|
13
|
-
|
|
14
|
-
this.client = client;
|
|
15
|
-
this.name = name;
|
|
15
|
+
constructor(config, timeout, provider, client) {
|
|
16
|
+
this.config = config;
|
|
16
17
|
this.timeout = timeout;
|
|
18
|
+
this.provider = provider;
|
|
19
|
+
this.client = client;
|
|
20
|
+
this.name = config.name;
|
|
17
21
|
}
|
|
18
22
|
static async connect(config, signal, options) {
|
|
19
23
|
if (!/^[a-zA-Z0-9_-]{1,48}$/.test(config.name))
|
|
@@ -47,7 +51,7 @@ export class McpAgentClient {
|
|
|
47
51
|
// Drain stderr to prevent a verbose local server blocking on a full pipe.
|
|
48
52
|
if (transport instanceof StdioClientTransport)
|
|
49
53
|
transport.stderr?.on("data", () => { });
|
|
50
|
-
return new McpAgentClient(
|
|
54
|
+
return new McpAgentClient(config, timeout, provider, client);
|
|
51
55
|
}
|
|
52
56
|
catch (error) {
|
|
53
57
|
await transport.close().catch(() => { });
|
|
@@ -104,7 +108,24 @@ export class McpAgentClient {
|
|
|
104
108
|
trust: "external",
|
|
105
109
|
definition: { type: "function", function: { name, description: (tool.description ?? tool.name).slice(0, 4096), parameters: tool.inputSchema } },
|
|
106
110
|
execute: async (args, context) => {
|
|
107
|
-
const
|
|
111
|
+
const readOnly = tool.annotations?.readOnlyHint === true;
|
|
112
|
+
let result;
|
|
113
|
+
try {
|
|
114
|
+
result = await this.call(tool.name, args, context);
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
// Restore the connection for later calls. Only a side-effect-free
|
|
118
|
+
// tool is retried; a failed mutation keeps its unknown outcome.
|
|
119
|
+
let reconnected = false;
|
|
120
|
+
try {
|
|
121
|
+
await this.reconnect(context.signal);
|
|
122
|
+
reconnected = true;
|
|
123
|
+
}
|
|
124
|
+
catch { /* keep the original failure */ }
|
|
125
|
+
if (!readOnly || !reconnected)
|
|
126
|
+
throw error;
|
|
127
|
+
result = await this.call(tool.name, args, context);
|
|
128
|
+
}
|
|
108
129
|
if (result.isError)
|
|
109
130
|
throw new Error(`MCP ${this.name}/${tool.name}: ${JSON.stringify(result.content).slice(0, 2048)}`);
|
|
110
131
|
return { server: this.name, tool: tool.name, trust: "external", result };
|
|
@@ -123,6 +144,20 @@ export class McpAgentClient {
|
|
|
123
144
|
readResource(uri, signal) { return this.client.readResource({ uri }, { timeout: this.timeout, ...(signal ? { signal } : {}) }); }
|
|
124
145
|
listPrompts(cursor) { return this.client.listPrompts(cursor ? { cursor } : {}, { timeout: this.timeout }); }
|
|
125
146
|
getPrompt(name, args, signal) { return this.client.getPrompt({ name, arguments: args }, { timeout: this.timeout, ...(signal ? { signal } : {}) }); }
|
|
147
|
+
/** Reopen the transport after a failure; the config and credentials are reused. */
|
|
148
|
+
async reconnect(signal) {
|
|
149
|
+
const next = await McpAgentClient.open(this.config, this.timeout, signal, this.provider);
|
|
150
|
+
if (!next)
|
|
151
|
+
throw new Error(`MCP server ${this.name} requires authentication.`);
|
|
152
|
+
await this.client.close().catch(() => { });
|
|
153
|
+
this.client = next.client;
|
|
154
|
+
}
|
|
155
|
+
call(name, args, context) {
|
|
156
|
+
return this.client.callTool({ name, arguments: { ...args } }, undefined, {
|
|
157
|
+
signal: context.signal,
|
|
158
|
+
timeout: Math.max(1, Math.min(this.timeout, context.deadline - Date.now())),
|
|
159
|
+
});
|
|
160
|
+
}
|
|
126
161
|
async close() { await this.client.close(); }
|
|
127
162
|
}
|
|
128
163
|
//# sourceMappingURL=mcp-client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-client.js","sourceRoot":"","sources":["../../../../src/adapters/node/mcp/mcp-client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;AAClF,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp-client.js","sourceRoot":"","sources":["../../../../src/adapters/node/mcp/mcp-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { AgentEmbeddingPort } from "../../../agent/index.js";
|
|
2
|
+
export type OllamaEmbeddingFetch = (input: string | URL, init?: RequestInit) => Promise<Response>;
|
|
3
|
+
export interface OllamaEmbeddingsOptions {
|
|
4
|
+
readonly apiKey?: string;
|
|
5
|
+
readonly baseUrl: string;
|
|
6
|
+
readonly fetch?: OllamaEmbeddingFetch;
|
|
7
|
+
readonly maxBatch?: number;
|
|
8
|
+
readonly model: string;
|
|
9
|
+
readonly requestTimeoutMs?: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Ollama /api/embed adapter. Capability-gated: the host only mounts it when an
|
|
13
|
+
* embedding model is configured. Credentials are sent to remote endpoints but
|
|
14
|
+
* never to a localhost endpoint.
|
|
15
|
+
*/
|
|
16
|
+
export declare class OllamaEmbeddings implements AgentEmbeddingPort {
|
|
17
|
+
private readonly options;
|
|
18
|
+
readonly model: string;
|
|
19
|
+
private readonly fetchImpl;
|
|
20
|
+
private readonly maxBatch;
|
|
21
|
+
private readonly requestTimeoutMs;
|
|
22
|
+
constructor(options: OllamaEmbeddingsOptions);
|
|
23
|
+
embed(texts: readonly string[]): Promise<readonly (readonly number[])[]>;
|
|
24
|
+
private embedBatch;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=ollama-embeddings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama-embeddings.d.ts","sourceRoot":"","sources":["../../../../src/adapters/node/memory/ollama-embeddings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAElE,MAAM,MAAM,oBAAoB,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAElG,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,oBAAoB,CAAC;IACtC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACpC;AA0BD;;;;GAIG;AACH,qBAAa,gBAAiB,YAAW,kBAAkB;IAK7C,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJpC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuB;IACjD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;gBACb,OAAO,EAAE,uBAAuB;IAUvD,KAAK,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC;YAOhE,UAAU;CA2BzB"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
const MAX_RESPONSE_BYTES = 4 * 1024 * 1024;
|
|
2
|
+
const DEFAULT_MAX_BATCH = 16;
|
|
3
|
+
function isLocalhost(baseUrl) {
|
|
4
|
+
try {
|
|
5
|
+
const host = new URL(baseUrl).hostname;
|
|
6
|
+
return host === "localhost" || host === "127.0.0.1" || host === "::1" || host === "[::1]";
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
async function boundedText(response) {
|
|
13
|
+
const reader = response.body?.getReader();
|
|
14
|
+
if (!reader)
|
|
15
|
+
return "";
|
|
16
|
+
const decoder = new TextDecoder("utf-8", { fatal: true });
|
|
17
|
+
let text = "";
|
|
18
|
+
let bytes = 0;
|
|
19
|
+
while (true) {
|
|
20
|
+
const part = await reader.read();
|
|
21
|
+
if (part.done)
|
|
22
|
+
break;
|
|
23
|
+
bytes += part.value.byteLength;
|
|
24
|
+
if (bytes > MAX_RESPONSE_BYTES) {
|
|
25
|
+
await reader.cancel().catch(() => undefined);
|
|
26
|
+
throw new Error("Ollama embedding response exceeded 4 MiB.");
|
|
27
|
+
}
|
|
28
|
+
text += decoder.decode(part.value, { stream: true });
|
|
29
|
+
}
|
|
30
|
+
return text + decoder.decode();
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Ollama /api/embed adapter. Capability-gated: the host only mounts it when an
|
|
34
|
+
* embedding model is configured. Credentials are sent to remote endpoints but
|
|
35
|
+
* never to a localhost endpoint.
|
|
36
|
+
*/
|
|
37
|
+
export class OllamaEmbeddings {
|
|
38
|
+
options;
|
|
39
|
+
model;
|
|
40
|
+
fetchImpl;
|
|
41
|
+
maxBatch;
|
|
42
|
+
requestTimeoutMs;
|
|
43
|
+
constructor(options) {
|
|
44
|
+
this.options = options;
|
|
45
|
+
if (!options.model.trim())
|
|
46
|
+
throw new Error("An Ollama embedding model id is required.");
|
|
47
|
+
const url = new URL(options.baseUrl);
|
|
48
|
+
if (!["http:", "https:"].includes(url.protocol))
|
|
49
|
+
throw new Error("Ollama embedding base URL must use HTTP or HTTPS.");
|
|
50
|
+
if (url.username || url.password)
|
|
51
|
+
throw new Error("Ollama embedding base URL must not embed credentials.");
|
|
52
|
+
this.model = options.model.trim();
|
|
53
|
+
this.fetchImpl = options.fetch ?? globalThis.fetch;
|
|
54
|
+
this.maxBatch = Math.max(1, Math.min(64, options.maxBatch ?? DEFAULT_MAX_BATCH));
|
|
55
|
+
this.requestTimeoutMs = options.requestTimeoutMs ?? 60_000;
|
|
56
|
+
}
|
|
57
|
+
async embed(texts) {
|
|
58
|
+
const vectors = [];
|
|
59
|
+
for (let start = 0; start < texts.length; start += this.maxBatch) {
|
|
60
|
+
vectors.push(...await this.embedBatch(texts.slice(start, start + this.maxBatch)));
|
|
61
|
+
}
|
|
62
|
+
return vectors;
|
|
63
|
+
}
|
|
64
|
+
async embedBatch(texts) {
|
|
65
|
+
if (texts.length === 0)
|
|
66
|
+
return [];
|
|
67
|
+
const controller = new AbortController();
|
|
68
|
+
const timer = setTimeout(() => controller.abort(new Error("Ollama embedding request timed out.")), this.requestTimeoutMs);
|
|
69
|
+
try {
|
|
70
|
+
const endpoint = new URL("/api/embed", this.options.baseUrl).href;
|
|
71
|
+
const response = await this.fetchImpl(endpoint, {
|
|
72
|
+
method: "POST",
|
|
73
|
+
headers: {
|
|
74
|
+
"Content-Type": "application/json",
|
|
75
|
+
...(this.options.apiKey && !isLocalhost(this.options.baseUrl) ? { Authorization: `Bearer ${this.options.apiKey}` } : {}),
|
|
76
|
+
},
|
|
77
|
+
body: JSON.stringify({ model: this.model, input: [...texts] }),
|
|
78
|
+
signal: controller.signal,
|
|
79
|
+
});
|
|
80
|
+
const raw = await boundedText(response);
|
|
81
|
+
if (!response.ok)
|
|
82
|
+
throw new Error(`Ollama embedding failed (${response.status}): ${raw.slice(0, 300) || "no body"}`);
|
|
83
|
+
const parsed = JSON.parse(raw);
|
|
84
|
+
if (!Array.isArray(parsed.embeddings) || parsed.embeddings.length !== texts.length)
|
|
85
|
+
throw new Error("Ollama embedding response did not match the input batch.");
|
|
86
|
+
return parsed.embeddings.map((vector) => {
|
|
87
|
+
if (!Array.isArray(vector) || vector.length === 0 || vector.some(value => typeof value !== "number" || !Number.isFinite(value))) {
|
|
88
|
+
throw new Error("Ollama embedding response contained an invalid vector.");
|
|
89
|
+
}
|
|
90
|
+
return vector;
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
finally {
|
|
94
|
+
clearTimeout(timer);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=ollama-embeddings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama-embeddings.js","sourceRoot":"","sources":["../../../../src/adapters/node/memory/ollama-embeddings.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,16 @@
|
|
|
1
|
-
import type { AgentMemoryPort, MemoryRecord } from "../../../agent/index.js";
|
|
2
|
-
/**
|
|
1
|
+
import type { AgentEmbeddingPort, AgentMemoryConsolidation, AgentMemoryPort, MemoryRecord } from "../../../agent/index.js";
|
|
2
|
+
/**
|
|
3
|
+
* Optional Node >=22.13 adapter. No database or native imports occur from the
|
|
4
|
+
* core root. Ranking is hybrid: lexical (FTS5 bm25) + optional semantic cosine
|
|
5
|
+
* + recency + trust, capability-gated on a host-supplied embedding provider.
|
|
6
|
+
*/
|
|
3
7
|
export declare class SqliteAgentMemory implements AgentMemoryPort {
|
|
4
8
|
private readonly scope;
|
|
5
9
|
private readonly db;
|
|
6
|
-
|
|
10
|
+
private readonly embeddings;
|
|
11
|
+
constructor(path: string, scope: string, options?: {
|
|
12
|
+
embeddings?: AgentEmbeddingPort;
|
|
13
|
+
});
|
|
7
14
|
search(query: string, options?: {
|
|
8
15
|
limit?: number;
|
|
9
16
|
includeCandidates?: boolean;
|
|
@@ -17,6 +24,12 @@ export declare class SqliteAgentMemory implements AgentMemoryPort {
|
|
|
17
24
|
}): Promise<MemoryRecord>;
|
|
18
25
|
history(key: string): Promise<readonly MemoryRecord[]>;
|
|
19
26
|
forget(key: string): Promise<number>;
|
|
27
|
+
consolidate(options?: {
|
|
28
|
+
keepSupersededRevisions?: number;
|
|
29
|
+
}): AgentMemoryConsolidation;
|
|
20
30
|
close(): void;
|
|
31
|
+
private embedOne;
|
|
32
|
+
private storeEmbedding;
|
|
33
|
+
private loadVectors;
|
|
21
34
|
}
|
|
22
35
|
//# sourceMappingURL=sqlite-memory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite-memory.d.ts","sourceRoot":"","sources":["../../../../src/adapters/node/memory/sqlite-memory.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"sqlite-memory.d.ts","sourceRoot":"","sources":["../../../../src/adapters/node/memory/sqlite-memory.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAgC3H;;;;GAIG;AACH,qBAAa,iBAAkB,YAAW,eAAe;IAG7B,OAAO,CAAC,QAAQ,CAAC,KAAK;IAFhD,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAe;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiC;gBAChD,IAAI,EAAE,MAAM,EAAmB,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,UAAU,CAAC,EAAE,kBAAkB,CAAA;KAAO;IAmBrG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,iBAAiB,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC;IAyCtH,QAAQ,CAAC,KAAK,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,WAAW,GAAG,WAAW,CAAC;QAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,CAAC;IA0BtJ,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC;IAGtD,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAM1C,WAAW,CAAC,OAAO,GAAE;QAAE,uBAAuB,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,wBAAwB;IAazF,KAAK,IAAI,IAAI;YAEC,QAAQ;YAOR,cAAc;IAQ5B,OAAO,CAAC,WAAW;CASpB"}
|
|
@@ -5,16 +5,54 @@ import { dirname } from "node:path";
|
|
|
5
5
|
function record(row) {
|
|
6
6
|
return { id: String(row.id), key: String(row.memory_key), scope: String(row.scope), revision: Number(row.revision), content: String(row.content), source: String(row.source), contentHash: String(row.content_hash), status: row.status, trust: row.trust, updatedAt: String(row.updated_at) };
|
|
7
7
|
}
|
|
8
|
-
|
|
8
|
+
function encodeVector(vector) {
|
|
9
|
+
const floats = vector instanceof Float32Array ? vector : Float32Array.from(vector);
|
|
10
|
+
return Buffer.from(floats.buffer.slice(0, floats.byteLength));
|
|
11
|
+
}
|
|
12
|
+
function decodeVector(blob) {
|
|
13
|
+
const copy = Uint8Array.from(blob);
|
|
14
|
+
return new Float32Array(copy.buffer, copy.byteOffset, Math.floor(copy.byteLength / 4));
|
|
15
|
+
}
|
|
16
|
+
function cosine(left, right) {
|
|
17
|
+
const length = Math.min(left.length, right.length);
|
|
18
|
+
let dot = 0;
|
|
19
|
+
let normLeft = 0;
|
|
20
|
+
let normRight = 0;
|
|
21
|
+
for (let index = 0; index < length; index += 1) {
|
|
22
|
+
const a = left[index];
|
|
23
|
+
const b = right[index];
|
|
24
|
+
dot += a * b;
|
|
25
|
+
normLeft += a * a;
|
|
26
|
+
normRight += b * b;
|
|
27
|
+
}
|
|
28
|
+
if (normLeft === 0 || normRight === 0)
|
|
29
|
+
return 0;
|
|
30
|
+
return dot / Math.sqrt(normLeft * normRight);
|
|
31
|
+
}
|
|
32
|
+
/** Recency decays over a two-week half-life; listing (no query) leans on it most. */
|
|
33
|
+
function recencyScore(updatedAt, now) {
|
|
34
|
+
const parsed = Date.parse(updatedAt);
|
|
35
|
+
if (!Number.isFinite(parsed))
|
|
36
|
+
return 0;
|
|
37
|
+
const ageDays = Math.max(0, (now - parsed) / 86_400_000);
|
|
38
|
+
return 1 / (1 + ageDays / 14);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Optional Node >=22.13 adapter. No database or native imports occur from the
|
|
42
|
+
* core root. Ranking is hybrid: lexical (FTS5 bm25) + optional semantic cosine
|
|
43
|
+
* + recency + trust, capability-gated on a host-supplied embedding provider.
|
|
44
|
+
*/
|
|
9
45
|
export class SqliteAgentMemory {
|
|
10
46
|
scope;
|
|
11
47
|
db;
|
|
12
|
-
|
|
48
|
+
embeddings;
|
|
49
|
+
constructor(path, scope, options = {}) {
|
|
13
50
|
this.scope = scope;
|
|
14
51
|
if (!scope || scope.length > 1024)
|
|
15
52
|
throw new Error("A bounded host-owned memory scope is required.");
|
|
16
53
|
if (path !== ":memory:")
|
|
17
54
|
mkdirSync(dirname(path), { recursive: true, mode: 0o700 });
|
|
55
|
+
this.embeddings = options.embeddings;
|
|
18
56
|
this.db = new DatabaseSync(path);
|
|
19
57
|
if (path !== ":memory:")
|
|
20
58
|
chmodSync(path, 0o600);
|
|
@@ -25,18 +63,53 @@ export class SqliteAgentMemory {
|
|
|
25
63
|
content TEXT NOT NULL, source TEXT NOT NULL, content_hash TEXT NOT NULL, status TEXT NOT NULL, trust TEXT NOT NULL, updated_at TEXT NOT NULL,
|
|
26
64
|
UNIQUE(scope,memory_key,revision));
|
|
27
65
|
CREATE VIRTUAL TABLE IF NOT EXISTS memory_search USING fts5(id UNINDEXED, content, tokenize='unicode61');
|
|
66
|
+
CREATE TABLE IF NOT EXISTS memory_embeddings(memory_id TEXT PRIMARY KEY, model TEXT NOT NULL, dims INTEGER NOT NULL, vector BLOB NOT NULL);
|
|
28
67
|
CREATE TRIGGER IF NOT EXISTS memory_insert AFTER INSERT ON memories BEGIN INSERT INTO memory_search VALUES(new.id,new.content); END;
|
|
29
68
|
CREATE TRIGGER IF NOT EXISTS memory_delete AFTER DELETE ON memories BEGIN DELETE FROM memory_search WHERE id=old.id; END;
|
|
69
|
+
CREATE TRIGGER IF NOT EXISTS memory_delete_embeddings AFTER DELETE ON memories BEGIN DELETE FROM memory_embeddings WHERE memory_id=old.id; END;
|
|
30
70
|
CREATE INDEX IF NOT EXISTS memory_scope ON memories(scope,status,memory_key);`);
|
|
31
71
|
}
|
|
32
72
|
async search(query, options = {}) {
|
|
33
73
|
const limit = Math.max(1, Math.min(50, Math.floor(options.limit ?? 8)));
|
|
34
74
|
const tokens = query.match(/[\p{L}\p{N}_]+/gu)?.slice(0, 24) ?? [];
|
|
35
75
|
const trust = options.includeCandidates ? "" : " AND m.trust='confirmed'";
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
76
|
+
const pool = Math.max(limit * 8, 64);
|
|
77
|
+
let rows = [];
|
|
78
|
+
if (tokens.length) {
|
|
79
|
+
const match = tokens.map(token => `"${token}"`).join(" OR ");
|
|
80
|
+
rows = this.db.prepare(`SELECT m.*, bm25(memory_search) AS rank FROM memory_search f JOIN memories m ON m.id=f.id WHERE memory_search MATCH ? AND m.scope=? AND m.status='active'${trust} ORDER BY bm25(memory_search),m.updated_at DESC LIMIT ?`)
|
|
81
|
+
.all(match, this.scope, pool);
|
|
82
|
+
}
|
|
83
|
+
// No lexical hits (or a bare listing): fall back to recent active notes so
|
|
84
|
+
// semantic ranking can still surface the right record.
|
|
85
|
+
if (rows.length === 0 && (tokens.length === 0 || this.embeddings !== undefined)) {
|
|
86
|
+
rows = this.db.prepare(`SELECT m.*, 0 AS rank FROM memories m WHERE m.scope=? AND m.status='active'${trust} ORDER BY m.updated_at DESC LIMIT ?`)
|
|
87
|
+
.all(this.scope, pool);
|
|
88
|
+
}
|
|
89
|
+
if (rows.length === 0)
|
|
90
|
+
return [];
|
|
91
|
+
const now = Date.now();
|
|
92
|
+
const queryVector = this.embeddings && tokens.length ? await this.embedOne(query) : undefined;
|
|
93
|
+
const vectors = this.loadVectors(rows.map(row => String(row.id)));
|
|
94
|
+
const strengths = rows.map(row => Math.max(0, -Number(row.rank ?? 0)));
|
|
95
|
+
const maxStrength = Math.max(0, ...strengths);
|
|
96
|
+
const scored = rows.map((row, index) => {
|
|
97
|
+
const lexical = maxStrength > 0 ? strengths[index] / maxStrength : 0;
|
|
98
|
+
const vector = vectors.get(String(row.id));
|
|
99
|
+
const semantic = queryVector && vector ? Math.max(0, cosine(queryVector, vector)) : 0;
|
|
100
|
+
const recency = recencyScore(String(row.updated_at), now);
|
|
101
|
+
const trustScore = row.trust === "confirmed" ? 1 : 0.5;
|
|
102
|
+
const score = queryVector
|
|
103
|
+
? 0.35 * lexical + 0.4 * semantic + 0.15 * recency + 0.1 * trustScore
|
|
104
|
+
: tokens.length
|
|
105
|
+
? 0.6 * lexical + 0.25 * recency + 0.15 * trustScore
|
|
106
|
+
: 0.7 * recency + 0.3 * trustScore;
|
|
107
|
+
return { row, score };
|
|
108
|
+
});
|
|
109
|
+
scored.sort((left, right) => right.score - left.score
|
|
110
|
+
|| String(right.row.updated_at).localeCompare(String(left.row.updated_at))
|
|
111
|
+
|| String(left.row.id).localeCompare(String(right.row.id)));
|
|
112
|
+
return scored.slice(0, limit).map(entry => record(entry.row));
|
|
40
113
|
}
|
|
41
114
|
async remember(input) {
|
|
42
115
|
if (!input.key.trim() || input.key.length > 256 || !input.content.trim() || input.content.length > 16000 || !input.source.trim() || input.source.length > 2048)
|
|
@@ -46,28 +119,32 @@ export class SqliteAgentMemory {
|
|
|
46
119
|
throw new Error("Invalid memory trust.");
|
|
47
120
|
const hash = createHash("sha256").update(input.content).digest("hex");
|
|
48
121
|
this.db.exec("BEGIN IMMEDIATE");
|
|
122
|
+
let stored;
|
|
49
123
|
try {
|
|
50
124
|
const previous = this.db.prepare("SELECT * FROM memories WHERE scope=? AND memory_key=? AND status='active'").get(this.scope, input.key);
|
|
51
125
|
if (input.expectedRevision !== undefined && input.expectedRevision !== Number(previous?.revision ?? 0))
|
|
52
126
|
throw new Error("Memory revision conflict.");
|
|
53
127
|
if (previous?.content_hash === hash && previous.source === input.source && previous.trust === trust) {
|
|
54
128
|
this.db.exec("COMMIT");
|
|
55
|
-
|
|
129
|
+
stored = record(previous);
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
// A generated candidate cannot silently supersede an explicitly confirmed note.
|
|
133
|
+
if (previous?.trust === "confirmed" && trust === "candidate")
|
|
134
|
+
throw new Error("A candidate cannot replace a confirmed memory; choose a new key.");
|
|
135
|
+
this.db.prepare("UPDATE memories SET status='superseded' WHERE scope=? AND memory_key=?").run(this.scope, input.key);
|
|
136
|
+
const id = randomUUID();
|
|
137
|
+
this.db.prepare("INSERT INTO memories VALUES(?,?,?,?,?,?,?,?,?,?)").run(id, this.scope, input.key, Number(previous?.revision ?? 0) + 1, input.content, input.source, hash, "active", trust, new Date().toISOString());
|
|
138
|
+
stored = record(this.db.prepare("SELECT * FROM memories WHERE id=?").get(id));
|
|
139
|
+
this.db.exec("COMMIT");
|
|
56
140
|
}
|
|
57
|
-
// A generated candidate cannot silently supersede an explicitly confirmed note.
|
|
58
|
-
if (previous?.trust === "confirmed" && trust === "candidate")
|
|
59
|
-
throw new Error("A candidate cannot replace a confirmed memory; choose a new key.");
|
|
60
|
-
this.db.prepare("UPDATE memories SET status='superseded' WHERE scope=? AND memory_key=?").run(this.scope, input.key);
|
|
61
|
-
const id = randomUUID();
|
|
62
|
-
this.db.prepare("INSERT INTO memories VALUES(?,?,?,?,?,?,?,?,?,?)").run(id, this.scope, input.key, Number(previous?.revision ?? 0) + 1, input.content, input.source, hash, "active", trust, new Date().toISOString());
|
|
63
|
-
const next = record(this.db.prepare("SELECT * FROM memories WHERE id=?").get(id));
|
|
64
|
-
this.db.exec("COMMIT");
|
|
65
|
-
return next;
|
|
66
141
|
}
|
|
67
142
|
catch (error) {
|
|
68
143
|
this.db.exec("ROLLBACK");
|
|
69
144
|
throw error;
|
|
70
145
|
}
|
|
146
|
+
await this.storeEmbedding(stored.id, stored.content);
|
|
147
|
+
return stored;
|
|
71
148
|
}
|
|
72
149
|
async history(key) {
|
|
73
150
|
return this.db.prepare("SELECT * FROM memories WHERE scope=? AND memory_key=? ORDER BY revision").all(this.scope, key).map(record);
|
|
@@ -78,6 +155,51 @@ export class SqliteAgentMemory {
|
|
|
78
155
|
this.db.exec("PRAGMA wal_checkpoint(TRUNCATE)");
|
|
79
156
|
return Number(result.changes);
|
|
80
157
|
}
|
|
158
|
+
consolidate(options = {}) {
|
|
159
|
+
const keep = Math.max(0, Math.min(100, Math.floor(options.keepSupersededRevisions ?? 5)));
|
|
160
|
+
const removedSuperseded = Number(this.db.prepare(`DELETE FROM memories WHERE status='superseded' AND id NOT IN (
|
|
161
|
+
SELECT id FROM (
|
|
162
|
+
SELECT id, ROW_NUMBER() OVER (PARTITION BY scope, memory_key ORDER BY revision DESC) AS position
|
|
163
|
+
FROM memories WHERE status='superseded'
|
|
164
|
+
) WHERE position <= ?
|
|
165
|
+
)`).run(keep).changes);
|
|
166
|
+
const removedOrphanEmbeddings = Number(this.db.prepare("DELETE FROM memory_embeddings WHERE memory_id NOT IN (SELECT id FROM memories)").run().changes);
|
|
167
|
+
this.db.exec("PRAGMA wal_checkpoint(TRUNCATE)");
|
|
168
|
+
return { removedOrphanEmbeddings, removedSuperseded };
|
|
169
|
+
}
|
|
81
170
|
close() { this.db.close(); }
|
|
171
|
+
async embedOne(text) {
|
|
172
|
+
if (!this.embeddings)
|
|
173
|
+
return undefined;
|
|
174
|
+
try {
|
|
175
|
+
const [vector] = await this.embeddings.embed([text]);
|
|
176
|
+
return vector && vector.length > 0 ? Float32Array.from(vector) : undefined;
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
return undefined;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
async storeEmbedding(memoryId, content) {
|
|
183
|
+
if (!this.embeddings)
|
|
184
|
+
return;
|
|
185
|
+
const existing = this.db.prepare("SELECT dims FROM memory_embeddings WHERE memory_id=? AND model=?").get(memoryId, this.embeddings.model);
|
|
186
|
+
if (existing)
|
|
187
|
+
return;
|
|
188
|
+
const vector = await this.embedOne(content);
|
|
189
|
+
if (!vector)
|
|
190
|
+
return;
|
|
191
|
+
this.db.prepare("INSERT OR REPLACE INTO memory_embeddings(memory_id, model, dims, vector) VALUES(?,?,?,?)").run(memoryId, this.embeddings.model, vector.length, encodeVector(vector));
|
|
192
|
+
}
|
|
193
|
+
loadVectors(ids) {
|
|
194
|
+
const vectors = new Map();
|
|
195
|
+
if (!this.embeddings || ids.length === 0)
|
|
196
|
+
return vectors;
|
|
197
|
+
const placeholders = ids.map(() => "?").join(",");
|
|
198
|
+
const rows = this.db.prepare(`SELECT memory_id, vector FROM memory_embeddings WHERE model=? AND memory_id IN (${placeholders})`)
|
|
199
|
+
.all(this.embeddings.model, ...ids);
|
|
200
|
+
for (const row of rows)
|
|
201
|
+
vectors.set(String(row.memory_id), decodeVector(row.vector));
|
|
202
|
+
return vectors;
|
|
203
|
+
}
|
|
82
204
|
}
|
|
83
205
|
//# sourceMappingURL=sqlite-memory.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite-memory.js","sourceRoot":"","sources":["../../../../src/adapters/node/memory/sqlite-memory.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sqlite-memory.js","sourceRoot":"","sources":["../../../../src/adapters/node/memory/sqlite-memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ollama-chat-stream.d.ts","sourceRoot":"","sources":["../../../../src/adapters/node/provider/ollama-chat-stream.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,aAAa,EACnB,MAAM,yBAAyB,CAAC;AAIjC,eAAO,MAAM,6BAA6B,EAAE,aAK1C,CAAC;AAEH,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC;IAClC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAC3C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AA4BD,0EAA0E;AAC1E,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,0BAA0B;;qBAWpD,OAAO,KAAG,SAAS,gBAAgB,EAAE;;
|
|
1
|
+
{"version":3,"file":"ollama-chat-stream.d.ts","sourceRoot":"","sources":["../../../../src/adapters/node/provider/ollama-chat-stream.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,aAAa,EACnB,MAAM,yBAAyB,CAAC;AAIjC,eAAO,MAAM,6BAA6B,EAAE,aAK1C,CAAC;AAEH,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC;IAClC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAC3C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AA4BD,0EAA0E;AAC1E,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,0BAA0B;;qBAWpD,OAAO,KAAG,SAAS,gBAAgB,EAAE;;cAyHjD,SAAS,gBAAgB,EAAE;EAMxC;AAED,wFAAwF;AACxF,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,EAAE,OAAO,EAAE,0BAA0B,GAAG,SAAS,gBAAgB,EAAE,CAStI"}
|
|
@@ -108,9 +108,13 @@ export function createOllamaChatNormalizer(options) {
|
|
|
108
108
|
terminalSeen = true;
|
|
109
109
|
const inputTokens = nonNegativeInteger(rawChunk.prompt_eval_count);
|
|
110
110
|
const outputTokens = nonNegativeInteger(rawChunk.eval_count);
|
|
111
|
+
// Ollama >= 0.34 reports prefix-cache reuse as prompt_eval_cached_count;
|
|
112
|
+
// the OpenAI-compatible /v1 path reports prompt_tokens_details.cached_tokens.
|
|
113
|
+
const cachedInputTokens = nonNegativeInteger(rawChunk.prompt_eval_cached_count);
|
|
111
114
|
const usage = Object.freeze({
|
|
112
115
|
...(inputTokens === undefined ? {} : { inputTokens }),
|
|
113
116
|
...(outputTokens === undefined ? {} : { outputTokens }),
|
|
117
|
+
...(cachedInputTokens === undefined ? {} : { cachedInputTokens }),
|
|
114
118
|
...(inputTokens === undefined || outputTokens === undefined ? {} : { totalTokens: inputTokens + outputTokens }),
|
|
115
119
|
});
|
|
116
120
|
if (Object.keys(usage).length > 0)
|