@alexandrgreen/anchorclaw 0.0.3

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 (247) hide show
  1. package/LICENSE +21 -0
  2. package/NOTICE +9 -0
  3. package/README.md +252 -0
  4. package/dist/api.d.ts +3 -0
  5. package/dist/api.d.ts.map +1 -0
  6. package/dist/api.js +3 -0
  7. package/dist/api.js.map +1 -0
  8. package/dist/config.d.ts +46 -0
  9. package/dist/config.d.ts.map +1 -0
  10. package/dist/config.js +309 -0
  11. package/dist/config.js.map +1 -0
  12. package/dist/config.test.d.ts +2 -0
  13. package/dist/config.test.d.ts.map +1 -0
  14. package/dist/config.test.js +100 -0
  15. package/dist/config.test.js.map +1 -0
  16. package/dist/identity-policy.d.ts +3 -0
  17. package/dist/identity-policy.d.ts.map +1 -0
  18. package/dist/identity-policy.js +7 -0
  19. package/dist/identity-policy.js.map +1 -0
  20. package/dist/identity-policy.test.d.ts +2 -0
  21. package/dist/identity-policy.test.d.ts.map +1 -0
  22. package/dist/identity-policy.test.js +23 -0
  23. package/dist/identity-policy.test.js.map +1 -0
  24. package/dist/identity.d.ts +22 -0
  25. package/dist/identity.d.ts.map +1 -0
  26. package/dist/identity.js +113 -0
  27. package/dist/identity.js.map +1 -0
  28. package/dist/identity.test.d.ts +2 -0
  29. package/dist/identity.test.d.ts.map +1 -0
  30. package/dist/identity.test.js +22 -0
  31. package/dist/identity.test.js.map +1 -0
  32. package/dist/importer.d.ts +12 -0
  33. package/dist/importer.d.ts.map +1 -0
  34. package/dist/importer.js +297 -0
  35. package/dist/importer.js.map +1 -0
  36. package/dist/index.d.ts +3 -0
  37. package/dist/index.d.ts.map +1 -0
  38. package/dist/index.js +92 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/index.test.d.ts +2 -0
  41. package/dist/index.test.d.ts.map +1 -0
  42. package/dist/index.test.js +770 -0
  43. package/dist/index.test.js.map +1 -0
  44. package/dist/memory/forget.d.ts +22 -0
  45. package/dist/memory/forget.d.ts.map +1 -0
  46. package/dist/memory/forget.js +84 -0
  47. package/dist/memory/forget.js.map +1 -0
  48. package/dist/memory/get.d.ts +36 -0
  49. package/dist/memory/get.d.ts.map +1 -0
  50. package/dist/memory/get.js +282 -0
  51. package/dist/memory/get.js.map +1 -0
  52. package/dist/memory/get.test.d.ts +2 -0
  53. package/dist/memory/get.test.d.ts.map +1 -0
  54. package/dist/memory/get.test.js +180 -0
  55. package/dist/memory/get.test.js.map +1 -0
  56. package/dist/memory/limits.d.ts +10 -0
  57. package/dist/memory/limits.d.ts.map +1 -0
  58. package/dist/memory/limits.js +18 -0
  59. package/dist/memory/limits.js.map +1 -0
  60. package/dist/memory/manager.d.ts +93 -0
  61. package/dist/memory/manager.d.ts.map +1 -0
  62. package/dist/memory/manager.js +344 -0
  63. package/dist/memory/manager.js.map +1 -0
  64. package/dist/memory/manager.test.d.ts +2 -0
  65. package/dist/memory/manager.test.d.ts.map +1 -0
  66. package/dist/memory/manager.test.js +201 -0
  67. package/dist/memory/manager.test.js.map +1 -0
  68. package/dist/memory/paths.d.ts +12 -0
  69. package/dist/memory/paths.d.ts.map +1 -0
  70. package/dist/memory/paths.js +31 -0
  71. package/dist/memory/paths.js.map +1 -0
  72. package/dist/memory/paths.test.d.ts +2 -0
  73. package/dist/memory/paths.test.d.ts.map +1 -0
  74. package/dist/memory/paths.test.js +35 -0
  75. package/dist/memory/paths.test.js.map +1 -0
  76. package/dist/memory/prompt.d.ts +37 -0
  77. package/dist/memory/prompt.d.ts.map +1 -0
  78. package/dist/memory/prompt.js +152 -0
  79. package/dist/memory/prompt.js.map +1 -0
  80. package/dist/memory/prompt.test.d.ts +2 -0
  81. package/dist/memory/prompt.test.d.ts.map +1 -0
  82. package/dist/memory/prompt.test.js +47 -0
  83. package/dist/memory/prompt.test.js.map +1 -0
  84. package/dist/memory/read-file-shared.d.ts +17 -0
  85. package/dist/memory/read-file-shared.d.ts.map +1 -0
  86. package/dist/memory/read-file-shared.js +53 -0
  87. package/dist/memory/read-file-shared.js.map +1 -0
  88. package/dist/memory/read-file-shared.test.d.ts +2 -0
  89. package/dist/memory/read-file-shared.test.d.ts.map +1 -0
  90. package/dist/memory/read-file-shared.test.js +82 -0
  91. package/dist/memory/read-file-shared.test.js.map +1 -0
  92. package/dist/memory/recall.d.ts +22 -0
  93. package/dist/memory/recall.d.ts.map +1 -0
  94. package/dist/memory/recall.js +58 -0
  95. package/dist/memory/recall.js.map +1 -0
  96. package/dist/memory/search.d.ts +30 -0
  97. package/dist/memory/search.d.ts.map +1 -0
  98. package/dist/memory/search.js +110 -0
  99. package/dist/memory/search.js.map +1 -0
  100. package/dist/memory/search.test.d.ts +2 -0
  101. package/dist/memory/search.test.d.ts.map +1 -0
  102. package/dist/memory/search.test.js +103 -0
  103. package/dist/memory/search.test.js.map +1 -0
  104. package/dist/memory/sessions-index-sync.d.ts +28 -0
  105. package/dist/memory/sessions-index-sync.d.ts.map +1 -0
  106. package/dist/memory/sessions-index-sync.js +253 -0
  107. package/dist/memory/sessions-index-sync.js.map +1 -0
  108. package/dist/memory/sessions-index-sync.test.d.ts +2 -0
  109. package/dist/memory/sessions-index-sync.test.d.ts.map +1 -0
  110. package/dist/memory/sessions-index-sync.test.js +280 -0
  111. package/dist/memory/sessions-index-sync.test.js.map +1 -0
  112. package/dist/memory/sessions-index.d.ts +30 -0
  113. package/dist/memory/sessions-index.d.ts.map +1 -0
  114. package/dist/memory/sessions-index.js +238 -0
  115. package/dist/memory/sessions-index.js.map +1 -0
  116. package/dist/memory/sessions-index.test.d.ts +2 -0
  117. package/dist/memory/sessions-index.test.d.ts.map +1 -0
  118. package/dist/memory/sessions-index.test.js +266 -0
  119. package/dist/memory/sessions-index.test.js.map +1 -0
  120. package/dist/memory/sessions-visibility.d.ts +18 -0
  121. package/dist/memory/sessions-visibility.d.ts.map +1 -0
  122. package/dist/memory/sessions-visibility.js +110 -0
  123. package/dist/memory/sessions-visibility.js.map +1 -0
  124. package/dist/memory/sessions-visibility.test.d.ts +2 -0
  125. package/dist/memory/sessions-visibility.test.d.ts.map +1 -0
  126. package/dist/memory/sessions-visibility.test.js +137 -0
  127. package/dist/memory/sessions-visibility.test.js.map +1 -0
  128. package/dist/memory/sessions.d.ts +26 -0
  129. package/dist/memory/sessions.d.ts.map +1 -0
  130. package/dist/memory/sessions.js +250 -0
  131. package/dist/memory/sessions.js.map +1 -0
  132. package/dist/memory/sessions.test.d.ts +2 -0
  133. package/dist/memory/sessions.test.d.ts.map +1 -0
  134. package/dist/memory/sessions.test.js +257 -0
  135. package/dist/memory/sessions.test.js.map +1 -0
  136. package/dist/memory/store.d.ts +25 -0
  137. package/dist/memory/store.d.ts.map +1 -0
  138. package/dist/memory/store.js +176 -0
  139. package/dist/memory/store.js.map +1 -0
  140. package/dist/migrations-fs.d.ts +5 -0
  141. package/dist/migrations-fs.d.ts.map +1 -0
  142. package/dist/migrations-fs.js +19 -0
  143. package/dist/migrations-fs.js.map +1 -0
  144. package/dist/migrations.d.ts +17 -0
  145. package/dist/migrations.d.ts.map +1 -0
  146. package/dist/migrations.js +44 -0
  147. package/dist/migrations.js.map +1 -0
  148. package/dist/migrations.test.d.ts +2 -0
  149. package/dist/migrations.test.d.ts.map +1 -0
  150. package/dist/migrations.test.js +66 -0
  151. package/dist/migrations.test.js.map +1 -0
  152. package/dist/plugin/capability.d.ts +7 -0
  153. package/dist/plugin/capability.d.ts.map +1 -0
  154. package/dist/plugin/capability.js +92 -0
  155. package/dist/plugin/capability.js.map +1 -0
  156. package/dist/plugin/capability.test.d.ts +2 -0
  157. package/dist/plugin/capability.test.d.ts.map +1 -0
  158. package/dist/plugin/capability.test.js +75 -0
  159. package/dist/plugin/capability.test.js.map +1 -0
  160. package/dist/plugin/lifecycle.d.ts +6 -0
  161. package/dist/plugin/lifecycle.d.ts.map +1 -0
  162. package/dist/plugin/lifecycle.js +31 -0
  163. package/dist/plugin/lifecycle.js.map +1 -0
  164. package/dist/plugin/prompt-cache.d.ts +10 -0
  165. package/dist/plugin/prompt-cache.d.ts.map +1 -0
  166. package/dist/plugin/prompt-cache.js +58 -0
  167. package/dist/plugin/prompt-cache.js.map +1 -0
  168. package/dist/plugin/runtime-context.d.ts +27 -0
  169. package/dist/plugin/runtime-context.d.ts.map +1 -0
  170. package/dist/plugin/runtime-context.js +91 -0
  171. package/dist/plugin/runtime-context.js.map +1 -0
  172. package/dist/plugin/runtime-helpers.d.ts +3 -0
  173. package/dist/plugin/runtime-helpers.d.ts.map +1 -0
  174. package/dist/plugin/runtime-helpers.js +12 -0
  175. package/dist/plugin/runtime-helpers.js.map +1 -0
  176. package/dist/plugin/session-delta-helpers.d.ts +11 -0
  177. package/dist/plugin/session-delta-helpers.d.ts.map +1 -0
  178. package/dist/plugin/session-delta-helpers.js +62 -0
  179. package/dist/plugin/session-delta-helpers.js.map +1 -0
  180. package/dist/plugin/session-delta.d.ts +12 -0
  181. package/dist/plugin/session-delta.d.ts.map +1 -0
  182. package/dist/plugin/session-delta.js +307 -0
  183. package/dist/plugin/session-delta.js.map +1 -0
  184. package/dist/plugin/tools/common.d.ts +7 -0
  185. package/dist/plugin/tools/common.d.ts.map +1 -0
  186. package/dist/plugin/tools/common.js +2 -0
  187. package/dist/plugin/tools/common.js.map +1 -0
  188. package/dist/plugin/tools/index.d.ts +3 -0
  189. package/dist/plugin/tools/index.d.ts.map +1 -0
  190. package/dist/plugin/tools/index.js +16 -0
  191. package/dist/plugin/tools/index.js.map +1 -0
  192. package/dist/plugin/tools/memory-forget.d.ts +3 -0
  193. package/dist/plugin/tools/memory-forget.d.ts.map +1 -0
  194. package/dist/plugin/tools/memory-forget.js +80 -0
  195. package/dist/plugin/tools/memory-forget.js.map +1 -0
  196. package/dist/plugin/tools/memory-forget.test.d.ts +2 -0
  197. package/dist/plugin/tools/memory-forget.test.d.ts.map +1 -0
  198. package/dist/plugin/tools/memory-forget.test.js +58 -0
  199. package/dist/plugin/tools/memory-forget.test.js.map +1 -0
  200. package/dist/plugin/tools/memory-get.d.ts +3 -0
  201. package/dist/plugin/tools/memory-get.d.ts.map +1 -0
  202. package/dist/plugin/tools/memory-get.js +136 -0
  203. package/dist/plugin/tools/memory-get.js.map +1 -0
  204. package/dist/plugin/tools/memory-recall.d.ts +3 -0
  205. package/dist/plugin/tools/memory-recall.d.ts.map +1 -0
  206. package/dist/plugin/tools/memory-recall.js +176 -0
  207. package/dist/plugin/tools/memory-recall.js.map +1 -0
  208. package/dist/plugin/tools/memory-recall.test.d.ts +2 -0
  209. package/dist/plugin/tools/memory-recall.test.d.ts.map +1 -0
  210. package/dist/plugin/tools/memory-recall.test.js +169 -0
  211. package/dist/plugin/tools/memory-recall.test.js.map +1 -0
  212. package/dist/plugin/tools/memory-search.d.ts +3 -0
  213. package/dist/plugin/tools/memory-search.d.ts.map +1 -0
  214. package/dist/plugin/tools/memory-search.js +332 -0
  215. package/dist/plugin/tools/memory-search.js.map +1 -0
  216. package/dist/plugin/tools/memory-search.test.d.ts +2 -0
  217. package/dist/plugin/tools/memory-search.test.d.ts.map +1 -0
  218. package/dist/plugin/tools/memory-search.test.js +205 -0
  219. package/dist/plugin/tools/memory-search.test.js.map +1 -0
  220. package/dist/plugin/tools/memory-status.d.ts +3 -0
  221. package/dist/plugin/tools/memory-status.d.ts.map +1 -0
  222. package/dist/plugin/tools/memory-status.js +134 -0
  223. package/dist/plugin/tools/memory-status.js.map +1 -0
  224. package/dist/plugin/tools/memory-store.d.ts +3 -0
  225. package/dist/plugin/tools/memory-store.d.ts.map +1 -0
  226. package/dist/plugin/tools/memory-store.js +88 -0
  227. package/dist/plugin/tools/memory-store.js.map +1 -0
  228. package/dist/plugin/tools/memory-store.test.d.ts +2 -0
  229. package/dist/plugin/tools/memory-store.test.d.ts.map +1 -0
  230. package/dist/plugin/tools/memory-store.test.js +64 -0
  231. package/dist/plugin/tools/memory-store.test.js.map +1 -0
  232. package/dist/plugin/tools/memory-visible-output.d.ts +20 -0
  233. package/dist/plugin/tools/memory-visible-output.d.ts.map +1 -0
  234. package/dist/plugin/tools/memory-visible-output.js +61 -0
  235. package/dist/plugin/tools/memory-visible-output.js.map +1 -0
  236. package/dist/plugin/types.d.ts +61 -0
  237. package/dist/plugin/types.d.ts.map +1 -0
  238. package/dist/plugin/types.js +2 -0
  239. package/dist/plugin/types.js.map +1 -0
  240. package/dist/postgres.d.ts +7 -0
  241. package/dist/postgres.d.ts.map +1 -0
  242. package/dist/postgres.js +55 -0
  243. package/dist/postgres.js.map +1 -0
  244. package/migrations/0001_init.sql +228 -0
  245. package/migrations/0002_session_index.sql +71 -0
  246. package/openclaw.plugin.json +314 -0
  247. package/package.json +63 -0
@@ -0,0 +1,180 @@
1
+ import { beforeEach, describe, expect, it, vi } from "vitest";
2
+ import { memoryGetFromDb } from "./get.js";
3
+ vi.mock("./sessions.js", () => ({
4
+ memoryGetSessionFile: vi.fn(),
5
+ }));
6
+ vi.mock("./sessions-index-sync.js", () => ({
7
+ syncSessionsIndexDb: vi.fn(async () => undefined),
8
+ }));
9
+ import { memoryGetSessionFile } from "./sessions.js";
10
+ import { syncSessionsIndexDb } from "./sessions-index-sync.js";
11
+ const limits = {
12
+ maxResults: 10,
13
+ getMaxChars: 12_000,
14
+ getDefaultLines: 120,
15
+ sessionsMaxFileBytes: 2_000_000,
16
+ sessionsWrapChars: 800,
17
+ };
18
+ function createPool(rowsByCall) {
19
+ const query = vi.fn(async () => ({ rows: rowsByCall.shift() ?? [] }));
20
+ return { query };
21
+ }
22
+ beforeEach(() => {
23
+ vi.clearAllMocks();
24
+ });
25
+ describe("memoryGetFromDb sessions visibility", () => {
26
+ it("rejects other-agent sessions lookup in current visibility", async () => {
27
+ const pool = createPool([]);
28
+ const got = await memoryGetFromDb({
29
+ pool,
30
+ userId: "u1",
31
+ workspaceId: "w1",
32
+ agentId: "main",
33
+ sessionsVisibility: "current",
34
+ limits,
35
+ lookup: "sessions/other/s1.jsonl",
36
+ });
37
+ expect(got.ok).toBe(false);
38
+ if (got.ok) {
39
+ throw new Error("expected failed result");
40
+ }
41
+ expect(got.error).toContain("restricted to current agent scope");
42
+ expect(pool.query).not.toHaveBeenCalled();
43
+ });
44
+ it("rejects other-agent sessions lookup in current visibility when runtime agentId is missing", async () => {
45
+ const pool = createPool([]);
46
+ const got = await memoryGetFromDb({
47
+ pool,
48
+ userId: "u1",
49
+ workspaceId: "w1",
50
+ sessionsVisibility: "current",
51
+ limits,
52
+ lookup: "sessions/other/s1.jsonl",
53
+ });
54
+ expect(got.ok).toBe(false);
55
+ if (got.ok) {
56
+ throw new Error("expected failed result");
57
+ }
58
+ expect(got.error).toContain("restricted to current agent scope");
59
+ expect(pool.query).not.toHaveBeenCalled();
60
+ });
61
+ it("allows other-agent lookup in visible visibility and can fallback to file", async () => {
62
+ const pool = createPool([[], []]);
63
+ vi.mocked(memoryGetSessionFile).mockResolvedValueOnce({
64
+ text: "User: hi",
65
+ path: "sessions/other/s1.jsonl",
66
+ from: 1,
67
+ lines: 1,
68
+ });
69
+ const got = await memoryGetFromDb({
70
+ pool,
71
+ userId: "u1",
72
+ workspaceId: "w1",
73
+ agentId: "main",
74
+ sessionsVisibility: "visible",
75
+ limits,
76
+ lookup: "sessions/other/s1.jsonl",
77
+ });
78
+ expect(got.ok).toBe(true);
79
+ if (!got.ok) {
80
+ throw new Error("expected successful result");
81
+ }
82
+ expect(got.path).toBe("sessions/other/s1.jsonl");
83
+ expect(got.content).toContain("User: hi");
84
+ });
85
+ it("reads indexed sessions content for current agent", async () => {
86
+ const pool = createPool([
87
+ [{ id: "f1" }],
88
+ [
89
+ { text: "User: hello", start_line: 3 },
90
+ { text: "Assistant: hi", start_line: 7 },
91
+ ],
92
+ ]);
93
+ const got = await memoryGetFromDb({
94
+ pool,
95
+ userId: "u1",
96
+ workspaceId: "w1",
97
+ agentId: "main",
98
+ sessionsVisibility: "current",
99
+ limits,
100
+ lookup: "sessions/main/s1.jsonl",
101
+ });
102
+ expect(got.ok).toBe(true);
103
+ if (!got.ok) {
104
+ throw new Error("expected successful result");
105
+ }
106
+ expect(got.path).toBe("sessions/main/s1.jsonl");
107
+ expect(got.content).toContain("User: hello");
108
+ expect(got.content).toContain("Assistant: hi");
109
+ });
110
+ it("applies upstream agent normalization for current-visibility sessions scope", async () => {
111
+ const pool = createPool([
112
+ [{ id: "f1" }],
113
+ [{ text: "User: hello", start_line: 2 }],
114
+ ]);
115
+ const got = await memoryGetFromDb({
116
+ pool,
117
+ userId: "u1",
118
+ workspaceId: "w1",
119
+ agentId: "Team.Alpha",
120
+ sessionsVisibility: "current",
121
+ limits,
122
+ lookup: "sessions/team-alpha/s1.jsonl",
123
+ });
124
+ expect(got.ok).toBe(true);
125
+ if (!got.ok) {
126
+ throw new Error("expected successful result");
127
+ }
128
+ expect(got.path).toBe("sessions/team-alpha/s1.jsonl");
129
+ expect(got.content).toContain("User: hello");
130
+ });
131
+ it("returns index_corrupt error when file row exists but indexed read is missing", async () => {
132
+ const pool = createPool([[], [{ id: "indexed-row" }]]);
133
+ const got = await memoryGetFromDb({
134
+ pool,
135
+ userId: "u1",
136
+ workspaceId: "w1",
137
+ agentId: "main",
138
+ sessionsVisibility: "current",
139
+ limits,
140
+ lookup: "sessions/main/s1.jsonl",
141
+ });
142
+ expect(got.ok).toBe(false);
143
+ if (got.ok) {
144
+ throw new Error("expected failed result");
145
+ }
146
+ expect(got.error).toContain("index corrupted");
147
+ expect(vi.mocked(memoryGetSessionFile)).not.toHaveBeenCalled();
148
+ });
149
+ it("on index_miss uses file fallback and enqueues targeted reindex", async () => {
150
+ const pool = createPool([[], []]);
151
+ vi.mocked(memoryGetSessionFile).mockResolvedValueOnce({
152
+ text: "User: fallback",
153
+ path: "sessions/main/s1.jsonl",
154
+ from: 1,
155
+ lines: 1,
156
+ });
157
+ const got = await memoryGetFromDb({
158
+ pool,
159
+ userId: "u1",
160
+ workspaceId: "w1",
161
+ agentId: "main",
162
+ sessionsVisibility: "current",
163
+ limits,
164
+ lookup: "sessions/main/s1.jsonl",
165
+ });
166
+ expect(got.ok).toBe(true);
167
+ if (!got.ok) {
168
+ throw new Error("expected successful result");
169
+ }
170
+ expect(got.content).toContain("fallback");
171
+ expect(vi.mocked(syncSessionsIndexDb)).toHaveBeenCalledTimes(1);
172
+ expect(vi.mocked(syncSessionsIndexDb)).toHaveBeenCalledWith(expect.objectContaining({
173
+ userId: "u1",
174
+ workspaceId: "w1",
175
+ agentId: "main",
176
+ sessionFiles: ["sessions/main/s1.jsonl"],
177
+ }));
178
+ });
179
+ });
180
+ //# sourceMappingURL=get.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get.test.js","sourceRoot":"","sources":["../../src/memory/get.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { AnchorClawConfig } from "../config.js";
2
+ export type MemoryLimits = {
3
+ maxResults: number;
4
+ getMaxChars: number;
5
+ getDefaultLines: number;
6
+ sessionsMaxFileBytes: number;
7
+ sessionsWrapChars: number;
8
+ };
9
+ export declare function resolveMemoryLimits(cfg: AnchorClawConfig): MemoryLimits;
10
+ //# sourceMappingURL=limits.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"limits.d.ts","sourceRoot":"","sources":["../../src/memory/limits.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAErD,MAAM,MAAM,YAAY,GAAG;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,iBAAiB,EAAE,MAAM,CAAC;CAC3B,CAAC;AAUF,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,gBAAgB,GAAG,YAAY,CASvE"}
@@ -0,0 +1,18 @@
1
+ const DEFAULT_LIMITS = {
2
+ maxResults: 10,
3
+ getMaxChars: 12_000,
4
+ getDefaultLines: 120,
5
+ sessionsMaxFileBytes: 2_000_000,
6
+ sessionsWrapChars: 800,
7
+ };
8
+ export function resolveMemoryLimits(cfg) {
9
+ const overrides = cfg.limits;
10
+ return {
11
+ maxResults: overrides?.maxResults ?? DEFAULT_LIMITS.maxResults,
12
+ getMaxChars: overrides?.getMaxChars ?? DEFAULT_LIMITS.getMaxChars,
13
+ getDefaultLines: overrides?.getDefaultLines ?? DEFAULT_LIMITS.getDefaultLines,
14
+ sessionsMaxFileBytes: DEFAULT_LIMITS.sessionsMaxFileBytes,
15
+ sessionsWrapChars: DEFAULT_LIMITS.sessionsWrapChars,
16
+ };
17
+ }
18
+ //# sourceMappingURL=limits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"limits.js","sourceRoot":"","sources":["../../src/memory/limits.ts"],"names":[],"mappings":"AAUA,MAAM,cAAc,GAAiB;IACnC,UAAU,EAAE,EAAE;IACd,WAAW,EAAE,MAAM;IACnB,eAAe,EAAE,GAAG;IACpB,oBAAoB,EAAE,SAAS;IAC/B,iBAAiB,EAAE,GAAG;CACvB,CAAC;AAEF,MAAM,UAAU,mBAAmB,CAAC,GAAqB;IACvD,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC;IAC7B,OAAO;QACL,UAAU,EAAE,SAAS,EAAE,UAAU,IAAI,cAAc,CAAC,UAAU;QAC9D,WAAW,EAAE,SAAS,EAAE,WAAW,IAAI,cAAc,CAAC,WAAW;QACjE,eAAe,EAAE,SAAS,EAAE,eAAe,IAAI,cAAc,CAAC,eAAe;QAC7E,oBAAoB,EAAE,cAAc,CAAC,oBAAoB;QACzD,iBAAiB,EAAE,cAAc,CAAC,iBAAiB;KACpD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,93 @@
1
+ import type { OpenClawPluginApi } from "../api.js";
2
+ import type { AnchorClawConfig } from "../config.js";
3
+ import type { PostgresPool } from "../postgres.js";
4
+ type MemorySource = "memory" | "sessions";
5
+ type MemorySearchResult = {
6
+ path: string;
7
+ startLine: number;
8
+ endLine: number;
9
+ score: number;
10
+ snippet: string;
11
+ source: MemorySource;
12
+ citation?: string;
13
+ };
14
+ type MemoryReadResult = {
15
+ text: string;
16
+ path: string;
17
+ truncated?: boolean;
18
+ from?: number;
19
+ lines?: number;
20
+ nextFrom?: number;
21
+ };
22
+ type MemoryProviderStatus = {
23
+ backend: "builtin" | "qmd";
24
+ provider: string;
25
+ model?: string;
26
+ dirty?: boolean;
27
+ workspaceDir?: string;
28
+ sources?: MemorySource[];
29
+ sourceCounts?: Array<{
30
+ source: MemorySource;
31
+ files: number;
32
+ chunks: number;
33
+ }>;
34
+ custom?: Record<string, unknown>;
35
+ };
36
+ type MemoryEmbeddingProbeResult = {
37
+ ok: boolean;
38
+ error?: string;
39
+ checked?: boolean;
40
+ cached?: boolean;
41
+ checkedAtMs?: number;
42
+ cacheExpiresAtMs?: number;
43
+ };
44
+ type MemorySearchRuntimeDebug = {
45
+ backend: "builtin" | "qmd";
46
+ configuredMode?: string;
47
+ effectiveMode?: string;
48
+ fallback?: string;
49
+ };
50
+ type MemorySyncProgressUpdate = {
51
+ completed: number;
52
+ total: number;
53
+ label?: string;
54
+ };
55
+ export type MemorySearchManager = {
56
+ search: (query: string, opts?: {
57
+ maxResults?: number;
58
+ minScore?: number;
59
+ sessionKey?: string;
60
+ qmdSearchModeOverride?: "query" | "search" | "vsearch";
61
+ onDebug?: (debug: MemorySearchRuntimeDebug) => void;
62
+ sources?: MemorySource[];
63
+ }) => Promise<MemorySearchResult[]>;
64
+ readFile: (params: {
65
+ relPath: string;
66
+ from?: number;
67
+ lines?: number;
68
+ }) => Promise<MemoryReadResult>;
69
+ status: () => MemoryProviderStatus;
70
+ sync?: (params?: {
71
+ reason?: string;
72
+ force?: boolean;
73
+ sessionFiles?: string[];
74
+ progress?: (update: MemorySyncProgressUpdate) => void;
75
+ }) => Promise<void>;
76
+ getCachedEmbeddingAvailability?: () => MemoryEmbeddingProbeResult | null;
77
+ probeEmbeddingAvailability: () => Promise<MemoryEmbeddingProbeResult>;
78
+ probeVectorStoreAvailability?: () => Promise<boolean>;
79
+ probeVectorAvailability: () => Promise<boolean>;
80
+ close?: () => Promise<void>;
81
+ };
82
+ export type AnchorClawMemorySearchManagerOptions = {
83
+ api: OpenClawPluginApi;
84
+ cfg: AnchorClawConfig;
85
+ ensureReady: () => Promise<void>;
86
+ ensureSessionsIndexBootstrapped?: () => Promise<void>;
87
+ getPool: () => PostgresPool;
88
+ agentId: string;
89
+ purpose?: "default" | "status" | "cli";
90
+ };
91
+ export declare function createAnchorClawMemorySearchManager(params: AnchorClawMemorySearchManagerOptions): MemorySearchManager;
92
+ export {};
93
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/memory/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,344 @@
1
+ import { resolveUserAndWorkspaceScope } from "../identity.js";
2
+ import { resolveMemoryLimits } from "./limits.js";
3
+ import { memoryGetFromDb } from "./get.js";
4
+ import { memorySearchDb } from "./search.js";
5
+ import { memorySearchSessions } from "./sessions.js";
6
+ import { listKnownAgentIds } from "./sessions.js";
7
+ import { hasSessionsIndexRows, memorySearchSessionsIndexDb, } from "./sessions-index.js";
8
+ import { syncSessionsIndexDb, syncVisibleSessionsIndexDb } from "./sessions-index-sync.js";
9
+ import { canAccessSessionPathByVisibility, filterSessionHitsByVisibility } from "./sessions-visibility.js";
10
+ import { buildMemoryReadResult } from "./read-file-shared.js";
11
+ import fs from "node:fs/promises";
12
+ import path from "node:path";
13
+ function stableScoreSort(left, right) {
14
+ if (right.score !== left.score) {
15
+ return right.score - left.score;
16
+ }
17
+ // Prefer durable memory over sessions when equal.
18
+ if (left.source !== right.source) {
19
+ return left.source === "memory" ? -1 : 1;
20
+ }
21
+ return left.path.localeCompare(right.path);
22
+ }
23
+ function mapHitToManagerResult(hit) {
24
+ const source = hit.corpus === "sessions" ? "sessions" : "memory";
25
+ const startLine = typeof hit.startLine === "number" && Number.isFinite(hit.startLine) && hit.startLine > 0 ? Math.floor(hit.startLine) : 1;
26
+ const endLine = typeof hit.endLine === "number" && Number.isFinite(hit.endLine) && hit.endLine >= startLine
27
+ ? Math.floor(hit.endLine)
28
+ : startLine;
29
+ return {
30
+ path: hit.path,
31
+ startLine,
32
+ endLine,
33
+ score: hit.score,
34
+ snippet: hit.snippet,
35
+ source,
36
+ ...(typeof hit.citation === "string" && hit.citation.trim() ? { citation: hit.citation } : {}),
37
+ };
38
+ }
39
+ export function createAnchorClawMemorySearchManager(params) {
40
+ const { api, cfg } = params;
41
+ const sessionsVisibility = cfg.sessions?.visibility ?? "current";
42
+ const sessionsEnabled = sessionsVisibility !== "off";
43
+ const resolveWorkspaceDir = () => {
44
+ const candidate = api?.runtime?.workspaceDir;
45
+ if (typeof candidate === "string" && candidate.trim()) {
46
+ return path.resolve(candidate);
47
+ }
48
+ return path.resolve(process.cwd());
49
+ };
50
+ const resolveWorkspaceRelativePath = (relPath) => {
51
+ const trimmed = relPath.trim().replaceAll("\\", "/");
52
+ if (!trimmed) {
53
+ return null;
54
+ }
55
+ if (trimmed.startsWith("/") || trimmed.includes("..")) {
56
+ return null;
57
+ }
58
+ if (trimmed === "MEMORY.md") {
59
+ return trimmed;
60
+ }
61
+ if (trimmed.startsWith("memory/")) {
62
+ return trimmed;
63
+ }
64
+ return null;
65
+ };
66
+ const listVisibleAgentIds = async () => {
67
+ const currentAgentId = params.agentId;
68
+ const agentIds = await listKnownAgentIds();
69
+ return [currentAgentId, ...agentIds.filter((agentId) => agentId !== currentAgentId)];
70
+ };
71
+ return {
72
+ async search(query, opts) {
73
+ const q = query.trim();
74
+ if (!q) {
75
+ return [];
76
+ }
77
+ await params.ensureReady();
78
+ const scope = await resolveUserAndWorkspaceScope({
79
+ api,
80
+ pool: params.getPool(),
81
+ agentId: params.agentId,
82
+ sessionKey: opts?.sessionKey ?? api?.runtime?.sessionKey,
83
+ configuredExternalId: cfg.identity?.externalId,
84
+ });
85
+ const limits = resolveMemoryLimits(cfg);
86
+ const requestedSources = Array.isArray(opts?.sources) && opts.sources.length > 0 ? opts.sources : ["memory", "sessions"];
87
+ const effectiveSources = sessionsEnabled
88
+ ? requestedSources
89
+ : requestedSources.filter((source) => source !== "sessions");
90
+ const maxResults = typeof opts?.maxResults === "number" && Number.isFinite(opts.maxResults) ? Math.floor(opts.maxResults) : limits.maxResults;
91
+ const results = [];
92
+ if (effectiveSources.includes("memory")) {
93
+ const hits = await memorySearchDb({
94
+ pool: params.getPool(),
95
+ userId: scope.userId,
96
+ workspaceId: scope.workspaceId,
97
+ limits,
98
+ query: q,
99
+ maxResults,
100
+ });
101
+ results.push(...hits.map(mapHitToManagerResult));
102
+ }
103
+ if (effectiveSources.includes("sessions")) {
104
+ if (typeof params.ensureSessionsIndexBootstrapped === "function") {
105
+ await params.ensureSessionsIndexBootstrapped();
106
+ }
107
+ const indexedSessionHits = await memorySearchSessionsIndexDb({
108
+ pool: params.getPool(),
109
+ userId: scope.userId,
110
+ workspaceId: scope.workspaceId,
111
+ limits,
112
+ query: q,
113
+ maxResults,
114
+ ...(sessionsVisibility === "current" ? { currentAgentId: params.agentId } : {}),
115
+ });
116
+ let sessionHits = indexedSessionHits;
117
+ if (sessionHits.length === 0) {
118
+ const hasIndex = await hasSessionsIndexRows({
119
+ pool: params.getPool(),
120
+ userId: scope.userId,
121
+ workspaceId: scope.workspaceId,
122
+ ...(sessionsVisibility === "current" ? { currentAgentId: params.agentId } : {}),
123
+ });
124
+ if (!hasIndex) {
125
+ sessionHits = await memorySearchSessions({
126
+ query: q,
127
+ maxResults,
128
+ agentId: params.agentId,
129
+ limits,
130
+ });
131
+ }
132
+ }
133
+ const mappedSessionHits = sessionHits.map(mapHitToManagerResult);
134
+ const filteredSessionHits = await filterSessionHitsByVisibility({
135
+ api,
136
+ hits: mappedSessionHits,
137
+ });
138
+ results.push(...filteredSessionHits);
139
+ }
140
+ // No semantic/vector layer yet.
141
+ if (typeof opts?.onDebug === "function") {
142
+ opts.onDebug({ backend: "builtin", configuredMode: "postgres", effectiveMode: "postgres" });
143
+ }
144
+ // Filter by minScore if provided (mostly relevant for vector search; keep behavior consistent).
145
+ const minScore = typeof opts?.minScore === "number" && Number.isFinite(opts.minScore) ? opts.minScore : undefined;
146
+ const filtered = minScore !== undefined ? results.filter((item) => item.score >= minScore) : results;
147
+ return filtered.slice().sort(stableScoreSort).slice(0, maxResults);
148
+ },
149
+ async readFile(readParams) {
150
+ await params.ensureReady();
151
+ const relPath = readParams.relPath.trim();
152
+ const scope = await resolveUserAndWorkspaceScope({
153
+ api,
154
+ pool: params.getPool(),
155
+ agentId: params.agentId,
156
+ sessionKey: api?.runtime?.sessionKey,
157
+ configuredExternalId: cfg.identity?.externalId,
158
+ });
159
+ const limits = resolveMemoryLimits(cfg);
160
+ const fromLine = readParams.from ?? 1;
161
+ const lineCount = readParams.lines ?? limits.getDefaultLines;
162
+ if (relPath.startsWith("sessions/")) {
163
+ if (!sessionsEnabled) {
164
+ return { text: "", path: readParams.relPath };
165
+ }
166
+ const verdict = await canAccessSessionPathByVisibility({
167
+ api,
168
+ path: relPath,
169
+ });
170
+ if (!verdict.allowed) {
171
+ return { text: "", path: readParams.relPath };
172
+ }
173
+ const got = await memoryGetFromDb({
174
+ pool: params.getPool(),
175
+ userId: scope.userId,
176
+ workspaceId: scope.workspaceId,
177
+ agentId: params.agentId,
178
+ sessionsVisibility,
179
+ limits,
180
+ lookup: relPath,
181
+ fromLine,
182
+ lineCount,
183
+ });
184
+ if (!got.ok) {
185
+ return { text: "", path: readParams.relPath };
186
+ }
187
+ return {
188
+ text: got.content,
189
+ path: got.path,
190
+ from: got.fromLine,
191
+ lines: got.lineCount,
192
+ };
193
+ }
194
+ if (relPath === "MEMORY.md") {
195
+ const got = await memoryGetFromDb({
196
+ pool: params.getPool(),
197
+ userId: scope.userId,
198
+ workspaceId: scope.workspaceId,
199
+ agentId: params.agentId,
200
+ sessionsVisibility,
201
+ limits,
202
+ lookup: "db-memory/export/MEMORY.md",
203
+ fromLine,
204
+ lineCount,
205
+ });
206
+ if (!got.ok) {
207
+ return { text: "", path: relPath };
208
+ }
209
+ return {
210
+ text: got.content,
211
+ path: relPath,
212
+ from: got.fromLine,
213
+ lines: got.lineCount,
214
+ };
215
+ }
216
+ const workspaceRelative = resolveWorkspaceRelativePath(relPath);
217
+ if (workspaceRelative) {
218
+ const workspaceDir = resolveWorkspaceDir();
219
+ const absPath = path.resolve(workspaceDir, workspaceRelative);
220
+ const relative = path.relative(workspaceDir, absPath);
221
+ if (relative.startsWith("..") || path.isAbsolute(relative)) {
222
+ return { text: "", path: relPath };
223
+ }
224
+ try {
225
+ const content = await fs.readFile(absPath, "utf8");
226
+ const read = buildMemoryReadResult({
227
+ content,
228
+ relPath: workspaceRelative,
229
+ from: fromLine,
230
+ lines: lineCount,
231
+ defaultLines: limits.getDefaultLines,
232
+ maxChars: limits.getMaxChars,
233
+ });
234
+ return {
235
+ text: read.text,
236
+ path: read.path,
237
+ ...(read.truncated ? { truncated: true } : {}),
238
+ ...(typeof read.from === "number" ? { from: read.from } : {}),
239
+ ...(typeof read.lines === "number" ? { lines: read.lines } : {}),
240
+ ...(typeof read.nextFrom === "number" ? { nextFrom: read.nextFrom } : {}),
241
+ };
242
+ }
243
+ catch {
244
+ return { text: "", path: relPath };
245
+ }
246
+ }
247
+ const got = await memoryGetFromDb({
248
+ pool: params.getPool(),
249
+ userId: scope.userId,
250
+ workspaceId: scope.workspaceId,
251
+ agentId: params.agentId,
252
+ sessionsVisibility,
253
+ limits,
254
+ lookup: readParams.relPath,
255
+ fromLine,
256
+ lineCount,
257
+ });
258
+ if (!got.ok) {
259
+ return { text: "", path: readParams.relPath };
260
+ }
261
+ return {
262
+ text: got.content,
263
+ path: got.path,
264
+ from: got.fromLine,
265
+ lines: got.lineCount,
266
+ };
267
+ },
268
+ status() {
269
+ const limits = resolveMemoryLimits(cfg);
270
+ const workspaceDir = resolveWorkspaceDir();
271
+ return {
272
+ backend: "builtin",
273
+ provider: "anchorclaw-postgres",
274
+ workspaceDir,
275
+ sources: sessionsEnabled ? ["memory", "sessions"] : ["memory"],
276
+ custom: {
277
+ backend: "postgres",
278
+ postgresHost: cfg.postgres.host,
279
+ postgresDatabase: cfg.postgres.database,
280
+ limits,
281
+ sessionsMaxFileBytes: limits.sessionsMaxFileBytes,
282
+ sessionsVisibility,
283
+ purpose: params.purpose ?? "default",
284
+ },
285
+ };
286
+ },
287
+ async sync(syncParams) {
288
+ if (!sessionsEnabled) {
289
+ if (typeof syncParams?.progress === "function") {
290
+ syncParams.progress({ completed: 1, total: 1, label: "sessions disabled" });
291
+ }
292
+ return;
293
+ }
294
+ await params.ensureReady();
295
+ const scope = await resolveUserAndWorkspaceScope({
296
+ api,
297
+ pool: params.getPool(),
298
+ agentId: params.agentId,
299
+ sessionKey: api?.runtime?.sessionKey,
300
+ configuredExternalId: cfg.identity?.externalId,
301
+ });
302
+ if (typeof syncParams?.progress === "function") {
303
+ syncParams.progress({ completed: 0, total: 1, label: "syncing sessions index" });
304
+ }
305
+ const sessionFiles = Array.isArray(syncParams?.sessionFiles) && syncParams.sessionFiles.length > 0
306
+ ? syncParams.sessionFiles
307
+ : undefined;
308
+ if (!sessionFiles && sessionsVisibility === "visible") {
309
+ const visibleAgentIds = await listVisibleAgentIds();
310
+ await syncVisibleSessionsIndexDb({
311
+ pool: params.getPool(),
312
+ userId: scope.userId,
313
+ workspaceId: scope.workspaceId,
314
+ agentId: params.agentId,
315
+ otherAgentIds: visibleAgentIds.filter((agentId) => agentId !== params.agentId),
316
+ force: syncParams?.force === true,
317
+ });
318
+ }
319
+ else {
320
+ await syncSessionsIndexDb({
321
+ pool: params.getPool(),
322
+ userId: scope.userId,
323
+ workspaceId: scope.workspaceId,
324
+ agentId: params.agentId,
325
+ force: syncParams?.force === true,
326
+ ...(sessionFiles ? { sessionFiles } : {}),
327
+ });
328
+ }
329
+ if (typeof syncParams?.progress === "function") {
330
+ syncParams.progress({ completed: 1, total: 1, label: "done" });
331
+ }
332
+ },
333
+ getCachedEmbeddingAvailability() {
334
+ return { ok: false, cached: true, checked: true, error: "semantic layer not configured" };
335
+ },
336
+ async probeEmbeddingAvailability() {
337
+ return { ok: false, checked: true, checkedAtMs: Date.now(), error: "semantic layer not configured" };
338
+ },
339
+ async probeVectorAvailability() {
340
+ return false;
341
+ },
342
+ };
343
+ }
344
+ //# sourceMappingURL=manager.js.map