@excitedjs/dreamux 0.2.0 → 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.
Files changed (77) hide show
  1. package/README.md +155 -160
  2. package/bin/tm +30 -0
  3. package/dist/admin/client.js +98 -0
  4. package/dist/admin/client.js.map +1 -0
  5. package/dist/admin/methods.js +83 -38
  6. package/dist/admin/methods.js.map +1 -1
  7. package/dist/admin/socket.js +2 -2
  8. package/dist/admin/socket.js.map +1 -1
  9. package/dist/channel/feishu-gate.js +187 -18
  10. package/dist/channel/feishu-gate.js.map +1 -1
  11. package/dist/channel/feishu-message.js +92 -0
  12. package/dist/channel/feishu-message.js.map +1 -0
  13. package/dist/cli/doctor.js +53 -58
  14. package/dist/cli/doctor.js.map +1 -1
  15. package/dist/cli/dreamux.js +33 -51
  16. package/dist/cli/dreamux.js.map +1 -1
  17. package/dist/cli/server-ctl.js +6 -8
  18. package/dist/cli/server-ctl.js.map +1 -1
  19. package/dist/cli/server.js +22 -32
  20. package/dist/cli/server.js.map +1 -1
  21. package/dist/codex/events.js +3 -2
  22. package/dist/codex/events.js.map +1 -1
  23. package/dist/codex/mcp-config.js +24 -0
  24. package/dist/codex/mcp-config.js.map +1 -0
  25. package/dist/codex/supervisor.js +16 -0
  26. package/dist/codex/supervisor.js.map +1 -1
  27. package/dist/dispatcher/approval.js +2 -3
  28. package/dist/dispatcher/approval.js.map +1 -1
  29. package/dist/dispatcher/runtime.js +193 -141
  30. package/dist/dispatcher/runtime.js.map +1 -1
  31. package/dist/dispatcher/turn-manager.js +78 -97
  32. package/dist/dispatcher/turn-manager.js.map +1 -1
  33. package/dist/feishu/bot.js +71 -9
  34. package/dist/feishu/bot.js.map +1 -1
  35. package/dist/mcp/feishu-mcp.js +269 -0
  36. package/dist/mcp/feishu-mcp.js.map +1 -0
  37. package/dist/onboard/config-files.js +52 -22
  38. package/dist/onboard/config-files.js.map +1 -1
  39. package/dist/onboard/dispatcher-skill.js +18 -0
  40. package/dist/onboard/dispatcher-skill.js.map +1 -0
  41. package/dist/onboard/run.js +17 -50
  42. package/dist/onboard/run.js.map +1 -1
  43. package/dist/onboard/service.js +4 -8
  44. package/dist/onboard/service.js.map +1 -1
  45. package/dist/onboard/uninstall.js +47 -13
  46. package/dist/onboard/uninstall.js.map +1 -1
  47. package/dist/onboard/wizard.js +3 -27
  48. package/dist/onboard/wizard.js.map +1 -1
  49. package/dist/runtime/config.js +158 -64
  50. package/dist/runtime/config.js.map +1 -1
  51. package/dist/runtime/dispatcher-codex-home.js +14 -51
  52. package/dist/runtime/dispatcher-codex-home.js.map +1 -1
  53. package/dist/runtime/dispatcher-id.js +9 -0
  54. package/dist/runtime/dispatcher-id.js.map +1 -0
  55. package/dist/runtime/dispatcher-store.js +202 -0
  56. package/dist/runtime/dispatcher-store.js.map +1 -0
  57. package/dist/runtime/package-bin.js +41 -0
  58. package/dist/runtime/package-bin.js.map +1 -0
  59. package/dist/runtime/paths.js +82 -48
  60. package/dist/runtime/paths.js.map +1 -1
  61. package/dist/runtime/secrets.js +4 -3
  62. package/dist/runtime/secrets.js.map +1 -1
  63. package/dist/server.js +110 -36
  64. package/dist/server.js.map +1 -1
  65. package/package.json +6 -6
  66. package/skills/dispatcher/SKILL.md +107 -0
  67. package/db/migrations/0001_init.sql +0 -49
  68. package/dist/channel/outbound.js +0 -12
  69. package/dist/channel/outbound.js.map +0 -1
  70. package/dist/db/repository.js +0 -223
  71. package/dist/db/repository.js.map +0 -1
  72. package/dist/db/schema.js +0 -29
  73. package/dist/db/schema.js.map +0 -1
  74. package/dist/db/types.js +0 -2
  75. package/dist/db/types.js.map +0 -1
  76. package/dist/onboard/plugins.js +0 -202
  77. package/dist/onboard/plugins.js.map +0 -1
@@ -1,14 +1,17 @@
1
- import { existsSync, readFileSync, readdirSync, statSync, } from 'node:fs';
2
- import { basename, join, normalize, sep } from 'node:path';
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, dispatcherCodexPluginsDir, dispatcherSocketPath, } from './paths.js';
5
- export const DISPATCHER_APP_SERVER_SOCKET_PATH_MAX_BYTES = 103;
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
- pluginsDir: dispatcherCodexPluginsDir(dispatcherId),
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,10 +28,7 @@ export function validateDispatcherCodexHome(input, options = {}) {
25
28
  };
26
29
  const errors = [];
27
30
  const env = options.env ?? process.env;
28
- if (!existsSync(context.configPath)) {
29
- errors.push(`missing Codex config: ${context.configPath}`);
30
- }
31
- else {
31
+ if (existsSync(context.configPath)) {
32
32
  try {
33
33
  const parsed = parseToml(readFileSync(context.configPath, 'utf8'));
34
34
  if (!isRecord(parsed)) {
@@ -45,12 +45,12 @@ export function validateDispatcherCodexHome(input, options = {}) {
45
45
  if (isTmpPath(context.socketPath)) {
46
46
  errors.push(`dispatcher app-server socket must not be under /tmp: ${context.socketPath}`);
47
47
  }
48
- if (!socketPathFitsUnixLimit(context.socketPath)) {
48
+ if (!unixSocketPathFitsBudget(context.socketPath)) {
49
49
  const bytes = Buffer.byteLength(context.socketPath, 'utf8');
50
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}`);
51
51
  }
52
- if (!codexmuxPluginExists(context.pluginsDir)) {
53
- errors.push(`missing codexmux plugin under: ${context.pluginsDir}`);
52
+ if (!dispatcherSkillExists(context.skillPath)) {
53
+ errors.push(`missing dispatcher skill: ${context.skillPath}`);
54
54
  }
55
55
  if (!hasAuth(context.codexHome, env)) {
56
56
  errors.push(`missing Codex auth state in ${context.codexHome} or a supported auth environment variable`);
@@ -81,41 +81,8 @@ function formatTomlError(err, file) {
81
81
  const msg = err instanceof Error ? err.message : String(err);
82
82
  return `Codex config parse error in ${file}: ${msg}`;
83
83
  }
84
- function codexmuxPluginExists(root) {
85
- return hasPathSegment(root, 'codexmux', 5);
86
- }
87
- function hasPathSegment(root, segment, maxDepth) {
88
- if (!existsSync(root))
89
- return false;
90
- const stack = [{ path: root, depth: 0 }];
91
- while (stack.length > 0) {
92
- const current = stack.pop();
93
- if (current === undefined)
94
- continue;
95
- if (basename(current.path) === segment)
96
- return true;
97
- if (current.depth >= maxDepth)
98
- continue;
99
- let entries;
100
- try {
101
- entries = readdirSync(current.path);
102
- }
103
- catch {
104
- continue;
105
- }
106
- for (const entry of entries) {
107
- const child = join(current.path, entry);
108
- try {
109
- if (statSync(child).isDirectory()) {
110
- stack.push({ path: child, depth: current.depth + 1 });
111
- }
112
- }
113
- catch {
114
- /* ignore transient filesystem races */
115
- }
116
- }
117
- }
118
- return false;
84
+ function dispatcherSkillExists(skillPath) {
85
+ return existsSync(skillPath);
119
86
  }
120
87
  function hasAuth(codexHome, env) {
121
88
  if (existsSync(join(codexHome, 'auth.json')))
@@ -125,10 +92,6 @@ function hasAuth(codexHome, env) {
125
92
  return value !== undefined && value.trim() !== '';
126
93
  });
127
94
  }
128
- function socketPathFitsUnixLimit(path) {
129
- return (Buffer.byteLength(path, 'utf8') <=
130
- DISPATCHER_APP_SERVER_SOCKET_PATH_MAX_BYTES);
131
- }
132
95
  function isTmpPath(path) {
133
96
  const normalized = normalize(path);
134
97
  return normalized === '/tmp' || normalized.startsWith(`/tmp${sep}`);
@@ -1 +1 @@
1
- {"version":3,"file":"dispatcher-codex-home.js","sourceRoot":"","sources":["../../src/runtime/dispatcher-codex-home.ts"],"names":[],"mappings":"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"}
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"}
@@ -1,36 +1,34 @@
1
1
  /**
2
- * Filesystem layout for the codex-host server runtime.
2
+ * Filesystem layout for dreamux-owned runtime state and logs.
3
3
  *
4
- * Default root: ~/.codex-host/ (override via env CODEX_HOST_RUNTIME_DIR
5
- * or `runtime_dir` in ~/.dreamux/config.json — env wins, see config.ts).
6
- * Layout:
7
- * <root>/
8
- * state.db SQLite database (dispatchers + inbound_buffer)
9
- * admin.sock server-ctl admin Unix socket
10
- * dispatchers/<id>/
11
- * app-server-control/ Codex app-server control sockets
12
- * stdout.log Codex stdout
13
- * stderr.log Codex stderr (load-bearing for debug)
4
+ * Effective MVP layout:
5
+ * ~/.dreamux/
6
+ * state/
7
+ * server.json
8
+ * admin.sock
9
+ * <dispatcher-id>/
10
+ * status.json
11
+ * access.json
12
+ * codex.sock Codex app-server Unix socket
13
+ * logs/
14
+ * dreamux-server.log
15
+ * codex-app-server/
16
+ * <dispatcher-id>.log
14
17
  *
15
- * Dispatchers intentionally inherit the operator's existing CODEX_HOME (or
16
- * Codex's own default when the env var is unset). Runtime/socket/log/db state
17
- * is still owned by dreamux under runtimeRoot(). Dispatcher cwd is configured
18
- * during onboard and stored on the dispatcher row; dispatcherCodexCwd() exists
19
- * only as a legacy fallback.
20
- *
21
- * Issue ~/.dreamux/ config (feat/global-config-dir): paths.* functions
22
- * read an optionally-injected `DreamuxConfig` snapshot for non-env
23
- * defaults. Server.start() calls setRuntimeConfig() once at boot; bare
24
- * tests / standalone callers fall back to the built-in defaults.
18
+ * `runtime_dir` is not an effective runtime contract. The legacy runtimeRoot()
19
+ * function remains as a compatibility alias for stateRoot() while older call
20
+ * sites are retired.
25
21
  */
26
22
  import { homedir } from 'node:os';
27
23
  import { join } from 'node:path';
28
- import { BUILT_IN_DEFAULTS, expandHome, } from './config.js';
24
+ import { BUILT_IN_DEFAULTS, } from './config.js';
25
+ import { validateDispatcherId } from './dispatcher-id.js';
26
+ export const DREAMUX_UNIX_SOCKET_PATH_MAX_BYTES = 103;
29
27
  let currentConfig = BUILT_IN_DEFAULTS;
30
28
  /**
31
29
  * Set the active configuration snapshot. Called once by Server.start() with
32
- * the result of loadOrInitConfig(); tests can call it to inject a custom
33
- * snapshot. Idempotent.
30
+ * the result of loadConfig(); tests can call it to inject a custom snapshot.
31
+ * Idempotent.
34
32
  */
35
33
  export function setRuntimeConfig(config) {
36
34
  currentConfig = config;
@@ -42,34 +40,34 @@ export function resetRuntimeConfig() {
42
40
  export function getRuntimeConfig() {
43
41
  return currentConfig;
44
42
  }
45
- export function runtimeRoot() {
46
- const fromEnv = process.env['CODEX_HOST_RUNTIME_DIR'];
47
- if (fromEnv !== undefined && fromEnv !== '')
48
- return fromEnv;
49
- return expandHome(currentConfig.runtime_dir) || join(homedir(), '.codex-host');
43
+ export function dreamuxRoot() {
44
+ return join(homedir(), '.dreamux');
45
+ }
46
+ export function stateRoot() {
47
+ return join(dreamuxRoot(), 'state');
48
+ }
49
+ export function serverJsonPath() {
50
+ return join(stateRoot(), 'server.json');
51
+ }
52
+ export function logsRoot() {
53
+ return join(dreamuxRoot(), 'logs');
50
54
  }
51
- export function databasePath() {
52
- return join(runtimeRoot(), 'state.db');
55
+ /**
56
+ * Legacy compatibility alias. New code should call stateRoot().
57
+ */
58
+ export function runtimeRoot() {
59
+ return stateRoot();
53
60
  }
54
61
  export function adminSocketPath() {
55
- const fromEnv = process.env['CODEX_HOST_ADMIN_SOCKET'];
56
- if (fromEnv !== undefined && fromEnv !== '')
57
- return fromEnv;
58
- if (currentConfig.admin_socket !== null) {
59
- return expandHome(currentConfig.admin_socket);
60
- }
61
- return join(runtimeRoot(), 'admin.sock');
62
+ return assertUnixSocketPathBudget(join(stateRoot(), 'admin.sock'), 'admin socket path');
62
63
  }
63
64
  export function dispatcherDir(id) {
64
- return join(runtimeRoot(), 'dispatchers', id);
65
+ return join(stateRoot(), dispatcherPathSegment(id));
65
66
  }
66
67
  export function dispatcherCodexCwd(id) {
67
68
  return join(dispatcherDir(id), 'cwd');
68
69
  }
69
70
  export function operatorCodexHome() {
70
- const fromEnv = process.env['CODEX_HOME'];
71
- if (fromEnv !== undefined && fromEnv !== '')
72
- return fromEnv;
73
71
  return join(homedir(), '.codex');
74
72
  }
75
73
  export function dispatcherCodexHome(id) {
@@ -79,19 +77,55 @@ export function dispatcherCodexHome(id) {
79
77
  export function dispatcherCodexConfigPath(id) {
80
78
  return join(dispatcherCodexHome(id), 'config.toml');
81
79
  }
82
- export function dispatcherCodexPluginsDir(id) {
83
- return join(dispatcherCodexHome(id), 'plugins');
80
+ export function dispatcherWorkspaceCodexSkillsDir(cwd) {
81
+ return join(cwd, '.codex', 'skills');
82
+ }
83
+ export function dispatcherWorkspaceSkillPath(cwd) {
84
+ return join(dispatcherWorkspaceCodexSkillsDir(cwd), 'dispatcher', 'SKILL.md');
84
85
  }
85
86
  export function dispatcherAppServerControlDir(id) {
86
- return join(dispatcherDir(id), 'app-server-control');
87
+ return dispatcherDir(id);
87
88
  }
88
89
  export function dispatcherSocketPath(id) {
89
- return join(dispatcherAppServerControlDir(id), 'as.sock');
90
+ return assertUnixSocketPathBudget(join(dispatcherDir(id), 'codex.sock'), `dispatcher '${id}' Codex socket path`);
90
91
  }
91
92
  export function dispatcherStdoutLog(id) {
92
- return join(dispatcherDir(id), 'stdout.log');
93
+ return dispatcherCodexAppServerLogPath(id);
93
94
  }
94
95
  export function dispatcherStderrLog(id) {
95
- return join(dispatcherDir(id), 'stderr.log');
96
+ return dispatcherCodexAppServerErrorLogPath(id);
97
+ }
98
+ export function serverLogPath() {
99
+ return join(logsRoot(), 'dreamux-server.log');
100
+ }
101
+ export function codexAppServerLogDir() {
102
+ return join(logsRoot(), 'codex-app-server');
103
+ }
104
+ export function feishuChannelLogDir() {
105
+ return join(logsRoot(), 'feishu-channel');
106
+ }
107
+ export function dispatcherCodexAppServerLogPath(id) {
108
+ return join(codexAppServerLogDir(), `${dispatcherPathSegment(id)}.log`);
109
+ }
110
+ export function dispatcherCodexAppServerErrorLogPath(id) {
111
+ return join(codexAppServerLogDir(), `${dispatcherPathSegment(id)}.stderr.log`);
112
+ }
113
+ export function dispatcherStatusPath(id) {
114
+ return join(dispatcherDir(id), 'status.json');
115
+ }
116
+ export function dispatcherAccessPath(id) {
117
+ return join(dispatcherDir(id), 'access.json');
118
+ }
119
+ export function unixSocketPathFitsBudget(path) {
120
+ return Buffer.byteLength(path, 'utf8') <= DREAMUX_UNIX_SOCKET_PATH_MAX_BYTES;
121
+ }
122
+ export function assertUnixSocketPathBudget(path, label) {
123
+ if (unixSocketPathFitsBudget(path))
124
+ return path;
125
+ const bytes = Buffer.byteLength(path, 'utf8');
126
+ throw new Error(`${label} is too long for Unix sockets (${bytes} bytes > ${DREAMUX_UNIX_SOCKET_PATH_MAX_BYTES} safe bytes): ${path}`);
127
+ }
128
+ export function dispatcherPathSegment(id) {
129
+ return validateDispatcherId(id);
96
130
  }
97
131
  //# sourceMappingURL=paths.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/runtime/paths.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/runtime/paths.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EACL,iBAAiB,GAElB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE1D,MAAM,CAAC,MAAM,kCAAkC,GAAG,GAAG,CAAC;AAEtD,IAAI,aAAa,GAAkB,iBAAiB,CAAC;AAErD;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAqB;IACpD,aAAa,GAAG,MAAM,CAAC;AACzB,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,kBAAkB;IAChC,aAAa,GAAG,iBAAiB,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,IAAI,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,CAAC,SAAS,EAAE,EAAE,aAAa,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,OAAO,IAAI,CAAC,WAAW,EAAE,EAAE,MAAM,CAAC,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,SAAS,EAAE,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,0BAA0B,CAC/B,IAAI,CAAC,SAAS,EAAE,EAAE,YAAY,CAAC,EAC/B,mBAAmB,CACpB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,EAAU;IACtC,OAAO,IAAI,CAAC,SAAS,EAAE,EAAE,qBAAqB,CAAC,EAAE,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,EAAU;IAC3C,OAAO,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,EAAU;IAC5C,KAAK,EAAE,CAAC;IACR,OAAO,iBAAiB,EAAE,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,EAAU;IAClD,OAAO,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC,EAAE,aAAa,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,iCAAiC,CAAC,GAAW;IAC3D,OAAO,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,GAAW;IACtD,OAAO,IAAI,CAAC,iCAAiC,CAAC,GAAG,CAAC,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,EAAU;IACtD,OAAO,aAAa,CAAC,EAAE,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,EAAU;IAC7C,OAAO,0BAA0B,CAC/B,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC,EACrC,eAAe,EAAE,qBAAqB,CACvC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,EAAU;IAC5C,OAAO,+BAA+B,CAAC,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,EAAU;IAC5C,OAAO,oCAAoC,CAAC,EAAE,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,IAAI,CAAC,QAAQ,EAAE,EAAE,oBAAoB,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,IAAI,CAAC,QAAQ,EAAE,EAAE,kBAAkB,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO,IAAI,CAAC,QAAQ,EAAE,EAAE,gBAAgB,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,EAAU;IACxD,OAAO,IAAI,CAAC,oBAAoB,EAAE,EAAE,GAAG,qBAAqB,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,oCAAoC,CAAC,EAAU;IAC7D,OAAO,IAAI,CAAC,oBAAoB,EAAE,EAAE,GAAG,qBAAqB,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC;AACjF,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,EAAU;IAC7C,OAAO,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,EAAE,aAAa,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,EAAU;IAC7C,OAAO,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,EAAE,aAAa,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,IAAY;IACnD,OAAO,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,kCAAkC,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,IAAY,EAAE,KAAa;IACpE,IAAI,wBAAwB,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAChD,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC9C,MAAM,IAAI,KAAK,CACb,GAAG,KAAK,kCAAkC,KAAK,YAAY,kCAAkC,iBAAiB,IAAI,EAAE,CACrH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,EAAU;IAC9C,OAAO,oBAAoB,CAAC,EAAE,CAAC,CAAC;AAClC,CAAC"}
@@ -1,11 +1,12 @@
1
1
  export function resolveBotSecret(ref, config) {
2
2
  if (ref.startsWith('config:')) {
3
3
  const dispatcherId = ref.slice('config:'.length);
4
- const bot = config.feishu.bots[dispatcherId];
5
- if (bot === undefined || bot.app_secret.trim() === '') {
4
+ const dispatcher = config.dispatchers.find((item) => item.id === dispatcherId);
5
+ if (dispatcher === undefined ||
6
+ dispatcher.feishu.app_secret.trim() === '') {
6
7
  throw new Error(`missing Feishu app_secret in dreamux config for bot_secret_ref=${ref}`);
7
8
  }
8
- return bot.app_secret;
9
+ return dispatcher.feishu.app_secret;
9
10
  }
10
11
  if (ref.startsWith('env:')) {
11
12
  const varName = ref.slice('env:'.length);
@@ -1 +1 @@
1
- {"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/runtime/secrets.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,gBAAgB,CAAC,GAAW,EAAE,MAAqB;IACjE,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACjD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC7C,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CACb,kEAAkE,GAAG,EAAE,CACxE,CAAC;QACJ,CAAC;QACD,OAAO,GAAG,CAAC,UAAU,CAAC;IACxB,CAAC;IAED,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACnC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CACb,uBAAuB,OAAO,8CAA8C,GAAG,GAAG,CACnF,CAAC;QACJ,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,IAAI,KAAK,CACb,sCAAsC,GAAG,8BAA8B,CACxE,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/runtime/secrets.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,gBAAgB,CAAC,GAAW,EAAE,MAAqB;IACjE,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACjD,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,YAAY,CAAC,CAAC;QAC/E,IACE,UAAU,KAAK,SAAS;YACxB,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,EAC1C,CAAC;YACD,MAAM,IAAI,KAAK,CACb,kEAAkE,GAAG,EAAE,CACxE,CAAC;QACJ,CAAC;QACD,OAAO,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC;IACtC,CAAC;IAED,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACnC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CACb,uBAAuB,OAAO,8CAA8C,GAAG,GAAG,CACnF,CAAC;QACJ,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,IAAI,KAAK,CACb,sCAAsC,GAAG,8BAA8B,CACxE,CAAC;AACJ,CAAC"}