@excitedjs/dreamux 0.1.4 → 0.2.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 +64 -43
- package/dist/cli/dreamux.js +47 -18
- package/dist/cli/dreamux.js.map +1 -1
- package/dist/cli/server-ctl.js +2 -2
- package/dist/cli/server.js +7 -10
- package/dist/cli/server.js.map +1 -1
- package/dist/dispatcher/runtime.js +8 -8
- package/dist/dispatcher/runtime.js.map +1 -1
- package/dist/onboard/config-files.js +28 -85
- package/dist/onboard/config-files.js.map +1 -1
- package/dist/onboard/plugins.js +1 -1
- package/dist/onboard/plugins.js.map +1 -1
- package/dist/onboard/run.js +37 -43
- package/dist/onboard/run.js.map +1 -1
- package/dist/onboard/service.js +6 -1
- package/dist/onboard/service.js.map +1 -1
- package/dist/onboard/uninstall.js +127 -0
- package/dist/onboard/uninstall.js.map +1 -0
- package/dist/onboard/wizard.js +9 -42
- package/dist/onboard/wizard.js.map +1 -1
- package/dist/runtime/codex-args.js +1 -1
- package/dist/runtime/config.js +99 -193
- package/dist/runtime/config.js.map +1 -1
- package/dist/runtime/dispatcher-codex-home.js +8 -135
- package/dist/runtime/dispatcher-codex-home.js.map +1 -1
- package/dist/runtime/paths.js +16 -11
- package/dist/runtime/paths.js.map +1 -1
- package/dist/runtime/secrets.js +16 -14
- package/dist/runtime/secrets.js.map +1 -1
- package/dist/server.js +2 -2
- package/dist/server.js.map +1 -1
- package/package.json +1 -1
package/dist/onboard/wizard.js
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import { homedir } from 'node:os';
|
|
2
2
|
import { join, resolve } from 'node:path';
|
|
3
|
-
import { cancel, confirm, intro, isCancel, outro,
|
|
3
|
+
import { cancel, confirm, intro, isCancel, outro, text, } from '@clack/prompts';
|
|
4
4
|
import { expandHome } from '../runtime/config.js';
|
|
5
5
|
const DEFAULT_DISPATCHER_ID = 'dispatcher';
|
|
6
|
-
const DEFAULT_CODEX_MODEL = 'gpt-5-codex';
|
|
7
|
-
const DEFAULT_CODEX_PROVIDER = 'openai';
|
|
8
6
|
const DEFAULT_CODEX_MARKETPLACE_SOURCE = 'excitedjs/dreamux';
|
|
9
7
|
const DEFAULT_CODEX_MARKETPLACE_SPARSE = [
|
|
10
8
|
'.agents/plugins',
|
|
@@ -23,15 +21,10 @@ export async function collectOnboardAnswers(options) {
|
|
|
23
21
|
const configDir = await promptText('dreamux config directory', defaultConfigDir(options));
|
|
24
22
|
const runtimeDir = await promptText('dreamux runtime directory', defaultRuntimeDir(options));
|
|
25
23
|
const dispatcherId = await promptText('dispatcher id', options.dispatcherId ?? DEFAULT_DISPATCHER_ID);
|
|
24
|
+
const dispatcherCwd = await promptText('dispatcher cwd', options.dispatcherCwd ?? process.cwd());
|
|
26
25
|
const codexBin = await promptText('codex binary', options.codexBin ?? 'codex');
|
|
27
|
-
const codexModel = await promptText('dispatcher Codex model', options.codexModel ?? DEFAULT_CODEX_MODEL);
|
|
28
|
-
const authEnvVar = await promptSelect('Codex auth environment variable', options.authEnvVar ?? firstConfiguredAuthEnv(), [
|
|
29
|
-
{ value: 'CODEX_ACCESS_TOKEN', label: 'CODEX_ACCESS_TOKEN' },
|
|
30
|
-
{ value: 'OPENAI_API_KEY', label: 'OPENAI_API_KEY' },
|
|
31
|
-
{ value: 'CODEX_API_KEY', label: 'CODEX_API_KEY' },
|
|
32
|
-
]);
|
|
33
26
|
const botAppId = await promptText('channel bot app id', options.botAppId);
|
|
34
|
-
const
|
|
27
|
+
const botAppSecret = await promptText('channel bot app secret', options.botAppSecret);
|
|
35
28
|
const registerService = await promptConfirm('register the user-level service now?', options.registerService ?? true);
|
|
36
29
|
const startService = registerService
|
|
37
30
|
? await promptConfirm('start the service after registration?', options.startService ?? true)
|
|
@@ -42,28 +35,24 @@ export async function collectOnboardAnswers(options) {
|
|
|
42
35
|
configDir,
|
|
43
36
|
runtimeDir,
|
|
44
37
|
dispatcherId,
|
|
38
|
+
dispatcherCwd,
|
|
45
39
|
codexBin,
|
|
46
|
-
codexModel,
|
|
47
|
-
authEnvVar,
|
|
48
40
|
botAppId,
|
|
49
|
-
|
|
41
|
+
botAppSecret,
|
|
50
42
|
registerService,
|
|
51
43
|
startService,
|
|
52
44
|
}, true);
|
|
53
45
|
}
|
|
54
46
|
export function answersFromOptions(options, fromInteractive) {
|
|
55
47
|
const botAppId = requiredOption(options.botAppId, 'bot-app-id', fromInteractive);
|
|
56
|
-
const
|
|
57
|
-
const
|
|
58
|
-
assertSupportedAuthEnv(authEnvVar);
|
|
48
|
+
const botAppSecret = requiredOption(options.botAppSecret, 'bot-app-secret', fromInteractive);
|
|
49
|
+
const dispatcherCwd = options.dispatcherCwd ?? process.cwd();
|
|
59
50
|
return {
|
|
60
51
|
configDir: normalizePath(options.configDir ?? defaultConfigDir(options)),
|
|
61
52
|
runtimeDir: normalizePath(options.runtimeDir ?? defaultRuntimeDir(options)),
|
|
62
53
|
dispatcherId: options.dispatcherId ?? DEFAULT_DISPATCHER_ID,
|
|
54
|
+
dispatcherCwd: normalizePath(dispatcherCwd),
|
|
63
55
|
codexBin: options.codexBin ?? 'codex',
|
|
64
|
-
codexModel: options.codexModel ?? DEFAULT_CODEX_MODEL,
|
|
65
|
-
codexProvider: options.codexProvider ?? DEFAULT_CODEX_PROVIDER,
|
|
66
|
-
authEnvVar,
|
|
67
56
|
codexMarketplaceSource: options.codexMarketplaceSource ?? DEFAULT_CODEX_MARKETPLACE_SOURCE,
|
|
68
57
|
codexMarketplaceSparse: normalizeStringArray(options.codexMarketplaceSparse, DEFAULT_CODEX_MARKETPLACE_SPARSE),
|
|
69
58
|
codexMarketplaceName: options.codexMarketplaceName ?? DEFAULT_CODEX_MARKETPLACE_NAME,
|
|
@@ -75,7 +64,7 @@ export function answersFromOptions(options, fromInteractive) {
|
|
|
75
64
|
claudeMarketplaceName: options.claudeMarketplaceName ?? DEFAULT_CLAUDE_MARKETPLACE_NAME,
|
|
76
65
|
claudePluginRef: options.claudePluginRef ?? DEFAULT_CLAUDE_PLUGIN_REF,
|
|
77
66
|
botAppId,
|
|
78
|
-
|
|
67
|
+
botAppSecret,
|
|
79
68
|
registerService: options.registerService ?? true,
|
|
80
69
|
startService: options.startService ?? true,
|
|
81
70
|
dreamuxBin: normalizePath(options.dreamuxBin ?? process.env['DREAMUX_BIN'] ?? process.argv[1]),
|
|
@@ -103,14 +92,6 @@ async function promptConfirm(label, initialValue) {
|
|
|
103
92
|
});
|
|
104
93
|
return unwrapPrompt(value);
|
|
105
94
|
}
|
|
106
|
-
async function promptSelect(label, initialValue, options) {
|
|
107
|
-
const value = await select({
|
|
108
|
-
message: label,
|
|
109
|
-
initialValue,
|
|
110
|
-
options,
|
|
111
|
-
});
|
|
112
|
-
return unwrapPrompt(value);
|
|
113
|
-
}
|
|
114
95
|
function unwrapPrompt(value) {
|
|
115
96
|
if (isCancel(value)) {
|
|
116
97
|
cancel('onboard cancelled');
|
|
@@ -132,18 +113,4 @@ function normalizeStringArray(value, fallback) {
|
|
|
132
113
|
return fallback;
|
|
133
114
|
return (Array.isArray(value) ? value : [value]).filter((item) => item !== '');
|
|
134
115
|
}
|
|
135
|
-
function firstConfiguredAuthEnv() {
|
|
136
|
-
for (const name of ['CODEX_ACCESS_TOKEN', 'OPENAI_API_KEY', 'CODEX_API_KEY']) {
|
|
137
|
-
if (process.env[name] !== undefined && process.env[name] !== '')
|
|
138
|
-
return name;
|
|
139
|
-
}
|
|
140
|
-
return 'CODEX_ACCESS_TOKEN';
|
|
141
|
-
}
|
|
142
|
-
function assertSupportedAuthEnv(name) {
|
|
143
|
-
if (name !== 'CODEX_ACCESS_TOKEN' &&
|
|
144
|
-
name !== 'OPENAI_API_KEY' &&
|
|
145
|
-
name !== 'CODEX_API_KEY') {
|
|
146
|
-
throw new Error(`unsupported Codex auth env var '${name}'; use CODEX_ACCESS_TOKEN, OPENAI_API_KEY, or CODEX_API_KEY`);
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
116
|
//# sourceMappingURL=wizard.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wizard.js","sourceRoot":"","sources":["../../src/onboard/wizard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EACL,MAAM,EACN,OAAO,EACP,KAAK,EACL,QAAQ,EACR,KAAK,EACL,
|
|
1
|
+
{"version":3,"file":"wizard.js","sourceRoot":"","sources":["../../src/onboard/wizard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EACL,MAAM,EACN,OAAO,EACP,KAAK,EACL,QAAQ,EACR,KAAK,EACL,IAAI,GACL,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AA4BlD,MAAM,qBAAqB,GAAG,YAAY,CAAC;AAC3C,MAAM,gCAAgC,GAAG,mBAAmB,CAAC;AAC7D,MAAM,gCAAgC,GAAG;IACvC,iBAAiB;IACjB,oCAAoC;CACrC,CAAC;AACF,MAAM,8BAA8B,GAAG,SAAS,CAAC;AACjD,MAAM,wBAAwB,GAAG,kBAAkB,CAAC;AACpD,MAAM,iCAAiC,GAAG,qBAAqB,CAAC;AAChE,MAAM,+BAA+B,GAAG,WAAW,CAAC;AACpD,MAAM,yBAAyB,GAAG,qBAAqB,CAAC;AAExD,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,OAA0B;IAE1B,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,CAAC,GAAG,KAAK,IAAI,CAAC;IACzE,IAAI,CAAC,WAAW;QAAE,OAAO,kBAAkB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAE5D,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACzB,MAAM,SAAS,GAAG,MAAM,UAAU,CAChC,0BAA0B,EAC1B,gBAAgB,CAAC,OAAO,CAAC,CAC1B,CAAC;IACF,MAAM,UAAU,GAAG,MAAM,UAAU,CACjC,2BAA2B,EAC3B,iBAAiB,CAAC,OAAO,CAAC,CAC3B,CAAC;IACF,MAAM,YAAY,GAAG,MAAM,UAAU,CACnC,eAAe,EACf,OAAO,CAAC,YAAY,IAAI,qBAAqB,CAC9C,CAAC;IACF,MAAM,aAAa,GAAG,MAAM,UAAU,CACpC,gBAAgB,EAChB,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,GAAG,EAAE,CACvC,CAAC;IACF,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,cAAc,EAAE,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,CAAC;IAC/E,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,oBAAoB,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC1E,MAAM,YAAY,GAAG,MAAM,UAAU,CACnC,wBAAwB,EACxB,OAAO,CAAC,YAAY,CACrB,CAAC;IACF,MAAM,eAAe,GAAG,MAAM,aAAa,CACzC,sCAAsC,EACtC,OAAO,CAAC,eAAe,IAAI,IAAI,CAChC,CAAC;IACF,MAAM,YAAY,GAAG,eAAe;QAClC,CAAC,CAAC,MAAM,aAAa,CACjB,uCAAuC,EACvC,OAAO,CAAC,YAAY,IAAI,IAAI,CAC7B;QACH,CAAC,CAAC,KAAK,CAAC;IAEV,KAAK,CAAC,8BAA8B,CAAC,CAAC;IACtC,OAAO,kBAAkB,CACvB;QACE,GAAG,OAAO;QACV,SAAS;QACT,UAAU;QACV,YAAY;QACZ,aAAa;QACb,QAAQ;QACR,QAAQ;QACR,YAAY;QACZ,eAAe;QACf,YAAY;KACb,EACD,IAAI,CACL,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,OAA0B,EAC1B,eAAwB;IAExB,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,QAAQ,EAAE,YAAY,EAAE,eAAe,CAAC,CAAC;IACjF,MAAM,YAAY,GAAG,cAAc,CACjC,OAAO,CAAC,YAAY,EACpB,gBAAgB,EAChB,eAAe,CAChB,CAAC;IACF,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC7D,OAAO;QACL,SAAS,EAAE,aAAa,CAAC,OAAO,CAAC,SAAS,IAAI,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACxE,UAAU,EAAE,aAAa,CAAC,OAAO,CAAC,UAAU,IAAI,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC3E,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,qBAAqB;QAC3D,aAAa,EAAE,aAAa,CAAC,aAAa,CAAC;QAC3C,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,OAAO;QACrC,sBAAsB,EACpB,OAAO,CAAC,sBAAsB,IAAI,gCAAgC;QACpE,sBAAsB,EAAE,oBAAoB,CAC1C,OAAO,CAAC,sBAAsB,EAC9B,gCAAgC,CACjC;QACD,oBAAoB,EAClB,OAAO,CAAC,oBAAoB,IAAI,8BAA8B;QAChE,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,wBAAwB;QAClE,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,QAAQ;QACxC,eAAe,EAAE,aAAa,CAC5B,OAAO,CAAC,eAAe,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CACtD;QACD,uBAAuB,EACrB,OAAO,CAAC,uBAAuB,IAAI,iCAAiC;QACtE,uBAAuB,EAAE,oBAAoB,CAC3C,OAAO,CAAC,uBAAuB,EAC/B,EAAE,CACH;QACD,qBAAqB,EACnB,OAAO,CAAC,qBAAqB,IAAI,+BAA+B;QAClE,eAAe,EAAE,OAAO,CAAC,eAAe,IAAI,yBAAyB;QACrE,QAAQ;QACR,YAAY;QACZ,eAAe,EAAE,OAAO,CAAC,eAAe,IAAI,IAAI;QAChD,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,IAAI;QAC1C,UAAU,EAAE,aAAa,CACvB,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CACpE;QACD,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,KAAK;KAChC,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,OAA0B;IAClD,OAAO,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,iBAAiB,CAAC,OAA0B;IACnD,OAAO,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,CAAC;AAC9D,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,KAAa,EAAE,YAAqB;IAC5D,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC;QACvB,OAAO,EAAE,KAAK;QACd,YAAY;QACZ,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAClB,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;KACtE,CAAC,CAAC;IACH,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,KAAa,EACb,YAAqB;IAErB,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC;QAC1B,OAAO,EAAE,KAAK;QACd,YAAY;KACb,CAAC,CAAC;IACH,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,YAAY,CAAI,KAAiB;IACxC,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CACrB,KAAyB,EACzB,IAAY,EACZ,eAAwB;IAExB,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,KAAK,CAAC;IAC7D,MAAM,IAAI,GAAG,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,yBAAyB,CAAC;IACpE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,eAAe,IAAI,EAAE,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,OAAO,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,oBAAoB,CAC3B,KAAoC,EACpC,QAAkB;IAElB,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IACzC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;AAChF,CAAC"}
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
*
|
|
13
13
|
* Precedence for each field (highest wins):
|
|
14
14
|
* 1. dispatchers.codex_args_json (this JSON)
|
|
15
|
-
* 2. global defaults from ~/.dreamux/config.
|
|
15
|
+
* 2. global defaults from ~/.dreamux/config.json (passed in as `defaults`)
|
|
16
16
|
* 3. hardcoded fallbacks (`'never'`, `'workspace-write'`, `[]`)
|
|
17
17
|
* Per the feat/global-config-dir work — see the global-config decision.
|
|
18
18
|
*
|
package/dist/runtime/config.js
CHANGED
|
@@ -1,33 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Global dreamux configuration loaded from `~/.dreamux/config.
|
|
2
|
+
* Global dreamux configuration loaded from `~/.dreamux/config.json`.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* `CODEX_HOST_CODEX_BIN`, every retry/timeout tuning was buried in
|
|
7
|
-
* source-level constants. This file is the user-editable surface for
|
|
8
|
-
* machine-wide defaults; per-dispatcher settings still override it, and
|
|
9
|
-
* the existing env vars still override everything (escape hatch for CI
|
|
10
|
-
* and one-off debug runs).
|
|
11
|
-
*
|
|
12
|
-
* Layout — separation of concerns:
|
|
13
|
-
* ~/.dreamux/ user-editable configuration (this module)
|
|
4
|
+
* Layout:
|
|
5
|
+
* ~/.dreamux/ user-editable dreamux configuration and channel secrets
|
|
14
6
|
* ~/.codex-host/ runtime data (SQLite, sockets, dispatcher logs)
|
|
15
|
-
* Mixing them was the original sin; keeping them apart is what makes a
|
|
16
|
-
* `rm -rf ~/.codex-host` recovery safe.
|
|
17
7
|
*
|
|
18
|
-
* Format:
|
|
19
|
-
* Parse failures fail-fast with the offending line.
|
|
8
|
+
* Format: JSON. dreamux does not write TOML files.
|
|
20
9
|
*/
|
|
21
10
|
import { homedir } from 'node:os';
|
|
22
11
|
import { dirname, isAbsolute, join } from 'node:path';
|
|
23
|
-
import { closeSync, mkdirSync, openSync, readFileSync, writeSync, } from 'node:fs';
|
|
24
|
-
import { parse as parseToml, TomlError } from 'smol-toml';
|
|
25
|
-
/**
|
|
26
|
-
* Built-in defaults — identical to what individual modules used before this
|
|
27
|
-
* config existed. Anything you change here is a behavior change for fresh
|
|
28
|
-
* installs (and only fresh installs; existing `~/.dreamux/config.toml`
|
|
29
|
-
* files are not touched on upgrade).
|
|
30
|
-
*/
|
|
12
|
+
import { closeSync, existsSync, mkdirSync, openSync, readFileSync, writeSync, } from 'node:fs';
|
|
31
13
|
export const BUILT_IN_DEFAULTS = {
|
|
32
14
|
runtime_dir: '~/.codex-host',
|
|
33
15
|
admin_socket: null,
|
|
@@ -42,150 +24,78 @@ export const BUILT_IN_DEFAULTS = {
|
|
|
42
24
|
retries: 3,
|
|
43
25
|
retry_delay_ms: 1000,
|
|
44
26
|
},
|
|
27
|
+
feishu: {
|
|
28
|
+
bots: {},
|
|
29
|
+
},
|
|
45
30
|
};
|
|
46
|
-
/**
|
|
47
|
-
* Codex 0.134 sandbox modes (from `codex --help`'s `-s, --sandbox` choices).
|
|
48
|
-
* Kept in sync with `codex-args.ts` (same allowlist enforced at the
|
|
49
|
-
* per-dispatcher level).
|
|
50
|
-
*/
|
|
51
31
|
export const ALLOWED_SANDBOX_MODES = new Set([
|
|
52
32
|
'read-only',
|
|
53
33
|
'workspace-write',
|
|
54
34
|
'danger-full-access',
|
|
55
35
|
]);
|
|
56
|
-
|
|
57
|
-
* The literal TOML text written on first boot. Comments are part of the
|
|
58
|
-
* UX — they tell an operator opening the file for the first time what
|
|
59
|
-
* each key means and where to read more.
|
|
60
|
-
*/
|
|
61
|
-
export const DEFAULT_CONFIG_TOML = `# dreamux global configuration (~/.dreamux/config.toml)
|
|
62
|
-
#
|
|
63
|
-
# Edit this file and restart \`dreamux serve\` to apply changes.
|
|
64
|
-
# Runtime data (SQLite, sockets, dispatcher logs) lives separately in
|
|
65
|
-
# \`runtime_dir\` below — this file holds only user-editable settings.
|
|
66
|
-
# See .agents/decisions/global-config-dir.md for the design rationale.
|
|
67
|
-
#
|
|
68
|
-
# Precedence (highest wins):
|
|
69
|
-
# 1. environment variables (CODEX_HOST_RUNTIME_DIR, CODEX_HOST_ADMIN_SOCKET,
|
|
70
|
-
# CODEX_HOST_CODEX_BIN) — escape hatch for CI and one-off debug runs
|
|
71
|
-
# 2. per-dispatcher fields (codex_args_json: approvalPolicy, extraArgs)
|
|
72
|
-
# 3. this file
|
|
73
|
-
# 4. built-in defaults baked into the binary
|
|
74
|
-
|
|
75
|
-
# Where dreamux stores runtime state (SQLite database, admin Unix socket,
|
|
76
|
-
# per-dispatcher Codex sockets and logs).
|
|
77
|
-
#
|
|
78
|
-
# \`~/\` is expanded to your home directory. Relative paths are not supported.
|
|
79
|
-
runtime_dir = "~/.codex-host"
|
|
80
|
-
|
|
81
|
-
# Admin Unix socket path. Leave commented to derive as <runtime_dir>/admin.sock.
|
|
82
|
-
# admin_socket = "~/.codex-host/admin.sock"
|
|
83
|
-
|
|
84
|
-
[codex]
|
|
85
|
-
# Path to the codex CLI. Bare name (\`codex\`) resolves via $PATH; an
|
|
86
|
-
# absolute path (\`/opt/codex/bin/codex\`) skips the lookup.
|
|
87
|
-
bin = "codex"
|
|
88
|
-
|
|
89
|
-
# Default approval policy applied to every dispatcher. A per-dispatcher
|
|
90
|
-
# \`codex_args_json\` (set via \`dreamux dispatcher add --codex-args-json ...\`)
|
|
91
|
-
# overrides this when present. Must be one of:
|
|
92
|
-
# never | auto | auto-approve | on-failure
|
|
93
|
-
# See issue #2 §"信任模型" for the trust-model implications of \`never\`.
|
|
94
|
-
approval_policy = "never"
|
|
95
|
-
|
|
96
|
-
# Default sandbox mode codex executes shell commands under. Per-dispatcher
|
|
97
|
-
# \`codex_args_json.sandboxMode\` overrides this when present.
|
|
98
|
-
# Must be one of:
|
|
99
|
-
# read-only — codex cannot write any files
|
|
100
|
-
# workspace-write — codex can write inside its cwd; recommended
|
|
101
|
-
# baseline for trusted-local
|
|
102
|
-
# danger-full-access — no sandbox; pair with approval_policy="never"
|
|
103
|
-
# only when codex must spawn helpers that chdir
|
|
104
|
-
# out of its cwd (e.g. tm dispatching into other
|
|
105
|
-
# worktrees). Trust model becomes equivalent to
|
|
106
|
-
# giving any allowed bot user shell access.
|
|
107
|
-
sandbox_mode = "workspace-write"
|
|
108
|
-
|
|
109
|
-
# Extra args appended to every codex app-server invocation. Per-dispatcher
|
|
110
|
-
# extra_args (in codex_args_json) are appended *after* these.
|
|
111
|
-
extra_args = []
|
|
112
|
-
|
|
113
|
-
# Handshake timeout. Without this, dreamux would hang forever on a codex
|
|
114
|
-
# that accepts the WebSocket upgrade but never replies to \`initialize\`
|
|
115
|
-
# (PR #5). 0 is not a valid value — set to a positive integer.
|
|
116
|
-
initialize_timeout_ms = 10000
|
|
117
|
-
|
|
118
|
-
[outbound]
|
|
119
|
-
# How many times to retry a failed Feishu send before parking the inbound
|
|
120
|
-
# row in \`outbound_failed\`. The Codex turn never re-runs on retry — only
|
|
121
|
-
# the outbound delivery is retried (PR #3 review #1).
|
|
122
|
-
retries = 3
|
|
123
|
-
|
|
124
|
-
# Initial delay between outbound retries (ms).
|
|
125
|
-
retry_delay_ms = 1000
|
|
126
|
-
`;
|
|
36
|
+
export const DEFAULT_CONFIG_JSON = `${JSON.stringify(BUILT_IN_DEFAULTS, null, 2)}\n`;
|
|
127
37
|
export function globalConfigDir(overrides = {}) {
|
|
128
38
|
if (overrides.configDir !== undefined)
|
|
129
39
|
return overrides.configDir;
|
|
130
40
|
return process.env['DREAMUX_CONFIG_DIR'] || join(homedir(), '.dreamux');
|
|
131
41
|
}
|
|
132
42
|
export function globalConfigFile(overrides = {}) {
|
|
43
|
+
return join(globalConfigDir(overrides), 'config.json');
|
|
44
|
+
}
|
|
45
|
+
export function legacyGlobalConfigFile(overrides = {}) {
|
|
133
46
|
return join(globalConfigDir(overrides), 'config.toml');
|
|
134
47
|
}
|
|
135
|
-
/**
|
|
136
|
-
* Load `<configDir>/config.toml`, creating it with default content on
|
|
137
|
-
* first boot. Throws with a file-line-pointing message when TOML parsing
|
|
138
|
-
* fails so the operator can fix the file without spelunking through
|
|
139
|
-
* libraries.
|
|
140
|
-
*
|
|
141
|
-
* Safe to call from `dreamux serve` on every boot — first call ensures
|
|
142
|
-
* the directory and file exist with sensible defaults; subsequent calls
|
|
143
|
-
* just read.
|
|
144
|
-
*
|
|
145
|
-
* PR #8 review #1: create the file with the atomic `wx` (O_CREAT|O_EXCL)
|
|
146
|
-
* flag, not check-then-write. Two server processes booting concurrently
|
|
147
|
-
* against the same `~/.dreamux/` would otherwise both see "file absent"
|
|
148
|
-
* and one would overwrite what the other wrote. Posix guarantees only
|
|
149
|
-
* one `wx` open wins; the loser gets EEXIST and falls through to the
|
|
150
|
-
* read path.
|
|
151
|
-
*/
|
|
152
48
|
export function loadOrInitConfig(overrides = {}) {
|
|
153
49
|
const file = globalConfigFile(overrides);
|
|
154
|
-
|
|
155
|
-
// but it can still legitimately fail (e.g. parent is unwritable). Let
|
|
156
|
-
// the EACCES propagate — the user needs to see it.
|
|
50
|
+
assertNoLegacyTomlOnly(overrides);
|
|
157
51
|
mkdirSync(dirname(file), { recursive: true });
|
|
158
|
-
const createdOnThisBoot = atomicWriteIfAbsent(file,
|
|
159
|
-
const
|
|
52
|
+
const createdOnThisBoot = atomicWriteIfAbsent(file, DEFAULT_CONFIG_JSON);
|
|
53
|
+
const config = readConfigFile(file);
|
|
54
|
+
return { config, configFile: file, createdOnThisBoot };
|
|
55
|
+
}
|
|
56
|
+
export function loadConfig(overrides = {}) {
|
|
57
|
+
const file = globalConfigFile(overrides);
|
|
58
|
+
assertNoLegacyTomlOnly(overrides);
|
|
59
|
+
return { config: readConfigFile(file), configFile: file };
|
|
60
|
+
}
|
|
61
|
+
export function stringifyConfig(config) {
|
|
62
|
+
return `${JSON.stringify(config, null, 2)}\n`;
|
|
63
|
+
}
|
|
64
|
+
export function redactConfigForDisplay(raw, file) {
|
|
160
65
|
let parsed;
|
|
161
66
|
try {
|
|
162
|
-
parsed =
|
|
67
|
+
parsed = JSON.parse(raw);
|
|
163
68
|
}
|
|
164
69
|
catch (err) {
|
|
165
|
-
|
|
70
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
71
|
+
throw new Error(`dreamux config parse error in ${file}: ${msg}\n` +
|
|
72
|
+
`Use 'dreamux config show --raw' to print the file without redaction.`);
|
|
166
73
|
}
|
|
167
|
-
|
|
168
|
-
return {
|
|
74
|
+
redactFeishuSecrets(parsed);
|
|
75
|
+
return `${JSON.stringify(parsed, null, 2)}\n`;
|
|
169
76
|
}
|
|
170
|
-
|
|
171
|
-
const file = globalConfigFile(overrides);
|
|
77
|
+
function readConfigFile(file) {
|
|
172
78
|
const raw = readFileSync(file, 'utf8');
|
|
173
79
|
let parsed;
|
|
174
80
|
try {
|
|
175
|
-
parsed =
|
|
81
|
+
parsed = JSON.parse(raw);
|
|
176
82
|
}
|
|
177
83
|
catch (err) {
|
|
178
|
-
|
|
84
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
85
|
+
throw new Error(`dreamux config parse error in ${file}: ${msg}\n` +
|
|
86
|
+
`Fix the JSON syntax in ${file} and restart, or delete the file to regenerate defaults.`);
|
|
179
87
|
}
|
|
180
|
-
return
|
|
88
|
+
return mergeWithDefaults(parsed, file);
|
|
89
|
+
}
|
|
90
|
+
export function assertNoLegacyTomlOnly(overrides = {}) {
|
|
91
|
+
const jsonFile = globalConfigFile(overrides);
|
|
92
|
+
const tomlFile = legacyGlobalConfigFile(overrides);
|
|
93
|
+
if (existsSync(jsonFile) || !existsSync(tomlFile))
|
|
94
|
+
return;
|
|
95
|
+
throw new Error(`legacy dreamux config detected at ${tomlFile}, but ${jsonFile} does not exist.\n` +
|
|
96
|
+
'dreamux no longer reads TOML config and will not create default JSON over an existing install, because that can hide the old runtime_dir and dispatcher database.\n' +
|
|
97
|
+
`Create ${jsonFile} manually from ${tomlFile}, then move ${tomlFile} aside. Preserve runtime_dir/admin_socket/codex/outbound settings and add feishu.bots entries for configured dispatchers.`);
|
|
181
98
|
}
|
|
182
|
-
/**
|
|
183
|
-
* Atomic create-if-absent. Returns true if this call created the file.
|
|
184
|
-
*
|
|
185
|
-
* Uses Node's `wx` flag, which maps to POSIX `open(O_CREAT | O_EXCL)`.
|
|
186
|
-
* Two processes racing the same path see exactly one EEXIST and exactly
|
|
187
|
-
* one success — no torn writes, no overwriting each other.
|
|
188
|
-
*/
|
|
189
99
|
function atomicWriteIfAbsent(file, content) {
|
|
190
100
|
let fd;
|
|
191
101
|
try {
|
|
@@ -204,38 +114,19 @@ function atomicWriteIfAbsent(file, content) {
|
|
|
204
114
|
}
|
|
205
115
|
return true;
|
|
206
116
|
}
|
|
207
|
-
function formatTomlError(err, file) {
|
|
208
|
-
if (err instanceof TomlError) {
|
|
209
|
-
const where = typeof err.line === 'number' && typeof err.column === 'number'
|
|
210
|
-
? `${file}:${err.line}:${err.column}`
|
|
211
|
-
: file;
|
|
212
|
-
return new Error(`dreamux config parse error at ${where}: ${err.message}\n` +
|
|
213
|
-
`Fix the TOML syntax in ${file} and restart, or delete the file to regenerate defaults.`);
|
|
214
|
-
}
|
|
215
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
216
|
-
return new Error(`dreamux config parse error in ${file}: ${msg}\n` +
|
|
217
|
-
`Fix the TOML syntax in ${file} and restart, or delete the file to regenerate defaults.`);
|
|
218
|
-
}
|
|
219
|
-
/**
|
|
220
|
-
* Merge user-supplied TOML object with built-in defaults. Unknown top-level
|
|
221
|
-
* keys are tolerated (forward-compat with newer config files); known keys
|
|
222
|
-
* are validated for type and (where relevant) value membership.
|
|
223
|
-
*/
|
|
224
117
|
function mergeWithDefaults(raw, file) {
|
|
225
|
-
if (
|
|
226
|
-
throw new Error(`dreamux config error in ${file}: top-level must be
|
|
118
|
+
if (!isPlainObject(raw)) {
|
|
119
|
+
throw new Error(`dreamux config error in ${file}: top-level must be an object`);
|
|
227
120
|
}
|
|
228
|
-
const
|
|
229
|
-
const
|
|
230
|
-
const
|
|
231
|
-
const runtime_dir = expandHome(requireString(
|
|
232
|
-
const admin_socket_raw =
|
|
121
|
+
const codexIn = isPlainObject(raw['codex']) ? raw['codex'] : {};
|
|
122
|
+
const outboundIn = isPlainObject(raw['outbound']) ? raw['outbound'] : {};
|
|
123
|
+
const feishuIn = isPlainObject(raw['feishu']) ? raw['feishu'] : {};
|
|
124
|
+
const runtime_dir = expandHome(requireString(raw, 'runtime_dir', BUILT_IN_DEFAULTS.runtime_dir, file));
|
|
125
|
+
const admin_socket_raw = raw['admin_socket'];
|
|
233
126
|
const admin_socket = admin_socket_raw === undefined || admin_socket_raw === null
|
|
234
127
|
? null
|
|
235
128
|
: expandHome(ensureString(admin_socket_raw, 'admin_socket', file));
|
|
236
129
|
const approval_policy = requireString(codexIn, 'approval_policy', BUILT_IN_DEFAULTS.codex.approval_policy, file, 'codex.');
|
|
237
|
-
// Validate approval_policy against the same allowlist as codex-args.ts.
|
|
238
|
-
// Keep the two in sync — see the Rush + pnpm decision / issue #2 §"信任模型".
|
|
239
130
|
const ALLOWED_POLICIES = new Set([
|
|
240
131
|
'never',
|
|
241
132
|
'auto',
|
|
@@ -251,10 +142,6 @@ function mergeWithDefaults(raw, file) {
|
|
|
251
142
|
throw new Error(`dreamux config error in ${file}: codex.sandbox_mode='${sandbox_mode}' ` +
|
|
252
143
|
`is not one of ${Array.from(ALLOWED_SANDBOX_MODES).join(' | ')}`);
|
|
253
144
|
}
|
|
254
|
-
const extra_args = requireStringArray(codexIn, 'extra_args', BUILT_IN_DEFAULTS.codex.extra_args, file, 'codex.');
|
|
255
|
-
const initialize_timeout_ms = requirePositiveInt(codexIn, 'initialize_timeout_ms', BUILT_IN_DEFAULTS.codex.initialize_timeout_ms, file, 'codex.');
|
|
256
|
-
const retries = requireNonNegativeInt(outboundIn, 'retries', BUILT_IN_DEFAULTS.outbound.retries, file, 'outbound.');
|
|
257
|
-
const retry_delay_ms = requireNonNegativeInt(outboundIn, 'retry_delay_ms', BUILT_IN_DEFAULTS.outbound.retry_delay_ms, file, 'outbound.');
|
|
258
145
|
return {
|
|
259
146
|
runtime_dir,
|
|
260
147
|
admin_socket,
|
|
@@ -262,12 +149,37 @@ function mergeWithDefaults(raw, file) {
|
|
|
262
149
|
bin: requireString(codexIn, 'bin', BUILT_IN_DEFAULTS.codex.bin, file, 'codex.'),
|
|
263
150
|
approval_policy,
|
|
264
151
|
sandbox_mode,
|
|
265
|
-
extra_args,
|
|
266
|
-
initialize_timeout_ms,
|
|
152
|
+
extra_args: requireStringArray(codexIn, 'extra_args', BUILT_IN_DEFAULTS.codex.extra_args, file, 'codex.'),
|
|
153
|
+
initialize_timeout_ms: requirePositiveInt(codexIn, 'initialize_timeout_ms', BUILT_IN_DEFAULTS.codex.initialize_timeout_ms, file, 'codex.'),
|
|
154
|
+
},
|
|
155
|
+
outbound: {
|
|
156
|
+
retries: requireNonNegativeInt(outboundIn, 'retries', BUILT_IN_DEFAULTS.outbound.retries, file, 'outbound.'),
|
|
157
|
+
retry_delay_ms: requireNonNegativeInt(outboundIn, 'retry_delay_ms', BUILT_IN_DEFAULTS.outbound.retry_delay_ms, file, 'outbound.'),
|
|
158
|
+
},
|
|
159
|
+
feishu: {
|
|
160
|
+
bots: readFeishuBots(feishuIn, file),
|
|
267
161
|
},
|
|
268
|
-
outbound: { retries, retry_delay_ms },
|
|
269
162
|
};
|
|
270
163
|
}
|
|
164
|
+
function readFeishuBots(feishuIn, file) {
|
|
165
|
+
const rawBots = feishuIn['bots'];
|
|
166
|
+
if (rawBots === undefined)
|
|
167
|
+
return {};
|
|
168
|
+
if (!isPlainObject(rawBots)) {
|
|
169
|
+
throw new Error(`dreamux config error in ${file}: feishu.bots must be an object (got ${describeType(rawBots)})`);
|
|
170
|
+
}
|
|
171
|
+
const bots = {};
|
|
172
|
+
for (const [id, rawBot] of Object.entries(rawBots)) {
|
|
173
|
+
if (!isPlainObject(rawBot)) {
|
|
174
|
+
throw new Error(`dreamux config error in ${file}: feishu.bots.${id} must be an object (got ${describeType(rawBot)})`);
|
|
175
|
+
}
|
|
176
|
+
bots[id] = {
|
|
177
|
+
app_id: requireString(rawBot, 'app_id', '', file, `feishu.bots.${id}.`),
|
|
178
|
+
app_secret: requireString(rawBot, 'app_secret', '', file, `feishu.bots.${id}.`),
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
return bots;
|
|
182
|
+
}
|
|
271
183
|
function isPlainObject(v) {
|
|
272
184
|
return v !== null && typeof v === 'object' && !Array.isArray(v);
|
|
273
185
|
}
|
|
@@ -319,19 +231,8 @@ function readInt(obj, key, file, prefix) {
|
|
|
319
231
|
const v = obj[key];
|
|
320
232
|
if (v === undefined)
|
|
321
233
|
return null;
|
|
322
|
-
|
|
323
|
-
if (typeof v === 'bigint') {
|
|
324
|
-
if (v < BigInt(Number.MIN_SAFE_INTEGER) || v > BigInt(Number.MAX_SAFE_INTEGER)) {
|
|
325
|
-
throw new Error(`dreamux config error in ${file}: ${prefix}${key}=${v} is outside safe integer range`);
|
|
326
|
-
}
|
|
327
|
-
return Number(v);
|
|
328
|
-
}
|
|
329
|
-
if (typeof v === 'number') {
|
|
330
|
-
if (!Number.isInteger(v)) {
|
|
331
|
-
throw new Error(`dreamux config error in ${file}: ${prefix}${key} must be an integer (got ${v})`);
|
|
332
|
-
}
|
|
234
|
+
if (typeof v === 'number' && Number.isInteger(v))
|
|
333
235
|
return v;
|
|
334
|
-
}
|
|
335
236
|
throw new Error(`dreamux config error in ${file}: ${prefix}${key} must be an integer (got ${describeType(v)})`);
|
|
336
237
|
}
|
|
337
238
|
function describeType(v) {
|
|
@@ -341,23 +242,28 @@ function describeType(v) {
|
|
|
341
242
|
return 'array';
|
|
342
243
|
return typeof v;
|
|
343
244
|
}
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
245
|
+
function redactFeishuSecrets(value) {
|
|
246
|
+
if (!isPlainObject(value))
|
|
247
|
+
return;
|
|
248
|
+
const feishu = value['feishu'];
|
|
249
|
+
if (!isPlainObject(feishu))
|
|
250
|
+
return;
|
|
251
|
+
const bots = feishu['bots'];
|
|
252
|
+
if (!isPlainObject(bots))
|
|
253
|
+
return;
|
|
254
|
+
for (const bot of Object.values(bots)) {
|
|
255
|
+
if (isPlainObject(bot) && typeof bot['app_secret'] === 'string') {
|
|
256
|
+
bot['app_secret'] = '<redacted>';
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
350
260
|
export function expandHome(path) {
|
|
351
261
|
if (path === '~')
|
|
352
262
|
return homedir();
|
|
353
263
|
if (path.startsWith('~/'))
|
|
354
264
|
return join(homedir(), path.slice(2));
|
|
355
|
-
if (!isAbsolute(path))
|
|
356
|
-
// Pass through; downstream consumers will error if they need an
|
|
357
|
-
// absolute path. (We considered erroring here, but bash-style configs
|
|
358
|
-
// sometimes use bare names that get resolved later.)
|
|
265
|
+
if (!isAbsolute(path))
|
|
359
266
|
return path;
|
|
360
|
-
}
|
|
361
267
|
return path;
|
|
362
268
|
}
|
|
363
269
|
//# sourceMappingURL=config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/runtime/config.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/runtime/config.ts"],"names":[],"mappings":"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"}
|