@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.
- package/LICENSE +21 -0
- package/NOTICE +9 -0
- package/README.md +252 -0
- package/dist/api.d.ts +3 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +3 -0
- package/dist/api.js.map +1 -0
- package/dist/config.d.ts +46 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +309 -0
- package/dist/config.js.map +1 -0
- package/dist/config.test.d.ts +2 -0
- package/dist/config.test.d.ts.map +1 -0
- package/dist/config.test.js +100 -0
- package/dist/config.test.js.map +1 -0
- package/dist/identity-policy.d.ts +3 -0
- package/dist/identity-policy.d.ts.map +1 -0
- package/dist/identity-policy.js +7 -0
- package/dist/identity-policy.js.map +1 -0
- package/dist/identity-policy.test.d.ts +2 -0
- package/dist/identity-policy.test.d.ts.map +1 -0
- package/dist/identity-policy.test.js +23 -0
- package/dist/identity-policy.test.js.map +1 -0
- package/dist/identity.d.ts +22 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +113 -0
- package/dist/identity.js.map +1 -0
- package/dist/identity.test.d.ts +2 -0
- package/dist/identity.test.d.ts.map +1 -0
- package/dist/identity.test.js +22 -0
- package/dist/identity.test.js.map +1 -0
- package/dist/importer.d.ts +12 -0
- package/dist/importer.d.ts.map +1 -0
- package/dist/importer.js +297 -0
- package/dist/importer.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +92 -0
- package/dist/index.js.map +1 -0
- package/dist/index.test.d.ts +2 -0
- package/dist/index.test.d.ts.map +1 -0
- package/dist/index.test.js +770 -0
- package/dist/index.test.js.map +1 -0
- package/dist/memory/forget.d.ts +22 -0
- package/dist/memory/forget.d.ts.map +1 -0
- package/dist/memory/forget.js +84 -0
- package/dist/memory/forget.js.map +1 -0
- package/dist/memory/get.d.ts +36 -0
- package/dist/memory/get.d.ts.map +1 -0
- package/dist/memory/get.js +282 -0
- package/dist/memory/get.js.map +1 -0
- package/dist/memory/get.test.d.ts +2 -0
- package/dist/memory/get.test.d.ts.map +1 -0
- package/dist/memory/get.test.js +180 -0
- package/dist/memory/get.test.js.map +1 -0
- package/dist/memory/limits.d.ts +10 -0
- package/dist/memory/limits.d.ts.map +1 -0
- package/dist/memory/limits.js +18 -0
- package/dist/memory/limits.js.map +1 -0
- package/dist/memory/manager.d.ts +93 -0
- package/dist/memory/manager.d.ts.map +1 -0
- package/dist/memory/manager.js +344 -0
- package/dist/memory/manager.js.map +1 -0
- package/dist/memory/manager.test.d.ts +2 -0
- package/dist/memory/manager.test.d.ts.map +1 -0
- package/dist/memory/manager.test.js +201 -0
- package/dist/memory/manager.test.js.map +1 -0
- package/dist/memory/paths.d.ts +12 -0
- package/dist/memory/paths.d.ts.map +1 -0
- package/dist/memory/paths.js +31 -0
- package/dist/memory/paths.js.map +1 -0
- package/dist/memory/paths.test.d.ts +2 -0
- package/dist/memory/paths.test.d.ts.map +1 -0
- package/dist/memory/paths.test.js +35 -0
- package/dist/memory/paths.test.js.map +1 -0
- package/dist/memory/prompt.d.ts +37 -0
- package/dist/memory/prompt.d.ts.map +1 -0
- package/dist/memory/prompt.js +152 -0
- package/dist/memory/prompt.js.map +1 -0
- package/dist/memory/prompt.test.d.ts +2 -0
- package/dist/memory/prompt.test.d.ts.map +1 -0
- package/dist/memory/prompt.test.js +47 -0
- package/dist/memory/prompt.test.js.map +1 -0
- package/dist/memory/read-file-shared.d.ts +17 -0
- package/dist/memory/read-file-shared.d.ts.map +1 -0
- package/dist/memory/read-file-shared.js +53 -0
- package/dist/memory/read-file-shared.js.map +1 -0
- package/dist/memory/read-file-shared.test.d.ts +2 -0
- package/dist/memory/read-file-shared.test.d.ts.map +1 -0
- package/dist/memory/read-file-shared.test.js +82 -0
- package/dist/memory/read-file-shared.test.js.map +1 -0
- package/dist/memory/recall.d.ts +22 -0
- package/dist/memory/recall.d.ts.map +1 -0
- package/dist/memory/recall.js +58 -0
- package/dist/memory/recall.js.map +1 -0
- package/dist/memory/search.d.ts +30 -0
- package/dist/memory/search.d.ts.map +1 -0
- package/dist/memory/search.js +110 -0
- package/dist/memory/search.js.map +1 -0
- package/dist/memory/search.test.d.ts +2 -0
- package/dist/memory/search.test.d.ts.map +1 -0
- package/dist/memory/search.test.js +103 -0
- package/dist/memory/search.test.js.map +1 -0
- package/dist/memory/sessions-index-sync.d.ts +28 -0
- package/dist/memory/sessions-index-sync.d.ts.map +1 -0
- package/dist/memory/sessions-index-sync.js +253 -0
- package/dist/memory/sessions-index-sync.js.map +1 -0
- package/dist/memory/sessions-index-sync.test.d.ts +2 -0
- package/dist/memory/sessions-index-sync.test.d.ts.map +1 -0
- package/dist/memory/sessions-index-sync.test.js +280 -0
- package/dist/memory/sessions-index-sync.test.js.map +1 -0
- package/dist/memory/sessions-index.d.ts +30 -0
- package/dist/memory/sessions-index.d.ts.map +1 -0
- package/dist/memory/sessions-index.js +238 -0
- package/dist/memory/sessions-index.js.map +1 -0
- package/dist/memory/sessions-index.test.d.ts +2 -0
- package/dist/memory/sessions-index.test.d.ts.map +1 -0
- package/dist/memory/sessions-index.test.js +266 -0
- package/dist/memory/sessions-index.test.js.map +1 -0
- package/dist/memory/sessions-visibility.d.ts +18 -0
- package/dist/memory/sessions-visibility.d.ts.map +1 -0
- package/dist/memory/sessions-visibility.js +110 -0
- package/dist/memory/sessions-visibility.js.map +1 -0
- package/dist/memory/sessions-visibility.test.d.ts +2 -0
- package/dist/memory/sessions-visibility.test.d.ts.map +1 -0
- package/dist/memory/sessions-visibility.test.js +137 -0
- package/dist/memory/sessions-visibility.test.js.map +1 -0
- package/dist/memory/sessions.d.ts +26 -0
- package/dist/memory/sessions.d.ts.map +1 -0
- package/dist/memory/sessions.js +250 -0
- package/dist/memory/sessions.js.map +1 -0
- package/dist/memory/sessions.test.d.ts +2 -0
- package/dist/memory/sessions.test.d.ts.map +1 -0
- package/dist/memory/sessions.test.js +257 -0
- package/dist/memory/sessions.test.js.map +1 -0
- package/dist/memory/store.d.ts +25 -0
- package/dist/memory/store.d.ts.map +1 -0
- package/dist/memory/store.js +176 -0
- package/dist/memory/store.js.map +1 -0
- package/dist/migrations-fs.d.ts +5 -0
- package/dist/migrations-fs.d.ts.map +1 -0
- package/dist/migrations-fs.js +19 -0
- package/dist/migrations-fs.js.map +1 -0
- package/dist/migrations.d.ts +17 -0
- package/dist/migrations.d.ts.map +1 -0
- package/dist/migrations.js +44 -0
- package/dist/migrations.js.map +1 -0
- package/dist/migrations.test.d.ts +2 -0
- package/dist/migrations.test.d.ts.map +1 -0
- package/dist/migrations.test.js +66 -0
- package/dist/migrations.test.js.map +1 -0
- package/dist/plugin/capability.d.ts +7 -0
- package/dist/plugin/capability.d.ts.map +1 -0
- package/dist/plugin/capability.js +92 -0
- package/dist/plugin/capability.js.map +1 -0
- package/dist/plugin/capability.test.d.ts +2 -0
- package/dist/plugin/capability.test.d.ts.map +1 -0
- package/dist/plugin/capability.test.js +75 -0
- package/dist/plugin/capability.test.js.map +1 -0
- package/dist/plugin/lifecycle.d.ts +6 -0
- package/dist/plugin/lifecycle.d.ts.map +1 -0
- package/dist/plugin/lifecycle.js +31 -0
- package/dist/plugin/lifecycle.js.map +1 -0
- package/dist/plugin/prompt-cache.d.ts +10 -0
- package/dist/plugin/prompt-cache.d.ts.map +1 -0
- package/dist/plugin/prompt-cache.js +58 -0
- package/dist/plugin/prompt-cache.js.map +1 -0
- package/dist/plugin/runtime-context.d.ts +27 -0
- package/dist/plugin/runtime-context.d.ts.map +1 -0
- package/dist/plugin/runtime-context.js +91 -0
- package/dist/plugin/runtime-context.js.map +1 -0
- package/dist/plugin/runtime-helpers.d.ts +3 -0
- package/dist/plugin/runtime-helpers.d.ts.map +1 -0
- package/dist/plugin/runtime-helpers.js +12 -0
- package/dist/plugin/runtime-helpers.js.map +1 -0
- package/dist/plugin/session-delta-helpers.d.ts +11 -0
- package/dist/plugin/session-delta-helpers.d.ts.map +1 -0
- package/dist/plugin/session-delta-helpers.js +62 -0
- package/dist/plugin/session-delta-helpers.js.map +1 -0
- package/dist/plugin/session-delta.d.ts +12 -0
- package/dist/plugin/session-delta.d.ts.map +1 -0
- package/dist/plugin/session-delta.js +307 -0
- package/dist/plugin/session-delta.js.map +1 -0
- package/dist/plugin/tools/common.d.ts +7 -0
- package/dist/plugin/tools/common.d.ts.map +1 -0
- package/dist/plugin/tools/common.js +2 -0
- package/dist/plugin/tools/common.js.map +1 -0
- package/dist/plugin/tools/index.d.ts +3 -0
- package/dist/plugin/tools/index.d.ts.map +1 -0
- package/dist/plugin/tools/index.js +16 -0
- package/dist/plugin/tools/index.js.map +1 -0
- package/dist/plugin/tools/memory-forget.d.ts +3 -0
- package/dist/plugin/tools/memory-forget.d.ts.map +1 -0
- package/dist/plugin/tools/memory-forget.js +80 -0
- package/dist/plugin/tools/memory-forget.js.map +1 -0
- package/dist/plugin/tools/memory-forget.test.d.ts +2 -0
- package/dist/plugin/tools/memory-forget.test.d.ts.map +1 -0
- package/dist/plugin/tools/memory-forget.test.js +58 -0
- package/dist/plugin/tools/memory-forget.test.js.map +1 -0
- package/dist/plugin/tools/memory-get.d.ts +3 -0
- package/dist/plugin/tools/memory-get.d.ts.map +1 -0
- package/dist/plugin/tools/memory-get.js +136 -0
- package/dist/plugin/tools/memory-get.js.map +1 -0
- package/dist/plugin/tools/memory-recall.d.ts +3 -0
- package/dist/plugin/tools/memory-recall.d.ts.map +1 -0
- package/dist/plugin/tools/memory-recall.js +176 -0
- package/dist/plugin/tools/memory-recall.js.map +1 -0
- package/dist/plugin/tools/memory-recall.test.d.ts +2 -0
- package/dist/plugin/tools/memory-recall.test.d.ts.map +1 -0
- package/dist/plugin/tools/memory-recall.test.js +169 -0
- package/dist/plugin/tools/memory-recall.test.js.map +1 -0
- package/dist/plugin/tools/memory-search.d.ts +3 -0
- package/dist/plugin/tools/memory-search.d.ts.map +1 -0
- package/dist/plugin/tools/memory-search.js +332 -0
- package/dist/plugin/tools/memory-search.js.map +1 -0
- package/dist/plugin/tools/memory-search.test.d.ts +2 -0
- package/dist/plugin/tools/memory-search.test.d.ts.map +1 -0
- package/dist/plugin/tools/memory-search.test.js +205 -0
- package/dist/plugin/tools/memory-search.test.js.map +1 -0
- package/dist/plugin/tools/memory-status.d.ts +3 -0
- package/dist/plugin/tools/memory-status.d.ts.map +1 -0
- package/dist/plugin/tools/memory-status.js +134 -0
- package/dist/plugin/tools/memory-status.js.map +1 -0
- package/dist/plugin/tools/memory-store.d.ts +3 -0
- package/dist/plugin/tools/memory-store.d.ts.map +1 -0
- package/dist/plugin/tools/memory-store.js +88 -0
- package/dist/plugin/tools/memory-store.js.map +1 -0
- package/dist/plugin/tools/memory-store.test.d.ts +2 -0
- package/dist/plugin/tools/memory-store.test.d.ts.map +1 -0
- package/dist/plugin/tools/memory-store.test.js +64 -0
- package/dist/plugin/tools/memory-store.test.js.map +1 -0
- package/dist/plugin/tools/memory-visible-output.d.ts +20 -0
- package/dist/plugin/tools/memory-visible-output.d.ts.map +1 -0
- package/dist/plugin/tools/memory-visible-output.js +61 -0
- package/dist/plugin/tools/memory-visible-output.js.map +1 -0
- package/dist/plugin/types.d.ts +61 -0
- package/dist/plugin/types.d.ts.map +1 -0
- package/dist/plugin/types.js +2 -0
- package/dist/plugin/types.js.map +1 -0
- package/dist/postgres.d.ts +7 -0
- package/dist/postgres.d.ts.map +1 -0
- package/dist/postgres.js +55 -0
- package/dist/postgres.js.map +1 -0
- package/migrations/0001_init.sql +228 -0
- package/migrations/0002_session_index.sql +71 -0
- package/openclaw.plugin.json +314 -0
- 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
|
+
}
|