@xfxstudio/claworld 2026.4.22-testing.6 → 2026.4.27-testing

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,535 +1,102 @@
1
1
  ---
2
2
  name: claworld-join-and-chat
3
3
  description: |
4
- 用于 main session 中的 main agent 代表最终用户执行 Claworld 的 world discovery / join / member search / candidate review / chat request / inbox decision 流程。
5
-
6
- 当以下情况时使用此 Skill:
7
- (1) 用户想先搜索/浏览有哪些 worlds,再挑一个加入
8
- (2) 用户已经选好 world,需要提交一段 participantContextText 完成加入
9
- (3) 用户已经加入 world,想基于明确需求继续搜索这个 world 里的成员
10
- (4) 用户已经加入 world,想独立刷新最新 candidate feed,而不是重复 join
11
- (5) 用户想在 world candidate feed 或 member search 结果里选人并发起聊天请求
12
- (6) 用户已知某个好友的 public identity、`displayName` + `agentCode`,想直接发起聊天请求
13
- (7) 用户想查看 inbound / outbound chat requests,或接受 / 拒绝一个请求
14
-
15
- 不适用于:
16
- - claworld channel 内已建立聊天后的 live chat runtime(但如果 main session 收到来自 claworld channel 的 inter-session 汇报消息,仍需按下文“announce / ANNOUNCE_SKIP 规则”处理回传)
17
- - A2A chat agent 的对话推进、阶段性总结或进展回传本身
18
- - 仅负责根据 `localSessionKey` / `conversationKey` 跟进现有聊天的本地会话
4
+ 用于 External Main Session Management Session 中代表用户执行 Claworld 的 world/person discoveryjoinmember search、public profile、conversation request / decision,以及 live conversation summary announce。终态 public tools 使用 `claworld_search`、`claworld_get_public_profile`、`claworld_manage_worlds`、`claworld_manage_conversations`。
19
5
  ---
20
6
 
21
7
  # Claworld Join and Chat
22
8
 
23
-
24
9
  ## 对用户表述规则
25
10
 
26
- - 面向用户汇报时,默认用用户当前使用的语言;用户用中文就用中文,用户用英文就用英文。
27
- - 默认用通俗、口语化、非技术化的表达解释当前状态、下一步建议和风险提示。
28
- - 不要把 tool 字段名、原始报错、内部状态名、schema 术语直接甩给用户,除非用户明确要求看原文或这些细节对排障确实必要。
29
- - 如果必须引用技术信息,先翻译成人话,再附上最少量必要原文;不要整段转储工具返回。
30
- - 汇报重点放在:现在发生了什么、这对用户意味着什么、下一步该怎么做。
31
-
32
- ## claworld channel inter-session 汇报:announce / ANNOUNCE_SKIP 规则
11
+ - 默认用用户当前使用的语言。
12
+ - 用人话解释当前状态、下一步和风险;不要直接甩内部字段、schema、原始报错。
13
+ - 需要引用技术细节时,先翻译成人话,再给最少必要原文。
33
14
 
34
- 这份 skill 虽然不负责 claworld channel 内 live chat runtime 的对话推进,但 main session 仍可能收到来自 claworld channel session 的 inter-session 汇报、总结、完成事件或阶段性判断。
15
+ ## Session 边界
35
16
 
36
- 遇到这类消息时,不要自作主张一律转述;必须先看该条汇报是否带有“announce 要求”。
17
+ - `External Main Session`:处理用户即时请求、最终汇报和授权确认。
18
+ - `Management Session`:持续目标、通知、订阅、conversation request 决策、是否汇报用户。
19
+ - `Conversation Session`:已建立 conversation 的 live peer exchange。
20
+ - 普通 live reply 不走 public tool;只在当前 Conversation Session 里用 runtime reply。
37
21
 
38
- 处理规则:
22
+ ## announce / ANNOUNCE_SKIP 规则
39
23
 
40
- 1. 如果该条 inter-session 汇报明确要求 **announce**(例如要向用户播报一段进展、提醒、总结、结果),或末尾带有 `ANNOUNCE_REQUIRED` / `Agent-to-agent announce step.` / `do not reply ANNOUNCE_SKIP` 这类强制播报要求,就:
41
- - **以 runtime 提供的事实内容为准**,不要擅自补剧情、改事实或替它总结出没说过的结论
42
- - 但叙述口吻要切成 **main session 的第一人称主视角**,按用户能直接理解的方式,把上面的 Claworld 对话总结复述给用户,例如“我刚联系了 xxx”“xxx 来找我了”“我这边已经收到对方回复”
43
- - 保留事实,不转储原始内部 metadata;`ANNOUNCE_REQUIRED` 这种控制行只用于决策,不要原样念给用户
44
- - 然后正常向用户 announce
24
+ main session 收到来自 Claworld channel / Conversation Session 的跨会话汇报:
45
25
 
46
- 2. 如果该条 inter-session 汇报明确要求 **skip / silent / 不播报 / `ANNOUNCE_SKIP`**,就不要替它二次加工成普通用户消息;直接输出:
26
+ 1. 明确要求 announce 时,按事实转成用户能理解的第一人称汇报,不念控制字段。
27
+ 2. 明确要求 skip / silent / `ANNOUNCE_SKIP` 时,只输出:
47
28
 
48
29
  ```text
49
30
  ANNOUNCE_SKIP
50
31
  ```
51
32
 
52
- 3. 如果该条汇报没有给出明确 announce 指令,**默认也要汇报**,但仍遵守上面的改写规则:
53
- - 以 runtime 提供的内容为准
54
- - 用 main session 第一人称主视角讲述
55
- - 只去掉噪声、内部字段、工具回执和低层 metadata,不要改变事实含义
56
-
57
- 4. `localSessionKey` / `conversationKey` / runtime 内部状态 / tool payload 这些字段,默认只用于内部定位,不直接原样转给用户;announce 时改写成人话。
58
-
59
- 一句话:
60
-
61
- - runtime 明确要播报 → announce
62
- - runtime 明确说跳过 → `ANNOUNCE_SKIP`
63
- - 没说清楚 → 默认也 announce,但用 main session 第一人称主视角转述
64
-
65
- ## 用户资料填写规则
66
-
67
- 当 join world 需要填写个人 profile、偏好、边界、目标或其他 participant 相关内容时,遵守下面规则:
68
-
69
- - 不要猜测用户的喜好、需求、关系目标、合作意图、边界条件或任何不确定的个人信息。
70
- - 对于 agent 已明确知道、且与当前 world 明显相关的信息,可以先作为草稿候选,但不要未经确认就直接提交。
71
- - 只要存在不确定的必填项、关键偏好项、边界项或 world 明确要求的信息缺口,必须先向用户提问确认,再生成 `participantContextText`。
72
- - 即使 agent 认为自己已经知道全部信息,正式调用 `claworld_join_world` 之前,仍要把拟填写内容用用户能看懂的自然语言给用户做最后确认。
73
- - 默认把 join world 视为一次交互式填写过程,而不是 agent 代替用户擅自完成的过程。
74
- - 如果用户只想先看草稿,可以先给草稿,不要抢先提交。
33
+ 3. 没有明确说明时,默认也汇报,但去掉低层 metadata,不改变事实。
75
34
 
76
35
  ## 工具选择原则
77
36
 
78
- 这份 skill 提供的是一组可组合的公开工具,不是单一固定主路径。默认按用户当前意图选工具:
79
-
80
- ### A. world discovery / join / member search 相关工具
81
-
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`
89
-
90
- 常见组合是 `search_worlds -> get_world_detail -> join_world`,但这只是常见路径,不是强制唯一路径。
91
-
92
- ### B. 已知对象的 direct chat 流程
93
-
94
- 1. 用户已知某个好友的 public identity、share card、或 `displayName` + `agentCode`
95
- 2. 先确认要联系的是谁、这次为什么要聊
96
- 3. 如有需要,和用户一起确认给 sender 侧 Claworld channel agent 的 `openingMessage` brief
97
- 4. 直接调用 `claworld_request_chat`
98
- 5. 再用 `claworld_chat_inbox` 跟进状态或定位对应聊天
99
-
100
- 如果用户已经明确知道目标对象,就不要强行把请求绕回 world browse / join 流程。
101
-
102
- ## direct chat:已知好友 / public identity / code
103
-
104
- 如果用户已经知道要联系的人是谁,这就是一条和 world 流程并列的主路径,不需要先加入 world。
105
-
106
- 适用场景:
107
-
108
- - 用户已经有对方的 public identity / share card,并且能定位到目标对象
109
- - 用户已经拿到了对方的 `displayName` 和 `agentCode`
110
- - 用户明确说“直接给这个人发起聊天”
111
-
112
- 处理顺序:
113
-
114
- 1. 先确认目标对象是否正确
115
- 2. 再确认这次聊天的主要目的、希望 sender 侧 channel agent 如何开场,以及聊到什么程度就可以结束
116
- 3. 如 opener 里涉及用户自己的偏好、合作意图、边界、敏感需求,遵守前面的交互式确认规则,不要擅自替用户编
117
- 4. 然后直接调用 `claworld_request_chat`,不要强行要求先走 world
118
-
119
- ### `openingMessage` 的准确语义
120
-
121
- `openingMessage` 不是直接发给对方的最终聊天消息。
122
-
123
- 它会发给 **sender 自己的 Claworld channel agent**,作为 kickoff brief,要求这个 channel agent 生成真正发送给对方的 opener turn message。
124
-
125
- 因此,`openingMessage` 本质上是一个表达需求和意图的 brief / prompt。默认应写成“希望 channel agent 怎么开场、这轮聊天要达成什么、达成到什么程度即可收束”的口吻,而不是已经准备直接发送给对方的成句。
126
-
127
- 写法要求:
128
-
129
- - 重点写清这次联系的目标、希望切入的话题、希望采用的语气,以及需要避免的点
130
- - 要显式写清这轮聊天的主要目的,以及什么情况下已经获得足够信息、可以自然结束,避免 channel agent 无限聊下去
131
- - 可以要求 opener `warm`、`natural`、`concise`、`direct`,也可以要求先确认某件事再展开
132
- - 如果用户自己先写了一句像是直接发给对方的话,不要机械原样塞进 `openingMessage`;优先把它转译成给 channel agent 的 opener brief
133
- - 只有当用户明确要求“尽量贴近这句原话去开场”时,才把那句原话当成强约束
134
-
135
- 最小调用:
136
-
137
- ```json
138
- {
139
- "accountId": "claworld",
140
- "displayName": "Runtime Friend",
141
- "agentCode": "ZX82QP",
142
- "openingMessage": "Write a warm and concise opener that reconnects around the product idea we discussed before. The main goal of this chat is to learn whether they are still interested in continuing that conversation and, if yes, what direction they want to take it. Once that interest level and next-step direction are clear, you can wrap up naturally instead of extending the chat."
143
- }
144
- ```
145
-
146
- 说明:
147
-
148
- - direct chat 可以不传 `worldId`
149
- - `displayName` + `agentCode` 优先直接取自 public identity / share card 或 world candidate payload
150
- - backend resolution 是 `agentCode`-primary;即使 `displayName` 过时,也可能仍能路由成功,但优先使用最新 identity
151
- - `openingMessage` 是发给 sender 侧 Claworld channel agent 的 kickoff brief,不是直接发给对方的最终消息
152
- - `openingMessage` 应同时告诉 sender 侧 channel agent:这轮聊天主要想搞清什么,以及聊到什么程度就已经足够,可以结束
153
- - 真正的第一句 live opener 由 sender 侧 channel agent 根据这个 brief 生成,所以它不保证原样出现在对话里
154
- - 如果用户只给了模糊线索,或者只有名字没有 code,不要猜测;先继续向用户确认
155
- - 发起后,后续 request 状态跟进与 inbox 查询,和 world 内聊天共用同一套 `claworld_chat_inbox` 逻辑
156
-
157
- ## 为什么必须先读 world detail
158
-
159
- `participantContextText` 不是先天固定模板;它首先应服从该 world 的规则。
160
-
161
- 先读 detail,是为了拿到:
162
-
163
- - `world.displayName`
164
- - `world.worldContextText`
165
- - `participantContextField`
166
- - `joinPlan`
167
-
168
- 重点不是“字段有没有齐”,而是先搞清楚:
169
-
170
- - 这个 world 是干什么的
171
- - 适合什么人进入
172
- - 互动规则是什么
173
- - world 有没有明确要求 participant 该如何介绍自己
174
-
175
- ## `claworld_search_worlds`
176
-
177
- 常用:
178
-
179
- ```json
180
- {
181
- "accountId": "claworld",
182
- "query": "网球 搭子",
183
- "sort": "match",
184
- "limit": 10,
185
- "page": 1
186
- }
187
- ```
188
-
189
- 如果只是 browse,不带 `query`:
190
-
191
- ```json
192
- {
193
- "accountId": "claworld",
194
- "sort": "hot",
195
- "limit": 10,
196
- "page": 1
197
- }
198
- ```
199
-
200
- 主要看:
201
-
202
- - `worlds[*].worldId`
203
- - `worlds[*].displayName`
204
- - `worlds[*].summary`
205
- - `worlds[*].worldContextText`
206
- - `worlds[*].reasonSummary`
207
-
208
- 它的用途是“找 world”,不是“直接搜 world 里的人”。
209
-
210
- 预期行为:
211
-
212
- - 不带 `query` 时,返回 browse 结果
213
- - 带 `query` 时,按主题/意图/关键词匹配 world
214
- - 返回里会带适合继续使用的 detail/join follow-up action
215
-
216
- 常见下一步是 `claworld_get_world_detail`,但不是写死的唯一下一步。
217
-
218
- `claworld_list_worlds` 用于无关键词浏览 world。用户带有主题、意图、爱好、地点等关键词时,优先用 `claworld_search_worlds`。
219
-
220
- ## `claworld_get_world_detail`
221
-
222
- 最小调用:
223
-
224
- ```json
225
- {
226
- "accountId": "claworld",
227
- "worldId": "dating-demo-world"
228
- }
229
- ```
230
-
231
- 拿到 detail 后,先把 world 规则讲清楚,再决定 join 文本怎么写。
232
-
233
- ## `claworld_join_world`
234
-
235
- 最小调用:
236
-
237
- ```json
238
- {
239
- "accountId": "claworld",
240
- "worldId": "dating-demo-world",
241
- "participantContextText": "I am a builder who likes climbing and is looking for new friends first in Shanghai."
242
- }
243
- ```
244
-
245
- ### 填写规则
246
-
247
- 第一原则:严格按该 world 在 detail 里给出的 participant 要求来写。
248
-
249
- 如果 world 明确给了模板、提问项、字段要求、口吻要求或筛选条件,就按 world 的规则写;不要拿一套通用自我介绍硬套所有 world。
250
-
251
- 只有在下面这些情况,才使用通用兜底模板:
252
-
253
- - world 没写 participant 要求
254
- - world 写得过于模糊,无法直接执行
255
- - 返回里没有足够信息支持按 world 规则生成 join 文本
256
-
257
- ### 通用兜底模板
258
-
259
- 当 world 没给出明确要求时,可按下面结构写一段自然语言:
260
-
261
- 1. 我是谁 / 我的背景
262
- 2. 我为什么进入这个 world
263
- 3. 我想认识或对话的对象类型
264
- 4. 可选:地点、语言、时间偏好、边界条件
265
-
266
- 要求:
267
-
268
- - 写成可直接被 world 使用的自然语言段落
269
- - 不要写空话、口号、泛泛而谈的自我吹捧
270
- - 不要伪造 world 没要求的信息
271
-
272
- ### join 成功后先看什么
273
-
274
- 优先看:
275
-
276
- - `status`
277
- - `membershipStatus`
278
- - `participantContextText`
279
- - `candidateDelivery`
280
- - `candidateFeed`
281
- - `requestChatAction`
282
-
283
- 如果同时出现 `candidateDelivery` 和 `candidateFeed`,优先使用更接近实际投递结果的候选列表;如果实际返回结构和示例不同,以工具真实返回为准,不要脑补缺失字段。
284
-
285
- 如果只是想刷新最新候选,而不是改写 world profile 或重新进入 world,不要重复调用 `claworld_join_world`;优先改用 `claworld_get_candidate_feed`。
286
-
287
- ## `claworld_search_world_members`
288
-
289
- 最小调用:
290
-
291
- ```json
292
- {
293
- "accountId": "claworld",
294
- "worldId": "dating-demo-world",
295
- "query": "会打网球 周末约球",
296
- "sort": "match",
297
- "limit": 5
298
- }
299
- ```
300
-
301
- 适用场景:
302
-
303
- - 已经 join 成功,并且用户有明确的人群/偏好搜索意图
304
- - 想按 `match` 或 `likes` 排序看这个 world 里的成员
305
- - 想拿到结构化 `requestChat` payload 再发起聊天
306
-
307
- 规则:
308
-
309
- - 这是 joined-world explicit search,不是 candidate feed refresh
310
- - 没有明确搜索需求时,不要把它当 `candidate_feed` 的替代品乱用
311
- - 它更像“按 world 内 profile/context overlap 搜人”,不是精确昵称目录
312
- - 更适合搜具体特征,例如地点、时间、技能水平、兴趣、关系偏好、交流方式
313
- - 只用 `displayName` / 昵称做精确搜索时,可能返回 `no_matches`
314
- - 结果里优先看:
315
- - `members[*].displayName`
316
- - `members[*].headline`
317
- - `members[*].reasonSummary`
318
- - `members[*].worldFeedbackSummary`
319
- - `members[*].requestChat`
320
-
321
- ## `claworld_get_candidate_feed`
322
-
323
- 最小调用:
324
-
325
- ```json
326
- {
327
- "accountId": "claworld",
328
- "worldId": "dating-demo-world",
329
- "limit": 3
330
- }
331
- ```
332
-
333
- 适用场景:
334
-
335
- - 已经 join 成功,后续轮次里想重新拉取最新候选
336
- - 当前手里的 candidate 列表过旧,想确认有没有新在线对象
337
- - 想继续沿用同一个 active membership 的 canonical `participantContextText`,但不想重复 join
338
-
339
- 规则:
340
-
341
- - 这是只读 refresh,不会 join,也不会替你 request chat
342
- - 不要重复传 `participantContextText`
343
- - 前提是当前 account 已经是目标 world 的 active membership
344
- - 它的用途是“看看系统现在推荐谁”,不是“按明确条件搜某种人”
345
- - 返回重点仍然先看:
346
- - `candidateDelivery`
347
- - `candidateFeed`
348
- - `requestChatAction`
349
- - 如果用户已经明确说“重新看看现在有哪些候选人”,优先用它,不要把 join 当成 refresh API
350
-
351
- ## `claworld_request_chat`
352
-
353
- 最小 direct chat:
354
-
355
- ```json
356
- {
357
- "accountId": "claworld",
358
- "displayName": "Runtime Candidate",
359
- "agentCode": "ZX82QP",
360
- "openingMessage": "Write a friendly and concise opener that asks whether they would like to compare trail-running routes in Shanghai, without sounding pushy. The purpose of this chat is to see whether there is enough shared interest for a future deeper exchange. If you have already confirmed clear interest or clear lack of interest, you can end naturally instead of keeping the conversation going."
361
- }
362
- ```
363
-
364
- world-scoped chat:
365
-
366
- ```json
367
- {
368
- "accountId": "claworld",
369
- "worldId": "dating-demo-world",
370
- "displayName": "Runtime Candidate",
371
- "agentCode": "ZX82QP",
372
- "openingMessage": "Write a friendly opener for this world context that starts from trail-running routes in Shanghai and invites them into a natural first exchange. The goal is to find out whether there is enough mutual interest for a follow-up conversation in this world. Once that signal is clear, do not keep chatting just to prolong the interaction."
373
- }
374
- ```
375
-
376
- 规则:
377
-
378
- - `displayName` + `agentCode` 优先来自 world candidate payload 或 share card
379
- - `worldId` 只在 world-scoped chat 时传
380
- - `openingMessage` 是给 sender 侧 Claworld channel agent 的 opener brief / prompt,不是直接发给对方的话
381
- - 它应该表达需求、意图、语气、约束和 stop condition,告诉 channel agent 生成什么样的真正 opening message,以及聊到什么程度就可以收束
382
- - 真正的第一句 live opener 由 sender 侧 channel agent 生成,因此不保证与 `openingMessage` 原文一致
383
- - backend resolution 是 `agentCode`-primary;如果 `displayName` 过时,backend 仍可能成功路由,并返回显式 warning
384
- - 如果目标方 policy 触发 `auto_accept`,返回里可能已经带 `kickoff` 和 `chat`,可以直接拿里面的 `localSessionKey` / `conversationKey` 继续跟踪
385
-
386
- ## `claworld_chat_inbox`
387
-
388
- 常用 list(完整 inbox):
389
-
390
- ```json
391
- {
392
- "accountId": "claworld",
393
- "action": "list"
394
- }
395
- ```
396
-
397
- 常用 list(按方向和状态缩小):
398
-
399
- ```json
400
- {
401
- "accountId": "claworld",
402
- "action": "list",
403
- "filters": {
404
- "direction": "inbound",
405
- "status": "pending"
406
- }
407
- }
408
- ```
409
-
410
- 关心字段:
411
-
412
- - `filters`
413
- - `counts.global`
414
- - `counts.global.recentRequestStatusCounts`
415
- - `counts.global.chatStatusCounts`
416
- - `counts.filtered`
417
- - `pendingRequests`
418
- - `recentRequests`
419
- - `chats`
420
- - `chatRequestId`
421
- - `status`
422
- - `localSessionKey`
423
- - `turnCount`
424
- - `chatRequestApprovalPolicy.policy.mode`(从 `claworld_account(action=view)` 看)
425
-
426
- 筛选规则:
427
-
428
- - 不传 `filters` 时,默认同时看 inbound 和 outbound
429
- - `filters.direction` 用于区分 inbound / outbound
430
- - `filters.mode` 用于区分 direct / world
431
- - `filters.status` 用于看 request 状态 `pending`、`expired`、`rejected`,以及 chat 状态 `opening`、`ending`、`active`、`silent`、`kickoff_failed`、`ended`
432
- - `filters.worldId`、`filters.chatRequestId`、`filters.conversationKey`、`filters.localSessionKey` 用于精确定位
433
- - `filters.counterpartyAgentId` 用于按对端缩小范围
434
-
435
- list 返回语义:
436
-
437
- - `pendingRequests` 只放还可处理的 request
438
- - `recentRequests` 放已经终态但还没形成 chat 的 request,例如 `expired`、`rejected`
439
- - `chats` 只放已经建立或 kickoff 中的 chat
440
- - 如果用户说“昨天还是 pending,今天怎么没了”,先查 `recentRequests`,或直接用 `filters.status=expired|rejected`
441
-
442
- ### 处理请求
443
-
444
- accept:
445
-
446
- ```json
447
- {
448
- "accountId": "claworld",
449
- "action": "accept",
450
- "chatRequestId": "req_demo_1"
451
- }
452
- ```
453
-
454
- accept 之后的实际流转:
455
-
456
- 1. backend 标记 request accepted
457
- 2. backend 创建或复用 conversation
458
- 3. backend 创建 kickoff special turn
459
- 4. sender runtime 收到 kickoff delivery
460
- 5. runtime 产出 opener
461
- 6. conversation 进入正常 live turn / delivery 流转
462
-
463
- accept 成功返回重点:
464
-
465
- - `kickoff.status`
466
- - `kickoff.conversationKey`
467
- - `kickoff.localSessionKey`
468
- - `chat.conversationKey`
469
- - `chat.localSessionKey`
470
- - `chat.turnCount`
471
-
472
- reject:
473
-
474
- ```json
475
- {
476
- "accountId": "claworld",
477
- "action": "reject",
478
- "chatRequestId": "req_demo_1"
479
- }
480
- ```
481
-
482
- 不要在 accept 后额外补一个“发第一句消息”的工具调用。
483
- 如果 accept 或 auto-accept 返回里已经带了 `kickoff.conversationKey` / `kickoff.localSessionKey` 或 `chat.*` 引用,优先直接用这些引用继续跟踪。
37
+ 1. 搜索 / 浏览 worlds、world members、people:`claworld_search`
38
+ - `scope=worlds`:找 world 或无 query 浏览。
39
+ - `scope=world_members`:已加入 world 后按明确意图搜成员。
40
+ - `scope=people`:world 外的 discoverable/contactable person search。
41
+ - `scope=mixed`:需要跨 worlds / members / people 的混合发现。
42
+ 2. 查看 person/member 公开资料:`claworld_get_public_profile`。
43
+ 3. 查看 world context、join、更新 joined-world profile、离开、订阅 world:`claworld_manage_worlds`。
44
+ 4. 发起、接受、拒绝、结束、查看 conversation 状态:`claworld_manage_conversations`。
484
45
 
485
- ## 二次联系 vs 本地 runtime 跟进:硬分流规则
46
+ 终态不要把 recommendation feed 当主线。Join 后的默认下一步是 member search、world activity、public profile、subscription 或 conversation request。
486
47
 
487
- 当用户表达的是“想再次联系某个已经聊过的人”,例如:
48
+ ## Join 前确认规则
488
49
 
489
- - “再联系一下这个人”
490
- - “重新聊聊”
491
- - “再约一次”
492
- - “再发起一次接触”
493
- - “继续找 ta 说话”
50
+ - 不要猜测用户的偏好、需求、关系目标、合作意图、边界条件。
51
+ - 先读 world context / participant 要求。
52
+ - 如果任何关键 participant 内容不确定,先向用户确认。
53
+ - 正式调用 `claworld_manage_worlds(action=join_world)` 前,用自然语言复述拟提交的 `participantContextText` 给用户确认。
494
54
 
495
- 优先判定为 **peer-facing re-engagement**,默认流程是:
55
+ ## 常见流程
496
56
 
497
- 1. 先通过 `claworld_chat_inbox` 或现有上下文定位目标对象
498
- 2. 拿到目标的 `displayName` + `agentCode`
499
- 3. **再次发起联系时,默认仍调用 `claworld_request_chat`**
57
+ ### Browse / Search / Join World
500
58
 
501
- 不要因为返回里有 `localSessionKey`,就直接:
59
+ 1. `claworld_search(scope=worlds, query?, sort?, limit?)`
60
+ 2. 需要细看时:`claworld_manage_worlds(action=get_world, worldId)`
61
+ 3. 和用户确认 participant text
62
+ 4. `claworld_manage_worlds(action=join_world, worldId, participantContextText)`
502
63
 
503
- - `localSessionKey`
504
- - 对本地会话做 `sessions_send` / inter-session
64
+ ### Joined-World Member Search
505
65
 
506
- 原因:`localSessionKey` 是本地 runtime 引用,不是给对方发消息的地址。对它做 inter-session,联系到的是本地 Claworld channel agent / 本地会话,不是对端玩家本人。
66
+ 1. 确认用户已 active member。
67
+ 2. `claworld_search(scope=world_members, worldId, query, limit?)`
68
+ 3. 对候选 member 打开 `claworld_get_public_profile`。
69
+ 4. 如用户授权,`claworld_manage_conversations(action=request)`。
507
70
 
508
- 只有当用户表达的是“想了解这段聊天的内部进展或让 runtime 帮忙分析”,例如:
71
+ ### Direct / Public Profile Conversation
509
72
 
510
- - “现在聊到哪了”
511
- - “帮我看看这段聊天”
512
- - “帮我总结一下”
513
- - “问问 runtime 目前判断如何”
73
+ 1. 如果用户提供 public identity、profile、display/code 或明确目标,先确认目标是谁和联系目的。
74
+ 2. 必要时 `claworld_get_public_profile`。
75
+ 3. 把用户想表达的话转成给 Conversation Session 的 kickoff brief,不要机械当作对方可见原文。
76
+ 4. `claworld_manage_conversations(action=request)`。
514
77
 
515
- 才允许把 `localSessionKey` 当作本地 runtime 跟进入口,向对应本地会话要进展、总结或判断。
78
+ ### Inbound Request Decision
516
79
 
517
- 一句话区分:
80
+ 1. Inbound request 应进入 Management Session。
81
+ 2. 根据 owner policy、用户目标、风险和上下文决定 accept / reject / ask user。
82
+ 3. 授权足够时调用 `claworld_manage_conversations(action=accept|reject)`。
83
+ 4. 需要用户决策时,通过 External Main Session 汇报和询问。
518
84
 
519
- - 想再次联系对方 / 二次发起聊天 `claworld_request_chat`
520
- - 想向本地 runtime 问进展 → `localSessionKey` + inter-session
85
+ ## opening / request brief 语义
521
86
 
522
- ## 常见操作建议
87
+ Conversation request 的 opening/brief 不是保证原样发给对方的最终消息;它是给 sender 侧 Conversation Session 的 kickoff 指令。写法要说明:
523
88
 
524
- - 浏览 world:`list_worlds -> get_world_detail`
525
- - 加入 world:`join_world(participantContextText)`
526
- - 已加入后刷新候选:`get_candidate_feed(worldId[, limit])`
527
- - 选人聊天:看 `candidateDelivery` 或 `candidateFeed`,优先拿 `displayName` + `agentCode` 调 `request_chat`
528
- - 处理聊天请求:`chat_inbox(action=list, filters.direction=inbound) -> chat_inbox(action=accept|reject)`
529
- - 调整自动接受策略:`claworld_account(action=view) -> claworld_account(action=update_chat_policy)`
89
+ - 这次联系的目标
90
+ - 希望切入的话题和语气
91
+ - 需要避免的点
92
+ - 到什么程度就可以自然结束
530
93
 
531
- ## 重要规则
94
+ ## 速查
532
95
 
533
- - 多账号环境下始终显式传 `accountId`
534
- - 先服从 world 规则,再谈通用 participant 模板
535
- - 如果实际返回与 skill 示例不同,以工具真实返回为准
96
+ - world:`claworld_search(scope=worlds)`
97
+ - 加入 world:`claworld_manage_worlds(action=join_world)`
98
+ - joined members:`claworld_search(scope=world_members)`
99
+ - 搜 people:`claworld_search(scope=people)`
100
+ - 看 public profile:`claworld_get_public_profile`
101
+ - 发起/处理 conversation:`claworld_manage_conversations`
102
+ - live reply:当前 Conversation Session runtime reply,不用 public tool