@clawling/clawchat-plugin-openclaw 2026.9.23-1 → 2026.9.26-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.
@@ -311,8 +311,8 @@ export function createOpenclawClawlingApiClient(opts) {
311
311
  * turns any `ClawlingApiError` straight into `apiError(err)`. Reactive
312
312
  * retry-after-refresh only exists behind `getConversationApiClient`'s
313
313
  * `withRefresh` wrapper (`runtime.ts`), which the twelve `orch*` tools do
314
- * not go through; this matches the other ~34 tools already shipped on the
315
- * same `withClient` path. Proactive rotation is still picked up here for
314
+ * not go through; this matches the other non-orchestration tools that
315
+ * build a raw client the same way. Proactive rotation is still picked up here for
316
316
  * free, since the token is read fresh from the account at call time.
317
317
  */
318
318
  async function orchCall(method, path, init) {
@@ -66,7 +66,7 @@ export const OFFICIAL_SKILLS_BASE = "https://raw.githubusercontent.com/clawling/
66
66
  * in the install-cli repo, bump this constant, ship it. `liveware-sample.ts`
67
67
  * imports the same ref, so the `livewares` tree at that tag is pinned too.
68
68
  */
69
- export const DEFAULT_SKILLS_REF = "skills-v1.14.0";
69
+ export const DEFAULT_SKILLS_REF = "skills-v1.15.1";
70
70
  /** Refuse to treat an absurdly large response as a skill file (defence in depth). */
71
71
  export const MAX_SKILL_BYTES = 256 * 1024;
72
72
  /** This adapter's host target inside `skills/manifest.json`. */
package/dist/src/tools.js CHANGED
@@ -195,6 +195,14 @@ export function registerOpenclawClawlingTools(api, options = {}) {
195
195
  api.logger.debug?.("clawchat-plugin-openclaw: api.config missing; skipping tool registration");
196
196
  return;
197
197
  }
198
+ // Every tool below registers through this wrapper so the debug summary at
199
+ // the end is derived from what was actually registered, not hand-maintained.
200
+ const registeredToolNames = [];
201
+ const registerTool = (tool, opts) => {
202
+ if (opts?.name)
203
+ registeredToolNames.push(opts.name);
204
+ api.registerTool(tool, opts);
205
+ };
198
206
  // Re-resolve at call time so config reloads pick up new tokens / baseUrl.
199
207
  function resolveCurrent(accountId) {
200
208
  return resolveOpenclawClawlingAccount(api.config, accountId);
@@ -394,7 +402,7 @@ export function registerOpenclawClawlingTools(api, options = {}) {
394
402
  return validationError(message);
395
403
  }
396
404
  function registerMemoryTools() {
397
- api.registerTool((ctx) => ({
405
+ registerTool((ctx) => ({
398
406
  name: "clawchat_memory_search",
399
407
  label: "Search ClawChat Memory",
400
408
  description: memoryToolDescription("Search local ClawChat memory Markdown files by keyword across owner.md, users/*.md, and groups/*.md. " +
@@ -421,7 +429,7 @@ export function registerOpenclawClawlingTools(api, options = {}) {
421
429
  }
422
430
  },
423
431
  }), { name: "clawchat_memory_search" });
424
- api.registerTool((ctx) => ({
432
+ registerTool((ctx) => ({
425
433
  name: "clawchat_memory_read",
426
434
  label: "Read ClawChat Memory",
427
435
  description: memoryToolDescription("Read one local ClawChat memory Markdown file by explicit targetType and targetId. " +
@@ -470,7 +478,7 @@ export function registerOpenclawClawlingTools(api, options = {}) {
470
478
  }
471
479
  },
472
480
  }), { name: "clawchat_memory_read" });
473
- api.registerTool((ctx) => ({
481
+ registerTool((ctx) => ({
474
482
  name: "clawchat_memory_write",
475
483
  label: "Write ClawChat Memory",
476
484
  description: memoryToolDescription("Append to or replace only the agent-authored body of a ClawChat memory Markdown file by explicit targetType and targetId. " +
@@ -498,7 +506,7 @@ export function registerOpenclawClawlingTools(api, options = {}) {
498
506
  }
499
507
  },
500
508
  }), { name: "clawchat_memory_write" });
501
- api.registerTool((ctx) => ({
509
+ registerTool((ctx) => ({
502
510
  name: "clawchat_memory_edit",
503
511
  label: "Edit ClawChat Memory",
504
512
  description: memoryToolDescription("Replace exactly one existing text span in the agent-authored body of a ClawChat memory Markdown file. " +
@@ -526,7 +534,7 @@ export function registerOpenclawClawlingTools(api, options = {}) {
526
534
  }
527
535
  },
528
536
  }), { name: "clawchat_memory_edit" });
529
- api.registerTool((ctx) => {
537
+ registerTool((ctx) => {
530
538
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
531
539
  return {
532
540
  name: "clawchat_metadata_sync",
@@ -600,7 +608,7 @@ export function registerOpenclawClawlingTools(api, options = {}) {
600
608
  },
601
609
  };
602
610
  }, { name: "clawchat_metadata_sync" });
603
- api.registerTool((ctx) => {
611
+ registerTool((ctx) => {
604
612
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
605
613
  return {
606
614
  name: "clawchat_metadata_update",
@@ -654,7 +662,7 @@ export function registerOpenclawClawlingTools(api, options = {}) {
654
662
  }, { name: "clawchat_metadata_update" });
655
663
  }
656
664
  registerMemoryTools();
657
- api.registerTool((ctx) => {
665
+ registerTool((ctx) => {
658
666
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
659
667
  return {
660
668
  name: "clawchat_get_account_profile",
@@ -671,7 +679,7 @@ export function registerOpenclawClawlingTools(api, options = {}) {
671
679
  },
672
680
  };
673
681
  }, { name: "clawchat_get_account_profile" });
674
- api.registerTool((ctx) => {
682
+ registerTool((ctx) => {
675
683
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
676
684
  return {
677
685
  name: "clawchat_get_user_profile",
@@ -691,7 +699,7 @@ export function registerOpenclawClawlingTools(api, options = {}) {
691
699
  },
692
700
  };
693
701
  }, { name: "clawchat_get_user_profile" });
694
- api.registerTool((ctx) => {
702
+ registerTool((ctx) => {
695
703
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
696
704
  return {
697
705
  name: "clawchat_list_account_friends",
@@ -705,7 +713,7 @@ export function registerOpenclawClawlingTools(api, options = {}) {
705
713
  },
706
714
  };
707
715
  }, { name: "clawchat_list_account_friends" });
708
- api.registerTool((ctx) => {
716
+ registerTool((ctx) => {
709
717
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
710
718
  return {
711
719
  name: "clawchat_send_friend_request",
@@ -722,7 +730,7 @@ export function registerOpenclawClawlingTools(api, options = {}) {
722
730
  },
723
731
  };
724
732
  }, { name: "clawchat_send_friend_request" });
725
- api.registerTool((ctx) => {
733
+ registerTool((ctx) => {
726
734
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
727
735
  return {
728
736
  name: "clawchat_list_friend_requests",
@@ -739,7 +747,7 @@ export function registerOpenclawClawlingTools(api, options = {}) {
739
747
  },
740
748
  };
741
749
  }, { name: "clawchat_list_friend_requests" });
742
- api.registerTool((ctx) => {
750
+ registerTool((ctx) => {
743
751
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
744
752
  return {
745
753
  name: "clawchat_accept_friend_request",
@@ -756,7 +764,7 @@ export function registerOpenclawClawlingTools(api, options = {}) {
756
764
  },
757
765
  };
758
766
  }, { name: "clawchat_accept_friend_request" });
759
- api.registerTool((ctx) => {
767
+ registerTool((ctx) => {
760
768
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
761
769
  return {
762
770
  name: "clawchat_reject_friend_request",
@@ -773,7 +781,7 @@ export function registerOpenclawClawlingTools(api, options = {}) {
773
781
  },
774
782
  };
775
783
  }, { name: "clawchat_reject_friend_request" });
776
- api.registerTool((ctx) => {
784
+ registerTool((ctx) => {
777
785
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
778
786
  return {
779
787
  name: "clawchat_remove_friend",
@@ -790,7 +798,7 @@ export function registerOpenclawClawlingTools(api, options = {}) {
790
798
  },
791
799
  };
792
800
  }, { name: "clawchat_remove_friend" });
793
- api.registerTool((ctx) => {
801
+ registerTool((ctx) => {
794
802
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
795
803
  return {
796
804
  name: "clawchat_search_users",
@@ -811,7 +819,7 @@ export function registerOpenclawClawlingTools(api, options = {}) {
811
819
  },
812
820
  };
813
821
  }, { name: "clawchat_search_users" });
814
- api.registerTool((ctx) => {
822
+ registerTool((ctx) => {
815
823
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
816
824
  return {
817
825
  name: "clawchat_get_conversation",
@@ -840,7 +848,7 @@ export function registerOpenclawClawlingTools(api, options = {}) {
840
848
  },
841
849
  };
842
850
  }, { name: "clawchat_get_conversation" });
843
- api.registerTool((ctx) => {
851
+ registerTool((ctx) => {
844
852
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
845
853
  return {
846
854
  name: "clawchat_get_direct_conversation",
@@ -871,7 +879,7 @@ export function registerOpenclawClawlingTools(api, options = {}) {
871
879
  },
872
880
  };
873
881
  }, { name: "clawchat_get_direct_conversation" });
874
- api.registerTool((ctx) => {
882
+ registerTool((ctx) => {
875
883
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
876
884
  return {
877
885
  name: "clawchat_leave_group",
@@ -902,7 +910,7 @@ export function registerOpenclawClawlingTools(api, options = {}) {
902
910
  },
903
911
  };
904
912
  }, { name: "clawchat_leave_group" });
905
- api.registerTool((ctx) => {
913
+ registerTool((ctx) => {
906
914
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
907
915
  return {
908
916
  name: "clawchat_add_group_member",
@@ -933,7 +941,7 @@ export function registerOpenclawClawlingTools(api, options = {}) {
933
941
  },
934
942
  };
935
943
  }, { name: "clawchat_add_group_member" });
936
- api.registerTool((ctx) => {
944
+ registerTool((ctx) => {
937
945
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
938
946
  return {
939
947
  name: "clawchat_mention_message",
@@ -1001,7 +1009,7 @@ export function registerOpenclawClawlingTools(api, options = {}) {
1001
1009
  },
1002
1010
  };
1003
1011
  }, { name: "clawchat_mention_message" });
1004
- api.registerTool((ctx) => {
1012
+ registerTool((ctx) => {
1005
1013
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1006
1014
  return {
1007
1015
  name: "clawchat_react_message",
@@ -1049,7 +1057,7 @@ export function registerOpenclawClawlingTools(api, options = {}) {
1049
1057
  },
1050
1058
  };
1051
1059
  }, { name: "clawchat_react_message" });
1052
- api.registerTool((ctx) => {
1060
+ registerTool((ctx) => {
1053
1061
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1054
1062
  return {
1055
1063
  name: "clawchat_list_moments",
@@ -1069,7 +1077,7 @@ export function registerOpenclawClawlingTools(api, options = {}) {
1069
1077
  },
1070
1078
  };
1071
1079
  }, { name: "clawchat_list_moments" });
1072
- api.registerTool((ctx) => {
1080
+ registerTool((ctx) => {
1073
1081
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1074
1082
  return {
1075
1083
  name: "clawchat_get_moment",
@@ -1084,7 +1092,7 @@ export function registerOpenclawClawlingTools(api, options = {}) {
1084
1092
  },
1085
1093
  };
1086
1094
  }, { name: "clawchat_get_moment" });
1087
- api.registerTool((ctx) => {
1095
+ registerTool((ctx) => {
1088
1096
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1089
1097
  return {
1090
1098
  name: "clawchat_create_moment",
@@ -1109,7 +1117,7 @@ export function registerOpenclawClawlingTools(api, options = {}) {
1109
1117
  },
1110
1118
  };
1111
1119
  }, { name: "clawchat_create_moment" });
1112
- api.registerTool((ctx) => {
1120
+ registerTool((ctx) => {
1113
1121
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1114
1122
  return {
1115
1123
  name: "clawchat_delete_moment",
@@ -1126,7 +1134,7 @@ export function registerOpenclawClawlingTools(api, options = {}) {
1126
1134
  },
1127
1135
  };
1128
1136
  }, { name: "clawchat_delete_moment" });
1129
- api.registerTool((ctx) => {
1137
+ registerTool((ctx) => {
1130
1138
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1131
1139
  return {
1132
1140
  name: "clawchat_toggle_moment_reaction",
@@ -1146,7 +1154,7 @@ export function registerOpenclawClawlingTools(api, options = {}) {
1146
1154
  },
1147
1155
  };
1148
1156
  }, { name: "clawchat_toggle_moment_reaction" });
1149
- api.registerTool((ctx) => {
1157
+ registerTool((ctx) => {
1150
1158
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1151
1159
  return {
1152
1160
  name: "clawchat_create_moment_comment",
@@ -1166,7 +1174,7 @@ export function registerOpenclawClawlingTools(api, options = {}) {
1166
1174
  },
1167
1175
  };
1168
1176
  }, { name: "clawchat_create_moment_comment" });
1169
- api.registerTool((ctx) => {
1177
+ registerTool((ctx) => {
1170
1178
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1171
1179
  return {
1172
1180
  name: "clawchat_reply_moment_comment",
@@ -1190,7 +1198,7 @@ export function registerOpenclawClawlingTools(api, options = {}) {
1190
1198
  },
1191
1199
  };
1192
1200
  }, { name: "clawchat_reply_moment_comment" });
1193
- api.registerTool((ctx) => {
1201
+ registerTool((ctx) => {
1194
1202
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1195
1203
  return {
1196
1204
  name: "clawchat_delete_moment_comment",
@@ -1207,7 +1215,7 @@ export function registerOpenclawClawlingTools(api, options = {}) {
1207
1215
  },
1208
1216
  };
1209
1217
  }, { name: "clawchat_delete_moment_comment" });
1210
- api.registerTool((ctx) => {
1218
+ registerTool((ctx) => {
1211
1219
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1212
1220
  return {
1213
1221
  name: "clawchat_update_account_profile",
@@ -1245,7 +1253,7 @@ export function registerOpenclawClawlingTools(api, options = {}) {
1245
1253
  },
1246
1254
  };
1247
1255
  }, { name: "clawchat_update_account_profile" });
1248
- api.registerTool((ctx) => {
1256
+ registerTool((ctx) => {
1249
1257
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1250
1258
  return {
1251
1259
  name: "clawchat_upload_avatar_image",
@@ -1281,7 +1289,7 @@ export function registerOpenclawClawlingTools(api, options = {}) {
1281
1289
  },
1282
1290
  };
1283
1291
  }, { name: "clawchat_upload_avatar_image" });
1284
- api.registerTool((ctx) => {
1292
+ registerTool((ctx) => {
1285
1293
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1286
1294
  return {
1287
1295
  name: "clawchat_register_app",
@@ -1297,7 +1305,7 @@ export function registerOpenclawClawlingTools(api, options = {}) {
1297
1305
  },
1298
1306
  };
1299
1307
  }, { name: "clawchat_register_app" });
1300
- api.registerTool((ctx) => {
1308
+ registerTool((ctx) => {
1301
1309
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1302
1310
  return {
1303
1311
  name: "clawchat_list_apps",
@@ -1309,7 +1317,7 @@ export function registerOpenclawClawlingTools(api, options = {}) {
1309
1317
  },
1310
1318
  };
1311
1319
  }, { name: "clawchat_list_apps" });
1312
- api.registerTool((ctx) => {
1320
+ registerTool((ctx) => {
1313
1321
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1314
1322
  return {
1315
1323
  name: "clawchat_unregister_app",
@@ -1324,7 +1332,7 @@ export function registerOpenclawClawlingTools(api, options = {}) {
1324
1332
  },
1325
1333
  };
1326
1334
  }, { name: "clawchat_unregister_app" });
1327
- api.registerTool((ctx) => {
1335
+ registerTool((ctx) => {
1328
1336
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1329
1337
  return {
1330
1338
  name: "clawchat_liveware_login",
@@ -1389,7 +1397,7 @@ export function registerOpenclawClawlingTools(api, options = {}) {
1389
1397
  // envelope untouched. The shared orchestration skill text tells the model
1390
1398
  // to read `code` itself; rewriting the shape here would make the same
1391
1399
  // sentence behave differently than on the Hermes side.
1392
- api.registerTool((ctx) => {
1400
+ registerTool((ctx) => {
1393
1401
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1394
1402
  return {
1395
1403
  name: "clawchat_orchestrate_list_agents",
@@ -1403,7 +1411,7 @@ export function registerOpenclawClawlingTools(api, options = {}) {
1403
1411
  },
1404
1412
  };
1405
1413
  }, { name: "clawchat_orchestrate_list_agents" });
1406
- api.registerTool((ctx) => {
1414
+ registerTool((ctx) => {
1407
1415
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1408
1416
  return {
1409
1417
  name: "clawchat_orchestrate_get_agent",
@@ -1420,7 +1428,7 @@ export function registerOpenclawClawlingTools(api, options = {}) {
1420
1428
  },
1421
1429
  };
1422
1430
  }, { name: "clawchat_orchestrate_get_agent" });
1423
- api.registerTool((ctx) => {
1431
+ registerTool((ctx) => {
1424
1432
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1425
1433
  return {
1426
1434
  name: "clawchat_orchestrate_set_agent_behavior",
@@ -1439,7 +1447,7 @@ export function registerOpenclawClawlingTools(api, options = {}) {
1439
1447
  },
1440
1448
  };
1441
1449
  }, { name: "clawchat_orchestrate_set_agent_behavior" });
1442
- api.registerTool((ctx) => {
1450
+ registerTool((ctx) => {
1443
1451
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1444
1452
  return {
1445
1453
  name: "clawchat_orchestrate_list_groups",
@@ -1452,7 +1460,7 @@ export function registerOpenclawClawlingTools(api, options = {}) {
1452
1460
  },
1453
1461
  };
1454
1462
  }, { name: "clawchat_orchestrate_list_groups" });
1455
- api.registerTool((ctx) => {
1463
+ registerTool((ctx) => {
1456
1464
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1457
1465
  return {
1458
1466
  name: "clawchat_orchestrate_get_group",
@@ -1468,7 +1476,7 @@ export function registerOpenclawClawlingTools(api, options = {}) {
1468
1476
  },
1469
1477
  };
1470
1478
  }, { name: "clawchat_orchestrate_get_group" });
1471
- api.registerTool((ctx) => {
1479
+ registerTool((ctx) => {
1472
1480
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1473
1481
  return {
1474
1482
  name: "clawchat_orchestrate_set_group_prompt",
@@ -1487,7 +1495,7 @@ export function registerOpenclawClawlingTools(api, options = {}) {
1487
1495
  },
1488
1496
  };
1489
1497
  }, { name: "clawchat_orchestrate_set_group_prompt" });
1490
- api.registerTool((ctx) => {
1498
+ registerTool((ctx) => {
1491
1499
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1492
1500
  return {
1493
1501
  name: "clawchat_orchestrate_create_group",
@@ -1503,7 +1511,7 @@ export function registerOpenclawClawlingTools(api, options = {}) {
1503
1511
  },
1504
1512
  };
1505
1513
  }, { name: "clawchat_orchestrate_create_group" });
1506
- api.registerTool((ctx) => {
1514
+ registerTool((ctx) => {
1507
1515
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1508
1516
  return {
1509
1517
  name: "clawchat_orchestrate_add_group_member",
@@ -1520,7 +1528,7 @@ export function registerOpenclawClawlingTools(api, options = {}) {
1520
1528
  },
1521
1529
  };
1522
1530
  }, { name: "clawchat_orchestrate_add_group_member" });
1523
- api.registerTool((ctx) => {
1531
+ registerTool((ctx) => {
1524
1532
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1525
1533
  return {
1526
1534
  name: "clawchat_orchestrate_remove_group_member",
@@ -1536,7 +1544,7 @@ export function registerOpenclawClawlingTools(api, options = {}) {
1536
1544
  },
1537
1545
  };
1538
1546
  }, { name: "clawchat_orchestrate_remove_group_member" });
1539
- api.registerTool((ctx) => {
1547
+ registerTool((ctx) => {
1540
1548
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1541
1549
  return {
1542
1550
  name: "clawchat_orchestrate_set_group_agent_settings",
@@ -1558,12 +1566,12 @@ export function registerOpenclawClawlingTools(api, options = {}) {
1558
1566
  },
1559
1567
  };
1560
1568
  }, { name: "clawchat_orchestrate_set_group_agent_settings" });
1561
- api.registerTool((ctx) => {
1569
+ registerTool((ctx) => {
1562
1570
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1563
1571
  return {
1564
1572
  name: "clawchat_orchestrate_create_connect_code",
1565
1573
  label: "Issue A Connect Code",
1566
- description: toolDescription("Mint a connect code on the owner's behalf, valid 30 minutes. " +
1574
+ description: toolDescription("Mint a connect code on the owner's behalf, valid 45 minutes. " +
1567
1575
  "TRIGGER — invoke when the owner asks for a code to connect a new agent. " +
1568
1576
  "The rate limit bucket belongs to the owner and is shared with their own manual issuance, so do not retry on a limit."),
1569
1577
  parameters: ClawchatOrchCreateConnectCodeSchema,
@@ -1572,7 +1580,7 @@ export function registerOpenclawClawlingTools(api, options = {}) {
1572
1580
  },
1573
1581
  };
1574
1582
  }, { name: "clawchat_orchestrate_create_connect_code" });
1575
- api.registerTool((ctx) => {
1583
+ registerTool((ctx) => {
1576
1584
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1577
1585
  return {
1578
1586
  name: "clawchat_orchestrate_get_connect_code",
@@ -1588,5 +1596,7 @@ export function registerOpenclawClawlingTools(api, options = {}) {
1588
1596
  },
1589
1597
  };
1590
1598
  }, { name: "clawchat_orchestrate_get_connect_code" });
1591
- api.logger.debug?.("clawchat-plugin-openclaw: registered 43 clawchat_* tools (get_account_profile, get_user_profile, list_account_friends, send_friend_request, list_friend_requests, accept_friend_request, reject_friend_request, remove_friend, search_users, get_conversation, mention_message, list_moments, get_moment, create_moment, delete_moment, toggle_moment_reaction, create_moment_comment, reply_moment_comment, delete_moment_comment, update_account_profile, upload_avatar_image, memory_search, memory_read, memory_write, memory_edit, metadata_sync, metadata_update, register_app, list_apps, unregister_app, liveware_login, orchestrate_list_agents, orchestrate_get_agent, orchestrate_set_agent_behavior, orchestrate_list_groups, orchestrate_get_group, orchestrate_set_group_prompt, orchestrate_create_group, orchestrate_add_group_member, orchestrate_remove_group_member, orchestrate_set_group_agent_settings, orchestrate_create_connect_code, orchestrate_get_connect_code)");
1599
+ api.logger.debug?.(`clawchat-plugin-openclaw: registered ${registeredToolNames.length} clawchat_* tools (${registeredToolNames
1600
+ .map((name) => name.replace(/^clawchat_/, ""))
1601
+ .join(", ")})`);
1592
1602
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clawling/clawchat-plugin-openclaw",
3
- "version": "2026.9.23-1",
3
+ "version": "2026.9.26-1",
4
4
  "description": "OpenClaw ClawChat channel plugin",
5
5
  "license": "MIT",
6
6
  "author": "CLAWLING PTE. LTD.",
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: clawchat-core
3
- version: 1.8.0
3
+ version: 1.9.0
4
4
  description: Use when a request involves ClawChat profile, friends, user search, moments/dynamics, comments, reactions, avatar, media, memory, output visibility, read-only conversation lookup, sending an image, file, or voice/audio clip into a conversation, managing the owner's other agents or groups, or plugin install/update/activation.
5
5
  ---
6
6
 
@@ -108,6 +108,7 @@ Tool descriptions are authoritative. These routing hints resolve common ambiguit
108
108
  | Remembered person, alias, relationship, prior ClawChat memory, or group rule | `clawchat_memory_search`, then `clawchat_memory_read` |
109
109
  | Known local memory target by id | `clawchat_memory_read` |
110
110
  | Refresh local owner/user/group profile metadata | `clawchat_metadata_sync` with `direction=pull`; do not use `clawchat_get_user_profile` plus `clawchat_memory_write` |
111
+ | Change server-side metadata: this agent's behavior, the connected account's nickname/avatar_url/bio, or a group's title/description | `clawchat_metadata_update` with `targetType` (`owner`, `user`, or `group`), exact `targetId` (`owner` for the owner target), and a `patch` of string fields allowed for that target only: `owner` → `agent_behavior`; `user` → `nickname`, `avatar_url`, `bio`; `group` → `group_title`, `group_description`. It pushes to the server first, then refreshes the local metadata block; it never edits the agent-authored body. To refresh locally without changing the server, use `clawchat_metadata_sync` with `direction=pull` |
111
112
  | Write agent-authored long-term memory notes | `clawchat_memory_write` or `clawchat_memory_edit`; do not use these for nickname/avatar_url/bio/profile_type/title/description/behavior |
112
113
  | Server-side nickname/name lookup without `userId` | `clawchat_search_users`, then ask or use an exact returned `userId` |
113
114
  | Friends/contacts | `clawchat_list_account_friends` |
@@ -117,6 +118,8 @@ Tool descriptions are authoritative. These routing hints resolve common ambiguit
117
118
  | Remove/unfriend contact | `clawchat_remove_friend` with exact `friendUserId`; list friends first when ambiguous |
118
119
  | Inspect one conversation or group by exact id | `clawchat_get_conversation` |
119
120
  | Message a ClawChat user you only know by `userId` (e.g. speak first to a new friend) | `clawchat_get_direct_conversation` with the exact `userId` to get the `cnv_…` conversation id, then send with `clawchat_mention_message` using that id as `chatId`. The user must already be a friend; a server rejection is final, do not retry. Never pass a `userId` or a name as `chatId` |
121
+ | Leave a group | `clawchat_leave_group` with the exact group `conversationId`, only when the user explicitly asks you to leave that group. Groups only. Needs no owner approval. If you own the group, ownership passes to the earliest human member; with no human member left, the group is dissolved. After it succeeds, output only `<clawchat:no-reply/>` |
122
+ | Add a person to a group | `clawchat_add_group_member` with the exact group `conversationId` and the person's exact `userId` (from group metadata, `clawchat_list_account_friends`, or `clawchat_search_users`; never guessed from a name), only on an explicit request. Groups only; the person must already be your friend. The owner's `group.manage` permission gates it and defaults to ask: a result with `error: "permission"` and `status: "pending"` means it was submitted for the owner's approval — it has NOT failed; do not retry, the outcome arrives later as a chat message. `status: "forbidden"` means the owner's policy blocks it; do not retry |
120
123
  | View/browse moments or dynamics | `clawchat_list_moments` |
121
124
  | Read one moment and its visible comments by exact id | `clawchat_get_moment` with exact `momentId`; read-only, use after a `moment.comment.created`/`moment.comment.replied` awareness note to read the new comment before deciding whether to reply |
122
125
  | Create a moment/dynamic | `clawchat_create_moment`; upload local images first and pass URLs |
@@ -178,6 +181,6 @@ For avatar changes, save the returned `avatar_url` back to the identity file aft
178
181
 
179
182
  For moments/dynamics, list first when the user refers to "this", "latest", "that post", "the one from earlier", or another ambiguous target. Use exact ids returned by the tools. When an awareness note already gives a concrete `momentId`, skip the list step and call `clawchat_get_moment` directly.
180
183
 
181
- For conversations/groups, use only `clawchat_get_conversation` to inspect existing conversation information when the exact conversation id is known. To reach a friend you only know by `userId`, resolve the direct conversation with `clawchat_get_direct_conversation` first; it returns the `cnv_…` id to send to.
184
+ For conversations/groups, use only `clawchat_get_conversation` to inspect existing conversation information when the exact conversation id is known. The only group changes you make are `clawchat_leave_group` and `clawchat_add_group_member` (plus a group's title/description through `clawchat_metadata_update`), each on an explicit request with exact ids. To reach a friend you only know by `userId`, resolve the direct conversation with `clawchat_get_direct_conversation` first; it returns the `cnv_…` id to send to.
182
185
 
183
186
  Do not invent invite codes, tokens, moment ids, comment ids, user ids, emoji reactions, image URLs, or file paths.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: clawchat-orchestration
3
- version: 2.0.1
3
+ version: 2.0.2
4
4
  description: Use when the owner asks this agent to manage their OTHER ClawChat agents or their groups — 编排 / orchestrate a fleet, read or rewrite another agent's 提示词 / system prompt / behavior, 禁言 / mute an agent, change 回复模式 / reply mode, stop 刷屏 / flooding in a group, 建群 / create a group of agents, add or remove agents from a group, or 签发连接码 / issue a connect code.
5
5
  ---
6
6
 
@@ -82,7 +82,7 @@ The backend enforces these. Violating one is a failed call, not a warning.
82
82
  `replyMode`, `batchDelaySeconds`. `replyMode` has exactly two values, `"all"`
83
83
  or `"mention"`. `batchDelaySeconds` is 1–3600 (default 10). Omitted
84
84
  parameters are left unchanged.
85
- - `clawchat_orchestrate_create_connect_code` — **no parameters**. The code is valid 30 minutes.
85
+ - `clawchat_orchestrate_create_connect_code` — **no parameters**. The code is valid 45 minutes.
86
86
 
87
87
  ### What this surface deliberately cannot do
88
88
 
@@ -3,10 +3,10 @@
3
3
  "skills": {
4
4
  "openclaw": {
5
5
  "clawchat-core": {
6
- "version": "1.8.0",
6
+ "version": "1.9.0",
7
7
  "path": "openclaw/clawchat-core/SKILL.md",
8
- "sha256": "e4f94d308526c9bd8d8a5a171032859cfb8b225a75d84259d70d56c880a70f36",
9
- "bytes": 14789
8
+ "sha256": "367b1df16439b084ab79430786a91dfa6b572714233678942032612f148a3e80",
9
+ "bytes": 16656
10
10
  },
11
11
  "clawchat-liveware": {
12
12
  "version": "1.2.2",
@@ -33,18 +33,18 @@
33
33
  "bytes": 13938
34
34
  },
35
35
  "clawchat-orchestration": {
36
- "version": "2.0.1",
36
+ "version": "2.0.2",
37
37
  "path": "shared/clawchat-orchestration/SKILL.md",
38
- "sha256": "f477b627b73243c9b41ad871b074cba644a8074fc73ce30b719c59ab32434c9d",
38
+ "sha256": "e32f29c5f41a7621732625a58a9f3d6fe365d7dde9bdcd892f9623e7fc180414",
39
39
  "bytes": 9477
40
40
  }
41
41
  },
42
42
  "hermes": {
43
43
  "clawchat-core": {
44
- "version": "1.14.0",
44
+ "version": "1.15.0",
45
45
  "path": "hermes/clawchat-core/SKILL.md",
46
- "sha256": "3d687981a3909151ad85f7bee11c139324bb73e981a960c39877ca322e4995c8",
47
- "bytes": 21968
46
+ "sha256": "0d203321c4f5a8d3f85fa3e7de15803891c68c27d3862d47553d3de86fbee363",
47
+ "bytes": 23959
48
48
  },
49
49
  "clawchat-liveware": {
50
50
  "version": "1.2.2",
@@ -71,9 +71,9 @@
71
71
  "bytes": 13838
72
72
  },
73
73
  "clawchat-orchestration": {
74
- "version": "2.0.1",
74
+ "version": "2.0.2",
75
75
  "path": "shared/clawchat-orchestration/SKILL.md",
76
- "sha256": "f477b627b73243c9b41ad871b074cba644a8074fc73ce30b719c59ab32434c9d",
76
+ "sha256": "e32f29c5f41a7621732625a58a9f3d6fe365d7dde9bdcd892f9623e7fc180414",
77
77
  "bytes": 9477
78
78
  }
79
79
  }
package/src/api-client.ts CHANGED
@@ -558,8 +558,8 @@ export function createOpenclawClawlingApiClient(opts: ApiClientOptions): Opencla
558
558
  * turns any `ClawlingApiError` straight into `apiError(err)`. Reactive
559
559
  * retry-after-refresh only exists behind `getConversationApiClient`'s
560
560
  * `withRefresh` wrapper (`runtime.ts`), which the twelve `orch*` tools do
561
- * not go through; this matches the other ~34 tools already shipped on the
562
- * same `withClient` path. Proactive rotation is still picked up here for
561
+ * not go through; this matches the other non-orchestration tools that
562
+ * build a raw client the same way. Proactive rotation is still picked up here for
563
563
  * free, since the token is read fresh from the account at call time.
564
564
  */
565
565
  async function orchCall(
@@ -71,7 +71,7 @@ export const OFFICIAL_SKILLS_BASE =
71
71
  * in the install-cli repo, bump this constant, ship it. `liveware-sample.ts`
72
72
  * imports the same ref, so the `livewares` tree at that tag is pinned too.
73
73
  */
74
- export const DEFAULT_SKILLS_REF = "skills-v1.14.0";
74
+ export const DEFAULT_SKILLS_REF = "skills-v1.15.1";
75
75
 
76
76
  /** Refuse to treat an absurdly large response as a skill file (defence in depth). */
77
77
  export const MAX_SKILL_BYTES = 256 * 1024;
package/src/tools.ts CHANGED
@@ -343,6 +343,14 @@ export function registerOpenclawClawlingTools(
343
343
  return;
344
344
  }
345
345
 
346
+ // Every tool below registers through this wrapper so the debug summary at
347
+ // the end is derived from what was actually registered, not hand-maintained.
348
+ const registeredToolNames: string[] = [];
349
+ const registerTool: OpenClawPluginApi["registerTool"] = (tool, opts) => {
350
+ if (opts?.name) registeredToolNames.push(opts.name);
351
+ api.registerTool(tool, opts);
352
+ };
353
+
346
354
  // Re-resolve at call time so config reloads pick up new tokens / baseUrl.
347
355
  function resolveCurrent(accountId: string | null) {
348
356
  return resolveOpenclawClawlingAccount(api.config!, accountId);
@@ -567,7 +575,7 @@ export function registerOpenclawClawlingTools(
567
575
  }
568
576
 
569
577
  function registerMemoryTools(): void {
570
- api.registerTool(
578
+ registerTool(
571
579
  (ctx) => ({
572
580
  name: "clawchat_memory_search",
573
581
  label: "Search ClawChat Memory",
@@ -601,7 +609,7 @@ export function registerOpenclawClawlingTools(
601
609
  { name: "clawchat_memory_search" },
602
610
  );
603
611
 
604
- api.registerTool(
612
+ registerTool(
605
613
  (ctx) => ({
606
614
  name: "clawchat_memory_read",
607
615
  label: "Read ClawChat Memory",
@@ -654,7 +662,7 @@ export function registerOpenclawClawlingTools(
654
662
  { name: "clawchat_memory_read" },
655
663
  );
656
664
 
657
- api.registerTool(
665
+ registerTool(
658
666
  (ctx) => ({
659
667
  name: "clawchat_memory_write",
660
668
  label: "Write ClawChat Memory",
@@ -686,7 +694,7 @@ export function registerOpenclawClawlingTools(
686
694
  { name: "clawchat_memory_write" },
687
695
  );
688
696
 
689
- api.registerTool(
697
+ registerTool(
690
698
  (ctx) => ({
691
699
  name: "clawchat_memory_edit",
692
700
  label: "Edit ClawChat Memory",
@@ -718,7 +726,7 @@ export function registerOpenclawClawlingTools(
718
726
  { name: "clawchat_memory_edit" },
719
727
  );
720
728
 
721
- api.registerTool(
729
+ registerTool(
722
730
  (ctx) => {
723
731
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
724
732
  return {
@@ -802,7 +810,7 @@ export function registerOpenclawClawlingTools(
802
810
  { name: "clawchat_metadata_sync" },
803
811
  );
804
812
 
805
- api.registerTool(
813
+ registerTool(
806
814
  (ctx) => {
807
815
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
808
816
  return {
@@ -861,7 +869,7 @@ export function registerOpenclawClawlingTools(
861
869
 
862
870
  registerMemoryTools();
863
871
 
864
- api.registerTool(
872
+ registerTool(
865
873
  (ctx) => {
866
874
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
867
875
  return {
@@ -886,7 +894,7 @@ export function registerOpenclawClawlingTools(
886
894
  { name: "clawchat_get_account_profile" },
887
895
  );
888
896
 
889
- api.registerTool(
897
+ registerTool(
890
898
  (ctx) => {
891
899
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
892
900
  return {
@@ -912,7 +920,7 @@ export function registerOpenclawClawlingTools(
912
920
  { name: "clawchat_get_user_profile" },
913
921
  );
914
922
 
915
- api.registerTool(
923
+ registerTool(
916
924
  (ctx) => {
917
925
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
918
926
  return {
@@ -934,7 +942,7 @@ export function registerOpenclawClawlingTools(
934
942
  { name: "clawchat_list_account_friends" },
935
943
  );
936
944
 
937
- api.registerTool(
945
+ registerTool(
938
946
  (ctx) => {
939
947
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
940
948
  return {
@@ -957,7 +965,7 @@ export function registerOpenclawClawlingTools(
957
965
  { name: "clawchat_send_friend_request" },
958
966
  );
959
967
 
960
- api.registerTool(
968
+ registerTool(
961
969
  (ctx) => {
962
970
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
963
971
  return {
@@ -980,7 +988,7 @@ export function registerOpenclawClawlingTools(
980
988
  { name: "clawchat_list_friend_requests" },
981
989
  );
982
990
 
983
- api.registerTool(
991
+ registerTool(
984
992
  (ctx) => {
985
993
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
986
994
  return {
@@ -1003,7 +1011,7 @@ export function registerOpenclawClawlingTools(
1003
1011
  { name: "clawchat_accept_friend_request" },
1004
1012
  );
1005
1013
 
1006
- api.registerTool(
1014
+ registerTool(
1007
1015
  (ctx) => {
1008
1016
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1009
1017
  return {
@@ -1026,7 +1034,7 @@ export function registerOpenclawClawlingTools(
1026
1034
  { name: "clawchat_reject_friend_request" },
1027
1035
  );
1028
1036
 
1029
- api.registerTool(
1037
+ registerTool(
1030
1038
  (ctx) => {
1031
1039
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1032
1040
  return {
@@ -1049,7 +1057,7 @@ export function registerOpenclawClawlingTools(
1049
1057
  { name: "clawchat_remove_friend" },
1050
1058
  );
1051
1059
 
1052
- api.registerTool(
1060
+ registerTool(
1053
1061
  (ctx) => {
1054
1062
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1055
1063
  return {
@@ -1078,7 +1086,7 @@ export function registerOpenclawClawlingTools(
1078
1086
  { name: "clawchat_search_users" },
1079
1087
  );
1080
1088
 
1081
- api.registerTool(
1089
+ registerTool(
1082
1090
  (ctx) => {
1083
1091
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1084
1092
  return {
@@ -1111,7 +1119,7 @@ export function registerOpenclawClawlingTools(
1111
1119
  { name: "clawchat_get_conversation" },
1112
1120
  );
1113
1121
 
1114
- api.registerTool(
1122
+ registerTool(
1115
1123
  (ctx) => {
1116
1124
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1117
1125
  return {
@@ -1146,7 +1154,7 @@ export function registerOpenclawClawlingTools(
1146
1154
  { name: "clawchat_get_direct_conversation" },
1147
1155
  );
1148
1156
 
1149
- api.registerTool(
1157
+ registerTool(
1150
1158
  (ctx) => {
1151
1159
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1152
1160
  return {
@@ -1181,7 +1189,7 @@ export function registerOpenclawClawlingTools(
1181
1189
  { name: "clawchat_leave_group" },
1182
1190
  );
1183
1191
 
1184
- api.registerTool(
1192
+ registerTool(
1185
1193
  (ctx) => {
1186
1194
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1187
1195
  return {
@@ -1216,7 +1224,7 @@ export function registerOpenclawClawlingTools(
1216
1224
  { name: "clawchat_add_group_member" },
1217
1225
  );
1218
1226
 
1219
- api.registerTool(
1227
+ registerTool(
1220
1228
  (ctx) => {
1221
1229
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1222
1230
  return {
@@ -1288,7 +1296,7 @@ export function registerOpenclawClawlingTools(
1288
1296
  { name: "clawchat_mention_message" },
1289
1297
  );
1290
1298
 
1291
- api.registerTool(
1299
+ registerTool(
1292
1300
  (ctx) => {
1293
1301
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1294
1302
  return {
@@ -1345,7 +1353,7 @@ export function registerOpenclawClawlingTools(
1345
1353
  { name: "clawchat_react_message" },
1346
1354
  );
1347
1355
 
1348
- api.registerTool(
1356
+ registerTool(
1349
1357
  (ctx) => {
1350
1358
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1351
1359
  return {
@@ -1373,7 +1381,7 @@ export function registerOpenclawClawlingTools(
1373
1381
  { name: "clawchat_list_moments" },
1374
1382
  );
1375
1383
 
1376
- api.registerTool(
1384
+ registerTool(
1377
1385
  (ctx) => {
1378
1386
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1379
1387
  return {
@@ -1394,7 +1402,7 @@ export function registerOpenclawClawlingTools(
1394
1402
  { name: "clawchat_get_moment" },
1395
1403
  );
1396
1404
 
1397
- api.registerTool(
1405
+ registerTool(
1398
1406
  (ctx) => {
1399
1407
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1400
1408
  return {
@@ -1427,7 +1435,7 @@ export function registerOpenclawClawlingTools(
1427
1435
  { name: "clawchat_create_moment" },
1428
1436
  );
1429
1437
 
1430
- api.registerTool(
1438
+ registerTool(
1431
1439
  (ctx) => {
1432
1440
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1433
1441
  return {
@@ -1450,7 +1458,7 @@ export function registerOpenclawClawlingTools(
1450
1458
  { name: "clawchat_delete_moment" },
1451
1459
  );
1452
1460
 
1453
- api.registerTool(
1461
+ registerTool(
1454
1462
  (ctx) => {
1455
1463
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1456
1464
  return {
@@ -1478,7 +1486,7 @@ export function registerOpenclawClawlingTools(
1478
1486
  { name: "clawchat_toggle_moment_reaction" },
1479
1487
  );
1480
1488
 
1481
- api.registerTool(
1489
+ registerTool(
1482
1490
  (ctx) => {
1483
1491
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1484
1492
  return {
@@ -1506,7 +1514,7 @@ export function registerOpenclawClawlingTools(
1506
1514
  { name: "clawchat_create_moment_comment" },
1507
1515
  );
1508
1516
 
1509
- api.registerTool(
1517
+ registerTool(
1510
1518
  (ctx) => {
1511
1519
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1512
1520
  return {
@@ -1538,7 +1546,7 @@ export function registerOpenclawClawlingTools(
1538
1546
  { name: "clawchat_reply_moment_comment" },
1539
1547
  );
1540
1548
 
1541
- api.registerTool(
1549
+ registerTool(
1542
1550
  (ctx) => {
1543
1551
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1544
1552
  return {
@@ -1563,7 +1571,7 @@ export function registerOpenclawClawlingTools(
1563
1571
  { name: "clawchat_delete_moment_comment" },
1564
1572
  );
1565
1573
 
1566
- api.registerTool(
1574
+ registerTool(
1567
1575
  (ctx) => {
1568
1576
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1569
1577
  return {
@@ -1606,7 +1614,7 @@ export function registerOpenclawClawlingTools(
1606
1614
  { name: "clawchat_update_account_profile" },
1607
1615
  );
1608
1616
 
1609
- api.registerTool(
1617
+ registerTool(
1610
1618
  (ctx) => {
1611
1619
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1612
1620
  return {
@@ -1651,7 +1659,7 @@ export function registerOpenclawClawlingTools(
1651
1659
  { name: "clawchat_upload_avatar_image" },
1652
1660
  );
1653
1661
 
1654
- api.registerTool(
1662
+ registerTool(
1655
1663
  (ctx) => {
1656
1664
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1657
1665
  return {
@@ -1673,7 +1681,7 @@ export function registerOpenclawClawlingTools(
1673
1681
  { name: "clawchat_register_app" },
1674
1682
  );
1675
1683
 
1676
- api.registerTool(
1684
+ registerTool(
1677
1685
  (ctx) => {
1678
1686
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1679
1687
  return {
@@ -1691,7 +1699,7 @@ export function registerOpenclawClawlingTools(
1691
1699
  { name: "clawchat_list_apps" },
1692
1700
  );
1693
1701
 
1694
- api.registerTool(
1702
+ registerTool(
1695
1703
  (ctx) => {
1696
1704
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1697
1705
  return {
@@ -1710,7 +1718,7 @@ export function registerOpenclawClawlingTools(
1710
1718
  { name: "clawchat_unregister_app" },
1711
1719
  );
1712
1720
 
1713
- api.registerTool(
1721
+ registerTool(
1714
1722
  (ctx) => {
1715
1723
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1716
1724
  return {
@@ -1790,7 +1798,7 @@ export function registerOpenclawClawlingTools(
1790
1798
  // to read `code` itself; rewriting the shape here would make the same
1791
1799
  // sentence behave differently than on the Hermes side.
1792
1800
 
1793
- api.registerTool(
1801
+ registerTool(
1794
1802
  (ctx) => {
1795
1803
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1796
1804
  return {
@@ -1812,7 +1820,7 @@ export function registerOpenclawClawlingTools(
1812
1820
  { name: "clawchat_orchestrate_list_agents" },
1813
1821
  );
1814
1822
 
1815
- api.registerTool(
1823
+ registerTool(
1816
1824
  (ctx) => {
1817
1825
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1818
1826
  return {
@@ -1835,7 +1843,7 @@ export function registerOpenclawClawlingTools(
1835
1843
  { name: "clawchat_orchestrate_get_agent" },
1836
1844
  );
1837
1845
 
1838
- api.registerTool(
1846
+ registerTool(
1839
1847
  (ctx) => {
1840
1848
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1841
1849
  return {
@@ -1865,7 +1873,7 @@ export function registerOpenclawClawlingTools(
1865
1873
  { name: "clawchat_orchestrate_set_agent_behavior" },
1866
1874
  );
1867
1875
 
1868
- api.registerTool(
1876
+ registerTool(
1869
1877
  (ctx) => {
1870
1878
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1871
1879
  return {
@@ -1886,7 +1894,7 @@ export function registerOpenclawClawlingTools(
1886
1894
  { name: "clawchat_orchestrate_list_groups" },
1887
1895
  );
1888
1896
 
1889
- api.registerTool(
1897
+ registerTool(
1890
1898
  (ctx) => {
1891
1899
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1892
1900
  return {
@@ -1908,7 +1916,7 @@ export function registerOpenclawClawlingTools(
1908
1916
  { name: "clawchat_orchestrate_get_group" },
1909
1917
  );
1910
1918
 
1911
- api.registerTool(
1919
+ registerTool(
1912
1920
  (ctx) => {
1913
1921
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1914
1922
  return {
@@ -1938,7 +1946,7 @@ export function registerOpenclawClawlingTools(
1938
1946
  { name: "clawchat_orchestrate_set_group_prompt" },
1939
1947
  );
1940
1948
 
1941
- api.registerTool(
1949
+ registerTool(
1942
1950
  (ctx) => {
1943
1951
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1944
1952
  return {
@@ -1960,7 +1968,7 @@ export function registerOpenclawClawlingTools(
1960
1968
  { name: "clawchat_orchestrate_create_group" },
1961
1969
  );
1962
1970
 
1963
- api.registerTool(
1971
+ registerTool(
1964
1972
  (ctx) => {
1965
1973
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1966
1974
  return {
@@ -1988,7 +1996,7 @@ export function registerOpenclawClawlingTools(
1988
1996
  { name: "clawchat_orchestrate_add_group_member" },
1989
1997
  );
1990
1998
 
1991
- api.registerTool(
1999
+ registerTool(
1992
2000
  (ctx) => {
1993
2001
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
1994
2002
  return {
@@ -2015,7 +2023,7 @@ export function registerOpenclawClawlingTools(
2015
2023
  { name: "clawchat_orchestrate_remove_group_member" },
2016
2024
  );
2017
2025
 
2018
- api.registerTool(
2026
+ registerTool(
2019
2027
  (ctx) => {
2020
2028
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
2021
2029
  return {
@@ -2050,14 +2058,14 @@ export function registerOpenclawClawlingTools(
2050
2058
  { name: "clawchat_orchestrate_set_group_agent_settings" },
2051
2059
  );
2052
2060
 
2053
- api.registerTool(
2061
+ registerTool(
2054
2062
  (ctx) => {
2055
2063
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
2056
2064
  return {
2057
2065
  name: "clawchat_orchestrate_create_connect_code",
2058
2066
  label: "Issue A Connect Code",
2059
2067
  description: toolDescription(
2060
- "Mint a connect code on the owner's behalf, valid 30 minutes. " +
2068
+ "Mint a connect code on the owner's behalf, valid 45 minutes. " +
2061
2069
  "TRIGGER — invoke when the owner asks for a code to connect a new agent. " +
2062
2070
  "The rate limit bucket belongs to the owner and is shared with their own manual issuance, so do not retry on a limit.",
2063
2071
  ),
@@ -2075,7 +2083,7 @@ export function registerOpenclawClawlingTools(
2075
2083
  { name: "clawchat_orchestrate_create_connect_code" },
2076
2084
  );
2077
2085
 
2078
- api.registerTool(
2086
+ registerTool(
2079
2087
  (ctx) => {
2080
2088
  const accountId = resolveOpenclawClawlingToolAccountId(ctx);
2081
2089
  return {
@@ -2103,6 +2111,8 @@ export function registerOpenclawClawlingTools(
2103
2111
  );
2104
2112
 
2105
2113
  api.logger.debug?.(
2106
- "clawchat-plugin-openclaw: registered 43 clawchat_* tools (get_account_profile, get_user_profile, list_account_friends, send_friend_request, list_friend_requests, accept_friend_request, reject_friend_request, remove_friend, search_users, get_conversation, mention_message, list_moments, get_moment, create_moment, delete_moment, toggle_moment_reaction, create_moment_comment, reply_moment_comment, delete_moment_comment, update_account_profile, upload_avatar_image, memory_search, memory_read, memory_write, memory_edit, metadata_sync, metadata_update, register_app, list_apps, unregister_app, liveware_login, orchestrate_list_agents, orchestrate_get_agent, orchestrate_set_agent_behavior, orchestrate_list_groups, orchestrate_get_group, orchestrate_set_group_prompt, orchestrate_create_group, orchestrate_add_group_member, orchestrate_remove_group_member, orchestrate_set_group_agent_settings, orchestrate_create_connect_code, orchestrate_get_connect_code)",
2114
+ `clawchat-plugin-openclaw: registered ${registeredToolNames.length} clawchat_* tools (${registeredToolNames
2115
+ .map((name) => name.replace(/^clawchat_/, ""))
2116
+ .join(", ")})`,
2107
2117
  );
2108
2118
  }