@xmemo/openclaw-memory 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,267 @@
1
+ // Auto-capture lifecycle hooks for XMemo.
2
+ //
3
+ // After a successful agent run, inspect user messages for high-signal snippets
4
+ // (preferences, decisions, facts, contact info) and store them in XMemo. XMemo
5
+ // handles embeddings remotely, so no local vector store is required.
6
+ import { resolveLivePluginConfigObject } from "openclaw/plugin-sdk/plugin-config-runtime";
7
+ import { XMemoClient } from "./client.js";
8
+ import { resolveXMemoMemoryConfig } from "./config.js";
9
+ const CURSORS = new Map();
10
+ const LEADING_TIMESTAMP_RE = /^\[[A-Za-z]{3} \d{4}-\d{2}-\d{2} \d{2}:\d{2}[^\]]*\] */;
11
+ const MEDIA_ATTACHED_RE = /\[media attached(?:\s+\d+\/\d+)?:[^\]]*\]/gi;
12
+ const ACTIVE_MEMORY_RE = /<active_memory_plugin>[\s\S]*?<\/active_memory_plugin>/g;
13
+ const UNTRUSTED_CONTEXT_RE = /^Untrusted context \(metadata[\s\S]*$/m;
14
+ const RELEVANT_MEMORIES_RE = /<relevant-memories>[\s\S]*?<\/relevant-memories>/g;
15
+ const MEMORY_TRIGGERS = [
16
+ /\b(remember|recall|save this|keep in mind|don't forget|note that)\b/i,
17
+ /\b(prefer|preference|like|love|hate|want|need)\b/i,
18
+ /\b(decided|decision|we will use|let's use|going forward|from now on)\b/i,
19
+ /\b(my name is|i am|my email|my phone|my address|contact me at)\b/i,
20
+ /\b(always|never|important|crucial|critical)\b/i,
21
+ /\b(记住|记下|保存|不要忘记|注意)\b/i,
22
+ /\b(喜欢|偏好|讨厌|想要|需要)\b/i,
23
+ /\b(决定|我们使用|以后|重要)\b/i,
24
+ /\b(覚えて|記憶して|忘れないで|好み|いつも|絶対|重要)\b/i,
25
+ /\b(기억해|기억해줘|잊지 마|좋아|싫어|항상|절대|중요)\b/i,
26
+ ];
27
+ function asRecord(value) {
28
+ if (value && typeof value === "object" && !Array.isArray(value)) {
29
+ return value;
30
+ }
31
+ return undefined;
32
+ }
33
+ function messageFingerprint(message) {
34
+ const obj = asRecord(message);
35
+ if (!obj) {
36
+ return `${typeof message}:${String(message)}`;
37
+ }
38
+ try {
39
+ return JSON.stringify({ role: obj.role, content: obj.content });
40
+ }
41
+ catch {
42
+ return `${String(obj.role)}:${String(obj.content)}`;
43
+ }
44
+ }
45
+ function extractUserTextContent(message) {
46
+ const obj = asRecord(message);
47
+ if (!obj || obj.role !== "user") {
48
+ return [];
49
+ }
50
+ const content = obj.content;
51
+ if (typeof content === "string") {
52
+ return [content];
53
+ }
54
+ if (!Array.isArray(content)) {
55
+ return [];
56
+ }
57
+ const texts = [];
58
+ for (const block of content) {
59
+ const blockObj = asRecord(block);
60
+ if (blockObj?.type === "text" && typeof blockObj.text === "string") {
61
+ texts.push(blockObj.text);
62
+ }
63
+ }
64
+ return texts;
65
+ }
66
+ function resolveStartIndex(messages, cursor) {
67
+ if (!cursor) {
68
+ return 0;
69
+ }
70
+ if (cursor.lastMessageFingerprint && cursor.nextIndex > 0) {
71
+ for (let index = messages.length - 1; index >= 0; index -= 1) {
72
+ if (messageFingerprint(messages[index]) === cursor.lastMessageFingerprint) {
73
+ return index + 1;
74
+ }
75
+ }
76
+ return 0;
77
+ }
78
+ if (cursor.nextIndex <= messages.length) {
79
+ return cursor.nextIndex;
80
+ }
81
+ return 0;
82
+ }
83
+ function sanitizeForCapture(text) {
84
+ let cleaned = text.length > 10_000 ? text.slice(0, 10_000) : text;
85
+ cleaned = cleaned.replace(LEADING_TIMESTAMP_RE, "");
86
+ cleaned = cleaned.replace(MEDIA_ATTACHED_RE, "");
87
+ cleaned = cleaned.replace(ACTIVE_MEMORY_RE, "");
88
+ cleaned = cleaned.replace(RELEVANT_MEMORIES_RE, "");
89
+ const untrustedMatch = UNTRUSTED_CONTEXT_RE.exec(cleaned);
90
+ if (untrustedMatch?.index !== undefined) {
91
+ cleaned = cleaned.slice(0, untrustedMatch.index);
92
+ }
93
+ cleaned = cleaned
94
+ .replace(/\n{3,}/g, "\n\n")
95
+ .replace(/[ \t]{2,}/g, " ")
96
+ .trim();
97
+ return cleaned;
98
+ }
99
+ function matchesCustomTrigger(text, customTriggers) {
100
+ if (!customTriggers || customTriggers.length === 0) {
101
+ return false;
102
+ }
103
+ const lower = text.toLocaleLowerCase();
104
+ return customTriggers.some((trigger) => lower.includes(trigger.toLocaleLowerCase()));
105
+ }
106
+ function looksLikeEnvelopeSludge(text) {
107
+ if (!text) {
108
+ return false;
109
+ }
110
+ return (/^Untrusted context \(metadata/m.test(text) ||
111
+ text.includes("(untrusted metadata):") ||
112
+ /\[media attached/i.test(text) ||
113
+ /<active_memory_plugin>/i.test(text) ||
114
+ /<relevant-memories>/i.test(text) ||
115
+ /^\[Channel /m.test(text) ||
116
+ /^Conversation info /m.test(text));
117
+ }
118
+ function looksLikePromptInjection(text) {
119
+ return /<\s*(system|assistant|developer|tool|function|relevant-memories)\b/i.test(text);
120
+ }
121
+ function shouldCapture(text, options) {
122
+ if (looksLikeEnvelopeSludge(text)) {
123
+ return false;
124
+ }
125
+ if (text.length > options.maxChars) {
126
+ return false;
127
+ }
128
+ if (text.includes("<relevant-memories>")) {
129
+ return false;
130
+ }
131
+ if (text.startsWith("<") && text.includes("</")) {
132
+ return false;
133
+ }
134
+ if (looksLikePromptInjection(text)) {
135
+ return false;
136
+ }
137
+ const hasTrigger = MEMORY_TRIGGERS.some((r) => r.test(text)) || matchesCustomTrigger(text, options.customTriggers);
138
+ if (!hasTrigger) {
139
+ return false;
140
+ }
141
+ if (text.length < 10) {
142
+ return false;
143
+ }
144
+ return true;
145
+ }
146
+ function detectCategory(text) {
147
+ const lower = text.toLowerCase();
148
+ if (/prefer|like|love|hate|want|need|偏好|喜欢|喜歡|讨厌|討厭|愛|好き|嫌い|좋아|싫어|원해|필요/.test(lower)) {
149
+ return "preference";
150
+ }
151
+ if (/decided|decision|will use|going forward|决定|決定|以后都用|以後都用|これから|앞으로/.test(lower)) {
152
+ return "decision";
153
+ }
154
+ if (/my name|email|phone|address|contact|is called|\+\d{10,}|@[\w.-]+\.\w+/.test(lower)) {
155
+ return "entity";
156
+ }
157
+ if (/\b(is|are|has|have|je|má|jsou)\b/i.test(lower)) {
158
+ return "fact";
159
+ }
160
+ return "other";
161
+ }
162
+ function resolveCurrentConfig(api, startupConfig) {
163
+ const runtimeLoader = api.runtime?.config?.current
164
+ ? () => api.runtime.config.current()
165
+ : undefined;
166
+ const live = resolveLivePluginConfigObject(runtimeLoader, "xmemo-memory", api.pluginConfig);
167
+ if (!live) {
168
+ return startupConfig;
169
+ }
170
+ return {
171
+ ...startupConfig,
172
+ autoCapture: live.autoCapture ?? startupConfig.autoCapture,
173
+ captureMaxChars: live.captureMaxChars ?? startupConfig.captureMaxChars,
174
+ customTriggers: Array.isArray(live.customTriggers)
175
+ ? live.customTriggers
176
+ : startupConfig.customTriggers,
177
+ };
178
+ }
179
+ function buildClient(cfg) {
180
+ if (!cfg.apiKey) {
181
+ return null;
182
+ }
183
+ return new XMemoClient(cfg.baseUrl, cfg.apiKey, cfg.agentId, cfg.agentInstanceId, cfg.authMode);
184
+ }
185
+ export function registerXMemoAutoCapture(api) {
186
+ const startupConfig = resolveXMemoMemoryConfig(api.config);
187
+ api.on("agent_end", async (event, ctx) => {
188
+ const cfg = resolveCurrentConfig(api, startupConfig);
189
+ if (!cfg.autoCapture) {
190
+ return;
191
+ }
192
+ if (!event.success || !event.messages || event.messages.length === 0) {
193
+ return;
194
+ }
195
+ const client = buildClient(cfg);
196
+ if (!client) {
197
+ return;
198
+ }
199
+ const cursorKey = ctx.sessionKey ?? ctx.sessionId;
200
+ const startIndex = resolveStartIndex(event.messages, cursorKey ? CURSORS.get(cursorKey) : undefined);
201
+ let stored = 0;
202
+ let capturableSeen = 0;
203
+ for (let index = startIndex; index < event.messages.length; index += 1) {
204
+ const message = event.messages[index];
205
+ let messageProcessed = false;
206
+ try {
207
+ for (const text of extractUserTextContent(message)) {
208
+ const sanitized = sanitizeForCapture(text);
209
+ if (!sanitized ||
210
+ !shouldCapture(sanitized, {
211
+ maxChars: cfg.captureMaxChars,
212
+ customTriggers: cfg.customTriggers,
213
+ })) {
214
+ continue;
215
+ }
216
+ capturableSeen += 1;
217
+ if (capturableSeen > 3) {
218
+ continue;
219
+ }
220
+ const category = detectCategory(sanitized);
221
+ try {
222
+ const controller = new AbortController();
223
+ const timeout = setTimeout(() => controller.abort(), 10_000);
224
+ try {
225
+ await client.remember({
226
+ content: sanitized,
227
+ path: cfg.bucket,
228
+ bucket: cfg.bucket,
229
+ scope: cfg.scope ?? null,
230
+ team_id: cfg.teamId ?? null,
231
+ memory_type: "auto",
232
+ importance: 0.7,
233
+ source: "openclaw-auto-capture",
234
+ metadata: { category },
235
+ }, controller.signal);
236
+ stored += 1;
237
+ }
238
+ finally {
239
+ clearTimeout(timeout);
240
+ }
241
+ }
242
+ catch (err) {
243
+ api.logger.warn(`xmemo-memory: auto-capture store failed: ${String(err)}`);
244
+ }
245
+ }
246
+ messageProcessed = true;
247
+ }
248
+ finally {
249
+ if (messageProcessed && cursorKey) {
250
+ CURSORS.set(cursorKey, {
251
+ nextIndex: index + 1,
252
+ lastMessageFingerprint: messageFingerprint(message),
253
+ });
254
+ }
255
+ }
256
+ }
257
+ if (stored > 0) {
258
+ api.logger.info(`xmemo-memory: auto-captured ${stored} memories`);
259
+ }
260
+ });
261
+ api.on("session_end", (_event, ctx) => {
262
+ const cursorKey = ctx.sessionKey ?? ctx.sessionId;
263
+ if (cursorKey) {
264
+ CURSORS.delete(cursorKey);
265
+ }
266
+ });
267
+ }
@@ -0,0 +1,2 @@
1
+ import type { OpenClawPluginApi } from "openclaw/plugin-sdk/memory-core-host-runtime-core";
2
+ export declare function registerXMemoCli(api: OpenClawPluginApi): void;
@@ -0,0 +1,73 @@
1
+ // XMemo plugin CLI commands.
2
+ import { XMemoClient } from "./client.js";
3
+ import { resolveXMemoMemoryConfig } from "./config.js";
4
+ import { XMemoSearchManager } from "./search-manager.js";
5
+ export function registerXMemoCli(api) {
6
+ api.registerCli(({ program }) => {
7
+ const xmemo = program.command("xmemo").description("XMemo memory commands for OpenClaw");
8
+ xmemo
9
+ .command("status")
10
+ .description("Show XMemo memory backend status")
11
+ .option("--json", "Output machine-readable JSON")
12
+ .action(async (opts) => {
13
+ const cfg = resolveXMemoMemoryConfig(api.config);
14
+ const configured = Boolean(cfg.apiKey);
15
+ let connected = false;
16
+ let lastError;
17
+ if (configured) {
18
+ const client = new XMemoClient(cfg.baseUrl, cfg.apiKey, cfg.agentId, cfg.agentInstanceId, cfg.authMode);
19
+ const manager = new XMemoSearchManager(client, cfg);
20
+ const controller = new AbortController();
21
+ const timeout = setTimeout(() => controller.abort(), 10_000);
22
+ try {
23
+ connected = await manager.probeConnectivity(controller.signal);
24
+ }
25
+ finally {
26
+ clearTimeout(timeout);
27
+ }
28
+ const status = manager.status();
29
+ if (status.custom && typeof status.custom.lastError === "string") {
30
+ lastError = status.custom.lastError;
31
+ }
32
+ }
33
+ const status = {
34
+ backend: "xmemo",
35
+ provider: "xmemo-memory",
36
+ configured,
37
+ connected,
38
+ baseUrl: cfg.baseUrl,
39
+ bucket: cfg.bucket,
40
+ scope: cfg.scope,
41
+ teamId: cfg.teamId,
42
+ agentId: cfg.agentId,
43
+ agentInstanceId: cfg.agentInstanceId,
44
+ autoCapture: cfg.autoCapture,
45
+ ...(lastError ? { lastError } : {}),
46
+ };
47
+ if (opts.json) {
48
+ console.log(JSON.stringify(status, null, 2));
49
+ }
50
+ else {
51
+ console.log(`XMemo memory backend: ${configured ? "configured" : "not configured"}`);
52
+ console.log(` Connected: ${connected ? "yes" : "no"}`);
53
+ console.log(` Base URL: ${status.baseUrl}`);
54
+ console.log(` Bucket: ${status.bucket}`);
55
+ if (status.scope) {
56
+ console.log(` Scope: ${status.scope}`);
57
+ }
58
+ if (status.teamId) {
59
+ console.log(` Team: ${status.teamId}`);
60
+ }
61
+ console.log(` Agent: ${status.agentId}`);
62
+ console.log(` Auto capture: ${status.autoCapture}`);
63
+ if (lastError) {
64
+ console.log(` Last error: ${lastError}`);
65
+ }
66
+ }
67
+ });
68
+ }, {
69
+ descriptors: [
70
+ { name: "xmemo", description: "XMemo memory commands for OpenClaw", hasSubcommands: true },
71
+ ],
72
+ });
73
+ }
@@ -0,0 +1,253 @@
1
+ import type { XMemoAuthMode } from "./config.js";
2
+ export type XMemoRememberRequest = {
3
+ content: string;
4
+ path?: string;
5
+ bucket?: string;
6
+ scope?: string | null;
7
+ team_id?: string | null;
8
+ memory_type?: "auto" | "semantic" | "episodic" | "procedural" | "working" | "identity";
9
+ semantic_key?: string | null;
10
+ importance?: number;
11
+ confidence?: number;
12
+ expires_at?: string | null;
13
+ source?: string | null;
14
+ metadata?: Record<string, unknown>;
15
+ provenance?: Record<string, unknown>;
16
+ };
17
+ export type XMemoRememberResponse = {
18
+ id: string;
19
+ status?: string;
20
+ };
21
+ export type XMemoRecallContextRequest = {
22
+ query: string;
23
+ path?: string;
24
+ bucket?: string;
25
+ scope?: string | null;
26
+ team_id?: string | null;
27
+ memory_type?: string;
28
+ status?: string;
29
+ threshold?: number;
30
+ max_items?: number;
31
+ max_tokens?: number;
32
+ prefer_working?: boolean;
33
+ };
34
+ export type XMemoRecallContextItem = {
35
+ id: string;
36
+ content: string;
37
+ snippet?: string;
38
+ path?: string;
39
+ bucket?: string;
40
+ scope?: string | null;
41
+ score?: number;
42
+ memory_type?: string;
43
+ updated_at?: string;
44
+ };
45
+ export type XMemoRecallContextResponse = {
46
+ items: XMemoRecallContextItem[];
47
+ context_text?: string;
48
+ budget?: {
49
+ tokens?: number;
50
+ items?: number;
51
+ };
52
+ coverage?: unknown;
53
+ agent_boundary?: unknown;
54
+ };
55
+ export type XMemoSearchMemoryRequest = {
56
+ query: string;
57
+ path?: string;
58
+ bucket?: string;
59
+ scope?: string | null;
60
+ team_id?: string | null;
61
+ max_items?: number;
62
+ threshold?: number;
63
+ };
64
+ export type XMemoSearchMemoryResult = {
65
+ id: string;
66
+ content: string;
67
+ path?: string;
68
+ bucket?: string;
69
+ scope?: string | null;
70
+ score?: number;
71
+ memory_type?: string;
72
+ };
73
+ export type XMemoSearchMemoryResponse = {
74
+ results: XMemoSearchMemoryResult[];
75
+ coverage?: unknown;
76
+ agent_boundary?: unknown;
77
+ };
78
+ export type XMemoMemory = {
79
+ id: string;
80
+ content: string;
81
+ path?: string;
82
+ bucket?: string;
83
+ scope?: string | null;
84
+ memory_type?: string;
85
+ status?: string;
86
+ importance?: number;
87
+ confidence?: number;
88
+ updated_at?: string;
89
+ created_at?: string;
90
+ };
91
+ export type XMemoUpdateMemoryRequest = {
92
+ content?: string | null;
93
+ path?: string | null;
94
+ bucket?: string | null;
95
+ scope?: string | null;
96
+ team_id?: string | null;
97
+ memory_type?: string | null;
98
+ status?: string | null;
99
+ importance?: number;
100
+ confidence?: number;
101
+ metadata?: Record<string, unknown>;
102
+ merge_metadata?: boolean;
103
+ merge_provenance?: boolean;
104
+ detect_conflicts?: boolean;
105
+ };
106
+ export type XMemoForgetMemoryRequest = {
107
+ mode?: "soft_delete" | "hard_delete" | "redact";
108
+ reason?: string | null;
109
+ replacement_content?: string | null;
110
+ };
111
+ export type XMemoReminderRequest = {
112
+ content: string;
113
+ bucket?: string;
114
+ scope?: string | null;
115
+ team_id?: string | null;
116
+ due_at?: string | null;
117
+ metadata?: Record<string, unknown>;
118
+ };
119
+ export type XMemoReminder = {
120
+ id: string;
121
+ content: string;
122
+ status?: string;
123
+ due_at?: string;
124
+ };
125
+ export type XMemoReminderListResponse = {
126
+ reminders: XMemoReminder[];
127
+ };
128
+ export type XMemoTimelineEventRequest = {
129
+ content: string;
130
+ event_type?: string;
131
+ bucket?: string;
132
+ scope?: string | null;
133
+ team_id?: string | null;
134
+ session_id?: string | null;
135
+ occurred_at?: string | null;
136
+ importance?: number;
137
+ confidence?: number;
138
+ source?: string | null;
139
+ metadata?: Record<string, unknown>;
140
+ };
141
+ export type XMemoTimelineEvent = {
142
+ id: string;
143
+ content: string;
144
+ event_type?: string;
145
+ occurred_at?: string;
146
+ };
147
+ export type XMemoRestartSnapshotRequest = {
148
+ label?: string | null;
149
+ bucket?: string;
150
+ scope?: string | null;
151
+ team_id?: string | null;
152
+ metadata?: Record<string, unknown>;
153
+ };
154
+ export type XMemoRestartSnapshot = {
155
+ id: string;
156
+ label?: string | null;
157
+ created_at?: string;
158
+ };
159
+ export type XMemoRestartRestoreRequest = {
160
+ snapshot_id?: string | null;
161
+ bucket?: string;
162
+ scope?: string | null;
163
+ team_id?: string | null;
164
+ };
165
+ export type XMemoRestartRestoreResponse = {
166
+ id?: string;
167
+ memory_id?: string;
168
+ status?: string;
169
+ restored?: boolean;
170
+ snapshot_id?: string;
171
+ };
172
+ export type XMemoLedgerMonthlySummaryParams = {
173
+ month?: number;
174
+ year?: number;
175
+ currency?: string;
176
+ };
177
+ export type XMemoLedgerMonthlySummary = {
178
+ month: string;
179
+ currency: string;
180
+ total: number;
181
+ count: number;
182
+ };
183
+ export type XMemoAuditEvent = {
184
+ id: string;
185
+ action: string;
186
+ target_id?: string;
187
+ created_at?: string;
188
+ };
189
+ export type XMemoAuditEventsParams = {
190
+ action?: string;
191
+ target_id?: string;
192
+ limit?: number;
193
+ since?: string;
194
+ until?: string;
195
+ };
196
+ export type XMemoAuditEventsResponse = {
197
+ events: XMemoAuditEvent[];
198
+ };
199
+ export type XMemoAuditConsolidationParams = {
200
+ action_type?: string;
201
+ limit?: number;
202
+ since?: string;
203
+ until?: string;
204
+ };
205
+ export type XMemoAuditConsolidationResponse = Record<string, unknown>;
206
+ export type XMemoTokenValidateResponse = {
207
+ status: "valid";
208
+ scopes?: string[];
209
+ setup_state?: string;
210
+ };
211
+ /** Structured HTTP error from the XMemo REST client. */
212
+ export declare class XMemoClientError extends Error {
213
+ readonly status?: number | undefined;
214
+ readonly pathname?: string | undefined;
215
+ constructor(message: string, status?: number | undefined, pathname?: string | undefined);
216
+ }
217
+ export declare class XMemoClient {
218
+ private readonly baseUrl;
219
+ private readonly apiKey;
220
+ private readonly agentId;
221
+ private readonly agentInstanceId;
222
+ private readonly authMode;
223
+ constructor(baseUrl: string, apiKey: string, agentId: string, agentInstanceId: string, authMode?: XMemoAuthMode);
224
+ isConfigured(): boolean;
225
+ private headers;
226
+ private request;
227
+ private buildSearchParams;
228
+ remember(request: XMemoRememberRequest, signal?: AbortSignal): Promise<XMemoRememberResponse>;
229
+ validateToken(signal?: AbortSignal): Promise<XMemoTokenValidateResponse>;
230
+ recallContext(request: XMemoRecallContextRequest, signal?: AbortSignal): Promise<XMemoRecallContextResponse>;
231
+ searchMemory(request: XMemoSearchMemoryRequest, signal?: AbortSignal): Promise<XMemoSearchMemoryResponse>;
232
+ getMemory(id: string, signal?: AbortSignal): Promise<XMemoMemory>;
233
+ updateMemory(id: string, request: XMemoUpdateMemoryRequest, signal?: AbortSignal): Promise<XMemoMemory>;
234
+ forgetMemory(id: string, request?: XMemoForgetMemoryRequest, signal?: AbortSignal): Promise<unknown>;
235
+ createReminder(request: XMemoReminderRequest, signal?: AbortSignal): Promise<XMemoReminder>;
236
+ listReminders(params?: {
237
+ bucket?: string;
238
+ scope?: string | null;
239
+ item_status?: string;
240
+ }, signal?: AbortSignal): Promise<XMemoReminderListResponse>;
241
+ completeReminder(id: string, signal?: AbortSignal): Promise<XMemoReminder>;
242
+ recordEvent(request: XMemoTimelineEventRequest, signal?: AbortSignal): Promise<XMemoTimelineEvent>;
243
+ getTimeline(params?: {
244
+ bucket?: string;
245
+ scope?: string | null;
246
+ limit?: number;
247
+ }, signal?: AbortSignal): Promise<XMemoTimelineEvent[]>;
248
+ saveRestartSnapshot(request: XMemoRestartSnapshotRequest, signal?: AbortSignal): Promise<XMemoRestartSnapshot>;
249
+ restoreRestartSnapshot(request?: XMemoRestartRestoreRequest, signal?: AbortSignal): Promise<XMemoRestartRestoreResponse>;
250
+ getLedgerMonthlySummary(params?: XMemoLedgerMonthlySummaryParams, signal?: AbortSignal): Promise<XMemoLedgerMonthlySummary>;
251
+ getAuditEvents(params?: XMemoAuditEventsParams, signal?: AbortSignal): Promise<XMemoAuditEventsResponse>;
252
+ getAuditConsolidation(params?: XMemoAuditConsolidationParams, signal?: AbortSignal): Promise<XMemoAuditConsolidationResponse>;
253
+ }