@excitedjs/dreamux 0.1.4 → 0.3.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/README.md +170 -154
- package/bin/tm +30 -0
- package/dist/admin/client.js +98 -0
- package/dist/admin/client.js.map +1 -0
- package/dist/admin/methods.js +83 -38
- package/dist/admin/methods.js.map +1 -1
- package/dist/admin/socket.js +2 -2
- package/dist/admin/socket.js.map +1 -1
- package/dist/channel/feishu-gate.js +187 -18
- package/dist/channel/feishu-gate.js.map +1 -1
- package/dist/channel/feishu-message.js +92 -0
- package/dist/channel/feishu-message.js.map +1 -0
- package/dist/cli/doctor.js +53 -58
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/dreamux.js +72 -61
- package/dist/cli/dreamux.js.map +1 -1
- package/dist/cli/server-ctl.js +6 -8
- package/dist/cli/server-ctl.js.map +1 -1
- package/dist/cli/server.js +25 -38
- package/dist/cli/server.js.map +1 -1
- package/dist/codex/events.js +3 -2
- package/dist/codex/events.js.map +1 -1
- package/dist/codex/mcp-config.js +24 -0
- package/dist/codex/mcp-config.js.map +1 -0
- package/dist/codex/supervisor.js +16 -0
- package/dist/codex/supervisor.js.map +1 -1
- package/dist/dispatcher/approval.js +2 -3
- package/dist/dispatcher/approval.js.map +1 -1
- package/dist/dispatcher/runtime.js +195 -143
- package/dist/dispatcher/runtime.js.map +1 -1
- package/dist/dispatcher/turn-manager.js +78 -97
- package/dist/dispatcher/turn-manager.js.map +1 -1
- package/dist/feishu/bot.js +71 -9
- package/dist/feishu/bot.js.map +1 -1
- package/dist/mcp/feishu-mcp.js +269 -0
- package/dist/mcp/feishu-mcp.js.map +1 -0
- package/dist/onboard/config-files.js +60 -87
- package/dist/onboard/config-files.js.map +1 -1
- package/dist/onboard/dispatcher-skill.js +18 -0
- package/dist/onboard/dispatcher-skill.js.map +1 -0
- package/dist/onboard/run.js +40 -79
- package/dist/onboard/run.js.map +1 -1
- package/dist/onboard/service.js +6 -5
- package/dist/onboard/service.js.map +1 -1
- package/dist/onboard/uninstall.js +161 -0
- package/dist/onboard/uninstall.js.map +1 -0
- package/dist/onboard/wizard.js +12 -69
- package/dist/onboard/wizard.js.map +1 -1
- package/dist/runtime/codex-args.js +1 -1
- package/dist/runtime/config.js +213 -213
- package/dist/runtime/config.js.map +1 -1
- package/dist/runtime/dispatcher-codex-home.js +21 -185
- package/dist/runtime/dispatcher-codex-home.js.map +1 -1
- package/dist/runtime/dispatcher-id.js +9 -0
- package/dist/runtime/dispatcher-id.js.map +1 -0
- package/dist/runtime/dispatcher-store.js +202 -0
- package/dist/runtime/dispatcher-store.js.map +1 -0
- package/dist/runtime/package-bin.js +41 -0
- package/dist/runtime/package-bin.js.map +1 -0
- package/dist/runtime/paths.js +87 -48
- package/dist/runtime/paths.js.map +1 -1
- package/dist/runtime/secrets.js +17 -14
- package/dist/runtime/secrets.js.map +1 -1
- package/dist/server.js +112 -38
- package/dist/server.js.map +1 -1
- package/package.json +6 -6
- package/skills/dispatcher/SKILL.md +107 -0
- package/db/migrations/0001_init.sql +0 -49
- package/dist/channel/outbound.js +0 -12
- package/dist/channel/outbound.js.map +0 -1
- package/dist/db/repository.js +0 -223
- package/dist/db/repository.js.map +0 -1
- package/dist/db/schema.js +0 -29
- package/dist/db/schema.js.map +0 -1
- package/dist/db/types.js +0 -2
- package/dist/db/types.js.map +0 -1
- package/dist/onboard/plugins.js +0 -202
- package/dist/onboard/plugins.js.map +0 -1
|
@@ -1,14 +1,17 @@
|
|
|
1
|
-
import { existsSync, readFileSync,
|
|
2
|
-
import {
|
|
1
|
+
import { existsSync, readFileSync, } from 'node:fs';
|
|
2
|
+
import { join, normalize, sep } from 'node:path';
|
|
3
3
|
import { parse as parseToml, TomlError } from 'smol-toml';
|
|
4
|
-
import { dispatcherAppServerControlDir, dispatcherCodexConfigPath, dispatcherCodexHome,
|
|
5
|
-
export const DISPATCHER_APP_SERVER_SOCKET_PATH_MAX_BYTES =
|
|
4
|
+
import { DREAMUX_UNIX_SOCKET_PATH_MAX_BYTES, dispatcherAppServerControlDir, dispatcherCodexCwd, dispatcherCodexConfigPath, dispatcherCodexHome, dispatcherWorkspaceCodexSkillsDir, dispatcherWorkspaceSkillPath, dispatcherSocketPath, unixSocketPathFitsBudget, } from './paths.js';
|
|
5
|
+
export const DISPATCHER_APP_SERVER_SOCKET_PATH_MAX_BYTES = DREAMUX_UNIX_SOCKET_PATH_MAX_BYTES;
|
|
6
6
|
export function dispatcherCodexHomeDoctorContext(dispatcherId, options = {}) {
|
|
7
|
+
const dispatcherCwd = options.dispatcherCwd ?? dispatcherCodexCwd(dispatcherId);
|
|
7
8
|
return {
|
|
8
9
|
dispatcherId,
|
|
9
10
|
codexHome: dispatcherCodexHome(dispatcherId),
|
|
10
11
|
configPath: dispatcherCodexConfigPath(dispatcherId),
|
|
11
|
-
|
|
12
|
+
dispatcherCwd,
|
|
13
|
+
skillsDir: dispatcherWorkspaceCodexSkillsDir(dispatcherCwd),
|
|
14
|
+
skillPath: dispatcherWorkspaceSkillPath(dispatcherCwd),
|
|
12
15
|
appServerControlDir: dispatcherAppServerControlDir(dispatcherId),
|
|
13
16
|
socketPath: dispatcherSocketPath(dispatcherId),
|
|
14
17
|
codexCliArgs: options.codexCliArgs ?? [],
|
|
@@ -25,18 +28,11 @@ export function validateDispatcherCodexHome(input, options = {}) {
|
|
|
25
28
|
};
|
|
26
29
|
const errors = [];
|
|
27
30
|
const env = options.env ?? process.env;
|
|
28
|
-
|
|
29
|
-
if (!existsSync(context.configPath)) {
|
|
30
|
-
errors.push(`missing dispatcher Codex config: ${context.configPath}`);
|
|
31
|
-
}
|
|
32
|
-
else {
|
|
31
|
+
if (existsSync(context.configPath)) {
|
|
33
32
|
try {
|
|
34
33
|
const parsed = parseToml(readFileSync(context.configPath, 'utf8'));
|
|
35
|
-
if (isRecord(parsed)) {
|
|
36
|
-
|
|
37
|
-
}
|
|
38
|
-
else {
|
|
39
|
-
errors.push(`dispatcher Codex config must be a TOML table: ${context.configPath}`);
|
|
34
|
+
if (!isRecord(parsed)) {
|
|
35
|
+
errors.push(`Codex config must be a TOML table: ${context.configPath}`);
|
|
40
36
|
}
|
|
41
37
|
}
|
|
42
38
|
catch (err) {
|
|
@@ -44,29 +40,20 @@ export function validateDispatcherCodexHome(input, options = {}) {
|
|
|
44
40
|
}
|
|
45
41
|
}
|
|
46
42
|
if (!existsSync(context.codexHome)) {
|
|
47
|
-
errors.push(`missing
|
|
43
|
+
errors.push(`missing Codex home directory: ${context.codexHome}`);
|
|
48
44
|
}
|
|
49
45
|
if (isTmpPath(context.socketPath)) {
|
|
50
46
|
errors.push(`dispatcher app-server socket must not be under /tmp: ${context.socketPath}`);
|
|
51
47
|
}
|
|
52
|
-
if (!
|
|
48
|
+
if (!unixSocketPathFitsBudget(context.socketPath)) {
|
|
53
49
|
const bytes = Buffer.byteLength(context.socketPath, 'utf8');
|
|
54
50
|
errors.push(`dispatcher app-server socket path is too long for Unix sockets (${bytes} bytes > ${DISPATCHER_APP_SERVER_SOCKET_PATH_MAX_BYTES} safe bytes): ${context.socketPath}`);
|
|
55
51
|
}
|
|
56
|
-
if (!
|
|
57
|
-
errors.push(`missing
|
|
58
|
-
}
|
|
59
|
-
if (parsedConfig !== null) {
|
|
60
|
-
const effectiveConfig = applyCliConfigOverrides(parsedConfig, context.codexCliArgs, errors);
|
|
61
|
-
if (!hasNetworkEnabledRuntime(effectiveConfig)) {
|
|
62
|
-
errors.push('dispatcher Codex runtime config must select a network-enabled sandbox/profile');
|
|
63
|
-
}
|
|
64
|
-
if (!hasModel(effectiveConfig)) {
|
|
65
|
-
errors.push(`dispatcher Codex config must define a model in: ${context.configPath}`);
|
|
66
|
-
}
|
|
52
|
+
if (!dispatcherSkillExists(context.skillPath)) {
|
|
53
|
+
errors.push(`missing dispatcher skill: ${context.skillPath}`);
|
|
67
54
|
}
|
|
68
55
|
if (!hasAuth(context.codexHome, env)) {
|
|
69
|
-
errors.push(`missing
|
|
56
|
+
errors.push(`missing Codex auth state in ${context.codexHome} or a supported auth environment variable`);
|
|
70
57
|
}
|
|
71
58
|
return {
|
|
72
59
|
ok: errors.length === 0,
|
|
@@ -81,7 +68,7 @@ export async function assertDispatcherCodexHomeReady(context) {
|
|
|
81
68
|
throw new Error(formatDispatcherCodexHomeErrors(result));
|
|
82
69
|
}
|
|
83
70
|
export function formatDispatcherCodexHomeErrors(result) {
|
|
84
|
-
const header = `dispatcher '${result.context.dispatcherId}'
|
|
71
|
+
const header = `dispatcher '${result.context.dispatcherId}' Codex home is not ready`;
|
|
85
72
|
return [header, ...result.errors.map((e) => `- ${e}`)].join('\n');
|
|
86
73
|
}
|
|
87
74
|
function formatTomlError(err, file) {
|
|
@@ -89,82 +76,13 @@ function formatTomlError(err, file) {
|
|
|
89
76
|
const where = typeof err.line === 'number' && typeof err.column === 'number'
|
|
90
77
|
? `${file}:${err.line}:${err.column}`
|
|
91
78
|
: file;
|
|
92
|
-
return `
|
|
79
|
+
return `Codex config parse error at ${where}: ${err.message}`;
|
|
93
80
|
}
|
|
94
81
|
const msg = err instanceof Error ? err.message : String(err);
|
|
95
|
-
return `
|
|
96
|
-
}
|
|
97
|
-
function codexmuxPluginExists(root) {
|
|
98
|
-
return hasPathSegment(root, 'codexmux', 5);
|
|
99
|
-
}
|
|
100
|
-
function hasPathSegment(root, segment, maxDepth) {
|
|
101
|
-
if (!existsSync(root))
|
|
102
|
-
return false;
|
|
103
|
-
const stack = [{ path: root, depth: 0 }];
|
|
104
|
-
while (stack.length > 0) {
|
|
105
|
-
const current = stack.pop();
|
|
106
|
-
if (current === undefined)
|
|
107
|
-
continue;
|
|
108
|
-
if (basename(current.path) === segment)
|
|
109
|
-
return true;
|
|
110
|
-
if (current.depth >= maxDepth)
|
|
111
|
-
continue;
|
|
112
|
-
let entries;
|
|
113
|
-
try {
|
|
114
|
-
entries = readdirSync(current.path);
|
|
115
|
-
}
|
|
116
|
-
catch {
|
|
117
|
-
continue;
|
|
118
|
-
}
|
|
119
|
-
for (const entry of entries) {
|
|
120
|
-
const child = join(current.path, entry);
|
|
121
|
-
try {
|
|
122
|
-
if (statSync(child).isDirectory()) {
|
|
123
|
-
stack.push({ path: child, depth: current.depth + 1 });
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
catch {
|
|
127
|
-
/* ignore transient filesystem races */
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
return false;
|
|
132
|
-
}
|
|
133
|
-
function hasNetworkEnabledRuntime(config) {
|
|
134
|
-
const sandboxMode = stringValue(config['sandbox_mode']);
|
|
135
|
-
if (sandboxMode === 'danger-full-access')
|
|
136
|
-
return true;
|
|
137
|
-
if (sandboxMode === 'workspace-write') {
|
|
138
|
-
const workspaceWrite = recordValue(config['sandbox_workspace_write']);
|
|
139
|
-
if (workspaceWrite !== null && boolValue(workspaceWrite['network_access']) === true) {
|
|
140
|
-
return true;
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
const profileName = stringValue(config['default_permissions']);
|
|
144
|
-
if (profileName === null)
|
|
145
|
-
return false;
|
|
146
|
-
const permissions = recordValue(config['permissions']);
|
|
147
|
-
if (permissions !== null) {
|
|
148
|
-
const profile = recordValue(permissions[profileName]);
|
|
149
|
-
if (profile !== null && profileAllowsNetwork(profile))
|
|
150
|
-
return true;
|
|
151
|
-
}
|
|
152
|
-
return false;
|
|
153
|
-
}
|
|
154
|
-
function profileAllowsNetwork(profile) {
|
|
155
|
-
if (stringValue(profile['sandbox_mode']) === 'danger-full-access')
|
|
156
|
-
return true;
|
|
157
|
-
const network = recordValue(profile['network']);
|
|
158
|
-
if (network !== null && boolValue(network['enabled']) === true)
|
|
159
|
-
return true;
|
|
160
|
-
const sandbox = recordValue(profile['sandbox_workspace_write']);
|
|
161
|
-
if (sandbox !== null && boolValue(sandbox['network_access']) === true)
|
|
162
|
-
return true;
|
|
163
|
-
return false;
|
|
82
|
+
return `Codex config parse error in ${file}: ${msg}`;
|
|
164
83
|
}
|
|
165
|
-
function
|
|
166
|
-
|
|
167
|
-
return fromConfig !== null && fromConfig.trim() !== '';
|
|
84
|
+
function dispatcherSkillExists(skillPath) {
|
|
85
|
+
return existsSync(skillPath);
|
|
168
86
|
}
|
|
169
87
|
function hasAuth(codexHome, env) {
|
|
170
88
|
if (existsSync(join(codexHome, 'auth.json')))
|
|
@@ -174,79 +92,6 @@ function hasAuth(codexHome, env) {
|
|
|
174
92
|
return value !== undefined && value.trim() !== '';
|
|
175
93
|
});
|
|
176
94
|
}
|
|
177
|
-
function socketPathFitsUnixLimit(path) {
|
|
178
|
-
return (Buffer.byteLength(path, 'utf8') <=
|
|
179
|
-
DISPATCHER_APP_SERVER_SOCKET_PATH_MAX_BYTES);
|
|
180
|
-
}
|
|
181
|
-
function applyCliConfigOverrides(config, cliArgs, errors) {
|
|
182
|
-
const effective = cloneRecord(config);
|
|
183
|
-
for (let i = 0; i < cliArgs.length; i += 1) {
|
|
184
|
-
const arg = cliArgs[i];
|
|
185
|
-
if (arg === '-c' || arg === '--config') {
|
|
186
|
-
const next = cliArgs[i + 1];
|
|
187
|
-
if (next === undefined) {
|
|
188
|
-
errors.push(`Codex config override ${arg} is missing key=value`);
|
|
189
|
-
}
|
|
190
|
-
else {
|
|
191
|
-
applyConfigOverride(effective, next, errors);
|
|
192
|
-
i += 1;
|
|
193
|
-
}
|
|
194
|
-
continue;
|
|
195
|
-
}
|
|
196
|
-
if (arg.startsWith('--config=')) {
|
|
197
|
-
applyConfigOverride(effective, arg.slice('--config='.length), errors);
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
return effective;
|
|
201
|
-
}
|
|
202
|
-
function applyConfigOverride(config, raw, errors) {
|
|
203
|
-
const eq = raw.indexOf('=');
|
|
204
|
-
if (eq <= 0) {
|
|
205
|
-
errors.push(`Codex config override must be key=value: ${raw}`);
|
|
206
|
-
return;
|
|
207
|
-
}
|
|
208
|
-
const key = raw.slice(0, eq).trim();
|
|
209
|
-
const value = parseCodexConfigValue(raw.slice(eq + 1).trim());
|
|
210
|
-
const parts = key.split('.').map((p) => p.trim()).filter((p) => p !== '');
|
|
211
|
-
if (parts.length === 0) {
|
|
212
|
-
errors.push(`Codex config override has an empty key: ${raw}`);
|
|
213
|
-
return;
|
|
214
|
-
}
|
|
215
|
-
let target = config;
|
|
216
|
-
for (const part of parts.slice(0, -1)) {
|
|
217
|
-
const existing = target[part];
|
|
218
|
-
if (!isRecord(existing)) {
|
|
219
|
-
target[part] = {};
|
|
220
|
-
}
|
|
221
|
-
target = target[part];
|
|
222
|
-
}
|
|
223
|
-
target[parts[parts.length - 1]] = value;
|
|
224
|
-
}
|
|
225
|
-
function parseCodexConfigValue(raw) {
|
|
226
|
-
try {
|
|
227
|
-
const parsed = parseToml(`value = ${raw}`);
|
|
228
|
-
if (isRecord(parsed))
|
|
229
|
-
return parsed['value'];
|
|
230
|
-
}
|
|
231
|
-
catch {
|
|
232
|
-
/* Codex treats non-TOML override values as literal strings. */
|
|
233
|
-
}
|
|
234
|
-
return raw;
|
|
235
|
-
}
|
|
236
|
-
function cloneRecord(record) {
|
|
237
|
-
const copy = {};
|
|
238
|
-
for (const [key, value] of Object.entries(record)) {
|
|
239
|
-
copy[key] = cloneValue(value);
|
|
240
|
-
}
|
|
241
|
-
return copy;
|
|
242
|
-
}
|
|
243
|
-
function cloneValue(value) {
|
|
244
|
-
if (Array.isArray(value))
|
|
245
|
-
return value.map(cloneValue);
|
|
246
|
-
if (isRecord(value))
|
|
247
|
-
return cloneRecord(value);
|
|
248
|
-
return value;
|
|
249
|
-
}
|
|
250
95
|
function isTmpPath(path) {
|
|
251
96
|
const normalized = normalize(path);
|
|
252
97
|
return normalized === '/tmp' || normalized.startsWith(`/tmp${sep}`);
|
|
@@ -254,13 +99,4 @@ function isTmpPath(path) {
|
|
|
254
99
|
function isRecord(value) {
|
|
255
100
|
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
256
101
|
}
|
|
257
|
-
function recordValue(value) {
|
|
258
|
-
return isRecord(value) ? value : null;
|
|
259
|
-
}
|
|
260
|
-
function stringValue(value) {
|
|
261
|
-
return typeof value === 'string' ? value : null;
|
|
262
|
-
}
|
|
263
|
-
function boolValue(value) {
|
|
264
|
-
return typeof value === 'boolean' ? value : null;
|
|
265
|
-
}
|
|
266
102
|
//# sourceMappingURL=dispatcher-codex-home.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispatcher-codex-home.js","sourceRoot":"","sources":["../../src/runtime/dispatcher-codex-home.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,YAAY,
|
|
1
|
+
{"version":3,"file":"dispatcher-codex-home.js","sourceRoot":"","sources":["../../src/runtime/dispatcher-codex-home.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export const DISPATCHER_ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/;
|
|
2
|
+
export const DISPATCHER_ID_RULE = '1-64 characters, starting with an ASCII letter or digit, and containing only ASCII letters, digits, dot, underscore, or dash';
|
|
3
|
+
export function validateDispatcherId(id, label = 'dispatcher id') {
|
|
4
|
+
if (!DISPATCHER_ID_PATTERN.test(id)) {
|
|
5
|
+
throw new Error(`${label} must be ${DISPATCHER_ID_RULE}: ${id}`);
|
|
6
|
+
}
|
|
7
|
+
return id;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=dispatcher-id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatcher-id.js","sourceRoot":"","sources":["../../src/runtime/dispatcher-id.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qBAAqB,GAAG,mCAAmC,CAAC;AAEzE,MAAM,CAAC,MAAM,kBAAkB,GAC7B,8HAA8H,CAAC;AAEjI,MAAM,UAAU,oBAAoB,CAAC,EAAU,EAAE,KAAK,GAAG,eAAe;IACtE,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,YAAY,kBAAkB,KAAK,EAAE,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync, } from 'node:fs';
|
|
2
|
+
import { dirname } from 'node:path';
|
|
3
|
+
import { dispatcherStatusPath } from './paths.js';
|
|
4
|
+
export class DispatcherStore {
|
|
5
|
+
rows = new Map();
|
|
6
|
+
constructor(config) {
|
|
7
|
+
const now = Date.now();
|
|
8
|
+
for (const dispatcher of config.dispatchers) {
|
|
9
|
+
const row = rowFromConfig(dispatcher, now);
|
|
10
|
+
this.rows.set(row.dispatcher_id, row);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
create(input) {
|
|
14
|
+
if (this.rows.has(input.dispatcher_id)) {
|
|
15
|
+
throw new Error(`dispatcher '${input.dispatcher_id}' already exists`);
|
|
16
|
+
}
|
|
17
|
+
const duplicateApp = this.list().find((row) => row.bot_app_id === input.bot_app_id);
|
|
18
|
+
if (duplicateApp !== undefined) {
|
|
19
|
+
throw new Error(`bot_app_id '${input.bot_app_id}' is already used by dispatcher '${duplicateApp.dispatcher_id}'`);
|
|
20
|
+
}
|
|
21
|
+
const now = Date.now();
|
|
22
|
+
const row = {
|
|
23
|
+
dispatcher_id: input.dispatcher_id,
|
|
24
|
+
bot_app_id: input.bot_app_id,
|
|
25
|
+
bot_secret_ref: input.bot_secret_ref ?? `config:${input.dispatcher_id}`,
|
|
26
|
+
codex_args_json: input.codex_args_json ?? '{}',
|
|
27
|
+
codex_cwd: input.codex_cwd ?? null,
|
|
28
|
+
thread_id: null,
|
|
29
|
+
status: 'declared',
|
|
30
|
+
enabled: normalizeEnabled(input.enabled ?? 1),
|
|
31
|
+
created_at: now,
|
|
32
|
+
updated_at: now,
|
|
33
|
+
last_started_at: null,
|
|
34
|
+
last_ready_at: null,
|
|
35
|
+
last_error: null,
|
|
36
|
+
last_lost_thread_id: null,
|
|
37
|
+
};
|
|
38
|
+
this.rows.set(row.dispatcher_id, row);
|
|
39
|
+
return { ...row };
|
|
40
|
+
}
|
|
41
|
+
upsert(input) {
|
|
42
|
+
const existing = this.rows.get(input.dispatcher_id);
|
|
43
|
+
if (existing === undefined)
|
|
44
|
+
return this.create(input);
|
|
45
|
+
const row = {
|
|
46
|
+
...existing,
|
|
47
|
+
bot_app_id: input.bot_app_id,
|
|
48
|
+
bot_secret_ref: input.bot_secret_ref ?? existing.bot_secret_ref,
|
|
49
|
+
codex_args_json: input.codex_args_json ?? existing.codex_args_json,
|
|
50
|
+
codex_cwd: input.codex_cwd ?? existing.codex_cwd,
|
|
51
|
+
enabled: normalizeEnabled(input.enabled ?? existing.enabled),
|
|
52
|
+
updated_at: Date.now(),
|
|
53
|
+
};
|
|
54
|
+
this.rows.set(row.dispatcher_id, row);
|
|
55
|
+
return { ...row };
|
|
56
|
+
}
|
|
57
|
+
get(id) {
|
|
58
|
+
const row = this.rows.get(id);
|
|
59
|
+
return row === undefined ? null : { ...row };
|
|
60
|
+
}
|
|
61
|
+
list() {
|
|
62
|
+
return Array.from(this.rows.values())
|
|
63
|
+
.sort((a, b) => a.created_at - b.created_at)
|
|
64
|
+
.map((row) => ({ ...row }));
|
|
65
|
+
}
|
|
66
|
+
listEnabled() {
|
|
67
|
+
return this.list().filter((row) => row.enabled === 1);
|
|
68
|
+
}
|
|
69
|
+
remove(id) {
|
|
70
|
+
this.rows.delete(id);
|
|
71
|
+
rmSync(dispatcherStatusPath(id), { force: true });
|
|
72
|
+
}
|
|
73
|
+
setStatus(id, status, extras = {}) {
|
|
74
|
+
const row = this.mustRow(id);
|
|
75
|
+
row.status = status;
|
|
76
|
+
row.updated_at = Date.now();
|
|
77
|
+
if ('last_error' in extras)
|
|
78
|
+
row.last_error = extras.last_error ?? null;
|
|
79
|
+
if (extras.last_started_at !== undefined) {
|
|
80
|
+
row.last_started_at = extras.last_started_at;
|
|
81
|
+
}
|
|
82
|
+
if (extras.last_ready_at !== undefined) {
|
|
83
|
+
row.last_ready_at = extras.last_ready_at;
|
|
84
|
+
}
|
|
85
|
+
this.persist(row);
|
|
86
|
+
}
|
|
87
|
+
setThreadId(id, threadId) {
|
|
88
|
+
const row = this.mustRow(id);
|
|
89
|
+
row.thread_id = threadId;
|
|
90
|
+
row.updated_at = Date.now();
|
|
91
|
+
this.persist(row);
|
|
92
|
+
}
|
|
93
|
+
recordLostThread(id, lostThreadId, newThreadId, error) {
|
|
94
|
+
const row = this.mustRow(id);
|
|
95
|
+
row.thread_id = newThreadId;
|
|
96
|
+
row.last_lost_thread_id = lostThreadId;
|
|
97
|
+
row.last_error = error;
|
|
98
|
+
row.updated_at = Date.now();
|
|
99
|
+
this.persist(row);
|
|
100
|
+
}
|
|
101
|
+
mustRow(id) {
|
|
102
|
+
const row = this.rows.get(id);
|
|
103
|
+
if (row === undefined)
|
|
104
|
+
throw new Error(`no dispatcher '${id}'`);
|
|
105
|
+
return row;
|
|
106
|
+
}
|
|
107
|
+
persist(row) {
|
|
108
|
+
mkdirSync(dirname(dispatcherStatusPath(row.dispatcher_id)), {
|
|
109
|
+
recursive: true,
|
|
110
|
+
});
|
|
111
|
+
const status = {
|
|
112
|
+
version: 1,
|
|
113
|
+
dispatcher_id: row.dispatcher_id,
|
|
114
|
+
thread_id: row.thread_id,
|
|
115
|
+
status: row.status,
|
|
116
|
+
updated_at: row.updated_at,
|
|
117
|
+
last_started_at: row.last_started_at,
|
|
118
|
+
last_ready_at: row.last_ready_at,
|
|
119
|
+
last_error: row.last_error,
|
|
120
|
+
last_lost_thread_id: row.last_lost_thread_id,
|
|
121
|
+
};
|
|
122
|
+
writeFileSync(dispatcherStatusPath(row.dispatcher_id), `${JSON.stringify(status, null, 2)}\n`, { mode: 0o600 });
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
function rowFromConfig(config, now) {
|
|
126
|
+
const status = readStatusFile(config.id);
|
|
127
|
+
return {
|
|
128
|
+
dispatcher_id: config.id,
|
|
129
|
+
bot_app_id: config.feishu.app_id,
|
|
130
|
+
bot_secret_ref: `config:${config.id}`,
|
|
131
|
+
codex_args_json: dispatcherCodexArgsJson(config),
|
|
132
|
+
codex_cwd: config.cwd,
|
|
133
|
+
thread_id: status?.thread_id ?? null,
|
|
134
|
+
status: status?.status ?? 'declared',
|
|
135
|
+
enabled: config.enabled ? 1 : 0,
|
|
136
|
+
created_at: status?.updated_at ?? now,
|
|
137
|
+
updated_at: status?.updated_at ?? now,
|
|
138
|
+
last_started_at: status?.last_started_at ?? null,
|
|
139
|
+
last_ready_at: status?.last_ready_at ?? null,
|
|
140
|
+
last_error: status?.last_error ?? null,
|
|
141
|
+
last_lost_thread_id: status?.last_lost_thread_id ?? null,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
function dispatcherCodexArgsJson(config) {
|
|
145
|
+
const raw = {};
|
|
146
|
+
if (config.codex.approval_policy !== null) {
|
|
147
|
+
raw['approvalPolicy'] = config.codex.approval_policy;
|
|
148
|
+
}
|
|
149
|
+
if (config.codex.sandbox_mode !== null) {
|
|
150
|
+
raw['sandboxMode'] = config.codex.sandbox_mode;
|
|
151
|
+
}
|
|
152
|
+
if (config.codex.extra_args.length > 0) {
|
|
153
|
+
raw['extraArgs'] = config.codex.extra_args;
|
|
154
|
+
}
|
|
155
|
+
// codex.extra_env is applied to the child process environment, not encoded
|
|
156
|
+
// into CLI args.
|
|
157
|
+
return JSON.stringify(raw);
|
|
158
|
+
}
|
|
159
|
+
function readStatusFile(id) {
|
|
160
|
+
const path = dispatcherStatusPath(id);
|
|
161
|
+
if (!existsSync(path))
|
|
162
|
+
return null;
|
|
163
|
+
try {
|
|
164
|
+
const raw = JSON.parse(readFileSync(path, 'utf8'));
|
|
165
|
+
if (raw.version !== 1 || raw.dispatcher_id !== id)
|
|
166
|
+
return null;
|
|
167
|
+
return {
|
|
168
|
+
version: 1,
|
|
169
|
+
dispatcher_id: id,
|
|
170
|
+
thread_id: typeof raw.thread_id === 'string' ? raw.thread_id : null,
|
|
171
|
+
status: isDispatcherStatus(raw.status) ? raw.status : 'declared',
|
|
172
|
+
updated_at: typeof raw.updated_at === 'number' && Number.isFinite(raw.updated_at)
|
|
173
|
+
? raw.updated_at
|
|
174
|
+
: Date.now(),
|
|
175
|
+
last_started_at: numberOrNull(raw.last_started_at),
|
|
176
|
+
last_ready_at: numberOrNull(raw.last_ready_at),
|
|
177
|
+
last_error: stringOrNull(raw.last_error),
|
|
178
|
+
last_lost_thread_id: stringOrNull(raw.last_lost_thread_id),
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
return null;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
function isDispatcherStatus(value) {
|
|
186
|
+
return value === 'declared' ||
|
|
187
|
+
value === 'starting' ||
|
|
188
|
+
value === 'ready' ||
|
|
189
|
+
value === 'degraded' ||
|
|
190
|
+
value === 'stopping' ||
|
|
191
|
+
value === 'stopped';
|
|
192
|
+
}
|
|
193
|
+
function numberOrNull(value) {
|
|
194
|
+
return typeof value === 'number' && Number.isFinite(value) ? value : null;
|
|
195
|
+
}
|
|
196
|
+
function stringOrNull(value) {
|
|
197
|
+
return typeof value === 'string' ? value : null;
|
|
198
|
+
}
|
|
199
|
+
function normalizeEnabled(value) {
|
|
200
|
+
return value === true || value === 1 ? 1 : 0;
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=dispatcher-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatcher-store.js","sourceRoot":"","sources":["../../src/runtime/dispatcher-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { dirname, join, resolve } from 'node:path';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
const HERE = dirname(fileURLToPath(import.meta.url));
|
|
4
|
+
const PACKAGE_ROOT = dirname(dirname(HERE));
|
|
5
|
+
const PACKAGE_BIN_DIR = join(PACKAGE_ROOT, 'bin');
|
|
6
|
+
const DREAMUX_BIN = join(PACKAGE_BIN_DIR, 'dreamux');
|
|
7
|
+
export function dreamuxBinPath(env = process.env) {
|
|
8
|
+
const fromEnv = env['DREAMUX_BIN'];
|
|
9
|
+
return fromEnv !== undefined && fromEnv !== ''
|
|
10
|
+
? resolve(fromEnv)
|
|
11
|
+
: DREAMUX_BIN;
|
|
12
|
+
}
|
|
13
|
+
export function dispatcherProcessEnv(baseEnv = process.env, extraEnv = {}) {
|
|
14
|
+
const mergedEnv = {
|
|
15
|
+
...baseEnv,
|
|
16
|
+
...extraEnv,
|
|
17
|
+
};
|
|
18
|
+
const env = {
|
|
19
|
+
...mergedEnv,
|
|
20
|
+
PATH: prependPath(packageBinDirs(mergedEnv), mergedEnv['PATH']),
|
|
21
|
+
};
|
|
22
|
+
delete env['CODEX_HOME'];
|
|
23
|
+
return env;
|
|
24
|
+
}
|
|
25
|
+
function packageBinDirs(env) {
|
|
26
|
+
const dirs = [PACKAGE_BIN_DIR];
|
|
27
|
+
dirs.push(dirname(dreamuxBinPath(env)));
|
|
28
|
+
return dirs;
|
|
29
|
+
}
|
|
30
|
+
function prependPath(prefixes, existing) {
|
|
31
|
+
const parts = [];
|
|
32
|
+
const seen = new Set();
|
|
33
|
+
for (const part of [...prefixes, ...(existing ?? '').split(':')]) {
|
|
34
|
+
if (part === '' || seen.has(part))
|
|
35
|
+
continue;
|
|
36
|
+
seen.add(part);
|
|
37
|
+
parts.push(part);
|
|
38
|
+
}
|
|
39
|
+
return parts.join(':');
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=package-bin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-bin.js","sourceRoot":"","sources":["../../src/runtime/package-bin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACrD,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5C,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;AAClD,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;AAErD,MAAM,UAAU,cAAc,CAC5B,MAAyB,OAAO,CAAC,GAAG;IAEpC,MAAM,OAAO,GAAG,GAAG,CAAC,aAAa,CAAC,CAAC;IACnC,OAAO,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,EAAE;QAC5C,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;QAClB,CAAC,CAAC,WAAW,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,UAA6B,OAAO,CAAC,GAAG,EACxC,WAAmC,EAAE;IAErC,MAAM,SAAS,GAAsB;QACnC,GAAG,OAAO;QACV,GAAG,QAAQ;KACZ,CAAC;IACF,MAAM,GAAG,GAAsB;QAC7B,GAAG,SAAS;QACZ,IAAI,EAAE,WAAW,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;KAChE,CAAC;IACF,OAAO,GAAG,CAAC,YAAY,CAAC,CAAC;IACzB,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,cAAc,CAAC,GAAsB;IAC5C,MAAM,IAAI,GAAG,CAAC,eAAe,CAAC,CAAC;IAC/B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACxC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,WAAW,CAAC,QAAkB,EAAE,QAA4B;IACnE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QACjE,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QAC5C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC"}
|