@clawling/clawchat-plugin-openclaw 2026.5.12-28

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 (114) hide show
  1. package/INSTALL.md +64 -0
  2. package/README.md +227 -0
  3. package/dist/index.js +20 -0
  4. package/dist/setup-entry.js +3 -0
  5. package/dist/src/api-client.js +263 -0
  6. package/dist/src/api-types.js +17 -0
  7. package/dist/src/api-types.test-d.js +10 -0
  8. package/dist/src/buffered-stream.js +177 -0
  9. package/dist/src/channel.js +66 -0
  10. package/dist/src/channel.setup.js +119 -0
  11. package/dist/src/clawchat-memory.js +403 -0
  12. package/dist/src/clawchat-metadata.js +310 -0
  13. package/dist/src/client.js +35 -0
  14. package/dist/src/commands.js +35 -0
  15. package/dist/src/config.js +274 -0
  16. package/dist/src/group-message-coalescer.js +119 -0
  17. package/dist/src/inbound.js +170 -0
  18. package/dist/src/llm-context-debug.js +86 -0
  19. package/dist/src/login.runtime.js +204 -0
  20. package/dist/src/media-runtime.js +85 -0
  21. package/dist/src/message-mapper.js +146 -0
  22. package/dist/src/mock-transport.js +31 -0
  23. package/dist/src/outbound.js +628 -0
  24. package/dist/src/plugin-prompts.js +89 -0
  25. package/dist/src/profile-prompt.js +269 -0
  26. package/dist/src/profile-sync.js +110 -0
  27. package/dist/src/prompt-injection.js +25 -0
  28. package/dist/src/protocol-types.js +63 -0
  29. package/dist/src/protocol-types.typecheck.js +1 -0
  30. package/dist/src/protocol.js +33 -0
  31. package/dist/src/reply-dispatcher.js +422 -0
  32. package/dist/src/runtime.js +1254 -0
  33. package/dist/src/storage.js +525 -0
  34. package/dist/src/streaming.js +65 -0
  35. package/dist/src/terminal-send.js +36 -0
  36. package/dist/src/tools-schema.js +208 -0
  37. package/dist/src/tools.js +920 -0
  38. package/dist/src/ws-alignment.js +178 -0
  39. package/dist/src/ws-client.js +588 -0
  40. package/dist/src/ws-log.js +19 -0
  41. package/index.ts +24 -0
  42. package/openclaw.plugin.json +169 -0
  43. package/package.json +80 -0
  44. package/prompts/default-group-bio.md +19 -0
  45. package/prompts/default-owner-behavior.md +27 -0
  46. package/prompts/platform.md +13 -0
  47. package/setup-entry.ts +4 -0
  48. package/skills/clawchat/SKILL.md +91 -0
  49. package/src/api-client.test.ts +827 -0
  50. package/src/api-client.ts +414 -0
  51. package/src/api-types.ts +146 -0
  52. package/src/channel.outbound.test.ts +433 -0
  53. package/src/channel.setup.ts +145 -0
  54. package/src/channel.test.ts +262 -0
  55. package/src/channel.ts +81 -0
  56. package/src/clawchat-memory.test.ts +480 -0
  57. package/src/clawchat-memory.ts +533 -0
  58. package/src/clawchat-metadata.test.ts +477 -0
  59. package/src/clawchat-metadata.ts +429 -0
  60. package/src/client.test.ts +169 -0
  61. package/src/client.ts +56 -0
  62. package/src/commands.test.ts +39 -0
  63. package/src/commands.ts +41 -0
  64. package/src/config.test.ts +344 -0
  65. package/src/config.ts +404 -0
  66. package/src/group-message-coalescer.test.ts +237 -0
  67. package/src/group-message-coalescer.ts +171 -0
  68. package/src/inbound.test.ts +508 -0
  69. package/src/inbound.ts +278 -0
  70. package/src/llm-context-debug.test.ts +55 -0
  71. package/src/llm-context-debug.ts +139 -0
  72. package/src/login.runtime.test.ts +737 -0
  73. package/src/login.runtime.ts +277 -0
  74. package/src/manifest.test.ts +352 -0
  75. package/src/media-runtime.test.ts +207 -0
  76. package/src/media-runtime.ts +152 -0
  77. package/src/message-mapper.test.ts +201 -0
  78. package/src/message-mapper.ts +174 -0
  79. package/src/mock-transport.test.ts +35 -0
  80. package/src/mock-transport.ts +38 -0
  81. package/src/outbound.test.ts +1269 -0
  82. package/src/outbound.ts +803 -0
  83. package/src/plugin-entry.test.ts +38 -0
  84. package/src/plugin-prompts.test.ts +94 -0
  85. package/src/plugin-prompts.ts +107 -0
  86. package/src/profile-prompt.test.ts +274 -0
  87. package/src/profile-prompt.ts +351 -0
  88. package/src/profile-sync.test.ts +539 -0
  89. package/src/profile-sync.ts +191 -0
  90. package/src/prompt-injection.test.ts +39 -0
  91. package/src/prompt-injection.ts +45 -0
  92. package/src/protocol-types.test.ts +69 -0
  93. package/src/protocol-types.ts +296 -0
  94. package/src/protocol-types.typecheck.ts +89 -0
  95. package/src/protocol.test.ts +39 -0
  96. package/src/protocol.ts +42 -0
  97. package/src/reply-dispatcher.test.ts +1324 -0
  98. package/src/reply-dispatcher.ts +555 -0
  99. package/src/runtime.test.ts +4719 -0
  100. package/src/runtime.ts +1493 -0
  101. package/src/scripts.test.ts +85 -0
  102. package/src/storage.test.ts +560 -0
  103. package/src/storage.ts +807 -0
  104. package/src/terminal-send.test.ts +81 -0
  105. package/src/terminal-send.ts +56 -0
  106. package/src/tools-schema.ts +337 -0
  107. package/src/tools.test.ts +933 -0
  108. package/src/tools.ts +1185 -0
  109. package/src/ws-alignment.test.ts +103 -0
  110. package/src/ws-alignment.ts +275 -0
  111. package/src/ws-client.test.ts +1217 -0
  112. package/src/ws-client.ts +662 -0
  113. package/src/ws-log.test.ts +32 -0
  114. package/src/ws-log.ts +31 -0
@@ -0,0 +1,81 @@
1
+ import { describe, expect, it, beforeEach } from "vitest";
2
+ import {
3
+ clearTerminalClawChatSendsForTest,
4
+ consumeTerminalClawChatSend,
5
+ markTerminalClawChatSend,
6
+ runWithTerminalClawChatSendScope,
7
+ } from "./terminal-send.ts";
8
+
9
+ describe("terminal ClawChat send markers", () => {
10
+ beforeEach(() => {
11
+ clearTerminalClawChatSendsForTest();
12
+ });
13
+
14
+ it("consumes a terminal send marker once", () => {
15
+ runWithTerminalClawChatSendScope("scope-1", () => {
16
+ markTerminalClawChatSend({
17
+ accountId: "default",
18
+ chatId: "chat-1",
19
+ messageId: "msg-1",
20
+ nowMs: 1000,
21
+ });
22
+ });
23
+
24
+ expect(runWithTerminalClawChatSendScope("scope-1", () => consumeTerminalClawChatSend({
25
+ accountId: "default",
26
+ chatId: "chat-1",
27
+ nowMs: 1001,
28
+ }))).toEqual({
29
+ messageId: "msg-1",
30
+ expiresAt: 61_000,
31
+ scopeId: "scope-1",
32
+ });
33
+ expect(runWithTerminalClawChatSendScope("scope-1", () => consumeTerminalClawChatSend({
34
+ accountId: "default",
35
+ chatId: "chat-1",
36
+ nowMs: 1002,
37
+ }))).toBeNull();
38
+ });
39
+
40
+ it("does not consume markers from a different scope", () => {
41
+ markTerminalClawChatSend({
42
+ accountId: "default",
43
+ chatId: "chat-1",
44
+ messageId: "msg-1",
45
+ scopeId: "scope-1",
46
+ nowMs: 1000,
47
+ });
48
+
49
+ expect(consumeTerminalClawChatSend({
50
+ accountId: "default",
51
+ chatId: "chat-1",
52
+ scopeId: "scope-2",
53
+ nowMs: 1001,
54
+ })).toBeNull();
55
+
56
+ expect(consumeTerminalClawChatSend({
57
+ accountId: "default",
58
+ chatId: "chat-1",
59
+ scopeId: "scope-1",
60
+ nowMs: 1002,
61
+ })?.messageId).toBe("msg-1");
62
+ });
63
+
64
+ it("ignores expired terminal send markers", () => {
65
+ markTerminalClawChatSend({
66
+ accountId: "default",
67
+ chatId: "chat-1",
68
+ messageId: "msg-1",
69
+ scopeId: "scope-1",
70
+ ttlMs: 10,
71
+ nowMs: 1000,
72
+ });
73
+
74
+ expect(consumeTerminalClawChatSend({
75
+ accountId: "default",
76
+ chatId: "chat-1",
77
+ scopeId: "scope-1",
78
+ nowMs: 1010,
79
+ })).toBeNull();
80
+ });
81
+ });
@@ -0,0 +1,56 @@
1
+ import { AsyncLocalStorage } from "node:async_hooks";
2
+
3
+ export type TerminalClawChatSendRecord = {
4
+ messageId: string;
5
+ expiresAt: number;
6
+ scopeId: string;
7
+ };
8
+
9
+ const DEFAULT_TTL_MS = 60_000;
10
+ const terminalSends = new Map<string, TerminalClawChatSendRecord>();
11
+ const terminalSendScope = new AsyncLocalStorage<string>();
12
+
13
+ function key(accountId: string, chatId: string, scopeId: string): string {
14
+ return `${accountId}\0${chatId}\0${scopeId}`;
15
+ }
16
+
17
+ export function runWithTerminalClawChatSendScope<T>(scopeId: string, fn: () => T): T {
18
+ return terminalSendScope.run(scopeId, fn);
19
+ }
20
+
21
+ export function markTerminalClawChatSend(params: {
22
+ accountId: string;
23
+ chatId: string;
24
+ messageId: string;
25
+ scopeId?: string;
26
+ ttlMs?: number;
27
+ nowMs?: number;
28
+ }): void {
29
+ const scopeId = params.scopeId ?? terminalSendScope.getStore();
30
+ if (!scopeId) return;
31
+ terminalSends.set(key(params.accountId, params.chatId, scopeId), {
32
+ messageId: params.messageId,
33
+ expiresAt: (params.nowMs ?? Date.now()) + (params.ttlMs ?? DEFAULT_TTL_MS),
34
+ scopeId,
35
+ });
36
+ }
37
+
38
+ export function consumeTerminalClawChatSend(params: {
39
+ accountId: string;
40
+ chatId: string;
41
+ scopeId?: string;
42
+ nowMs?: number;
43
+ }): TerminalClawChatSendRecord | null {
44
+ const scopeId = params.scopeId ?? terminalSendScope.getStore();
45
+ if (!scopeId) return null;
46
+ const recordKey = key(params.accountId, params.chatId, scopeId);
47
+ const record = terminalSends.get(recordKey);
48
+ if (!record) return null;
49
+ terminalSends.delete(recordKey);
50
+ if (record.expiresAt <= (params.nowMs ?? Date.now())) return null;
51
+ return record;
52
+ }
53
+
54
+ export function clearTerminalClawChatSendsForTest(): void {
55
+ terminalSends.clear();
56
+ }
@@ -0,0 +1,337 @@
1
+ import { Type, type Static } from "@sinclair/typebox";
2
+
3
+ const targetProperties = {
4
+ targetType: Type.Union([Type.Literal("owner"), Type.Literal("user"), Type.Literal("group")], {
5
+ description: "Explicit ClawChat memory target type.",
6
+ }),
7
+ targetId: Type.String({
8
+ minLength: 1,
9
+ description: "Explicit target id. Use owner for owner targets. Do not infer ids from names.",
10
+ }),
11
+ };
12
+
13
+ const ClawchatMetadataPatchSchema = Type.Object(
14
+ {
15
+ nickname: Type.Optional(Type.String()),
16
+ avatar_url: Type.Optional(Type.String()),
17
+ bio: Type.Optional(Type.String()),
18
+ agent_behavior: Type.Optional(Type.String()),
19
+ group_title: Type.Optional(Type.String()),
20
+ group_description: Type.Optional(Type.String()),
21
+ },
22
+ { additionalProperties: false, minProperties: 1 },
23
+ );
24
+
25
+ const readBoundsProperties = {
26
+ offset: Type.Optional(
27
+ Type.Integer({
28
+ minimum: 0,
29
+ description: "Zero-based content offset. Default 0.",
30
+ }),
31
+ ),
32
+ limit: Type.Optional(
33
+ Type.Integer({
34
+ minimum: 1,
35
+ maximum: 100000,
36
+ description: "Maximum returned characters. Default 20000, max 100000.",
37
+ }),
38
+ ),
39
+ };
40
+
41
+ export const ClawchatMemoryReadSchema = Type.Object(
42
+ { ...targetProperties, ...readBoundsProperties },
43
+ { additionalProperties: false },
44
+ );
45
+ export type ClawchatMemoryReadParams = Static<typeof ClawchatMemoryReadSchema>;
46
+
47
+ export const ClawchatMemorySearchSchema = Type.Object(
48
+ {
49
+ query: Type.String({
50
+ minLength: 1,
51
+ description: "Keyword to search in local ClawChat memory metadata and Markdown body.",
52
+ }),
53
+ targetTypes: Type.Optional(
54
+ Type.Array(Type.Union([Type.Literal("owner"), Type.Literal("user"), Type.Literal("group")]), {
55
+ minItems: 1,
56
+ description: "Optional target namespaces to search. Defaults to owner, user, and group.",
57
+ }),
58
+ ),
59
+ maxResults: Type.Optional(
60
+ Type.Integer({
61
+ minimum: 1,
62
+ maximum: 50,
63
+ description: "Maximum local memory matches to return. Default 10, max 50.",
64
+ }),
65
+ ),
66
+ },
67
+ { additionalProperties: false },
68
+ );
69
+ export type ClawchatMemorySearchParams = Static<typeof ClawchatMemorySearchSchema>;
70
+
71
+ const memoryWriteProperties = {
72
+ mode: Type.Union([Type.Literal("append"), Type.Literal("replace")]),
73
+ content: Type.String({
74
+ description: "Markdown body content. Append requires non-empty content; replace may be empty.",
75
+ }),
76
+ };
77
+
78
+ export const ClawchatMemoryWriteSchema = Type.Object(
79
+ { ...targetProperties, ...memoryWriteProperties },
80
+ { additionalProperties: false },
81
+ );
82
+ export type ClawchatMemoryWriteParams = Static<typeof ClawchatMemoryWriteSchema>;
83
+
84
+ const memoryEditProperties = {
85
+ oldText: Type.String({
86
+ minLength: 1,
87
+ description: "Existing body text span to replace. Must match exactly once.",
88
+ }),
89
+ newText: Type.String({
90
+ description: "Replacement body text.",
91
+ }),
92
+ };
93
+
94
+ export const ClawchatMemoryEditSchema = Type.Object(
95
+ { ...targetProperties, ...memoryEditProperties },
96
+ { additionalProperties: false },
97
+ );
98
+ export type ClawchatMemoryEditParams = Static<typeof ClawchatMemoryEditSchema>;
99
+
100
+ const metadataSyncProperties = {
101
+ direction: Type.Union([Type.Literal("pull"), Type.Literal("push")]),
102
+ fields: Type.Optional(Type.Array(Type.String({ minLength: 1 }), {
103
+ minItems: 1,
104
+ description: "Required for direction=push. Push only these local metadata fields.",
105
+ })),
106
+ };
107
+
108
+ export const ClawchatMetadataSyncSchema = Type.Object(
109
+ { ...targetProperties, ...metadataSyncProperties },
110
+ { additionalProperties: false },
111
+ );
112
+ export type ClawchatMetadataSyncParams = Static<typeof ClawchatMetadataSyncSchema>;
113
+
114
+ export const ClawchatMetadataUpdateSchema = Type.Object(
115
+ { ...targetProperties, patch: ClawchatMetadataPatchSchema },
116
+ { additionalProperties: false },
117
+ );
118
+ export type ClawchatMetadataUpdateParams = Static<typeof ClawchatMetadataUpdateSchema>;
119
+
120
+ export const ClawchatGetAccountProfileSchema = Type.Object({});
121
+ export type ClawchatGetAccountProfileParams = Static<typeof ClawchatGetAccountProfileSchema>;
122
+
123
+ export const ClawchatGetUserProfileSchema = Type.Object({
124
+ userId: Type.String({
125
+ description:
126
+ "Explicit target ClawChat user id (required). Do not infer this from a nickname; use clawchat_get_account_profile for the agent's own connected ClawChat account unless an explicit userId is provided.",
127
+ }),
128
+ });
129
+ export type ClawchatGetUserProfileParams = Static<typeof ClawchatGetUserProfileSchema>;
130
+
131
+ export const ClawchatListAccountFriendsSchema = Type.Object({});
132
+ export type ClawchatListAccountFriendsParams = Static<typeof ClawchatListAccountFriendsSchema>;
133
+
134
+ export const ClawchatSearchUsersSchema = Type.Object({
135
+ q: Type.Optional(
136
+ Type.String({
137
+ description: "Search query for ClawChat username or nickname",
138
+ }),
139
+ ),
140
+ limit: Type.Optional(
141
+ Type.Integer({
142
+ minimum: 1,
143
+ maximum: 100,
144
+ description: "Max results (default 20)",
145
+ }),
146
+ ),
147
+ });
148
+ export type ClawchatSearchUsersParams = Static<typeof ClawchatSearchUsersSchema>;
149
+
150
+ export const ClawchatGetConversationSchema = Type.Object({
151
+ conversationId: Type.String({
152
+ description: "Concrete ClawChat conversation id to fetch",
153
+ }),
154
+ });
155
+ export type ClawchatGetConversationParams = Static<typeof ClawchatGetConversationSchema>;
156
+
157
+ export const ClawchatMentionMessageSchema = Type.Object({
158
+ chatId: Type.String({
159
+ minLength: 1,
160
+ description:
161
+ "Explicit ClawChat conversation id / current group chat id where the real mention message should be sent.",
162
+ }),
163
+ chatType: Type.Optional(
164
+ Type.Union([Type.Literal("group"), Type.Literal("direct")], {
165
+ description: "ClawChat chat type. Defaults to group when omitted.",
166
+ }),
167
+ ),
168
+ text: Type.Optional(
169
+ Type.String({
170
+ description:
171
+ "Optional message body after the mention fragments. Do not include the visible @mention here; pass that label as mentions[].display.",
172
+ }),
173
+ ),
174
+ mentions: Type.Array(
175
+ Type.Object({
176
+ userId: Type.String({
177
+ minLength: 1,
178
+ description:
179
+ "Explicit ClawChat user id to mention. Prefer mentioned_users or sender_id from current [message] blocks and never guess from names.",
180
+ }),
181
+ display: Type.Optional(
182
+ Type.String({
183
+ description:
184
+ "Optional visible mention label without a leading @. Use a reliable label from current context or clawchat_get_user_profile when human-readable display matters. Omit only when unknown; do not use userId as a display fallback.",
185
+ }),
186
+ ),
187
+ }),
188
+ {
189
+ minItems: 1,
190
+ description:
191
+ "Mention targets. Prefer mentioned_users or sender_id from current [message] blocks and never guess from names.",
192
+ },
193
+ ),
194
+ replyToMessageId: Type.Optional(
195
+ Type.String({
196
+ minLength: 1,
197
+ description: "Optional ClawChat message id to reply to.",
198
+ }),
199
+ ),
200
+ });
201
+ export type ClawchatMentionMessageParams = Static<typeof ClawchatMentionMessageSchema>;
202
+
203
+ export const ClawchatListMomentsSchema = Type.Object({
204
+ before: Type.Optional(
205
+ Type.Integer({
206
+ minimum: 1,
207
+ description: "Cursor; return moments with id < before",
208
+ }),
209
+ ),
210
+ limit: Type.Optional(
211
+ Type.Integer({
212
+ minimum: 1,
213
+ maximum: 100,
214
+ description: "Max items (default 30)",
215
+ }),
216
+ ),
217
+ });
218
+ export type ClawchatListMomentsParams = Static<typeof ClawchatListMomentsSchema>;
219
+
220
+ export const ClawchatCreateMomentSchema = Type.Object({
221
+ text: Type.Optional(
222
+ Type.String({
223
+ description: "Moment text. At least one of text or images is required.",
224
+ }),
225
+ ),
226
+ images: Type.Optional(
227
+ Type.Array(
228
+ Type.String({
229
+ description: "Image URL for the moment. Upload local files first; do not pass local paths.",
230
+ }),
231
+ ),
232
+ ),
233
+ });
234
+ export type ClawchatCreateMomentParams = Static<typeof ClawchatCreateMomentSchema>;
235
+
236
+ export const ClawchatDeleteMomentSchema = Type.Object({
237
+ momentId: Type.Integer({
238
+ minimum: 1,
239
+ description: "Concrete ClawChat moment id to delete",
240
+ }),
241
+ });
242
+ export type ClawchatDeleteMomentParams = Static<typeof ClawchatDeleteMomentSchema>;
243
+
244
+ export const ClawchatToggleMomentReactionSchema = Type.Object({
245
+ momentId: Type.Integer({
246
+ minimum: 1,
247
+ description: "Concrete ClawChat moment id to react to",
248
+ }),
249
+ emoji: Type.String({
250
+ description: "Emoji reaction to toggle",
251
+ }),
252
+ });
253
+ export type ClawchatToggleMomentReactionParams = Static<
254
+ typeof ClawchatToggleMomentReactionSchema
255
+ >;
256
+
257
+ export const ClawchatCreateMomentCommentSchema = Type.Object({
258
+ momentId: Type.Integer({
259
+ minimum: 1,
260
+ description: "Concrete ClawChat moment id to comment on",
261
+ }),
262
+ text: Type.String({
263
+ description: "Top-level comment text",
264
+ }),
265
+ });
266
+ export type ClawchatCreateMomentCommentParams = Static<
267
+ typeof ClawchatCreateMomentCommentSchema
268
+ >;
269
+
270
+ export const ClawchatReplyMomentCommentSchema = Type.Object({
271
+ momentId: Type.Integer({
272
+ minimum: 1,
273
+ description: "Concrete ClawChat moment id containing the comment",
274
+ }),
275
+ replyToCommentId: Type.Integer({
276
+ minimum: 1,
277
+ description: "Concrete comment id being replied to",
278
+ }),
279
+ text: Type.String({
280
+ description: "Reply text",
281
+ }),
282
+ });
283
+ export type ClawchatReplyMomentCommentParams = Static<typeof ClawchatReplyMomentCommentSchema>;
284
+
285
+ export const ClawchatDeleteMomentCommentSchema = Type.Object({
286
+ momentId: Type.Integer({
287
+ minimum: 1,
288
+ description: "Concrete ClawChat moment id containing the comment",
289
+ }),
290
+ commentId: Type.Integer({
291
+ minimum: 1,
292
+ description: "Concrete comment id to delete",
293
+ }),
294
+ });
295
+ export type ClawchatDeleteMomentCommentParams = Static<
296
+ typeof ClawchatDeleteMomentCommentSchema
297
+ >;
298
+
299
+ export const ClawchatUpdateAccountProfileSchema = Type.Object({
300
+ nickname: Type.Optional(
301
+ Type.String({
302
+ description:
303
+ "New nickname/display name for the agent's connected ClawChat account, mirroring the local assistant identity",
304
+ }),
305
+ ),
306
+ avatar_url: Type.Optional(
307
+ Type.String({
308
+ description:
309
+ "Avatar URL for the agent's connected ClawChat account profile (use clawchat_upload_avatar_image first to obtain one from a local image)",
310
+ }),
311
+ ),
312
+ bio: Type.Optional(
313
+ Type.String({
314
+ description:
315
+ "New self-introduction / bio text for the agent's connected ClawChat account, mirroring the local assistant identity",
316
+ }),
317
+ ),
318
+ });
319
+ export type ClawchatUpdateAccountProfileParams = Static<
320
+ typeof ClawchatUpdateAccountProfileSchema
321
+ >;
322
+
323
+ export const ClawchatUploadMediaFileSchema = Type.Object({
324
+ filePath: Type.String({
325
+ description:
326
+ "Absolute local path of the non-avatar media/file to upload to ClawChat for a ClawChat-accessible URL (max 20MB)",
327
+ }),
328
+ });
329
+ export type ClawchatUploadMediaFileParams = Static<typeof ClawchatUploadMediaFileSchema>;
330
+
331
+ export const ClawchatUploadAvatarImageSchema = Type.Object({
332
+ filePath: Type.String({
333
+ description:
334
+ "Absolute local path of the avatar image to upload for the agent's connected ClawChat account (max 20MB)",
335
+ }),
336
+ });
337
+ export type ClawchatUploadAvatarImageParams = Static<typeof ClawchatUploadAvatarImageSchema>;