@excitedjs/dreamux 0.8.0 → 0.9.1
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/dist/admin/socket.js +18 -20
- package/dist/admin/socket.js.map +1 -1
- package/dist/channel/chat-bots-store.js +26 -28
- package/dist/channel/chat-bots-store.js.map +1 -1
- package/dist/channel/feishu-gate.js +16 -9
- package/dist/channel/feishu-gate.js.map +1 -1
- package/dist/cli/doctor.js +56 -17
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/dreamux.js +112 -5
- package/dist/cli/dreamux.js.map +1 -1
- package/dist/cli/server.js +7 -7
- package/dist/cli/server.js.map +1 -1
- package/dist/codex/supervisor.js +31 -32
- package/dist/codex/supervisor.js.map +1 -1
- package/dist/daemon/install.js +80 -0
- package/dist/daemon/install.js.map +1 -0
- package/dist/daemon/restart-intent.js +166 -0
- package/dist/daemon/restart-intent.js.map +1 -0
- package/dist/daemon/service-control.js +56 -0
- package/dist/daemon/service-control.js.map +1 -0
- package/dist/dispatcher/runtime.js +53 -17
- package/dist/dispatcher/runtime.js.map +1 -1
- package/dist/dispatcher/turn-manager.js +42 -0
- package/dist/dispatcher/turn-manager.js.map +1 -1
- package/dist/onboard/dispatcher-skill.js +13 -8
- package/dist/onboard/dispatcher-skill.js.map +1 -1
- package/dist/onboard/ledger.js +33 -23
- package/dist/onboard/ledger.js.map +1 -1
- package/dist/onboard/run.js +29 -19
- package/dist/onboard/run.js.map +1 -1
- package/dist/onboard/service.js +101 -16
- package/dist/onboard/service.js.map +1 -1
- package/dist/onboard/uninstall.js +43 -55
- package/dist/onboard/uninstall.js.map +1 -1
- package/dist/runtime/config.js +32 -22
- package/dist/runtime/config.js.map +1 -1
- package/dist/runtime/dispatcher-codex-home.js +22 -12
- package/dist/runtime/dispatcher-codex-home.js.map +1 -1
- package/dist/runtime/dispatcher-store.js +48 -21
- package/dist/runtime/dispatcher-store.js.map +1 -1
- package/dist/runtime/logger.js +36 -11
- package/dist/runtime/logger.js.map +1 -1
- package/dist/runtime/paths.js +9 -0
- package/dist/runtime/paths.js.map +1 -1
- package/dist/server.js +47 -14
- package/dist/server.js.map +1 -1
- package/package.json +6 -3
package/dist/admin/socket.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* other local users out (issue #2 §"管理接口").
|
|
7
7
|
*/
|
|
8
8
|
import { createServer } from 'node:net';
|
|
9
|
-
import {
|
|
9
|
+
import { chmod, readFile, rm, writeFile } from 'node:fs/promises';
|
|
10
10
|
import { AdminError, } from './protocol.js';
|
|
11
11
|
import { adminMethods } from './methods.js';
|
|
12
12
|
/**
|
|
@@ -15,7 +15,7 @@ import { adminMethods } from './methods.js';
|
|
|
15
15
|
*/
|
|
16
16
|
const RECLAIM_ATTEMPTS = 3;
|
|
17
17
|
export function createAdminSocketServer(server, socketPath, options = {}) {
|
|
18
|
-
const
|
|
18
|
+
const chmodFn = options.chmodFn ?? chmod;
|
|
19
19
|
const isAlive = options.isPidAlive ?? defaultIsPidAlive;
|
|
20
20
|
const myPid = options.selfPid ?? process.pid;
|
|
21
21
|
const lockPath = `${socketPath}.lock`;
|
|
@@ -33,13 +33,11 @@ export function createAdminSocketServer(server, socketPath, options = {}) {
|
|
|
33
33
|
// hold it, nobody else can be inside this start() concurrently.
|
|
34
34
|
// Stale pidfiles (dead holder) are reclaimed up to RECLAIM_ATTEMPTS
|
|
35
35
|
// times; a live holder always loses the race.
|
|
36
|
-
acquirePidLock(lockPath, myPid, isAlive);
|
|
36
|
+
await acquirePidLock(lockPath, myPid, isAlive);
|
|
37
37
|
holdLock = true;
|
|
38
38
|
try {
|
|
39
39
|
// Lock is held — stale socket cleanup is now race-free.
|
|
40
|
-
|
|
41
|
-
rmSync(socketPath, { force: true });
|
|
42
|
-
}
|
|
40
|
+
await rm(socketPath, { force: true });
|
|
43
41
|
netServer = createServer((sock) => handleConnection(server, sock));
|
|
44
42
|
await new Promise((res, rej) => {
|
|
45
43
|
netServer.once('error', rej);
|
|
@@ -48,7 +46,7 @@ export function createAdminSocketServer(server, socketPath, options = {}) {
|
|
|
48
46
|
// PR #3 review #2: chmod is a hard requirement, not best-effort —
|
|
49
47
|
// a 0666 admin socket exposes server-ctl methods to every local user.
|
|
50
48
|
try {
|
|
51
|
-
|
|
49
|
+
await chmodFn(socketPath, 0o600);
|
|
52
50
|
}
|
|
53
51
|
catch (e) {
|
|
54
52
|
const chmodErr = e instanceof Error ? e.message : String(e);
|
|
@@ -65,12 +63,12 @@ export function createAdminSocketServer(server, socketPath, options = {}) {
|
|
|
65
63
|
await new Promise((res) => closing.close(() => res()));
|
|
66
64
|
}
|
|
67
65
|
try {
|
|
68
|
-
|
|
66
|
+
await rm(socketPath, { force: true });
|
|
69
67
|
}
|
|
70
68
|
catch {
|
|
71
69
|
/* best-effort */
|
|
72
70
|
}
|
|
73
|
-
releasePidLock(lockPath, myPid);
|
|
71
|
+
await releasePidLock(lockPath, myPid);
|
|
74
72
|
holdLock = false;
|
|
75
73
|
throw err;
|
|
76
74
|
}
|
|
@@ -80,14 +78,14 @@ export function createAdminSocketServer(server, socketPath, options = {}) {
|
|
|
80
78
|
await new Promise((res) => netServer.close(() => res()));
|
|
81
79
|
netServer = null;
|
|
82
80
|
try {
|
|
83
|
-
|
|
81
|
+
await rm(socketPath, { force: true });
|
|
84
82
|
}
|
|
85
83
|
catch {
|
|
86
84
|
/* */
|
|
87
85
|
}
|
|
88
86
|
}
|
|
89
87
|
if (holdLock) {
|
|
90
|
-
releasePidLock(lockPath, myPid);
|
|
88
|
+
await releasePidLock(lockPath, myPid);
|
|
91
89
|
holdLock = false;
|
|
92
90
|
}
|
|
93
91
|
},
|
|
@@ -105,17 +103,17 @@ export function createAdminSocketServer(server, socketPath, options = {}) {
|
|
|
105
103
|
* RECLAIM_ATTEMPTS bounds the retry so a pathologically broken filesystem
|
|
106
104
|
* doesn't spin forever.
|
|
107
105
|
*/
|
|
108
|
-
function acquirePidLock(lockPath, myPid, isAlive) {
|
|
106
|
+
async function acquirePidLock(lockPath, myPid, isAlive) {
|
|
109
107
|
for (let attempt = 0; attempt < RECLAIM_ATTEMPTS; attempt++) {
|
|
110
108
|
try {
|
|
111
|
-
|
|
109
|
+
await writeFile(lockPath, `${myPid}\n`, { flag: 'wx', mode: 0o600 });
|
|
112
110
|
return;
|
|
113
111
|
}
|
|
114
112
|
catch (err) {
|
|
115
113
|
if (err.code !== 'EEXIST')
|
|
116
114
|
throw err;
|
|
117
115
|
}
|
|
118
|
-
const holder = readPidFile(lockPath);
|
|
116
|
+
const holder = await readPidFile(lockPath);
|
|
119
117
|
if (holder === myPid) {
|
|
120
118
|
// Re-entrant — shouldn't happen in normal use, but treat as held.
|
|
121
119
|
return;
|
|
@@ -130,7 +128,7 @@ function acquirePidLock(lockPath, myPid, isAlive) {
|
|
|
130
128
|
// same stale file simply wins this round of `wx`, and we'll see *their*
|
|
131
129
|
// live PID on the next iteration and bail out.
|
|
132
130
|
try {
|
|
133
|
-
|
|
131
|
+
await rm(lockPath, { force: true });
|
|
134
132
|
}
|
|
135
133
|
catch {
|
|
136
134
|
/* concurrent reclaim — retry the wx open */
|
|
@@ -144,20 +142,20 @@ function acquirePidLock(lockPath, myPid, isAlive) {
|
|
|
144
142
|
* file was already reclaimed by a competitor (e.g. we were paused long
|
|
145
143
|
* enough for our PID to look dead) must not delete the new holder's lock.
|
|
146
144
|
*/
|
|
147
|
-
function releasePidLock(lockPath, myPid) {
|
|
148
|
-
if (readPidFile(lockPath) !== myPid)
|
|
145
|
+
async function releasePidLock(lockPath, myPid) {
|
|
146
|
+
if ((await readPidFile(lockPath)) !== myPid)
|
|
149
147
|
return;
|
|
150
148
|
try {
|
|
151
|
-
|
|
149
|
+
await rm(lockPath, { force: true });
|
|
152
150
|
}
|
|
153
151
|
catch {
|
|
154
152
|
/* best-effort */
|
|
155
153
|
}
|
|
156
154
|
}
|
|
157
|
-
function readPidFile(path) {
|
|
155
|
+
async function readPidFile(path) {
|
|
158
156
|
let txt;
|
|
159
157
|
try {
|
|
160
|
-
txt =
|
|
158
|
+
txt = (await readFile(path, 'utf8')).trim();
|
|
161
159
|
}
|
|
162
160
|
catch {
|
|
163
161
|
return null;
|
package/dist/admin/socket.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socket.js","sourceRoot":"","sources":["../../src/admin/socket.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAyC,MAAM,UAAU,CAAC;AAC/E,OAAO,
|
|
1
|
+
{"version":3,"file":"socket.js","sourceRoot":"","sources":["../../src/admin/socket.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
* One JSON file per dispatcher, keyed by chat_id, so no chat_id ever has to be
|
|
19
19
|
* sanitized into a path segment. Owner-only (0600); writes are atomic.
|
|
20
20
|
*/
|
|
21
|
-
import {
|
|
21
|
+
import { chmod, mkdir, readFile, rename, writeFile } from 'node:fs/promises';
|
|
22
22
|
import { dirname } from 'node:path';
|
|
23
23
|
import { dispatcherChatBotsPath } from '../runtime/paths.js';
|
|
24
24
|
/** Retain at most this many recent bot-added event ids per chat for dedupe. */
|
|
@@ -55,25 +55,23 @@ function peerBotsFrom(entry, openIds) {
|
|
|
55
55
|
* file is not security-critical — it only affects peer-bot discovery — so a
|
|
56
56
|
* load failure degrades to an empty store rather than throwing.
|
|
57
57
|
*/
|
|
58
|
-
export function loadChatBots(dispatcherId) {
|
|
58
|
+
export async function loadChatBots(dispatcherId) {
|
|
59
59
|
const path = dispatcherChatBotsPath(dispatcherId);
|
|
60
|
-
if (!existsSync(path))
|
|
61
|
-
return defaultChatBotsState();
|
|
62
60
|
try {
|
|
63
|
-
const parsed = JSON.parse(
|
|
61
|
+
const parsed = JSON.parse(await readFile(path, 'utf8'));
|
|
64
62
|
return normalizeChatBots(parsed);
|
|
65
63
|
}
|
|
66
64
|
catch {
|
|
67
65
|
return defaultChatBotsState();
|
|
68
66
|
}
|
|
69
67
|
}
|
|
70
|
-
export function saveChatBots(dispatcherId, state) {
|
|
68
|
+
export async function saveChatBots(dispatcherId, state) {
|
|
71
69
|
const path = dispatcherChatBotsPath(dispatcherId);
|
|
72
|
-
|
|
70
|
+
await mkdir(dirname(path), { recursive: true });
|
|
73
71
|
const tmp = `${path}.tmp-${process.pid}-${tmpCounter++}`;
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
72
|
+
await writeFile(tmp, `${JSON.stringify(state, null, 2)}\n`, { mode: 0o600 });
|
|
73
|
+
await chmod(tmp, 0o600);
|
|
74
|
+
await rename(tmp, path);
|
|
77
75
|
}
|
|
78
76
|
function entryFor(state, chatId) {
|
|
79
77
|
const existing = state.chats[chatId];
|
|
@@ -84,10 +82,10 @@ function entryFor(state, chatId) {
|
|
|
84
82
|
return created;
|
|
85
83
|
}
|
|
86
84
|
/** Record a passively observed peer bot as *known* (awareness only). */
|
|
87
|
-
export function observeKnownBot(dispatcherId, chatId, bot) {
|
|
85
|
+
export async function observeKnownBot(dispatcherId, chatId, bot) {
|
|
88
86
|
if (bot.openId === '')
|
|
89
87
|
return;
|
|
90
|
-
const state = loadChatBots(dispatcherId);
|
|
88
|
+
const state = await loadChatBots(dispatcherId);
|
|
91
89
|
const entry = entryFor(state, chatId);
|
|
92
90
|
let changed = recordName(entry, bot);
|
|
93
91
|
if (!entry.known.includes(bot.openId)) {
|
|
@@ -95,14 +93,14 @@ export function observeKnownBot(dispatcherId, chatId, bot) {
|
|
|
95
93
|
changed = true;
|
|
96
94
|
}
|
|
97
95
|
if (changed)
|
|
98
|
-
saveChatBots(dispatcherId, state);
|
|
96
|
+
await saveChatBots(dispatcherId, state);
|
|
99
97
|
}
|
|
100
98
|
/**
|
|
101
99
|
* Record peer bots introduced by an allowlisted `/introduce` as *trusted*.
|
|
102
100
|
* Trusted bots are also known. Returns the open_ids newly added to trust.
|
|
103
101
|
*/
|
|
104
|
-
export function trustIntroducedBots(dispatcherId, chatId, bots) {
|
|
105
|
-
const state = loadChatBots(dispatcherId);
|
|
102
|
+
export async function trustIntroducedBots(dispatcherId, chatId, bots) {
|
|
103
|
+
const state = await loadChatBots(dispatcherId);
|
|
106
104
|
const entry = entryFor(state, chatId);
|
|
107
105
|
const added = [];
|
|
108
106
|
let changed = false;
|
|
@@ -127,7 +125,7 @@ export function trustIntroducedBots(dispatcherId, chatId, bots) {
|
|
|
127
125
|
if (added.length > 0)
|
|
128
126
|
markBaseline(entry);
|
|
129
127
|
if (changed)
|
|
130
|
-
saveChatBots(dispatcherId, state);
|
|
128
|
+
await saveChatBots(dispatcherId, state);
|
|
131
129
|
return added;
|
|
132
130
|
}
|
|
133
131
|
/**
|
|
@@ -136,8 +134,8 @@ export function trustIntroducedBots(dispatcherId, chatId, bots) {
|
|
|
136
134
|
* enqueue, injects the trusted bots when `needsBaseline`, and clears via
|
|
137
135
|
* `clearBaselineIfCurrent` only after a successful submission.
|
|
138
136
|
*/
|
|
139
|
-
export function pendingBaseline(dispatcherId, chatId) {
|
|
140
|
-
const entry = loadChatBots(dispatcherId).chats[chatId];
|
|
137
|
+
export async function pendingBaseline(dispatcherId, chatId) {
|
|
138
|
+
const entry = (await loadChatBots(dispatcherId)).chats[chatId];
|
|
141
139
|
if (entry === undefined) {
|
|
142
140
|
return { needsBaseline: false, generation: 0, trusted: [] };
|
|
143
141
|
}
|
|
@@ -153,19 +151,19 @@ export function pendingBaseline(dispatcherId, chatId) {
|
|
|
153
151
|
* that arrived mid-enqueue bumps the generation, so this no-ops rather than
|
|
154
152
|
* dropping the newer pending context (issue #69).
|
|
155
153
|
*/
|
|
156
|
-
export function clearBaselineIfCurrent(dispatcherId, chatId, generation) {
|
|
157
|
-
const state = loadChatBots(dispatcherId);
|
|
154
|
+
export async function clearBaselineIfCurrent(dispatcherId, chatId, generation) {
|
|
155
|
+
const state = await loadChatBots(dispatcherId);
|
|
158
156
|
const entry = state.chats[chatId];
|
|
159
157
|
if (entry === undefined || !entry.needsBaseline)
|
|
160
158
|
return;
|
|
161
159
|
if (entry.baselineGeneration !== generation)
|
|
162
160
|
return;
|
|
163
161
|
entry.needsBaseline = false;
|
|
164
|
-
saveChatBots(dispatcherId, state);
|
|
162
|
+
await saveChatBots(dispatcherId, state);
|
|
165
163
|
}
|
|
166
164
|
/** Known and trusted peer bots for one chat (the `list_chat_bots` tool). */
|
|
167
|
-
export function listChatBots(dispatcherId, chatId) {
|
|
168
|
-
const entry = loadChatBots(dispatcherId).chats[chatId];
|
|
165
|
+
export async function listChatBots(dispatcherId, chatId) {
|
|
166
|
+
const entry = (await loadChatBots(dispatcherId)).chats[chatId];
|
|
169
167
|
if (entry === undefined)
|
|
170
168
|
return { known: [], trusted: [] };
|
|
171
169
|
return {
|
|
@@ -174,16 +172,16 @@ export function listChatBots(dispatcherId, chatId) {
|
|
|
174
172
|
};
|
|
175
173
|
}
|
|
176
174
|
/** The trust set the gate consults for one chat. */
|
|
177
|
-
export function trustedBotIds(dispatcherId, chatId) {
|
|
178
|
-
return new Set(loadChatBots(dispatcherId).chats[chatId]?.trusted ?? []);
|
|
175
|
+
export async function trustedBotIds(dispatcherId, chatId) {
|
|
176
|
+
return new Set((await loadChatBots(dispatcherId)).chats[chatId]?.trusted ?? []);
|
|
179
177
|
}
|
|
180
178
|
/**
|
|
181
179
|
* Record an `im.chat.member.bot.added_v1` event: mark the chat as needing a
|
|
182
180
|
* baseline injection. Idempotent by event id — a redelivered event is a no-op.
|
|
183
181
|
* Returns true when the event was newly recorded.
|
|
184
182
|
*/
|
|
185
|
-
export function recordBotAdded(dispatcherId, chatId, eventId) {
|
|
186
|
-
const state = loadChatBots(dispatcherId);
|
|
183
|
+
export async function recordBotAdded(dispatcherId, chatId, eventId) {
|
|
184
|
+
const state = await loadChatBots(dispatcherId);
|
|
187
185
|
const entry = entryFor(state, chatId);
|
|
188
186
|
if (eventId !== '' && entry.seenEventIds.includes(eventId))
|
|
189
187
|
return false;
|
|
@@ -193,7 +191,7 @@ export function recordBotAdded(dispatcherId, chatId, eventId) {
|
|
|
193
191
|
entry.seenEventIds.shift();
|
|
194
192
|
}
|
|
195
193
|
markBaseline(entry);
|
|
196
|
-
saveChatBots(dispatcherId, state);
|
|
194
|
+
await saveChatBots(dispatcherId, state);
|
|
197
195
|
return true;
|
|
198
196
|
}
|
|
199
197
|
function recordName(entry, bot) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-bots-store.js","sourceRoot":"","sources":["../../src/channel/chat-bots-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"chat-bots-store.js","sourceRoot":"","sources":["../../src/channel/chat-bots-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { isBotMentioned, isBotSenderType, } from '@excitedjs/feishu-transport';
|
|
2
|
-
import {
|
|
2
|
+
import { chmod, mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
3
3
|
import { dirname } from 'node:path';
|
|
4
4
|
import { dispatcherAccessPath } from '../runtime/paths.js';
|
|
5
5
|
export const TRUST_DOMAIN_WARNING = 'dispatcher shares one Codex context across multiple Feishu chats';
|
|
@@ -17,11 +17,18 @@ export function defaultDispatcherAccessState() {
|
|
|
17
17
|
last_gate: null,
|
|
18
18
|
};
|
|
19
19
|
}
|
|
20
|
-
export function loadDispatcherAccess(dispatcherId) {
|
|
20
|
+
export async function loadDispatcherAccess(dispatcherId) {
|
|
21
21
|
const path = dispatcherAccessPath(dispatcherId);
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
let raw;
|
|
23
|
+
try {
|
|
24
|
+
raw = await readFile(path, 'utf8');
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
if (err.code === 'ENOENT') {
|
|
28
|
+
return defaultDispatcherAccessState();
|
|
29
|
+
}
|
|
30
|
+
throw err;
|
|
31
|
+
}
|
|
25
32
|
let parsed;
|
|
26
33
|
try {
|
|
27
34
|
parsed = JSON.parse(raw);
|
|
@@ -32,11 +39,11 @@ export function loadDispatcherAccess(dispatcherId) {
|
|
|
32
39
|
}
|
|
33
40
|
return readDispatcherAccess(parsed, path);
|
|
34
41
|
}
|
|
35
|
-
export function saveDispatcherAccess(dispatcherId, access) {
|
|
42
|
+
export async function saveDispatcherAccess(dispatcherId, access) {
|
|
36
43
|
const path = dispatcherAccessPath(dispatcherId);
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
44
|
+
await mkdir(dirname(path), { recursive: true });
|
|
45
|
+
await writeFile(path, `${JSON.stringify(access, null, 2)}\n`, { mode: 0o600 });
|
|
46
|
+
await chmod(path, 0o600);
|
|
40
47
|
}
|
|
41
48
|
export function dreamuxFeishuGate(input, access) {
|
|
42
49
|
const now = input.now ?? Date.now();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feishu-gate.js","sourceRoot":"","sources":["../../src/channel/feishu-gate.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,eAAe,GAEhB,MAAM,6BAA6B,CAAC;AACrC,OAAO,
|
|
1
|
+
{"version":3,"file":"feishu-gate.js","sourceRoot":"","sources":["../../src/channel/feishu-gate.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/doctor.js
CHANGED
|
@@ -1,6 +1,16 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { homedir } from 'node:os';
|
|
1
|
+
import { access, readFile } from 'node:fs/promises';
|
|
2
|
+
import { homedir, userInfo } from 'node:os';
|
|
3
3
|
import { parse as parsePlist } from 'plist';
|
|
4
|
+
/** Async existence probe — the fs/promises replacement for `existsSync`. */
|
|
5
|
+
async function pathExists(path) {
|
|
6
|
+
try {
|
|
7
|
+
await access(path);
|
|
8
|
+
return true;
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
4
14
|
import { codexArgsToCli, parseCodexArgs } from '../runtime/codex-args.js';
|
|
5
15
|
import { BUILT_IN_DEFAULTS, globalConfigDir, globalConfigFile, loadConfig, } from '../runtime/config.js';
|
|
6
16
|
import { dispatcherCodexHomeDoctorContext, validateDispatcherCodexHome, } from '../runtime/dispatcher-codex-home.js';
|
|
@@ -11,11 +21,11 @@ export async function runDreamuxDoctor(options = {}) {
|
|
|
11
21
|
const runner = options.runner ?? new ExecaCommandRunner();
|
|
12
22
|
const checks = [];
|
|
13
23
|
const configDir = globalConfigDir();
|
|
14
|
-
const { config, configFile } = readConfigForDoctor(configDir, checks);
|
|
24
|
+
const { config, configFile } = await readConfigForDoctor(configDir, checks);
|
|
15
25
|
setRuntimeConfig(config);
|
|
16
26
|
checks.push({
|
|
17
27
|
name: 'state directory',
|
|
18
|
-
ok:
|
|
28
|
+
ok: await pathExists(stateRoot()),
|
|
19
29
|
detail: stateRoot(),
|
|
20
30
|
});
|
|
21
31
|
checks.push({
|
|
@@ -36,8 +46,11 @@ export async function runDreamuxDoctor(options = {}) {
|
|
|
36
46
|
? `installed at ${service.unitPath}`
|
|
37
47
|
: `not installed at ${service.unitPath}`,
|
|
38
48
|
});
|
|
49
|
+
if (service.platform === 'systemd' && service.installed) {
|
|
50
|
+
checks.push(await systemdLingerCheck(runner, options.userName ?? userInfo().username));
|
|
51
|
+
}
|
|
39
52
|
await addManagedServiceLaunchChecks(checks, service, runner, options.nodeProbe ?? defaultServiceNodeProbe);
|
|
40
|
-
const dispatchers = readDispatchers(config, options.env ?? process.env, service);
|
|
53
|
+
const dispatchers = await readDispatchers(config, options.env ?? process.env, service);
|
|
41
54
|
if (dispatchers.length === 0) {
|
|
42
55
|
checks.push({
|
|
43
56
|
name: 'dispatchers',
|
|
@@ -73,9 +86,9 @@ export function printDoctorResult(result) {
|
|
|
73
86
|
printDispatcherDoctor(dispatcher);
|
|
74
87
|
}
|
|
75
88
|
}
|
|
76
|
-
function readConfigForDoctor(configDir, checks) {
|
|
89
|
+
async function readConfigForDoctor(configDir, checks) {
|
|
77
90
|
try {
|
|
78
|
-
const loaded = loadConfig({ configDir });
|
|
91
|
+
const loaded = await loadConfig({ configDir });
|
|
79
92
|
checks.push({
|
|
80
93
|
name: 'config',
|
|
81
94
|
ok: true,
|
|
@@ -96,8 +109,8 @@ function readConfigForDoctor(configDir, checks) {
|
|
|
96
109
|
};
|
|
97
110
|
}
|
|
98
111
|
}
|
|
99
|
-
function readDispatchers(config, env, service) {
|
|
100
|
-
return config.dispatchers.map((dispatcher) => {
|
|
112
|
+
async function readDispatchers(config, env, service) {
|
|
113
|
+
return Promise.all(config.dispatchers.map(async (dispatcher) => {
|
|
101
114
|
const codexArgs = parseCodexArgs(dispatcherCodexArgsJson(dispatcher), {
|
|
102
115
|
approvalPolicy: config.codex.approval_policy,
|
|
103
116
|
sandboxMode: config.codex.sandbox_mode,
|
|
@@ -108,13 +121,13 @@ function readDispatchers(config, env, service) {
|
|
|
108
121
|
codexCliArgs,
|
|
109
122
|
dispatcherCwd: dispatcher.cwd ?? dispatcherCodexCwd(dispatcher.id),
|
|
110
123
|
});
|
|
111
|
-
const foreground = validateDispatcherCodexHome(context, {
|
|
124
|
+
const foreground = await validateDispatcherCodexHome(context, {
|
|
112
125
|
env,
|
|
113
126
|
codexCliArgs,
|
|
114
127
|
});
|
|
115
128
|
const managedServiceEnv = service.environment ?? {};
|
|
116
129
|
const managedService = service.installed
|
|
117
|
-
? validateDispatcherCodexHome(context, {
|
|
130
|
+
? await validateDispatcherCodexHome(context, {
|
|
118
131
|
env: managedServiceEnv,
|
|
119
132
|
codexCliArgs,
|
|
120
133
|
})
|
|
@@ -124,7 +137,7 @@ function readDispatchers(config, env, service) {
|
|
|
124
137
|
foreground,
|
|
125
138
|
managedService,
|
|
126
139
|
};
|
|
127
|
-
});
|
|
140
|
+
}));
|
|
128
141
|
}
|
|
129
142
|
function dispatcherCodexArgsJson(dispatcher) {
|
|
130
143
|
return JSON.stringify({
|
|
@@ -148,7 +161,7 @@ async function getServiceStatus(options) {
|
|
|
148
161
|
return systemdStatus(unit.path, runner);
|
|
149
162
|
}
|
|
150
163
|
async function launchdStatus(unitPath, runner, uid) {
|
|
151
|
-
const installed =
|
|
164
|
+
const installed = await pathExists(unitPath);
|
|
152
165
|
const target = launchdTarget(uid);
|
|
153
166
|
let raw = '';
|
|
154
167
|
let loaded = false;
|
|
@@ -161,7 +174,7 @@ async function launchdStatus(unitPath, runner, uid) {
|
|
|
161
174
|
}
|
|
162
175
|
const pid = parseLaunchdPid(raw);
|
|
163
176
|
const unitFile = installed
|
|
164
|
-
? parseLaunchdPlist(
|
|
177
|
+
? parseLaunchdPlist(await readFile(unitPath, 'utf8'))
|
|
165
178
|
: { environment: null, execStart: null };
|
|
166
179
|
return {
|
|
167
180
|
platform: 'launchd',
|
|
@@ -199,14 +212,15 @@ async function systemdStatus(unitPath, runner) {
|
|
|
199
212
|
catch {
|
|
200
213
|
raw = '';
|
|
201
214
|
}
|
|
202
|
-
const
|
|
203
|
-
|
|
215
|
+
const installed = await pathExists(unitPath);
|
|
216
|
+
const unitFile = installed
|
|
217
|
+
? parseSystemdUnit(await readFile(unitPath, 'utf8'))
|
|
204
218
|
: { environment: null, execStart: null };
|
|
205
219
|
const props = parseSystemdProperties(raw);
|
|
206
220
|
return {
|
|
207
221
|
platform: 'systemd',
|
|
208
222
|
unitPath,
|
|
209
|
-
installed
|
|
223
|
+
installed,
|
|
210
224
|
enabled,
|
|
211
225
|
loaded: props['LoadState'] === 'loaded',
|
|
212
226
|
running: active || props['ActiveState'] === 'active',
|
|
@@ -216,6 +230,31 @@ async function systemdStatus(unitPath, runner) {
|
|
|
216
230
|
execStart: unitFile.execStart,
|
|
217
231
|
};
|
|
218
232
|
}
|
|
233
|
+
async function systemdLingerCheck(runner, userName) {
|
|
234
|
+
const fix = 'enable it with `loginctl enable-linger` (or rerun `dreamux daemon install`)';
|
|
235
|
+
try {
|
|
236
|
+
const raw = await runner.capture('loginctl', [
|
|
237
|
+
'show-user',
|
|
238
|
+
userName,
|
|
239
|
+
'--property=Linger',
|
|
240
|
+
]);
|
|
241
|
+
const ok = /Linger=yes/.test(raw);
|
|
242
|
+
return {
|
|
243
|
+
name: 'systemd linger',
|
|
244
|
+
ok,
|
|
245
|
+
detail: ok
|
|
246
|
+
? `enabled for ${userName}; the service starts at boot`
|
|
247
|
+
: `disabled for ${userName}; the service will not start at boot without an interactive login — ${fix}`,
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
catch (err) {
|
|
251
|
+
return {
|
|
252
|
+
name: 'systemd linger',
|
|
253
|
+
ok: false,
|
|
254
|
+
detail: `could not determine lingering for ${userName} (${err instanceof Error ? err.message : String(err)}) — ${fix}`,
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
}
|
|
219
258
|
async function addManagedServiceLaunchChecks(checks, service, runner, probe) {
|
|
220
259
|
if (!service.installed)
|
|
221
260
|
return;
|