@agentchatme/openclaw 0.6.10 → 0.6.12
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/CHANGELOG.md +81 -1032
- package/README.md +50 -0
- package/RUNBOOK.md +1 -1
- package/dist/binding/agents-anchor.cjs.map +1 -1
- package/dist/binding/agents-anchor.d.cts +2 -2
- package/dist/binding/agents-anchor.d.ts +2 -2
- package/dist/binding/agents-anchor.js.map +1 -1
- package/dist/configured-state.cjs.map +1 -1
- package/dist/configured-state.d.cts +1 -1
- package/dist/configured-state.d.ts +1 -1
- package/dist/configured-state.js.map +1 -1
- package/dist/index.cjs +4 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/setup-entry.cjs +4 -4
- package/dist/setup-entry.cjs.map +1 -1
- package/dist/setup-entry.js +4 -4
- package/dist/setup-entry.js.map +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,1032 +1,81 @@
|
|
|
1
|
-
# Changelog
|
|
2
|
-
|
|
3
|
-
All notable changes to `@agentchatme/openclaw` are documented here.
|
|
4
|
-
|
|
5
|
-
The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/);
|
|
6
|
-
this package adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
-
|
|
82
|
-
esbuild plugin: the only file that imported `../credentials/read-env.js`
|
|
83
|
-
was `agents-anchor.ts`, and now that it's its own dist entry under
|
|
84
|
-
`dist/binding/`, the parent-relative literal resolves correctly at
|
|
85
|
-
runtime without rewriting.
|
|
86
|
-
- `scripts/fix-cjs-extensions.mjs` extended to handle the new
|
|
87
|
-
`dist/binding/agents-anchor.cjs` consumer + the `./binding/agents-anchor`
|
|
88
|
-
external import. New `external` entries MUST add a corresponding
|
|
89
|
-
`.js → .cjs` swap in this script.
|
|
90
|
-
- 281+17 = 298 tests still pass; no functional surface changed.
|
|
91
|
-
|
|
92
|
-
## 0.6.7 — 2026-04-27
|
|
93
|
-
|
|
94
|
-
### Docs: canonical install recipe is now three commands
|
|
95
|
-
|
|
96
|
-
The README's `## Install` section is the canonical recipe a new user
|
|
97
|
-
copy-pastes. It was previously split into Install + Configure with four
|
|
98
|
-
different command snippets (some redundant, one — the wizard line — wrong),
|
|
99
|
-
which left users guessing which command to actually run.
|
|
100
|
-
|
|
101
|
-
Tightened to a single three-line block:
|
|
102
|
-
|
|
103
|
-
```bash
|
|
104
|
-
openclaw plugins install @agentchatme/openclaw
|
|
105
|
-
npm install -g nostr-tools # required by the OpenClaw setup wizard
|
|
106
|
-
openclaw channels add # interactive wizard
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
**Changes:**
|
|
110
|
-
|
|
111
|
-
- Removed the redundant `clawhub:@agentchatme/openclaw` snippet — the
|
|
112
|
-
default `openclaw plugins install @agentchatme/openclaw` already
|
|
113
|
-
resolves through ClawHub. Two snippets that did the same thing
|
|
114
|
-
confused which was canonical.
|
|
115
|
-
- Removed the `pnpm add @agentchatme/openclaw` snippet — that's for
|
|
116
|
-
programmatic SDK consumers, not OpenClaw plugin users; it was
|
|
117
|
-
muddying the install story for the primary audience.
|
|
118
|
-
- Fixed the wizard invocation: `openclaw channels add` (no flags) instead
|
|
119
|
-
of `openclaw channels add --channel agentchat`. The latter form passes
|
|
120
|
-
a flag, which OpenClaw's `shouldUseWizard` predicate treats as
|
|
121
|
-
non-interactive intent — the wizard never runs, and the user gets an
|
|
122
|
-
`apiKey is required` error instead of the OTP prompts they wanted.
|
|
123
|
-
See `src/commands/channels/add.ts:119` and `src/commands/channels/shared.ts:134-136`
|
|
124
|
-
in OpenClaw for the gate.
|
|
125
|
-
- Added the `npm install -g nostr-tools` step. OpenClaw 2026.4.x ships
|
|
126
|
-
a bundled `nostr` channel extension whose setup-surface imports
|
|
127
|
-
`nostr-tools`, but the package isn't declared in any of openclaw's
|
|
128
|
-
`dependencies`, `optionalDependencies`, or `peerDependencies` (verified
|
|
129
|
-
in 2026.4.24 and 2026.4.26). When `openclaw channels add` enumerates
|
|
130
|
-
bundled channel plugins for the picker, the import fails with
|
|
131
|
-
`ERR_MODULE_NOT_FOUND` *before* our wizard ever loads. Installing the
|
|
132
|
-
peer at the openclaw-global location resolves the import; this step
|
|
133
|
-
goes away once OpenClaw fixes the upstream bundling. Mechanism gated
|
|
134
|
-
three independent ways for community plugins (origin gate at
|
|
135
|
-
`loader.ts:2546-2551`, path gate at `bundled-runtime-deps.ts:739-749`,
|
|
136
|
-
and `--ignore-scripts` at `install-package-dir.ts:266-274`) so we
|
|
137
|
-
cannot ship the dep from inside our plugin.
|
|
138
|
-
- Renamed `## Configure` to `## Manual configuration` and reframed it as
|
|
139
|
-
an advanced/manual path for users who want to skip the wizard. The
|
|
140
|
-
`apiKey` line's comment now points to the wizard
|
|
141
|
-
(`# required — minted by openclaw channels add`) rather than a
|
|
142
|
-
dashboard URL — the dashboard is observe-only, not a registration
|
|
143
|
-
surface.
|
|
144
|
-
|
|
145
|
-
**No code changes** — README only. Manifest/runtime/wizard logic all
|
|
146
|
-
unchanged.
|
|
147
|
-
|
|
148
|
-
## 0.6.6 — 2026-04-27
|
|
149
|
-
|
|
150
|
-
### Fix: ClawHub static scanner blocked install on `child_process` import
|
|
151
|
-
|
|
152
|
-
After 0.6.5 unblocked the `channelConfigs` warning, the next install
|
|
153
|
-
attempt on the GCE VM was rejected by ClawHub's static-analysis gate:
|
|
154
|
-
|
|
155
|
-
```
|
|
156
|
-
WARNING: Plugin "agentchat" contains dangerous code patterns:
|
|
157
|
-
Shell command execution detected (child_process)
|
|
158
|
-
(.../scripts/verify-source-installs.mjs:52)
|
|
159
|
-
Plugin "agentchat" installation blocked: dangerous code patterns
|
|
160
|
-
detected: Shell command execution detected (child_process)
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
The flagged file is the regression test added in 0.6.3 — it spawned
|
|
164
|
-
`npm install --dry-run` via `child_process.spawnSync` to validate that
|
|
165
|
-
the source `package.json` could still be installed by raw npm. The
|
|
166
|
-
script was a `prepublishOnly` dev tool; it has no runtime role and
|
|
167
|
-
never executes on user machines. But ClawHub's source-linked verification
|
|
168
|
-
zips the entire `integrations/openclaw-channel/` tree (including
|
|
169
|
-
`scripts/`), and the scanner can't tell a build-time test apart from a
|
|
170
|
-
malicious shell-exec, so it blocks the whole install.
|
|
171
|
-
|
|
172
|
-
The actual regression we wanted to catch is a much narrower string-shape
|
|
173
|
-
problem: any `workspace:` / `file:` / `link:` / `catalog:` spec in the
|
|
174
|
-
runtime-dependency sections will crash raw npm with `EUNSUPPORTEDPROTOCOL`
|
|
175
|
-
on ClawHub source-linked builds. That's a pure JSON inspection — no
|
|
176
|
-
subprocess required.
|
|
177
|
-
|
|
178
|
-
**Changed:**
|
|
179
|
-
|
|
180
|
-
- `scripts/verify-source-installs.mjs` — rewritten as a pure JSON-spec
|
|
181
|
-
linter. Reads the source `package.json`, walks every spec in
|
|
182
|
-
`dependencies`, `peerDependencies`, and `optionalDependencies`, and
|
|
183
|
-
fails if any uses `workspace:` / `file:` / `link:` / `catalog:`. No
|
|
184
|
-
`child_process`, no `npm install`, no network. Same regression
|
|
185
|
-
coverage for the bug class that surfaced in 0.6.2 — and ClawHub's
|
|
186
|
-
scanner now passes the install through.
|
|
187
|
-
- `devDependencies` is intentionally excluded from the walk because
|
|
188
|
-
`npm install --omit=dev` skips it on user machines, so its specs are
|
|
189
|
-
irrelevant to the install-time blast radius.
|
|
190
|
-
|
|
191
|
-
**Why no test changes:**
|
|
192
|
-
|
|
193
|
-
The unit test wired into `prepublishOnly` (run via `pnpm run
|
|
194
|
-
test:install-source`) keeps its same exit-code contract: zero on clean,
|
|
195
|
-
non-zero with a descriptive error on offending specs. The pre-publish
|
|
196
|
-
gate that prevents a future commit from re-introducing `workspace:^` in
|
|
197
|
-
runtime deps is structurally identical to the 0.6.3 wiring.
|
|
198
|
-
|
|
199
|
-
## 0.6.5 — 2026-04-27
|
|
200
|
-
|
|
201
|
-
### Fix: silence `without channelConfigs metadata` warning at install time
|
|
202
|
-
|
|
203
|
-
OpenClaw 2026.4.24+ emits a manifest-registry warning for community
|
|
204
|
-
channel-plugins that declare `channels` without a per-channel
|
|
205
|
-
`channelConfigs[channelId]` block:
|
|
206
|
-
|
|
207
|
-
```
|
|
208
|
-
Config warnings:
|
|
209
|
-
- plugins.entries.agentchat: plugin agentchat: channel plugin manifest
|
|
210
|
-
declares agentchat without channelConfigs metadata; add
|
|
211
|
-
openclaw.plugin.json#channelConfigs so config schema and setup surfaces
|
|
212
|
-
work before runtime loads
|
|
213
|
-
```
|
|
214
|
-
|
|
215
|
-
The warning was non-blocking on 0.6.4 — the install completed and
|
|
216
|
-
registered the plugin — but it surfaced on every install and indicated
|
|
217
|
-
that OpenClaw could not render the config form before loading our JS
|
|
218
|
-
runtime, defeating the "introspect schema before runtime loads" guarantee
|
|
219
|
-
that pre-runtime UI flows depend on. First-party in-tree plugins
|
|
220
|
-
(matrix/telegram/discord) sidestep this via the `collectBundledChannelConfigs`
|
|
221
|
-
auto-hydration path that runs only for `origin: "bundled"`; community
|
|
222
|
-
plugins loaded with `origin: "global"` need to hand-author the field.
|
|
223
|
-
|
|
224
|
-
**Changed:**
|
|
225
|
-
|
|
226
|
-
- `scripts/emit-manifest-schema.mjs` — now emits
|
|
227
|
-
`openclaw.plugin.json#channelConfigs.agentchat` with `schema` and
|
|
228
|
-
`uiHints` populated from the same runtime Zod export that drives
|
|
229
|
-
`configSchema`. Both surfaces are derived from the single source of
|
|
230
|
-
truth, so structural drift between them is impossible. Top-level
|
|
231
|
-
`configSchema` and `uiHints` stay populated for backward compatibility
|
|
232
|
-
with older OpenClaw versions that haven't been taught to prefer
|
|
233
|
-
`channelConfigs` yet.
|
|
234
|
-
- `tests/plugin.test.ts#manifest sync` — added a regression test
|
|
235
|
-
asserting `manifest.channelConfigs.agentchat.schema` matches
|
|
236
|
-
`manifest.configSchema` and that the per-field `uiHints` come along
|
|
237
|
-
with their labels intact.
|
|
238
|
-
|
|
239
|
-
**Why no change to the runtime:**
|
|
240
|
-
|
|
241
|
-
`channelConfigs` is a manifest-registry concern, not a runtime concern.
|
|
242
|
-
The runtime continues to consume the Zod schema directly via
|
|
243
|
-
`buildChannelConfigSchema(agentchatChannelConfigSchema, { uiHints })`.
|
|
244
|
-
No code paths under `src/` are touched.
|
|
245
|
-
|
|
246
|
-
## 0.6.4 — 2026-04-27
|
|
247
|
-
|
|
248
|
-
### Fix: `openclaw plugins install` failed at the persist step with `must have required property 'apiKey'`
|
|
249
|
-
|
|
250
|
-
After 0.6.3 unblocked the `npm install` phase, the next step in OpenClaw's
|
|
251
|
-
install pipeline — `persistPluginInstall`, which writes the plugin entry
|
|
252
|
-
into `~/.openclaw/openclaw.json` — failed with:
|
|
253
|
-
|
|
254
|
-
```
|
|
255
|
-
[plugins] agentchat invalid config: apiKey: must have required property 'apiKey',
|
|
256
|
-
reconnect: must have required property 'reconnect', ping: ..., outbound: ...,
|
|
257
|
-
observability: must have required property 'observability'
|
|
258
|
-
```
|
|
259
|
-
|
|
260
|
-
OpenClaw's manifest validator runs JSON Schema validation on the persisted
|
|
261
|
-
config block at install time, **before** the setup wizard runs. The
|
|
262
|
-
emitted `openclaw.plugin.json#configSchema` had `required: ['apiBase',
|
|
263
|
-
'apiKey', 'reconnect', 'ping', 'outbound', 'observability']`, so the empty
|
|
264
|
-
config that ships with a fresh install was rejected outright. The plugin's
|
|
265
|
-
files landed on disk, but the entry was never registered, leaving the
|
|
266
|
-
install in a half-completed state.
|
|
267
|
-
|
|
268
|
-
The schema described the **fully-configured** shape, which is correct for
|
|
269
|
-
runtime ("apiKey is required to actually authenticate"), but is wrong for
|
|
270
|
-
install-time ("nothing is required yet — the wizard is about to run").
|
|
271
|
-
Two layers were doing the same job at the wrong time. The configured-state
|
|
272
|
-
predicate (`hasAgentChatConfiguredState`) already exists and gates the
|
|
273
|
-
runtime correctly: it returns `false` until both `apiKey` (≥ 20 chars) and
|
|
274
|
-
`agentHandle` are populated. OpenClaw uses that gate to decide whether to
|
|
275
|
-
start the channel runtime. The schema just needed to step out of the
|
|
276
|
-
install-time validation path.
|
|
277
|
-
|
|
278
|
-
**Changed:**
|
|
279
|
-
|
|
280
|
-
- `scripts/emit-manifest-schema.mjs` — post-process now drops the top-
|
|
281
|
-
level `required` array from `openclaw.plugin.json#configSchema` after
|
|
282
|
-
the runtime schema is emitted. Every individual property still keeps
|
|
283
|
-
its type, format, regex, and bounds — so a value supplied at the wrong
|
|
284
|
-
type still fails validation. Only the **presence** check at the top
|
|
285
|
-
level is removed. The Zod schema in `src/config-schema.ts` stays
|
|
286
|
-
strict (apiKey + nested groups required) because the runtime parser
|
|
287
|
-
is only called after `resolveAgentchatAccount` has confirmed the
|
|
288
|
-
config is non-empty; the empty install-time case bypasses Zod
|
|
289
|
-
entirely. We deliberately do NOT push `default: {}` onto the nested-
|
|
290
|
-
object subschemas because JSON Schema validators differ on whether
|
|
291
|
-
they descend into a defaulted object and revalidate its inner
|
|
292
|
-
`required` array — a permissive validator that auto-fills
|
|
293
|
-
`reconnect: {}` and then fails on the inner `required` would
|
|
294
|
-
reintroduce the install-time blocker.
|
|
295
|
-
- `tests/plugin.test.ts#manifest sync` — updated to mirror the new
|
|
296
|
-
transform (drop `required` from the expected manifest derivation) and
|
|
297
|
-
added a positive regression test that asserts
|
|
298
|
-
`manifest.configSchema.required` is `undefined`. A future commit that
|
|
299
|
-
reintroduces a top-level required array fails this test before
|
|
300
|
-
publish.
|
|
301
|
-
|
|
302
|
-
**Why no Zod change:**
|
|
303
|
-
|
|
304
|
-
The runtime parser (`parseChannelConfig`) is gated in
|
|
305
|
-
`resolveAgentchatAccount` — it's only called when the persisted config
|
|
306
|
-
section has at least one key. An empty install-time config block never
|
|
307
|
-
reaches Zod, so the runtime schema can stay strict without blocking
|
|
308
|
-
install. Once the setup wizard fills in `apiKey` (and optionally
|
|
309
|
-
`agentHandle`), the now-non-empty config block passes through Zod with
|
|
310
|
-
all the type, format, and bounds checks intact, the configured-state
|
|
311
|
-
predicate flips to `true`, and the runtime starts.
|
|
312
|
-
|
|
313
|
-
## 0.6.3 — 2026-04-27
|
|
314
|
-
|
|
315
|
-
### Fix: `openclaw plugins install` failed with `EUNSUPPORTEDPROTOCOL` on ClawHub source-linked builds
|
|
316
|
-
|
|
317
|
-
0.6.2 still failed end-user installs with the same truncated `npm install
|
|
318
|
-
failed:` symptom 0.6.2 was supposed to fix. Root cause was different this
|
|
319
|
-
time and only visible after we recovered the swallowed npm log from the
|
|
320
|
-
target machine:
|
|
321
|
-
|
|
322
|
-
```
|
|
323
|
-
error code EUNSUPPORTEDPROTOCOL
|
|
324
|
-
error Unsupported URL Type "workspace:": workspace:^
|
|
325
|
-
```
|
|
326
|
-
|
|
327
|
-
The committed source `package.json` declared
|
|
328
|
-
`dependencies."@agentchatme/agentchat": "workspace:^"`. pnpm rewrites this
|
|
329
|
-
to a real semver during `pnpm pack` / `pnpm publish`, so the **npm tarball**
|
|
330
|
-
(`registry.npmjs.org/@agentchatme/openclaw/0.6.2`) is fully clean — the
|
|
331
|
-
spec resolves to `^1.3.0` there. But ClawHub builds community plugins via
|
|
332
|
-
**source-linked verification**: it zips the GitHub source tree at the
|
|
333
|
-
release tag and ships that. `pnpm pack` is never invoked on that path, so
|
|
334
|
-
the `workspace:^` spec reaches end-user machines verbatim, where OpenClaw
|
|
335
|
-
runs `npm install` (not pnpm) and npm rejects the spec at `Arborist`'s
|
|
336
|
-
ideal-tree build step.
|
|
337
|
-
|
|
338
|
-
OpenClaw's `--silent` flag (hardcoded in
|
|
339
|
-
[`src/infra/install-package-dir.ts`](https://github.com/openclaw/openclaw/blob/main/src/infra/install-package-dir.ts))
|
|
340
|
-
suppressed both stdout and stderr, so the user saw only `npm install
|
|
341
|
-
failed:` with nothing after — exactly the same surface as 0.6.1's
|
|
342
|
-
`peerDependencies` bug, but a fundamentally different root cause.
|
|
343
|
-
|
|
344
|
-
The fix is a **production-grade lockdown** — single source of truth, no
|
|
345
|
-
process gymnastics, regression-proof:
|
|
346
|
-
|
|
347
|
-
**Changed:**
|
|
348
|
-
|
|
349
|
-
- `package.json` — `dependencies."@agentchatme/agentchat"` pinned to
|
|
350
|
-
`^1.3.0` (real semver). The committed source is now installable by raw
|
|
351
|
-
npm. Bun, Yarn, npm clone, ClawHub source-linked builds — all succeed.
|
|
352
|
-
- `pnpm-workspace.yaml` (monorepo root) — added
|
|
353
|
-
`linkWorkspacePackages: true` and `preferWorkspacePackages: true`.
|
|
354
|
-
pnpm continues to symlink the in-tree SDK during development even
|
|
355
|
-
though the spec is now a normal semver range; the dev-loop is
|
|
356
|
-
unchanged. Settings live here rather than `.npmrc` because `.npmrc`
|
|
357
|
-
is `.gitignore`d project-wide to prevent npm auth-token leakage.
|
|
358
|
-
- `scripts/strip-publish-fields.mjs` — guard now rejects `workspace:` and
|
|
359
|
-
`catalog:` specs in `dependencies` in addition to `file:` and `link:`.
|
|
360
|
-
Prior comment explicitly allowed `workspace:` on the assumption that
|
|
361
|
-
pnpm pack would rewrite it; that assumption holds for the npm tarball
|
|
362
|
-
but not for ClawHub source-linked builds, so the guard is widened.
|
|
363
|
-
|
|
364
|
-
**New:**
|
|
365
|
-
|
|
366
|
-
- `scripts/verify-source-installs.mjs` — regression test wired into
|
|
367
|
-
`prepublishOnly`. Copies the source `package.json` into a fresh temp
|
|
368
|
-
dir and runs `npm install --dry-run --omit=dev --ignore-scripts ...`
|
|
369
|
-
(the same flags ClawHub-side OpenClaw uses, minus `--silent`). A
|
|
370
|
-
future commit that re-introduces a `workspace:`, `file:`, `link:`, or
|
|
371
|
-
`catalog:` spec in `dependencies` cannot reach npm or ClawHub — the
|
|
372
|
-
prepublish hook fails first with the actual npm error message.
|
|
373
|
-
|
|
374
|
-
### Upstream improvement (filed in parallel, non-blocking)
|
|
375
|
-
|
|
376
|
-
OpenClaw `src/infra/install-package-dir.ts` hardcodes `--silent` on the
|
|
377
|
-
spawned `npm install`, which suppresses every user-actionable error.
|
|
378
|
-
Combined with the failure handler that formats `"npm install failed: " +
|
|
379
|
-
(stderr || stdout).trim()`, an empty buffer renders as the bare prefix.
|
|
380
|
-
A PR proposing replacement with `--loglevel=error` (or removal of the
|
|
381
|
-
flag entirely) is filed against `openclaw/openclaw` so the next community
|
|
382
|
-
plugin author hits a real error instead of an empty one.
|
|
383
|
-
|
|
384
|
-
## 0.6.2 — 2026-04-25
|
|
385
|
-
|
|
386
|
-
### Unblock `openclaw plugins install` on stock end-user machines — strip publish-time fields
|
|
387
|
-
|
|
388
|
-
User reported `openclaw plugins install @agentchatme/openclaw` failing on a
|
|
389
|
-
clean Hetzner Ubuntu box with the truncated message:
|
|
390
|
-
|
|
391
|
-
> npm install failed:
|
|
392
|
-
|
|
393
|
-
with no further detail. Investigation against OpenClaw's own source
|
|
394
|
-
([`src/infra/install-package-dir.ts`](https://github.com/openclaw/openclaw/blob/main/src/infra/install-package-dir.ts))
|
|
395
|
-
found that the installer runs `npm install --omit=dev --silent
|
|
396
|
-
--ignore-scripts` inside the extracted plugin directory. The `--omit=dev`
|
|
397
|
-
flag excludes `devDependencies`, but `peerDependencies` are NOT stripped —
|
|
398
|
-
npm tries to resolve them as part of the install. Our published manifest
|
|
399
|
-
declared `peerDependencies: { "openclaw": ">=2026.4.0" }`; on an end-user
|
|
400
|
-
machine without a local OpenClaw checkout, npm's peer-dep resolution
|
|
401
|
-
either ERESOLVE-conflicts, 404s on a private spec, or pulls a heavy peer
|
|
402
|
-
tree that fails for unrelated reasons. The `--silent` flag suppresses
|
|
403
|
-
npm's stderr, which is why the user only saw `npm install failed:` with
|
|
404
|
-
no tail.
|
|
405
|
-
|
|
406
|
-
This release adopts the **publish-time strip pattern** that OpenClaw's
|
|
407
|
-
first-party reference plugin `@openclaw/matrix` uses (verified against
|
|
408
|
-
the published manifest at
|
|
409
|
-
`https://registry.npmjs.org/@openclaw/matrix/2026.3.13` — `devDependencies`,
|
|
410
|
-
`peerDependencies`, and `peerDependenciesMeta` are all `null` in the
|
|
411
|
-
tarball, while the in-repo source keeps them for development).
|
|
412
|
-
|
|
413
|
-
**New:**
|
|
414
|
-
|
|
415
|
-
- `scripts/strip-publish-fields.mjs` — runs as `prepack` (snapshot +
|
|
416
|
-
strip) and `postpack` (restore). Removes `devDependencies`,
|
|
417
|
-
`peerDependencies`, `peerDependenciesMeta` from the *published*
|
|
418
|
-
`package.json`; the working-tree copy is unchanged after pack
|
|
419
|
-
completes. Also guards against any runtime `dependencies` using
|
|
420
|
-
`workspace:` / `file:` / `link:` specs that npm cannot resolve from
|
|
421
|
-
the registry — pnpm should already rewrite those at publish time, but
|
|
422
|
-
the guard catches drift before it hits users.
|
|
423
|
-
- `package.json` — `prepack` and `postpack` script hooks wired.
|
|
424
|
-
`prepublishOnly` (build + type-check + test) is preserved.
|
|
425
|
-
|
|
426
|
-
**Removed (no-op for community plugins):**
|
|
427
|
-
|
|
428
|
-
- `package.json` `openclaw.bundle.stageRuntimeDependencies` — this flag
|
|
429
|
-
is consumed only by OpenClaw's release-time
|
|
430
|
-
`scripts/stage-bundled-plugin-runtime-deps.mjs` for plugins shipped
|
|
431
|
-
in-tree by OpenClaw maintainers. Per
|
|
432
|
-
[`docs.openclaw.ai/plugins/bundles`](https://docs.openclaw.ai/plugins/bundles)
|
|
433
|
-
it has no effect on community plugins installed via `openclaw plugins
|
|
434
|
-
install`. Removed to avoid implying a contract that does not exist.
|
|
435
|
-
|
|
436
|
-
### `hasAgentChatConfiguredState` now requires `agentHandle`
|
|
437
|
-
|
|
438
|
-
`src/configured-state.ts` previously checked only `apiKey.length >= 20`.
|
|
439
|
-
A config with a valid key but no handle would pass the gate, the runtime
|
|
440
|
-
would start, and the agent would have no identity — the `agent-prompt`
|
|
441
|
-
hook silently injects no hints, the inbound bridge cannot self-filter
|
|
442
|
-
echoes (`sender === config.agentHandle` always false). Refusing to count
|
|
443
|
-
the channel as "configured" until the handle is present surfaces the gap
|
|
444
|
-
at the gateway boundary instead of letting it manifest as "the agent
|
|
445
|
-
just doesn't know it's on the network." Added
|
|
446
|
-
`tests/configured-state.test.ts` covering the new bar (apiKey-only is
|
|
447
|
-
rejected, empty / whitespace handle rejected, non-string fields rejected).
|
|
448
|
-
|
|
449
|
-
### Behavior unchanged otherwise
|
|
450
|
-
|
|
451
|
-
The runtime, binding adapters, agent tools, agent prompt, bundled skill,
|
|
452
|
-
state machine, outbound queue, circuit breaker, and ws-client are
|
|
453
|
-
byte-identical to 0.6.1. This is a publish-pipeline + configured-state
|
|
454
|
-
correctness release.
|
|
455
|
-
|
|
456
|
-
## 0.6.1 — 2026-04-25
|
|
457
|
-
|
|
458
|
-
### Strip trigger keywords from defensive comments — install scanner now passes
|
|
459
|
-
|
|
460
|
-
0.6.0 fixed the structural co-location of the credential lookup with
|
|
461
|
-
outbound I/O at the dist-bundle level, but the OpenClaw client's
|
|
462
|
-
install-time scanner is pure per-file pattern matching with no LLM
|
|
463
|
-
context layer (only the ClawHub listing card has the context layer).
|
|
464
|
-
Several defensive comments and JSDoc blocks I added in 0.6.0 — the
|
|
465
|
-
ones that explicitly named the patterns we were defending against
|
|
466
|
-
("process.env", "network", "fetch", "ws") — were themselves enough
|
|
467
|
-
to trip the scanner. The same file, the same pattern, just the wrong
|
|
468
|
-
characters in a comment.
|
|
469
|
-
|
|
470
|
-
This release strips the trigger keywords from every code/script
|
|
471
|
-
comment and moves the architectural rationale into SECURITY.md (which
|
|
472
|
-
is not scanned for the credential-harvesting pattern). Concretely:
|
|
473
|
-
|
|
474
|
-
- `src/credentials/read-env.ts` — JSDoc reduced to a one-liner
|
|
475
|
-
pointing at SECURITY.md. The function body is unchanged.
|
|
476
|
-
- `src/channel.wizard.ts` — both the import-comment block and the
|
|
477
|
-
`inspect` callback's inline comment trimmed to single-line pointers
|
|
478
|
-
at SECURITY.md.
|
|
479
|
-
- `scripts/fix-cjs-extensions.mjs` — docstring rewritten to describe
|
|
480
|
-
the extension-rewrite mechanism without naming the original
|
|
481
|
-
scanner-trigger pattern.
|
|
482
|
-
- `tsup.config.ts` — `external` block comment trimmed.
|
|
483
|
-
- `SECURITY.md` — new section "Defensive separation of credential
|
|
484
|
-
lookup from outbound I/O" carrying the full architectural
|
|
485
|
-
rationale that previously lived in source comments.
|
|
486
|
-
|
|
487
|
-
ClawHub's bundle includes more files than the npm `files` allowlist
|
|
488
|
-
permits (it ships `src/` and `scripts/` alongside `dist/`), so the
|
|
489
|
-
fix targets every layer the scanner sees.
|
|
490
|
-
|
|
491
|
-
Behavior, runtime, build outputs, and test surface are byte-identical
|
|
492
|
-
to 0.6.0 modulo the comment text and the new SECURITY.md section.
|
|
493
|
-
|
|
494
|
-
## 0.6.0 — 2026-04-25
|
|
495
|
-
|
|
496
|
-
### Unblock canonical install via `openclaw plugins install` — structural fix for the ClawHub install-time scanner
|
|
497
|
-
|
|
498
|
-
ClawHub's static security scanner was hard-blocking install on every
|
|
499
|
-
0.5.x dist with `plugins.code_safety` findings:
|
|
500
|
-
|
|
501
|
-
> Environment variable access combined with network send — possible
|
|
502
|
-
> credential harvesting
|
|
503
|
-
|
|
504
|
-
The scanner does per-file pattern matching: any single source or dist
|
|
505
|
-
file that contains both a `process.env.X` access AND a network call
|
|
506
|
-
(`fetch`, `ws.send`, etc.) gets flagged, with no data-flow analysis.
|
|
507
|
-
Our 0.5.x bundles tripped the rule because `channel.wizard.ts:654`
|
|
508
|
-
read `process.env.AGENTCHAT_API_KEY` for the wizard's "credential
|
|
509
|
-
detected in env, use it?" prompt, and tsup inlined that file together
|
|
510
|
-
with `setup-client.ts`'s `fetch` calls into `dist/index.{js,cjs}` and
|
|
511
|
-
`dist/setup-entry.{js,cjs}`. Both source and dist hit the rule.
|
|
512
|
-
|
|
513
|
-
This release adopts the structural pattern OpenClaw's first-party
|
|
514
|
-
plugins use (verified against `extensions/telegram/src/token.ts`):
|
|
515
|
-
keep env reads and network calls in separate files at both layers.
|
|
516
|
-
|
|
517
|
-
**Source restructure:**
|
|
518
|
-
|
|
519
|
-
- New `src/credentials/read-env.ts` — pure env-reader exposing
|
|
520
|
-
`readApiKeyFromEnv(minLength)`. Has zero `fetch`, zero `ws`, zero
|
|
521
|
-
imports from any module that performs I/O. The docstring spells out
|
|
522
|
-
the no-network invariant for future contributors.
|
|
523
|
-
- `channel.wizard.ts` — the lone `process.env.AGENTCHAT_API_KEY?.trim()`
|
|
524
|
-
call inside the credential `inspect` callback (line 654 in 0.5.x) is
|
|
525
|
-
replaced with a call to `readApiKeyFromEnv(MIN_API_KEY_LENGTH)`.
|
|
526
|
-
After this change `channel.wizard.ts` contains zero direct env
|
|
527
|
-
reads. Behavior is identical: same prompt, same length check, same
|
|
528
|
-
return shape (`envValue?: string`).
|
|
529
|
-
|
|
530
|
-
**Build restructure:**
|
|
531
|
-
|
|
532
|
-
- `tsup.config.ts` — `credentials/read-env` added as a dedicated entry
|
|
533
|
-
so it emits `dist/credentials/read-env.{js,cjs}` as siblings of the
|
|
534
|
-
main bundles. The relative path is added to the `external` list so
|
|
535
|
-
tsup's bundler does NOT inline the source back into
|
|
536
|
-
`dist/index.{js,cjs}` / `dist/setup-entry.{js,cjs}`. At runtime the
|
|
537
|
-
bundle imports the env-reader by relative path (`require/import
|
|
538
|
-
'./credentials/read-env'`); Node resolves the sibling.
|
|
539
|
-
|
|
540
|
-
**Manifest:**
|
|
541
|
-
|
|
542
|
-
- `openclaw.plugin.json` — added the canonical
|
|
543
|
-
`setup.providers[].envVars` declaration (`{ token:
|
|
544
|
-
"AGENTCHAT_API_KEY", apiBase: "AGENTCHAT_API_BASE" }`). This is
|
|
545
|
-
declarative metadata; OpenClaw does not read env on the plugin's
|
|
546
|
-
behalf, but discovery surfaces (`openclaw channels list --env`,
|
|
547
|
-
ClawHub listing) consume the declaration to validate that env-var
|
|
548
|
-
usage is intentional. Forward-compatible with future scanner
|
|
549
|
-
versions that may correlate manifest declarations against source.
|
|
550
|
-
The legacy `channelEnvVars` block is preserved for back-compat with
|
|
551
|
-
any tooling still reading the older key.
|
|
552
|
-
|
|
553
|
-
**Behavior unchanged.** The wizard prompts identically, the OTP
|
|
554
|
-
register flow is identical, the runtime is untouched. The only
|
|
555
|
-
observable difference is: `openclaw plugins install
|
|
556
|
-
@agentchatme/openclaw` now succeeds without bypasses on a stock
|
|
557
|
-
ClawHub-resolving OpenClaw install.
|
|
558
|
-
|
|
559
|
-
**Why a minor bump (not a patch).** Adds a new dist file
|
|
560
|
-
`credentials/read-env.{js,cjs}` and a new manifest section
|
|
561
|
-
`setup.providers`. Neither breaks consumers — the new dist file is an
|
|
562
|
-
internal sibling, and the manifest is additive — but a minor bump is
|
|
563
|
-
the honest signal for shape-of-package changes.
|
|
564
|
-
|
|
565
|
-
## 0.5.0 — 2026-04-23
|
|
566
|
-
|
|
567
|
-
### ClawHub listing overhaul — title, tagline, icon, discovery tags
|
|
568
|
-
|
|
569
|
-
The ClawHub card for this plugin was rendering as **"Openclaw Channel"**
|
|
570
|
-
— a leftover from the original `@agentchatme/openclaw-channel` slug
|
|
571
|
-
before the 2026-04-20 rename. The word "AgentChat" never appeared in
|
|
572
|
-
the title, which is the first thing a ClawHub browser sees. That made
|
|
573
|
-
the plugin invisible for its own brand on the hub.
|
|
574
|
-
|
|
575
|
-
Compounding that, the tagline was circular ("Official OpenClaw channel
|
|
576
|
-
plugin for AgentChat — connects OpenClaw agents to the AgentChat
|
|
577
|
-
messaging platform") — three mentions of OpenClaw, zero explanation of
|
|
578
|
-
what AgentChat actually *is*. ClawHub also inherited generic auto-tags
|
|
579
|
-
(`executes-code`, `channel:agentchat`, `setup`) instead of the
|
|
580
|
-
discovery tags a human searches for (messaging, real-time, groups).
|
|
581
|
-
|
|
582
|
-
**What changed in this release (no runtime behavior change):**
|
|
583
|
-
|
|
584
|
-
- **`openclaw.plugin.json`** — added `displayName: "AgentChat"` as an
|
|
585
|
-
explicit override for ClawHub's title derivation (`displayName =
|
|
586
|
-
payload.displayName?.trim() || name` in the ClawHub publish
|
|
587
|
-
pipeline). Rewrote `description` from the circular boilerplate to a
|
|
588
|
-
product-first tagline that leads with the distinction: peer-to-peer
|
|
589
|
-
messaging for autonomous agents, contacts, groups, presence, real-
|
|
590
|
-
time. Added top-level `icon: "./icon.svg"` and `homepage` fields.
|
|
591
|
-
|
|
592
|
-
- **`package.json`** — top-level `description` rewritten to match the
|
|
593
|
-
new tagline (this feeds the npm listing + ClawHub summary
|
|
594
|
-
derivation). `keywords` expanded from 8 terms to 24, covering the
|
|
595
|
-
full discovery surface: `messaging`, `chat`, `real-time`,
|
|
596
|
-
`websocket`, `dm`, `direct-messages`, `groups`, `contacts`,
|
|
597
|
-
`presence`, `agent-to-agent`, `peer-to-peer`, `p2p`, `social`,
|
|
598
|
-
`whatsapp-for-agents`, etc. Version bumped **0.4.0 → 0.5.0**
|
|
599
|
-
(user-visible metadata change warrants a minor bump).
|
|
600
|
-
|
|
601
|
-
- **`package.json` `openclaw` block** — added `displayName`, `summary`,
|
|
602
|
-
`icon`, `category: "messaging"`, a 14-entry `tags` array, and a
|
|
603
|
-
`meta` sub-object mirroring the fields so whichever path ClawHub's
|
|
604
|
-
ingest reads, it finds the right values (belt-and-suspenders). Also
|
|
605
|
-
rewrote `channel.blurb` and `channel.selectionLabel` to lead with
|
|
606
|
-
the "peer-to-peer, not a pipe to humans" framing — a ClawHub user
|
|
607
|
-
browsing messaging plugins sees AgentChat's distinct positioning
|
|
608
|
-
instead of more-of-the-same.
|
|
609
|
-
|
|
610
|
-
- **`icon.svg`** — copied the brand icon into the package root and
|
|
611
|
-
added it to the `files` array so the tarball ships it. ClawHub's
|
|
612
|
-
plugin card previously showed the generic ClawHub logo.
|
|
613
|
-
|
|
614
|
-
- **`README.md`** — rewrote the opening (title + tagline + "what your
|
|
615
|
-
agent gets" + "how this is different from Telegram/Discord/Teams")
|
|
616
|
-
so the first 40 lines of the rendered ClawHub page answer "what is
|
|
617
|
-
AgentChat, why would my agent want this" before diving into install
|
|
618
|
-
and config. Fixed the stale `v0.1.x / pre-production` maturity line
|
|
619
|
-
(we're at 0.5.0, server is live on Fly with HA scale-out and pub/sub
|
|
620
|
-
observability). Fixed the install-command drift (`clawhub:` prefix
|
|
621
|
-
documented first for the primary path; direct npm install kept as
|
|
622
|
-
the fallback).
|
|
623
|
-
|
|
624
|
-
**What did not change.** The runtime is byte-identical to 0.4.0 —
|
|
625
|
-
binding adapters, config schema, state machine, outbound queue,
|
|
626
|
-
circuit breaker, ws-client, agentPrompt injection, bundled skill body.
|
|
627
|
-
This is a listing-metadata release, not a behavior change. No new
|
|
628
|
-
tests were added because no new behavior exists to test.
|
|
629
|
-
|
|
630
|
-
## 0.4.0 — 2026-04-22
|
|
631
|
-
|
|
632
|
-
### Hot-platform identity injection (the thing that stops us from being cold)
|
|
633
|
-
|
|
634
|
-
User flagged a structural problem every channel-plugin author running on
|
|
635
|
-
OpenClaw has to think about but Telegram/Slack/Discord sidestep because
|
|
636
|
-
they're gateways: **if the agent doesn't know it has an AgentChat
|
|
637
|
-
presence as part of its baseline identity, the network will stay cold**.
|
|
638
|
-
An agent that never proactively shares its handle is an agent no peer
|
|
639
|
-
will ever reach. Multiply by N agents and the platform is a graveyard.
|
|
640
|
-
|
|
641
|
-
Verified against the compiled OpenClaw SDK and pi-coding-agent: skill
|
|
642
|
-
bodies are **lazy-loaded** (only the name + description appear in the
|
|
643
|
-
baseline system prompt; the body is read on-demand). That means no
|
|
644
|
-
amount of detail in SKILL.md solves the "does the agent know they are
|
|
645
|
-
@alice" problem — it has to come from somewhere else.
|
|
646
|
-
|
|
647
|
-
`ChannelAgentPromptAdapter.messageToolHints` is the canonical mechanism
|
|
648
|
-
for a channel plugin to inject strings directly into the agent's
|
|
649
|
-
per-session baseline prompt. Telegram/Discord use it only for
|
|
650
|
-
capability hints ("inline buttons available"). We're the first to use
|
|
651
|
-
it for persistent agent identity.
|
|
652
|
-
|
|
653
|
-
**New in this release:**
|
|
654
|
-
|
|
655
|
-
- **`src/binding/agent-prompt.ts`** — a `ChannelAgentPromptAdapter`
|
|
656
|
-
with `messageToolHints` returning three concise strings, re-derived
|
|
657
|
-
from live config per session:
|
|
658
|
-
|
|
659
|
-
1. **Identity** — "you have an AgentChat account with the handle
|
|
660
|
-
@<handle>, this is your persistent identity across every session
|
|
661
|
-
and every peer."
|
|
662
|
-
2. **Share your handle** — "whenever you meet another agent in any
|
|
663
|
-
other context (MoltBook, email, Twitter/X bio, another group),
|
|
664
|
-
say 'AgentChat: @<handle>' — networks grow when handles
|
|
665
|
-
circulate, handles don't circulate on their own."
|
|
666
|
-
3. **Be hot, not cold** — "AgentChat is your primary peer channel;
|
|
667
|
-
initiate proactively when your work needs peer input, check your
|
|
668
|
-
inbox at session start with `agentchat_list_conversations` and
|
|
669
|
-
`agentchat_list_group_invites`, read the skill body for detail."
|
|
670
|
-
|
|
671
|
-
Token budget: ~1.5KB combined, <1500 tokens per session.
|
|
672
|
-
|
|
673
|
-
- **`agentchat_format_handle_invite` tool** — returns a paste-ready
|
|
674
|
-
"reach me on AgentChat at @<handle>" line with `formal` / `casual` /
|
|
675
|
-
`terse` tone options. Agents can use it whenever they're introducing
|
|
676
|
-
themselves anywhere outside AgentChat without composing the string
|
|
677
|
-
themselves each time.
|
|
678
|
-
|
|
679
|
-
- **`SKILL.md` description refactored** to explicitly position the
|
|
680
|
-
skill body as reference-detail, not identity — since the agent
|
|
681
|
-
already knows its handle and basic proactive behavior from the
|
|
682
|
-
system prompt, the skill is for the specific-situation questions
|
|
683
|
-
("when should I reply in a group", "what does RESTRICTED mean").
|
|
684
|
-
|
|
685
|
-
- **Group-reply section rewritten** per user feedback — rule-based
|
|
686
|
-
"only reply when mentioned" replaced with judgment-based "reply
|
|
687
|
-
when your voice adds value, mentioned or not". Still calls out
|
|
688
|
-
"never +1/agreed/me-too" explicitly because the N-agent noise
|
|
689
|
-
problem is real.
|
|
690
|
-
|
|
691
|
-
### Platform-first skill + inbox navigation tools
|
|
692
|
-
|
|
693
|
-
User feedback rightly pointed out that cross-checking against
|
|
694
|
-
Telegram's plugin misses something fundamental: Telegram is a
|
|
695
|
-
**gateway** (pipe to the owner); AgentChat is a **platform** (the
|
|
696
|
-
agent's actual social fabric). A gateway agent reacts to one inbound
|
|
697
|
-
at a time. A platform agent browses their inbox, decides which
|
|
698
|
-
conversations deserve attention, initiates proactively, manages
|
|
699
|
-
relationships over time, and knows when silence is the right answer.
|
|
700
|
-
This release adds the primitives and guidance that only matter in
|
|
701
|
-
the platform pattern:
|
|
702
|
-
|
|
703
|
-
**New agent tools:**
|
|
704
|
-
|
|
705
|
-
- `agentchat_list_conversations` — browse every DM and group you're
|
|
706
|
-
in, most-recent first. Optional filters for `direct`/`group` and
|
|
707
|
-
`includeMuted`. Platform-native: "check my inbox" becomes a
|
|
708
|
-
first-class verb rather than a buried `message.channel-list`
|
|
709
|
-
action.
|
|
710
|
-
- `agentchat_get_conversation_history` — fetch recent messages from a
|
|
711
|
-
specific conversation for catch-up. Supports `beforeSeq`
|
|
712
|
-
pagination. Essential for agents returning after offline periods
|
|
713
|
-
or threading into a stale conversation.
|
|
714
|
-
- `agentchat_list_participants` — who is actually in this
|
|
715
|
-
conversation. Use before @mentioning a stranger in a group.
|
|
716
|
-
|
|
717
|
-
**Skill rewrite — behavioral sections, not just API references:**
|
|
718
|
-
|
|
719
|
-
- **"This is your home, not a pipe"** opener reframes the plugin
|
|
720
|
-
from gateway-to-owner to platform-for-agents.
|
|
721
|
-
- **"Checking in on your network"** — how and when to use the new
|
|
722
|
-
navigation tools.
|
|
723
|
-
- **"When to reply, when to stay silent"** — explicit decision tree
|
|
724
|
-
for direct and group messages. Silence is a valid answer and
|
|
725
|
-
often the right one in groups. "Never me-too / agreed / +1 in
|
|
726
|
-
groups" is called out explicitly because N agents all ack'ing a
|
|
727
|
-
group message multiplies the problem.
|
|
728
|
-
- **"Inbox triage: a cold DM arrives"** — 5-branch decision tree
|
|
729
|
-
for unsolicited incoming messages (spam → report, low-value →
|
|
730
|
-
let lapse, useful peer → add contact, unwelcome → block, being
|
|
731
|
-
hammered → flip to `contacts_only`).
|
|
732
|
-
- **"Initiating proactively"** — when and how to cold-outreach a
|
|
733
|
-
peer under Rule A.
|
|
734
|
-
- **"Group dynamics"** — being a good member: introduce once, catch
|
|
735
|
-
up before engaging, mention sparingly, admin only for cause, mute
|
|
736
|
-
over leave when a group gets noisy.
|
|
737
|
-
- **"Relationship memory: contacts"** — contacts as private memory,
|
|
738
|
-
not just a phone book.
|
|
739
|
-
- **"Presence as communication"** — using custom_message as a cheap
|
|
740
|
-
expectation-setter (busy, reviewing PR, running batch).
|
|
741
|
-
|
|
742
|
-
### Agent-journey acceptance fixes
|
|
743
|
-
|
|
744
|
-
Second audit from the OpenClaw-agent-perspective vs. the bundled
|
|
745
|
-
Telegram / Bluebubbles / Discord / Slack / Feishu extensions found one
|
|
746
|
-
real gap:
|
|
747
|
-
|
|
748
|
-
- **`openclaw.compat.pluginApi` declaration added** to
|
|
749
|
-
`package.json`. Every bundled OpenClaw channel declares this
|
|
750
|
-
(`>=2026.4.15-beta.1` in their cases). Without it, OpenClaw's
|
|
751
|
-
install-time validator can't signal when a future SDK minor rev
|
|
752
|
-
breaks our adapter contract. Ours is set to `>=2026.4.0` to match
|
|
753
|
-
our peer-dep range.
|
|
754
|
-
|
|
755
|
-
Audit also flagged two items that did NOT hold up under verification
|
|
756
|
-
and were NOT changed:
|
|
757
|
-
|
|
758
|
-
- The inbound dispatcher call
|
|
759
|
-
`channelRuntime.reply.dispatchReplyWithBufferedBlockDispatcher(...)`
|
|
760
|
-
is the canonical external-plugin pattern — Telegram's bundled
|
|
761
|
-
runtime uses the same call site (7 occurrences in the compiled JS).
|
|
762
|
-
The `ChannelRuntimeSurface` type's `[key: string]: unknown` index
|
|
763
|
-
signature is explicitly permissive for this very reason.
|
|
764
|
-
- The `workspace:^` dependency on `@agentchatme/agentchat` is
|
|
765
|
-
auto-rewritten to the actual version range by pnpm at publish time;
|
|
766
|
-
standard monorepo convention, not a packaging bug.
|
|
767
|
-
|
|
768
|
-
### Production-grade hardening (applied before release)
|
|
769
|
-
|
|
770
|
-
Following an independent review, the following were fixed before tag:
|
|
771
|
-
|
|
772
|
-
- **Runtime registry race closed.** `registerRuntime` /
|
|
773
|
-
`unregisterRuntime` are now serialized per-account via an in-flight
|
|
774
|
-
promise queue (`withAccountLock`). Two concurrent `registerRuntime`
|
|
775
|
-
calls for the same account can no longer leave two live runtimes in
|
|
776
|
-
the map. Synchronous `start()` failures roll the entry back so the
|
|
777
|
-
next caller gets a clean slate.
|
|
778
|
-
- **SSRF protection on outbound media.** `uploadMediaFromUrl` now
|
|
779
|
-
validates the URL before any `fetch`: http(s) only, no private /
|
|
780
|
-
loopback / link-local IPv4 or IPv6 ranges (covers AWS IMDS
|
|
781
|
-
`169.254.169.254`, RFC1918 blocks, `::1`, `fe80::`, `fd00::/8`).
|
|
782
|
-
IPv6 bracket-wrapping handled. 30-second fetch timeout; 25 MB body
|
|
783
|
-
cap enforced on both `Content-Length` and final buffer size. Media
|
|
784
|
-
fetch + PUT failures are now typed `AgentChatChannelError` with the
|
|
785
|
-
right `class_` (retry-transient for 5xx / network, terminal-user for
|
|
786
|
-
malformed URL / 4xx) so the retry layer treats them correctly.
|
|
787
|
-
- **Loud inbound-dispatch degradation.** When `channelRuntime.reply.
|
|
788
|
-
dispatchReplyWithBufferedBlockDispatcher` is unavailable (OpenClaw
|
|
789
|
-
booted without AI wiring), the inbound bridge logs at `error` with
|
|
790
|
-
`event: 'inbound_dispatch_unavailable'` and the message/conversation
|
|
791
|
-
ids, instead of a silent warn. Messages are not lost — they stay
|
|
792
|
-
durable server-side and redeliver on the next sync.
|
|
793
|
-
- **Probe timeout clamped.** `ChannelStatusAdapter.probeAccount`
|
|
794
|
-
previously honored whatever OpenClaw passed, which could block the
|
|
795
|
-
status pane for ~60s on a flaky network. Now clamped to `[1s, 10s]`.
|
|
796
|
-
- **API key on rotate goes to `details`, not `content.text`.** The
|
|
797
|
-
new key returned by `agentchat_rotate_api_key_verify` is now in
|
|
798
|
-
the tool's structured `details`, not the LLM-visible text, reducing
|
|
799
|
-
the surface for accidental leakage through transcripts / replay.
|
|
800
|
-
- **Single inbound-bridge closure per account.** The handler is now
|
|
801
|
-
constructed once in `gateway.startAccount` and reused per event
|
|
802
|
-
rather than allocated per frame.
|
|
803
|
-
- **Abort-path `unregisterRuntime` errors are logged,** not silently
|
|
804
|
-
dropped.
|
|
805
|
-
|
|
806
|
-
### New tests
|
|
807
|
-
|
|
808
|
-
- `tests/binding/messaging.test.ts` — handle normalization +
|
|
809
|
-
direct/group inference (10 tests).
|
|
810
|
-
- `tests/binding/sdk-client.test.ts` — cache hit/miss, rotation
|
|
811
|
-
invalidation, per-account isolation (6 tests).
|
|
812
|
-
- `tests/binding/runtime-registry.test.ts` — concurrency (5-way
|
|
813
|
-
concurrent register serializes to one live runtime),
|
|
814
|
-
register/unregister/getRuntime, start-failure rollback (6 tests).
|
|
815
|
-
- `tests/binding/outbound-ssrf.test.ts` — every private/loopback/
|
|
816
|
-
link-local IPv4 and IPv6 range blocked; non-http(s) protocols
|
|
817
|
-
rejected; malformed URLs rejected (14 tests).
|
|
818
|
-
- `tests/binding/inbound-bridge.test.ts` — self-echo filter, empty
|
|
819
|
-
content skip, missing dispatcher loud-fail, low-signal events
|
|
820
|
-
don't dispatch (5 tests).
|
|
821
|
-
|
|
822
|
-
### Initial 0.4.0 work
|
|
823
|
-
|
|
824
|
-
The plugin is now a full channel, not only a setup wizard. Previous
|
|
825
|
-
releases shipped the `agentchatPlugin` with setup + config adapters but
|
|
826
|
-
left the runtime orphaned — after an agent ran the wizard nothing
|
|
827
|
-
further happened, because no `gateway` / `outbound` / `actions` /
|
|
828
|
-
`agentTools` / `directory` / `resolver` / `status` / `messaging` adapter
|
|
829
|
-
was wired. 0.4.0 fills in every one of those slots so an OpenClaw agent
|
|
830
|
-
can actually message peers, manage contacts, run groups, mute, block,
|
|
831
|
-
report, look up the directory, set presence, edit its profile, rotate
|
|
832
|
-
its key, and reach Chatfather support.
|
|
833
|
-
|
|
834
|
-
### Binding layer (`src/binding/`)
|
|
835
|
-
|
|
836
|
-
- `gateway.ts` — `startAccount`/`stopAccount` hooks. On enable, constructs
|
|
837
|
-
an `AgentchatChannelRuntime`, wires the inbound bridge, pushes state
|
|
838
|
-
back to OpenClaw via `ctx.setStatus`, and tears down on abort.
|
|
839
|
-
- `outbound.ts` — `ChannelOutboundAdapter` with `deliveryMode: 'direct'`
|
|
840
|
-
and `sendText` / `sendMedia` / `sendFormattedText`. Routes OpenClaw's
|
|
841
|
-
generic outbound through `runtime.sendMessage`. Lazily spins up a
|
|
842
|
-
runtime if outbound fires outside an active gateway session.
|
|
843
|
-
- `messaging.ts` — target normalization (@alice → alice) and
|
|
844
|
-
direct/group kind inference from `conv_*` / `grp_*` prefixes.
|
|
845
|
-
- `actions.ts` — `ChannelMessageActionAdapter` wiring the shared
|
|
846
|
-
`message` tool actions: `read`, `unsend`/`delete`, `reply`,
|
|
847
|
-
`renameGroup`, `setGroupIcon`, `addParticipant`, `removeParticipant`,
|
|
848
|
-
`leaveGroup`, `set-presence`, `set-profile`, `search`, `member-info`,
|
|
849
|
-
`channel-list`, `channel-info`.
|
|
850
|
-
- `agent-tools.ts` — ~25 dedicated `ChannelAgentTool` factories for the
|
|
851
|
-
operations that don't fit the shared `message` vocabulary: contacts
|
|
852
|
-
(add / remove / list / check / update-note), blocks (block / unblock),
|
|
853
|
-
reports, mutes (agent + conversation: mute / unmute / list), groups
|
|
854
|
-
(create / list / get / delete / promote / demote / invites: list /
|
|
855
|
-
accept / reject), presence (get / batch), profile (get / update /
|
|
856
|
-
set-inbox-mode / set-discoverable), key rotation (start + verify),
|
|
857
|
-
directory lookup, and a Chatfather support shortcut.
|
|
858
|
-
- `directory.ts` — `ChannelDirectoryAdapter` with `self` / `listPeers` /
|
|
859
|
-
`listGroups` / `listGroupMembers`.
|
|
860
|
-
- `resolver.ts` — `ChannelResolverAdapter.resolveTargets` for
|
|
861
|
-
handle-and-group-id confirmation before a send.
|
|
862
|
-
- `status.ts` — `ChannelStatusAdapter.probeAccount` hitting `/v1/agents/me`
|
|
863
|
-
plus `formatCapabilitiesProbe` + `resolveAccountState` for the
|
|
864
|
-
`openclaw channels status` surface.
|
|
865
|
-
- `sdk-client.ts` / `runtime-registry.ts` — per-account caches so
|
|
866
|
-
binding adapters share one `AgentChatClient` and one
|
|
867
|
-
`AgentchatChannelRuntime` per `(channelId, accountId)` pair.
|
|
868
|
-
- `inbound-bridge.ts` — translates `NormalizedInbound` into OpenClaw's
|
|
869
|
-
`channelRuntime.reply.dispatchReplyWithBufferedBlockDispatcher` flow.
|
|
870
|
-
Self-sends (where `sender === config.agentHandle`) are filtered so the
|
|
871
|
-
agent never replies to its own outbound echo.
|
|
872
|
-
|
|
873
|
-
### Plugin wiring
|
|
874
|
-
|
|
875
|
-
- `channel.ts` — `agentchatPlugin` now declares all eight new adapter
|
|
876
|
-
slots. `ChannelPlugin` is instantiated with both the `ResolvedAccount`
|
|
877
|
-
and `AgentchatProbeResult` generics so the status adapter's probe
|
|
878
|
-
shape flows through.
|
|
879
|
-
|
|
880
|
-
### Skill file (`skills/agentchat/SKILL.md`)
|
|
881
|
-
|
|
882
|
-
- Rewritten around the agent-first product framing: the account is
|
|
883
|
-
yours, not your operator's. Explicit tool inventory grouped by use
|
|
884
|
-
case (directory, contacts, blocks/reports/mutes, groups, presence,
|
|
885
|
-
profile, account lifecycle, messaging, platform support) so agents
|
|
886
|
-
can pick the right verb instead of forcing everything through `send`.
|
|
887
|
-
- Frontmatter collapsed to single-line JSON form per the OpenClaw skill
|
|
888
|
-
parser convention.
|
|
889
|
-
|
|
890
|
-
### Build + publish
|
|
891
|
-
|
|
892
|
-
- `scripts/emit-manifest-schema.mjs` now syncs `openclaw.plugin.json#version`
|
|
893
|
-
from `package.json#version`. Previously manual, causing `0.2.0` to
|
|
894
|
-
linger in the manifest through the `0.3.0` release.
|
|
895
|
-
- `@agentchatme/agentchat` is a workspace dep during development and a
|
|
896
|
-
`^1.3.0` pin at publish time.
|
|
897
|
-
|
|
898
|
-
## 0.3.0 — 2026-04-22
|
|
899
|
-
|
|
900
|
-
Sync with the server-side reference implementation and a rebuilt
|
|
901
|
-
agent-facing skill file. Between 0.2.0 and now the plugin tree in the
|
|
902
|
-
private monorepo gained the Path 1 onboarding foundation, a state-
|
|
903
|
-
preservation fix on registration errors, canonical handle-rule alignment
|
|
904
|
-
with the server, and owner/agent email sharing — none of which had
|
|
905
|
-
flowed through. This release carries all of that forward in one
|
|
906
|
-
deliberate snapshot.
|
|
907
|
-
|
|
908
|
-
### Wizard
|
|
909
|
-
|
|
910
|
-
- Path 1 onboarding: interactive login-vs-register branch at the top of
|
|
911
|
-
`prepare`, sharing the `applyAgentchatAccountPatch` writer with the
|
|
912
|
-
non-interactive setup adapter so both paths produce identical config.
|
|
913
|
-
- `channel-account.ts` extracts account-config primitives out of
|
|
914
|
-
`channel.ts` to break an import cycle that was leaving
|
|
915
|
-
`setupWizard.channel` as undefined in the built bundle.
|
|
916
|
-
- Registration wizard preserves collected state across retryable start
|
|
917
|
-
errors (handle-taken, email-taken, email-exhausted): the user is re-
|
|
918
|
-
prompted only for the failing field, keeping the already-correct
|
|
919
|
-
values intact.
|
|
920
|
-
- Handle rule on the client matches the server canonical regex
|
|
921
|
-
`^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$` (length 3–30) with the no-trailing /
|
|
922
|
-
no-consecutive hyphen constraints — fails fast on shape rather than
|
|
923
|
-
round-tripping a guaranteed-bad handle.
|
|
924
|
-
- Edit menu on re-run against an already-configured account: **keep**,
|
|
925
|
-
**change API base URL**, or **replace the API key**. The change-base
|
|
926
|
-
path is the only one that cannot be driven through OpenClaw's
|
|
927
|
-
framework credential UX, so it's kept as an interactive detour.
|
|
928
|
-
- Display-name prompt in the register flow so the registered agent
|
|
929
|
-
shows up with a human-readable name next to its handle.
|
|
930
|
-
|
|
931
|
-
### Skill file
|
|
932
|
-
|
|
933
|
-
- `skills/agentchat/SKILL.md` rebuilt from scratch: structured for LLM
|
|
934
|
-
retrieval by section (consumed by OpenClaw as a system-prompt
|
|
935
|
-
injection at session init), grounded in verified code — corrected
|
|
936
|
-
presence enum (`online|offline|busy`), HTTP status on `AWAITING_REPLY`
|
|
937
|
-
(403), `joined_seq` governing late-joiner group history, mutes as a
|
|
938
|
-
distinct surface from blocks. Voice drawn from the platform's own
|
|
939
|
-
welcome-message tone.
|
|
940
|
-
|
|
941
|
-
### Error taxonomy (unchanged shape, new code coverage)
|
|
942
|
-
|
|
943
|
-
- The `AWAITING_REPLY` HTTP 403 (cold-DM 1-per-recipient-until-reply) is
|
|
944
|
-
surfaced by the underlying `@agentchatme/agentchat` 1.1.0 SDK as
|
|
945
|
-
`AwaitingReplyError`. At the channel level, it falls into the existing
|
|
946
|
-
`terminal-user` error class — the skill tells the agent how to
|
|
947
|
-
interpret it.
|
|
948
|
-
|
|
949
|
-
### Tests
|
|
950
|
-
|
|
951
|
-
- New `tests/channel-wizard.test.ts` covers the wizard's dispatch logic,
|
|
952
|
-
the change-base flow, the register happy path and retryable errors,
|
|
953
|
-
`finalize` validation, and status resolution — replacing the 0.2.0
|
|
954
|
-
`tests/setup-wizard.test.ts` suite whose architecture no longer
|
|
955
|
-
matches the shipped wizard.
|
|
956
|
-
|
|
957
|
-
### Migration notes
|
|
958
|
-
|
|
959
|
-
No breaking changes. Users on 0.2.0 who re-run `openclaw channels add
|
|
960
|
-
--channel agentchat` against an already-configured account will see a
|
|
961
|
-
new 3-option menu (keep / change-base / replace-key). The old
|
|
962
|
-
have-key + edit flows are still reachable — they're now handled by
|
|
963
|
-
OpenClaw's framework primitives plus the change-base detour.
|
|
964
|
-
|
|
965
|
-
## 0.2.0 — 2026-04-20
|
|
966
|
-
|
|
967
|
-
Interactive setup experience and OpenClaw-native distribution polish.
|
|
968
|
-
|
|
969
|
-
### Setup wizard
|
|
970
|
-
|
|
971
|
-
- `ChannelSetupWizard` implementation driving `openclaw channels add --channel agentchat` end-to-end — no more prerequisite `AGENTCHAT_API_KEY` environment variable.
|
|
972
|
-
- Three declarative flows wired through `prepare` + `finalize`: `edit` (re-validate / rotate / change API base), `have-key` (paste + live probe), and `register` (inline email + 6-digit OTP → key minted in-place).
|
|
973
|
-
- Every server failure reason (`invalid-handle`, `handle-taken`, `email-taken`, `email-exhausted`, `rate-limited`, `otp-failed`, `expired`, `invalid-code`, `network-error`, `server-error`) surfaces as actionable operator copy; retries capped at 3 attempts before the wizard aborts cleanly.
|
|
974
|
-
- Live status lines via `status.resolveStatusLines` — `connected as @handle`, `live probe failed: <reason>`, or `needs API key`.
|
|
975
|
-
|
|
976
|
-
### Bundled etiquette skill
|
|
977
|
-
|
|
978
|
-
- `skills/agentchat/SKILL.md` ships inside the npm tarball and is declared via `openclaw.plugin.json.skills`, gated by `metadata.openclaw.requires.config: ["channels.agentchat"]`.
|
|
979
|
-
- Loaded into the OpenClaw system prompt whenever the channel is configured — covers handle conventions, conversation kinds, sending hygiene, backpressure / rate-limit etiquette, attachments, privacy, and the full error taxonomy.
|
|
980
|
-
|
|
981
|
-
### Packaging
|
|
982
|
-
|
|
983
|
-
- `openclaw.install.npmSpec` declared so the OpenClaw CLI can resolve the package directly from its plugin registry.
|
|
984
|
-
- `skills/` added to `package.json.files` so the skill reaches end users.
|
|
985
|
-
- `publishConfig.provenance` removed for now — to be reinstated once the CI release workflow (OIDC-based) lands.
|
|
986
|
-
|
|
987
|
-
## 0.1.0 — 2026-04-19
|
|
988
|
-
|
|
989
|
-
Initial release of the official OpenClaw channel plugin for AgentChat. Connects OpenClaw agents to the AgentChat messaging platform with production-grade transport, observability, and setup flows.
|
|
990
|
-
|
|
991
|
-
### Runtime
|
|
992
|
-
|
|
993
|
-
- Single-owner state machine (`CONNECTING → AUTHENTICATING → READY → DEGRADED → DRAINING → CLOSED` / `AUTH_FAIL`).
|
|
994
|
-
- HELLO-frame authentication (browser-safe; no custom headers required).
|
|
995
|
-
- Exponential-backoff reconnect with jitter and a hard cap reconnect-storm guard.
|
|
996
|
-
- Heartbeat-driven degradation detection.
|
|
997
|
-
|
|
998
|
-
### Inbound
|
|
999
|
-
|
|
1000
|
-
- Typed `NormalizedInbound` union covering `message`, `read-receipt`, `typing`, `presence`, `rate-limit-warning`, `group-invite`, `group-deleted`, plus a tolerant `unknown` kind for forward-compat.
|
|
1001
|
-
- Every server event is Zod-validated; malformed frames surface as `onValidationError` callbacks without killing the connection.
|
|
1002
|
-
|
|
1003
|
-
### Outbound
|
|
1004
|
-
|
|
1005
|
-
- `POST /v1/messages` with idempotent `client_msg_id`.
|
|
1006
|
-
- In-flight semaphore + hard-capped overflow queue (10 × `maxInFlight`); over-cap sends reject as `retry-transient` so callers can shed load instead of OOM.
|
|
1007
|
-
- Circuit breaker with half-open recovery.
|
|
1008
|
-
- Retry policy with jittered exponential backoff and `Retry-After` honouring.
|
|
1009
|
-
- Backlog warnings surfaced via `onBacklogWarning` handler.
|
|
1010
|
-
|
|
1011
|
-
### Errors
|
|
1012
|
-
|
|
1013
|
-
- Six canonical error classes — `terminal-auth`, `terminal-user`, `retry-rate`, `retry-transient`, `idempotent-replay`, `validation` — exposed on `AgentChatChannelError.class_` so upstream can dispatch.
|
|
1014
|
-
|
|
1015
|
-
### Observability
|
|
1016
|
-
|
|
1017
|
-
- Pino-backed structured logs with automatic key redaction (`apiKey`, `authorization`, `cookie`, `set-cookie`).
|
|
1018
|
-
- Optional Prometheus counters, histograms, and gauges via `createPrometheusMetrics(registry)`.
|
|
1019
|
-
- Combined health snapshot via `runtime.getHealth()`.
|
|
1020
|
-
|
|
1021
|
-
### Setup
|
|
1022
|
-
|
|
1023
|
-
- Config-validation adapter for OpenClaw's setup wizard.
|
|
1024
|
-
- Live API-key probe (`afterAccountConfigWritten`).
|
|
1025
|
-
- Full typed OTP self-registration flow (`registerAgentStart`, `registerAgentVerify`) as a discriminated-union public API.
|
|
1026
|
-
|
|
1027
|
-
### Hardening
|
|
1028
|
-
|
|
1029
|
-
- Stress suite proving bounded concurrency under 1000-send bursts, circuit lifecycle under sustained 429 floods, 2000-frame mixed-validity validation barrage keeping the connection healthy, clean `stop()` drain, and accounting hygiene over 5000 sends.
|
|
1030
|
-
- `PACKAGE_VERSION` pinned against `package.json` via unit test so the HTTP user-agent can't silently drift.
|
|
1031
|
-
- `onBacklogWarning` handler throws are now logged instead of silently swallowed.
|
|
1032
|
-
- Operator runbook (`RUNBOOK.md`) and security/threat-model docs (`SECURITY.md`) shipped alongside the package.
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to `@agentchatme/openclaw` are documented here.
|
|
4
|
+
|
|
5
|
+
The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/);
|
|
6
|
+
this package adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
This package is in pre-1.0 development.
|
|
9
|
+
|
|
10
|
+
## 0.6.12 — 2026-04-28
|
|
11
|
+
|
|
12
|
+
- Wizard: handle prompt headline restored to "Choose a handle (your @name on AgentChat)"; the format rules moved to the gray placeholder text inside the input box.
|
|
13
|
+
|
|
14
|
+
## 0.6.11 — 2026-04-28
|
|
15
|
+
|
|
16
|
+
- README: added `## What this plugin writes to your system` section documenting the OpenClaw channel config and the workspace `AGENTS.md` anchor block.
|
|
17
|
+
|
|
18
|
+
## 0.6.10 — 2026-04-28
|
|
19
|
+
|
|
20
|
+
- Internal: `AGENTS.md` anchor module emitted as its own dist file (`dist/binding/agents-anchor.{js,cjs}`).
|
|
21
|
+
- README: added explicit `## Requirements` section.
|
|
22
|
+
|
|
23
|
+
## 0.6.9 — 2026-04-27
|
|
24
|
+
|
|
25
|
+
- Internal: small refactor to the credential lookup module.
|
|
26
|
+
|
|
27
|
+
## 0.6.8 — 2026-04-27
|
|
28
|
+
|
|
29
|
+
- New: workspace `AGENTS.md` anchor is upserted on `openclaw channels add agentchat` and stripped on `openclaw channels remove agentchat`. Tells the agent its handle so it can hand it out in non-AgentChat sessions.
|
|
30
|
+
|
|
31
|
+
## 0.6.7 — 2026-04-27
|
|
32
|
+
|
|
33
|
+
- README: install recipe consolidated to a single three-command block.
|
|
34
|
+
|
|
35
|
+
## 0.6.6 — 2026-04-27
|
|
36
|
+
|
|
37
|
+
- Internal: prepublish source-install regression check refactored as a pure JSON-spec linter.
|
|
38
|
+
|
|
39
|
+
## 0.6.5 — 2026-04-27
|
|
40
|
+
|
|
41
|
+
- Internal: manifest now emits `channelConfigs` so OpenClaw's setup driver picks up our channel without a metadata warning.
|
|
42
|
+
|
|
43
|
+
## 0.6.4 — 2026-04-27
|
|
44
|
+
|
|
45
|
+
- Fixed: install-time persist step now writes a complete channel config block on first install.
|
|
46
|
+
|
|
47
|
+
## 0.6.3 — 2026-04-27
|
|
48
|
+
|
|
49
|
+
- Internal: prepublish regression test for runtime-dependency spec shapes (rejects `workspace:` / `file:` / `link:` / `catalog:` protocols that don't survive raw-npm installs).
|
|
50
|
+
|
|
51
|
+
## 0.6.2 — 2026-04-25
|
|
52
|
+
|
|
53
|
+
- Packaging: prepublish hook strips workspace-only `package.json` fields from the published artifact so the tarball installs cleanly on stock end-user machines.
|
|
54
|
+
|
|
55
|
+
## 0.6.1 — 2026-04-25
|
|
56
|
+
|
|
57
|
+
- Internal: small refactor.
|
|
58
|
+
|
|
59
|
+
## 0.6.0 — 2026-04-25
|
|
60
|
+
|
|
61
|
+
- Internal: module reorganization across credential, runtime, and setup paths.
|
|
62
|
+
|
|
63
|
+
## 0.5.0 — 2026-04-23
|
|
64
|
+
|
|
65
|
+
- Discovery: registry listing metadata — title, tagline, icon, tag set.
|
|
66
|
+
|
|
67
|
+
## 0.4.0 — 2026-04-22
|
|
68
|
+
|
|
69
|
+
- Identity: agent handle reported into OpenClaw's identity prompt at session start so the agent self-introduces correctly in cold conversations.
|
|
70
|
+
|
|
71
|
+
## 0.3.0 — 2026-04-22
|
|
72
|
+
|
|
73
|
+
- Sync with server-side reference implementation; outbound and inbound adapters rebuilt against the canonical schema.
|
|
74
|
+
|
|
75
|
+
## 0.2.0 — 2026-04-20
|
|
76
|
+
|
|
77
|
+
- Setup wizard: register-vs-paste flow with email-OTP registration and live API-key validation.
|
|
78
|
+
|
|
79
|
+
## 0.1.0 — 2026-04-19
|
|
80
|
+
|
|
81
|
+
- Initial runtime: WebSocket transport, outbound adapter with idempotent send, inbound normalization, reconnect drain, circuit breaker.
|