@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,228 @@
1
+ -- AnchorClaw: initial schema (MVP)
2
+
3
+ CREATE EXTENSION IF NOT EXISTS pgcrypto;
4
+ CREATE EXTENSION IF NOT EXISTS pg_trgm;
5
+
6
+ CREATE TYPE memory_item_type AS ENUM (
7
+ 'fact',
8
+ 'note',
9
+ 'profile',
10
+ 'config',
11
+ 'skill',
12
+ 'automation',
13
+ 'summary'
14
+ );
15
+
16
+ CREATE TYPE memory_item_status AS ENUM (
17
+ 'active',
18
+ 'superseded',
19
+ 'archived',
20
+ 'deleted',
21
+ 'pending_review'
22
+ );
23
+
24
+ CREATE TYPE memory_item_source AS ENUM (
25
+ 'user',
26
+ 'agent',
27
+ 'migration',
28
+ 'system',
29
+ 'integration'
30
+ );
31
+
32
+ CREATE TYPE memory_event_type AS ENUM (
33
+ 'message',
34
+ 'decision',
35
+ 'action',
36
+ 'observation',
37
+ 'correction',
38
+ 'import',
39
+ 'export'
40
+ );
41
+
42
+ CREATE TABLE users (
43
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
44
+ display_name TEXT,
45
+ created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
46
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
47
+ );
48
+
49
+ CREATE TABLE user_identities (
50
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
51
+ user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
52
+
53
+ channel TEXT NOT NULL,
54
+ external_id TEXT NOT NULL,
55
+ display_label TEXT,
56
+
57
+ created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
58
+
59
+ UNIQUE (channel, external_id)
60
+ );
61
+
62
+ CREATE INDEX user_identities_user_idx
63
+ ON user_identities (user_id);
64
+
65
+ CREATE TABLE workspaces (
66
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
67
+ user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
68
+
69
+ name TEXT NOT NULL,
70
+ is_default BOOLEAN NOT NULL DEFAULT false,
71
+ metadata JSONB NOT NULL DEFAULT '{}'::jsonb,
72
+
73
+ created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
74
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
75
+
76
+ UNIQUE (user_id, name)
77
+ );
78
+
79
+ CREATE UNIQUE INDEX workspaces_one_default_per_user_idx
80
+ ON workspaces (user_id)
81
+ WHERE is_default = true;
82
+
83
+ CREATE TABLE memory_items (
84
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
85
+
86
+ user_id UUID NOT NULL REFERENCES users(id),
87
+ workspace_id UUID NOT NULL REFERENCES workspaces(id),
88
+ session_id TEXT,
89
+
90
+ type memory_item_type NOT NULL,
91
+ namespace TEXT NOT NULL DEFAULT 'default',
92
+ status memory_item_status NOT NULL DEFAULT 'active',
93
+ source memory_item_source NOT NULL DEFAULT 'agent',
94
+
95
+ title TEXT,
96
+ content TEXT NOT NULL,
97
+ content_format TEXT NOT NULL DEFAULT 'markdown',
98
+ metadata JSONB NOT NULL DEFAULT '{}'::jsonb,
99
+ tags TEXT[] NOT NULL DEFAULT '{}',
100
+
101
+ importance SMALLINT NOT NULL DEFAULT 50 CHECK (importance >= 0 AND importance <= 100),
102
+ confidence SMALLINT NOT NULL DEFAULT 80 CHECK (confidence >= 0 AND confidence <= 100),
103
+
104
+ valid_from TIMESTAMPTZ,
105
+ valid_until TIMESTAMPTZ,
106
+ expires_at TIMESTAMPTZ,
107
+ deleted_at TIMESTAMPTZ,
108
+
109
+ created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
110
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
111
+ last_accessed_at TIMESTAMPTZ,
112
+
113
+ created_by TEXT,
114
+ updated_by TEXT,
115
+
116
+ version INTEGER NOT NULL DEFAULT 1,
117
+ supersedes_id UUID REFERENCES memory_items(id),
118
+ canonical_key TEXT,
119
+
120
+ search_vector TSVECTOR GENERATED ALWAYS AS (
121
+ setweight(to_tsvector('simple', coalesce(title, '')), 'A') ||
122
+ setweight(to_tsvector('simple', content), 'B')
123
+ ) STORED,
124
+
125
+ CHECK (content_format IN ('markdown', 'json', 'plain'))
126
+ );
127
+
128
+ CREATE INDEX memory_items_user_status_type_idx
129
+ ON memory_items (user_id, workspace_id, status, type, namespace);
130
+
131
+ CREATE INDEX memory_items_user_importance_recency_idx
132
+ ON memory_items (user_id, workspace_id, status, importance DESC, updated_at DESC);
133
+
134
+ CREATE INDEX memory_items_workspace_idx
135
+ ON memory_items (workspace_id);
136
+
137
+ CREATE INDEX memory_items_tags_idx
138
+ ON memory_items USING GIN (tags);
139
+
140
+ CREATE INDEX memory_items_metadata_idx
141
+ ON memory_items USING GIN (metadata);
142
+
143
+ CREATE INDEX memory_items_search_idx
144
+ ON memory_items USING GIN (search_vector);
145
+
146
+ CREATE UNIQUE INDEX memory_items_canonical_active_idx
147
+ ON memory_items (user_id, workspace_id, namespace, type, canonical_key)
148
+ WHERE status = 'active' AND canonical_key IS NOT NULL;
149
+
150
+ CREATE TABLE memory_events (
151
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
152
+
153
+ user_id UUID NOT NULL REFERENCES users(id),
154
+ workspace_id UUID NOT NULL REFERENCES workspaces(id),
155
+ session_id TEXT,
156
+
157
+ event_type memory_event_type NOT NULL,
158
+ content TEXT NOT NULL,
159
+ metadata JSONB NOT NULL DEFAULT '{}'::jsonb,
160
+ tags TEXT[] NOT NULL DEFAULT '{}',
161
+
162
+ created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
163
+ created_by TEXT,
164
+
165
+ related_item_ids UUID[] NOT NULL DEFAULT '{}'
166
+ );
167
+
168
+ CREATE INDEX memory_events_user_time_idx
169
+ ON memory_events (user_id, created_at DESC);
170
+
171
+ CREATE INDEX memory_events_workspace_time_idx
172
+ ON memory_events (workspace_id, created_at DESC);
173
+
174
+ CREATE INDEX memory_events_tags_idx
175
+ ON memory_events USING GIN (tags);
176
+
177
+ CREATE TABLE memory_item_links (
178
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
179
+ user_id UUID NOT NULL REFERENCES users(id),
180
+
181
+ from_item_id UUID NOT NULL REFERENCES memory_items(id) ON DELETE CASCADE,
182
+ to_item_id UUID NOT NULL REFERENCES memory_items(id) ON DELETE CASCADE,
183
+ relation TEXT NOT NULL,
184
+
185
+ metadata JSONB NOT NULL DEFAULT '{}'::jsonb,
186
+ created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
187
+
188
+ UNIQUE (from_item_id, to_item_id, relation)
189
+ );
190
+
191
+ CREATE TABLE memory_audit_log (
192
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
193
+
194
+ user_id UUID NOT NULL REFERENCES users(id),
195
+ item_id UUID REFERENCES memory_items(id) ON DELETE SET NULL,
196
+ event_id UUID REFERENCES memory_events(id) ON DELETE SET NULL,
197
+
198
+ operation TEXT NOT NULL,
199
+ before JSONB,
200
+ after JSONB,
201
+
202
+ actor TEXT,
203
+ reason TEXT,
204
+ created_at TIMESTAMPTZ NOT NULL DEFAULT now()
205
+ );
206
+
207
+ CREATE INDEX memory_audit_log_user_time_idx
208
+ ON memory_audit_log (user_id, created_at DESC);
209
+
210
+ -- Track one-time imports from workspace files (e.g. MEMORY.md, memory/*.md) so imports are idempotent.
211
+ CREATE TABLE memory_import_files (
212
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
213
+
214
+ user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
215
+ workspace_id UUID NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,
216
+
217
+ rel_path TEXT NOT NULL,
218
+ sha256 TEXT NOT NULL,
219
+ imported_at TIMESTAMPTZ NOT NULL DEFAULT now(),
220
+
221
+ source_type TEXT NOT NULL, -- e.g. 'root-memory' | 'daily-memory'
222
+ metadata JSONB NOT NULL DEFAULT '{}'::jsonb,
223
+
224
+ UNIQUE (user_id, workspace_id, rel_path, sha256)
225
+ );
226
+
227
+ CREATE INDEX memory_import_files_scope_time_idx
228
+ ON memory_import_files (user_id, workspace_id, imported_at DESC);
@@ -0,0 +1,71 @@
1
+ -- AnchorClaw: sessions index (phase 1 lexical)
2
+
3
+ CREATE TABLE session_index_files (
4
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
5
+
6
+ user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
7
+ workspace_id UUID NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,
8
+
9
+ -- Stored for filtering/debug; identity key is path+scope.
10
+ agent_id TEXT NOT NULL,
11
+ path TEXT NOT NULL,
12
+ abs_path TEXT NOT NULL,
13
+
14
+ hash TEXT NOT NULL,
15
+ mtime_ms DOUBLE PRECISION NOT NULL,
16
+ size_bytes BIGINT NOT NULL,
17
+
18
+ line_count INTEGER NOT NULL DEFAULT 0,
19
+ indexed_at TIMESTAMPTZ NOT NULL DEFAULT now(),
20
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
21
+
22
+ metadata JSONB NOT NULL DEFAULT '{}'::jsonb,
23
+
24
+ UNIQUE (user_id, workspace_id, path)
25
+ );
26
+
27
+ CREATE INDEX session_index_files_scope_idx
28
+ ON session_index_files (user_id, workspace_id, updated_at DESC);
29
+
30
+ CREATE INDEX session_index_files_agent_idx
31
+ ON session_index_files (user_id, workspace_id, agent_id, updated_at DESC);
32
+
33
+ CREATE INDEX session_index_files_path_idx
34
+ ON session_index_files (user_id, workspace_id, path);
35
+
36
+ CREATE TABLE session_index_chunks (
37
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
38
+
39
+ user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
40
+ workspace_id UUID NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,
41
+ file_id UUID NOT NULL REFERENCES session_index_files(id) ON DELETE CASCADE,
42
+
43
+ agent_id TEXT NOT NULL,
44
+ path TEXT NOT NULL,
45
+
46
+ chunk_index INTEGER NOT NULL,
47
+ start_line INTEGER NOT NULL,
48
+ end_line INTEGER NOT NULL,
49
+ text TEXT NOT NULL,
50
+
51
+ message_timestamps_ms BIGINT[] NOT NULL DEFAULT '{}',
52
+ metadata JSONB NOT NULL DEFAULT '{}'::jsonb,
53
+
54
+ search_vector TSVECTOR GENERATED ALWAYS AS (
55
+ setweight(to_tsvector('simple', coalesce(path, '')), 'A') ||
56
+ setweight(to_tsvector('simple', text), 'B')
57
+ ) STORED,
58
+
59
+ created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
60
+
61
+ UNIQUE (file_id, chunk_index)
62
+ );
63
+
64
+ CREATE INDEX session_index_chunks_scope_idx
65
+ ON session_index_chunks (user_id, workspace_id, path);
66
+
67
+ CREATE INDEX session_index_chunks_agent_idx
68
+ ON session_index_chunks (user_id, workspace_id, agent_id, path);
69
+
70
+ CREATE INDEX session_index_chunks_search_idx
71
+ ON session_index_chunks USING GIN (search_vector);
@@ -0,0 +1,314 @@
1
+ {
2
+ "id": "anchorclaw",
3
+ "activation": {
4
+ "onStartup": false
5
+ },
6
+ "kind": "memory",
7
+ "contracts": {
8
+ "tools": ["memory_forget", "memory_recall", "memory_store", "memory_search", "memory_get", "memory_status"]
9
+ },
10
+ "uiHints": {
11
+ "sessions": {
12
+ "label": "Sessions",
13
+ "help": "Sessions corpus indexing and visibility settings",
14
+ "advanced": true
15
+ },
16
+ "sessions.visibility": {
17
+ "label": "Sessions Visibility",
18
+ "placeholder": "current",
19
+ "help": "Visibility scope for sessions corpus: current (default), off, or visible (requires visibility guard support).",
20
+ "advanced": true
21
+ },
22
+ "sessions.sync": {
23
+ "label": "Sessions Delta Sync",
24
+ "help": "Thresholds controlling when transcript updates trigger sessions index sync.",
25
+ "advanced": true
26
+ },
27
+ "sessions.sync.deltaBytes": {
28
+ "label": "Delta Bytes",
29
+ "placeholder": "100000",
30
+ "help": "Minimum appended bytes before reindexing sessions transcripts.",
31
+ "advanced": true
32
+ },
33
+ "sessions.sync.deltaMessages": {
34
+ "label": "Delta Messages",
35
+ "placeholder": "50",
36
+ "help": "Minimum appended message records before reindexing sessions transcripts.",
37
+ "advanced": true
38
+ },
39
+ "import": {
40
+ "label": "Import",
41
+ "help": "Migration behavior when legacy memory files exist",
42
+ "advanced": true
43
+ },
44
+ "import.cleanupMemoryMdAfterImport": {
45
+ "label": "Cleanup MEMORY.md After Import",
46
+ "help": "When true (default), after importing legacy MEMORY.md into Postgres AnchorClaw writes a backup into .openclaw-repair/anchorclaw/ and stubs MEMORY.md to avoid duplicate prompt injection.",
47
+ "advanced": true
48
+ },
49
+ "identity": {
50
+ "label": "Identity",
51
+ "help": "Stable owner identity for memory scoping",
52
+ "advanced": true
53
+ },
54
+ "identity.externalId": {
55
+ "label": "External Identity",
56
+ "placeholder": "family-main-01",
57
+ "help": "Stable identity key (max 20 chars). Recommended for Docker/production to avoid memory scope drift.",
58
+ "advanced": true
59
+ },
60
+ "postgres": {
61
+ "label": "Postgres",
62
+ "help": "Postgres connection settings for AnchorClaw memory storage"
63
+ },
64
+ "postgres.host": {
65
+ "label": "Host",
66
+ "placeholder": "localhost",
67
+ "help": "Postgres host"
68
+ },
69
+ "postgres.port": {
70
+ "label": "Port",
71
+ "placeholder": "5432",
72
+ "help": "Postgres port"
73
+ },
74
+ "postgres.database": {
75
+ "label": "Database",
76
+ "placeholder": "anchorclaw",
77
+ "help": "Postgres database name"
78
+ },
79
+ "postgres.schema": {
80
+ "label": "Schema",
81
+ "placeholder": "memory",
82
+ "help": "Optional Postgres schema for AnchorClaw tables (recommended to avoid polluting public)",
83
+ "advanced": true
84
+ },
85
+ "postgres.user": {
86
+ "label": "User",
87
+ "placeholder": "postgres",
88
+ "help": "Postgres user"
89
+ },
90
+ "postgres.password": {
91
+ "label": "Password",
92
+ "sensitive": true,
93
+ "placeholder": "${ANCHORCLAW_DB_PASSWORD}",
94
+ "help": "Postgres password; supports ${ENV_VAR} values"
95
+ },
96
+ "postgres.ssl": {
97
+ "label": "SSL",
98
+ "help": "Enable SSL for Postgres connection",
99
+ "advanced": true
100
+ },
101
+ "postgres.sslMode": {
102
+ "label": "SSL Mode",
103
+ "placeholder": "verify-full",
104
+ "help": "SSL mode: disable, require (no cert verification), or verify-full (verify server certificate)",
105
+ "advanced": true
106
+ },
107
+ "postgres.sslCa": {
108
+ "label": "SSL CA",
109
+ "placeholder": "${ANCHORCLAW_DB_SSL_CA_PEM}",
110
+ "help": "Optional CA PEM bundle for verify-full; supports ${ENV_VAR} values",
111
+ "advanced": true
112
+ },
113
+ "postgres.pool": {
114
+ "label": "Pool",
115
+ "help": "Connection pool settings",
116
+ "advanced": true
117
+ },
118
+ "postgres.pool.max": {
119
+ "label": "Max Connections",
120
+ "placeholder": "10",
121
+ "help": "Maximum number of connections in the pool",
122
+ "advanced": true
123
+ },
124
+ "postgres.pool.connectionTimeoutMs": {
125
+ "label": "Connect Timeout (ms)",
126
+ "placeholder": "5000",
127
+ "help": "Time to wait for a connection before failing",
128
+ "advanced": true
129
+ },
130
+ "postgres.pool.idleTimeoutMs": {
131
+ "label": "Idle Timeout (ms)",
132
+ "placeholder": "30000",
133
+ "help": "Time before an idle connection is closed",
134
+ "advanced": true
135
+ },
136
+ "limits": {
137
+ "label": "Limits",
138
+ "help": "Safety limits for memory tools",
139
+ "advanced": true
140
+ },
141
+ "limits.maxResults": {
142
+ "label": "Max Results",
143
+ "placeholder": "10",
144
+ "help": "Maximum search results to return (cap: 10)",
145
+ "advanced": true
146
+ },
147
+ "limits.getMaxChars": {
148
+ "label": "Get Max Chars",
149
+ "placeholder": "12000",
150
+ "help": "Maximum characters returned by memory_get (cap: 12000)",
151
+ "advanced": true
152
+ },
153
+ "limits.getDefaultLines": {
154
+ "label": "Get Default Lines",
155
+ "placeholder": "120",
156
+ "help": "Default lineCount for memory_get when omitted (cap: 120)",
157
+ "advanced": true
158
+ }
159
+ },
160
+ "configSchema": {
161
+ "type": "object",
162
+ "additionalProperties": false,
163
+ "properties": {
164
+ "sessions": {
165
+ "type": "object",
166
+ "additionalProperties": false,
167
+ "properties": {
168
+ "visibility": {
169
+ "type": "string",
170
+ "enum": ["current", "off", "visible"],
171
+ "default": "current"
172
+ },
173
+ "sync": {
174
+ "type": "object",
175
+ "additionalProperties": false,
176
+ "properties": {
177
+ "deltaBytes": {
178
+ "type": "number",
179
+ "default": 100000,
180
+ "minimum": 0
181
+ },
182
+ "deltaMessages": {
183
+ "type": "number",
184
+ "default": 50,
185
+ "minimum": 0
186
+ }
187
+ }
188
+ }
189
+ }
190
+ },
191
+ "import": {
192
+ "type": "object",
193
+ "additionalProperties": false,
194
+ "properties": {
195
+ "cleanupMemoryMdAfterImport": {
196
+ "type": "boolean",
197
+ "default": true
198
+ }
199
+ }
200
+ },
201
+ "identity": {
202
+ "type": "object",
203
+ "additionalProperties": false,
204
+ "properties": {
205
+ "externalId": {
206
+ "type": "string",
207
+ "minLength": 1,
208
+ "maxLength": 20
209
+ }
210
+ }
211
+ },
212
+ "postgres": {
213
+ "type": "object",
214
+ "additionalProperties": false,
215
+ "properties": {
216
+ "host": {
217
+ "type": "string",
218
+ "minLength": 1
219
+ },
220
+ "port": {
221
+ "oneOf": [
222
+ {
223
+ "type": "number",
224
+ "default": 5432,
225
+ "minimum": 1,
226
+ "maximum": 65535
227
+ },
228
+ {
229
+ "type": "string",
230
+ "default": "5432",
231
+ "minLength": 1
232
+ }
233
+ ]
234
+ },
235
+ "database": {
236
+ "type": "string",
237
+ "minLength": 1
238
+ },
239
+ "schema": {
240
+ "type": "string",
241
+ "minLength": 1
242
+ },
243
+ "user": {
244
+ "type": "string",
245
+ "minLength": 1
246
+ },
247
+ "password": {
248
+ "type": "string"
249
+ },
250
+ "ssl": {
251
+ "type": "boolean"
252
+ },
253
+ "sslMode": {
254
+ "type": "string",
255
+ "enum": ["disable", "require", "verify-full"]
256
+ },
257
+ "sslCa": {
258
+ "type": "string"
259
+ },
260
+ "pool": {
261
+ "type": "object",
262
+ "additionalProperties": false,
263
+ "properties": {
264
+ "max": {
265
+ "type": "number",
266
+ "default": 10,
267
+ "minimum": 1,
268
+ "maximum": 100
269
+ },
270
+ "connectionTimeoutMs": {
271
+ "type": "number",
272
+ "default": 5000,
273
+ "minimum": 100,
274
+ "maximum": 600000
275
+ },
276
+ "idleTimeoutMs": {
277
+ "type": "number",
278
+ "default": 30000,
279
+ "minimum": 100,
280
+ "maximum": 3600000
281
+ }
282
+ }
283
+ }
284
+ },
285
+ "required": ["host", "database", "user"]
286
+ },
287
+ "limits": {
288
+ "type": "object",
289
+ "additionalProperties": false,
290
+ "properties": {
291
+ "maxResults": {
292
+ "type": "number",
293
+ "default": 10,
294
+ "minimum": 1,
295
+ "maximum": 10
296
+ },
297
+ "getMaxChars": {
298
+ "type": "number",
299
+ "default": 12000,
300
+ "minimum": 1000,
301
+ "maximum": 12000
302
+ },
303
+ "getDefaultLines": {
304
+ "type": "number",
305
+ "default": 120,
306
+ "minimum": 10,
307
+ "maximum": 120
308
+ }
309
+ }
310
+ }
311
+ },
312
+ "required": []
313
+ }
314
+ }
package/package.json ADDED
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "@alexandrgreen/anchorclaw",
3
+ "version": "0.0.3",
4
+ "description": "OpenClaw Postgres-backed long-term memory plugin",
5
+ "author": "Alexander Green",
6
+ "license": "MIT",
7
+ "homepage": "https://github.com/Alexander-Green/anchorClaw#readme",
8
+ "bugs": {
9
+ "url": "https://github.com/Alexander-Green/anchorClaw/issues"
10
+ },
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "https://github.com/Alexander-Green/anchorClaw"
14
+ },
15
+ "type": "module",
16
+ "files": [
17
+ "dist/",
18
+ "migrations/",
19
+ "openclaw.plugin.json",
20
+ "NOTICE",
21
+ "README.md",
22
+ "package.json"
23
+ ],
24
+ "scripts": {
25
+ "build": "tsc -p tsconfig.json",
26
+ "test": "vitest run",
27
+ "typecheck": "tsc -p tsconfig.json --noEmit"
28
+ },
29
+ "dependencies": {
30
+ "pg": "^8.16.0"
31
+ },
32
+ "peerDependencies": {
33
+ "openclaw": ">=2026.5.7"
34
+ },
35
+ "peerDependenciesMeta": {
36
+ "openclaw": {
37
+ "optional": true
38
+ }
39
+ },
40
+ "devDependencies": {
41
+ "@types/node": "^22.15.3",
42
+ "@types/pg": "^8.15.4",
43
+ "openclaw": "2026.5.7",
44
+ "typescript": "^5.8.3",
45
+ "vitest": "^3.2.4"
46
+ },
47
+ "openclaw": {
48
+ "extensions": ["./src/index.ts"],
49
+ "runtimeExtensions": ["./dist/index.js"],
50
+ "install": {
51
+ "npmSpec": "@alexandrgreen/anchorclaw",
52
+ "defaultChoice": "npm",
53
+ "minHostVersion": ">=2026.5.7"
54
+ },
55
+ "compat": {
56
+ "pluginApi": ">=2026.5.7"
57
+ },
58
+ "release": {
59
+ "publishToClawHub": true,
60
+ "publishToNpm": true
61
+ }
62
+ }
63
+ }