bulkhead-runtime 0.1.0 → 2026.4.5-beta.1
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 +337 -234
- package/dist/cli.js +5 -1
- package/dist/cli.js.map +1 -1
- package/dist/config/index.d.ts +28 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +9 -6
- package/dist/config/index.js.map +1 -1
- package/dist/credentials/store.d.ts.map +1 -1
- package/dist/credentials/store.js +39 -15
- package/dist/credentials/store.js.map +1 -1
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +38 -1
- package/dist/index.js.map +1 -1
- package/dist/infra/warning-filter.js +1 -1
- package/dist/infra/warning-filter.js.map +1 -1
- package/dist/logging/subsystem.d.ts +15 -1
- package/dist/logging/subsystem.d.ts.map +1 -1
- package/dist/logging/subsystem.js +310 -45
- package/dist/logging/subsystem.js.map +1 -1
- package/dist/memory/embedding-batch.d.ts +38 -0
- package/dist/memory/embedding-batch.d.ts.map +1 -0
- package/dist/memory/embedding-batch.js +253 -0
- package/dist/memory/embedding-batch.js.map +1 -0
- package/dist/memory/embedding-cache.d.ts +16 -0
- package/dist/memory/embedding-cache.d.ts.map +1 -0
- package/dist/memory/embedding-cache.js +113 -0
- package/dist/memory/embedding-cache.js.map +1 -0
- package/dist/memory/embeddings-debug.js +1 -1
- package/dist/memory/embeddings.d.ts +1 -0
- package/dist/memory/embeddings.d.ts.map +1 -1
- package/dist/memory/embeddings.js +115 -92
- package/dist/memory/embeddings.js.map +1 -1
- package/dist/memory/file-indexer.d.ts +26 -0
- package/dist/memory/file-indexer.d.ts.map +1 -0
- package/dist/memory/file-indexer.js +245 -0
- package/dist/memory/file-indexer.js.map +1 -0
- package/dist/memory/hybrid.d.ts.map +1 -1
- package/dist/memory/hybrid.js +6 -2
- package/dist/memory/hybrid.js.map +1 -1
- package/dist/memory/index.d.ts +5 -0
- package/dist/memory/index.d.ts.map +1 -1
- package/dist/memory/index.js +5 -2
- package/dist/memory/index.js.map +1 -1
- package/dist/memory/session-indexer.d.ts +41 -0
- package/dist/memory/session-indexer.d.ts.map +1 -0
- package/dist/memory/session-indexer.js +341 -0
- package/dist/memory/session-indexer.js.map +1 -0
- package/dist/memory/simple-manager.d.ts +6 -0
- package/dist/memory/simple-manager.d.ts.map +1 -1
- package/dist/memory/simple-manager.js +35 -12
- package/dist/memory/simple-manager.js.map +1 -1
- package/dist/memory/ssrf.d.ts +18 -0
- package/dist/memory/ssrf.d.ts.map +1 -0
- package/dist/memory/ssrf.js +316 -0
- package/dist/memory/ssrf.js.map +1 -0
- package/dist/package.json +8 -5
- package/dist/platform/platform.d.ts.map +1 -1
- package/dist/platform/platform.js +30 -7
- package/dist/platform/platform.js.map +1 -1
- package/dist/platform/types.d.ts +2 -0
- package/dist/platform/types.d.ts.map +1 -1
- package/dist/runtime/agent.d.ts +8 -0
- package/dist/runtime/agent.d.ts.map +1 -1
- package/dist/runtime/agent.js +194 -46
- package/dist/runtime/agent.js.map +1 -1
- package/dist/runtime/api-key-rotation.d.ts +26 -0
- package/dist/runtime/api-key-rotation.d.ts.map +1 -0
- package/dist/runtime/api-key-rotation.js +174 -0
- package/dist/runtime/api-key-rotation.js.map +1 -0
- package/dist/runtime/context-guard.d.ts +32 -0
- package/dist/runtime/context-guard.d.ts.map +1 -0
- package/dist/runtime/context-guard.js +61 -0
- package/dist/runtime/context-guard.js.map +1 -0
- package/dist/runtime/failover-error.d.ts +62 -0
- package/dist/runtime/failover-error.d.ts.map +1 -0
- package/dist/runtime/failover-error.js +733 -0
- package/dist/runtime/failover-error.js.map +1 -0
- package/dist/runtime/failover-policy.d.ts +5 -0
- package/dist/runtime/failover-policy.d.ts.map +1 -0
- package/dist/runtime/failover-policy.js +18 -0
- package/dist/runtime/failover-policy.js.map +1 -0
- package/dist/runtime/index.d.ts +11 -0
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +11 -0
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/memory-flush.d.ts +24 -0
- package/dist/runtime/memory-flush.d.ts.map +1 -0
- package/dist/runtime/memory-flush.js +64 -0
- package/dist/runtime/memory-flush.js.map +1 -0
- package/dist/runtime/memory-tools.d.ts +14 -0
- package/dist/runtime/memory-tools.d.ts.map +1 -0
- package/dist/runtime/memory-tools.js +58 -0
- package/dist/runtime/memory-tools.js.map +1 -0
- package/dist/runtime/model-fallback.d.ts +56 -0
- package/dist/runtime/model-fallback.d.ts.map +1 -0
- package/dist/runtime/model-fallback.js +301 -0
- package/dist/runtime/model-fallback.js.map +1 -0
- package/dist/runtime/model-fallback.types.d.ts +14 -0
- package/dist/runtime/model-fallback.types.d.ts.map +1 -0
- package/dist/runtime/model-fallback.types.js +3 -0
- package/dist/runtime/model-fallback.types.js.map +1 -0
- package/dist/runtime/retry.d.ts +24 -0
- package/dist/runtime/retry.d.ts.map +1 -0
- package/dist/runtime/retry.js +102 -0
- package/dist/runtime/retry.js.map +1 -0
- package/dist/runtime/session-pruning.d.ts +22 -0
- package/dist/runtime/session-pruning.d.ts.map +1 -0
- package/dist/runtime/session-pruning.js +118 -0
- package/dist/runtime/session-pruning.js.map +1 -0
- package/dist/runtime/stream-adapters.d.ts +11 -0
- package/dist/runtime/stream-adapters.d.ts.map +1 -0
- package/dist/runtime/stream-adapters.js +46 -0
- package/dist/runtime/stream-adapters.js.map +1 -0
- package/dist/runtime/subagent.d.ts +83 -0
- package/dist/runtime/subagent.d.ts.map +1 -0
- package/dist/runtime/subagent.js +190 -0
- package/dist/runtime/subagent.js.map +1 -0
- package/dist/runtime/tool-result-truncation.d.ts +25 -0
- package/dist/runtime/tool-result-truncation.d.ts.map +1 -0
- package/dist/runtime/tool-result-truncation.js +115 -0
- package/dist/runtime/tool-result-truncation.js.map +1 -0
- package/dist/sandbox/cgroup.d.ts +4 -1
- package/dist/sandbox/cgroup.d.ts.map +1 -1
- package/dist/sandbox/cgroup.js +28 -15
- package/dist/sandbox/cgroup.js.map +1 -1
- package/dist/sandbox/index.d.ts +2 -1
- package/dist/sandbox/index.d.ts.map +1 -1
- package/dist/sandbox/index.js +2 -1
- package/dist/sandbox/index.js.map +1 -1
- package/dist/sandbox/ipc.d.ts +4 -1
- package/dist/sandbox/ipc.d.ts.map +1 -1
- package/dist/sandbox/ipc.js +33 -17
- package/dist/sandbox/ipc.js.map +1 -1
- package/dist/sandbox/manager.d.ts +1 -2
- package/dist/sandbox/manager.d.ts.map +1 -1
- package/dist/sandbox/manager.js +132 -130
- package/dist/sandbox/manager.js.map +1 -1
- package/dist/sandbox/namespace.d.ts +1 -1
- package/dist/sandbox/namespace.d.ts.map +1 -1
- package/dist/sandbox/namespace.js +36 -37
- package/dist/sandbox/namespace.js.map +1 -1
- package/dist/sandbox/rootfs.d.ts +6 -1
- package/dist/sandbox/rootfs.d.ts.map +1 -1
- package/dist/sandbox/rootfs.js +114 -30
- package/dist/sandbox/rootfs.js.map +1 -1
- package/dist/sandbox/seccomp-apply.d.ts +9 -0
- package/dist/sandbox/seccomp-apply.d.ts.map +1 -0
- package/dist/sandbox/seccomp-apply.js +227 -0
- package/dist/sandbox/seccomp-apply.js.map +1 -0
- package/dist/sandbox/seccomp.js +3 -3
- package/dist/sandbox/seccomp.js.map +1 -1
- package/dist/sandbox/types.d.ts +1 -3
- package/dist/sandbox/types.d.ts.map +1 -1
- package/dist/sandbox/types.js.map +1 -1
- package/dist/sandbox/worker.d.ts +3 -0
- package/dist/sandbox/worker.d.ts.map +1 -1
- package/dist/sandbox/worker.js +84 -17
- package/dist/sandbox/worker.js.map +1 -1
- package/dist/sessions/index.d.ts +1 -0
- package/dist/sessions/index.d.ts.map +1 -1
- package/dist/sessions/index.js +1 -0
- package/dist/sessions/index.js.map +1 -1
- package/dist/sessions/store.d.ts +2 -2
- package/dist/sessions/store.d.ts.map +1 -1
- package/dist/sessions/store.js +49 -27
- package/dist/sessions/store.js.map +1 -1
- package/dist/sessions/transcript-events.d.ts +11 -0
- package/dist/sessions/transcript-events.d.ts.map +1 -0
- package/dist/sessions/transcript-events.js +40 -0
- package/dist/sessions/transcript-events.js.map +1 -0
- package/dist/shared/agent-session.d.ts +10 -0
- package/dist/shared/agent-session.d.ts.map +1 -0
- package/dist/shared/agent-session.js +33 -0
- package/dist/shared/agent-session.js.map +1 -0
- package/dist/shared/constants.d.ts +6 -0
- package/dist/shared/constants.d.ts.map +1 -0
- package/dist/shared/constants.js +11 -0
- package/dist/shared/constants.js.map +1 -0
- package/dist/shared/fs.d.ts +7 -0
- package/dist/shared/fs.d.ts.map +1 -0
- package/dist/shared/fs.js +14 -0
- package/dist/shared/fs.js.map +1 -0
- package/dist/shared/index.d.ts +4 -0
- package/dist/shared/index.d.ts.map +1 -0
- package/dist/shared/index.js +4 -0
- package/dist/shared/index.js.map +1 -0
- package/dist/skills/enablement.d.ts.map +1 -1
- package/dist/skills/enablement.js +2 -2
- package/dist/skills/enablement.js.map +1 -1
- package/dist/workspace/runner.d.ts.map +1 -1
- package/dist/workspace/runner.js +353 -106
- package/dist/workspace/runner.js.map +1 -1
- package/dist/workspace/types.d.ts +1 -0
- package/dist/workspace/types.d.ts.map +1 -1
- package/dist/workspace/workspace.d.ts.map +1 -1
- package/dist/workspace/workspace.js +12 -3
- package/dist/workspace/workspace.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,7 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { buildBaseUrlPolicy, fetchWithSsrfGuard } from "./ssrf.js";
|
|
2
|
+
function sanitizeErrorBody(body) {
|
|
3
|
+
const truncated = body.slice(0, 500);
|
|
4
|
+
return truncated
|
|
5
|
+
.replace(/(?:sk-|sk-ant-|key-|pa-|AIza|Bearer\s+)[A-Za-z0-9_-]{10,}/g, "[REDACTED]")
|
|
6
|
+
.replace(/[?&]key=[^&\s"']{10,}/g, "?key=[REDACTED]")
|
|
7
|
+
.replace(/"(api_key|apiKey|secret|token|password)"\s*:\s*"[^"]{6,}"/gi, '"$1":"[REDACTED]"');
|
|
8
|
+
}
|
|
9
|
+
const APPROX_CHARS_PER_TOKEN = 4;
|
|
10
|
+
function validateInputLength(text, maxTokens) {
|
|
11
|
+
if (maxTokens && text.length > maxTokens * APPROX_CHARS_PER_TOKEN) {
|
|
12
|
+
throw new Error(`Input text (~${Math.ceil(text.length / APPROX_CHARS_PER_TOKEN)} tokens) exceeds provider limit of ${maxTokens} tokens`);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
5
15
|
function sanitizeAndNormalizeEmbedding(vec) {
|
|
6
16
|
const sanitized = vec.map((value) => (Number.isFinite(value) ? value : 0));
|
|
7
17
|
const magnitude = Math.sqrt(sanitized.reduce((sum, value) => sum + value * value, 0));
|
|
@@ -9,170 +19,183 @@ function sanitizeAndNormalizeEmbedding(vec) {
|
|
|
9
19
|
return sanitized;
|
|
10
20
|
return sanitized.map((value) => value / magnitude);
|
|
11
21
|
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
};
|
|
20
|
-
function createOpenAiProvider(params) {
|
|
21
|
-
const model = params.model ?? DEFAULT_OPENAI_MODEL;
|
|
22
|
-
const baseUrl = (params.baseUrl ?? "https://api.openai.com/v1").replace(/\/+$/, "");
|
|
22
|
+
async function ssrfFetch(url, init, ssrfPolicy) {
|
|
23
|
+
if (ssrfPolicy) {
|
|
24
|
+
return fetchWithSsrfGuard(url, init, ssrfPolicy);
|
|
25
|
+
}
|
|
26
|
+
return fetch(url, init);
|
|
27
|
+
}
|
|
28
|
+
function createBearerEmbeddingProvider(config) {
|
|
29
|
+
const { id, apiKey, model, baseUrl, maxInputTokens, ssrfPolicy } = config;
|
|
23
30
|
async function call(input) {
|
|
24
|
-
const res = await
|
|
31
|
+
const res = await ssrfFetch(`${baseUrl}/embeddings`, {
|
|
25
32
|
method: "POST",
|
|
26
33
|
headers: {
|
|
27
34
|
"Content-Type": "application/json",
|
|
28
|
-
Authorization: `Bearer ${
|
|
35
|
+
Authorization: `Bearer ${apiKey}`,
|
|
29
36
|
},
|
|
30
37
|
body: JSON.stringify({ input, model }),
|
|
31
|
-
});
|
|
32
|
-
if (!res.ok)
|
|
33
|
-
throw new Error(
|
|
38
|
+
}, ssrfPolicy);
|
|
39
|
+
if (!res.ok) {
|
|
40
|
+
throw new Error(`${id} embeddings failed (${res.status}): ${sanitizeErrorBody(await res.text())}`);
|
|
41
|
+
}
|
|
34
42
|
const body = (await res.json());
|
|
35
43
|
return body.data.map((d) => sanitizeAndNormalizeEmbedding(d.embedding));
|
|
36
44
|
}
|
|
37
45
|
return {
|
|
46
|
+
id,
|
|
47
|
+
model,
|
|
48
|
+
maxInputTokens,
|
|
49
|
+
embedQuery: async (text) => {
|
|
50
|
+
validateInputLength(text, maxInputTokens);
|
|
51
|
+
const results = await call([text]);
|
|
52
|
+
if (!results || results.length === 0) {
|
|
53
|
+
throw new Error(`${id} returned empty embedding response`);
|
|
54
|
+
}
|
|
55
|
+
return results[0];
|
|
56
|
+
},
|
|
57
|
+
embedBatch: async (texts) => {
|
|
58
|
+
for (const t of texts)
|
|
59
|
+
validateInputLength(t, maxInputTokens);
|
|
60
|
+
return call(texts);
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
// --- OpenAI ---
|
|
65
|
+
const OPENAI_MAX_INPUT_TOKENS = {
|
|
66
|
+
"text-embedding-3-small": 8192,
|
|
67
|
+
"text-embedding-3-large": 8192,
|
|
68
|
+
"text-embedding-ada-002": 8191,
|
|
69
|
+
};
|
|
70
|
+
function createOpenAiProvider(params) {
|
|
71
|
+
const model = params.model ?? "text-embedding-3-small";
|
|
72
|
+
const baseUrl = (params.baseUrl ?? "https://api.openai.com/v1").replace(/\/+$/, "");
|
|
73
|
+
return createBearerEmbeddingProvider({
|
|
38
74
|
id: "openai",
|
|
75
|
+
apiKey: params.apiKey,
|
|
39
76
|
model,
|
|
77
|
+
baseUrl,
|
|
40
78
|
maxInputTokens: OPENAI_MAX_INPUT_TOKENS[model],
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
};
|
|
79
|
+
ssrfPolicy: params.enableSsrf !== false ? buildBaseUrlPolicy(baseUrl) ?? undefined : undefined,
|
|
80
|
+
});
|
|
44
81
|
}
|
|
45
|
-
// --- Gemini ---
|
|
46
|
-
// From OpenClaw src/memory/embeddings-gemini.ts
|
|
47
|
-
const DEFAULT_GEMINI_MODEL = "gemini-embedding-001";
|
|
82
|
+
// --- Gemini (different API shape — not Bearer-based) ---
|
|
48
83
|
const GEMINI_MAX_INPUT_TOKENS = {
|
|
84
|
+
"gemini-embedding-001": 2048,
|
|
49
85
|
"text-embedding-004": 2048,
|
|
50
86
|
};
|
|
51
87
|
function createGeminiProvider(params) {
|
|
52
|
-
const model = params.model ??
|
|
88
|
+
const model = params.model ?? "gemini-embedding-001";
|
|
53
89
|
const baseUrl = (params.baseUrl ?? "https://generativelanguage.googleapis.com/v1beta").replace(/\/+$/, "");
|
|
90
|
+
const ssrfPolicy = params.enableSsrf !== false ? buildBaseUrlPolicy(baseUrl) ?? undefined : undefined;
|
|
54
91
|
async function call(texts) {
|
|
55
92
|
const requests = texts.map((text) => ({
|
|
56
93
|
model: `models/${model}`,
|
|
57
94
|
content: { parts: [{ text }] },
|
|
58
95
|
}));
|
|
59
|
-
const res = await
|
|
96
|
+
const res = await ssrfFetch(`${baseUrl}/models/${model}:batchEmbedContents`, {
|
|
60
97
|
method: "POST",
|
|
61
|
-
headers: {
|
|
98
|
+
headers: {
|
|
99
|
+
"Content-Type": "application/json",
|
|
100
|
+
"x-goog-api-key": params.apiKey,
|
|
101
|
+
},
|
|
62
102
|
body: JSON.stringify({ requests }),
|
|
63
|
-
});
|
|
103
|
+
}, ssrfPolicy);
|
|
64
104
|
if (!res.ok)
|
|
65
|
-
throw new Error(`
|
|
105
|
+
throw new Error(`gemini embeddings failed (${res.status}): ${sanitizeErrorBody(await res.text())}`);
|
|
66
106
|
const body = (await res.json());
|
|
67
107
|
return body.embeddings.map((e) => sanitizeAndNormalizeEmbedding(e.values));
|
|
68
108
|
}
|
|
109
|
+
const maxTokens = GEMINI_MAX_INPUT_TOKENS[model];
|
|
69
110
|
return {
|
|
70
111
|
id: "gemini",
|
|
71
112
|
model,
|
|
72
|
-
maxInputTokens:
|
|
73
|
-
embedQuery: async (text) =>
|
|
74
|
-
|
|
113
|
+
maxInputTokens: maxTokens,
|
|
114
|
+
embedQuery: async (text) => {
|
|
115
|
+
validateInputLength(text, maxTokens);
|
|
116
|
+
const results = await call([text]);
|
|
117
|
+
if (!results || results.length === 0)
|
|
118
|
+
throw new Error("gemini returned empty embedding response");
|
|
119
|
+
return results[0];
|
|
120
|
+
},
|
|
121
|
+
embedBatch: async (texts) => {
|
|
122
|
+
for (const t of texts)
|
|
123
|
+
validateInputLength(t, maxTokens);
|
|
124
|
+
return call(texts);
|
|
125
|
+
},
|
|
75
126
|
};
|
|
76
127
|
}
|
|
77
128
|
// --- Voyage ---
|
|
78
|
-
// From OpenClaw src/memory/embeddings-voyage.ts
|
|
79
|
-
const DEFAULT_VOYAGE_MODEL = "voyage-3-lite";
|
|
80
129
|
function createVoyageProvider(params) {
|
|
81
|
-
const model = params.model ?? DEFAULT_VOYAGE_MODEL;
|
|
82
130
|
const baseUrl = (params.baseUrl ?? "https://api.voyageai.com/v1").replace(/\/+$/, "");
|
|
83
|
-
|
|
84
|
-
const res = await fetch(`${baseUrl}/embeddings`, {
|
|
85
|
-
method: "POST",
|
|
86
|
-
headers: {
|
|
87
|
-
"Content-Type": "application/json",
|
|
88
|
-
Authorization: `Bearer ${params.apiKey}`,
|
|
89
|
-
},
|
|
90
|
-
body: JSON.stringify({ input, model }),
|
|
91
|
-
});
|
|
92
|
-
if (!res.ok)
|
|
93
|
-
throw new Error(`Voyage embeddings failed (${res.status}): ${await res.text()}`);
|
|
94
|
-
const body = (await res.json());
|
|
95
|
-
return body.data.map((d) => sanitizeAndNormalizeEmbedding(d.embedding));
|
|
96
|
-
}
|
|
97
|
-
return {
|
|
131
|
+
return createBearerEmbeddingProvider({
|
|
98
132
|
id: "voyage",
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
133
|
+
apiKey: params.apiKey,
|
|
134
|
+
model: params.model ?? "voyage-3-lite",
|
|
135
|
+
baseUrl,
|
|
136
|
+
ssrfPolicy: params.enableSsrf !== false ? buildBaseUrlPolicy(baseUrl) ?? undefined : undefined,
|
|
137
|
+
});
|
|
103
138
|
}
|
|
104
139
|
// --- Mistral ---
|
|
105
|
-
// From OpenClaw src/memory/embeddings-mistral.ts
|
|
106
|
-
const DEFAULT_MISTRAL_MODEL = "mistral-embed";
|
|
107
140
|
function createMistralProvider(params) {
|
|
108
|
-
const model = params.model ?? DEFAULT_MISTRAL_MODEL;
|
|
109
141
|
const baseUrl = (params.baseUrl ?? "https://api.mistral.ai/v1").replace(/\/+$/, "");
|
|
110
|
-
|
|
111
|
-
const res = await fetch(`${baseUrl}/embeddings`, {
|
|
112
|
-
method: "POST",
|
|
113
|
-
headers: {
|
|
114
|
-
"Content-Type": "application/json",
|
|
115
|
-
Authorization: `Bearer ${params.apiKey}`,
|
|
116
|
-
},
|
|
117
|
-
body: JSON.stringify({ input, model }),
|
|
118
|
-
});
|
|
119
|
-
if (!res.ok)
|
|
120
|
-
throw new Error(`Mistral embeddings failed (${res.status}): ${await res.text()}`);
|
|
121
|
-
const body = (await res.json());
|
|
122
|
-
return body.data.map((d) => sanitizeAndNormalizeEmbedding(d.embedding));
|
|
123
|
-
}
|
|
124
|
-
return {
|
|
142
|
+
return createBearerEmbeddingProvider({
|
|
125
143
|
id: "mistral",
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
144
|
+
apiKey: params.apiKey,
|
|
145
|
+
model: params.model ?? "mistral-embed",
|
|
146
|
+
baseUrl,
|
|
147
|
+
ssrfPolicy: params.enableSsrf !== false ? buildBaseUrlPolicy(baseUrl) ?? undefined : undefined,
|
|
148
|
+
});
|
|
130
149
|
}
|
|
131
|
-
// --- Ollama ---
|
|
132
|
-
// From OpenClaw src/memory/embeddings-ollama.ts
|
|
133
|
-
const DEFAULT_OLLAMA_MODEL = "nomic-embed-text";
|
|
150
|
+
// --- Ollama (different API shape — no auth, different response) ---
|
|
134
151
|
function createOllamaProvider(params) {
|
|
135
|
-
const model = params.model ??
|
|
152
|
+
const model = params.model ?? "nomic-embed-text";
|
|
136
153
|
const baseUrl = (params.baseUrl ?? "http://localhost:11434").replace(/\/+$/, "");
|
|
154
|
+
const ssrfPolicy = params.enableSsrf !== false ? buildBaseUrlPolicy(baseUrl) ?? undefined : undefined;
|
|
137
155
|
async function call(input) {
|
|
138
|
-
const res = await
|
|
156
|
+
const res = await ssrfFetch(`${baseUrl}/api/embed`, {
|
|
139
157
|
method: "POST",
|
|
140
158
|
headers: { "Content-Type": "application/json" },
|
|
141
159
|
body: JSON.stringify({ model, input }),
|
|
142
|
-
});
|
|
160
|
+
}, ssrfPolicy);
|
|
143
161
|
if (!res.ok)
|
|
144
|
-
throw new Error(`
|
|
162
|
+
throw new Error(`ollama embeddings failed (${res.status}): ${sanitizeErrorBody(await res.text())}`);
|
|
145
163
|
const body = (await res.json());
|
|
146
164
|
return body.embeddings.map((v) => sanitizeAndNormalizeEmbedding(v));
|
|
147
165
|
}
|
|
148
166
|
return {
|
|
149
167
|
id: "ollama",
|
|
150
168
|
model,
|
|
151
|
-
embedQuery: async (text) =>
|
|
169
|
+
embedQuery: async (text) => {
|
|
170
|
+
const results = await call([text]);
|
|
171
|
+
if (!results || results.length === 0)
|
|
172
|
+
throw new Error("ollama returned empty embedding response");
|
|
173
|
+
return results[0];
|
|
174
|
+
},
|
|
152
175
|
embedBatch: call,
|
|
153
176
|
};
|
|
154
177
|
}
|
|
155
178
|
export function createEmbeddingProvider(options) {
|
|
156
|
-
const { provider, apiKey, model, baseUrl } = options;
|
|
179
|
+
const { provider, apiKey, model, baseUrl, enableSsrf } = options;
|
|
157
180
|
switch (provider) {
|
|
158
181
|
case "openai":
|
|
159
182
|
if (!apiKey)
|
|
160
183
|
throw new Error("OpenAI embedding provider requires an API key");
|
|
161
|
-
return createOpenAiProvider({ apiKey, model, baseUrl });
|
|
184
|
+
return createOpenAiProvider({ apiKey, model, baseUrl, enableSsrf });
|
|
162
185
|
case "gemini":
|
|
163
186
|
if (!apiKey)
|
|
164
187
|
throw new Error("Gemini embedding provider requires an API key");
|
|
165
|
-
return createGeminiProvider({ apiKey, model, baseUrl });
|
|
188
|
+
return createGeminiProvider({ apiKey, model, baseUrl, enableSsrf });
|
|
166
189
|
case "voyage":
|
|
167
190
|
if (!apiKey)
|
|
168
191
|
throw new Error("Voyage embedding provider requires an API key");
|
|
169
|
-
return createVoyageProvider({ apiKey, model, baseUrl });
|
|
192
|
+
return createVoyageProvider({ apiKey, model, baseUrl, enableSsrf });
|
|
170
193
|
case "mistral":
|
|
171
194
|
if (!apiKey)
|
|
172
195
|
throw new Error("Mistral embedding provider requires an API key");
|
|
173
|
-
return createMistralProvider({ apiKey, model, baseUrl });
|
|
196
|
+
return createMistralProvider({ apiKey, model, baseUrl, enableSsrf });
|
|
174
197
|
case "ollama":
|
|
175
|
-
return createOllamaProvider({ model, baseUrl });
|
|
198
|
+
return createOllamaProvider({ model, baseUrl, enableSsrf });
|
|
176
199
|
default:
|
|
177
200
|
throw new Error(`Unknown embedding provider: ${provider}`);
|
|
178
201
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../../src/memory/embeddings.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../../src/memory/embeddings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAmB,MAAM,WAAW,CAAC;AAYpF,SAAS,iBAAiB,CAAC,IAAY;IACrC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACrC,OAAO,SAAS;SACb,OAAO,CAAC,4DAA4D,EAAE,YAAY,CAAC;SACnF,OAAO,CAAC,wBAAwB,EAAE,iBAAiB,CAAC;SACpD,OAAO,CAAC,6DAA6D,EAAE,mBAAmB,CAAC,CAAC;AACjG,CAAC;AAED,MAAM,sBAAsB,GAAG,CAAC,CAAC;AAEjC,SAAS,mBAAmB,CAAC,IAAY,EAAE,SAAkB;IAC3D,IAAI,SAAS,IAAI,IAAI,CAAC,MAAM,GAAG,SAAS,GAAG,sBAAsB,EAAE,CAAC;QAClE,MAAM,IAAI,KAAK,CACb,gBAAgB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,sBAAsB,CAAC,sCAAsC,SAAS,SAAS,CACxH,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,6BAA6B,CAAC,GAAa;IAClD,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3E,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IACtF,IAAI,SAAS,GAAG,KAAK;QAAE,OAAO,SAAS,CAAC;IACxC,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC;AACrD,CAAC;AAED,KAAK,UAAU,SAAS,CACtB,GAAW,EACX,IAAiB,EACjB,UAAuB;IAEvB,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,kBAAkB,CAAC,GAAG,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AAC1B,CAAC;AAWD,SAAS,6BAA6B,CAAC,MAA4B;IACjE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;IAE1E,KAAK,UAAU,IAAI,CAAC,KAAe;QACjC,MAAM,GAAG,GAAG,MAAM,SAAS,CACzB,GAAG,OAAO,aAAa,EACvB;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,MAAM,EAAE;aAClC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;SACvC,EACD,UAAU,CACX,CAAC;QACF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,GAAG,EAAE,uBAAuB,GAAG,CAAC,MAAM,MAAM,iBAAiB,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QACrG,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA6C,CAAC;QAC5E,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,6BAA6B,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,OAAO;QACL,EAAE;QACF,KAAK;QACL,cAAc;QACd,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACzB,mBAAmB,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;YAC1C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YACnC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACrC,MAAM,IAAI,KAAK,CAAC,GAAG,EAAE,oCAAoC,CAAC,CAAC;YAC7D,CAAC;YACD,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;QACD,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YAC1B,KAAK,MAAM,CAAC,IAAI,KAAK;gBAAE,mBAAmB,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;YAC9D,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,iBAAiB;AAEjB,MAAM,uBAAuB,GAA2B;IACtD,wBAAwB,EAAE,IAAI;IAC9B,wBAAwB,EAAE,IAAI;IAC9B,wBAAwB,EAAE,IAAI;CAC/B,CAAC;AAEF,SAAS,oBAAoB,CAAC,MAK7B;IACC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,wBAAwB,CAAC;IACvD,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,2BAA2B,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACpF,OAAO,6BAA6B,CAAC;QACnC,EAAE,EAAE,QAAQ;QACZ,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,KAAK;QACL,OAAO;QACP,cAAc,EAAE,uBAAuB,CAAC,KAAK,CAAC;QAC9C,UAAU,EAAE,MAAM,CAAC,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS;KAC/F,CAAC,CAAC;AACL,CAAC;AAED,0DAA0D;AAE1D,MAAM,uBAAuB,GAA2B;IACtD,sBAAsB,EAAE,IAAI;IAC5B,oBAAoB,EAAE,IAAI;CAC3B,CAAC;AAEF,SAAS,oBAAoB,CAAC,MAK7B;IACC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,sBAAsB,CAAC;IACrD,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,kDAAkD,CAAC,CAAC,OAAO,CAC5F,MAAM,EACN,EAAE,CACH,CAAC;IACF,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAEtG,KAAK,UAAU,IAAI,CAAC,KAAe;QACjC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACpC,KAAK,EAAE,UAAU,KAAK,EAAE;YACxB,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE;SAC/B,CAAC,CAAC,CAAC;QACJ,MAAM,GAAG,GAAG,MAAM,SAAS,CACzB,GAAG,OAAO,WAAW,KAAK,qBAAqB,EAC/C;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,gBAAgB,EAAE,MAAM,CAAC,MAAM;aAChC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;SACnC,EACD,UAAU,CACX,CAAC;QACF,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,GAAG,CAAC,MAAM,MAAM,iBAAiB,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QACjH,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAgD,CAAC;QAC/E,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,6BAA6B,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7E,CAAC;IAED,MAAM,SAAS,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAEjD,OAAO;QACL,EAAE,EAAE,QAAQ;QACZ,KAAK;QACL,cAAc,EAAE,SAAS;QACzB,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACzB,mBAAmB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YACrC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YACnC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;YAClG,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;QACD,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YAC1B,KAAK,MAAM,CAAC,IAAI,KAAK;gBAAE,mBAAmB,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YACzD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,iBAAiB;AAEjB,SAAS,oBAAoB,CAAC,MAK7B;IACC,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,6BAA6B,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACtF,OAAO,6BAA6B,CAAC;QACnC,EAAE,EAAE,QAAQ;QACZ,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,eAAe;QACtC,OAAO;QACP,UAAU,EAAE,MAAM,CAAC,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS;KAC/F,CAAC,CAAC;AACL,CAAC;AAED,kBAAkB;AAElB,SAAS,qBAAqB,CAAC,MAK9B;IACC,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,2BAA2B,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACpF,OAAO,6BAA6B,CAAC;QACnC,EAAE,EAAE,SAAS;QACb,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,eAAe;QACtC,OAAO;QACP,UAAU,EAAE,MAAM,CAAC,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS;KAC/F,CAAC,CAAC;AACL,CAAC;AAED,qEAAqE;AAErE,SAAS,oBAAoB,CAAC,MAI7B;IACC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,kBAAkB,CAAC;IACjD,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,wBAAwB,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACjF,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAEtG,KAAK,UAAU,IAAI,CAAC,KAAe;QACjC,MAAM,GAAG,GAAG,MAAM,SAAS,CACzB,GAAG,OAAO,YAAY,EACtB;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;SACvC,EACD,UAAU,CACX,CAAC;QACF,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,GAAG,CAAC,MAAM,MAAM,iBAAiB,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QACjH,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA+B,CAAC;QAC9D,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,6BAA6B,CAAC,CAAC,CAAC,CAAC,CAAC;IACtE,CAAC;IAED,OAAO;QACL,EAAE,EAAE,QAAQ;QACZ,KAAK;QACL,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACzB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YACnC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;YAClG,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;QACD,UAAU,EAAE,IAAI;KACjB,CAAC;AACJ,CAAC;AAYD,MAAM,UAAU,uBAAuB,CACrC,OAAuC;IAEvC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAEjE,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ;YACX,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;YAC9E,OAAO,oBAAoB,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;QACtE,KAAK,QAAQ;YACX,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;YAC9E,OAAO,oBAAoB,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;QACtE,KAAK,QAAQ;YACX,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;YAC9E,OAAO,oBAAoB,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;QACtE,KAAK,SAAS;YACZ,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;YAC/E,OAAO,qBAAqB,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;QACvE,KAAK,QAAQ;YACX,OAAO,oBAAoB,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;QAC9D;YACE,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,EAAE,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { SimpleMemoryManager } from "./simple-manager.js";
|
|
2
|
+
export interface FileIndexerOptions {
|
|
3
|
+
workspaceDir: string;
|
|
4
|
+
memory: SimpleMemoryManager;
|
|
5
|
+
watchPaths?: string[];
|
|
6
|
+
debounceMs?: number;
|
|
7
|
+
extraPaths?: string[];
|
|
8
|
+
chunking?: {
|
|
9
|
+
tokens: number;
|
|
10
|
+
overlap: number;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export interface FileIndexer {
|
|
14
|
+
start(): void;
|
|
15
|
+
stop(): void;
|
|
16
|
+
sync(): Promise<FileIndexSyncResult>;
|
|
17
|
+
readonly watching: boolean;
|
|
18
|
+
}
|
|
19
|
+
export interface FileIndexSyncResult {
|
|
20
|
+
filesProcessed: number;
|
|
21
|
+
chunksStored: number;
|
|
22
|
+
chunksRemoved: number;
|
|
23
|
+
errors: number;
|
|
24
|
+
}
|
|
25
|
+
export declare function createFileIndexer(options: FileIndexerOptions): FileIndexer;
|
|
26
|
+
//# sourceMappingURL=file-indexer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-indexer.d.ts","sourceRoot":"","sources":["../../src/memory/file-indexer.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAiB/D,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAChD;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,IAAI,IAAI,CAAC;IACd,IAAI,IAAI,IAAI,CAAC;IACb,IAAI,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB;AAcD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,WAAW,CAgN1E"}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
// Ported from OpenClaw extensions/memory-core/src/memory/manager-sync-ops.ts
|
|
2
|
+
// ensureWatcher logic, IGNORED_MEMORY_WATCH_DIR_NAMES, shouldIgnoreMemoryWatchPath,
|
|
3
|
+
// syncMemoryFiles with hash comparison and stale cleanup
|
|
4
|
+
import * as fs from "node:fs";
|
|
5
|
+
import * as path from "node:path";
|
|
6
|
+
import { createSubsystemLogger } from "../logging/subsystem.js";
|
|
7
|
+
import { chunkMarkdown, hashText } from "./internal.js";
|
|
8
|
+
const log = createSubsystemLogger("memory/file-indexer");
|
|
9
|
+
const MAX_FILE_SIZE = 1024 * 1024;
|
|
10
|
+
// From OpenClaw: exact list of ignored directory names
|
|
11
|
+
const IGNORED_MEMORY_WATCH_DIR_NAMES = new Set([
|
|
12
|
+
".git",
|
|
13
|
+
"node_modules",
|
|
14
|
+
".pnpm-store",
|
|
15
|
+
".venv",
|
|
16
|
+
"venv",
|
|
17
|
+
".tox",
|
|
18
|
+
"__pycache__",
|
|
19
|
+
]);
|
|
20
|
+
// From OpenClaw
|
|
21
|
+
function shouldIgnoreMemoryWatchPath(watchPath) {
|
|
22
|
+
const normalized = path.normalize(watchPath);
|
|
23
|
+
const parts = normalized.split(path.sep).map((segment) => segment.trim().toLowerCase());
|
|
24
|
+
return parts.some((segment) => IGNORED_MEMORY_WATCH_DIR_NAMES.has(segment));
|
|
25
|
+
}
|
|
26
|
+
export function createFileIndexer(options) {
|
|
27
|
+
const { workspaceDir, memory, debounceMs = 2000, chunking = { tokens: 500, overlap: 50 }, } = options;
|
|
28
|
+
const watchers = [];
|
|
29
|
+
let watching = false;
|
|
30
|
+
let watchTimer = null;
|
|
31
|
+
let dirty = false;
|
|
32
|
+
const indexedFiles = new Map();
|
|
33
|
+
function resolveWatchPaths() {
|
|
34
|
+
const paths = new Set();
|
|
35
|
+
const memoryMd = path.join(workspaceDir, "MEMORY.md");
|
|
36
|
+
if (fs.existsSync(memoryMd))
|
|
37
|
+
paths.add(memoryMd);
|
|
38
|
+
const memoryMdLower = path.join(workspaceDir, "memory.md");
|
|
39
|
+
if (memoryMdLower !== memoryMd && fs.existsSync(memoryMdLower))
|
|
40
|
+
paths.add(memoryMdLower);
|
|
41
|
+
const memoryDir = path.join(workspaceDir, "memory");
|
|
42
|
+
if (fs.existsSync(memoryDir) && fs.statSync(memoryDir).isDirectory())
|
|
43
|
+
paths.add(memoryDir);
|
|
44
|
+
for (const p of [...(options.watchPaths ?? []), ...(options.extraPaths ?? [])]) {
|
|
45
|
+
const resolved = path.isAbsolute(p) ? p : path.join(workspaceDir, p);
|
|
46
|
+
try {
|
|
47
|
+
const stat = fs.lstatSync(resolved);
|
|
48
|
+
if (stat.isSymbolicLink())
|
|
49
|
+
continue;
|
|
50
|
+
if (stat.isFile() || stat.isDirectory())
|
|
51
|
+
paths.add(resolved);
|
|
52
|
+
}
|
|
53
|
+
catch { /* skip missing */ }
|
|
54
|
+
}
|
|
55
|
+
return Array.from(paths);
|
|
56
|
+
}
|
|
57
|
+
function collectMarkdownFiles(dir) {
|
|
58
|
+
const files = [];
|
|
59
|
+
try {
|
|
60
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
61
|
+
for (const entry of entries) {
|
|
62
|
+
const full = path.join(dir, entry.name);
|
|
63
|
+
if (shouldIgnoreMemoryWatchPath(full))
|
|
64
|
+
continue;
|
|
65
|
+
if (entry.isDirectory()) {
|
|
66
|
+
files.push(...collectMarkdownFiles(full));
|
|
67
|
+
}
|
|
68
|
+
else if (entry.isFile() && (entry.name.endsWith(".md") || entry.name.endsWith(".txt"))) {
|
|
69
|
+
files.push(full);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch { /* directory not readable */ }
|
|
74
|
+
return files;
|
|
75
|
+
}
|
|
76
|
+
function collectAllFiles() {
|
|
77
|
+
const files = [];
|
|
78
|
+
const memoryMd = path.join(workspaceDir, "MEMORY.md");
|
|
79
|
+
if (fs.existsSync(memoryMd))
|
|
80
|
+
files.push(memoryMd);
|
|
81
|
+
const memoryMdLower = path.join(workspaceDir, "memory.md");
|
|
82
|
+
if (memoryMdLower !== memoryMd && fs.existsSync(memoryMdLower))
|
|
83
|
+
files.push(memoryMdLower);
|
|
84
|
+
const memoryDir = path.join(workspaceDir, "memory");
|
|
85
|
+
if (fs.existsSync(memoryDir) && fs.statSync(memoryDir).isDirectory()) {
|
|
86
|
+
files.push(...collectMarkdownFiles(memoryDir));
|
|
87
|
+
}
|
|
88
|
+
for (const p of [...(options.watchPaths ?? []), ...(options.extraPaths ?? [])]) {
|
|
89
|
+
const resolved = path.isAbsolute(p) ? p : path.join(workspaceDir, p);
|
|
90
|
+
try {
|
|
91
|
+
const stat = fs.statSync(resolved);
|
|
92
|
+
if (stat.isFile())
|
|
93
|
+
files.push(resolved);
|
|
94
|
+
else if (stat.isDirectory())
|
|
95
|
+
files.push(...collectMarkdownFiles(resolved));
|
|
96
|
+
}
|
|
97
|
+
catch { /* skip */ }
|
|
98
|
+
}
|
|
99
|
+
return [...new Set(files)];
|
|
100
|
+
}
|
|
101
|
+
function scheduleWatchSync() {
|
|
102
|
+
dirty = true;
|
|
103
|
+
if (watchTimer)
|
|
104
|
+
clearTimeout(watchTimer);
|
|
105
|
+
watchTimer = setTimeout(() => {
|
|
106
|
+
watchTimer = null;
|
|
107
|
+
sync().catch((err) => log.warn(`memory sync failed (watch): ${String(err)}`));
|
|
108
|
+
}, debounceMs);
|
|
109
|
+
}
|
|
110
|
+
async function sync() {
|
|
111
|
+
dirty = false;
|
|
112
|
+
const result = {
|
|
113
|
+
filesProcessed: 0, chunksStored: 0, chunksRemoved: 0, errors: 0,
|
|
114
|
+
};
|
|
115
|
+
const currentFiles = collectAllFiles();
|
|
116
|
+
const currentPaths = new Set(currentFiles);
|
|
117
|
+
// Remove chunks for deleted files
|
|
118
|
+
for (const [filePath, state] of indexedFiles) {
|
|
119
|
+
if (!currentPaths.has(filePath)) {
|
|
120
|
+
for (const chunkId of state.chunkIds) {
|
|
121
|
+
try {
|
|
122
|
+
await memory.delete(chunkId);
|
|
123
|
+
result.chunksRemoved++;
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
result.errors++;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
indexedFiles.delete(filePath);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// Index new/changed files
|
|
133
|
+
for (const filePath of currentFiles) {
|
|
134
|
+
try {
|
|
135
|
+
const stat = fs.statSync(filePath);
|
|
136
|
+
if (stat.size > MAX_FILE_SIZE) {
|
|
137
|
+
log.warn(`skipping large file: ${filePath} (${stat.size} bytes)`);
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
const content = fs.readFileSync(filePath, "utf-8");
|
|
141
|
+
const hash = hashText(content);
|
|
142
|
+
const existing = indexedFiles.get(filePath);
|
|
143
|
+
// Skip unchanged files (OpenClaw's hash comparison)
|
|
144
|
+
if (existing && existing.hash === hash) {
|
|
145
|
+
result.filesProcessed++;
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
// Remove old chunks for changed files
|
|
149
|
+
if (existing) {
|
|
150
|
+
for (const chunkId of existing.chunkIds) {
|
|
151
|
+
try {
|
|
152
|
+
await memory.delete(chunkId);
|
|
153
|
+
result.chunksRemoved++;
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
result.errors++;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
const relPath = path.relative(workspaceDir, filePath);
|
|
161
|
+
const chunks = chunkMarkdown(content, chunking);
|
|
162
|
+
const newChunkIds = [];
|
|
163
|
+
for (const chunk of chunks) {
|
|
164
|
+
if (!chunk.text.trim())
|
|
165
|
+
continue;
|
|
166
|
+
try {
|
|
167
|
+
const id = await memory.store(chunk.text, {
|
|
168
|
+
source: "file",
|
|
169
|
+
path: relPath,
|
|
170
|
+
startLine: chunk.startLine,
|
|
171
|
+
endLine: chunk.endLine,
|
|
172
|
+
});
|
|
173
|
+
newChunkIds.push(id);
|
|
174
|
+
result.chunksStored++;
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
result.errors++;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
indexedFiles.set(filePath, { hash, chunkIds: newChunkIds });
|
|
181
|
+
result.filesProcessed++;
|
|
182
|
+
}
|
|
183
|
+
catch (err) {
|
|
184
|
+
log.error(`failed to index ${filePath}`, { error: String(err) });
|
|
185
|
+
result.errors++;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
log.info("sync complete", {
|
|
189
|
+
files: result.filesProcessed, stored: result.chunksStored,
|
|
190
|
+
removed: result.chunksRemoved, errors: result.errors,
|
|
191
|
+
});
|
|
192
|
+
return result;
|
|
193
|
+
}
|
|
194
|
+
return {
|
|
195
|
+
get watching() { return watching; },
|
|
196
|
+
start() {
|
|
197
|
+
if (watching)
|
|
198
|
+
return;
|
|
199
|
+
watching = true;
|
|
200
|
+
const paths = resolveWatchPaths();
|
|
201
|
+
if (paths.length === 0) {
|
|
202
|
+
log.debug("no watch paths found");
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
for (const watchPath of paths) {
|
|
206
|
+
try {
|
|
207
|
+
const isDir = fs.statSync(watchPath).isDirectory();
|
|
208
|
+
const watcher = fs.watch(watchPath, { recursive: isDir, persistent: false }, (_eventType, filename) => {
|
|
209
|
+
if (!filename)
|
|
210
|
+
return;
|
|
211
|
+
if (shouldIgnoreMemoryWatchPath(filename))
|
|
212
|
+
return;
|
|
213
|
+
const ext = path.extname(filename);
|
|
214
|
+
if (ext === ".md" || ext === ".txt" || filename === "MEMORY.md") {
|
|
215
|
+
log.debug(`file change detected: ${filename}`);
|
|
216
|
+
scheduleWatchSync();
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
watchers.push(watcher);
|
|
220
|
+
}
|
|
221
|
+
catch (err) {
|
|
222
|
+
log.warn(`cannot watch ${watchPath}: ${err}`);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
log.info(`watching ${paths.length} paths for changes`);
|
|
226
|
+
sync().catch((err) => log.error("initial sync failed", { error: String(err) }));
|
|
227
|
+
},
|
|
228
|
+
stop() {
|
|
229
|
+
watching = false;
|
|
230
|
+
if (watchTimer) {
|
|
231
|
+
clearTimeout(watchTimer);
|
|
232
|
+
watchTimer = null;
|
|
233
|
+
}
|
|
234
|
+
for (const w of watchers) {
|
|
235
|
+
try {
|
|
236
|
+
w.close();
|
|
237
|
+
}
|
|
238
|
+
catch { /* best effort */ }
|
|
239
|
+
}
|
|
240
|
+
watchers.length = 0;
|
|
241
|
+
},
|
|
242
|
+
sync,
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=file-indexer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-indexer.js","sourceRoot":"","sources":["../../src/memory/file-indexer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hybrid.d.ts","sourceRoot":"","sources":["../../src/memory/hybrid.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,SAAS,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AACvF,OAAO,EAEL,KAAK,mBAAmB,EACxB,6BAA6B,EAC9B,MAAM,qBAAqB,CAAC;AAE7B,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC;AAElC,OAAO,EAAE,KAAK,SAAS,EAAE,kBAAkB,EAAE,CAAC;AAC9C,OAAO,EAAE,KAAK,mBAAmB,EAAE,6BAA6B,EAAE,CAAC;AAEnE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,YAAY,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,YAAY,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWxD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"hybrid.d.ts","sourceRoot":"","sources":["../../src/memory/hybrid.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,SAAS,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AACvF,OAAO,EAEL,KAAK,mBAAmB,EACxB,6BAA6B,EAC9B,MAAM,qBAAqB,CAAC;AAE7B,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC;AAElC,OAAO,EAAE,KAAK,SAAS,EAAE,kBAAkB,EAAE,CAAC;AAC9C,OAAO,EAAE,KAAK,mBAAmB,EAAE,6BAA6B,EAAE,CAAC;AAEnE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,YAAY,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,YAAY,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWxD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMpD;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE;IAC/C,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uDAAuD;IACvD,GAAG,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IACzB,6DAA6D;IAC7D,aAAa,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC7C,0DAA0D;IAC1D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CACT,KAAK,CAAC;IACJ,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,YAAY,CAAC;CACtB,CAAC,CACH,CA6EA"}
|