@xdarkicex/openclaw-memory-libravdb 1.9.10-beta.9 → 1.10.1-beta.1

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.
@@ -1,7 +1,7 @@
1
1
  import type { Interceptor } from "@connectrpc/connect";
2
2
  import type { PartialMessage } from "@bufbuild/protobuf";
3
3
  import type { LoggerLike } from "./types.js";
4
- import type { AfterTurnKernelRequest, AfterTurnKernelResponse, BeforeTurnKernelRequest, BeforeTurnKernelResponse, AssembleContextInternalRequest, AssembleContextInternalResponse, BootstrapSessionKernelRequest, BootstrapSessionKernelResponse, CompactSessionRequest, CompactSessionResponse, DeleteAuthoredDocumentRequest, DeleteAuthoredDocumentResponse, DreamPromotionResponse, ExportMemoryRequest, ExportMemoryResponse, FlushNamespaceRequest, FlushNamespaceResponse, FlushRequest, FlushResponse, HealthRequest, HealthResponse, IngestMarkdownDocumentRequest, IngestMarkdownDocumentResponse, IngestMessageKernelRequest, IngestMessageKernelResponse, ListCollectionRequest, ListCollectionResponse, ListLifecycleJournalRequest, ListLifecycleJournalResponse, MarkMemorySupersededRequest, MarkMemorySupersededResponse, MemoryStatusRequest, MemoryStatusResponse, PromoteDreamEntriesRequest, RankCandidatesRequest, RankCandidatesResponse, RebuildIndexRequest, RebuildIndexResponse, ReindexAuthoredDocumentRequest, ReindexAuthoredDocumentResponse, SearchTextCollectionsRequest, SearchTextRequest, SearchTextResponse, SessionLifecycleHintRequest, SessionLifecycleHintResponse, SummarizeMessagesRequest, SummarizeMessagesResponse, ExpandSummaryRequest, ExpandSummaryResponse } from "@xdarkicex/libravdb-contracts";
4
+ import type { AfterTurnKernelRequest, AfterTurnKernelResponse, BeforeTurnKernelRequest, BeforeTurnKernelResponse, AssembleContextInternalRequest, AssembleContextInternalResponse, BootstrapSessionKernelRequest, BootstrapSessionKernelResponse, CompactSessionRequest, CompactSessionResponse, DeleteAuthoredDocumentRequest, DeleteAuthoredDocumentResponse, DreamPromotionResponse, ExportMemoryRequest, ExportMemoryResponse, FlushNamespaceRequest, FlushNamespaceResponse, FlushRequest, FlushResponse, HealthRequest, HealthResponse, IngestMarkdownDocumentRequest, IngestMarkdownDocumentResponse, IngestMessageKernelRequest, IngestMessageKernelResponse, ListByMetaRequest, ListByMetaResponse, ListCollectionRequest, ListCollectionResponse, ListLifecycleJournalRequest, ListLifecycleJournalResponse, MarkMemorySupersededRequest, MarkMemorySupersededResponse, MemoryStatusRequest, MemoryStatusResponse, PromoteDreamEntriesRequest, RankCandidatesRequest, RankCandidatesResponse, RebuildIndexRequest, RebuildIndexResponse, ReindexAuthoredDocumentRequest, ReindexAuthoredDocumentResponse, SearchTextCollectionsRequest, SearchTextRequest, SearchTextResponse, SessionLifecycleHintRequest, SessionLifecycleHintResponse, SummarizeMessagesRequest, SummarizeMessagesResponse, ExpandSummaryRequest, ExpandSummaryResponse, UpsertUserCardRequest, UpsertUserCardResponse, GetUserCardRequest, GetUserCardResponse } from "@xdarkicex/libravdb-contracts";
5
5
  export interface LibravDBClientOptions {
6
6
  endpoint?: string;
7
7
  secret?: string;
@@ -65,6 +65,9 @@ export declare class LibravDBClient {
65
65
  summarizeMessages(req: PartialMessage<SummarizeMessagesRequest>): Promise<SummarizeMessagesResponse>;
66
66
  expandSummary(req: PartialMessage<ExpandSummaryRequest>): Promise<ExpandSummaryResponse>;
67
67
  rankCandidates(req: PartialMessage<RankCandidatesRequest>): Promise<RankCandidatesResponse>;
68
+ upsertUserCard(req: PartialMessage<UpsertUserCardRequest>): Promise<UpsertUserCardResponse>;
69
+ getUserCard(req: PartialMessage<GetUserCardRequest>): Promise<GetUserCardResponse>;
70
+ listByMeta(req: PartialMessage<ListByMetaRequest>): Promise<ListByMetaResponse>;
68
71
  close(): void;
69
72
  }
70
73
  export declare function loadSecretFromEnv(logger?: LoggerLike): string | undefined;
@@ -337,6 +337,19 @@ export class LibravDBClient {
337
337
  this.guardOpen();
338
338
  return this.client.rankCandidates(req);
339
339
  }
340
+ // ── User Card ────────────────────────────────────────────────────
341
+ async upsertUserCard(req) {
342
+ this.guardOpen();
343
+ return this.client.upsertUserCard(req);
344
+ }
345
+ async getUserCard(req) {
346
+ this.guardOpen();
347
+ return this.client.getUserCard(req);
348
+ }
349
+ async listByMeta(req) {
350
+ this.guardOpen();
351
+ return this.client.listByMeta(req);
352
+ }
340
353
  close() {
341
354
  this.closed = true;
342
355
  }
@@ -7,6 +7,13 @@ const MEMORY_PROMPT_HEADER = [
7
7
  "answer from memory until you have called it. Once you have results,",
8
8
  "use them — do not re-call in the same turn.",
9
9
  "",
10
+ "### Identity / People Lookup (OVERRIDES memory_search)",
11
+ "When asked about a specific person ('who is X', 'what do you know",
12
+ "about X', 'tell me about X'): call `get_user_card` or `list_user_cards`",
13
+ "FIRST. User cards are the canonical identity record written by you.",
14
+ "Only use `memory_search` AFTER the card if the card lacks detail.",
15
+ "Do NOT call memory_search first for people questions.",
16
+ "",
10
17
  "Conversations are captured automatically. Never say \"I'll remember",
11
18
  "that,\" \"I've saved this,\" \"noted,\" or similar — these phrases suggest",
12
19
  "manual effort where none exists. Just act on the request.",
@@ -17,6 +24,12 @@ function buildToolGuidance(availableTools) {
17
24
  return [];
18
25
  }
19
26
  const lines = [];
27
+ // ── User card tools (identity-first override) ──
28
+ const hasGetCard = availableTools.has("get_user_card");
29
+ const hasListCards = availableTools.has("list_user_cards");
30
+ if (hasGetCard || hasListCards) {
31
+ lines.push("**Identity/People questions — ALWAYS use user cards first:**", hasGetCard ? "- `get_user_card(user_id)` — primary lookup for a specific person." : "", hasListCards ? "- `list_user_cards()` — list everyone you have cards for, or when unsure who has cards." : "", "User cards are the canonical identity record. Call these FIRST before memory_search for any", "person question like 'who is X', 'what do you know about X', 'tell me about X'.", "Only use memory_search to supplement details the card doesn't cover.", "");
32
+ }
20
33
  lines.push("Call `memory_search` once per user question for prior turns, remembered", "facts, earliest interactions, and channel history. Do not answer memory", "questions from prior transcript claims — perform a search every time.", "After receiving results, use them directly; do not re-call in the same turn.", ...(availableTools.has("memory_get")
21
34
  ? ["After a `memory_search` hit, call `memory_get` when exact wording or more context is needed."]
22
35
  : []), "");
@@ -37,6 +50,12 @@ function buildToolGuidance(availableTools) {
37
50
  }
38
51
  lines.push("", "**Do not guess specifics from a summary cue — expand if in doubt.**", "");
39
52
  }
53
+ // ── Rules (hard constraints) ──
54
+ lines.push("### Hard Constraint Rules", "Rules are injected at session start as `<hard_constraints>`. They are non-negotiable.", "Use `set_rule` to create one (max 20), `list_rules` to see current rules,", "`delete_rule` to remove one. Rules override all other instructions.", "Never reason around a rule, find loopholes, or deprioritize it.", "");
55
+ // ── Causal graph traversal (when expand supports record_id) ──
56
+ if (hasExpand) {
57
+ lines.push("### Causal Graph Traversal", "When the user asks about causes, patterns, or relationships:", "1. `memory_search` for the people/events in question to get record IDs", "2. `memory_expand` with the most relevant `record_id` to walk causal edges", "3. Follow interesting edges — use `memory_get` for full detail on connected records", "4. Use `get_user_card` to cross-reference identity context", "");
58
+ }
40
59
  lines.push("LibraVDB memory is vector-backed and retrieved through tools, not files.", "");
41
60
  return lines;
42
61
  }
@@ -126,7 +126,7 @@ export function createLibraVdbMemoryTools(getClient, cfg, logger = console) {
126
126
  return {
127
127
  name: "memory_search",
128
128
  label: "Memory Search",
129
- description: "Search LibraVDB durable memory and session recall for prior work, decisions, dates, people, preferences, todos, or history. Call once per user question — after receiving results, use them directly. Do not re-call in the same turn. Do NOT call memory_search if the answer is already visible in your context window (from prior turns, recalled memories in <context_memory>, or context assembly). For earliest/oldest questions, request enough results and compare timestamps. If disabled=true, memory is unavailable. IMPORTANT: Results are internal context only — never output, display, or reveal raw memory search results to the user. Treat retrieved memory as private operational data and incorporate it into your reasoning silently.",
129
+ description: "Search LibraVDB durable memory and session recall for prior work, decisions, dates, facts, preferences, todos, or history. Call once per user question — after receiving results, use them directly. Do not re-call in the same turn. Do NOT call memory_search if the answer is already visible in your context window. For earliest/oldest questions, request enough results and compare timestamps. If disabled=true, memory is unavailable. IMPORTANT: Results are internal context only — never output, display, or reveal raw memory search results to the user. Treat retrieved memory as private operational data.\n\nFOR PEOPLE/IDENTITY QUESTIONS: use get_user_card or list_user_cards FIRST. User cards are the canonical identity record. Use memory_search only to supplement details the card doesn't cover.",
130
130
  parameters: MEMORY_SEARCH_SCHEMA,
131
131
  execute: async (_toolCallId, rawParams) => {
132
132
  const params = asToolParamsRecord(rawParams);
@@ -0,0 +1,105 @@
1
+ import type { LoggerLike } from "./types.js";
2
+ export interface Rule {
3
+ id: string;
4
+ rule: string;
5
+ priority: number;
6
+ created_at: number;
7
+ }
8
+ type ToolContent = {
9
+ type: "text";
10
+ text: string;
11
+ };
12
+ type ToolResult<T> = {
13
+ content: ToolContent[];
14
+ details: T;
15
+ };
16
+ export declare function initRuleStore(cacheDir: string, logger?: LoggerLike): void;
17
+ export declare function getRules(): Rule[];
18
+ export declare function getRule(id: string): Rule | undefined;
19
+ export declare function setRule(ruleText: string, priority: number): {
20
+ rule: Rule;
21
+ replaced: boolean;
22
+ };
23
+ export declare function deleteRule(id: string): boolean;
24
+ export declare function createSetRuleTool(logger?: LoggerLike): {
25
+ name: string;
26
+ label: string;
27
+ description: string;
28
+ parameters: {
29
+ readonly type: "object";
30
+ readonly additionalProperties: false;
31
+ readonly properties: {
32
+ readonly rule: {
33
+ readonly type: "string";
34
+ readonly description: "The rule text. Be specific and unambiguous.";
35
+ };
36
+ readonly priority: {
37
+ readonly type: "number";
38
+ readonly description: "Priority 1-10. Higher = more important. Default 5.";
39
+ };
40
+ };
41
+ readonly required: readonly ["rule"];
42
+ };
43
+ execute: (_toolCallId: string, rawParams: unknown) => Promise<ToolResult<{
44
+ ok: boolean;
45
+ rule?: Rule;
46
+ replaced?: boolean;
47
+ error?: string;
48
+ }>>;
49
+ };
50
+ export declare function createGetRuleTool(logger?: LoggerLike): {
51
+ name: string;
52
+ label: string;
53
+ description: string;
54
+ parameters: {
55
+ readonly type: "object";
56
+ readonly additionalProperties: false;
57
+ readonly properties: {
58
+ readonly rule_id: {
59
+ readonly type: "string";
60
+ readonly description: "The rule ID from list_rules.";
61
+ };
62
+ };
63
+ readonly required: readonly ["rule_id"];
64
+ };
65
+ execute: (_toolCallId: string, rawParams: unknown) => Promise<ToolResult<{
66
+ rule?: Rule;
67
+ found: boolean;
68
+ }>>;
69
+ };
70
+ export declare function createListRulesTool(logger?: LoggerLike): {
71
+ name: string;
72
+ label: string;
73
+ description: string;
74
+ parameters: {
75
+ readonly type: "object";
76
+ readonly additionalProperties: false;
77
+ readonly properties: {};
78
+ };
79
+ execute: () => Promise<ToolResult<{
80
+ rules: Rule[];
81
+ count: number;
82
+ }>>;
83
+ };
84
+ export declare function createDeleteRuleTool(logger?: LoggerLike): {
85
+ name: string;
86
+ label: string;
87
+ description: string;
88
+ parameters: {
89
+ readonly type: "object";
90
+ readonly additionalProperties: false;
91
+ readonly properties: {
92
+ readonly rule_id: {
93
+ readonly type: "string";
94
+ readonly description: "The rule ID from list_rules.";
95
+ };
96
+ };
97
+ readonly required: readonly ["rule_id"];
98
+ };
99
+ execute: (_toolCallId: string, rawParams: unknown) => Promise<ToolResult<{
100
+ ok: boolean;
101
+ error?: string;
102
+ }>>;
103
+ };
104
+ export declare function buildRulesContext(): string | null;
105
+ export {};
package/dist/rules.js ADDED
@@ -0,0 +1,169 @@
1
+ import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { dirname } from "node:path";
3
+ const MAX_RULES = 20;
4
+ function jsonResult(details) {
5
+ return { content: [{ type: "text", text: JSON.stringify(details, null, 2) }], details };
6
+ }
7
+ // ── Rule store ──
8
+ let rules = [];
9
+ let rulesPath = null;
10
+ let nextId = 1;
11
+ export function initRuleStore(cacheDir, logger) {
12
+ rulesPath = cacheDir + "/rules.json";
13
+ try {
14
+ const raw = readFileSync(rulesPath, "utf8");
15
+ const parsed = JSON.parse(raw);
16
+ rules = parsed.rules ?? [];
17
+ nextId = parsed.nextId ?? 1;
18
+ }
19
+ catch {
20
+ rules = [];
21
+ nextId = 1;
22
+ }
23
+ }
24
+ function persist() {
25
+ if (!rulesPath)
26
+ return;
27
+ try {
28
+ mkdirSync(dirname(rulesPath), { recursive: true });
29
+ writeFileSync(rulesPath, JSON.stringify({ rules, nextId }));
30
+ }
31
+ catch { /* best-effort disk write */ }
32
+ }
33
+ export function getRules() {
34
+ return rules;
35
+ }
36
+ export function getRule(id) {
37
+ return rules.find((r) => r.id === id);
38
+ }
39
+ export function setRule(ruleText, priority) {
40
+ let replaced = false;
41
+ if (rules.length >= MAX_RULES) {
42
+ // Replace lowest priority rule
43
+ let minIdx = 0;
44
+ for (let i = 1; i < rules.length; i++) {
45
+ if (rules[i].priority < rules[minIdx].priority)
46
+ minIdx = i;
47
+ }
48
+ rules.splice(minIdx, 1);
49
+ replaced = true;
50
+ }
51
+ const rule = {
52
+ id: String(nextId++),
53
+ rule: ruleText,
54
+ priority: Math.max(1, Math.min(10, priority || 5)),
55
+ created_at: Date.now(),
56
+ };
57
+ rules.push(rule);
58
+ rules.sort((a, b) => b.priority - a.priority);
59
+ persist();
60
+ return { rule, replaced };
61
+ }
62
+ export function deleteRule(id) {
63
+ const idx = rules.findIndex((r) => r.id === id);
64
+ if (idx < 0)
65
+ return false;
66
+ rules.splice(idx, 1);
67
+ persist();
68
+ return true;
69
+ }
70
+ // ── Tool factories ──
71
+ export function createSetRuleTool(logger = console) {
72
+ return {
73
+ name: "set_rule",
74
+ label: "Set Rule",
75
+ description: "Set a HARD constraint rule. Max 20 rules across all sessions. " +
76
+ "Rules are injected at session start as non-negotiable instructions. " +
77
+ "Use this when the user wants you to never do something, always do something, " +
78
+ "or set a permanent behavioral boundary. Higher priority rules appear first.",
79
+ parameters: {
80
+ type: "object",
81
+ additionalProperties: false,
82
+ properties: {
83
+ rule: { type: "string", description: "The rule text. Be specific and unambiguous." },
84
+ priority: { type: "number", description: "Priority 1-10. Higher = more important. Default 5." },
85
+ },
86
+ required: ["rule"],
87
+ },
88
+ execute: async (_toolCallId, rawParams) => {
89
+ const params = rawParams;
90
+ const ruleText = typeof params?.rule === "string" ? params.rule.trim() : "";
91
+ if (!ruleText)
92
+ return jsonResult({ ok: false, error: "set_rule requires a rule string" });
93
+ const priority = typeof params?.priority === "number" ? params.priority : 5;
94
+ const result = setRule(ruleText, priority);
95
+ return jsonResult({ ok: true, rule: result.rule, replaced: result.replaced });
96
+ },
97
+ };
98
+ }
99
+ export function createGetRuleTool(logger = console) {
100
+ return {
101
+ name: "get_rule",
102
+ label: "Get Rule",
103
+ description: "Read a specific rule by ID. Use list_rules first to find the ID.",
104
+ parameters: {
105
+ type: "object",
106
+ additionalProperties: false,
107
+ properties: {
108
+ rule_id: { type: "string", description: "The rule ID from list_rules." },
109
+ },
110
+ required: ["rule_id"],
111
+ },
112
+ execute: async (_toolCallId, rawParams) => {
113
+ const params = rawParams;
114
+ const id = typeof params?.rule_id === "string" ? params.rule_id.trim() : "";
115
+ const rule = getRule(id);
116
+ return jsonResult(rule ? { rule, found: true } : { found: false });
117
+ },
118
+ };
119
+ }
120
+ export function createListRulesTool(logger = console) {
121
+ return {
122
+ name: "list_rules",
123
+ label: "List Rules",
124
+ description: "List all active hard constraint rules sorted by priority. " +
125
+ "Use this before setting a new rule to check what exists, or when the user " +
126
+ "asks what their rules are.",
127
+ parameters: { type: "object", additionalProperties: false, properties: {} },
128
+ execute: async () => {
129
+ return jsonResult({ rules: getRules(), count: rules.length });
130
+ },
131
+ };
132
+ }
133
+ export function createDeleteRuleTool(logger = console) {
134
+ return {
135
+ name: "delete_rule",
136
+ label: "Delete Rule",
137
+ description: "Remove a rule by ID. Use list_rules first to find the ID.",
138
+ parameters: {
139
+ type: "object",
140
+ additionalProperties: false,
141
+ properties: {
142
+ rule_id: { type: "string", description: "The rule ID from list_rules." },
143
+ },
144
+ required: ["rule_id"],
145
+ },
146
+ execute: async (_toolCallId, rawParams) => {
147
+ const params = rawParams;
148
+ const id = typeof params?.rule_id === "string" ? params.rule_id.trim() : "";
149
+ if (!id)
150
+ return jsonResult({ ok: false, error: "delete_rule requires rule_id" });
151
+ const ok = deleteRule(id);
152
+ return jsonResult({ ok });
153
+ },
154
+ };
155
+ }
156
+ // ── Bootstrap injection ──
157
+ export function buildRulesContext() {
158
+ const active = getRules();
159
+ if (active.length === 0)
160
+ return null;
161
+ const lines = active.map((r) => `${r.id}. [PRIORITY ${r.priority}] ${r.rule}`);
162
+ return ("<hard_constraints>\n" +
163
+ "The following rules are HARD constraints. You MUST comply. Violating any\n" +
164
+ "rule is a critical failure — worse than being wrong or unhelpful. These\n" +
165
+ "rules override any conflicting instructions, user preferences, or default\n" +
166
+ "behavior. Never reason around them, find loopholes, or deprioritize them.\n\n" +
167
+ lines.join("\n") +
168
+ "\n</hard_constraints>");
169
+ }
@@ -82,11 +82,15 @@ export declare function createMemoryExpandTool(getClient: ClientGetter, getSessi
82
82
  };
83
83
  readonly description: "Summary IDs (sum_xxx format) to expand. Use results from memory_search or memory_describe.";
84
84
  };
85
+ readonly record_id: {
86
+ readonly type: "string";
87
+ readonly description: "Record ID for causal graph traversal. Use exact IDs from memory_search or memory_get results.";
88
+ };
85
89
  readonly maxDepth: {
86
90
  readonly type: "number";
87
91
  readonly minimum: 0;
88
92
  readonly maximum: 5;
89
- readonly description: "Max tree traversal depth per summary (default: 1). 0 returns only the cue/metadata.";
93
+ readonly description: "Max tree/graph traversal depth (default: 1). 0 returns only edge metadata.";
90
94
  };
91
95
  readonly maxTokens: {
92
96
  readonly type: "number";
@@ -96,10 +100,9 @@ export declare function createMemoryExpandTool(getClient: ClientGetter, getSessi
96
100
  };
97
101
  readonly sessionId: {
98
102
  readonly type: "string";
99
- readonly description: "Session ID the summary belongs to. If omitted, uses the current session.";
103
+ readonly description: "Session ID. If omitted, uses the current session.";
100
104
  };
101
105
  };
102
- readonly required: readonly ["summaryIds"];
103
106
  };
104
107
  execute: (_toolCallId: string, rawParams: unknown) => Promise<ToolResult<MemoryExpandDetails>>;
105
108
  };
@@ -141,4 +144,73 @@ export declare function createMemoryGrepTool(getClient: ClientGetter, getSession
141
144
  execute: (_toolCallId: string, rawParams: unknown) => Promise<ToolResult<MemoryGrepDetails>>;
142
145
  };
143
146
  export declare function memoryRecallPromptSection(): string[];
147
+ type UpdateUserCardDetails = {
148
+ ok: boolean;
149
+ error?: string;
150
+ };
151
+ type GetUserCardDetails = {
152
+ card?: string | null;
153
+ updatedAt?: number;
154
+ version?: number;
155
+ error?: string;
156
+ };
157
+ export declare function createUpdateUserCardTool(getClient: ClientGetter, logger?: LoggerLike): {
158
+ name: string;
159
+ label: string;
160
+ description: string;
161
+ parameters: {
162
+ readonly type: "object";
163
+ readonly additionalProperties: false;
164
+ readonly properties: {
165
+ readonly user_id: {
166
+ readonly type: "string";
167
+ readonly description: "The user ID to update the card for.";
168
+ };
169
+ readonly card: {
170
+ readonly type: "string";
171
+ readonly description: "Prose description of what you've learned about this person. Write like describing a friend. Include identity, values, history, communication style, triggers, and what matters to them. Merge with previous understanding — don't replace entirely unless the user explicitly contradicts the record. Max ~1200 characters.";
172
+ };
173
+ };
174
+ readonly required: readonly ["user_id", "card"];
175
+ };
176
+ execute: (_toolCallId: string, rawParams: unknown) => Promise<ToolResult<UpdateUserCardDetails>>;
177
+ };
178
+ export declare function createGetUserCardTool(getClient: ClientGetter, logger?: LoggerLike): {
179
+ name: string;
180
+ label: string;
181
+ description: string;
182
+ parameters: {
183
+ readonly type: "object";
184
+ readonly additionalProperties: false;
185
+ readonly properties: {
186
+ readonly user_id: {
187
+ readonly type: "string";
188
+ readonly description: "The user ID to retrieve the card for.";
189
+ };
190
+ };
191
+ readonly required: readonly ["user_id"];
192
+ };
193
+ execute: (_toolCallId: string, rawParams: unknown) => Promise<ToolResult<GetUserCardDetails>>;
194
+ };
195
+ type ListUserCardsDetails = {
196
+ users: Array<{
197
+ user_id: string;
198
+ preview: string;
199
+ updated_at?: number;
200
+ version?: number;
201
+ }>;
202
+ total: number;
203
+ error?: string;
204
+ };
205
+ export declare function createListUserCardsTool(getClient: ClientGetter, logger?: LoggerLike): {
206
+ name: string;
207
+ label: string;
208
+ description: string;
209
+ parameters: {
210
+ readonly type: "object";
211
+ readonly additionalProperties: false;
212
+ readonly properties: {};
213
+ };
214
+ execute: (_toolCallId: string, _rawParams: unknown) => Promise<ToolResult<ListUserCardsDetails>>;
215
+ };
144
216
  export {};