@excitedjs/dreamux 0.9.8 → 0.11.0

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.json ADDED
@@ -0,0 +1,372 @@
1
+ {
2
+ "name": "@excitedjs/dreamux",
3
+ "entries": [
4
+ {
5
+ "version": "0.11.0",
6
+ "tag": "@excitedjs/dreamux_v0.11.0",
7
+ "date": "Fri, 05 Jun 2026 16:16:45 GMT",
8
+ "comments": {
9
+ "minor": [
10
+ {
11
+ "comment": "Unify persisted-file version policy (issue #98). BREAKING: dispatcher access.json is now v2-only; the legacy v1 shape (dm.allow_users + group.follow_users) is no longer auto-migrated and an unsupported/missing version fails loud. Rebuild: delete the dispatcher's access.json to return to the secure default (no one authorized), then recreate it as a v2 access.json with allow_users and group.policy (see the access.json section in the dreamux README) and restart; note that `dreamux onboard` does not restore access grants. status.json and restart-intent.json now warn-and-rebuild / warn-and-drop on incompatible, malformed, or invalid-field content instead of silently discarding or misreading; neither hard-fatals the server."
12
+ }
13
+ ]
14
+ }
15
+ },
16
+ {
17
+ "version": "0.10.0",
18
+ "tag": "@excitedjs/dreamux_v0.10.0",
19
+ "date": "Fri, 05 Jun 2026 15:34:49 GMT",
20
+ "comments": {
21
+ "minor": [
22
+ {
23
+ "comment": "Add the `dreamux changelog` command (and `--json`) that prints the installed package's bundled CHANGELOG, and ship CHANGELOG.md/CHANGELOG.json in the package files. This is the upgrade-time information entry point for the 0.x fail-loud + rebuild policy (issue #98)."
24
+ }
25
+ ]
26
+ }
27
+ },
28
+ {
29
+ "version": "0.9.8",
30
+ "tag": "@excitedjs/dreamux_v0.9.8",
31
+ "date": "Fri, 05 Jun 2026 14:06:54 GMT",
32
+ "comments": {
33
+ "patch": [
34
+ {
35
+ "comment": "Trusted peer-bot inbound now requires both a trusted sender open_id and an @-mention of this bot; introduce trusts only mention open_id (no union_id/user_id fallback); add diagnostic-only sender_union_id to inbound-drop logs (issue #102)"
36
+ }
37
+ ],
38
+ "dependency": [
39
+ {
40
+ "comment": "Updating dependency \"@excitedjs/feishu-transport\" to `0.2.3`"
41
+ }
42
+ ]
43
+ }
44
+ },
45
+ {
46
+ "version": "0.9.7",
47
+ "tag": "@excitedjs/dreamux_v0.9.7",
48
+ "date": "Fri, 05 Jun 2026 12:14:20 GMT",
49
+ "comments": {
50
+ "patch": [
51
+ {
52
+ "comment": "Restructure the bundled dispatcher skill into a router plus references, make the teammate engine a deliberate explicit choice instead of forcing codex, and add prompt-composition, router-posture, and inspect/resume workflow guidance."
53
+ }
54
+ ]
55
+ }
56
+ },
57
+ {
58
+ "version": "0.9.6",
59
+ "tag": "@excitedjs/dreamux_v0.9.6",
60
+ "date": "Fri, 05 Jun 2026 08:05:04 GMT",
61
+ "comments": {
62
+ "patch": [
63
+ {
64
+ "comment": "Fix the published npm install path by removing the ahead-of-use Feishu channel runtime dependency."
65
+ }
66
+ ]
67
+ }
68
+ },
69
+ {
70
+ "version": "0.9.5",
71
+ "tag": "@excitedjs/dreamux_v0.9.5",
72
+ "date": "Fri, 05 Jun 2026 05:41:43 GMT",
73
+ "comments": {
74
+ "patch": [
75
+ {
76
+ "comment": "Bundle the dispatcher, team-dev-workflow, and dreamux-maintenance skills and install them as workspace-local symlinks for each dispatcher."
77
+ }
78
+ ]
79
+ }
80
+ },
81
+ {
82
+ "version": "0.9.4",
83
+ "tag": "@excitedjs/dreamux_v0.9.4",
84
+ "date": "Fri, 05 Jun 2026 05:30:23 GMT",
85
+ "comments": {
86
+ "patch": [
87
+ {
88
+ "comment": "Route Feishu inbound formatting through feishu-channel, including downloaded attachment paths and fallback resource references."
89
+ }
90
+ ],
91
+ "dependency": [
92
+ {
93
+ "comment": "Updating dependency \"@excitedjs/feishu-transport\" to `0.2.2`"
94
+ }
95
+ ]
96
+ }
97
+ },
98
+ {
99
+ "version": "0.9.3",
100
+ "tag": "@excitedjs/dreamux_v0.9.3",
101
+ "date": "Fri, 05 Jun 2026 03:34:03 GMT",
102
+ "comments": {
103
+ "patch": [
104
+ {
105
+ "comment": "Fix group /introduce authorization to follow the group policy: under follow-user it now ignores allow_chats and gates only on allow_users, matching the delivery gate; block is denied explicitly (group_blocked); allowlist is unchanged."
106
+ }
107
+ ]
108
+ }
109
+ },
110
+ {
111
+ "version": "0.9.2",
112
+ "tag": "@excitedjs/dreamux_v0.9.2",
113
+ "date": "Fri, 05 Jun 2026 02:47:01 GMT",
114
+ "comments": {
115
+ "patch": [
116
+ {
117
+ "comment": "Add a best-effort Feishu channel acknowledgement for authorized group /introduce commands."
118
+ }
119
+ ]
120
+ }
121
+ },
122
+ {
123
+ "version": "0.9.1",
124
+ "tag": "@excitedjs/dreamux_v0.9.1",
125
+ "date": "Thu, 04 Jun 2026 23:08:48 GMT",
126
+ "comments": {
127
+ "patch": [
128
+ {
129
+ "comment": "Remove all synchronous blocking IO from package source (fs/promises + async child_process) and add a permanent ESLint gate (n/no-sync + import/syntax backstops via the shared @excitedjs/eslint-config) wired through rush lint, CI, and the pre-commit hook (issue #85)"
130
+ }
131
+ ],
132
+ "dependency": [
133
+ {
134
+ "comment": "Updating dependency \"@excitedjs/feishu-transport\" to `0.2.1`"
135
+ }
136
+ ]
137
+ }
138
+ },
139
+ {
140
+ "version": "0.9.0",
141
+ "tag": "@excitedjs/dreamux_v0.9.0",
142
+ "date": "Thu, 04 Jun 2026 20:50:14 GMT",
143
+ "comments": {
144
+ "minor": [
145
+ {
146
+ "comment": "Add daemon command group (install/uninstall/start/stop/restart), enable systemd linger so the user service starts at boot, and inject a restart-completed notice into resumed dispatchers after daemon restart --notify-resumed"
147
+ }
148
+ ]
149
+ }
150
+ },
151
+ {
152
+ "version": "0.8.0",
153
+ "tag": "@excitedjs/dreamux_v0.8.0",
154
+ "date": "Thu, 04 Jun 2026 20:24:45 GMT",
155
+ "comments": {
156
+ "minor": [
157
+ {
158
+ "comment": "Fix the follow-user group-access semantics: the dispatcher runtime gate (dreamuxFeishuGate) now gates group delivery on a single global allow-user list shared with direct messages, instead of a separate group.follow_users list, so a sender on the global allowlist who @-mentions the bot is delivered in any group (issue #79). The access.json shape is unified to v2: a top-level allow_users list plus an explicit group.policy (block | allowlist | follow-user); v1 files are migrated forward by readDispatcherAccess (legacy dm.allow_users and group.follow_users are merged and de-duplicated, the policy is inferred, and the first save rewrites the file). An empty allow_users now authorizes nobody, consistent with direct messages. /introduce sender authorization moves to the global allow_users list while still requiring the chat to be named in allow_chats."
159
+ }
160
+ ]
161
+ }
162
+ },
163
+ {
164
+ "version": "0.7.0",
165
+ "tag": "@excitedjs/dreamux_v0.7.0",
166
+ "date": "Thu, 04 Jun 2026 20:18:37 GMT",
167
+ "comments": {
168
+ "minor": [
169
+ {
170
+ "comment": "Prefer a stable platform-aware system Node for the managed service (Homebrew on macOS, system paths on Linux) with fallback to the current Node, and add a non-fatal dreamux doctor advisory when the service Node is bound to a version manager."
171
+ }
172
+ ]
173
+ }
174
+ },
175
+ {
176
+ "version": "0.6.2",
177
+ "tag": "@excitedjs/dreamux_v0.6.2",
178
+ "date": "Thu, 04 Jun 2026 19:41:43 GMT",
179
+ "comments": {
180
+ "patch": [
181
+ {
182
+ "comment": "Log a distinct channel diagnostic ('introduce detected but not authorized') with a stable reason code (non_group / empty_sender_id / chat_not_allowlisted / sender_not_followed) when a group /introduce is detected but the sender is not authorized, instead of letting it surface as an ordinary gate drop (e.g. 'bot not mentioned'). Gate, trust, and /introduce semantics are unchanged (issue #77)."
183
+ }
184
+ ]
185
+ }
186
+ },
187
+ {
188
+ "version": "0.6.1",
189
+ "tag": "@excitedjs/dreamux_v0.6.1",
190
+ "date": "Thu, 04 Jun 2026 18:47:15 GMT",
191
+ "comments": {
192
+ "patch": [
193
+ {
194
+ "comment": "Inject each dispatcher's per-dispatcher channel logger into its Feishu bot/transport, so the transport's Lark SDK and WebSocket connection diagnostics land in logs/feishu-channel/<id>.log alongside the host's own channel decisions (issue #74)."
195
+ }
196
+ ],
197
+ "dependency": [
198
+ {
199
+ "comment": "Updating dependency \"@excitedjs/feishu-transport\" to `0.2.0`"
200
+ }
201
+ ]
202
+ }
203
+ },
204
+ {
205
+ "version": "0.6.0",
206
+ "tag": "@excitedjs/dreamux_v0.6.0",
207
+ "date": "Thu, 04 Jun 2026 17:58:38 GMT",
208
+ "comments": {
209
+ "minor": [
210
+ {
211
+ "comment": "Add persistent structured file logging (pino) across server, Feishu channel, gate/drop/inbound/outbound/introduce, dispatcher runtime, and the feishu-mcp stdio shim; logs persist under ~/.dreamux/logs (issue #70)."
212
+ }
213
+ ]
214
+ }
215
+ },
216
+ {
217
+ "version": "0.5.0",
218
+ "tag": "@excitedjs/dreamux_v0.5.0",
219
+ "date": "Thu, 04 Jun 2026 17:12:55 GMT",
220
+ "comments": {
221
+ "minor": [
222
+ {
223
+ "comment": "Inject a one-shot <group_bots> context of a group's trusted bots on the first delivered message after /introduce (commit-after-notify, generation-safe clear); add a model-facing list_chat_bots MCP tool (backed by a read-only mcp.list_chat_bots admin method) returning a chat's known + trusted bots; and change the inbound reaction lifecycle to add-then-cancel so the message never shows a zero-reaction window during the received -> in-progress transition."
224
+ }
225
+ ]
226
+ }
227
+ },
228
+ {
229
+ "version": "0.4.0",
230
+ "tag": "@excitedjs/dreamux_v0.4.0",
231
+ "date": "Thu, 04 Jun 2026 15:47:28 GMT",
232
+ "comments": {
233
+ "minor": [
234
+ {
235
+ "comment": "Add the Feishu event-registry seam (FeishuBot.start now takes a route object with onMessage + optional onBotMemberAdded) and the group /introduce hard contract: /introduce triggers only when the sender is allowlisted, with no @-mention of the bot required. A new chat-bots.json store separates passive bot awareness from introduced trust."
236
+ }
237
+ ]
238
+ }
239
+ },
240
+ {
241
+ "version": "0.3.3",
242
+ "tag": "@excitedjs/dreamux_v0.3.3",
243
+ "date": "Thu, 04 Jun 2026 14:09:37 GMT",
244
+ "comments": {
245
+ "patch": [
246
+ {
247
+ "comment": "Fix Feishu inbound reaction emoji type values."
248
+ }
249
+ ]
250
+ }
251
+ },
252
+ {
253
+ "version": "0.3.2",
254
+ "tag": "@excitedjs/dreamux_v0.3.2",
255
+ "date": "Thu, 04 Jun 2026 13:15:17 GMT",
256
+ "comments": {
257
+ "patch": [
258
+ {
259
+ "comment": "Submit accepted Feishu inbound with non-blocking turn/start delivery and three-state reactions."
260
+ }
261
+ ]
262
+ }
263
+ },
264
+ {
265
+ "version": "0.3.1",
266
+ "tag": "@excitedjs/dreamux_v0.3.1",
267
+ "date": "Thu, 04 Jun 2026 07:44:14 GMT",
268
+ "comments": {
269
+ "patch": [
270
+ {
271
+ "comment": "Fix managed service startup when Node is provided by nvm."
272
+ }
273
+ ]
274
+ }
275
+ },
276
+ {
277
+ "version": "0.3.0",
278
+ "tag": "@excitedjs/dreamux_v0.3.0",
279
+ "date": "Thu, 04 Jun 2026 05:00:52 GMT",
280
+ "comments": {
281
+ "minor": [
282
+ {
283
+ "comment": "调整 onboard 与 dispatcher runtime,使其继承本机 Codex 状态,改用 JSON 配置并新增 uninstall 指令。"
284
+ }
285
+ ],
286
+ "dependency": [
287
+ {
288
+ "comment": "Updating dependency \"@excitedjs/feishu-transport\" to `0.1.0`"
289
+ }
290
+ ]
291
+ }
292
+ },
293
+ {
294
+ "version": "0.2.0",
295
+ "tag": "@excitedjs/dreamux_v0.2.0",
296
+ "date": "Wed, 03 Jun 2026 07:57:13 GMT",
297
+ "comments": {
298
+ "minor": [
299
+ {
300
+ "comment": "调整 onboard 与 dispatcher runtime,使其继承本机 Codex 状态,改用 JSON 配置并新增 uninstall 指令。"
301
+ }
302
+ ]
303
+ }
304
+ },
305
+ {
306
+ "version": "0.1.4",
307
+ "tag": "@excitedjs/dreamux_v0.1.4",
308
+ "date": "Wed, 03 Jun 2026 04:29:43 GMT",
309
+ "comments": {
310
+ "patch": [
311
+ {
312
+ "comment": "Fix onboard Codex marketplace installation from the public dreamux repository."
313
+ }
314
+ ]
315
+ }
316
+ },
317
+ {
318
+ "version": "0.1.3",
319
+ "tag": "@excitedjs/dreamux_v0.1.3",
320
+ "date": "Tue, 02 Jun 2026 18:55:21 GMT",
321
+ "comments": {
322
+ "patch": [
323
+ {
324
+ "comment": "Implement dreamux onboard: first-run wizard, dispatcher-private Codex home setup, plugin installation, service registration, and transparent file ledger output."
325
+ },
326
+ {
327
+ "comment": "Add the issue #18 dreamux serve foundation: single global bin command tree, dispatcher-private Codex homes, and serve-time Codex home checks."
328
+ }
329
+ ],
330
+ "none": [
331
+ {
332
+ "comment": "Add repository field so npm provenance validation passes on OIDC publish"
333
+ }
334
+ ]
335
+ }
336
+ },
337
+ {
338
+ "version": "0.1.2",
339
+ "tag": "@excitedjs/dreamux_v0.1.2",
340
+ "date": "Sun, 31 May 2026 07:02:52 GMT",
341
+ "comments": {
342
+ "patch": [
343
+ {
344
+ "comment": "Thread Feishu replies and drop bot-loop inbound messages"
345
+ }
346
+ ],
347
+ "dependency": [
348
+ {
349
+ "comment": "Updating dependency \"@excitedjs/feishu-transport\" to `0.0.2`"
350
+ }
351
+ ]
352
+ }
353
+ },
354
+ {
355
+ "version": "0.1.1",
356
+ "tag": "@excitedjs/dreamux_v0.1.1",
357
+ "date": "Sat, 30 May 2026 17:49:32 GMT",
358
+ "comments": {
359
+ "patch": [
360
+ {
361
+ "comment": "init"
362
+ }
363
+ ],
364
+ "dependency": [
365
+ {
366
+ "comment": "Updating dependency \"@excitedjs/feishu-transport\" to `0.0.1`"
367
+ }
368
+ ]
369
+ }
370
+ }
371
+ ]
372
+ }
package/CHANGELOG.md ADDED
@@ -0,0 +1,194 @@
1
+ # Change Log - @excitedjs/dreamux
2
+
3
+ This log was last generated on Fri, 05 Jun 2026 16:16:45 GMT and should not be manually modified.
4
+
5
+ ## 0.11.0
6
+ Fri, 05 Jun 2026 16:16:45 GMT
7
+
8
+ ### Minor changes
9
+
10
+ - Unify persisted-file version policy (issue #98). BREAKING: dispatcher access.json is now v2-only; the legacy v1 shape (dm.allow_users + group.follow_users) is no longer auto-migrated and an unsupported/missing version fails loud. Rebuild: delete the dispatcher's access.json to return to the secure default (no one authorized), then recreate it as a v2 access.json with allow_users and group.policy (see the access.json section in the dreamux README) and restart; note that `dreamux onboard` does not restore access grants. status.json and restart-intent.json now warn-and-rebuild / warn-and-drop on incompatible, malformed, or invalid-field content instead of silently discarding or misreading; neither hard-fatals the server.
11
+
12
+ ## 0.10.0
13
+ Fri, 05 Jun 2026 15:34:49 GMT
14
+
15
+ ### Minor changes
16
+
17
+ - Add the `dreamux changelog` command (and `--json`) that prints the installed package's bundled CHANGELOG, and ship CHANGELOG.md/CHANGELOG.json in the package files. This is the upgrade-time information entry point for the 0.x fail-loud + rebuild policy (issue #98).
18
+
19
+ ## 0.9.8
20
+ Fri, 05 Jun 2026 14:06:54 GMT
21
+
22
+ ### Patches
23
+
24
+ - Trusted peer-bot inbound now requires both a trusted sender open_id and an @-mention of this bot; introduce trusts only mention open_id (no union_id/user_id fallback); add diagnostic-only sender_union_id to inbound-drop logs (issue #102)
25
+
26
+ ## 0.9.7
27
+ Fri, 05 Jun 2026 12:14:20 GMT
28
+
29
+ ### Patches
30
+
31
+ - Restructure the bundled dispatcher skill into a router plus references, make the teammate engine a deliberate explicit choice instead of forcing codex, and add prompt-composition, router-posture, and inspect/resume workflow guidance.
32
+
33
+ ## 0.9.6
34
+ Fri, 05 Jun 2026 08:05:04 GMT
35
+
36
+ ### Patches
37
+
38
+ - Fix the published npm install path by removing the ahead-of-use Feishu channel runtime dependency.
39
+
40
+ ## 0.9.5
41
+ Fri, 05 Jun 2026 05:41:43 GMT
42
+
43
+ ### Patches
44
+
45
+ - Bundle the dispatcher, team-dev-workflow, and dreamux-maintenance skills and install them as workspace-local symlinks for each dispatcher.
46
+
47
+ ## 0.9.4
48
+ Fri, 05 Jun 2026 05:30:23 GMT
49
+
50
+ ### Patches
51
+
52
+ - Route Feishu inbound formatting through feishu-channel, including downloaded attachment paths and fallback resource references.
53
+
54
+ ## 0.9.3
55
+ Fri, 05 Jun 2026 03:34:03 GMT
56
+
57
+ ### Patches
58
+
59
+ - Fix group /introduce authorization to follow the group policy: under follow-user it now ignores allow_chats and gates only on allow_users, matching the delivery gate; block is denied explicitly (group_blocked); allowlist is unchanged.
60
+
61
+ ## 0.9.2
62
+ Fri, 05 Jun 2026 02:47:01 GMT
63
+
64
+ ### Patches
65
+
66
+ - Add a best-effort Feishu channel acknowledgement for authorized group /introduce commands.
67
+
68
+ ## 0.9.1
69
+ Thu, 04 Jun 2026 23:08:48 GMT
70
+
71
+ ### Patches
72
+
73
+ - Remove all synchronous blocking IO from package source (fs/promises + async child_process) and add a permanent ESLint gate (n/no-sync + import/syntax backstops via the shared @excitedjs/eslint-config) wired through rush lint, CI, and the pre-commit hook (issue #85)
74
+
75
+ ## 0.9.0
76
+ Thu, 04 Jun 2026 20:50:14 GMT
77
+
78
+ ### Minor changes
79
+
80
+ - Add daemon command group (install/uninstall/start/stop/restart), enable systemd linger so the user service starts at boot, and inject a restart-completed notice into resumed dispatchers after daemon restart --notify-resumed
81
+
82
+ ## 0.8.0
83
+ Thu, 04 Jun 2026 20:24:45 GMT
84
+
85
+ ### Minor changes
86
+
87
+ - Fix the follow-user group-access semantics: the dispatcher runtime gate (dreamuxFeishuGate) now gates group delivery on a single global allow-user list shared with direct messages, instead of a separate group.follow_users list, so a sender on the global allowlist who @-mentions the bot is delivered in any group (issue #79). The access.json shape is unified to v2: a top-level allow_users list plus an explicit group.policy (block | allowlist | follow-user); v1 files are migrated forward by readDispatcherAccess (legacy dm.allow_users and group.follow_users are merged and de-duplicated, the policy is inferred, and the first save rewrites the file). An empty allow_users now authorizes nobody, consistent with direct messages. /introduce sender authorization moves to the global allow_users list while still requiring the chat to be named in allow_chats.
88
+
89
+ ## 0.7.0
90
+ Thu, 04 Jun 2026 20:18:37 GMT
91
+
92
+ ### Minor changes
93
+
94
+ - Prefer a stable platform-aware system Node for the managed service (Homebrew on macOS, system paths on Linux) with fallback to the current Node, and add a non-fatal dreamux doctor advisory when the service Node is bound to a version manager.
95
+
96
+ ## 0.6.2
97
+ Thu, 04 Jun 2026 19:41:43 GMT
98
+
99
+ ### Patches
100
+
101
+ - Log a distinct channel diagnostic ('introduce detected but not authorized') with a stable reason code (non_group / empty_sender_id / chat_not_allowlisted / sender_not_followed) when a group /introduce is detected but the sender is not authorized, instead of letting it surface as an ordinary gate drop (e.g. 'bot not mentioned'). Gate, trust, and /introduce semantics are unchanged (issue #77).
102
+
103
+ ## 0.6.1
104
+ Thu, 04 Jun 2026 18:47:15 GMT
105
+
106
+ ### Patches
107
+
108
+ - Inject each dispatcher's per-dispatcher channel logger into its Feishu bot/transport, so the transport's Lark SDK and WebSocket connection diagnostics land in logs/feishu-channel/<id>.log alongside the host's own channel decisions (issue #74).
109
+
110
+ ## 0.6.0
111
+ Thu, 04 Jun 2026 17:58:38 GMT
112
+
113
+ ### Minor changes
114
+
115
+ - Add persistent structured file logging (pino) across server, Feishu channel, gate/drop/inbound/outbound/introduce, dispatcher runtime, and the feishu-mcp stdio shim; logs persist under ~/.dreamux/logs (issue #70).
116
+
117
+ ## 0.5.0
118
+ Thu, 04 Jun 2026 17:12:55 GMT
119
+
120
+ ### Minor changes
121
+
122
+ - Inject a one-shot <group_bots> context of a group's trusted bots on the first delivered message after /introduce (commit-after-notify, generation-safe clear); add a model-facing list_chat_bots MCP tool (backed by a read-only mcp.list_chat_bots admin method) returning a chat's known + trusted bots; and change the inbound reaction lifecycle to add-then-cancel so the message never shows a zero-reaction window during the received -> in-progress transition.
123
+
124
+ ## 0.4.0
125
+ Thu, 04 Jun 2026 15:47:28 GMT
126
+
127
+ ### Minor changes
128
+
129
+ - Add the Feishu event-registry seam (FeishuBot.start now takes a route object with onMessage + optional onBotMemberAdded) and the group /introduce hard contract: /introduce triggers only when the sender is allowlisted, with no @-mention of the bot required. A new chat-bots.json store separates passive bot awareness from introduced trust.
130
+
131
+ ## 0.3.3
132
+ Thu, 04 Jun 2026 14:09:37 GMT
133
+
134
+ ### Patches
135
+
136
+ - Fix Feishu inbound reaction emoji type values.
137
+
138
+ ## 0.3.2
139
+ Thu, 04 Jun 2026 13:15:17 GMT
140
+
141
+ ### Patches
142
+
143
+ - Submit accepted Feishu inbound with non-blocking turn/start delivery and three-state reactions.
144
+
145
+ ## 0.3.1
146
+ Thu, 04 Jun 2026 07:44:14 GMT
147
+
148
+ ### Patches
149
+
150
+ - Fix managed service startup when Node is provided by nvm.
151
+
152
+ ## 0.3.0
153
+ Thu, 04 Jun 2026 05:00:52 GMT
154
+
155
+ ### Minor changes
156
+
157
+ - 调整 onboard 与 dispatcher runtime,使其继承本机 Codex 状态,改用 JSON 配置并新增 uninstall 指令。
158
+
159
+ ## 0.2.0
160
+ Wed, 03 Jun 2026 07:57:13 GMT
161
+
162
+ ### Minor changes
163
+
164
+ - 调整 onboard 与 dispatcher runtime,使其继承本机 Codex 状态,改用 JSON 配置并新增 uninstall 指令。
165
+
166
+ ## 0.1.4
167
+ Wed, 03 Jun 2026 04:29:43 GMT
168
+
169
+ ### Patches
170
+
171
+ - Fix onboard Codex marketplace installation from the public dreamux repository.
172
+
173
+ ## 0.1.3
174
+ Tue, 02 Jun 2026 18:55:21 GMT
175
+
176
+ ### Patches
177
+
178
+ - Implement dreamux onboard: first-run wizard, dispatcher-private Codex home setup, plugin installation, service registration, and transparent file ledger output.
179
+ - Add the issue #18 dreamux serve foundation: single global bin command tree, dispatcher-private Codex homes, and serve-time Codex home checks.
180
+
181
+ ## 0.1.2
182
+ Sun, 31 May 2026 07:02:52 GMT
183
+
184
+ ### Patches
185
+
186
+ - Thread Feishu replies and drop bot-loop inbound messages
187
+
188
+ ## 0.1.1
189
+ Sat, 30 May 2026 17:49:32 GMT
190
+
191
+ ### Patches
192
+
193
+ - init
194
+
package/README.md CHANGED
@@ -144,13 +144,11 @@ Access-gate allowlists are not part of `config.json`. Configure them in
144
144
 
145
145
  ```json
146
146
  {
147
- "version": 1,
148
- "dm": {
149
- "allow_users": ["<USER_ID>"]
150
- },
147
+ "version": 2,
148
+ "allow_users": ["<USER_ID>"],
151
149
  "group": {
150
+ "policy": "follow-user",
152
151
  "allow_chats": ["<CHAT_ID>"],
153
- "follow_users": ["<USER_ID>"],
154
152
  "require_mention": true
155
153
  },
156
154
  "observed_chats": [],
@@ -159,6 +157,15 @@ Access-gate allowlists are not part of `config.json`. Configure them in
159
157
  }
160
158
  ```
161
159
 
160
+ `access.json` is v2-only. `allow_users` is the single global allowlist of
161
+ sender open_ids, shared by direct messages and the group `follow-user` policy.
162
+ `group.policy` is one of `block`, `allowlist`, or `follow-user`; under
163
+ `allowlist` the gate consults `allow_chats`, under `follow-user` it ignores
164
+ `allow_chats` and gates on `allow_users`. dreamux 0.x does not migrate older
165
+ shapes: an unsupported or missing `version` fails loud at startup. To reset,
166
+ delete the file (secure default: no one authorized) and recreate it in this v2
167
+ shape.
168
+
162
169
  The server reads `access.json` directly at runtime and preserves runtime
163
170
  observations and warnings in the same file.
164
171
 
@@ -162,35 +162,26 @@ function readDispatcherAccess(raw, path) {
162
162
  if (!isRecord(raw)) {
163
163
  throw new Error(`dispatcher access error in ${path}: top-level must be an object`);
164
164
  }
165
+ // v2-only: the legacy v1 shape (`dm.allow_users` + `group.follow_users`) is no
166
+ // longer read or inferred. An unsupported or missing version fails loud — this
167
+ // file holds access authorization, so dreamux refuses to guess old permissions.
168
+ if (raw['version'] !== 2) {
169
+ const found = raw['version'] === undefined ? 'missing' : JSON.stringify(raw['version']);
170
+ throw new Error(`dispatcher access error in ${path}: unsupported schema version (found ${found}, expected 2).\n` +
171
+ 'dreamux 0.x does not migrate old access state. This file controls access ' +
172
+ 'authorization and old permissions will not be inferred. Delete it to return ' +
173
+ 'to the secure default (no one is authorized), then recreate it as a v2 ' +
174
+ 'access.json — set `allow_users` and `group.policy` — and restart. See the ' +
175
+ 'access.json section in the dreamux README for the v2 shape.');
176
+ }
165
177
  const defaults = defaultDispatcherAccessState();
166
- const dm = isRecord(raw['dm']) ? raw['dm'] : {};
167
178
  const group = isRecord(raw['group']) ? raw['group'] : {};
168
179
  const lastGate = raw['last_gate'];
169
- // v2 unifies three possible sources of allowed senders into one list:
170
- // - top-level `allow_users` (v2),
171
- // - legacy `dm.allow_users` (v1 direct allowlist),
172
- // - legacy `group.follow_users` (v1 group sender allowlist).
173
- // They are merged and de-duplicated; the legacy fields are read but never
174
- // written back, so the first save collapses the file to the v2 shape. The
175
- // union means DM access becomes `dm.allow_users ∪ group.follow_users` — for
176
- // the common case (the two were equal, or dm ⊇ follow) DM is unchanged.
177
- const topAllow = readStringArray(raw, 'allow_users', [], path);
178
- const legacyDmAllow = readStringArray(dm, 'allow_users', [], path);
179
- const legacyFollow = readStringArray(group, 'follow_users', [], path);
180
- const allowUsers = [...new Set([...topAllow, ...legacyDmAllow, ...legacyFollow])];
180
+ const allowUsers = readStringArray(raw, 'allow_users', [], path);
181
181
  const allowChats = readStringArray(group, 'allow_chats', defaults.group.allow_chats, path);
182
- // Group policy: an explicit value always wins. Otherwise infer from the
183
- // legacy shape a non-empty `follow_users` is the strongest signal the
184
- // operator wanted sender-scoped gating, so preserve it as `follow-user`
185
- // (never silently relax it to chat-only `allowlist`); then a non-empty
186
- // `allow_chats` means chat-scoped gating; else the secure default.
187
- const explicitPolicy = readGroupPolicy(group['policy'], path);
188
- const policy = explicitPolicy ??
189
- (legacyFollow.length > 0
190
- ? 'follow-user'
191
- : allowChats.length > 0
192
- ? 'allowlist'
193
- : defaults.group.policy);
182
+ // Group policy: an explicit value wins; an absent field falls back to the
183
+ // secure default. No inference from other fields that was the v1 migration.
184
+ const policy = readGroupPolicy(group['policy'], path) ?? defaults.group.policy;
194
185
  return {
195
186
  version: 2,
196
187
  allow_users: allowUsers,