@excitedjs/dreamux 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +36 -46
- package/bin/dreamux +6 -4
- package/dist/admin/socket.js +1 -1
- package/dist/admin/socket.js.map +1 -1
- package/dist/channel/feishu-gate.js +27 -0
- package/dist/channel/feishu-gate.js.map +1 -0
- package/dist/channel/outbound.js +12 -0
- package/dist/channel/outbound.js.map +1 -0
- package/dist/cli/doctor.js +273 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/dreamux.js +257 -78
- package/dist/cli/dreamux.js.map +1 -1
- package/dist/cli/server-ctl.js +15 -13
- package/dist/cli/server-ctl.js.map +1 -1
- package/dist/cli/server.js +7 -7
- package/dist/codex/handshake.js +1 -1
- package/dist/codex/handshake.js.map +1 -1
- package/dist/db/repository.js +16 -0
- package/dist/db/repository.js.map +1 -1
- package/dist/dispatcher/runtime.js +11 -3
- package/dist/dispatcher/runtime.js.map +1 -1
- package/dist/dispatcher/turn-manager.js +10 -8
- package/dist/dispatcher/turn-manager.js.map +1 -1
- package/dist/feishu/bot.js +41 -22
- package/dist/feishu/bot.js.map +1 -1
- package/dist/onboard/commands.js +34 -0
- package/dist/onboard/commands.js.map +1 -0
- package/dist/onboard/config-files.js +113 -0
- package/dist/onboard/config-files.js.map +1 -0
- package/dist/onboard/ledger.js +113 -0
- package/dist/onboard/ledger.js.map +1 -0
- package/dist/onboard/plugins.js +202 -0
- package/dist/onboard/plugins.js.map +1 -0
- package/dist/onboard/run.js +150 -0
- package/dist/onboard/run.js.map +1 -0
- package/dist/onboard/service.js +138 -0
- package/dist/onboard/service.js.map +1 -0
- package/dist/onboard/types.js +2 -0
- package/dist/{feishu → onboard}/types.js.map +1 -1
- package/dist/onboard/wizard.js +146 -0
- package/dist/onboard/wizard.js.map +1 -0
- package/dist/runtime/codex-args.js +1 -1
- package/dist/runtime/config.js +16 -4
- package/dist/runtime/config.js.map +1 -1
- package/dist/runtime/dispatcher-codex-home.js +266 -0
- package/dist/runtime/dispatcher-codex-home.js.map +1 -0
- package/dist/runtime/paths.js +17 -2
- package/dist/runtime/paths.js.map +1 -1
- package/dist/server.js +14 -2
- package/dist/server.js.map +1 -1
- package/package.json +13 -5
- package/bin/server +0 -35
- package/bin/server-ctl +0 -28
- package/dist/feishu/content.js +0 -108
- package/dist/feishu/content.js.map +0 -1
- package/dist/feishu/render.js +0 -600
- package/dist/feishu/render.js.map +0 -1
- package/dist/feishu/types.js +0 -9
package/README.md
CHANGED
|
@@ -11,16 +11,14 @@ and harness pieces, see the top-level
|
|
|
11
11
|
Design background:
|
|
12
12
|
[#1 Proposal](https://github.com/excitedjs/dreamux/issues/1) ·
|
|
13
13
|
[#2 Engineering plan](https://github.com/excitedjs/dreamux/issues/2) ·
|
|
14
|
-
[#4 Monorepo + harness](https://github.com/excitedjs/dreamux/issues/4)
|
|
14
|
+
[#4 Monorepo + harness](https://github.com/excitedjs/dreamux/issues/4) ·
|
|
15
|
+
[#18 Global bin onboarding](https://github.com/excitedjs/dreamux/issues/18).
|
|
15
16
|
|
|
16
17
|
## What this package ships
|
|
17
18
|
|
|
18
|
-
-
|
|
19
|
-
`dreamux
|
|
20
|
-
|
|
21
|
-
`server-ctl` (= `dreamux <verb>`). Kept so pre-monorepo operators
|
|
22
|
-
don't have to rewrite PATH entries; see
|
|
23
|
-
[`.agents/decisions/0002-cli-and-package-naming.md`](../../.agents/decisions/0002-cli-and-package-naming.md).
|
|
19
|
+
- One public CLI bin: `dreamux`. Implemented commands in this slice include
|
|
20
|
+
`dreamux onboard`, `dreamux serve`, `dreamux status`, `dreamux doctor`,
|
|
21
|
+
`dreamux dispatcher ...`, and `dreamux config path|show`.
|
|
24
22
|
- A SQLite-backed runtime (`dispatchers` + `inbound_buffer`) plus the
|
|
25
23
|
Feishu / Codex adapters that drive each dispatcher.
|
|
26
24
|
|
|
@@ -34,7 +32,8 @@ Design background:
|
|
|
34
32
|
Outbound replies are routed by the inbound's `source_chat_id`.
|
|
35
33
|
- **No dispatcher↔worktree binding.** Codex picks the worktree at `tm`-call
|
|
36
34
|
time. The Codex daemon's cwd is `~/.codex-host/dispatchers/<id>/cwd/`
|
|
37
|
-
(intentionally empty)
|
|
35
|
+
(intentionally empty), while its private `CODEX_HOME` is
|
|
36
|
+
`~/.codex-host/dispatchers/<id>/codex-home/`.
|
|
38
37
|
- **FIFO + at-most-once.** One running turn per dispatcher. After a server
|
|
39
38
|
crash, `running` inbound rows are flipped to `unknown` (the user is told
|
|
40
39
|
to confirm or resend); `awaiting_outbound` rows are safely retried.
|
|
@@ -47,21 +46,11 @@ threads, tm registry isolation, cross-machine coordination, web UI.
|
|
|
47
46
|
|
|
48
47
|
## Install / build / test
|
|
49
48
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
```bash
|
|
56
|
-
cd packages/dreamux
|
|
57
|
-
npm install
|
|
58
|
-
npm run build # also runs automatically via `prepare`
|
|
59
|
-
npm run typecheck # tsc --noEmit (no emit)
|
|
60
|
-
npm test # smoke + bin-launcher + (live) codex-0134 tests
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
**Monorepo (from repo root).** Required once a second package exists; CI
|
|
64
|
-
exercises this path so a broken `rush.json` fails CI:
|
|
49
|
+
Use the monorepo (rush) path from the repo root — it is the only supported
|
|
50
|
+
install path. This package depends on `@excitedjs/feishu-transport` via the
|
|
51
|
+
pnpm `workspace:*` protocol, which `npm` cannot resolve, so
|
|
52
|
+
`cd packages/dreamux && npm install` no longer works (see
|
|
53
|
+
[the install-model decision](../../.agents/decisions/install-model.md)):
|
|
65
54
|
|
|
66
55
|
```bash
|
|
67
56
|
node common/scripts/install-run-rush.js update
|
|
@@ -69,22 +58,21 @@ node common/scripts/install-run-rush.js build
|
|
|
69
58
|
node common/scripts/install-run-rush.js test
|
|
70
59
|
```
|
|
71
60
|
|
|
61
|
+
CI exercises this path, so a broken `rush.json` or lockfile fails CI.
|
|
62
|
+
|
|
72
63
|
The bin launchers shell out to plain `node` against the compiled `dist/`
|
|
73
64
|
output; **no `tsx` is needed at runtime** (PR #6).
|
|
74
65
|
|
|
75
66
|
## Run the server
|
|
76
67
|
|
|
77
68
|
```bash
|
|
78
|
-
|
|
79
|
-
./bin/dreamux server start
|
|
80
|
-
|
|
81
|
-
# Backward-compat alias
|
|
82
|
-
./bin/server
|
|
69
|
+
./bin/dreamux serve
|
|
83
70
|
```
|
|
84
71
|
|
|
85
|
-
|
|
72
|
+
The launcher works from any cwd and via symlinks (PR #6 + bin-launcher tests).
|
|
86
73
|
|
|
87
|
-
The server uses two separate home directories — by design (
|
|
74
|
+
The server uses two separate home directories — by design (see
|
|
75
|
+
[the global-config decision](../../.agents/decisions/global-config-dir.md)):
|
|
88
76
|
|
|
89
77
|
| Path | Purpose | Source of truth |
|
|
90
78
|
|---|---|---|
|
|
@@ -92,7 +80,8 @@ The server uses two separate home directories — by design (decision 0003):
|
|
|
92
80
|
| `~/.codex-host/state.db` | SQLite (dispatchers + inbound buffer) | the server |
|
|
93
81
|
| `~/.codex-host/admin.sock` | Admin Unix socket (`0600`) | the server |
|
|
94
82
|
| `~/.codex-host/dispatchers/<id>/cwd/` | Codex app-server cwd | the server |
|
|
95
|
-
| `~/.codex-host/dispatchers/<id>/
|
|
83
|
+
| `~/.codex-host/dispatchers/<id>/codex-home/` | Dispatcher-private `CODEX_HOME` for Codex config, plugin cache, and app-server control state | the server |
|
|
84
|
+
| `~/.codex-host/dispatchers/<id>/codex-home/app-server-control/as.sock` | Codex app-server Unix socket | the server |
|
|
96
85
|
| `~/.codex-host/dispatchers/<id>/*.log` | Codex stdout / stderr | the server |
|
|
97
86
|
|
|
98
87
|
`rm -rf ~/.codex-host` is a safe recovery — your config in `~/.dreamux/`
|
|
@@ -103,11 +92,11 @@ the `~/.codex-host` half anywhere you like.
|
|
|
103
92
|
|
|
104
93
|
```bash
|
|
105
94
|
# Bot secret comes from an env var the server process can see.
|
|
106
|
-
export BOT_SECRET_FLOW='
|
|
95
|
+
export BOT_SECRET_FLOW='<bot-secret>'
|
|
107
96
|
|
|
108
97
|
./bin/dreamux dispatcher add \
|
|
109
98
|
--id flow \
|
|
110
|
-
--bot-app-id
|
|
99
|
+
--bot-app-id <APP_ID> \
|
|
111
100
|
--bot-secret-ref env:BOT_SECRET_FLOW
|
|
112
101
|
|
|
113
102
|
# Inspect / restart
|
|
@@ -116,12 +105,10 @@ export BOT_SECRET_FLOW='cli_secret_XXX'
|
|
|
116
105
|
./bin/dreamux dispatcher start --id flow # if not auto-started
|
|
117
106
|
```
|
|
118
107
|
|
|
119
|
-
`./bin/server-ctl <args>` still works as an alias.
|
|
120
|
-
|
|
121
108
|
## MVP verification path (issue #2 §"MVP 验收脚本")
|
|
122
109
|
|
|
123
|
-
1. `dreamux dispatcher add --id flow --bot-app-id
|
|
124
|
-
2. `dreamux
|
|
110
|
+
1. `dreamux dispatcher add --id flow --bot-app-id <APP_ID> --bot-secret-ref env:BOT_SECRET_FLOW`
|
|
111
|
+
2. `dreamux serve` — dispatcher `flow` goes to `ready`
|
|
125
112
|
3. Invite the bot to a Feishu group A, send `hi`
|
|
126
113
|
4. Server delivers it into the Codex thread; reply goes back to group A
|
|
127
114
|
5. Invite the same bot to a DM, ask "do you remember the 'hi' from earlier?"
|
|
@@ -136,7 +123,7 @@ export BOT_SECRET_FLOW='cli_secret_XXX'
|
|
|
136
123
|
|
|
137
124
|
Precedence for every config-able value (highest wins): env var →
|
|
138
125
|
per-dispatcher field → `~/.dreamux/config.toml` → built-in default.
|
|
139
|
-
See [decision
|
|
126
|
+
See [the global-config decision](../../.agents/decisions/global-config-dir.md).
|
|
140
127
|
|
|
141
128
|
### Global: `~/.dreamux/config.toml`
|
|
142
129
|
|
|
@@ -159,7 +146,7 @@ retries = 3
|
|
|
159
146
|
retry_delay_ms = 1000
|
|
160
147
|
```
|
|
161
148
|
|
|
162
|
-
Edit and restart `dreamux
|
|
149
|
+
Edit and restart `dreamux serve`. Parse errors fail-fast with a
|
|
163
150
|
`file:line` pointer.
|
|
164
151
|
|
|
165
152
|
### `codex_args_json` (per-dispatcher, overrides global)
|
|
@@ -185,7 +172,7 @@ JSON object stored in `dispatchers.codex_args_json`:
|
|
|
185
172
|
| `CODEX_HOST_CODEX_BIN` | Override `codex.bin` |
|
|
186
173
|
| `DREAMUX_CONFIG_DIR` | Override `~/.dreamux` (where `config.toml` lives) |
|
|
187
174
|
| `BOT_SECRET_<NAME>` | Bot secrets referenced by `env:BOT_SECRET_<NAME>` |
|
|
188
|
-
| `DREAMUX_SKIP_LIVE_CODEX` | Opt out of the live codex 0.
|
|
175
|
+
| `DREAMUX_SKIP_LIVE_CODEX` | Opt out of the live codex 0.135 integration test (loud skip) |
|
|
189
176
|
|
|
190
177
|
## What this MVP does **not** do
|
|
191
178
|
|
|
@@ -204,17 +191,20 @@ JSON object stored in `dispatchers.codex_args_json`:
|
|
|
204
191
|
## Testing
|
|
205
192
|
|
|
206
193
|
```bash
|
|
207
|
-
|
|
194
|
+
# from the repo root (the only supported path — see the install-model decision)
|
|
195
|
+
node common/scripts/install-run-rush.js test # smoke + bin-launcher + codex-0135-live
|
|
208
196
|
```
|
|
209
197
|
|
|
210
198
|
- `tests/smoke.test.ts` — fake-codex-driven dispatcher behavior:
|
|
211
199
|
happy path, FIFO, crash recovery (running → unknown), thread/resume
|
|
212
200
|
failure, outbound retry without turn re-run, approval fail-fast.
|
|
213
|
-
- `tests/bin-launcher.test.ts` — spawns the real bash
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
- `
|
|
201
|
+
- `tests/bin-launcher.test.ts` — spawns the real `dreamux` bash launcher
|
|
202
|
+
and repo-root shim from arbitrary cwds and through symlinks; static
|
|
203
|
+
"no tsx" assertion; manifest assertion for the single global bin.
|
|
204
|
+
- `tests/doctor.test.ts` — covers standalone doctor checks for
|
|
205
|
+
dispatcher-private `CODEX_HOME` state, including managed-service auth
|
|
206
|
+
visibility.
|
|
207
|
+
- `tests/codex-0135-live.test.ts` — spawns a real `codex app-server`
|
|
218
208
|
(skipped loudly when `codex` is missing or wrong version; opt-in via
|
|
219
209
|
`DREAMUX_SKIP_LIVE_CODEX=1`).
|
|
220
210
|
|
package/bin/dreamux
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
# Launcher for the
|
|
2
|
+
# Launcher for the single public `dreamux` CLI (issue #18).
|
|
3
3
|
# Resolves its own location through symlinks so it works from any cwd and
|
|
4
4
|
# via any chain of symlinks (npm-link, ~/bin shortcuts, etc.). Runs the
|
|
5
|
-
# compiled dist output
|
|
5
|
+
# compiled dist output (built by `rush build` in a source checkout; already
|
|
6
|
+
# present in the published npm package).
|
|
6
7
|
set -eu
|
|
7
8
|
|
|
8
9
|
SOURCE="${BASH_SOURCE[0]}"
|
|
@@ -22,10 +23,11 @@ while [ -L "$SOURCE" ]; do
|
|
|
22
23
|
done
|
|
23
24
|
|
|
24
25
|
DIR="$(cd -- "$(dirname -- "$SOURCE")/.." &> /dev/null && pwd)"
|
|
26
|
+
DREAMUX_BIN="$(cd -- "$(dirname -- "$SOURCE")" &> /dev/null && pwd)/$(basename -- "$SOURCE")"
|
|
25
27
|
TARGET="$DIR/dist/cli/dreamux.js"
|
|
26
28
|
if [ ! -f "$TARGET" ]; then
|
|
27
29
|
echo "dreamux: $TARGET is missing." >&2
|
|
28
|
-
echo "
|
|
30
|
+
echo "Build it first from the repo root: node common/scripts/install-run-rush.js build (rush build)." >&2
|
|
29
31
|
exit 1
|
|
30
32
|
fi
|
|
31
|
-
exec node "$TARGET" "$@"
|
|
33
|
+
exec env DREAMUX_BIN="$DREAMUX_BIN" node "$TARGET" "$@"
|
package/dist/admin/socket.js
CHANGED
|
@@ -121,7 +121,7 @@ function acquirePidLock(lockPath, myPid, isAlive) {
|
|
|
121
121
|
return;
|
|
122
122
|
}
|
|
123
123
|
if (holder !== null && isAlive(holder)) {
|
|
124
|
-
throw new Error(`admin socket lockfile ${lockPath} is held by another live dreamux
|
|
124
|
+
throw new Error(`admin socket lockfile ${lockPath} is held by another live dreamux serve process (pid ${holder}). ` +
|
|
125
125
|
'Refusing to bind to avoid split-brain admin control. ' +
|
|
126
126
|
'Stop the other instance, or set CODEX_HOST_ADMIN_SOCKET to a different path.');
|
|
127
127
|
}
|
package/dist/admin/socket.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socket.js","sourceRoot":"","sources":["../../src/admin/socket.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"socket.js","sourceRoot":"","sources":["../../src/admin/socket.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { isBotSenderType } from '@excitedjs/feishu-transport';
|
|
2
|
+
/**
|
|
3
|
+
* Compatibility-first inbound gate for dreamux's Feishu channel.
|
|
4
|
+
*
|
|
5
|
+
* This deliberately does not enable pairing or allowlists yet. The current
|
|
6
|
+
* product behavior stays open, while the loop/ambiguity hazards that can make
|
|
7
|
+
* a channel self-amplify are blocked before messages enter the durable FIFO.
|
|
8
|
+
*/
|
|
9
|
+
export function compatibleFeishuGate(input) {
|
|
10
|
+
if (input.senderId === '') {
|
|
11
|
+
return { action: 'drop', reason: 'missing sender id' };
|
|
12
|
+
}
|
|
13
|
+
if (input.botOpenId !== undefined && input.senderId === input.botOpenId) {
|
|
14
|
+
return { action: 'drop', reason: 'message sent by this bot' };
|
|
15
|
+
}
|
|
16
|
+
if (isBotSenderType(input.senderType)) {
|
|
17
|
+
return { action: 'drop', reason: `bot sender type: ${input.senderType}` };
|
|
18
|
+
}
|
|
19
|
+
if (input.chatType === 'group' && input.botOpenId === undefined) {
|
|
20
|
+
return {
|
|
21
|
+
action: 'drop',
|
|
22
|
+
reason: 'group message received before bot open_id was resolved',
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
return { action: 'deliver' };
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=feishu-gate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feishu-gate.js","sourceRoot":"","sources":["../../src/channel/feishu-gate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAa9D;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAClC,KAAgC;IAEhC,IAAI,KAAK,CAAC,QAAQ,KAAK,EAAE,EAAE,CAAC;QAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC;IACzD,CAAC;IACD,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,SAAS,EAAE,CAAC;QACxE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,0BAA0B,EAAE,CAAC;IAChE,CAAC;IACD,IAAI,eAAe,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;QACtC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,oBAAoB,KAAK,CAAC,UAAU,EAAE,EAAE,CAAC;IAC5E,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,KAAK,OAAO,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QAChE,OAAO;YACL,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,wDAAwD;SACjE,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export function outboundTargetForInbound(row) {
|
|
2
|
+
return {
|
|
3
|
+
conversationId: row.source_chat_id,
|
|
4
|
+
...(row.source_message_id !== null
|
|
5
|
+
? { replyTo: row.source_message_id }
|
|
6
|
+
: {}),
|
|
7
|
+
...(row.sender_id !== null && row.sender_id !== ''
|
|
8
|
+
? { mentionUsers: [row.sender_id] }
|
|
9
|
+
: {}),
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=outbound.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outbound.js","sourceRoot":"","sources":["../../src/channel/outbound.ts"],"names":[],"mappings":"AAkBA,MAAM,UAAU,wBAAwB,CAAC,GAAe;IACtD,OAAO;QACL,cAAc,EAAE,GAAG,CAAC,cAAc;QAClC,GAAG,CAAC,GAAG,CAAC,iBAAiB,KAAK,IAAI;YAChC,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,iBAAiB,EAAE;YACpC,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,GAAG,CAAC,SAAS,KAAK,IAAI,IAAI,GAAG,CAAC,SAAS,KAAK,EAAE;YAChD,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;YACnC,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { DispatcherRepo } from '../db/repository.js';
|
|
4
|
+
import { openDatabase } from '../db/schema.js';
|
|
5
|
+
import { codexArgsToCli, parseCodexArgs } from '../runtime/codex-args.js';
|
|
6
|
+
import { BUILT_IN_DEFAULTS, globalConfigDir, globalConfigFile, loadConfig, } from '../runtime/config.js';
|
|
7
|
+
import { dispatcherCodexHomeDoctorContext, validateDispatcherCodexHome, } from '../runtime/dispatcher-codex-home.js';
|
|
8
|
+
import { databasePath as runtimeDatabasePath, runtimeRoot, setRuntimeConfig, } from '../runtime/paths.js';
|
|
9
|
+
import { ExecaCommandRunner } from '../onboard/commands.js';
|
|
10
|
+
import { LAUNCHD_LABEL, managedServiceEnvironment, serviceUnitPath, SYSTEMD_UNIT, } from '../onboard/service.js';
|
|
11
|
+
export async function runDreamuxDoctor(options = {}) {
|
|
12
|
+
const runner = options.runner ?? new ExecaCommandRunner();
|
|
13
|
+
const checks = [];
|
|
14
|
+
const configDir = globalConfigDir();
|
|
15
|
+
const { config, configFile } = readConfigForDoctor(configDir, checks);
|
|
16
|
+
setRuntimeConfig(config);
|
|
17
|
+
checks.push({
|
|
18
|
+
name: 'runtime directory',
|
|
19
|
+
ok: existsSync(runtimeRoot()),
|
|
20
|
+
detail: runtimeRoot(),
|
|
21
|
+
});
|
|
22
|
+
const dbPath = runtimeDatabasePath();
|
|
23
|
+
checks.push({
|
|
24
|
+
name: 'runtime database',
|
|
25
|
+
ok: existsSync(dbPath),
|
|
26
|
+
detail: dbPath,
|
|
27
|
+
});
|
|
28
|
+
checks.push({
|
|
29
|
+
name: 'codex binary',
|
|
30
|
+
ok: await runner.check(config.codex.bin, ['--help']),
|
|
31
|
+
detail: config.codex.bin,
|
|
32
|
+
});
|
|
33
|
+
const service = await getServiceStatus({
|
|
34
|
+
runner,
|
|
35
|
+
platform: options.platform,
|
|
36
|
+
homeDir: options.homeDir,
|
|
37
|
+
uid: options.uid,
|
|
38
|
+
});
|
|
39
|
+
checks.push({
|
|
40
|
+
name: 'user service',
|
|
41
|
+
ok: true,
|
|
42
|
+
detail: service.installed
|
|
43
|
+
? `installed at ${service.unitPath}`
|
|
44
|
+
: `not installed at ${service.unitPath}`,
|
|
45
|
+
});
|
|
46
|
+
const dispatchers = existsSync(dbPath)
|
|
47
|
+
? readDispatchers(config, options.env ?? process.env, service)
|
|
48
|
+
: [];
|
|
49
|
+
if (dispatchers.length === 0) {
|
|
50
|
+
checks.push({
|
|
51
|
+
name: 'dispatchers',
|
|
52
|
+
ok: false,
|
|
53
|
+
detail: 'no dispatchers are configured',
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
const ok = checks.every((check) => check.ok) &&
|
|
57
|
+
dispatchers.every((dispatcher) => dispatcher.foreground.ok &&
|
|
58
|
+
(dispatcher.managedService === null || dispatcher.managedService.ok));
|
|
59
|
+
return {
|
|
60
|
+
ok,
|
|
61
|
+
configFile,
|
|
62
|
+
runtimeDir: runtimeRoot(),
|
|
63
|
+
databasePath: dbPath,
|
|
64
|
+
service,
|
|
65
|
+
checks,
|
|
66
|
+
dispatchers,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
export function printDoctorResult(result) {
|
|
70
|
+
console.log(`dreamux doctor: ${result.ok ? 'ok' : 'failed'}`);
|
|
71
|
+
console.log(`config: ${result.configFile}`);
|
|
72
|
+
console.log(`runtime: ${result.runtimeDir}`);
|
|
73
|
+
console.log(`database: ${result.databasePath}`);
|
|
74
|
+
for (const check of result.checks) {
|
|
75
|
+
console.log(`${check.ok ? 'ok' : 'fail'}\t${check.name}\t${check.detail}`);
|
|
76
|
+
}
|
|
77
|
+
for (const dispatcher of result.dispatchers) {
|
|
78
|
+
printDispatcherDoctor(dispatcher);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function readConfigForDoctor(configDir, checks) {
|
|
82
|
+
try {
|
|
83
|
+
const loaded = loadConfig({ configDir });
|
|
84
|
+
checks.push({
|
|
85
|
+
name: 'config',
|
|
86
|
+
ok: true,
|
|
87
|
+
detail: loaded.configFile,
|
|
88
|
+
});
|
|
89
|
+
return loaded;
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
const detail = err instanceof Error ? err.message : String(err);
|
|
93
|
+
checks.push({
|
|
94
|
+
name: 'config',
|
|
95
|
+
ok: false,
|
|
96
|
+
detail,
|
|
97
|
+
});
|
|
98
|
+
return {
|
|
99
|
+
config: BUILT_IN_DEFAULTS,
|
|
100
|
+
configFile: globalConfigFile({ configDir }),
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
function readDispatchers(config, env, service) {
|
|
105
|
+
const db = openDatabase({ path: runtimeDatabasePath() });
|
|
106
|
+
try {
|
|
107
|
+
const repo = new DispatcherRepo(db);
|
|
108
|
+
return repo.list().map((row) => {
|
|
109
|
+
const codexArgs = parseCodexArgs(row.codex_args_json, {
|
|
110
|
+
approvalPolicy: config.codex.approval_policy,
|
|
111
|
+
sandboxMode: config.codex.sandbox_mode,
|
|
112
|
+
extraArgs: config.codex.extra_args,
|
|
113
|
+
});
|
|
114
|
+
const codexCliArgs = codexArgsToCli(codexArgs);
|
|
115
|
+
const context = dispatcherCodexHomeDoctorContext(row.dispatcher_id, {
|
|
116
|
+
codexCliArgs,
|
|
117
|
+
});
|
|
118
|
+
const foreground = validateDispatcherCodexHome(context, {
|
|
119
|
+
env,
|
|
120
|
+
codexCliArgs,
|
|
121
|
+
});
|
|
122
|
+
const managedService = service.installed
|
|
123
|
+
? validateDispatcherCodexHome(context, {
|
|
124
|
+
env: managedServiceEnvironment({
|
|
125
|
+
configDir: globalConfigDir(),
|
|
126
|
+
runtimeDir: runtimeRoot(),
|
|
127
|
+
codexBin: process.env['CODEX_HOST_CODEX_BIN'] || config.codex.bin,
|
|
128
|
+
dreamuxBin: process.env['DREAMUX_BIN'] ?? process.argv[1],
|
|
129
|
+
startService: false,
|
|
130
|
+
dryRun: false,
|
|
131
|
+
}),
|
|
132
|
+
codexCliArgs,
|
|
133
|
+
})
|
|
134
|
+
: null;
|
|
135
|
+
return {
|
|
136
|
+
id: row.dispatcher_id,
|
|
137
|
+
foreground,
|
|
138
|
+
managedService,
|
|
139
|
+
};
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
finally {
|
|
143
|
+
db.close();
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
async function getServiceStatus(options) {
|
|
147
|
+
const runner = options.runner ?? new ExecaCommandRunner();
|
|
148
|
+
const unit = serviceUnitPath(options.platform, options.homeDir ?? homedir());
|
|
149
|
+
if (unit.platform === 'launchd') {
|
|
150
|
+
return launchdStatus(unit.path, runner, options.uid);
|
|
151
|
+
}
|
|
152
|
+
return systemdStatus(unit.path, runner);
|
|
153
|
+
}
|
|
154
|
+
async function launchdStatus(unitPath, runner, uid) {
|
|
155
|
+
const target = launchdTarget(uid);
|
|
156
|
+
let raw = '';
|
|
157
|
+
let loaded = false;
|
|
158
|
+
try {
|
|
159
|
+
raw = await runner.capture('launchctl', ['print', target]);
|
|
160
|
+
loaded = true;
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
loaded = false;
|
|
164
|
+
}
|
|
165
|
+
const pid = parseLaunchdPid(raw);
|
|
166
|
+
return {
|
|
167
|
+
platform: 'launchd',
|
|
168
|
+
unitPath,
|
|
169
|
+
installed: existsSync(unitPath),
|
|
170
|
+
enabled: existsSync(unitPath),
|
|
171
|
+
loaded,
|
|
172
|
+
running: pid !== null || /\bstate = running\b/.test(raw),
|
|
173
|
+
pid,
|
|
174
|
+
detail: parseLaunchdDetail(raw),
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
async function systemdStatus(unitPath, runner) {
|
|
178
|
+
const enabled = await runner.check('systemctl', [
|
|
179
|
+
'--user',
|
|
180
|
+
'is-enabled',
|
|
181
|
+
SYSTEMD_UNIT,
|
|
182
|
+
]);
|
|
183
|
+
const active = await runner.check('systemctl', [
|
|
184
|
+
'--user',
|
|
185
|
+
'is-active',
|
|
186
|
+
SYSTEMD_UNIT,
|
|
187
|
+
]);
|
|
188
|
+
let raw = '';
|
|
189
|
+
try {
|
|
190
|
+
raw = await runner.capture('systemctl', [
|
|
191
|
+
'--user',
|
|
192
|
+
'show',
|
|
193
|
+
SYSTEMD_UNIT,
|
|
194
|
+
'--property=LoadState,ActiveState,SubState,MainPID,Result',
|
|
195
|
+
]);
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
raw = '';
|
|
199
|
+
}
|
|
200
|
+
const props = parseSystemdProperties(raw);
|
|
201
|
+
return {
|
|
202
|
+
platform: 'systemd',
|
|
203
|
+
unitPath,
|
|
204
|
+
installed: existsSync(unitPath),
|
|
205
|
+
enabled,
|
|
206
|
+
loaded: props['LoadState'] === 'loaded',
|
|
207
|
+
running: active || props['ActiveState'] === 'active',
|
|
208
|
+
pid: parsePositiveInt(props['MainPID']),
|
|
209
|
+
detail: systemdDetail(props),
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
function launchdTarget(uid) {
|
|
213
|
+
const actualUid = uid ?? process.getuid?.();
|
|
214
|
+
if (actualUid === undefined) {
|
|
215
|
+
throw new Error('launchd user service diagnostics require a numeric uid');
|
|
216
|
+
}
|
|
217
|
+
return `gui/${actualUid}/${LAUNCHD_LABEL}`;
|
|
218
|
+
}
|
|
219
|
+
function parseLaunchdPid(raw) {
|
|
220
|
+
const match = raw.match(/\bpid = (\d+)/);
|
|
221
|
+
if (match === null)
|
|
222
|
+
return null;
|
|
223
|
+
return parsePositiveInt(match[1]);
|
|
224
|
+
}
|
|
225
|
+
function parseLaunchdDetail(raw) {
|
|
226
|
+
const state = raw.match(/\bstate = ([^\n]+)/)?.[1]?.trim();
|
|
227
|
+
const reason = raw.match(/\breason = ([^\n]+)/)?.[1]?.trim();
|
|
228
|
+
return [state, reason]
|
|
229
|
+
.filter((value) => value !== undefined && value !== '')
|
|
230
|
+
.join(', ') || null;
|
|
231
|
+
}
|
|
232
|
+
function parseSystemdProperties(raw) {
|
|
233
|
+
const result = {};
|
|
234
|
+
for (const line of raw.split(/\r?\n/)) {
|
|
235
|
+
const eq = line.indexOf('=');
|
|
236
|
+
if (eq <= 0)
|
|
237
|
+
continue;
|
|
238
|
+
result[line.slice(0, eq)] = line.slice(eq + 1);
|
|
239
|
+
}
|
|
240
|
+
return result;
|
|
241
|
+
}
|
|
242
|
+
function systemdDetail(props) {
|
|
243
|
+
const parts = [
|
|
244
|
+
props['LoadState'],
|
|
245
|
+
props['ActiveState'],
|
|
246
|
+
props['SubState'],
|
|
247
|
+
props['Result'] !== undefined && props['Result'] !== 'success'
|
|
248
|
+
? `result=${props['Result']}`
|
|
249
|
+
: undefined,
|
|
250
|
+
].filter((part) => part !== undefined && part !== '');
|
|
251
|
+
return parts.join(', ') || null;
|
|
252
|
+
}
|
|
253
|
+
function parsePositiveInt(value) {
|
|
254
|
+
if (value === undefined)
|
|
255
|
+
return null;
|
|
256
|
+
const parsed = Number(value);
|
|
257
|
+
if (!Number.isInteger(parsed) || parsed <= 0)
|
|
258
|
+
return null;
|
|
259
|
+
return parsed;
|
|
260
|
+
}
|
|
261
|
+
function printDispatcherDoctor(dispatcher) {
|
|
262
|
+
printCodexHomeDoctor(`dispatcher ${dispatcher.id} foreground`, dispatcher.foreground);
|
|
263
|
+
if (dispatcher.managedService !== null) {
|
|
264
|
+
printCodexHomeDoctor(`dispatcher ${dispatcher.id} managed-service`, dispatcher.managedService);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
function printCodexHomeDoctor(name, result) {
|
|
268
|
+
console.log(`${result.ok ? 'ok' : 'fail'}\t${name}\t${result.context.codexHome}`);
|
|
269
|
+
for (const error of result.errors) {
|
|
270
|
+
console.log(`fail\t${name}\t${error}`);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"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"}
|