hoomanjs 1.29.2 → 1.31.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/README.md +216 -69
- package/dist/acp/acp-agent.d.ts +5 -5
- package/dist/acp/acp-agent.js +55 -54
- package/dist/acp/acp-agent.js.map +1 -1
- package/dist/acp/approvals.d.ts +3 -3
- package/dist/acp/approvals.js +73 -115
- package/dist/acp/approvals.js.map +1 -1
- package/dist/acp/sessions/options.js +11 -25
- package/dist/acp/sessions/options.js.map +1 -1
- package/dist/acp/utils/tool-kind.js +1 -5
- package/dist/acp/utils/tool-kind.js.map +1 -1
- package/dist/chat/app.d.ts +5 -1
- package/dist/chat/app.js +469 -234
- package/dist/chat/app.js.map +1 -1
- package/dist/chat/approvals.d.ts +4 -3
- package/dist/chat/approvals.js +11 -45
- package/dist/chat/approvals.js.map +1 -1
- package/dist/chat/components/BottomChrome.d.ts +52 -0
- package/dist/chat/components/BottomChrome.js +12 -0
- package/dist/chat/components/BottomChrome.js.map +1 -0
- package/dist/chat/components/ChatMessage.d.ts +2 -2
- package/dist/chat/components/ChatMessage.js +5 -6
- package/dist/chat/components/ChatMessage.js.map +1 -1
- package/dist/chat/components/ChromePicker.d.ts +17 -0
- package/dist/chat/components/ChromePicker.js +35 -0
- package/dist/chat/components/ChromePicker.js.map +1 -0
- package/dist/chat/components/EmptyChatBanner.js +2 -3
- package/dist/chat/components/EmptyChatBanner.js.map +1 -1
- package/dist/chat/components/StatusBar.d.ts +1 -2
- package/dist/chat/components/StatusBar.js +8 -5
- package/dist/chat/components/StatusBar.js.map +1 -1
- package/dist/chat/components/ThoughtEvent.d.ts +7 -0
- package/dist/chat/components/ThoughtEvent.js +30 -0
- package/dist/chat/components/ThoughtEvent.js.map +1 -0
- package/dist/chat/components/TodoPanel.js +52 -2
- package/dist/chat/components/TodoPanel.js.map +1 -1
- package/dist/chat/components/ToolEvent.js +1 -1
- package/dist/chat/components/ToolEvent.js.map +1 -1
- package/dist/chat/components/Transcript.d.ts +11 -2
- package/dist/chat/components/Transcript.js +78 -4
- package/dist/chat/components/Transcript.js.map +1 -1
- package/dist/chat/components/markdown/BlockRenderer.js +7 -7
- package/dist/chat/components/markdown/BlockRenderer.js.map +1 -1
- package/dist/chat/components/markdown/MarkdownMessage.js +1 -1
- package/dist/chat/components/markdown/MarkdownMessage.js.map +1 -1
- package/dist/chat/components/shared.js +2 -0
- package/dist/chat/components/shared.js.map +1 -1
- package/dist/chat/index.d.ts +4 -0
- package/dist/chat/index.js +21 -4
- package/dist/chat/index.js.map +1 -1
- package/dist/chat/steering.d.ts +20 -0
- package/dist/chat/steering.js +67 -0
- package/dist/chat/steering.js.map +1 -0
- package/dist/chat/types.d.ts +5 -1
- package/dist/cli.js +91 -13
- package/dist/cli.js.map +1 -1
- package/dist/configure/app.d.ts +1 -1
- package/dist/configure/app.js +581 -303
- package/dist/configure/app.js.map +1 -1
- package/dist/configure/components/MenuScreen.d.ts +4 -2
- package/dist/configure/components/MenuScreen.js +33 -6
- package/dist/configure/components/MenuScreen.js.map +1 -1
- package/dist/configure/components/SelectMenuItem.d.ts +1 -0
- package/dist/configure/components/SelectMenuItem.js +19 -10
- package/dist/configure/components/SelectMenuItem.js.map +1 -1
- package/dist/configure/index.js +4 -2
- package/dist/configure/index.js.map +1 -1
- package/dist/configure/types.d.ts +14 -12
- package/dist/configure/utils.d.ts +2 -0
- package/dist/configure/utils.js +21 -2
- package/dist/configure/utils.js.map +1 -1
- package/dist/core/agent/index.d.ts +3 -3
- package/dist/core/agent/index.js +26 -29
- package/dist/core/agent/index.js.map +1 -1
- package/dist/core/agent/mode-aware-tool-registry.js +2 -1
- package/dist/core/agent/mode-aware-tool-registry.js.map +1 -1
- package/dist/core/approvals/intervention.d.ts +34 -0
- package/dist/core/approvals/intervention.js +94 -0
- package/dist/core/approvals/intervention.js.map +1 -0
- package/dist/core/config.d.ts +49 -28
- package/dist/core/config.js +85 -26
- package/dist/core/config.js.map +1 -1
- package/dist/core/context/index.d.ts +11 -2
- package/dist/core/context/index.js +54 -4
- package/dist/core/context/index.js.map +1 -1
- package/dist/core/context/model-extractor.d.ts +13 -0
- package/dist/core/context/model-extractor.js +98 -0
- package/dist/core/context/model-extractor.js.map +1 -0
- package/dist/core/index.d.ts +6 -2
- package/dist/core/index.js +6 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/mcp/config.d.ts +28 -0
- package/dist/core/mcp/index.d.ts +5 -3
- package/dist/core/mcp/index.js +4 -2
- package/dist/core/mcp/index.js.map +1 -1
- package/dist/core/mcp/manager.d.ts +14 -1
- package/dist/core/mcp/manager.js +76 -4
- package/dist/core/mcp/manager.js.map +1 -1
- package/dist/core/mcp/oauth/callback-server.d.ts +16 -0
- package/dist/core/mcp/oauth/callback-server.js +134 -0
- package/dist/core/mcp/oauth/callback-server.js.map +1 -0
- package/dist/core/mcp/oauth/identity.d.ts +9 -0
- package/dist/core/mcp/oauth/identity.js +31 -0
- package/dist/core/mcp/oauth/identity.js.map +1 -0
- package/dist/core/mcp/oauth/index.d.ts +11 -0
- package/dist/core/mcp/oauth/index.js +15 -0
- package/dist/core/mcp/oauth/index.js.map +1 -0
- package/dist/core/mcp/oauth/provider.d.ts +43 -0
- package/dist/core/mcp/oauth/provider.js +203 -0
- package/dist/core/mcp/oauth/provider.js.map +1 -0
- package/dist/core/mcp/oauth/service.d.ts +29 -0
- package/dist/core/mcp/oauth/service.js +139 -0
- package/dist/core/mcp/oauth/service.js.map +1 -0
- package/dist/core/mcp/oauth/store.d.ts +14 -0
- package/dist/core/mcp/oauth/store.js +86 -0
- package/dist/core/mcp/oauth/store.js.map +1 -0
- package/dist/core/mcp/oauth/types.d.ts +87 -0
- package/dist/core/mcp/oauth/types.js +45 -0
- package/dist/core/mcp/oauth/types.js.map +1 -0
- package/dist/core/mcp/types.d.ts +56 -0
- package/dist/core/mcp/types.js +3 -0
- package/dist/core/mcp/types.js.map +1 -1
- package/dist/core/memory/file-store.d.ts +24 -0
- package/dist/core/memory/file-store.js +151 -0
- package/dist/core/memory/file-store.js.map +1 -0
- package/dist/core/memory/index.d.ts +2 -5
- package/dist/core/memory/index.js +2 -3
- package/dist/core/memory/index.js.map +1 -1
- package/dist/core/memory/runtime.d.ts +4 -0
- package/dist/core/memory/runtime.js +37 -0
- package/dist/core/memory/runtime.js.map +1 -0
- package/dist/core/models/anthropic.js +24 -1
- package/dist/core/models/anthropic.js.map +1 -1
- package/dist/core/models/moonshot.js +33 -1
- package/dist/core/models/moonshot.js.map +1 -1
- package/dist/core/modes/definitions.d.ts +19 -0
- package/dist/core/modes/definitions.js +99 -0
- package/dist/core/modes/definitions.js.map +1 -0
- package/dist/core/modes/index.d.ts +3 -0
- package/dist/core/modes/index.js +4 -0
- package/dist/core/modes/index.js.map +1 -0
- package/dist/core/modes/registry.d.ts +9 -0
- package/dist/core/modes/registry.js +57 -0
- package/dist/core/modes/registry.js.map +1 -0
- package/dist/core/modes/schema.d.ts +5 -0
- package/dist/core/modes/schema.js +6 -0
- package/dist/core/modes/schema.js.map +1 -0
- package/dist/core/prompts/agents/research.md +8 -8
- package/dist/core/prompts/bundled.d.ts +3 -0
- package/dist/core/prompts/bundled.js +14 -0
- package/dist/core/prompts/bundled.js.map +1 -0
- package/dist/core/prompts/environment.d.ts +0 -1
- package/dist/core/prompts/environment.js +0 -2
- package/dist/core/prompts/environment.js.map +1 -1
- package/dist/core/prompts/index.d.ts +1 -4
- package/dist/core/prompts/index.js +1 -7
- package/dist/core/prompts/index.js.map +1 -1
- package/dist/core/prompts/modes/agent.md +3 -0
- package/dist/core/prompts/modes/ask.md +5 -3
- package/dist/core/prompts/modes/plan.md +2 -2
- package/dist/core/prompts/runtime.d.ts +10 -0
- package/dist/core/prompts/runtime.js +136 -0
- package/dist/core/prompts/runtime.js.map +1 -0
- package/dist/core/prompts/session-mode-appendix.d.ts +3 -9
- package/dist/core/prompts/session-mode-appendix.js +32 -69
- package/dist/core/prompts/session-mode-appendix.js.map +1 -1
- package/dist/core/prompts/static/environment.md +2 -2
- package/dist/core/prompts/static/filesystem.md +2 -0
- package/dist/core/prompts/static/init.md +25 -0
- package/dist/core/prompts/static/memory.md +9 -123
- package/dist/core/prompts/static/planning.md +1 -1
- package/dist/core/prompts/static/skills.md +6 -5
- package/dist/core/prompts/static/subagents.md +2 -2
- package/dist/core/prompts/static/web-search.md +2 -1
- package/dist/core/prompts/system.js +12 -29
- package/dist/core/prompts/system.js.map +1 -1
- package/dist/core/skills/built-in/hooman-config/SKILL.md +105 -32
- package/dist/core/skills/built-in/hooman-skills/SKILL.md +1 -1
- package/dist/core/skills/index.d.ts +1 -0
- package/dist/core/skills/index.js +1 -0
- package/dist/core/skills/index.js.map +1 -1
- package/dist/core/skills/plugin.d.ts +7 -0
- package/dist/core/skills/plugin.js +40 -0
- package/dist/core/skills/plugin.js.map +1 -0
- package/dist/core/state/agent-app-state.d.ts +1 -1
- package/dist/core/state/agent-app-state.js +1 -1
- package/dist/core/state/session-mode.d.ts +2 -9
- package/dist/core/state/session-mode.js +4 -12
- package/dist/core/state/session-mode.js.map +1 -1
- package/dist/core/state/tool-approvals.d.ts +4 -8
- package/dist/core/state/tool-approvals.js +14 -76
- package/dist/core/state/tool-approvals.js.map +1 -1
- package/dist/core/subagents/index.d.ts +3 -0
- package/dist/core/subagents/index.js +4 -0
- package/dist/core/subagents/index.js.map +1 -0
- package/dist/core/subagents/research.d.ts +16 -0
- package/dist/core/subagents/research.js +58 -0
- package/dist/core/subagents/research.js.map +1 -0
- package/dist/core/{agents → subagents}/runner.d.ts +6 -5
- package/dist/core/{agents → subagents}/runner.js +8 -10
- package/dist/core/subagents/runner.js.map +1 -0
- package/dist/core/{agents/tools.d.ts → subagents/tool.d.ts} +6 -6
- package/dist/core/{agents/tools.js → subagents/tool.js} +14 -16
- package/dist/core/subagents/tool.js.map +1 -0
- package/dist/core/tools/filesystem.d.ts +1 -0
- package/dist/core/tools/filesystem.js +38 -3
- package/dist/core/tools/filesystem.js.map +1 -1
- package/dist/core/tools/index.d.ts +1 -1
- package/dist/core/tools/index.js +1 -1
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/plan.js +2 -6
- package/dist/core/tools/plan.js.map +1 -1
- package/dist/core/tools/time.js +1 -1
- package/dist/core/tools/time.js.map +1 -1
- package/dist/core/utils/browser.d.ts +1 -0
- package/dist/core/utils/browser.js +25 -0
- package/dist/core/utils/browser.js.map +1 -0
- package/dist/core/utils/paths.d.ts +2 -4
- package/dist/core/utils/paths.js +2 -4
- package/dist/core/utils/paths.js.map +1 -1
- package/dist/daemon/approvals.d.ts +2 -2
- package/dist/daemon/approvals.js +51 -56
- package/dist/daemon/approvals.js.map +1 -1
- package/dist/daemon/index.js +9 -6
- package/dist/daemon/index.js.map +1 -1
- package/dist/exec/approvals.d.ts +2 -4
- package/dist/exec/approvals.js +16 -48
- package/dist/exec/approvals.js.map +1 -1
- package/dist/index.d.ts +13 -18
- package/dist/index.js +9 -11
- package/dist/index.js.map +1 -1
- package/package.json +5 -18
- package/dist/chat/components/ScrollView.d.ts +0 -106
- package/dist/chat/components/ScrollView.js +0 -80
- package/dist/chat/components/ScrollView.js.map +0 -1
- package/dist/chat/components/TranscriptViewport.d.ts +0 -9
- package/dist/chat/components/TranscriptViewport.js +0 -124
- package/dist/chat/components/TranscriptViewport.js.map +0 -1
- package/dist/core/agents/definitions.d.ts +0 -12
- package/dist/core/agents/definitions.js +0 -20
- package/dist/core/agents/definitions.js.map +0 -1
- package/dist/core/agents/index.d.ts +0 -4
- package/dist/core/agents/index.js +0 -5
- package/dist/core/agents/index.js.map +0 -1
- package/dist/core/agents/registry.d.ts +0 -5
- package/dist/core/agents/registry.js +0 -84
- package/dist/core/agents/registry.js.map +0 -1
- package/dist/core/agents/runner.js.map +0 -1
- package/dist/core/agents/tools.js.map +0 -1
- package/dist/core/inference/embedder.d.ts +0 -26
- package/dist/core/inference/embedder.js +0 -85
- package/dist/core/inference/embedder.js.map +0 -1
- package/dist/core/inference/index.d.ts +0 -9
- package/dist/core/inference/index.js +0 -13
- package/dist/core/inference/index.js.map +0 -1
- package/dist/core/inference/loader.d.ts +0 -16
- package/dist/core/inference/loader.js +0 -129
- package/dist/core/inference/loader.js.map +0 -1
- package/dist/core/inference/reranker.d.ts +0 -28
- package/dist/core/inference/reranker.js +0 -66
- package/dist/core/inference/reranker.js.map +0 -1
- package/dist/core/memory/brain.d.ts +0 -25
- package/dist/core/memory/brain.js +0 -137
- package/dist/core/memory/brain.js.map +0 -1
- package/dist/core/memory/database.d.ts +0 -4
- package/dist/core/memory/database.js +0 -87
- package/dist/core/memory/database.js.map +0 -1
- package/dist/core/memory/tools.d.ts +0 -16
- package/dist/core/memory/tools.js +0 -110
- package/dist/core/memory/tools.js.map +0 -1
- package/dist/core/memory/types.d.ts +0 -11
- package/dist/core/memory/types.js +0 -2
- package/dist/core/memory/types.js.map +0 -1
- package/dist/core/prompts/skills.d.ts +0 -15
- package/dist/core/prompts/skills.js +0 -92
- package/dist/core/prompts/skills.js.map +0 -1
- package/dist/core/prompts/static/wiki.md +0 -25
- package/dist/core/wiki/converters.d.ts +0 -12
- package/dist/core/wiki/converters.js +0 -73
- package/dist/core/wiki/converters.js.map +0 -1
- package/dist/core/wiki/database.d.ts +0 -39
- package/dist/core/wiki/database.js +0 -177
- package/dist/core/wiki/database.js.map +0 -1
- package/dist/core/wiki/index.d.ts +0 -7
- package/dist/core/wiki/index.js +0 -5
- package/dist/core/wiki/index.js.map +0 -1
- package/dist/core/wiki/storage.d.ts +0 -38
- package/dist/core/wiki/storage.js +0 -206
- package/dist/core/wiki/storage.js.map +0 -1
- package/dist/core/wiki/tools.d.ts +0 -5
- package/dist/core/wiki/tools.js +0 -32
- package/dist/core/wiki/tools.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"embedder.js","sourceRoot":"","sources":["../../../src/core/inference/embedder.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import type { GgufEmbedder } from "./embedder.js";
|
|
2
|
-
export { GgufEmbedder, type GgufEmbedderOptions, formatDocForEmbedding, formatQueryForEmbedding, isQwen3EmbeddingModel, } from "./embedder.js";
|
|
3
|
-
export { GgufReranker, type GgufRerankerOptions } from "./reranker.js";
|
|
4
|
-
export type { LlamaGpuMode } from "./loader.js";
|
|
5
|
-
/**
|
|
6
|
-
* Produce an embedding vector (same numeric space as stored memories).
|
|
7
|
-
* Pass `mode: "query"` for search queries; default embeds like a document.
|
|
8
|
-
*/
|
|
9
|
-
export declare function embed(embedder: GgufEmbedder, text: string, mode?: "document" | "query"): Promise<number[]>;
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export { GgufEmbedder, formatDocForEmbedding, formatQueryForEmbedding, isQwen3EmbeddingModel, } from "./embedder.js";
|
|
2
|
-
export { GgufReranker } from "./reranker.js";
|
|
3
|
-
/**
|
|
4
|
-
* Produce an embedding vector (same numeric space as stored memories).
|
|
5
|
-
* Pass `mode: "query"` for search queries; default embeds like a document.
|
|
6
|
-
*/
|
|
7
|
-
export async function embed(embedder, text, mode = "document") {
|
|
8
|
-
const v = mode === "query"
|
|
9
|
-
? await embedder.embedQuery(text)
|
|
10
|
-
: await embedder.embedDocument(text);
|
|
11
|
-
return Array.from(v);
|
|
12
|
-
}
|
|
13
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/inference/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,YAAY,EAEZ,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,YAAY,EAA4B,MAAM,eAAe,CAAC;AAGvE;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK,CACzB,QAAsB,EACtB,IAAY,EACZ,OAA6B,UAAU;IAEvC,MAAM,CAAC,GACL,IAAI,KAAK,OAAO;QACd,CAAC,CAAC,MAAM,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC;QACjC,CAAC,CAAC,MAAM,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IACzC,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACvB,CAAC"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { type Llama, type LlamaEmbeddingContext, type LlamaModel } from "node-llama-cpp";
|
|
2
|
-
export type RankingContext = Awaited<ReturnType<LlamaModel["createRankingContext"]>>;
|
|
3
|
-
export declare const RERANK_TEMPLATE_OVERHEAD = 512;
|
|
4
|
-
export type LlamaGpuMode = "auto" | "metal" | "vulkan" | "cuda" | false;
|
|
5
|
-
export declare function loadEmbedder(dir: string, uri: string): Promise<{
|
|
6
|
-
llama: Llama;
|
|
7
|
-
model: LlamaModel;
|
|
8
|
-
context: LlamaEmbeddingContext;
|
|
9
|
-
contextSize: number;
|
|
10
|
-
}>;
|
|
11
|
-
export declare function loadReranker(dir: string, uri: string): Promise<{
|
|
12
|
-
llama: Llama;
|
|
13
|
-
model: LlamaModel;
|
|
14
|
-
context: RankingContext;
|
|
15
|
-
contextSize: number;
|
|
16
|
-
}>;
|
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
import { closeSync, existsSync, mkdirSync, openSync, readSync, statSync, unlinkSync, } from "node:fs";
|
|
2
|
-
import { getLlama, resolveModelFile, LlamaLogLevel, } from "node-llama-cpp";
|
|
3
|
-
const DEFAULT_EMBED_CONTEXT_SIZE = 2048;
|
|
4
|
-
const DEFAULT_RERANK_CONTEXT_SIZE = 4096;
|
|
5
|
-
export const RERANK_TEMPLATE_OVERHEAD = 512;
|
|
6
|
-
const GGUF_MAGIC = Buffer.from("GGUF");
|
|
7
|
-
function gpu() {
|
|
8
|
-
if (process.env.CI) {
|
|
9
|
-
return false;
|
|
10
|
-
}
|
|
11
|
-
const raw = process.env.HOOMAN_LLAMA_GPU?.trim() ?? "";
|
|
12
|
-
const normalized = raw.toLowerCase();
|
|
13
|
-
if (!normalized) {
|
|
14
|
-
return "auto";
|
|
15
|
-
}
|
|
16
|
-
if (["false", "off", "none", "disable", "disabled", "0"].includes(normalized)) {
|
|
17
|
-
return false;
|
|
18
|
-
}
|
|
19
|
-
if (normalized === "metal" ||
|
|
20
|
-
normalized === "vulkan" ||
|
|
21
|
-
normalized === "cuda") {
|
|
22
|
-
return normalized;
|
|
23
|
-
}
|
|
24
|
-
return "auto";
|
|
25
|
-
}
|
|
26
|
-
function maxTokensForEmbed() {
|
|
27
|
-
const raw = process.env.HOOMAN_EMBED_CONTEXT_SIZE?.trim() ?? "";
|
|
28
|
-
const v = Number.parseInt(raw, 10);
|
|
29
|
-
if (Number.isFinite(v) && v > 0) {
|
|
30
|
-
return v;
|
|
31
|
-
}
|
|
32
|
-
return DEFAULT_EMBED_CONTEXT_SIZE;
|
|
33
|
-
}
|
|
34
|
-
function maxTokensForRerank() {
|
|
35
|
-
const raw = process.env.HOOMAN_RERANK_CONTEXT_SIZE?.trim() ?? "";
|
|
36
|
-
const v = Number.parseInt(raw, 10);
|
|
37
|
-
if (Number.isFinite(v) && v > 0)
|
|
38
|
-
return v;
|
|
39
|
-
return DEFAULT_RERANK_CONTEXT_SIZE;
|
|
40
|
-
}
|
|
41
|
-
function validate(file, uri) {
|
|
42
|
-
if (!existsSync(file)) {
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
45
|
-
const fd = openSync(file, "r");
|
|
46
|
-
const sniff = Buffer.alloc(512);
|
|
47
|
-
try {
|
|
48
|
-
readSync(fd, sniff, 0, 512, 0);
|
|
49
|
-
}
|
|
50
|
-
finally {
|
|
51
|
-
closeSync(fd);
|
|
52
|
-
}
|
|
53
|
-
const header = sniff.subarray(0, 4);
|
|
54
|
-
if (!header.equals(GGUF_MAGIC)) {
|
|
55
|
-
const got = header.toString("utf-8");
|
|
56
|
-
const sizeKb = (statSync(file).size / 1024).toFixed(0);
|
|
57
|
-
unlinkSync(file);
|
|
58
|
-
throw new Error(`Embed model is not valid GGUF (expected "GGUF", got "${got}", ${sizeKb} KB).\n` +
|
|
59
|
-
`Model: ${uri}`);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
export async function loadEmbedder(dir, uri) {
|
|
63
|
-
if (!existsSync(dir)) {
|
|
64
|
-
mkdirSync(dir, { recursive: true });
|
|
65
|
-
}
|
|
66
|
-
const file = await resolveModelFile(uri, dir);
|
|
67
|
-
validate(file, uri);
|
|
68
|
-
const mode = gpu();
|
|
69
|
-
const loadLlama = async (gpu) => getLlama({
|
|
70
|
-
build: "never",
|
|
71
|
-
logLevel: LlamaLogLevel.error,
|
|
72
|
-
gpu,
|
|
73
|
-
});
|
|
74
|
-
let llama;
|
|
75
|
-
if (mode === false) {
|
|
76
|
-
llama = await loadLlama(false);
|
|
77
|
-
}
|
|
78
|
-
else {
|
|
79
|
-
try {
|
|
80
|
-
llama = await loadLlama(mode);
|
|
81
|
-
}
|
|
82
|
-
catch {
|
|
83
|
-
llama = await loadLlama(false);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
const model = await llama.loadModel({ modelPath: file });
|
|
87
|
-
const trained = model.trainContextSize;
|
|
88
|
-
const tokens = maxTokensForEmbed();
|
|
89
|
-
const contextSize = typeof trained === "number" && Number.isFinite(trained) && trained > 0
|
|
90
|
-
? Math.max(1, Math.min(tokens, trained))
|
|
91
|
-
: tokens;
|
|
92
|
-
const context = await model.createEmbeddingContext({ contextSize });
|
|
93
|
-
return { llama, model, context, contextSize };
|
|
94
|
-
}
|
|
95
|
-
export async function loadReranker(dir, uri) {
|
|
96
|
-
if (!existsSync(dir)) {
|
|
97
|
-
mkdirSync(dir, { recursive: true });
|
|
98
|
-
}
|
|
99
|
-
const file = await resolveModelFile(uri, dir);
|
|
100
|
-
validate(file, uri);
|
|
101
|
-
const mode = gpu();
|
|
102
|
-
const loadLlama = async (gpuMode) => getLlama({ build: "never", logLevel: LlamaLogLevel.error, gpu: gpuMode });
|
|
103
|
-
let llama;
|
|
104
|
-
if (mode === false) {
|
|
105
|
-
llama = await loadLlama(false);
|
|
106
|
-
}
|
|
107
|
-
else {
|
|
108
|
-
try {
|
|
109
|
-
llama = await loadLlama(mode);
|
|
110
|
-
}
|
|
111
|
-
catch {
|
|
112
|
-
llama = await loadLlama(false);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
const model = await llama.loadModel({ modelPath: file });
|
|
116
|
-
const ctxSize = maxTokensForRerank();
|
|
117
|
-
let context;
|
|
118
|
-
try {
|
|
119
|
-
context = await model.createRankingContext({
|
|
120
|
-
contextSize: ctxSize,
|
|
121
|
-
flashAttention: true,
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
catch {
|
|
125
|
-
context = await model.createRankingContext({ contextSize: ctxSize });
|
|
126
|
-
}
|
|
127
|
-
return { llama, model, context, contextSize: ctxSize };
|
|
128
|
-
}
|
|
129
|
-
//# sourceMappingURL=loader.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/core/inference/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
export type GgufRerankerOptions = {
|
|
2
|
-
modelUri: string;
|
|
3
|
-
cacheDir: string;
|
|
4
|
-
};
|
|
5
|
-
/**
|
|
6
|
-
* Local GGUF reranker via node-llama-cpp using a Qwen3-Reranker model.
|
|
7
|
-
* Lazy-loads on first use — the model (~600 MB) is only downloaded and loaded
|
|
8
|
-
* when reranking is actually triggered.
|
|
9
|
-
*/
|
|
10
|
-
export declare class GgufReranker {
|
|
11
|
-
private readonly modelUri;
|
|
12
|
-
private readonly cacheDir;
|
|
13
|
-
private llama;
|
|
14
|
-
private model;
|
|
15
|
-
private context;
|
|
16
|
-
private contextSize;
|
|
17
|
-
private loadPromise;
|
|
18
|
-
constructor(options: GgufRerankerOptions);
|
|
19
|
-
warmup(): Promise<void>;
|
|
20
|
-
private truncate;
|
|
21
|
-
/**
|
|
22
|
-
* Rerank documents by relevance to query using the local Qwen3-Reranker model.
|
|
23
|
-
* Returns the input array re-ordered from most to least relevant.
|
|
24
|
-
* Falls back to original order if the model is unavailable.
|
|
25
|
-
*/
|
|
26
|
-
rerank<T>(query: string, docs: T[], getText: (doc: T) => string): Promise<T[]>;
|
|
27
|
-
dispose(): Promise<void>;
|
|
28
|
-
}
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import { loadReranker, RERANK_TEMPLATE_OVERHEAD, } from "./loader.js";
|
|
2
|
-
/**
|
|
3
|
-
* Local GGUF reranker via node-llama-cpp using a Qwen3-Reranker model.
|
|
4
|
-
* Lazy-loads on first use — the model (~600 MB) is only downloaded and loaded
|
|
5
|
-
* when reranking is actually triggered.
|
|
6
|
-
*/
|
|
7
|
-
export class GgufReranker {
|
|
8
|
-
modelUri;
|
|
9
|
-
cacheDir;
|
|
10
|
-
llama = null;
|
|
11
|
-
model = null;
|
|
12
|
-
context = null;
|
|
13
|
-
contextSize = 0;
|
|
14
|
-
loadPromise = null;
|
|
15
|
-
constructor(options) {
|
|
16
|
-
this.modelUri = options.modelUri;
|
|
17
|
-
this.cacheDir = options.cacheDir;
|
|
18
|
-
}
|
|
19
|
-
async warmup() {
|
|
20
|
-
const { llama, model, context, contextSize } = await loadReranker(this.cacheDir, this.modelUri);
|
|
21
|
-
this.llama = llama;
|
|
22
|
-
this.context = context;
|
|
23
|
-
this.model = model;
|
|
24
|
-
this.contextSize = contextSize;
|
|
25
|
-
}
|
|
26
|
-
truncate(text, maxTokens) {
|
|
27
|
-
if (!this.model || maxTokens <= 0)
|
|
28
|
-
return text;
|
|
29
|
-
const tokens = this.model.tokenize(text);
|
|
30
|
-
if (tokens.length <= maxTokens)
|
|
31
|
-
return text;
|
|
32
|
-
const safe = Math.max(1, maxTokens);
|
|
33
|
-
return this.model.detokenize(tokens.slice(0, safe));
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Rerank documents by relevance to query using the local Qwen3-Reranker model.
|
|
37
|
-
* Returns the input array re-ordered from most to least relevant.
|
|
38
|
-
* Falls back to original order if the model is unavailable.
|
|
39
|
-
*/
|
|
40
|
-
async rerank(query, docs, getText) {
|
|
41
|
-
if (docs.length === 0)
|
|
42
|
-
return docs;
|
|
43
|
-
if (!this.context || !this.model)
|
|
44
|
-
return docs;
|
|
45
|
-
const queryTokens = this.model.tokenize(query).length;
|
|
46
|
-
const maxDocTokens = this.contextSize - RERANK_TEMPLATE_OVERHEAD - queryTokens;
|
|
47
|
-
const texts = docs.map((doc) => this.truncate(getText(doc), maxDocTokens));
|
|
48
|
-
const scores = await this.context.rankAll(query, texts);
|
|
49
|
-
return docs
|
|
50
|
-
.map((doc, i) => ({ doc, score: scores[i] ?? -Infinity }))
|
|
51
|
-
.sort((a, b) => b.score - a.score)
|
|
52
|
-
.map(({ doc }) => doc);
|
|
53
|
-
}
|
|
54
|
-
async dispose() {
|
|
55
|
-
if (this.context) {
|
|
56
|
-
await this.context.dispose();
|
|
57
|
-
this.context = null;
|
|
58
|
-
}
|
|
59
|
-
if (this.model) {
|
|
60
|
-
await this.model.dispose();
|
|
61
|
-
this.model = null;
|
|
62
|
-
}
|
|
63
|
-
this.llama = null;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
//# sourceMappingURL=reranker.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reranker.js","sourceRoot":"","sources":["../../../src/core/inference/reranker.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { GgufEmbedder, GgufReranker } from "../inference/index.js";
|
|
2
|
-
import type { Memory, MemoryType } from "./types.js";
|
|
3
|
-
/**
|
|
4
|
-
* Small semantic memory store: sqlite rows + sqlite-vec embeddings.
|
|
5
|
-
*/
|
|
6
|
-
export declare class Brain {
|
|
7
|
-
private readonly embedder;
|
|
8
|
-
private readonly reranker;
|
|
9
|
-
private readonly db;
|
|
10
|
-
constructor(path: string, embedder: GgufEmbedder, reranker: GgufReranker);
|
|
11
|
-
warmup(): Promise<void>;
|
|
12
|
-
/**
|
|
13
|
-
* Store text with arbitrary JSON-serializable metadata; returns the new row id.
|
|
14
|
-
*/
|
|
15
|
-
memorize(scope: string, content: string, type: MemoryType, metadata?: Record<string, unknown>): Promise<string>;
|
|
16
|
-
/**
|
|
17
|
-
* Search: vector retrieval when `q` is non-empty; otherwise lists recent memories.
|
|
18
|
-
* Only non-archived rows in `scope` participate.
|
|
19
|
-
* When `types` is non-empty, only rows whose `type` is in that list are returned.
|
|
20
|
-
*/
|
|
21
|
-
search(scope: string, q: string, types?: MemoryType[], limit?: number): Promise<Memory[]>;
|
|
22
|
-
/** Mark a memory archived and remove it from the vector index. Only affects rows in `scope`. */
|
|
23
|
-
archive(scope: string, id: string): boolean;
|
|
24
|
-
close(): Promise<void>;
|
|
25
|
-
}
|
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
import crypto from "node:crypto";
|
|
2
|
-
import { embed } from "../inference/index.js";
|
|
3
|
-
import { open, prepare } from "./database.js";
|
|
4
|
-
const VEC_K_MULTIPLIER = 5;
|
|
5
|
-
function toMemory(row, distance) {
|
|
6
|
-
let metadata = {};
|
|
7
|
-
try {
|
|
8
|
-
metadata = JSON.parse(row.metadata_json);
|
|
9
|
-
}
|
|
10
|
-
catch {
|
|
11
|
-
metadata = {};
|
|
12
|
-
}
|
|
13
|
-
const dist = typeof distance === "number" && Number.isFinite(distance) ? distance : null;
|
|
14
|
-
return {
|
|
15
|
-
id: row.id,
|
|
16
|
-
content: row.content,
|
|
17
|
-
type: row.type,
|
|
18
|
-
metadata,
|
|
19
|
-
archived: row.archived === 1,
|
|
20
|
-
createdAt: new Date(row.created_at_ms),
|
|
21
|
-
distance: dist,
|
|
22
|
-
score: dist != null ? Math.max(0, Math.min(1, 1 - dist)) : null,
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Small semantic memory store: sqlite rows + sqlite-vec embeddings.
|
|
27
|
-
*/
|
|
28
|
-
export class Brain {
|
|
29
|
-
embedder;
|
|
30
|
-
reranker;
|
|
31
|
-
db;
|
|
32
|
-
constructor(path, embedder, reranker) {
|
|
33
|
-
this.embedder = embedder;
|
|
34
|
-
this.reranker = reranker;
|
|
35
|
-
this.db = open(path);
|
|
36
|
-
}
|
|
37
|
-
async warmup() {
|
|
38
|
-
await this.embedder.warmup();
|
|
39
|
-
await this.reranker.warmup();
|
|
40
|
-
const row = this.db
|
|
41
|
-
.prepare(`SELECT 1 AS ok FROM memories LIMIT 1`)
|
|
42
|
-
.get();
|
|
43
|
-
if (!row) {
|
|
44
|
-
return;
|
|
45
|
-
}
|
|
46
|
-
const probe = await this.embedder.embedQuery("__probe__");
|
|
47
|
-
prepare(this.db, this.embedder.resolvedModelUri, probe.length);
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Store text with arbitrary JSON-serializable metadata; returns the new row id.
|
|
51
|
-
*/
|
|
52
|
-
async memorize(scope, content, type, metadata = {}) {
|
|
53
|
-
const id = crypto.randomUUID();
|
|
54
|
-
const title = typeof metadata.title === "string" ? metadata.title : undefined;
|
|
55
|
-
const embedding = await this.embedder.embedDocument(content, title);
|
|
56
|
-
prepare(this.db, this.embedder.resolvedModelUri, embedding.length);
|
|
57
|
-
const stmt1 = this.db.prepare(`INSERT INTO memories (id, scope, content, type, metadata_json, archived, created_at_ms)
|
|
58
|
-
VALUES (?, ?, ?, ?, ?, 0, ?)`);
|
|
59
|
-
const stmt2 = this.db.prepare(`INSERT INTO brain_memory_vec (memory_id, embedding) VALUES (?, ?)`);
|
|
60
|
-
this.db.transaction(() => {
|
|
61
|
-
stmt1.run(id, scope, content, type, JSON.stringify(metadata), Date.now());
|
|
62
|
-
stmt2.run(id, embedding);
|
|
63
|
-
})();
|
|
64
|
-
return id;
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Search: vector retrieval when `q` is non-empty; otherwise lists recent memories.
|
|
68
|
-
* Only non-archived rows in `scope` participate.
|
|
69
|
-
* When `types` is non-empty, only rows whose `type` is in that list are returned.
|
|
70
|
-
*/
|
|
71
|
-
async search(scope, q, types, limit = 10) {
|
|
72
|
-
const n = Number.isFinite(limit) && limit > 0 ? Math.floor(limit) : 10;
|
|
73
|
-
const typeSet = types != null && types.length > 0 ? new Set(types) : null;
|
|
74
|
-
if (!q.trim()) {
|
|
75
|
-
if (typeSet) {
|
|
76
|
-
const tList = [...typeSet];
|
|
77
|
-
const ph = tList.map(() => "?").join(",");
|
|
78
|
-
const rows = this.db
|
|
79
|
-
.prepare(`SELECT id, content, type, metadata_json, archived, created_at_ms
|
|
80
|
-
FROM memories
|
|
81
|
-
WHERE scope = ? AND archived = 0 AND type IN (${ph})
|
|
82
|
-
ORDER BY created_at_ms DESC LIMIT ?`)
|
|
83
|
-
.all(scope, ...tList, n);
|
|
84
|
-
return rows.map((row) => toMemory(row, null));
|
|
85
|
-
}
|
|
86
|
-
const rows = this.db
|
|
87
|
-
.prepare(`SELECT id, content, type, metadata_json, archived, created_at_ms
|
|
88
|
-
FROM memories WHERE scope = ? AND archived = 0 ORDER BY created_at_ms DESC LIMIT ?`)
|
|
89
|
-
.all(scope, n);
|
|
90
|
-
return rows.map((row) => toMemory(row, null));
|
|
91
|
-
}
|
|
92
|
-
const embedding = Float32Array.from(await embed(this.embedder, q, "query"));
|
|
93
|
-
prepare(this.db, this.embedder.resolvedModelUri, embedding.length);
|
|
94
|
-
const kMult = typeSet ? VEC_K_MULTIPLIER * 4 : VEC_K_MULTIPLIER;
|
|
95
|
-
const k = Math.max(1, n * kMult);
|
|
96
|
-
const hits = this.db
|
|
97
|
-
.prepare(`SELECT memory_id, distance FROM brain_memory_vec WHERE embedding MATCH ? AND k = ?`)
|
|
98
|
-
.all(embedding, k);
|
|
99
|
-
if (hits.length === 0) {
|
|
100
|
-
return [];
|
|
101
|
-
}
|
|
102
|
-
const byId = new Map(hits.map((h) => [h.memory_id, h.distance]));
|
|
103
|
-
const ids = hits.map((h) => h.memory_id);
|
|
104
|
-
const placeholders = ids.map(() => "?").join(",");
|
|
105
|
-
const rows = this.db
|
|
106
|
-
.prepare(`SELECT id, content, type, metadata_json, archived, created_at_ms
|
|
107
|
-
FROM memories WHERE archived = 0 AND scope = ? AND id IN (${placeholders})`)
|
|
108
|
-
.all(scope, ...ids);
|
|
109
|
-
const candidates = rows.map((row) => toMemory(row, byId.get(row.id) ?? null));
|
|
110
|
-
const ranked = await this.reranker.rerank(q, candidates, (m) => m.content);
|
|
111
|
-
const filtered = typeSet
|
|
112
|
-
? ranked.filter((m) => typeSet.has(m.type))
|
|
113
|
-
: ranked;
|
|
114
|
-
return filtered.slice(0, n);
|
|
115
|
-
}
|
|
116
|
-
/** Mark a memory archived and remove it from the vector index. Only affects rows in `scope`. */
|
|
117
|
-
archive(scope, id) {
|
|
118
|
-
const row = this.db
|
|
119
|
-
.prepare(`SELECT id, content, type, metadata_json, archived, created_at_ms
|
|
120
|
-
FROM memories WHERE id = ? AND scope = ? AND archived = 0`)
|
|
121
|
-
.get(id, scope);
|
|
122
|
-
if (!row) {
|
|
123
|
-
return false;
|
|
124
|
-
}
|
|
125
|
-
this.db.prepare(`DELETE FROM brain_memory_vec WHERE memory_id = ?`).run(id);
|
|
126
|
-
this.db
|
|
127
|
-
.prepare(`UPDATE memories SET archived = 1 WHERE id = ? AND scope = ?`)
|
|
128
|
-
.run(id, scope);
|
|
129
|
-
return true;
|
|
130
|
-
}
|
|
131
|
-
async close() {
|
|
132
|
-
await this.embedder.dispose();
|
|
133
|
-
await this.reranker.dispose();
|
|
134
|
-
this.db.close();
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
//# sourceMappingURL=brain.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"brain.js","sourceRoot":"","sources":["../../../src/core/memory/brain.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
import fs from "node:fs";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
import BetterSqlite from "better-sqlite3";
|
|
4
|
-
import * as vector from "sqlite-vec";
|
|
5
|
-
const META_DIMS = "embedding_dims";
|
|
6
|
-
const META_MODEL = "embedding_model_id";
|
|
7
|
-
function getStoreMeta(db, key) {
|
|
8
|
-
const row = db
|
|
9
|
-
.prepare(`SELECT value FROM brain_store_meta WHERE key = ?`)
|
|
10
|
-
.get(key);
|
|
11
|
-
return row?.value ?? null;
|
|
12
|
-
}
|
|
13
|
-
function setStoreMeta(db, key, value) {
|
|
14
|
-
db.prepare(`INSERT INTO brain_store_meta (key, value) VALUES (?, ?)
|
|
15
|
-
ON CONFLICT(key) DO UPDATE SET value = excluded.value`).run(key, value);
|
|
16
|
-
}
|
|
17
|
-
function migrate(db) {
|
|
18
|
-
vector.load(db);
|
|
19
|
-
try {
|
|
20
|
-
const row = db.prepare(`SELECT vec_version() AS version`).get();
|
|
21
|
-
if (!row?.version || typeof row.version !== "string") {
|
|
22
|
-
throw new Error("vec_version() returned no version");
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
catch (err) {
|
|
26
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
27
|
-
throw new Error(`sqlite-vec extension is unavailable (probe failed: ${msg}). ` +
|
|
28
|
-
"Ensure sqlite-vec native bindings are installed for your platform.");
|
|
29
|
-
}
|
|
30
|
-
db.exec(`
|
|
31
|
-
CREATE TABLE IF NOT EXISTS brain_store_meta (
|
|
32
|
-
key TEXT PRIMARY KEY,
|
|
33
|
-
value TEXT NOT NULL
|
|
34
|
-
);
|
|
35
|
-
CREATE TABLE IF NOT EXISTS memories (
|
|
36
|
-
id TEXT PRIMARY KEY NOT NULL,
|
|
37
|
-
scope TEXT NOT NULL,
|
|
38
|
-
content TEXT NOT NULL,
|
|
39
|
-
type TEXT NOT NULL,
|
|
40
|
-
metadata_json TEXT NOT NULL,
|
|
41
|
-
archived INTEGER NOT NULL DEFAULT 0,
|
|
42
|
-
created_at_ms INTEGER NOT NULL
|
|
43
|
-
);
|
|
44
|
-
CREATE INDEX IF NOT EXISTS idx_memories_scope ON memories(scope);
|
|
45
|
-
CREATE INDEX IF NOT EXISTS idx_memories_type ON memories(type);
|
|
46
|
-
CREATE INDEX IF NOT EXISTS idx_memories_archived ON memories(archived);
|
|
47
|
-
`);
|
|
48
|
-
}
|
|
49
|
-
export function prepare(db, modelId, dimensions) {
|
|
50
|
-
const existing = db
|
|
51
|
-
.prepare(`SELECT sql FROM sqlite_master WHERE type='table' AND name='brain_memory_vec'`)
|
|
52
|
-
.get();
|
|
53
|
-
if (existing) {
|
|
54
|
-
const match = existing.sql.match(/float\[(\d+)\]/);
|
|
55
|
-
const hasId = existing.sql.includes("memory_id");
|
|
56
|
-
const hasCosine = existing.sql.includes("distance_metric=cosine");
|
|
57
|
-
const existingDims = match?.[1] ? Number.parseInt(match[1], 10) : null;
|
|
58
|
-
if (existingDims === dimensions && hasId && hasCosine) {
|
|
59
|
-
return;
|
|
60
|
-
}
|
|
61
|
-
if (existingDims !== null && existingDims !== dimensions) {
|
|
62
|
-
throw new Error(`Brain embedding dimension mismatch: index is ${existingDims}d but the model produces ${dimensions}d. ` +
|
|
63
|
-
"Use the previous embed model or delete the brain database (data loss).");
|
|
64
|
-
}
|
|
65
|
-
db.exec("DROP TABLE IF EXISTS brain_memory_vec");
|
|
66
|
-
}
|
|
67
|
-
db.exec(`CREATE VIRTUAL TABLE brain_memory_vec USING vec0(memory_id TEXT PRIMARY KEY, embedding float[${dimensions}] distance_metric=cosine)`);
|
|
68
|
-
const existingModel = getStoreMeta(db, META_MODEL);
|
|
69
|
-
if (existingModel != null && existingModel !== modelId) {
|
|
70
|
-
throw new Error(`Brain was built with embed model "${existingModel}" but config uses "${modelId}". ` +
|
|
71
|
-
"Align models or delete the brain database (data loss).");
|
|
72
|
-
}
|
|
73
|
-
setStoreMeta(db, META_MODEL, modelId);
|
|
74
|
-
setStoreMeta(db, META_DIMS, String(dimensions));
|
|
75
|
-
}
|
|
76
|
-
export function open(file) {
|
|
77
|
-
const dir = path.dirname(file);
|
|
78
|
-
if (!fs.existsSync(dir)) {
|
|
79
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
80
|
-
}
|
|
81
|
-
const db = new BetterSqlite(file);
|
|
82
|
-
db.pragma("journal_mode = WAL");
|
|
83
|
-
db.pragma("foreign_keys = ON");
|
|
84
|
-
migrate(db);
|
|
85
|
-
return db;
|
|
86
|
-
}
|
|
87
|
-
//# sourceMappingURL=database.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../../src/core/memory/database.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import type { JSONValue } from "@strands-agents/sdk";
|
|
2
|
-
export declare function create(): Promise<(import("@strands-agents/sdk").InvokableTool<{
|
|
3
|
-
scope: "project" | "user";
|
|
4
|
-
content: string;
|
|
5
|
-
type: "task" | "fact" | "observation" | "preference";
|
|
6
|
-
metadata?: Record<string, unknown> | undefined;
|
|
7
|
-
}, JSONValue> | import("@strands-agents/sdk").InvokableTool<{
|
|
8
|
-
scope: "project" | "user";
|
|
9
|
-
query: string;
|
|
10
|
-
types?: ("task" | "fact" | "observation" | "preference")[] | undefined;
|
|
11
|
-
k?: number | undefined;
|
|
12
|
-
}, JSONValue> | import("@strands-agents/sdk").InvokableTool<{
|
|
13
|
-
scope: "project" | "user";
|
|
14
|
-
id: string;
|
|
15
|
-
reason?: string | undefined;
|
|
16
|
-
}, JSONValue>)[]>;
|