@excitedjs/dreamux 0.1.2 → 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 +25 -29
- package/bin/dreamux +3 -2
- package/dist/admin/socket.js +1 -1
- package/dist/admin/socket.js.map +1 -1
- 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 +8 -1
- package/dist/dispatcher/runtime.js.map +1 -1
- package/dist/feishu/bot.js +3 -3
- 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/onboard/types.js.map +1 -0
- package/dist/onboard/wizard.js +146 -0
- package/dist/onboard/wizard.js.map +1 -0
- package/dist/runtime/config.js +14 -2
- 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 +1 -0
- package/dist/server.js.map +1 -1
- package/package.json +17 -15
- package/bin/server +0 -35
- package/bin/server-ctl +0 -28
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
|
-
[the CLI naming decision](../../.agents/decisions/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.
|
|
@@ -67,14 +66,10 @@ output; **no `tsx` is needed at runtime** (PR #6).
|
|
|
67
66
|
## Run the server
|
|
68
67
|
|
|
69
68
|
```bash
|
|
70
|
-
|
|
71
|
-
./bin/dreamux server start
|
|
72
|
-
|
|
73
|
-
# Backward-compat alias
|
|
74
|
-
./bin/server
|
|
69
|
+
./bin/dreamux serve
|
|
75
70
|
```
|
|
76
71
|
|
|
77
|
-
|
|
72
|
+
The launcher works from any cwd and via symlinks (PR #6 + bin-launcher tests).
|
|
78
73
|
|
|
79
74
|
The server uses two separate home directories — by design (see
|
|
80
75
|
[the global-config decision](../../.agents/decisions/global-config-dir.md)):
|
|
@@ -85,7 +80,8 @@ The server uses two separate home directories — by design (see
|
|
|
85
80
|
| `~/.codex-host/state.db` | SQLite (dispatchers + inbound buffer) | the server |
|
|
86
81
|
| `~/.codex-host/admin.sock` | Admin Unix socket (`0600`) | the server |
|
|
87
82
|
| `~/.codex-host/dispatchers/<id>/cwd/` | Codex app-server cwd | the server |
|
|
88
|
-
| `~/.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 |
|
|
89
85
|
| `~/.codex-host/dispatchers/<id>/*.log` | Codex stdout / stderr | the server |
|
|
90
86
|
|
|
91
87
|
`rm -rf ~/.codex-host` is a safe recovery — your config in `~/.dreamux/`
|
|
@@ -96,11 +92,11 @@ the `~/.codex-host` half anywhere you like.
|
|
|
96
92
|
|
|
97
93
|
```bash
|
|
98
94
|
# Bot secret comes from an env var the server process can see.
|
|
99
|
-
export BOT_SECRET_FLOW='
|
|
95
|
+
export BOT_SECRET_FLOW='<bot-secret>'
|
|
100
96
|
|
|
101
97
|
./bin/dreamux dispatcher add \
|
|
102
98
|
--id flow \
|
|
103
|
-
--bot-app-id
|
|
99
|
+
--bot-app-id <APP_ID> \
|
|
104
100
|
--bot-secret-ref env:BOT_SECRET_FLOW
|
|
105
101
|
|
|
106
102
|
# Inspect / restart
|
|
@@ -109,12 +105,10 @@ export BOT_SECRET_FLOW='cli_secret_XXX'
|
|
|
109
105
|
./bin/dreamux dispatcher start --id flow # if not auto-started
|
|
110
106
|
```
|
|
111
107
|
|
|
112
|
-
`./bin/server-ctl <args>` still works as an alias.
|
|
113
|
-
|
|
114
108
|
## MVP verification path (issue #2 §"MVP 验收脚本")
|
|
115
109
|
|
|
116
|
-
1. `dreamux dispatcher add --id flow --bot-app-id
|
|
117
|
-
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`
|
|
118
112
|
3. Invite the bot to a Feishu group A, send `hi`
|
|
119
113
|
4. Server delivers it into the Codex thread; reply goes back to group A
|
|
120
114
|
5. Invite the same bot to a DM, ask "do you remember the 'hi' from earlier?"
|
|
@@ -152,7 +146,7 @@ retries = 3
|
|
|
152
146
|
retry_delay_ms = 1000
|
|
153
147
|
```
|
|
154
148
|
|
|
155
|
-
Edit and restart `dreamux
|
|
149
|
+
Edit and restart `dreamux serve`. Parse errors fail-fast with a
|
|
156
150
|
`file:line` pointer.
|
|
157
151
|
|
|
158
152
|
### `codex_args_json` (per-dispatcher, overrides global)
|
|
@@ -178,7 +172,7 @@ JSON object stored in `dispatchers.codex_args_json`:
|
|
|
178
172
|
| `CODEX_HOST_CODEX_BIN` | Override `codex.bin` |
|
|
179
173
|
| `DREAMUX_CONFIG_DIR` | Override `~/.dreamux` (where `config.toml` lives) |
|
|
180
174
|
| `BOT_SECRET_<NAME>` | Bot secrets referenced by `env:BOT_SECRET_<NAME>` |
|
|
181
|
-
| `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) |
|
|
182
176
|
|
|
183
177
|
## What this MVP does **not** do
|
|
184
178
|
|
|
@@ -198,17 +192,19 @@ JSON object stored in `dispatchers.codex_args_json`:
|
|
|
198
192
|
|
|
199
193
|
```bash
|
|
200
194
|
# from the repo root (the only supported path — see the install-model decision)
|
|
201
|
-
node common/scripts/install-run-rush.js test # smoke + bin-launcher + codex-
|
|
195
|
+
node common/scripts/install-run-rush.js test # smoke + bin-launcher + codex-0135-live
|
|
202
196
|
```
|
|
203
197
|
|
|
204
198
|
- `tests/smoke.test.ts` — fake-codex-driven dispatcher behavior:
|
|
205
199
|
happy path, FIFO, crash recovery (running → unknown), thread/resume
|
|
206
200
|
failure, outbound retry without turn re-run, approval fail-fast.
|
|
207
|
-
- `tests/bin-launcher.test.ts` — spawns the real bash
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
- `
|
|
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`
|
|
212
208
|
(skipped loudly when `codex` is missing or wrong version; opt-in via
|
|
213
209
|
`DREAMUX_SKIP_LIVE_CODEX=1`).
|
|
214
210
|
|
package/bin/dreamux
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
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
5
|
# compiled dist output (built by `rush build` in a source checkout; already
|
|
@@ -23,10 +23,11 @@ while [ -L "$SOURCE" ]; do
|
|
|
23
23
|
done
|
|
24
24
|
|
|
25
25
|
DIR="$(cd -- "$(dirname -- "$SOURCE")/.." &> /dev/null && pwd)"
|
|
26
|
+
DREAMUX_BIN="$(cd -- "$(dirname -- "$SOURCE")" &> /dev/null && pwd)/$(basename -- "$SOURCE")"
|
|
26
27
|
TARGET="$DIR/dist/cli/dreamux.js"
|
|
27
28
|
if [ ! -f "$TARGET" ]; then
|
|
28
29
|
echo "dreamux: $TARGET is missing." >&2
|
|
29
30
|
echo "Build it first from the repo root: node common/scripts/install-run-rush.js build (rush build)." >&2
|
|
30
31
|
exit 1
|
|
31
32
|
fi
|
|
32
|
-
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,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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"}
|