@excitedjs/dreamux 0.13.0 → 0.14.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/CHANGELOG.json +41 -0
- package/CHANGELOG.md +16 -1
- package/README.md +7 -4
- package/dist/admin/methods.js +86 -61
- package/dist/admin/methods.js.map +1 -1
- package/dist/admin/socket.js +31 -0
- package/dist/admin/socket.js.map +1 -1
- package/dist/agent-runtime/builtin/claude-code/runtime.js +8 -3
- package/dist/agent-runtime/builtin/claude-code/runtime.js.map +1 -1
- package/dist/agent-runtime/builtin/claude-code/supervisor.js +5 -0
- package/dist/agent-runtime/builtin/claude-code/supervisor.js.map +1 -1
- package/dist/agent-runtime/builtin/codex/codex-home.js +2 -3
- package/dist/agent-runtime/builtin/codex/codex-home.js.map +1 -1
- package/dist/agent-runtime/builtin/codex/paths.js +16 -62
- package/dist/agent-runtime/builtin/codex/paths.js.map +1 -1
- package/dist/agent-runtime/builtin/codex/runtime-support.js +4 -3
- package/dist/agent-runtime/builtin/codex/runtime-support.js.map +1 -1
- package/dist/agent-runtime/builtin/codex/runtime.js +5 -6
- package/dist/agent-runtime/builtin/codex/runtime.js.map +1 -1
- package/dist/agent-runtime/builtin/codex/supervisor.js +11 -1
- package/dist/agent-runtime/builtin/codex/supervisor.js.map +1 -1
- package/dist/agent-runtime/completion-body.js +14 -9
- package/dist/agent-runtime/completion-body.js.map +1 -1
- package/dist/channel/feishu/bot.js +0 -18
- package/dist/channel/feishu/bot.js.map +1 -1
- package/dist/channel/feishu/feishu-message.js +9 -2
- package/dist/channel/feishu/feishu-message.js.map +1 -1
- package/dist/cli/doctor.js +23 -0
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/dreamux.js +1 -1
- package/dist/cli/dreamux.js.map +1 -1
- package/dist/cli/server-ctl.js +2 -2
- package/dist/cli/server.js +9 -4
- package/dist/cli/server.js.map +1 -1
- package/dist/daemon/restart-intent.js +7 -2
- package/dist/daemon/restart-intent.js.map +1 -1
- package/dist/dispatcher-service/dispatcher/base-prompt.js +4 -4
- package/dist/dispatcher-service/dispatcher/base-prompt.js.map +1 -1
- package/dist/dispatcher-service/dispatcher/service.js +7 -10
- package/dist/dispatcher-service/dispatcher/service.js.map +1 -1
- package/dist/dispatcher-service/dispatcher-workspace.js +108 -0
- package/dist/dispatcher-service/dispatcher-workspace.js.map +1 -0
- package/dist/dispatcher-service/service.js +5 -12
- package/dist/dispatcher-service/service.js.map +1 -1
- package/dist/dispatcher-service/team/service.js +214 -65
- package/dist/dispatcher-service/team/service.js.map +1 -1
- package/dist/dispatcher-service/team/store.js +6 -0
- package/dist/dispatcher-service/team/store.js.map +1 -1
- package/dist/dispatcher-service/team/types.js.map +1 -1
- package/dist/dispatcher-service/teammate/identity-store.js +11 -77
- package/dist/dispatcher-service/teammate/identity-store.js.map +1 -1
- package/dist/dispatcher-service/teammate/name-allocator.js +86 -0
- package/dist/dispatcher-service/teammate/name-allocator.js.map +1 -0
- package/dist/dispatcher-service/teammate/runtime-state.js +26 -8
- package/dist/dispatcher-service/teammate/runtime-state.js.map +1 -1
- package/dist/dispatcher-service/teammate/service.js +365 -113
- package/dist/dispatcher-service/teammate/service.js.map +1 -1
- package/dist/dispatcher-service/teammate/session-ledger.js +306 -0
- package/dist/dispatcher-service/teammate/session-ledger.js.map +1 -0
- package/dist/dispatcher-service/teammate/types.js +14 -0
- package/dist/dispatcher-service/teammate/types.js.map +1 -1
- package/dist/dispatcher-service/teammate/worktree-manager.js +74 -4
- package/dist/dispatcher-service/teammate/worktree-manager.js.map +1 -1
- package/dist/dispatcher-service/teammate/worktree-paths.js +53 -0
- package/dist/dispatcher-service/teammate/worktree-paths.js.map +1 -0
- package/dist/mcp/team-mcp.js +86 -75
- package/dist/mcp/team-mcp.js.map +1 -1
- package/dist/mcp/teammate-mcp.js +32 -25
- package/dist/mcp/teammate-mcp.js.map +1 -1
- package/dist/onboard/run.js +3 -3
- package/dist/onboard/run.js.map +1 -1
- package/dist/onboard/uninstall.js +7 -1
- package/dist/onboard/uninstall.js.map +1 -1
- package/dist/platform/logs.js +32 -0
- package/dist/platform/logs.js.map +1 -0
- package/dist/platform/owner-only-dir.js +37 -0
- package/dist/platform/owner-only-dir.js.map +1 -0
- package/dist/platform/paths.js +130 -33
- package/dist/platform/paths.js.map +1 -1
- package/dist/platform/runtime-sockets.js +127 -0
- package/dist/platform/runtime-sockets.js.map +1 -0
- package/dist/server.js +47 -1
- package/dist/server.js.map +1 -1
- package/package.json +1 -1
- package/skills/dispatcher/SKILL.md +62 -38
- package/skills/dispatcher/references/dispatch-task.md +3 -3
- package/skills/dispatcher/references/inspect-and-resume.md +5 -3
- package/skills/dreamux-maintenance/SKILL.md +21 -0
package/dist/onboard/run.js
CHANGED
|
@@ -2,8 +2,8 @@ import { access } from 'node:fs/promises';
|
|
|
2
2
|
import { codexArgsToCli, parseCodexArgs } from '../agent-runtime/builtin/codex/args.js';
|
|
3
3
|
import { assertNoLegacyTomlOnly, globalConfigFile, stringifyConfig, } from '../config/config.js';
|
|
4
4
|
import { loadConfigWithBuiltins } from '../agent-runtime/load-config.js';
|
|
5
|
-
import { logsRoot, setRuntimeConfig, stateRoot, } from '../platform/paths.js';
|
|
6
|
-
import {
|
|
5
|
+
import { dispatcherDir, logsRoot, setRuntimeConfig, stateRoot, } from '../platform/paths.js';
|
|
6
|
+
import { dispatcherCodexHome, dispatcherWorkspaceCodexSkillsDir, } from '../agent-runtime/builtin/codex/paths.js';
|
|
7
7
|
import { dispatcherCodexHomeDoctorContext, validateDispatcherCodexHome, } from '../agent-runtime/builtin/codex/codex-home.js';
|
|
8
8
|
import { ExecaCommandRunner } from './commands.js';
|
|
9
9
|
import { dispatcherCodexArgsJson, dreamuxConfigFromAnswers, } from './config-files.js';
|
|
@@ -60,7 +60,7 @@ export async function runOnboard(options) {
|
|
|
60
60
|
await ensureDirectory(codexHome, ledger, 'global Codex home', {
|
|
61
61
|
dryRun: answers.dryRun,
|
|
62
62
|
});
|
|
63
|
-
await ensureDirectory(
|
|
63
|
+
await ensureDirectory(dispatcherDir(answers.dispatcherId), ledger, 'dispatcher state directory', { dryRun: answers.dryRun });
|
|
64
64
|
await ensureDirectory(effectiveAnswers.dispatcherCwd, ledger, 'dispatcher cwd', { dryRun: answers.dryRun });
|
|
65
65
|
await ensureDirectory(dispatcherWorkspaceCodexSkillsDir(effectiveAnswers.dispatcherCwd), ledger, 'workspace-local Codex skills directory', { dryRun: answers.dryRun });
|
|
66
66
|
await installDispatcherSkill({
|
package/dist/onboard/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/onboard/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AACxF,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EACL,QAAQ,EACR,gBAAgB,EAChB,SAAS,GACV,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/onboard/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,7 +15,7 @@ import { ExecaCommandRunner } from './commands.js';
|
|
|
15
15
|
import { removeUserService } from './service.js';
|
|
16
16
|
import { assertNoLegacyTomlOnly, expandHome, globalConfigDir, globalConfigFile, } from '../config/config.js';
|
|
17
17
|
import { loadConfigWithBuiltins } from '../agent-runtime/load-config.js';
|
|
18
|
-
import { logsRoot, stateRoot } from '../platform/paths.js';
|
|
18
|
+
import { cacheRoot, logsRoot, runRoot, stateRoot } from '../platform/paths.js';
|
|
19
19
|
import { dispatcherWorkspaceSkillDirs } from '../agent-runtime/builtin/codex/paths.js';
|
|
20
20
|
export async function runUninstall(options = {}) {
|
|
21
21
|
const runner = options.runner ?? new ExecaCommandRunner();
|
|
@@ -25,8 +25,12 @@ export async function runUninstall(options = {}) {
|
|
|
25
25
|
const warnings = [];
|
|
26
26
|
await warnIfConfigIsNotReadable(configDir, warnings);
|
|
27
27
|
const stateDir = normalizePath(stateRoot());
|
|
28
|
+
const runDir = normalizePath(runRoot());
|
|
29
|
+
const cacheDir = normalizePath(cacheRoot());
|
|
28
30
|
const logDir = normalizePath(logsRoot());
|
|
29
31
|
assertSafeOwnedDirectory(stateDir, 'dreamux state directory');
|
|
32
|
+
assertSafeOwnedDirectory(runDir, 'dreamux run directory');
|
|
33
|
+
assertSafeOwnedDirectory(cacheDir, 'dreamux cache directory');
|
|
30
34
|
assertSafeOwnedDirectory(logDir, 'dreamux logs directory');
|
|
31
35
|
assertSafeOwnedDirectory(configDir, 'dreamux config directory');
|
|
32
36
|
const workspaceSkillPaths = await collectWorkspaceSkillPaths(configDir);
|
|
@@ -45,6 +49,8 @@ export async function runUninstall(options = {}) {
|
|
|
45
49
|
});
|
|
46
50
|
await reportWorkspaceSkills(workspaceSkillPaths, entries);
|
|
47
51
|
await removeOwnedDirectory(stateDir, entries, 'dreamux state directory', dryRun);
|
|
52
|
+
await removeOwnedDirectory(runDir, entries, 'dreamux run directory', dryRun);
|
|
53
|
+
await removeOwnedDirectory(cacheDir, entries, 'dreamux cache directory', dryRun);
|
|
48
54
|
await removeOwnedDirectory(logDir, entries, 'dreamux logs directory', dryRun);
|
|
49
55
|
await removeOwnedDirectory(configDir, entries, 'dreamux config directory', dryRun);
|
|
50
56
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/onboard/uninstall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAEzD,4EAA4E;AAC5E,KAAK,UAAU,UAAU,CAAC,IAAY;IACpC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,OAAO,EACL,sBAAsB,EACtB,UAAU,EACV,eAAe,EACf,gBAAgB,GAEjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/onboard/uninstall.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Log-file hygiene helpers (issue #182 logs stage).
|
|
3
|
+
*
|
|
4
|
+
* Runtime child stdout/stderr logs are opened eagerly as inherited fds before
|
|
5
|
+
* the child produces any output (the supervisor must hand the child a valid fd
|
|
6
|
+
* at spawn time, so they cannot be created lazily). Normal Codex traffic flows
|
|
7
|
+
* over the Unix socket and normal Claude Code traffic over the resident stream,
|
|
8
|
+
* so these files mostly stay empty and would otherwise accumulate one zero-byte
|
|
9
|
+
* file per runtime start. After a clean child shutdown the owning supervisor
|
|
10
|
+
* calls {@link removeEmptyLogFile} on each child log path to drop the empties
|
|
11
|
+
* while keeping any file that actually captured startup/crash output.
|
|
12
|
+
*
|
|
13
|
+
* This is per-child self-cleanup of files this process created — NOT age-based
|
|
14
|
+
* pruning of the operator's accumulated logs, which #182 keeps manual.
|
|
15
|
+
*/
|
|
16
|
+
import { stat, unlink } from 'node:fs/promises';
|
|
17
|
+
/**
|
|
18
|
+
* Remove `path` only if it exists and is zero bytes. Best-effort: a missing
|
|
19
|
+
* file, a non-empty file, or any IO error leaves things untouched and never
|
|
20
|
+
* throws, so teardown is never blocked by log hygiene.
|
|
21
|
+
*/
|
|
22
|
+
export async function removeEmptyLogFile(path) {
|
|
23
|
+
try {
|
|
24
|
+
const info = await stat(path);
|
|
25
|
+
if (info.size === 0)
|
|
26
|
+
await unlink(path);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
/* best effort — missing/busy/non-empty files are left as-is */
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=logs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/platform/logs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAEhD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAY;IACnD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC;YAAE,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,+DAA+D;IACjE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Owner-only directory enforcement for Dreamux-owned runtime dirs (issue #182).
|
|
3
|
+
*
|
|
4
|
+
* `mkdir(path, { mode: 0o700, recursive: true })` only applies the mode to
|
|
5
|
+
* directories it actually creates; a *pre-existing* dir keeps whatever
|
|
6
|
+
* permissions it already had. So a Dreamux run/socket dir left over from an
|
|
7
|
+
* older version (or created by something else with a permissive umask) would
|
|
8
|
+
* silently host private control sockets and lock files under a world- or
|
|
9
|
+
* group-traversable parent. This helper adopts the dir and guarantees the
|
|
10
|
+
* privacy invariant regardless of who created it:
|
|
11
|
+
*
|
|
12
|
+
* - reject a symlink at the leaf (a pre-planted symlink could redirect our
|
|
13
|
+
* private files outside the owner-only tree);
|
|
14
|
+
* - fail loud if the dir is owned by another uid (someone else's directory on
|
|
15
|
+
* our path — never silently trust it);
|
|
16
|
+
* - tighten to 0700 if any group/other permission bit is set.
|
|
17
|
+
*
|
|
18
|
+
* Detection + tightening of our own dir only — it never touches operator-owned
|
|
19
|
+
* parents (e.g. `$XDG_RUNTIME_DIR` itself), which are not passed here.
|
|
20
|
+
*/
|
|
21
|
+
import { chmod, lstat, mkdir } from 'node:fs/promises';
|
|
22
|
+
export async function ensureOwnerOnlyDir(path, options = {}) {
|
|
23
|
+
await mkdir(path, { recursive: true, mode: 0o700 });
|
|
24
|
+
const info = await lstat(path);
|
|
25
|
+
if (info.isSymbolicLink()) {
|
|
26
|
+
throw new Error(`refusing to use Dreamux runtime directory ${path}: it is a symlink, not a real directory`);
|
|
27
|
+
}
|
|
28
|
+
const getuid = options.getuid ?? process.getuid?.bind(process);
|
|
29
|
+
if (getuid !== undefined && info.uid !== getuid()) {
|
|
30
|
+
throw new Error(`refusing to use Dreamux runtime directory ${path}: it is owned by uid ${info.uid}, ` +
|
|
31
|
+
`not the current user (uid ${getuid()})`);
|
|
32
|
+
}
|
|
33
|
+
if ((info.mode & 0o077) !== 0) {
|
|
34
|
+
await chmod(path, 0o700);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=owner-only-dir.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"owner-only-dir.js","sourceRoot":"","sources":["../../src/platform/owner-only-dir.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAYvD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,IAAY,EACZ,UAAqC,EAAE;IAEvC,MAAM,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,6CAA6C,IAAI,yCAAyC,CAC3F,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/D,IAAI,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,KAAK,MAAM,EAAE,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CACb,6CAA6C,IAAI,wBAAwB,IAAI,CAAC,GAAG,IAAI;YACnF,6BAA6B,MAAM,EAAE,GAAG,CAC3C,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC"}
|
package/dist/platform/paths.js
CHANGED
|
@@ -1,26 +1,33 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Filesystem layout for dreamux-owned runtime state and
|
|
2
|
+
* Filesystem layout for dreamux-owned runtime state, volatile run files, and
|
|
3
|
+
* logs.
|
|
3
4
|
*
|
|
4
|
-
* Effective
|
|
5
|
+
* Effective layout (issue #182 PR-1 split durable state from volatile run
|
|
6
|
+
* files):
|
|
5
7
|
* ~/.dreamux/
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* admin.sock
|
|
8
|
+
* run/ volatile IPC/control artifacts; safe to clear
|
|
9
|
+
* when no dreamux server is running
|
|
10
|
+
* admin.sock admin control socket (+ admin.sock.lock)
|
|
11
|
+
* restart-intent.json one-shot daemon restart marker
|
|
12
|
+
* sockets/ fallback root for runtime rendezvous sockets
|
|
13
|
+
* (see platform/runtime-sockets.ts)
|
|
14
|
+
* state/ durable server-owned state
|
|
9
15
|
* <dispatcher-id>/
|
|
10
16
|
* status.json
|
|
11
17
|
* access.json
|
|
12
|
-
* codex.sock Codex app-server Unix socket
|
|
13
18
|
* teammate/ Server-hosted TeamMate identities and history
|
|
14
19
|
* logs/
|
|
15
20
|
* dreamux-server.log
|
|
16
21
|
* codex-app-server/
|
|
17
22
|
* <dispatcher-id>.log
|
|
18
23
|
*
|
|
19
|
-
* `stateRoot()` is the single root for dreamux-owned state
|
|
24
|
+
* `stateRoot()` is the single root for dreamux-owned durable state; `runRoot()`
|
|
25
|
+
* is the single root for dreamux-owned volatile run files. The old
|
|
20
26
|
* `runtime_dir` concept (and its `runtimeRoot()` alias) was retired in issue #98.
|
|
21
27
|
*/
|
|
28
|
+
import { realpath } from 'node:fs/promises';
|
|
22
29
|
import { homedir } from 'node:os';
|
|
23
|
-
import { dirname, join } from 'node:path';
|
|
30
|
+
import { dirname, isAbsolute, join, relative, resolve, sep } from 'node:path';
|
|
24
31
|
import { fileURLToPath } from 'node:url';
|
|
25
32
|
import { BUILT_IN_DEFAULTS, } from '../config/config.js';
|
|
26
33
|
import { validateDispatcherId } from '../state/dispatcher-id.js';
|
|
@@ -51,26 +58,109 @@ export function getRuntimeConfig() {
|
|
|
51
58
|
export function dreamuxRoot() {
|
|
52
59
|
return join(homedir(), '.dreamux');
|
|
53
60
|
}
|
|
61
|
+
/** Lexical containment: is `candidate` at or under `root` (both resolved)? */
|
|
62
|
+
function pathIsAtOrUnder(root, candidate) {
|
|
63
|
+
const rel = relative(resolve(root), resolve(candidate));
|
|
64
|
+
return rel === '' || (!rel.startsWith(`..${sep}`) && rel !== '..' && !isAbsolute(rel));
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* True when `path` resolves to, or inside, the dreamux home root
|
|
68
|
+
* (`~/.dreamux`). Lexical only — a path that *symlinks* into `~/.dreamux` is not
|
|
69
|
+
* caught here; use {@link isRealPathUnderDreamuxRoot} for the placement guard.
|
|
70
|
+
* Managed worktree creation must fail loud rather than place a worktree under
|
|
71
|
+
* Dreamux's own state/run/cache tree (issue #182 PR-4): a dispatcher workspace
|
|
72
|
+
* must be a real operator project directory, never the retired state-dir
|
|
73
|
+
* fallback or any other path inside `~/.dreamux`.
|
|
74
|
+
*/
|
|
75
|
+
export function isUnderDreamuxRoot(path) {
|
|
76
|
+
return pathIsAtOrUnder(dreamuxRoot(), path);
|
|
77
|
+
}
|
|
78
|
+
/** realpath, falling back to a lexical resolve when the path does not exist. */
|
|
79
|
+
async function canonicalPath(path) {
|
|
80
|
+
try {
|
|
81
|
+
return await realpath(path);
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return resolve(path);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Symlink-safe variant of {@link isUnderDreamuxRoot} (issue #182 PR-4, PR #186
|
|
89
|
+
* review P1): canonicalizes BOTH the dreamux root and `path` with `realpath`
|
|
90
|
+
* before the containment check, so a workspace path that lives outside
|
|
91
|
+
* `~/.dreamux` lexically but symlinks into it is still rejected. This is the
|
|
92
|
+
* authoritative guard for managed-worktree placement, where a bypass would put
|
|
93
|
+
* worktrees physically under Dreamux home.
|
|
94
|
+
*/
|
|
95
|
+
export async function isRealPathUnderDreamuxRoot(path) {
|
|
96
|
+
const [realRoot, realPath] = await Promise.all([
|
|
97
|
+
canonicalPath(dreamuxRoot()),
|
|
98
|
+
canonicalPath(path),
|
|
99
|
+
]);
|
|
100
|
+
return pathIsAtOrUnder(realRoot, realPath);
|
|
101
|
+
}
|
|
54
102
|
export function stateRoot() {
|
|
55
103
|
return join(dreamuxRoot(), 'state');
|
|
56
104
|
}
|
|
57
|
-
|
|
58
|
-
|
|
105
|
+
/**
|
|
106
|
+
* Root for dreamux-owned volatile run files: IPC sockets, lock files, and
|
|
107
|
+
* one-shot control markers. Nothing under it is durable; it is safe to remove
|
|
108
|
+
* while no dreamux server is running. Durable state stays under `stateRoot()`.
|
|
109
|
+
*/
|
|
110
|
+
export function runRoot() {
|
|
111
|
+
return join(dreamuxRoot(), 'run');
|
|
59
112
|
}
|
|
60
113
|
/**
|
|
61
114
|
* One-shot marker dropped by `dreamux daemon restart --notify-resumed` before
|
|
62
115
|
* it triggers the service-manager restart. The freshly started server reads it
|
|
63
116
|
* once, deletes it, and injects a "restart completed" notice into the named
|
|
64
|
-
* resumed dispatchers.
|
|
117
|
+
* resumed dispatchers. Volatile run file; safe to delete.
|
|
65
118
|
*/
|
|
66
119
|
export function restartIntentPath() {
|
|
67
|
-
return join(
|
|
120
|
+
return join(runRoot(), 'restart-intent.json');
|
|
68
121
|
}
|
|
69
122
|
export function logsRoot() {
|
|
70
123
|
return join(dreamuxRoot(), 'logs');
|
|
71
124
|
}
|
|
125
|
+
/**
|
|
126
|
+
* Root for dreamux-owned cache: rebuildable, droppable artifacts that are
|
|
127
|
+
* neither durable state nor volatile run files (issue #182 PR-2). Holds
|
|
128
|
+
* per-dispatcher completion spill files and inbound attachment caches. Safe to
|
|
129
|
+
* remove while no server is running; nothing here is part of identity, status,
|
|
130
|
+
* history, or checkpoint recovery.
|
|
131
|
+
*/
|
|
132
|
+
export function cacheRoot() {
|
|
133
|
+
return join(dreamuxRoot(), 'cache');
|
|
134
|
+
}
|
|
135
|
+
export function dispatcherCacheDir(id) {
|
|
136
|
+
return join(cacheRoot(), dispatcherPathSegment(id));
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Per-dispatcher completion-spill directory (issue #182 PR-2): where an
|
|
140
|
+
* over-budget teammate completion result is written so only its path is inlined
|
|
141
|
+
* into the dispatcher turn. Cache, not state — the file is read by no process;
|
|
142
|
+
* it is surfaced to the dispatcher model as text and is safe to delete.
|
|
143
|
+
*/
|
|
144
|
+
export function dispatcherCompletionSpillDir(id) {
|
|
145
|
+
return join(dispatcherCacheDir(id), 'spill');
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* The stable cross-process admin IPC endpoint. Packaged CLI commands and MCP
|
|
149
|
+
* shims resolve it through this builder only — it is a fixed path contract, so
|
|
150
|
+
* an over-budget path (extreme $HOME length) fails loudly instead of moving.
|
|
151
|
+
*/
|
|
72
152
|
export function adminSocketPath() {
|
|
73
|
-
return assertUnixSocketPathBudget(join(
|
|
153
|
+
return assertUnixSocketPathBudget(join(runRoot(), 'admin.sock'), 'admin socket path');
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* The pre-#182 admin socket location, under durable state. PR-1 moved the live
|
|
157
|
+
* admin socket to `run/admin.sock`; this builder exists only so a new server
|
|
158
|
+
* can detect a still-running OLD-version server (which locks the legacy path)
|
|
159
|
+
* and fail loud — see `assertNoLegacyAdminServer`. Detection only: dreamux
|
|
160
|
+
* never removes or migrates the legacy file.
|
|
161
|
+
*/
|
|
162
|
+
export function legacyAdminSocketPath() {
|
|
163
|
+
return join(stateRoot(), 'admin.sock');
|
|
74
164
|
}
|
|
75
165
|
export function dispatcherDir(id) {
|
|
76
166
|
return join(stateRoot(), dispatcherPathSegment(id));
|
|
@@ -140,21 +230,22 @@ export function dispatcherTeamMateIdentitiesDir(id) {
|
|
|
140
230
|
export function dispatcherTeamMateIdentityPath(id, teammateName) {
|
|
141
231
|
return join(dispatcherTeamMateIdentitiesDir(id), `${teamMateNameSegment(teammateName)}.json`);
|
|
142
232
|
}
|
|
143
|
-
/**
|
|
144
|
-
|
|
145
|
-
|
|
233
|
+
/**
|
|
234
|
+
* Per-dispatcher append-only TeamMate/Team session ledger (issue #182 PR-5).
|
|
235
|
+
* One file per dispatcher — NOT one file per transient runtime session — so the
|
|
236
|
+
* file count stays bounded as teammates come and go. Each line is a lifecycle
|
|
237
|
+
* event (spawn / send / settled / close) keyed by a stable `session_id`; a
|
|
238
|
+
* future read surface (PR-6) materializes session rows by folding the events.
|
|
239
|
+
* Durable: it preserves the facts needed to reconstruct work weeks later (repo,
|
|
240
|
+
* cwd, branch/worktree, name/team id, runtime checkpoint/session id, intent,
|
|
241
|
+
* close note) and never records a volatile runtime socket path.
|
|
242
|
+
*/
|
|
243
|
+
export function dispatcherTeamMateSessionLedgerPath(id) {
|
|
244
|
+
return join(dispatcherTeamMateDir(id), 'sessions.jsonl');
|
|
146
245
|
}
|
|
147
246
|
export function dispatcherTeamMateRuntimeDir(id, teammateName) {
|
|
148
247
|
return join(dispatcherTeamMateDir(id), 'runtime', teamMateNameSegment(teammateName));
|
|
149
248
|
}
|
|
150
|
-
/** Dreamux-managed Git worktrees for one dispatcher. */
|
|
151
|
-
export function dispatcherTeamMateWorktreesDir(id) {
|
|
152
|
-
return join(dispatcherTeamMateDir(id), 'worktrees');
|
|
153
|
-
}
|
|
154
|
-
/** One Dreamux-managed Git worktree path for a teammate slug. */
|
|
155
|
-
export function dispatcherTeamMateWorktreePath(id, slug) {
|
|
156
|
-
return join(dispatcherTeamMateWorktreesDir(id), teamMateNameSegment(slug));
|
|
157
|
-
}
|
|
158
249
|
/** Per-dispatcher Team Mode state root. */
|
|
159
250
|
export function dispatcherTeamDir(id) {
|
|
160
251
|
return join(dispatcherDir(id), 'team');
|
|
@@ -185,14 +276,16 @@ export function teamMateNameSegment(name) {
|
|
|
185
276
|
* never floods the dispatcher's context. Neutral: a completion is a
|
|
186
277
|
* runtime-agnostic concept, so no runtime specifics appear here.
|
|
187
278
|
*
|
|
188
|
-
* Lives under the
|
|
189
|
-
*
|
|
190
|
-
*
|
|
191
|
-
*
|
|
192
|
-
*
|
|
279
|
+
* Lives under the dispatcher's cache spill dir (issue #182 PR-2 moved it out of
|
|
280
|
+
* shared `/tmp`, which is not a good long-term contract for a path surfaced in
|
|
281
|
+
* dispatcher-visible text). `spillDir` is the owning dispatcher's
|
|
282
|
+
* `dispatcherCompletionSpillDir`, supplied by the runtime's path context so a
|
|
283
|
+
* teammate runtime spills under its operator dispatcher, not its composite
|
|
284
|
+
* runtime id. `source` and `id` are sanitized for filename safety; the id is
|
|
285
|
+
* unique per completion (teammate name + turn id).
|
|
193
286
|
*/
|
|
194
|
-
export function teamMateCompletionOutputPath(source, id) {
|
|
195
|
-
return
|
|
287
|
+
export function teamMateCompletionOutputPath(spillDir, source, id) {
|
|
288
|
+
return join(spillDir, `teammate-${teamMateNameSegment(source)}-${teamMateNameSegment(id)}.output`);
|
|
196
289
|
}
|
|
197
290
|
/**
|
|
198
291
|
* Per-dispatcher peer-bot awareness/trust store. One file per dispatcher,
|
|
@@ -203,9 +296,13 @@ export function teamMateCompletionOutputPath(source, id) {
|
|
|
203
296
|
export function dispatcherChatBotsPath(id) {
|
|
204
297
|
return join(dispatcherDir(id), 'chat-bots.json');
|
|
205
298
|
}
|
|
206
|
-
/**
|
|
299
|
+
/**
|
|
300
|
+
* Per-dispatcher Feishu inbound attachment cache, owned by the server. Cache,
|
|
301
|
+
* not durable state (issue #182 PR-2 moved it out of `state/<id>/` into
|
|
302
|
+
* `cache/<id>/`): inbound attachments are re-fetchable and safe to delete.
|
|
303
|
+
*/
|
|
207
304
|
export function dispatcherFeishuAttachmentCacheDir(id) {
|
|
208
|
-
return join(
|
|
305
|
+
return join(dispatcherCacheDir(id), 'feishu-attachments');
|
|
209
306
|
}
|
|
210
307
|
export function unixSocketPathFitsBudget(path) {
|
|
211
308
|
return Buffer.byteLength(path, 'utf8') <= DREAMUX_UNIX_SOCKET_PATH_MAX_BYTES;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/platform/paths.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/platform/paths.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Volatile Unix-socket allocation for agent-runtime child processes
|
|
3
|
+
* (issue #182 PR-1).
|
|
4
|
+
*
|
|
5
|
+
* A runtime socket is a pure per-process rendezvous endpoint: dreamux starts a
|
|
6
|
+
* child listening on the path and connects to it immediately. Nothing resumes
|
|
7
|
+
* from a socket path, so every allocation is a fresh short random name and the
|
|
8
|
+
* path must never be persisted into durable state (identity, history, ledger,
|
|
9
|
+
* checkpoint, or status surfaces) — it lives only in supervisor/runtime memory.
|
|
10
|
+
*
|
|
11
|
+
* Placement preference (the allocator picks the first that fits the `sun_path`
|
|
12
|
+
* budget):
|
|
13
|
+
* 1. `$XDG_RUNTIME_DIR/dreamux/sockets/` — the canonical private per-user
|
|
14
|
+
* runtime dir on Linux. It is operator input, so a shared-tmp value is
|
|
15
|
+
* rejected rather than trusted.
|
|
16
|
+
* 2. `~/.dreamux/run/sockets/` — the dreamux-owned volatile run root.
|
|
17
|
+
* 3. `<os-private-temp>/dreamux/sockets/` — the per-user OS temp dir **only
|
|
18
|
+
* when it is a private root, not world-shared `/tmp`** (issue #182 final
|
|
19
|
+
* gate). On macOS `os.tmpdir()` is the per-user `$TMPDIR`
|
|
20
|
+
* (`/var/folders/<…>/T`, owner-only) and is far shorter than a long
|
|
21
|
+
* per-run durable `$HOME`, so it keeps Codex sockets within budget when
|
|
22
|
+
* there is no `$XDG_RUNTIME_DIR` and `~/.dreamux/run/sockets/` is over
|
|
23
|
+
* budget. On Linux `os.tmpdir()` is `/tmp` (shared) and is rejected, so
|
|
24
|
+
* this candidate never reintroduces a world-shared tmp socket.
|
|
25
|
+
* Shared world-writable tmp roots (`/tmp`, `/var/tmp`) are never used for
|
|
26
|
+
* sockets (global-bin decision record). When no candidate fits the `sun_path`
|
|
27
|
+
* budget, allocation fails loudly.
|
|
28
|
+
*
|
|
29
|
+
* The supervisor owning a socket remains responsible for mkdir, stale-socket
|
|
30
|
+
* removal before bind, and removal on stop/reap. `sweepRuntimeSocketDirs()`
|
|
31
|
+
* additionally clears crash orphans; it must only run while the caller holds
|
|
32
|
+
* the admin-socket lock (single-server guarantee), so every entry is dead.
|
|
33
|
+
*/
|
|
34
|
+
import { randomBytes } from 'node:crypto';
|
|
35
|
+
import { rm } from 'node:fs/promises';
|
|
36
|
+
import { tmpdir } from 'node:os';
|
|
37
|
+
import { join, normalize, sep } from 'node:path';
|
|
38
|
+
import { assertUnixSocketPathBudget, runRoot, unixSocketPathFitsBudget, } from './paths.js';
|
|
39
|
+
/**
|
|
40
|
+
* Shared world-writable system tmp roots. `/private/tmp` and
|
|
41
|
+
* `/private/var/tmp` are the macOS symlink-resolved spellings of `/tmp` and
|
|
42
|
+
* `/var/tmp`, so a canonicalized path must not slip past the guard.
|
|
43
|
+
*/
|
|
44
|
+
const SHARED_TMP_ROOTS = ['/tmp', '/var/tmp', '/private/tmp', '/private/var/tmp'];
|
|
45
|
+
export function isSharedTmpPath(path) {
|
|
46
|
+
const normalized = normalize(path);
|
|
47
|
+
return SHARED_TMP_ROOTS.some((root) => normalized === root || normalized.startsWith(`${root}${sep}`));
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Candidate directories for volatile runtime sockets, in preference order.
|
|
51
|
+
* Every candidate is dreamux-owned (a `dreamux` subtree or the run root), so
|
|
52
|
+
* sweeping them whole is safe under the single-server lock.
|
|
53
|
+
*/
|
|
54
|
+
export function runtimeSocketDirCandidates(env = process.env) {
|
|
55
|
+
const candidates = [];
|
|
56
|
+
const xdg = env['XDG_RUNTIME_DIR'];
|
|
57
|
+
if (xdg !== undefined && xdg.trim() !== '' && !isSharedTmpPath(xdg)) {
|
|
58
|
+
candidates.push(join(xdg, 'dreamux', 'sockets'));
|
|
59
|
+
}
|
|
60
|
+
candidates.push(join(runRoot(), 'sockets'));
|
|
61
|
+
// Per-user OS temp dir, but only when it is a PRIVATE root (macOS `$TMPDIR`
|
|
62
|
+
// = `/var/folders/<…>/T`, owner-only) — never world-shared `/tmp` (Linux),
|
|
63
|
+
// which `isSharedTmpPath` rejects. This is the short, private fallback that
|
|
64
|
+
// keeps sockets within the `sun_path` budget on macOS with no
|
|
65
|
+
// `$XDG_RUNTIME_DIR` and a long per-run `$HOME` (issue #182 final gate). It
|
|
66
|
+
// is consulted after the dreamux-owned run root, so short-`$HOME` placement
|
|
67
|
+
// is unchanged; the supervisor still enforces owner-only on the dir.
|
|
68
|
+
const tmp = osTempDir(env);
|
|
69
|
+
if (tmp !== '' && !isSharedTmpPath(tmp)) {
|
|
70
|
+
candidates.push(join(tmp, 'dreamux', 'sockets'));
|
|
71
|
+
}
|
|
72
|
+
return candidates;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* The per-user OS temp directory, resolved from the passed env so tests are
|
|
76
|
+
* deterministic, mirroring Node's `os.tmpdir()` precedence
|
|
77
|
+
* (`TMPDIR` → `TMP` → `TEMP` → platform default).
|
|
78
|
+
*/
|
|
79
|
+
function osTempDir(env) {
|
|
80
|
+
const fromEnv = env['TMPDIR'] ?? env['TMP'] ?? env['TEMP'];
|
|
81
|
+
const raw = fromEnv !== undefined && fromEnv.trim() !== '' ? fromEnv : tmpdir();
|
|
82
|
+
// Strip a single trailing separator so joined paths stay canonical.
|
|
83
|
+
return raw.endsWith(sep) && raw.length > 1 ? raw.slice(0, -1) : raw;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Allocate a fresh runtime socket path: the first preference-ordered candidate
|
|
87
|
+
* dir whose joined random-name path fits the Unix socket budget. Pure path
|
|
88
|
+
* computation — the caller (supervisor) creates the directory and cleans up
|
|
89
|
+
* the socket. Fails loudly (with `label` in the message) when even the
|
|
90
|
+
* dreamux-owned fallback is over budget.
|
|
91
|
+
*/
|
|
92
|
+
export function allocateRuntimeSocketPath(label, env = process.env) {
|
|
93
|
+
const name = `${randomBytes(6).toString('base64url')}.sock`;
|
|
94
|
+
const candidates = runtimeSocketDirCandidates(env);
|
|
95
|
+
for (const dir of candidates) {
|
|
96
|
+
const path = join(dir, name);
|
|
97
|
+
if (unixSocketPathFitsBudget(path))
|
|
98
|
+
return path;
|
|
99
|
+
}
|
|
100
|
+
// No candidate fits the budget. Every candidate is a dreamux-owned, sweepable
|
|
101
|
+
// sockets dir (never the bare run root), so re-asserting on the last one
|
|
102
|
+
// yields the fail-loud message naming the longest-shot placement we tried.
|
|
103
|
+
const fallback = candidates[candidates.length - 1];
|
|
104
|
+
return assertUnixSocketPathBudget(join(fallback, name), label);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Remove every runtime-socket candidate directory wholesale, clearing crash
|
|
108
|
+
* orphans (sockets whose owning process died without reaping). Volatile by
|
|
109
|
+
* contract — sockets are re-allocated on every runtime start, so nothing here
|
|
110
|
+
* is ever reused. Only call while holding the admin-socket lock: that
|
|
111
|
+
* single-server guarantee is what makes every entry provably dead. Returns the
|
|
112
|
+
* swept directories for logging. Failures are best-effort per directory.
|
|
113
|
+
*/
|
|
114
|
+
export async function sweepRuntimeSocketDirs(env = process.env) {
|
|
115
|
+
const swept = [];
|
|
116
|
+
for (const dir of runtimeSocketDirCandidates(env)) {
|
|
117
|
+
try {
|
|
118
|
+
await rm(dir, { recursive: true, force: true });
|
|
119
|
+
swept.push(dir);
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
/* best effort — a missing or busy dir must not block server startup */
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return swept;
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=runtime-sockets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-sockets.js","sourceRoot":"","sources":["../../src/platform/runtime-sockets.ts"],"names":[],"mappings":"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"}
|