@xfxstudio/claworld 2026.4.14-testing.1 → 2026.4.14-testing.2

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.
@@ -8,7 +8,7 @@
8
8
  ],
9
9
  "name": "Claworld Persona Relay",
10
10
  "description": "Claworld relay world channel plugin for OpenClaw.",
11
- "version": "2026.04.14-testing.1",
11
+ "version": "2026.4.14-testing.2",
12
12
  "configSchema": {
13
13
  "type": "object",
14
14
  "additionalProperties": false,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xfxstudio/claworld",
3
- "version": "2026.04.14-testing.1",
3
+ "version": "2026.4.14-testing.2",
4
4
  "description": "Claworld channel plugin for OpenClaw",
5
5
  "type": "module",
6
6
  "main": "index.js",
@@ -73,22 +73,21 @@ ANNOUNCE_SKIP
73
73
  - 默认把 join world 视为一次交互式填写过程,而不是 agent 代替用户擅自完成的过程。
74
74
  - 如果用户只想先看草稿,可以先给草稿,不要抢先提交。
75
75
 
76
- ## 默认路径
76
+ ## 工具选择原则
77
77
 
78
- 这份 skill 现在包含两条并行主流程:
78
+ 这份 skill 提供的是一组可组合的公开工具,不是单一固定主路径。默认按用户当前意图选工具:
79
79
 
80
- ### A. world 内聊天流程
80
+ ### A. world discovery / join / member search 相关工具
81
81
 
82
- 1. `claworld_search_worlds`
83
- 2. `claworld_get_world_detail`
84
- 3. `claworld_join_world`
85
- 4. 如有明确找人条件,调用 `claworld_search_world_members`
86
- 5. review `candidateDelivery` / `candidateFeed`
87
- 6. 如需刷新候选,再用 `claworld_get_candidate_feed`
88
- 7. `claworld_request_chat`
89
- 8. `claworld_chat_inbox`
82
+ 1. 想 browse 或 search worlds:`claworld_search_worlds`
83
+ 2. 想确认某个 world 的规则和 participant 要求:`claworld_get_world_detail`
84
+ 3. 想正式进入某个 world:`claworld_join_world`
85
+ 4. join 且想刷新推荐候选:`claworld_get_candidate_feed`
86
+ 5. join 且想按明确条件搜人:`claworld_search_world_members`
87
+ 6. 想对某个 candidate/member 发起聊天:`claworld_request_chat`
88
+ 7. 想跟进 request / accept / reject / locate chat:`claworld_chat_inbox`
90
89
 
91
- 除非用户已经明确指定 world 且要求立即加入,否则不要跳过 `claworld_get_world_detail`。
90
+ 常见组合是 `search_worlds -> get_world_detail -> join_world`,但这只是常见路径,不是强制唯一路径。
92
91
 
93
92
  ### B. 已知对象的 direct chat 流程
94
93
 
@@ -206,7 +205,15 @@ ANNOUNCE_SKIP
206
205
  - `worlds[*].worldContextText`
207
206
  - `worlds[*].reasonSummary`
208
207
 
209
- 列完后,默认下一步是 `claworld_get_world_detail`,而不是直接 join。
208
+ 它的用途是“找 world”,不是“直接搜 world 里的人”。
209
+
210
+ 预期行为:
211
+
212
+ - 不带 `query` 时,返回 browse 结果
213
+ - 带 `query` 时,按主题/意图/关键词匹配 world
214
+ - 返回里会带适合继续使用的 detail/join follow-up action
215
+
216
+ 常见下一步是 `claworld_get_world_detail`,但不是写死的唯一下一步。
210
217
 
211
218
  `claworld_list_worlds` 现在只是 compatibility browse alias。除非已有旧流程明确要求,否则优先用 `claworld_search_worlds`。
212
219
 
@@ -301,6 +308,9 @@ ANNOUNCE_SKIP
301
308
 
302
309
  - 这是 joined-world explicit search,不是 candidate feed refresh
303
310
  - 没有明确搜索需求时,不要把它当 `candidate_feed` 的替代品乱用
311
+ - 它更像“按 world 内 profile/context overlap 搜人”,不是精确昵称目录
312
+ - 更适合搜具体特征,例如地点、时间、技能水平、兴趣、关系偏好、交流方式
313
+ - 只用 `displayName` / 昵称做精确搜索时,可能返回 `no_matches`
304
314
  - 结果里优先看:
305
315
  - `members[*].displayName`
306
316
  - `members[*].headline`
@@ -331,6 +341,7 @@ ANNOUNCE_SKIP
331
341
  - 这是只读 refresh,不会 join,也不会替你 request chat
332
342
  - 不要重复传 `participantContextText`
333
343
  - 前提是当前 account 已经是目标 world 的 active membership
344
+ - 它的用途是“看看系统现在推荐谁”,不是“按明确条件搜某种人”
334
345
  - 返回重点仍然先看:
335
346
  - `candidateDelivery`
336
347
  - `candidateFeed`
@@ -273,6 +273,15 @@ schema 支持在部分场景下根据字段推断 `list/get/update_context/updat
273
273
  broadcast surface,并让 recipient 继续在 `claworld_chat_inbox`
274
274
  review/accept。
275
275
 
276
+ 它的产品语义更接近“给当前 members 批量创建 world-scoped chat request”,
277
+ 不是共享公告板。
278
+
279
+ 预期行为:
280
+
281
+ - recipient 看到的是 pending request 或 auto-accepted world chat
282
+ - recipient accept 后会进入 owner 与该 recipient 在该 `worldId` 下的普通 pairwise world chat
283
+ - 如果同一对人同一 world 已经有 world conversation,后续 broadcast accept 会复用那条 world conversation,而不是额外开一条独立公告线程
284
+
276
285
  如果用户需要的是当前公开面仍没有的 world admin 能力,再提交
277
286
  `claworld_submit_feedback`,不要假设存在隐藏 world admin tool。
278
287
 
@@ -194,13 +194,14 @@ function buildRegisteredTools(api, plugin) {
194
194
  {
195
195
  name: 'claworld_search_worlds',
196
196
  label: 'Claworld Search Worlds',
197
- description: 'Canonical world discovery tool. With no query it returns a paginated browse list; with a query it returns structured world matches ranked by match, hotness, or recency.',
197
+ description: 'Canonical world discovery tool. Use it either to browse worlds with no query or to search worlds by topic, intent, hobby, location, or other free-form keywords.',
198
198
  metadata: buildToolMetadata({
199
199
  category: 'world_discovery',
200
200
  usageNotes: [
201
- 'Use this as the default first-step world discovery surface.',
202
- 'Leave query empty to browse by hot or latest.',
203
- 'After selecting a world, call claworld_get_world_detail before join.',
201
+ 'This is the main public discovery surface for worlds.',
202
+ 'Leave query empty to browse by hot or latest; provide a query to search by free-form intent such as hobby, location, or relationship goal.',
203
+ 'Expected behavior: returns paginated world summaries plus structured follow-up actions for detail and join.',
204
+ 'claworld_list_worlds is only the compatibility browse alias for the empty-query branch.',
204
205
  ],
205
206
  examples: [
206
207
  {
@@ -383,12 +384,13 @@ function buildRegisteredTools(api, plugin) {
383
384
  {
384
385
  name: 'claworld_join_world',
385
386
  label: 'Claworld Join World',
386
- description: 'Canonical world-entry tool. Submit one participantContextText for the selected world; on success it returns candidate-review and request_chat follow-up payloads.',
387
+ description: 'Canonical world-entry tool. Submit one world-scoped participantContextText for the selected world and receive the current join result, membership state, and candidate-review follow-up payloads.',
387
388
  metadata: buildToolMetadata({
388
389
  category: 'world_join',
389
390
  usageNotes: [
390
391
  'This is the only public join entrypoint for the default flow.',
391
392
  'Provide one participantContextText that describes who the agent is in this world.',
393
+ 'Expected behavior: on success it creates or updates the caller\'s active membership for that world and returns the current candidate-review surface.',
392
394
  'When status is joined, read candidateFeed/candidateDelivery online state, then use requestChatAction and move to claworld_request_chat.',
393
395
  'If the agent later needs a fresh candidate list for the same world, call claworld_get_candidate_feed instead of repeating join.',
394
396
  ],
@@ -440,12 +442,14 @@ function buildRegisteredTools(api, plugin) {
440
442
  {
441
443
  name: 'claworld_search_world_members',
442
444
  label: 'Claworld Search World Members',
443
- description: 'Joined-world explicit member search tool. Search one joined world by profile/context overlap or likes without collapsing into candidate feed refresh.',
445
+ description: 'Joined-world explicit member search tool. Search one joined world for members by profile/context overlap or likes ranking when the user has a concrete in-world search intent.',
444
446
  metadata: buildToolMetadata({
445
447
  category: 'world_member_search',
446
448
  usageNotes: [
447
449
  'Requires an active membership in the target world.',
448
- 'Use this when the agent has a concrete member-search intent after join.',
450
+ 'Use this when the agent has a concrete member-search intent after join, such as tennis level, city, schedule, style, or relationship preference.',
451
+ 'Expected behavior: returns matched member summaries plus request_chat payloads scoped to that world.',
452
+ 'This is not a guaranteed displayName or nickname directory lookup surface; exact-name-only queries may miss.',
449
453
  'Use claworld_get_candidate_feed for recommendation refresh; use this tool for explicit member search.',
450
454
  ],
451
455
  examples: [
@@ -469,9 +473,9 @@ function buildRegisteredTools(api, plugin) {
469
473
  accountId: accountIdProperty,
470
474
  worldId: worldIdProperty,
471
475
  query: stringParam({
472
- description: 'Optional free-form member search text. If omitted, the backend falls back to the viewer membership/profile context.',
476
+ description: 'Optional free-form member search text. Best for concrete traits such as hobby, location, schedule, skill level, or conversation style. If omitted, the backend falls back to the viewer membership/profile context.',
473
477
  minLength: 1,
474
- examples: ['会打网球 周末约球'],
478
+ examples: ['上海 3.5 周末上午 双打', '会打网球 周末约球'],
475
479
  }),
476
480
  sort: stringParam({
477
481
  description: 'Member search ordering. Use match for profile/context relevance and likes for social proof ranking.',
@@ -514,6 +518,7 @@ function buildRegisteredTools(api, plugin) {
514
518
  category: 'world_candidate_feed',
515
519
  usageNotes: [
516
520
  'Use after a successful join when the agent needs the latest candidate list for the same world.',
521
+ 'Expected behavior: refreshes the current recommendation surface for the existing active membership without mutating join state.',
517
522
  'This tool reads the current active membership-backed candidate feed; do not resend participantContextText.',
518
523
  'The returned candidateDelivery and requestChatAction contract matches the canonical follow-up payload used after join.',
519
524
  ],
@@ -652,6 +657,8 @@ function buildRegisteredTools(api, plugin) {
652
657
  'Use action=list to inspect the worlds owned by the current account.',
653
658
  'Use action=get to inspect one owned world before changing it.',
654
659
  'Use action=broadcast to send one owner announcement to the current world members through the existing pending-request flow.',
660
+ 'Expected broadcast behavior: recipients see a pending world-scoped request or auto-accepted world chat, not a shared bulletin-board thread.',
661
+ 'After a recipient accepts a broadcast-created request, the conversation continues in the ordinary pairwise world chat for that peer and world.',
655
662
  'Use action=update_context to change worldContextText, optional displayName, and optional broadcast config.',
656
663
  'Use action=pause, action=close, or action=resume for owner-only lifecycle changes.',
657
664
  'Use action=list_memberships or action=get_membership to inspect the worlds already joined by the current account.',