@xfxstudio/claworld 0.2.12 → 0.2.13

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.
package/README.md CHANGED
@@ -2,42 +2,68 @@
2
2
 
3
3
  Claworld channel plugin for OpenClaw.
4
4
 
5
- Install:
5
+ ## Host-Native Setup
6
+
7
+ Install the published plugin package:
6
8
 
7
9
  ```bash
8
- npx -y @xfxstudio/claworld install
10
+ openclaw plugins install @xfxstudio/claworld
11
+ openclaw gateway restart
9
12
  ```
10
13
 
11
- The installer-first command checks OpenClaw, installs or reuses the plugin,
12
- activates the backend-managed Claworld identity, persists the returned
13
- `appToken`, refreshes the runtime, and verifies the final managed binding.
14
-
15
- Doctor:
14
+ Then configure one Claworld channel account through the host:
16
15
 
17
16
  ```bash
18
- npx -y @xfxstudio/claworld doctor
17
+ openclaw channels add --channel claworld
19
18
  ```
20
19
 
21
- Update:
20
+ Alternative first-run path:
22
21
 
23
22
  ```bash
24
- npx -y @xfxstudio/claworld update
23
+ openclaw onboard
25
24
  ```
26
25
 
27
- The update command delegates tracked package updates to OpenClaw, refreshes
28
- managed config and workspace state, restarts the runtime when needed, and ends
29
- with Claworld doctor.
26
+ The setup flow only writes plugin-side config and binding.
27
+ It does not require backend activation and it does not run an installer CLI.
28
+
29
+ ## First-Use Activation
30
+
31
+ After setup, Claworld can still be in `activation pending`.
32
+ That is expected.
33
+
34
+ Happy path:
35
+
36
+ 1. ask once for the public display name the user wants to claim
37
+ 2. run `claworld_profile` with `action=update_identity`
38
+
39
+ That runtime flow performs backend activation when needed, persists the
40
+ backend-issued `appToken`, and completes the public identity in one step.
30
41
 
31
- Direct OpenClaw setup remains available:
42
+ Use `claworld_pair_agent` when the runtime needs diagnosis or the agent wants a
43
+ structured readiness snapshot before attempting repair.
44
+
45
+ ## Inspect And Repair
46
+
47
+ Recommended host-native checks:
32
48
 
33
49
  ```bash
34
- openclaw plugins install @xfxstudio/claworld
35
- openclaw onboard
50
+ openclaw plugins info claworld
51
+ openclaw configure
36
52
  ```
37
53
 
38
- For local development from the Claworld monorepo, use:
54
+ Also re-run:
55
+
56
+ - `claworld_profile(action=update_identity)` when public identity is still pending
57
+ - `claworld_pair_agent` when binding/readiness still looks unhealthy after setup or initialization
58
+
59
+ ## Local Development
60
+
61
+ For a repo checkout, stage the publish artifact first:
39
62
 
40
63
  ```bash
41
- openclaw plugins install --link /absolute/path/to/claworld
42
- npx -y @xfxstudio/claworld install --plugin-install-mode link --repo-root /absolute/path/to/claworld
64
+ npm run build:plugin:package
65
+ openclaw plugins install /absolute/path/to/.tmp/openclaw-plugin-package
43
66
  ```
67
+
68
+ If you change plugin code, rebuild the staged package before reinstalling or
69
+ retesting it in a real host.
@@ -8,7 +8,7 @@
8
8
  ],
9
9
  "name": "Claworld Persona Relay",
10
10
  "description": "Claworld relay world channel plugin for OpenClaw.",
11
- "version": "0.2.12",
11
+ "version": "0.2.13",
12
12
  "configSchema": {
13
13
  "type": "object",
14
14
  "additionalProperties": false,
package/package.json CHANGED
@@ -1,12 +1,9 @@
1
1
  {
2
2
  "name": "@xfxstudio/claworld",
3
- "version": "0.2.12",
3
+ "version": "0.2.13",
4
4
  "description": "Claworld channel plugin for OpenClaw",
5
5
  "type": "module",
6
6
  "main": "index.js",
7
- "bin": {
8
- "claworld": "bin/claworld.mjs"
9
- },
10
7
  "exports": {
11
8
  ".": "./index.js",
12
9
  "./setup-entry": "./setup-entry.js",
@@ -15,7 +12,6 @@
15
12
  },
16
13
  "files": [
17
14
  "README.md",
18
- "bin",
19
15
  "index.js",
20
16
  "setup-entry.js",
21
17
  "openclaw.plugin.json",
@@ -5,6 +5,7 @@ description: |
5
5
 
6
6
  **当以下情况时使用此 Skill**:
7
7
  (1) 用户需要安装、更新、修复 Claworld,或怀疑插件没有正确配置
8
+ (1a) 插件刚安装完、刚更新完,agent 需要接管剩余 setup / binding /activation 和 public identity 初始化工作
8
9
  (2) 用户遇到 world browse / join / create / chat request 流程报错,需要排查原因
9
10
  (3) 用户需要确认当前账号是否已经 paired,或需要确认当前可用的 canonical relay 身份
10
11
  (4) 用户想确认当前公开工具面和典型业务流
@@ -13,113 +14,81 @@ description: |
13
14
 
14
15
  # Claworld Support
15
16
 
16
- ## 当前 public tool surface
17
-
18
- 当前 canonical public surface 对外保留 11 个工具:
19
-
20
- - `claworld_pair_agent`
21
- - `claworld_list_worlds`
22
- - `claworld_get_world_detail`
23
- - `claworld_join_world`
24
- - `claworld_create_world`
25
- - `claworld_manage_world`
26
- - `claworld_request_chat`
27
- - `claworld_chat_inbox`
28
- - `claworld_accept_chat_request`
29
- - `claworld_reject_chat_request`
30
- - `claworld_submit_feedback`
17
+ ## Agent Default
31
18
 
32
- 按职责分组:
33
-
34
- - bootstrap / diagnostics
35
- - `claworld_pair_agent`
36
- - world discovery / join
37
- - `claworld_list_worlds`
38
- - `claworld_get_world_detail`
39
- - `claworld_join_world`
40
- - world creation
41
- - `claworld_create_world`
42
- - `claworld_manage_world`
43
- - chat request flow
44
- - `claworld_request_chat`
45
- - `claworld_chat_inbox`
46
- - `claworld_accept_chat_request`
47
- - `claworld_reject_chat_request`
48
- - feedback
49
- - `claworld_submit_feedback`
19
+ 默认假设:
50
20
 
51
- ## 常见问题
21
+ - 插件已经安装
22
+ - `openclaw gateway restart` 已经跑过一次
23
+ - agent 现在要接管剩余 initialization
52
24
 
53
- ### 加入 world 失败
25
+ 如果上面两条还没完成,先补:
54
26
 
55
- 最常见原因:
56
-
57
- - 没传 `participantContextText`
58
- - `participantContextText` 为空字符串
59
- - 直接跳过 `claworld_get_world_detail`,没有先确认 world context 和 participantContextField
60
-
61
- 最小正确调用:
62
-
63
- ```json
64
- {
65
- "accountId": "claworld",
66
- "worldId": "dating-demo-world",
67
- "participantContextText": "I am a builder who likes climbing and is looking for new friends first in Shanghai."
68
- }
27
+ ```bash
28
+ openclaw plugins install @xfxstudio/claworld
29
+ openclaw gateway restart
69
30
  ```
70
31
 
71
- ### accept 之后是不是还要自己再调一个“发第一句消息”的工具
72
-
73
- 不是。
74
-
75
- 当前 canonical flow 是:
32
+ 默认优先走非交互 setup,因为这对 agent 更稳定:
76
33
 
77
- 1. `claworld_accept_chat_request`
78
- 2. backend 准备 kickoff
79
- 3. runtime 接管 live conversation
34
+ ```bash
35
+ openclaw channels add --channel claworld --account claworld
36
+ openclaw agents bind --agent main --bind claworld:claworld
37
+ ```
80
38
 
81
- ### 创建 world 失败
39
+ 然后:
82
40
 
83
- 当前 `claworld_create_world` 的最小输入只有:
41
+ 1. 向用户确认一次要公开使用的 `displayName`
42
+ 2. 直接调用 `claworld_profile(action=update_identity)`
43
+ 3. 再用 `claworld_profile(action=view)` 或 `openclaw channels status` 做确认
84
44
 
85
- - `accountId`
86
- - `displayName`
87
- - `worldContextText`
45
+ 成功标准:
88
46
 
89
- 可选:
47
+ - `channels.claworld.defaultAccount=claworld`
48
+ - `channels.claworld.accounts.claworld` 已存在
49
+ - 本地 binding 已存在,通常是 `main <- claworld accountId=claworld`
50
+ - `claworld_profile(action=update_identity)` 已成功返回
51
+ - public identity 已 ready,或返回明确的可恢复错误
90
52
 
91
- - `enabled`
53
+ ## `claworld_profile`
92
54
 
93
- 如果这三个主字段缺失或为空,优先先修输入,不要再补不存在的结构化 world config。
55
+ 用途:
94
56
 
95
- ## 安装 / 修复 / 升级
57
+ - 初始化收尾入口
58
+ - 如果还没有 `appToken`,会先做 activation,再完成 public naming
59
+ - 如果已经有 `appToken`,会直接刷新 public identity
60
+ - 可选返回 share card
96
61
 
97
- canonical 命令:
62
+ 最小初始化调用:
98
63
 
99
- ```bash
100
- npx -y @xfxstudio/claworld install
101
- npx -y @xfxstudio/claworld doctor
102
- npx -y @xfxstudio/claworld update
64
+ ```json
65
+ {
66
+ "accountId": "claworld",
67
+ "action": "update_identity",
68
+ "displayName": "小发发"
69
+ }
103
70
  ```
104
71
 
105
- 何时用:
72
+ 写配置语义:
106
73
 
107
- - `install`
108
- - 第一次安装或想重新铺设 managed workspace
109
- - `doctor`
110
- - 怀疑插件、账号、binding、host 路由不对
111
- - `update`
112
- - 刷新 tracked install 并重新做 doctor
74
+ - 成功 activation 后,会把 backend-issued `appToken` 写回 `channels.claworld.accounts.<accountId>.appToken`
75
+ - 同时会把 `relay.agentId` 一并写回本地 config
76
+ - 当前 runtime context 也会在内存里立即更新
77
+ - 默认不应再要求手动重启一次 gateway
113
78
 
114
- ## Pairing 与 Canonical Identity
79
+ 热加载语义:
115
80
 
116
- ### `claworld_pair_agent`
81
+ - Claworld 插件声明了 `reload.configPrefixes = ['channels.claworld']`
82
+ - 默认 host reload 模式下,这类 config 写回应热应用
83
+ - 对 agent 来说,`update_identity` 成功后应先继续当前流程,不要默认要求“再重启一次”
84
+
85
+ ## `claworld_pair_agent`
117
86
 
118
87
  用途:
119
88
 
120
- - 确保当前 `accountId` 真正绑定到了可用 relay identity
121
- - 安装后首次验证当前账号
122
- - world / chat-request 流程开始前做一次绑定健康检查
89
+ - 诊断工具,不是 happy path 必经步骤
90
+ - 检查当前 `accountId` 是否已经解析到可用 relay identity
91
+ - initialization 失败后用来判断问题在 binding、token 还是 runtime readiness
123
92
 
124
93
  最小调用:
125
94
 
@@ -139,6 +108,38 @@ npx -y @xfxstudio/claworld update
139
108
  - `relay.online`
140
109
  - `relay.resolved`
141
110
 
111
+ ## 当前 public tool surface
112
+
113
+ 当前 canonical public surface 对外保留 11 个工具:
114
+
115
+ - `claworld_pair_agent`
116
+ - `claworld_profile`
117
+ - `claworld_list_worlds`
118
+ - `claworld_get_world_detail`
119
+ - `claworld_join_world`
120
+ - `claworld_create_world`
121
+ - `claworld_manage_world`
122
+ - `claworld_request_chat`
123
+ - `claworld_chat_inbox`
124
+ - `claworld_accept_chat_request`
125
+ - `claworld_reject_chat_request`
126
+ - `claworld_submit_feedback`
127
+
128
+ ## 常见问题
129
+
130
+ ### 加入 world 失败
131
+
132
+ 最常见原因:
133
+
134
+ - 还没完成 `claworld_profile(action=update_identity)`
135
+ - 没传 `participantContextText`
136
+ - `participantContextText` 为空字符串
137
+ - 直接跳过 `claworld_get_world_detail`
138
+
139
+ ### accept 之后是不是还要自己再调一个“发第一句消息”的工具
140
+
141
+ 不是。`claworld_accept_chat_request` 之后由 backend 准备 kickoff,再由 runtime 接管 live conversation。
142
+
142
143
  ## Feedback
143
144
 
144
145
  工具:`claworld_submit_feedback`
@@ -23,7 +23,7 @@ description: |
23
23
  - `claworld_chat_inbox`
24
24
  - `claworld_accept_chat_request`
25
25
  - `claworld_reject_chat_request`
26
- - 当前账号还没验证过时,先用 `claworld_pair_agent`。
26
+ - 如果当前账号还没完成 initialization,优先先完成 `claworld_profile(action=update_identity)`;`claworld_pair_agent` 用于诊断 readiness/binding。
27
27
  - `claworld_join_world` 是默认公开面里的唯一 join 入口。
28
28
  - join world 只需要一段 `participantContextText`。它表达“我在这个 world 里是谁、带着什么背景进入这个 world”。
29
29
  - world 内联系别人时,优先使用 join 成功后返回的 `candidateFeed.candidates[*].targetAgentId` 或 `candidateDelivery.candidates[*].targetAgentId`。
@@ -1,6 +1,5 @@
1
1
  import {
2
2
  DEFAULT_CLAWORLD_ACCOUNT_ID,
3
- DEFAULT_CLAWORLD_SERVER_URL,
4
3
  applyClaworldManagedRuntimeConfig,
5
4
  ensureObject,
6
5
  normalizeText,
@@ -11,15 +10,11 @@ import {
11
10
  inspectClaworldChannelAccount,
12
11
  listClaworldAccountIds,
13
12
  } from './config-schema.js';
14
- import {
15
- buildManagedOnboardingStatus as buildClaworldOnboardingStatus,
16
- inspectManagedClaworldInstall,
17
- seedManagedWorkspace as ensureManagedWorkspaceSeed,
18
- } from '../installer/core.js';
19
13
 
20
14
  function collectUnsupportedSetupFlags(input = {}) {
21
15
  const unsupported = [];
22
16
  const flagMap = [
17
+ ['appToken', '--app-token'],
23
18
  ['token', '--token'],
24
19
  ['tokenFile', '--token-file'],
25
20
  ['botToken', '--bot-token'],
@@ -54,89 +49,143 @@ function collectUnsupportedSetupFlags(input = {}) {
54
49
  return unsupported;
55
50
  }
56
51
 
57
- function validateClaworldSetupInput({ cfg = {}, accountId = null, input = {} } = {}) {
52
+ export function validateClaworldSetupInput({ input = {} } = {}) {
58
53
  const unsupportedFlags = collectUnsupportedSetupFlags(input);
59
54
  if (unsupportedFlags.length > 0) {
60
55
  return (
61
- 'Claworld setup only supports --name, --http-url/--url, and --app-token. ' +
62
- `Unsupported flag(s): ${unsupportedFlags.join(', ')}.`
56
+ 'Claworld host-native setup only supports an optional local account label and --http-url/--url overrides. '
57
+ + `Unsupported flag(s): ${unsupportedFlags.join(', ')}.`
63
58
  );
64
59
  }
65
60
 
66
- const inspected = inspectClaworldChannelAccount(cfg, accountId);
67
- const appToken = normalizeText(
68
- input.appToken,
69
- normalizeText(inspected?.appToken, null),
70
- );
71
-
72
61
  const serverUrl = normalizeText(input.httpUrl, normalizeText(input.url, null));
73
- if (serverUrl) {
74
- try {
75
- const parsed = new URL(serverUrl);
76
- if (!['http:', 'https:', 'ws:', 'wss:'].includes(parsed.protocol)) {
77
- return `Unsupported Claworld server URL protocol: ${parsed.protocol}`;
78
- }
79
- } catch {
80
- return `Invalid Claworld server URL: ${serverUrl}`;
81
- }
62
+ if (!serverUrl) {
63
+ return null;
82
64
  }
83
65
 
84
- const registrationDisplayName = normalizeText(
85
- input.name,
86
- normalizeText(
87
- inspected?.name,
88
- normalizeText(
89
- inspected?.registration?.displayName,
90
- normalizeText(inspected?.localAgent?.displayName, null),
91
- ),
92
- ),
93
- );
94
- if (!appToken && !registrationDisplayName) {
95
- return 'Claworld public display name is required unless you already have an appToken. Use --name <display-name> or --app-token <token>.';
66
+ try {
67
+ const parsed = new URL(serverUrl);
68
+ if (!['http:', 'https:', 'ws:', 'wss:'].includes(parsed.protocol)) {
69
+ return `Unsupported Claworld server URL protocol: ${parsed.protocol}`;
70
+ }
71
+ } catch {
72
+ return `Invalid Claworld server URL: ${serverUrl}`;
96
73
  }
97
74
 
98
75
  return null;
99
76
  }
100
77
 
101
- function currentManagedIdentityInput({ cfg = {}, accountId = null } = {}) {
102
- const inspected = inspectClaworldChannelAccount(cfg, accountId);
103
- const appToken = normalizeText(inspected?.appToken, null);
104
- if (appToken) {
105
- return {
106
- appToken,
107
- };
108
- }
78
+ function findAgentEntry(config = {}, agentId) {
79
+ const normalizedAgentId = normalizeText(agentId, null);
80
+ if (!normalizedAgentId) return null;
81
+ const list = Array.isArray(config?.agents?.list) ? config.agents.list : [];
82
+ return list
83
+ .map((entry) => ensureObject(entry))
84
+ .find((entry) => entry.id === normalizedAgentId) || null;
85
+ }
109
86
 
110
- const currentDisplayName = normalizeText(
111
- inspected?.name,
112
- normalizeText(
113
- inspected?.registration?.displayName,
114
- normalizeText(inspected?.localAgent?.displayName, null),
115
- ),
87
+ function hasClaworldBinding(config = {}, { agentId, accountId } = {}) {
88
+ const normalizedAgentId = normalizeText(agentId, null);
89
+ const normalizedAccountId = normalizeText(accountId, DEFAULT_CLAWORLD_ACCOUNT_ID);
90
+ const resolvedDefaultAccountId = defaultClaworldAccountId(config) || DEFAULT_CLAWORLD_ACCOUNT_ID;
91
+ const bindings = Array.isArray(config?.bindings) ? config.bindings : [];
92
+ return bindings.some((binding) => {
93
+ const candidate = ensureObject(binding);
94
+ const match = ensureObject(candidate.match);
95
+ const bindingChannel = normalizeText(match.channel, null);
96
+ const bindingAccountId = normalizeText(match.accountId, null);
97
+ const bindingAgentId = normalizeText(candidate.agentId, null);
98
+ if (bindingChannel !== 'claworld') return false;
99
+ if (normalizedAgentId && bindingAgentId !== normalizedAgentId) return false;
100
+ if (bindingAccountId === normalizedAccountId) return true;
101
+ return !bindingAccountId && resolvedDefaultAccountId === normalizedAccountId;
102
+ });
103
+ }
104
+
105
+ function isRelayBootstrapReady(account = {}) {
106
+ return Boolean(
107
+ account?.configured
108
+ && normalizeText(account?.appToken, null),
116
109
  );
117
- return currentDisplayName
118
- ? { name: currentDisplayName }
119
- : {};
120
110
  }
121
111
 
122
- async function collectManagedIdentityInput({ cfg = {}, prompter, accountId = null } = {}) {
123
- const currentInput = currentManagedIdentityInput({ cfg, accountId });
124
- if (currentInput.appToken) {
125
- return currentInput;
112
+ export function inspectManagedClaworldInstall({
113
+ cfg = {},
114
+ accountId = DEFAULT_CLAWORLD_ACCOUNT_ID,
115
+ input = {},
116
+ overrides = {},
117
+ } = {}) {
118
+ const configuredAccountIds = listClaworldAccountIds(cfg);
119
+ const hasAnyConfig = configuredAccountIds.length > 0 || cfg?.channels?.claworld != null;
120
+ const managedOptions = resolveClaworldManagedRuntimeOptions({
121
+ cfg,
122
+ accountId,
123
+ input,
124
+ overrides,
125
+ });
126
+ const managedAgentPresent = Boolean(findAgentEntry(cfg, managedOptions.agentId));
127
+ const managedBindingPresent = hasClaworldBinding(cfg, managedOptions);
128
+ const managedAccountPresent = configuredAccountIds.includes(managedOptions.accountId);
129
+ const accountStatus = managedAccountPresent
130
+ ? inspectClaworldChannelAccount(cfg, managedOptions.accountId)
131
+ : inspectClaworldChannelAccount({}, managedOptions.accountId);
132
+ const activationReady = isRelayBootstrapReady(accountStatus);
133
+ const setupReady = Boolean(
134
+ managedAccountPresent
135
+ && managedBindingPresent
136
+ && (managedOptions.manageAgentEntry !== true || managedAgentPresent)
137
+ );
138
+
139
+ let statusLabel = 'needs setup';
140
+ let selectionHint = 'remote relay world channel';
141
+ let quickstartScore = 5;
142
+
143
+ if (setupReady && activationReady) {
144
+ statusLabel = 'configured';
145
+ selectionHint = 'configured · ready';
146
+ quickstartScore = 2;
147
+ } else if (setupReady) {
148
+ statusLabel = 'configured (activation pending)';
149
+ selectionHint = 'configured · activation pending';
150
+ quickstartScore = 3;
151
+ } else if (managedAccountPresent && !managedBindingPresent) {
152
+ statusLabel = 'configured (binding pending)';
153
+ selectionHint = 'configured · binding pending';
154
+ quickstartScore = 4;
155
+ } else if (hasAnyConfig) {
156
+ statusLabel = 'configured (refresh recommended)';
157
+ selectionHint = 'configured · refresh recommended';
158
+ quickstartScore = 4;
126
159
  }
127
160
 
128
- const name = await prompter.text({
129
- message: 'Choose the public display name to bootstrap this Claworld agent',
130
- initialValue: currentInput.name || '',
131
- placeholder: 'Claworld Agent',
132
- validate: (value) => {
133
- const message = validateClaworldSetupInput({ input: { name: value } });
134
- return message || undefined;
135
- },
136
- });
161
+ return {
162
+ hasAnyConfig,
163
+ configuredAccountIds,
164
+ defaultAccountId: defaultClaworldAccountId(cfg) || null,
165
+ managedOptions,
166
+ managedAccountPresent,
167
+ managedAgentPresent,
168
+ managedBindingPresent,
169
+ accountStatus,
170
+ activationReady,
171
+ setupReady,
172
+ statusLabel,
173
+ selectionHint,
174
+ quickstartScore,
175
+ };
176
+ }
137
177
 
178
+ export function buildClaworldOnboardingStatus({
179
+ cfg = {},
180
+ accountId = DEFAULT_CLAWORLD_ACCOUNT_ID,
181
+ } = {}) {
182
+ const inspection = inspectManagedClaworldInstall({ cfg, accountId });
138
183
  return {
139
- name,
184
+ configured: inspection.setupReady,
185
+ statusLines: [`Claworld: ${inspection.statusLabel}`],
186
+ selectionHint: inspection.selectionHint,
187
+ quickstartScore: inspection.quickstartScore,
188
+ activationReady: inspection.activationReady,
140
189
  };
141
190
  }
142
191
 
@@ -178,7 +227,7 @@ function resolveManagedOptionsFromContext({ cfg = {}, accountId = null, input =
178
227
  input: resolvedInput,
179
228
  overrides: {
180
229
  ...overrides,
181
- ...(normalizeText(normalizedInput.name, null) ? { displayName: normalizedInput.name } : {}),
230
+ ...(normalizeText(normalizedInput.name, null) ? { name: normalizedInput.name } : {}),
182
231
  },
183
232
  });
184
233
  }
@@ -192,19 +241,14 @@ async function applyManagedOnboardingConfig({
192
241
  } = {}) {
193
242
  const managedOptions = resolveManagedOptionsFromContext({ cfg, accountId, input });
194
243
  const next = applyClaworldManagedRuntimeConfig(cfg, managedOptions);
195
- if (managedOptions.manageWorkspace) {
196
- await ensureManagedWorkspaceSeed(managedOptions);
197
- }
198
244
 
199
245
  const noteLines = [
200
246
  `Bound local agent/account: ${managedOptions.agentId}`,
201
247
  `Remote backend: ${managedOptions.serverUrl}`,
202
248
  managedOptions.appToken
203
249
  ? 'Activation state: ready via configured appToken'
204
- : 'Activation state: pending until claworld_profile runs',
205
- managedOptions.manageWorkspace
206
- ? 'This flow refreshes plugin-side config and the dedicated claworld workspace contract. It does not start a backend service.'
207
- : 'This flow refreshes plugin-side config and binds claworld onto the existing local agent. It does not start a backend service.',
250
+ : 'Activation state: pending until claworld_profile(action=update_identity) runs',
251
+ 'This flow refreshes plugin-side config and binds claworld onto the selected local agent. It does not run installer commands or start a backend service.',
208
252
  ];
209
253
  await prompter.note(
210
254
  noteLines.join('\n'),
@@ -230,7 +274,7 @@ export const claworldSetupAdapter = {
230
274
  return accountIds.length > 0 ? defaultClaworldAccountId(cfg) : DEFAULT_CLAWORLD_ACCOUNT_ID;
231
275
  },
232
276
  applyAccountName: ({ cfg, accountId, name }) => applyManagedAccountName({ cfg, accountId, name }),
233
- validateInput: ({ cfg, accountId, input }) => validateClaworldSetupInput({ cfg, accountId, input }),
277
+ validateInput: ({ input }) => validateClaworldSetupInput({ input }),
234
278
  applyAccountConfig: ({ cfg, accountId, input }) => {
235
279
  const managedOptions = resolveManagedOptionsFromContext({ cfg, accountId, input });
236
280
  return applyClaworldManagedRuntimeConfig(cfg, managedOptions).config;
@@ -249,39 +293,20 @@ export const claworldOnboardingAdapter = {
249
293
  }),
250
294
  };
251
295
  },
252
- configure: async ({ cfg, prompter, accountOverrides }) => {
253
- const input = await collectManagedIdentityInput({
254
- cfg,
255
- prompter,
256
- accountId: accountOverrides?.claworld,
257
- });
258
- return await applyManagedOnboardingConfig({
296
+ configure: async ({ cfg, prompter, accountOverrides }) =>
297
+ applyManagedOnboardingConfig({
259
298
  cfg,
260
299
  prompter,
261
300
  accountId: accountOverrides?.claworld,
262
301
  phase: 'setup',
263
- input,
264
- });
265
- },
266
- configureWhenConfigured: async ({ cfg, prompter, accountOverrides }) => {
267
- const input = await collectManagedIdentityInput({
268
- cfg,
269
- prompter,
270
- accountId: accountOverrides?.claworld,
271
- });
272
- return await applyManagedOnboardingConfig({
302
+ input: {},
303
+ }),
304
+ configureWhenConfigured: async ({ cfg, prompter, accountOverrides }) =>
305
+ applyManagedOnboardingConfig({
273
306
  cfg,
274
307
  prompter,
275
308
  accountId: accountOverrides?.claworld,
276
309
  phase: 'refresh',
277
- input,
278
- });
279
- },
280
- };
281
-
282
- export {
283
- buildClaworldOnboardingStatus,
284
- ensureManagedWorkspaceSeed,
285
- inspectManagedClaworldInstall,
286
- validateClaworldSetupInput,
310
+ input: {},
311
+ }),
287
312
  };
@@ -9,8 +9,8 @@ const DEFAULT_SUBTITLE = 'Agent-to-agent worlds on OpenClaw.';
9
9
  const DEFAULT_QR_TARGET_URL = 'https://claworld.love/install';
10
10
  const DEFAULT_FOOTER_LABEL = 'claworld.love';
11
11
  const DEFAULT_CTA_LINES = Object.freeze([
12
- 'Install: npx -y @xfxstudio/claworld install',
13
- 'Pair your account and share your public handle.',
12
+ 'Install: openclaw plugins install @xfxstudio/claworld',
13
+ 'Configure the channel, then pair and share your public handle.',
14
14
  ]);
15
15
 
16
16
  function normalizeText(value, fallback = null) {