bulkhead-runtime 0.1.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.
Files changed (220) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +625 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +43 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/config/index.d.ts +29 -0
  8. package/dist/config/index.d.ts.map +1 -0
  9. package/dist/config/index.js +24 -0
  10. package/dist/config/index.js.map +1 -0
  11. package/dist/credentials/index.d.ts +4 -0
  12. package/dist/credentials/index.d.ts.map +1 -0
  13. package/dist/credentials/index.js +3 -0
  14. package/dist/credentials/index.js.map +1 -0
  15. package/dist/credentials/proxy.d.ts +3 -0
  16. package/dist/credentials/proxy.d.ts.map +1 -0
  17. package/dist/credentials/proxy.js +11 -0
  18. package/dist/credentials/proxy.js.map +1 -0
  19. package/dist/credentials/store.d.ts +7 -0
  20. package/dist/credentials/store.d.ts.map +1 -0
  21. package/dist/credentials/store.js +91 -0
  22. package/dist/credentials/store.js.map +1 -0
  23. package/dist/credentials/types.d.ts +14 -0
  24. package/dist/credentials/types.d.ts.map +1 -0
  25. package/dist/credentials/types.js +2 -0
  26. package/dist/credentials/types.js.map +1 -0
  27. package/dist/hooks/index.d.ts +3 -0
  28. package/dist/hooks/index.d.ts.map +1 -0
  29. package/dist/hooks/index.js +2 -0
  30. package/dist/hooks/index.js.map +1 -0
  31. package/dist/hooks/runner.d.ts +7 -0
  32. package/dist/hooks/runner.d.ts.map +1 -0
  33. package/dist/hooks/runner.js +20 -0
  34. package/dist/hooks/runner.js.map +1 -0
  35. package/dist/hooks/types.d.ts +39 -0
  36. package/dist/hooks/types.d.ts.map +1 -0
  37. package/dist/hooks/types.js +2 -0
  38. package/dist/hooks/types.js.map +1 -0
  39. package/dist/index.d.ts +14 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +21 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/infra/env.d.ts +2 -0
  44. package/dist/infra/env.d.ts.map +1 -0
  45. package/dist/infra/env.js +6 -0
  46. package/dist/infra/env.js.map +1 -0
  47. package/dist/infra/warning-filter.d.ts +8 -0
  48. package/dist/infra/warning-filter.d.ts.map +1 -0
  49. package/dist/infra/warning-filter.js +66 -0
  50. package/dist/infra/warning-filter.js.map +1 -0
  51. package/dist/logging/subsystem.d.ts +15 -0
  52. package/dist/logging/subsystem.d.ts.map +1 -0
  53. package/dist/logging/subsystem.js +57 -0
  54. package/dist/logging/subsystem.js.map +1 -0
  55. package/dist/memory/embeddings-debug.d.ts +2 -0
  56. package/dist/memory/embeddings-debug.d.ts.map +1 -0
  57. package/dist/memory/embeddings-debug.js +12 -0
  58. package/dist/memory/embeddings-debug.js.map +1 -0
  59. package/dist/memory/embeddings.d.ts +16 -0
  60. package/dist/memory/embeddings.d.ts.map +1 -0
  61. package/dist/memory/embeddings.js +180 -0
  62. package/dist/memory/embeddings.js.map +1 -0
  63. package/dist/memory/fs-utils.d.ts +12 -0
  64. package/dist/memory/fs-utils.d.ts.map +1 -0
  65. package/dist/memory/fs-utils.js +24 -0
  66. package/dist/memory/fs-utils.js.map +1 -0
  67. package/dist/memory/hybrid.d.ts +46 -0
  68. package/dist/memory/hybrid.d.ts.map +1 -0
  69. package/dist/memory/hybrid.js +81 -0
  70. package/dist/memory/hybrid.js.map +1 -0
  71. package/dist/memory/index.d.ts +12 -0
  72. package/dist/memory/index.d.ts.map +1 -0
  73. package/dist/memory/index.js +12 -0
  74. package/dist/memory/index.js.map +1 -0
  75. package/dist/memory/internal.d.ts +39 -0
  76. package/dist/memory/internal.d.ts.map +1 -0
  77. package/dist/memory/internal.js +292 -0
  78. package/dist/memory/internal.js.map +1 -0
  79. package/dist/memory/manager-search.d.ts +61 -0
  80. package/dist/memory/manager-search.d.ts.map +1 -0
  81. package/dist/memory/manager-search.js +102 -0
  82. package/dist/memory/manager-search.js.map +1 -0
  83. package/dist/memory/mmr.d.ts +63 -0
  84. package/dist/memory/mmr.d.ts.map +1 -0
  85. package/dist/memory/mmr.js +165 -0
  86. package/dist/memory/mmr.js.map +1 -0
  87. package/dist/memory/query-expansion.d.ts +42 -0
  88. package/dist/memory/query-expansion.d.ts.map +1 -0
  89. package/dist/memory/query-expansion.js +776 -0
  90. package/dist/memory/query-expansion.js.map +1 -0
  91. package/dist/memory/simple-manager.d.ts +23 -0
  92. package/dist/memory/simple-manager.d.ts.map +1 -0
  93. package/dist/memory/simple-manager.js +193 -0
  94. package/dist/memory/simple-manager.js.map +1 -0
  95. package/dist/memory/sqlite.d.ts +2 -0
  96. package/dist/memory/sqlite.d.ts.map +1 -0
  97. package/dist/memory/sqlite.js +16 -0
  98. package/dist/memory/sqlite.js.map +1 -0
  99. package/dist/memory/temporal-decay.d.ts +26 -0
  100. package/dist/memory/temporal-decay.d.ts.map +1 -0
  101. package/dist/memory/temporal-decay.js +120 -0
  102. package/dist/memory/temporal-decay.js.map +1 -0
  103. package/dist/memory/types.d.ts +95 -0
  104. package/dist/memory/types.d.ts.map +1 -0
  105. package/dist/memory/types.js +2 -0
  106. package/dist/memory/types.js.map +1 -0
  107. package/dist/package.json +36 -0
  108. package/dist/platform/index.d.ts +3 -0
  109. package/dist/platform/index.d.ts.map +1 -0
  110. package/dist/platform/index.js +2 -0
  111. package/dist/platform/index.js.map +1 -0
  112. package/dist/platform/platform.d.ts +3 -0
  113. package/dist/platform/platform.d.ts.map +1 -0
  114. package/dist/platform/platform.js +68 -0
  115. package/dist/platform/platform.js.map +1 -0
  116. package/dist/platform/types.d.ts +16 -0
  117. package/dist/platform/types.d.ts.map +1 -0
  118. package/dist/platform/types.js +2 -0
  119. package/dist/platform/types.js.map +1 -0
  120. package/dist/runtime/agent.d.ts +28 -0
  121. package/dist/runtime/agent.d.ts.map +1 -0
  122. package/dist/runtime/agent.js +102 -0
  123. package/dist/runtime/agent.js.map +1 -0
  124. package/dist/runtime/index.d.ts +2 -0
  125. package/dist/runtime/index.d.ts.map +1 -0
  126. package/dist/runtime/index.js +2 -0
  127. package/dist/runtime/index.js.map +1 -0
  128. package/dist/sandbox/cgroup.d.ts +17 -0
  129. package/dist/sandbox/cgroup.d.ts.map +1 -0
  130. package/dist/sandbox/cgroup.js +69 -0
  131. package/dist/sandbox/cgroup.js.map +1 -0
  132. package/dist/sandbox/index.d.ts +11 -0
  133. package/dist/sandbox/index.d.ts.map +1 -0
  134. package/dist/sandbox/index.js +9 -0
  135. package/dist/sandbox/index.js.map +1 -0
  136. package/dist/sandbox/ipc.d.ts +23 -0
  137. package/dist/sandbox/ipc.d.ts.map +1 -0
  138. package/dist/sandbox/ipc.js +138 -0
  139. package/dist/sandbox/ipc.js.map +1 -0
  140. package/dist/sandbox/manager.d.ts +5 -0
  141. package/dist/sandbox/manager.d.ts.map +1 -0
  142. package/dist/sandbox/manager.js +245 -0
  143. package/dist/sandbox/manager.js.map +1 -0
  144. package/dist/sandbox/namespace.d.ts +12 -0
  145. package/dist/sandbox/namespace.d.ts.map +1 -0
  146. package/dist/sandbox/namespace.js +120 -0
  147. package/dist/sandbox/namespace.js.map +1 -0
  148. package/dist/sandbox/proxy-tools.d.ts +14 -0
  149. package/dist/sandbox/proxy-tools.d.ts.map +1 -0
  150. package/dist/sandbox/proxy-tools.js +63 -0
  151. package/dist/sandbox/proxy-tools.js.map +1 -0
  152. package/dist/sandbox/rootfs.d.ts +15 -0
  153. package/dist/sandbox/rootfs.d.ts.map +1 -0
  154. package/dist/sandbox/rootfs.js +163 -0
  155. package/dist/sandbox/rootfs.js.map +1 -0
  156. package/dist/sandbox/seccomp.d.ts +13 -0
  157. package/dist/sandbox/seccomp.d.ts.map +1 -0
  158. package/dist/sandbox/seccomp.js +120 -0
  159. package/dist/sandbox/seccomp.js.map +1 -0
  160. package/dist/sandbox/types.d.ts +68 -0
  161. package/dist/sandbox/types.d.ts.map +1 -0
  162. package/dist/sandbox/types.js +8 -0
  163. package/dist/sandbox/types.js.map +1 -0
  164. package/dist/sandbox/worker.d.ts +12 -0
  165. package/dist/sandbox/worker.d.ts.map +1 -0
  166. package/dist/sandbox/worker.js +84 -0
  167. package/dist/sandbox/worker.js.map +1 -0
  168. package/dist/sessions/index.d.ts +2 -0
  169. package/dist/sessions/index.d.ts.map +1 -0
  170. package/dist/sessions/index.js +2 -0
  171. package/dist/sessions/index.js.map +1 -0
  172. package/dist/sessions/store.d.ts +17 -0
  173. package/dist/sessions/store.d.ts.map +1 -0
  174. package/dist/sessions/store.js +48 -0
  175. package/dist/sessions/store.js.map +1 -0
  176. package/dist/skills/enablement.d.ts +10 -0
  177. package/dist/skills/enablement.d.ts.map +1 -0
  178. package/dist/skills/enablement.js +52 -0
  179. package/dist/skills/enablement.js.map +1 -0
  180. package/dist/skills/index.d.ts +4 -0
  181. package/dist/skills/index.d.ts.map +1 -0
  182. package/dist/skills/index.js +4 -0
  183. package/dist/skills/index.js.map +1 -0
  184. package/dist/skills/loader.d.ts +8 -0
  185. package/dist/skills/loader.d.ts.map +1 -0
  186. package/dist/skills/loader.js +8 -0
  187. package/dist/skills/loader.js.map +1 -0
  188. package/dist/skills/registry.d.ts +19 -0
  189. package/dist/skills/registry.d.ts.map +1 -0
  190. package/dist/skills/registry.js +106 -0
  191. package/dist/skills/registry.js.map +1 -0
  192. package/dist/utils/boolean.d.ts +6 -0
  193. package/dist/utils/boolean.d.ts.map +1 -0
  194. package/dist/utils/boolean.js +28 -0
  195. package/dist/utils/boolean.js.map +1 -0
  196. package/dist/utils/run-with-concurrency.d.ts +12 -0
  197. package/dist/utils/run-with-concurrency.d.ts.map +1 -0
  198. package/dist/utils/run-with-concurrency.js +40 -0
  199. package/dist/utils/run-with-concurrency.js.map +1 -0
  200. package/dist/utils.d.ts +3 -0
  201. package/dist/utils.d.ts.map +1 -0
  202. package/dist/utils.js +38 -0
  203. package/dist/utils.js.map +1 -0
  204. package/dist/workspace/index.d.ts +3 -0
  205. package/dist/workspace/index.d.ts.map +1 -0
  206. package/dist/workspace/index.js +2 -0
  207. package/dist/workspace/index.js.map +1 -0
  208. package/dist/workspace/runner.d.ts +19 -0
  209. package/dist/workspace/runner.d.ts.map +1 -0
  210. package/dist/workspace/runner.js +158 -0
  211. package/dist/workspace/runner.js.map +1 -0
  212. package/dist/workspace/types.d.ts +36 -0
  213. package/dist/workspace/types.d.ts.map +1 -0
  214. package/dist/workspace/types.js +2 -0
  215. package/dist/workspace/types.js.map +1 -0
  216. package/dist/workspace/workspace.d.ts +12 -0
  217. package/dist/workspace/workspace.d.ts.map +1 -0
  218. package/dist/workspace/workspace.js +76 -0
  219. package/dist/workspace/workspace.js.map +1 -0
  220. package/package.json +53 -0
@@ -0,0 +1,12 @@
1
+ import { isTruthyEnvValue } from "../infra/env.js";
2
+ import { createSubsystemLogger } from "../logging/subsystem.js";
3
+ const debugEmbeddings = isTruthyEnvValue(process.env.OPENCLAW_DEBUG_MEMORY_EMBEDDINGS);
4
+ const log = createSubsystemLogger("memory/embeddings");
5
+ export function debugEmbeddingsLog(message, meta) {
6
+ if (!debugEmbeddings) {
7
+ return;
8
+ }
9
+ const suffix = meta ? ` ${JSON.stringify(meta)}` : "";
10
+ log.raw(`${message}${suffix}`);
11
+ }
12
+ //# sourceMappingURL=embeddings-debug.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddings-debug.js","sourceRoot":"","sources":["../../src/memory/embeddings-debug.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,MAAM,eAAe,GAAG,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;AACvF,MAAM,GAAG,GAAG,qBAAqB,CAAC,mBAAmB,CAAC,CAAC;AAEvD,MAAM,UAAU,kBAAkB,CAAC,OAAe,EAAE,IAA8B;IAChF,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,OAAO;IACT,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACtD,GAAG,CAAC,GAAG,CAAC,GAAG,OAAO,GAAG,MAAM,EAAE,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,16 @@
1
+ export type EmbeddingProvider = {
2
+ id: string;
3
+ model: string;
4
+ maxInputTokens?: number;
5
+ embedQuery: (text: string) => Promise<number[]>;
6
+ embedBatch: (texts: string[]) => Promise<number[][]>;
7
+ };
8
+ export type EmbeddingProviderId = "openai" | "gemini" | "voyage" | "mistral" | "ollama";
9
+ export type CreateEmbeddingProviderOptions = {
10
+ provider: EmbeddingProviderId;
11
+ apiKey?: string;
12
+ model?: string;
13
+ baseUrl?: string;
14
+ };
15
+ export declare function createEmbeddingProvider(options: CreateEmbeddingProviderOptions): EmbeddingProvider;
16
+ //# sourceMappingURL=embeddings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../../src/memory/embeddings.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAChD,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;CACtD,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;AAyMxF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,8BAA8B,GACtC,iBAAiB,CAqBnB"}
@@ -0,0 +1,180 @@
1
+ // EmbeddingProvider interface and factory, adapted from OpenClaw src/memory/embeddings.ts
2
+ // The original depended on OpenClawConfig, SecretInput, SSRF policies, model-auth, and
3
+ // per-provider client modules. This version keeps the same EmbeddingProvider interface
4
+ // but accepts simple options (apiKey, model, baseUrl) directly.
5
+ function sanitizeAndNormalizeEmbedding(vec) {
6
+ const sanitized = vec.map((value) => (Number.isFinite(value) ? value : 0));
7
+ const magnitude = Math.sqrt(sanitized.reduce((sum, value) => sum + value * value, 0));
8
+ if (magnitude < 1e-10)
9
+ return sanitized;
10
+ return sanitized.map((value) => value / magnitude);
11
+ }
12
+ // --- OpenAI ---
13
+ // From OpenClaw src/memory/embeddings-openai.ts
14
+ const DEFAULT_OPENAI_MODEL = "text-embedding-3-small";
15
+ const OPENAI_MAX_INPUT_TOKENS = {
16
+ "text-embedding-3-small": 8192,
17
+ "text-embedding-3-large": 8192,
18
+ "text-embedding-ada-002": 8191,
19
+ };
20
+ function createOpenAiProvider(params) {
21
+ const model = params.model ?? DEFAULT_OPENAI_MODEL;
22
+ const baseUrl = (params.baseUrl ?? "https://api.openai.com/v1").replace(/\/+$/, "");
23
+ async function call(input) {
24
+ const res = await fetch(`${baseUrl}/embeddings`, {
25
+ method: "POST",
26
+ headers: {
27
+ "Content-Type": "application/json",
28
+ Authorization: `Bearer ${params.apiKey}`,
29
+ },
30
+ body: JSON.stringify({ input, model }),
31
+ });
32
+ if (!res.ok)
33
+ throw new Error(`OpenAI embeddings failed (${res.status}): ${await res.text()}`);
34
+ const body = (await res.json());
35
+ return body.data.map((d) => sanitizeAndNormalizeEmbedding(d.embedding));
36
+ }
37
+ return {
38
+ id: "openai",
39
+ model,
40
+ maxInputTokens: OPENAI_MAX_INPUT_TOKENS[model],
41
+ embedQuery: async (text) => (await call([text]))[0],
42
+ embedBatch: call,
43
+ };
44
+ }
45
+ // --- Gemini ---
46
+ // From OpenClaw src/memory/embeddings-gemini.ts
47
+ const DEFAULT_GEMINI_MODEL = "gemini-embedding-001";
48
+ const GEMINI_MAX_INPUT_TOKENS = {
49
+ "text-embedding-004": 2048,
50
+ };
51
+ function createGeminiProvider(params) {
52
+ const model = params.model ?? DEFAULT_GEMINI_MODEL;
53
+ const baseUrl = (params.baseUrl ?? "https://generativelanguage.googleapis.com/v1beta").replace(/\/+$/, "");
54
+ async function call(texts) {
55
+ const requests = texts.map((text) => ({
56
+ model: `models/${model}`,
57
+ content: { parts: [{ text }] },
58
+ }));
59
+ const res = await fetch(`${baseUrl}/models/${model}:batchEmbedContents?key=${params.apiKey}`, {
60
+ method: "POST",
61
+ headers: { "Content-Type": "application/json" },
62
+ body: JSON.stringify({ requests }),
63
+ });
64
+ if (!res.ok)
65
+ throw new Error(`Gemini embeddings failed (${res.status}): ${await res.text()}`);
66
+ const body = (await res.json());
67
+ return body.embeddings.map((e) => sanitizeAndNormalizeEmbedding(e.values));
68
+ }
69
+ return {
70
+ id: "gemini",
71
+ model,
72
+ maxInputTokens: GEMINI_MAX_INPUT_TOKENS[model],
73
+ embedQuery: async (text) => (await call([text]))[0],
74
+ embedBatch: call,
75
+ };
76
+ }
77
+ // --- Voyage ---
78
+ // From OpenClaw src/memory/embeddings-voyage.ts
79
+ const DEFAULT_VOYAGE_MODEL = "voyage-3-lite";
80
+ function createVoyageProvider(params) {
81
+ const model = params.model ?? DEFAULT_VOYAGE_MODEL;
82
+ const baseUrl = (params.baseUrl ?? "https://api.voyageai.com/v1").replace(/\/+$/, "");
83
+ async function call(input) {
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 {
98
+ id: "voyage",
99
+ model,
100
+ embedQuery: async (text) => (await call([text]))[0],
101
+ embedBatch: call,
102
+ };
103
+ }
104
+ // --- Mistral ---
105
+ // From OpenClaw src/memory/embeddings-mistral.ts
106
+ const DEFAULT_MISTRAL_MODEL = "mistral-embed";
107
+ function createMistralProvider(params) {
108
+ const model = params.model ?? DEFAULT_MISTRAL_MODEL;
109
+ const baseUrl = (params.baseUrl ?? "https://api.mistral.ai/v1").replace(/\/+$/, "");
110
+ async function call(input) {
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 {
125
+ id: "mistral",
126
+ model,
127
+ embedQuery: async (text) => (await call([text]))[0],
128
+ embedBatch: call,
129
+ };
130
+ }
131
+ // --- Ollama ---
132
+ // From OpenClaw src/memory/embeddings-ollama.ts
133
+ const DEFAULT_OLLAMA_MODEL = "nomic-embed-text";
134
+ function createOllamaProvider(params) {
135
+ const model = params.model ?? DEFAULT_OLLAMA_MODEL;
136
+ const baseUrl = (params.baseUrl ?? "http://localhost:11434").replace(/\/+$/, "");
137
+ async function call(input) {
138
+ const res = await fetch(`${baseUrl}/api/embed`, {
139
+ method: "POST",
140
+ headers: { "Content-Type": "application/json" },
141
+ body: JSON.stringify({ model, input }),
142
+ });
143
+ if (!res.ok)
144
+ throw new Error(`Ollama embeddings failed (${res.status}): ${await res.text()}`);
145
+ const body = (await res.json());
146
+ return body.embeddings.map((v) => sanitizeAndNormalizeEmbedding(v));
147
+ }
148
+ return {
149
+ id: "ollama",
150
+ model,
151
+ embedQuery: async (text) => (await call([text]))[0],
152
+ embedBatch: call,
153
+ };
154
+ }
155
+ export function createEmbeddingProvider(options) {
156
+ const { provider, apiKey, model, baseUrl } = options;
157
+ switch (provider) {
158
+ case "openai":
159
+ if (!apiKey)
160
+ throw new Error("OpenAI embedding provider requires an API key");
161
+ return createOpenAiProvider({ apiKey, model, baseUrl });
162
+ case "gemini":
163
+ if (!apiKey)
164
+ throw new Error("Gemini embedding provider requires an API key");
165
+ return createGeminiProvider({ apiKey, model, baseUrl });
166
+ case "voyage":
167
+ if (!apiKey)
168
+ throw new Error("Voyage embedding provider requires an API key");
169
+ return createVoyageProvider({ apiKey, model, baseUrl });
170
+ case "mistral":
171
+ if (!apiKey)
172
+ throw new Error("Mistral embedding provider requires an API key");
173
+ return createMistralProvider({ apiKey, model, baseUrl });
174
+ case "ollama":
175
+ return createOllamaProvider({ model, baseUrl });
176
+ default:
177
+ throw new Error(`Unknown embedding provider: ${provider}`);
178
+ }
179
+ }
180
+ //# sourceMappingURL=embeddings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../../src/memory/embeddings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { Stats } from "node:fs";
2
+ export type RegularFileStatResult = {
3
+ missing: true;
4
+ } | {
5
+ missing: false;
6
+ stat: Stats;
7
+ };
8
+ export declare function isFileMissingError(err: unknown): err is NodeJS.ErrnoException & {
9
+ code: "ENOENT";
10
+ };
11
+ export declare function statRegularFile(absPath: string): Promise<RegularFileStatResult>;
12
+ //# sourceMappingURL=fs-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-utils.d.ts","sourceRoot":"","sources":["../../src/memory/fs-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAGrC,MAAM,MAAM,qBAAqB,GAAG;IAAE,OAAO,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,KAAK,CAAA;CAAE,CAAC;AAExF,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,OAAO,GACX,GAAG,IAAI,MAAM,CAAC,cAAc,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAOnD;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAcrF"}
@@ -0,0 +1,24 @@
1
+ import fs from "node:fs/promises";
2
+ export function isFileMissingError(err) {
3
+ return Boolean(err &&
4
+ typeof err === "object" &&
5
+ "code" in err &&
6
+ err.code === "ENOENT");
7
+ }
8
+ export async function statRegularFile(absPath) {
9
+ let stat;
10
+ try {
11
+ stat = await fs.lstat(absPath);
12
+ }
13
+ catch (err) {
14
+ if (isFileMissingError(err)) {
15
+ return { missing: true };
16
+ }
17
+ throw err;
18
+ }
19
+ if (stat.isSymbolicLink() || !stat.isFile()) {
20
+ throw new Error("path required");
21
+ }
22
+ return { missing: false, stat };
23
+ }
24
+ //# sourceMappingURL=fs-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-utils.js","sourceRoot":"","sources":["../../src/memory/fs-utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAIlC,MAAM,UAAU,kBAAkB,CAChC,GAAY;IAEZ,OAAO,OAAO,CACZ,GAAG;QACH,OAAO,GAAG,KAAK,QAAQ;QACvB,MAAM,IAAI,GAAG;QACZ,GAAsC,CAAC,IAAI,KAAK,QAAQ,CAC1D,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAe;IACnD,IAAI,IAAW,CAAC;IAChB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,IAAI,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AAClC,CAAC"}
@@ -0,0 +1,46 @@
1
+ import { type MMRConfig, DEFAULT_MMR_CONFIG } from "./mmr.js";
2
+ import { type TemporalDecayConfig, DEFAULT_TEMPORAL_DECAY_CONFIG } from "./temporal-decay.js";
3
+ export type HybridSource = string;
4
+ export { type MMRConfig, DEFAULT_MMR_CONFIG };
5
+ export { type TemporalDecayConfig, DEFAULT_TEMPORAL_DECAY_CONFIG };
6
+ export type HybridVectorResult = {
7
+ id: string;
8
+ path: string;
9
+ startLine: number;
10
+ endLine: number;
11
+ source: HybridSource;
12
+ snippet: string;
13
+ vectorScore: number;
14
+ };
15
+ export type HybridKeywordResult = {
16
+ id: string;
17
+ path: string;
18
+ startLine: number;
19
+ endLine: number;
20
+ source: HybridSource;
21
+ snippet: string;
22
+ textScore: number;
23
+ };
24
+ export declare function buildFtsQuery(raw: string): string | null;
25
+ export declare function bm25RankToScore(rank: number): number;
26
+ export declare function mergeHybridResults(params: {
27
+ vector: HybridVectorResult[];
28
+ keyword: HybridKeywordResult[];
29
+ vectorWeight: number;
30
+ textWeight: number;
31
+ workspaceDir?: string;
32
+ /** MMR configuration for diversity-aware re-ranking */
33
+ mmr?: Partial<MMRConfig>;
34
+ /** Temporal decay configuration for recency-aware scoring */
35
+ temporalDecay?: Partial<TemporalDecayConfig>;
36
+ /** Test seam for deterministic time-dependent behavior */
37
+ nowMs?: number;
38
+ }): Promise<Array<{
39
+ path: string;
40
+ startLine: number;
41
+ endLine: number;
42
+ score: number;
43
+ snippet: string;
44
+ source: HybridSource;
45
+ }>>;
46
+ //# sourceMappingURL=hybrid.d.ts.map
@@ -0,0 +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,CAGpD;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"}
@@ -0,0 +1,81 @@
1
+ import { applyMMRToHybridResults, DEFAULT_MMR_CONFIG } from "./mmr.js";
2
+ import { applyTemporalDecayToHybridResults, DEFAULT_TEMPORAL_DECAY_CONFIG, } from "./temporal-decay.js";
3
+ export { DEFAULT_MMR_CONFIG };
4
+ export { DEFAULT_TEMPORAL_DECAY_CONFIG };
5
+ export function buildFtsQuery(raw) {
6
+ const tokens = raw
7
+ .match(/[\p{L}\p{N}_]+/gu)
8
+ ?.map((t) => t.trim())
9
+ .filter(Boolean) ?? [];
10
+ if (tokens.length === 0) {
11
+ return null;
12
+ }
13
+ const quoted = tokens.map((t) => `"${t.replaceAll('"', "")}"`);
14
+ return quoted.join(" AND ");
15
+ }
16
+ export function bm25RankToScore(rank) {
17
+ const normalized = Number.isFinite(rank) ? Math.max(0, rank) : 999;
18
+ return 1 / (1 + normalized);
19
+ }
20
+ export async function mergeHybridResults(params) {
21
+ const byId = new Map();
22
+ for (const r of params.vector) {
23
+ byId.set(r.id, {
24
+ id: r.id,
25
+ path: r.path,
26
+ startLine: r.startLine,
27
+ endLine: r.endLine,
28
+ source: r.source,
29
+ snippet: r.snippet,
30
+ vectorScore: r.vectorScore,
31
+ textScore: 0,
32
+ });
33
+ }
34
+ for (const r of params.keyword) {
35
+ const existing = byId.get(r.id);
36
+ if (existing) {
37
+ existing.textScore = r.textScore;
38
+ if (r.snippet && r.snippet.length > 0) {
39
+ existing.snippet = r.snippet;
40
+ }
41
+ }
42
+ else {
43
+ byId.set(r.id, {
44
+ id: r.id,
45
+ path: r.path,
46
+ startLine: r.startLine,
47
+ endLine: r.endLine,
48
+ source: r.source,
49
+ snippet: r.snippet,
50
+ vectorScore: 0,
51
+ textScore: r.textScore,
52
+ });
53
+ }
54
+ }
55
+ const merged = Array.from(byId.values()).map((entry) => {
56
+ const score = params.vectorWeight * entry.vectorScore + params.textWeight * entry.textScore;
57
+ return {
58
+ path: entry.path,
59
+ startLine: entry.startLine,
60
+ endLine: entry.endLine,
61
+ score,
62
+ snippet: entry.snippet,
63
+ source: entry.source,
64
+ };
65
+ });
66
+ const temporalDecayConfig = { ...DEFAULT_TEMPORAL_DECAY_CONFIG, ...params.temporalDecay };
67
+ const decayed = await applyTemporalDecayToHybridResults({
68
+ results: merged,
69
+ temporalDecay: temporalDecayConfig,
70
+ workspaceDir: params.workspaceDir,
71
+ nowMs: params.nowMs,
72
+ });
73
+ const sorted = decayed.toSorted((a, b) => b.score - a.score);
74
+ // Apply MMR re-ranking if enabled
75
+ const mmrConfig = { ...DEFAULT_MMR_CONFIG, ...params.mmr };
76
+ if (mmrConfig.enabled) {
77
+ return applyMMRToHybridResults(sorted, mmrConfig);
78
+ }
79
+ return sorted;
80
+ }
81
+ //# sourceMappingURL=hybrid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hybrid.js","sourceRoot":"","sources":["../../src/memory/hybrid.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export type { MemorySource, MemorySearchResult, MemorySearchManager, MemoryEmbeddingProbeResult, MemorySyncProgressUpdate, MemoryProviderStatus, } from "./types.js";
2
+ export type { EmbeddingProvider } from "./embeddings.js";
3
+ export { cosineSimilarity, chunkMarkdown, listMemoryFiles, hashText, buildFileEntry, isMemoryPath, parseEmbedding, type MemoryFileEntry, type MemoryChunk, } from "./internal.js";
4
+ export { searchVector, searchKeyword } from "./manager-search.js";
5
+ export { mergeHybridResults } from "./hybrid.js";
6
+ export { mmrRerank, applyMMRToHybridResults } from "./mmr.js";
7
+ export { applyTemporalDecayToHybridResults, applyTemporalDecayToScore, calculateTemporalDecayMultiplier, } from "./temporal-decay.js";
8
+ export { extractKeywords } from "./query-expansion.js";
9
+ export { buildFtsQuery, bm25RankToScore } from "./hybrid.js";
10
+ export { requireNodeSqlite } from "./sqlite.js";
11
+ export { createSimpleMemoryManager, type SimpleMemoryManager } from "./simple-manager.js";
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/memory/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACnB,0BAA0B,EAC1B,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAEpB,YAAY,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,QAAQ,EACR,cAAc,EACd,YAAY,EACZ,cAAc,EACd,KAAK,eAAe,EACpB,KAAK,WAAW,GACjB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAC9D,OAAO,EACL,iCAAiC,EACjC,yBAAyB,EACzB,gCAAgC,GACjC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAIhD,OAAO,EAAE,yBAAyB,EAAE,KAAK,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,12 @@
1
+ export { cosineSimilarity, chunkMarkdown, listMemoryFiles, hashText, buildFileEntry, isMemoryPath, parseEmbedding, } from "./internal.js";
2
+ export { searchVector, searchKeyword } from "./manager-search.js";
3
+ export { mergeHybridResults } from "./hybrid.js";
4
+ export { mmrRerank, applyMMRToHybridResults } from "./mmr.js";
5
+ export { applyTemporalDecayToHybridResults, applyTemporalDecayToScore, calculateTemporalDecayMultiplier, } from "./temporal-decay.js";
6
+ export { extractKeywords } from "./query-expansion.js";
7
+ export { buildFtsQuery, bm25RankToScore } from "./hybrid.js";
8
+ export { requireNodeSqlite } from "./sqlite.js";
9
+ // Simple memory store for consumers that want store/search/delete/list
10
+ // without the full OpenClaw MemoryIndexManager infrastructure.
11
+ export { createSimpleMemoryManager } from "./simple-manager.js";
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/memory/index.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,QAAQ,EACR,cAAc,EACd,YAAY,EACZ,cAAc,GAGf,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAC9D,OAAO,EACL,iCAAiC,EACjC,yBAAyB,EACzB,gCAAgC,GACjC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,uEAAuE;AACvE,+DAA+D;AAC/D,OAAO,EAAE,yBAAyB,EAA4B,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,39 @@
1
+ export type MemoryFileEntry = {
2
+ path: string;
3
+ absPath: string;
4
+ mtimeMs: number;
5
+ size: number;
6
+ hash: string;
7
+ };
8
+ export type MemoryChunk = {
9
+ startLine: number;
10
+ endLine: number;
11
+ text: string;
12
+ hash: string;
13
+ };
14
+ export declare function ensureDir(dir: string): string;
15
+ export declare function normalizeRelPath(value: string): string;
16
+ export declare function normalizeExtraMemoryPaths(workspaceDir: string, extraPaths?: string[]): string[];
17
+ export declare function isMemoryPath(relPath: string): boolean;
18
+ export declare function listMemoryFiles(workspaceDir: string, extraPaths?: string[]): Promise<string[]>;
19
+ export declare function hashText(value: string): string;
20
+ export declare function buildFileEntry(absPath: string, workspaceDir: string): Promise<MemoryFileEntry | null>;
21
+ export declare function chunkMarkdown(content: string, chunking: {
22
+ tokens: number;
23
+ overlap: number;
24
+ }): MemoryChunk[];
25
+ /**
26
+ * Remap chunk startLine/endLine from content-relative positions to original
27
+ * source file positions using a lineMap. Each entry in lineMap gives the
28
+ * 1-indexed source line for the corresponding 0-indexed content line.
29
+ *
30
+ * This is used for session JSONL files where buildSessionEntry() flattens
31
+ * messages into a plain-text string before chunking. Without remapping the
32
+ * stored line numbers would reference positions in the flattened text rather
33
+ * than the original JSONL file.
34
+ */
35
+ export declare function remapChunkLines(chunks: MemoryChunk[], lineMap: number[] | undefined): void;
36
+ export declare function parseEmbedding(raw: string): number[];
37
+ export declare function cosineSimilarity(a: number[], b: number[]): number;
38
+ export declare function runWithConcurrency<T>(tasks: Array<() => Promise<T>>, limit: number): Promise<T[]>;
39
+ //# sourceMappingURL=internal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../../src/memory/internal.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAK7C;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGtD;AAED,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAW/F;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CASrD;AAuBD,wBAAsB,eAAe,CACnC,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,MAAM,EAAE,GACpB,OAAO,CAAC,MAAM,EAAE,CAAC,CA+DnB;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CA2BjC;AAED,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC5C,WAAW,EAAE,CA8Ef;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,IAAI,CAS1F;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAOpD;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAmBjE;AAED,wBAAsB,kBAAkB,CAAC,CAAC,EACxC,KAAK,EAAE,KAAK,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,EAC9B,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,CAAC,EAAE,CAAC,CAUd"}