@excitedjs/dreamux 0.1.1 → 0.1.3

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 (58) hide show
  1. package/README.md +36 -46
  2. package/bin/dreamux +6 -4
  3. package/dist/admin/socket.js +1 -1
  4. package/dist/admin/socket.js.map +1 -1
  5. package/dist/channel/feishu-gate.js +27 -0
  6. package/dist/channel/feishu-gate.js.map +1 -0
  7. package/dist/channel/outbound.js +12 -0
  8. package/dist/channel/outbound.js.map +1 -0
  9. package/dist/cli/doctor.js +273 -0
  10. package/dist/cli/doctor.js.map +1 -0
  11. package/dist/cli/dreamux.js +257 -78
  12. package/dist/cli/dreamux.js.map +1 -1
  13. package/dist/cli/server-ctl.js +15 -13
  14. package/dist/cli/server-ctl.js.map +1 -1
  15. package/dist/cli/server.js +7 -7
  16. package/dist/codex/handshake.js +1 -1
  17. package/dist/codex/handshake.js.map +1 -1
  18. package/dist/db/repository.js +16 -0
  19. package/dist/db/repository.js.map +1 -1
  20. package/dist/dispatcher/runtime.js +11 -3
  21. package/dist/dispatcher/runtime.js.map +1 -1
  22. package/dist/dispatcher/turn-manager.js +10 -8
  23. package/dist/dispatcher/turn-manager.js.map +1 -1
  24. package/dist/feishu/bot.js +41 -22
  25. package/dist/feishu/bot.js.map +1 -1
  26. package/dist/onboard/commands.js +34 -0
  27. package/dist/onboard/commands.js.map +1 -0
  28. package/dist/onboard/config-files.js +113 -0
  29. package/dist/onboard/config-files.js.map +1 -0
  30. package/dist/onboard/ledger.js +113 -0
  31. package/dist/onboard/ledger.js.map +1 -0
  32. package/dist/onboard/plugins.js +202 -0
  33. package/dist/onboard/plugins.js.map +1 -0
  34. package/dist/onboard/run.js +150 -0
  35. package/dist/onboard/run.js.map +1 -0
  36. package/dist/onboard/service.js +138 -0
  37. package/dist/onboard/service.js.map +1 -0
  38. package/dist/onboard/types.js +2 -0
  39. package/dist/{feishu → onboard}/types.js.map +1 -1
  40. package/dist/onboard/wizard.js +146 -0
  41. package/dist/onboard/wizard.js.map +1 -0
  42. package/dist/runtime/codex-args.js +1 -1
  43. package/dist/runtime/config.js +16 -4
  44. package/dist/runtime/config.js.map +1 -1
  45. package/dist/runtime/dispatcher-codex-home.js +266 -0
  46. package/dist/runtime/dispatcher-codex-home.js.map +1 -0
  47. package/dist/runtime/paths.js +17 -2
  48. package/dist/runtime/paths.js.map +1 -1
  49. package/dist/server.js +14 -2
  50. package/dist/server.js.map +1 -1
  51. package/package.json +13 -5
  52. package/bin/server +0 -35
  53. package/bin/server-ctl +0 -28
  54. package/dist/feishu/content.js +0 -108
  55. package/dist/feishu/content.js.map +0 -1
  56. package/dist/feishu/render.js +0 -600
  57. package/dist/feishu/render.js.map +0 -1
  58. package/dist/feishu/types.js +0 -9
@@ -0,0 +1,202 @@
1
+ import { existsSync, readFileSync, readdirSync, statSync, } from 'node:fs';
2
+ import { basename, join } from 'node:path';
3
+ import { parse as parseToml } from 'smol-toml';
4
+ import { ensureDirectory, recordFileTreeChanges, snapshotFiles, } from './ledger.js';
5
+ export async function installCodexmuxPlugin(options) {
6
+ ensureDirectory(options.codexHome, options.ledger, 'dispatcher CODEX_HOME', {
7
+ dryRun: options.answers.dryRun,
8
+ });
9
+ const before = snapshotFiles(options.codexHome);
10
+ const env = { ...process.env, CODEX_HOME: options.codexHome };
11
+ if (!codexMarketplaceConfigured(options)) {
12
+ await options.runner.run(options.answers.codexBin, [
13
+ 'plugin',
14
+ 'marketplace',
15
+ 'add',
16
+ options.answers.codexMarketplaceSource,
17
+ ...sparseArgs(options.answers.codexMarketplaceSparse),
18
+ ], {
19
+ env,
20
+ dryRun: options.answers.dryRun,
21
+ });
22
+ }
23
+ if (!codexPluginInstalled(options.codexHome, options.answers.codexPluginRef)) {
24
+ await options.runner.run(options.answers.codexBin, ['plugin', 'add', options.answers.codexPluginRef], {
25
+ env,
26
+ dryRun: options.answers.dryRun,
27
+ });
28
+ }
29
+ recordFileTreeChanges(options.codexHome, before, options.ledger, 'codex plugin install');
30
+ if (!options.answers.dryRun &&
31
+ !codexPluginInstalled(options.codexHome, options.answers.codexPluginRef)) {
32
+ throw new Error(`codex plugin install did not produce ${pluginName(options.answers.codexPluginRef)} under ${join(options.codexHome, 'plugins')}`);
33
+ }
34
+ }
35
+ export async function installClaudemuxPlugin(options) {
36
+ ensureDirectory(options.answers.claudeConfigDir, options.ledger, 'Claude config directory', { dryRun: options.answers.dryRun });
37
+ const before = snapshotFiles(options.answers.claudeConfigDir);
38
+ const env = {
39
+ ...process.env,
40
+ CLAUDE_CONFIG_DIR: options.answers.claudeConfigDir,
41
+ };
42
+ const installedBefore = await claudePluginInstalled(options, env);
43
+ if (!installedBefore) {
44
+ if (!claudeMarketplaceConfigured(options.answers)) {
45
+ await options.runner.run(options.answers.claudeBin, [
46
+ 'plugin',
47
+ 'marketplace',
48
+ 'add',
49
+ options.answers.claudeMarketplaceSource,
50
+ ...sparseArgs(options.answers.claudeMarketplaceSparse),
51
+ '--scope',
52
+ 'user',
53
+ ], { env, dryRun: options.answers.dryRun });
54
+ }
55
+ await options.runner.run(options.answers.claudeBin, ['plugin', 'install', options.answers.claudePluginRef, '--scope', 'user'], { env, dryRun: options.answers.dryRun });
56
+ }
57
+ recordFileTreeChanges(options.answers.claudeConfigDir, before, options.ledger, 'claude plugin install');
58
+ if (!options.answers.dryRun && !(await claudePluginInstalled(options, env))) {
59
+ throw new Error(`claude plugin install did not report ${options.answers.claudePluginRef} in claude plugin list --json`);
60
+ }
61
+ }
62
+ function sparseArgs(paths) {
63
+ return paths.flatMap((path) => ['--sparse', path]);
64
+ }
65
+ function codexMarketplaceConfigured(options) {
66
+ const configPath = join(options.codexHome, 'config.toml');
67
+ if (!existsSync(configPath))
68
+ return false;
69
+ try {
70
+ const parsed = parseToml(readFileSync(configPath, 'utf8'));
71
+ const marketplaces = recordValue(recordValue(parsed)['marketplaces']);
72
+ const marketplace = recordValue(marketplaces[options.answers.codexMarketplaceName]);
73
+ return marketplace['source'] === options.answers.codexMarketplaceSource;
74
+ }
75
+ catch {
76
+ return false;
77
+ }
78
+ }
79
+ function codexPluginInstalled(codexHome, ref) {
80
+ return hasPathSegment(join(codexHome, 'plugins'), pluginName(ref), 6);
81
+ }
82
+ function claudeMarketplaceConfigured(answers) {
83
+ return (claudeSettingsHasMarketplace(answers) ||
84
+ claudeKnownMarketplacesHasMarketplace(answers));
85
+ }
86
+ function claudeSettingsHasMarketplace(answers) {
87
+ const settingsPath = join(answers.claudeConfigDir, 'settings.json');
88
+ const parsed = readJsonObject(settingsPath);
89
+ if (parsed === null)
90
+ return false;
91
+ const marketplaces = recordValue(parsed['extraKnownMarketplaces']);
92
+ const marketplace = recordValue(marketplaces[answers.claudeMarketplaceName]);
93
+ return claudeMarketplaceSourceMatches(marketplace, answers);
94
+ }
95
+ function claudeKnownMarketplacesHasMarketplace(answers) {
96
+ const knownPath = join(answers.claudeConfigDir, 'plugins', 'known_marketplaces.json');
97
+ const parsed = readJsonObject(knownPath);
98
+ if (parsed === null)
99
+ return false;
100
+ const marketplace = recordValue(parsed[answers.claudeMarketplaceName]);
101
+ return claudeMarketplaceSourceMatches(marketplace, answers);
102
+ }
103
+ function claudeMarketplaceSourceMatches(marketplace, answers) {
104
+ if (Object.keys(marketplace).length === 0)
105
+ return false;
106
+ const source = recordValue(marketplace['source']);
107
+ const directSource = stringValue(marketplace['source']);
108
+ if (directSource === answers.claudeMarketplaceSource)
109
+ return true;
110
+ const repo = stringValue(source['repo']);
111
+ if (repo === answers.claudeMarketplaceSource)
112
+ return true;
113
+ const path = stringValue(source['path']);
114
+ if (path === answers.claudeMarketplaceSource)
115
+ return true;
116
+ const url = stringValue(source['url']);
117
+ if (url === answers.claudeMarketplaceSource)
118
+ return true;
119
+ return false;
120
+ }
121
+ async function claudePluginInstalled(options, env) {
122
+ if (options.answers.dryRun)
123
+ return false;
124
+ let raw;
125
+ try {
126
+ raw = await options.runner.capture(options.answers.claudeBin, ['plugin', 'list', '--json'], { env });
127
+ }
128
+ catch {
129
+ return false;
130
+ }
131
+ let parsed;
132
+ try {
133
+ parsed = JSON.parse(raw);
134
+ }
135
+ catch {
136
+ return false;
137
+ }
138
+ if (!Array.isArray(parsed))
139
+ return false;
140
+ const expected = pluginName(options.answers.claudePluginRef);
141
+ const expectedRef = options.answers.claudePluginRef;
142
+ return parsed.some((item) => {
143
+ const record = recordValue(item);
144
+ return [record['name'], record['id'], record['plugin'], record['ref']].some((value) => value === expected || value === expectedRef);
145
+ });
146
+ }
147
+ function pluginName(ref) {
148
+ return ref.split('@')[0] ?? ref;
149
+ }
150
+ function hasPathSegment(root, segment, maxDepth) {
151
+ if (!existsSync(root))
152
+ return false;
153
+ const stack = [{ path: root, depth: 0 }];
154
+ while (stack.length > 0) {
155
+ const current = stack.pop();
156
+ if (current === undefined)
157
+ continue;
158
+ if (basename(current.path) === segment)
159
+ return true;
160
+ if (current.depth >= maxDepth)
161
+ continue;
162
+ let entries;
163
+ try {
164
+ entries = readdirSync(current.path);
165
+ }
166
+ catch {
167
+ continue;
168
+ }
169
+ for (const entry of entries) {
170
+ const child = join(current.path, entry);
171
+ try {
172
+ if (statSync(child).isDirectory()) {
173
+ stack.push({ path: child, depth: current.depth + 1 });
174
+ }
175
+ }
176
+ catch {
177
+ /* ignore transient filesystem races */
178
+ }
179
+ }
180
+ }
181
+ return false;
182
+ }
183
+ function recordValue(value) {
184
+ if (value !== null && typeof value === 'object' && !Array.isArray(value)) {
185
+ return value;
186
+ }
187
+ return {};
188
+ }
189
+ function stringValue(value) {
190
+ return typeof value === 'string' ? value : null;
191
+ }
192
+ function readJsonObject(path) {
193
+ if (!existsSync(path))
194
+ return null;
195
+ try {
196
+ return recordValue(JSON.parse(readFileSync(path, 'utf8')));
197
+ }
198
+ catch {
199
+ return null;
200
+ }
201
+ }
202
+ //# sourceMappingURL=plugins.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugins.js","sourceRoot":"","sources":["../../src/onboard/plugins.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,150 @@
1
+ import { mkdirSync } from 'node:fs';
2
+ import { dirname, join } from 'node:path';
3
+ import { DispatcherRepo } from '../db/repository.js';
4
+ import { openDatabase } from '../db/schema.js';
5
+ import { codexArgsToCli, parseCodexArgs } from '../runtime/codex-args.js';
6
+ import { dispatcherAppServerControlDir, dispatcherCodexConfigPath, dispatcherCodexCwd, dispatcherCodexHome, dispatcherCodexPluginsDir, databasePath, setRuntimeConfig, } from '../runtime/paths.js';
7
+ import { dispatcherCodexHomeDoctorContext, validateDispatcherCodexHome, } from '../runtime/dispatcher-codex-home.js';
8
+ import { ExecaCommandRunner } from './commands.js';
9
+ import { buildDispatcherCodexConfigToml, buildDreamuxConfigToml, dispatcherCodexArgsJson, dreamuxConfigFromAnswers, } from './config-files.js';
10
+ import { ensureDirectory, recordFileTreeChanges, snapshotFiles, TransparentFileLedger, writeTextFile, } from './ledger.js';
11
+ import { installUserService, managedServiceEnvironment } from './service.js';
12
+ import { installClaudemuxPlugin, installCodexmuxPlugin, } from './plugins.js';
13
+ export async function runOnboard(options) {
14
+ const answers = options.answers;
15
+ const ledger = options.ledger ?? new TransparentFileLedger();
16
+ const runner = options.runner ?? new ExecaCommandRunner();
17
+ const env = options.env ?? process.env;
18
+ const dreamuxConfig = dreamuxConfigFromAnswers(answers);
19
+ setRuntimeConfig(dreamuxConfig);
20
+ if (!answers.registerService) {
21
+ preflightAuth(answers, env);
22
+ }
23
+ const configPath = join(answers.configDir, 'config.toml');
24
+ ensureDirectory(answers.configDir, ledger, 'dreamux config directory', {
25
+ dryRun: answers.dryRun,
26
+ });
27
+ ensureDirectory(answers.runtimeDir, ledger, 'dreamux runtime directory', {
28
+ dryRun: answers.dryRun,
29
+ });
30
+ writeTextFile(configPath, buildDreamuxConfigToml(answers), ledger, 'dreamux global config', { mode: 0o600, dryRun: answers.dryRun });
31
+ const codexHome = dispatcherCodexHome(answers.dispatcherId);
32
+ const codexConfigPath = dispatcherCodexConfigPath(answers.dispatcherId);
33
+ ensureDirectory(codexHome, ledger, 'dispatcher private CODEX_HOME', {
34
+ dryRun: answers.dryRun,
35
+ });
36
+ ensureDirectory(dispatcherCodexPluginsDir(answers.dispatcherId), ledger, 'dispatcher Codex plugins directory', { dryRun: answers.dryRun });
37
+ ensureDirectory(dispatcherAppServerControlDir(answers.dispatcherId), ledger, 'dispatcher app-server control directory', { dryRun: answers.dryRun });
38
+ ensureDirectory(dispatcherCodexCwd(answers.dispatcherId), ledger, 'dispatcher app-server cwd', { dryRun: answers.dryRun });
39
+ await installCodexmuxPlugin({
40
+ answers,
41
+ codexHome,
42
+ ledger,
43
+ runner,
44
+ });
45
+ writeTextFile(codexConfigPath, buildDispatcherCodexConfigToml({
46
+ codexHomeConfigPath: codexConfigPath,
47
+ model: answers.codexModel,
48
+ marketplaceName: answers.codexMarketplaceName,
49
+ marketplaceSource: answers.codexMarketplaceSource,
50
+ pluginRef: answers.codexPluginRef,
51
+ }), ledger, 'dispatcher private Codex config', { mode: 0o600, dryRun: answers.dryRun });
52
+ await installClaudemuxPlugin({
53
+ answers,
54
+ codexHome,
55
+ ledger,
56
+ runner,
57
+ });
58
+ registerDispatcher(answers, ledger);
59
+ const doctor = runDispatcherDoctor(answers, dreamuxConfig, env);
60
+ if (!answers.dryRun && !doctor.ok) {
61
+ throw new Error(formatDoctorFailure(answers, doctor));
62
+ }
63
+ const service = answers.registerService
64
+ ? await installUserService({
65
+ answers,
66
+ ledger,
67
+ runner,
68
+ platform: options.platform,
69
+ homeDir: options.homeDir,
70
+ uid: options.uid,
71
+ })
72
+ : null;
73
+ return {
74
+ files: ledger.entries(),
75
+ doctor,
76
+ service,
77
+ };
78
+ }
79
+ function registerDispatcher(answers, ledger) {
80
+ const dbPath = databasePath();
81
+ ensureDirectory(dirname(dbPath), ledger, 'dispatcher database directory', {
82
+ dryRun: answers.dryRun,
83
+ });
84
+ if (answers.dryRun) {
85
+ ledger.record(dbPath, 'created', 'dispatcher database');
86
+ return;
87
+ }
88
+ mkdirSync(dirname(dbPath), { recursive: true });
89
+ const before = snapshotFiles(dirname(dbPath));
90
+ const db = openDatabase({ path: dbPath });
91
+ try {
92
+ new DispatcherRepo(db).upsert({
93
+ dispatcher_id: answers.dispatcherId,
94
+ bot_app_id: answers.botAppId,
95
+ bot_secret_ref: answers.botSecretRef,
96
+ codex_args_json: dispatcherCodexArgsJson(),
97
+ codex_cwd: dispatcherCodexCwd(answers.dispatcherId),
98
+ });
99
+ }
100
+ finally {
101
+ db.close();
102
+ }
103
+ recordFileTreeChanges(dirname(dbPath), before, ledger, 'dispatcher database');
104
+ }
105
+ function runDispatcherDoctor(answers, dreamuxConfig, env) {
106
+ const codexArgs = parseCodexArgs(dispatcherCodexArgsJson(), {
107
+ approvalPolicy: dreamuxConfig.codex.approval_policy,
108
+ sandboxMode: dreamuxConfig.codex.sandbox_mode,
109
+ extraArgs: dreamuxConfig.codex.extra_args,
110
+ });
111
+ const codexCliArgs = codexArgsToCli(codexArgs);
112
+ const context = dispatcherCodexHomeDoctorContext(answers.dispatcherId, {
113
+ codexCliArgs,
114
+ });
115
+ if (answers.dryRun) {
116
+ return {
117
+ ok: true,
118
+ errors: [],
119
+ context,
120
+ };
121
+ }
122
+ const doctorEnv = answers.registerService
123
+ ? managedServiceEnvironment(answers)
124
+ : env;
125
+ return validateDispatcherCodexHome(context, {
126
+ env: doctorEnv,
127
+ codexCliArgs,
128
+ });
129
+ }
130
+ function formatDoctorFailure(answers, doctor) {
131
+ const lines = [
132
+ `dispatcher '${answers.dispatcherId}' private CODEX_HOME is not ready`,
133
+ ...doctor.errors.map((error) => `- ${error}`),
134
+ ];
135
+ if (answers.registerService &&
136
+ doctor.errors.some((error) => error.includes('missing dispatcher Codex auth state'))) {
137
+ lines.push('- managed service environments do not inherit your interactive shell auth token', `- authenticate the private dispatcher Codex home before registering the service: CODEX_HOME=${doctor.context.codexHome} ${answers.codexBin} login`);
138
+ }
139
+ return lines.join('\n');
140
+ }
141
+ function preflightAuth(answers, env) {
142
+ if (answers.dryRun)
143
+ return;
144
+ const value = env[answers.authEnvVar];
145
+ if (value !== undefined && value.trim() !== '')
146
+ return;
147
+ throw new Error(`missing dispatcher Codex auth env var ${answers.authEnvVar}; ` +
148
+ 'onboard does not write API secrets into the private CODEX_HOME');
149
+ }
150
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/onboard/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,138 @@
1
+ import { homedir } from 'node:os';
2
+ import { join } from 'node:path';
3
+ import { build as buildPlist } from 'plist';
4
+ import { ensureDirectory, ensureTextFile, writeTextFile, } from './ledger.js';
5
+ export const LAUNCHD_LABEL = 'dev.excited.dreamux';
6
+ export const SYSTEMD_UNIT = 'dreamux.service';
7
+ export function serviceUnitPath(platform = process.platform, homeDir = homedir()) {
8
+ if (platform === 'darwin') {
9
+ return {
10
+ platform: 'launchd',
11
+ path: join(homeDir, 'Library', 'LaunchAgents', `${LAUNCHD_LABEL}.plist`),
12
+ };
13
+ }
14
+ if (platform === 'linux') {
15
+ return {
16
+ platform: 'systemd',
17
+ path: join(homeDir, '.config', 'systemd', 'user', SYSTEMD_UNIT),
18
+ };
19
+ }
20
+ throw new Error(`dreamux onboard supports user-level services on macOS and Linux only (got ${platform})`);
21
+ }
22
+ export async function installUserService(options) {
23
+ const homeDir = options.homeDir ?? homedir();
24
+ const unit = serviceUnitPath(options.platform, homeDir);
25
+ const logDir = join(options.answers.runtimeDir, 'logs');
26
+ const stdoutLog = join(logDir, 'daemon.stdout.log');
27
+ const stderrLog = join(logDir, 'daemon.stderr.log');
28
+ ensureDirectory(logDir, options.ledger, 'daemon log directory', {
29
+ dryRun: options.answers.dryRun,
30
+ });
31
+ ensureTextFile(stdoutLog, '', options.ledger, 'daemon stdout log', {
32
+ mode: 0o600,
33
+ dryRun: options.answers.dryRun,
34
+ });
35
+ ensureTextFile(stderrLog, '', options.ledger, 'daemon stderr log', {
36
+ mode: 0o600,
37
+ dryRun: options.answers.dryRun,
38
+ });
39
+ const content = unit.platform === 'launchd'
40
+ ? renderLaunchdPlist(options.answers, stdoutLog, stderrLog)
41
+ : renderSystemdUnit(options.answers, stdoutLog, stderrLog);
42
+ const unitStatus = writeTextFile(unit.path, content, options.ledger, `${unit.platform} unit`, {
43
+ mode: 0o600,
44
+ dryRun: options.answers.dryRun,
45
+ });
46
+ if (unit.platform === 'launchd') {
47
+ await registerLaunchd(unit.path, unitStatus, options);
48
+ }
49
+ else {
50
+ await registerSystemd(unit.path, options);
51
+ }
52
+ return {
53
+ platform: unit.platform,
54
+ unitPath: unit.path,
55
+ registered: true,
56
+ started: options.answers.startService,
57
+ };
58
+ }
59
+ export function renderLaunchdPlist(answers, stdoutLog, stderrLog) {
60
+ return buildPlist({
61
+ Label: LAUNCHD_LABEL,
62
+ ProgramArguments: [answers.dreamuxBin, 'serve'],
63
+ RunAtLoad: true,
64
+ KeepAlive: true,
65
+ WorkingDirectory: answers.runtimeDir,
66
+ EnvironmentVariables: managedServiceEnvironment(answers),
67
+ StandardOutPath: stdoutLog,
68
+ StandardErrorPath: stderrLog,
69
+ });
70
+ }
71
+ export function renderSystemdUnit(answers, stdoutLog, stderrLog) {
72
+ return `[Unit]
73
+ Description=dreamux dispatcher daemon
74
+
75
+ [Service]
76
+ Type=simple
77
+ ExecStart=${systemdEscapeArg(answers.dreamuxBin)} serve
78
+ WorkingDirectory=${systemdEscapeArg(answers.runtimeDir)}
79
+ ${Object.entries(managedServiceEnvironment(answers))
80
+ .map(([key, value]) => `Environment=${key}=${systemdEscapeEnv(value)}`)
81
+ .join('\n')}
82
+ Restart=on-failure
83
+ RestartSec=2s
84
+ StandardOutput=append:${stdoutLog}
85
+ StandardError=append:${stderrLog}
86
+
87
+ [Install]
88
+ WantedBy=default.target
89
+ `;
90
+ }
91
+ export function managedServiceEnvironment(answers) {
92
+ return {
93
+ DREAMUX_CONFIG_DIR: answers.configDir,
94
+ CODEX_HOST_RUNTIME_DIR: answers.runtimeDir,
95
+ CODEX_HOST_CODEX_BIN: answers.codexBin,
96
+ };
97
+ }
98
+ async function registerLaunchd(unitPath, unitStatus, options) {
99
+ const uid = options.uid ?? process.getuid?.();
100
+ if (uid === undefined) {
101
+ throw new Error('launchd user service registration requires a numeric uid');
102
+ }
103
+ const serviceTarget = `gui/${uid}/${LAUNCHD_LABEL}`;
104
+ const loaded = await options.runner.check('launchctl', ['print', serviceTarget], { dryRun: options.answers.dryRun });
105
+ if (!loaded) {
106
+ await options.runner.run('launchctl', ['bootstrap', `gui/${uid}`, unitPath], { dryRun: options.answers.dryRun });
107
+ }
108
+ else if (unitStatus !== 'unchanged') {
109
+ await options.runner.run('launchctl', ['bootout', serviceTarget], {
110
+ dryRun: options.answers.dryRun,
111
+ });
112
+ await options.runner.run('launchctl', ['bootstrap', `gui/${uid}`, unitPath], { dryRun: options.answers.dryRun });
113
+ }
114
+ if (options.answers.startService) {
115
+ await options.runner.run('launchctl', ['kickstart', '-k', serviceTarget], { dryRun: options.answers.dryRun });
116
+ }
117
+ }
118
+ async function registerSystemd(unitPath, options) {
119
+ await options.runner.run('systemctl', ['--user', 'daemon-reload'], {
120
+ dryRun: options.answers.dryRun,
121
+ });
122
+ const enableArgs = options.answers.startService
123
+ ? ['--user', 'enable', '--now', SYSTEMD_UNIT]
124
+ : ['--user', 'enable', SYSTEMD_UNIT];
125
+ await options.runner.run('systemctl', enableArgs, {
126
+ dryRun: options.answers.dryRun,
127
+ });
128
+ options.ledger.record(unitPath, 'unchanged', 'systemd user service registered');
129
+ }
130
+ function systemdEscapeArg(value) {
131
+ if (/^[A-Za-z0-9_./:@%+=,-]+$/.test(value))
132
+ return value;
133
+ return `"${value.replaceAll('\\', '\\\\').replaceAll('"', '\\"')}"`;
134
+ }
135
+ function systemdEscapeEnv(value) {
136
+ return value.replaceAll('\\', '\\\\').replaceAll('"', '\\"').replaceAll(' ', '\\x20');
137
+ }
138
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/onboard/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,KAAK,IAAI,UAAU,EAAE,MAAM,OAAO,CAAC;AAE5C,OAAO,EACL,eAAe,EACf,cAAc,EACd,aAAa,GACd,MAAM,aAAa,CAAC;AAOrB,MAAM,CAAC,MAAM,aAAa,GAAG,qBAAqB,CAAC;AACnD,MAAM,CAAC,MAAM,YAAY,GAAG,iBAAiB,CAAC;AA2B9C,MAAM,UAAU,eAAe,CAC7B,WAA4B,OAAO,CAAC,QAAQ,EAC5C,OAAO,GAAG,OAAO,EAAE;IAEnB,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO;YACL,QAAQ,EAAE,SAAS;YACnB,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,aAAa,QAAQ,CAAC;SACzE,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO;YACL,QAAQ,EAAE,SAAS;YACnB,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,CAAC;SAChE,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,KAAK,CACb,6EAA6E,QAAQ,GAAG,CACzF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAA8B;IAE9B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,EAAE,CAAC;IAC7C,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IACpD,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,sBAAsB,EAAE;QAC9D,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM;KAC/B,CAAC,CAAC;IACH,cAAc,CAAC,SAAS,EAAE,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,mBAAmB,EAAE;QACjE,IAAI,EAAE,KAAK;QACX,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM;KAC/B,CAAC,CAAC;IACH,cAAc,CAAC,SAAS,EAAE,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,mBAAmB,EAAE;QACjE,IAAI,EAAE,KAAK;QACX,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM;KAC/B,CAAC,CAAC;IAEH,MAAM,OAAO,GACX,IAAI,CAAC,QAAQ,KAAK,SAAS;QACzB,CAAC,CAAC,kBAAkB,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC;QAC3D,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IAC/D,MAAM,UAAU,GAAG,aAAa,CAC9B,IAAI,CAAC,IAAI,EACT,OAAO,EACP,OAAO,CAAC,MAAM,EACd,GAAG,IAAI,CAAC,QAAQ,OAAO,EACvB;QACE,IAAI,EAAE,KAAK;QACX,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM;KAC/B,CACF,CAAC;IAEF,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC;SAAM,CAAC;QACN,MAAM,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,QAAQ,EAAE,IAAI,CAAC,IAAI;QACnB,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,YAAY;KACtC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,OAA8B,EAC9B,SAAiB,EACjB,SAAiB;IAEjB,OAAO,UAAU,CAAC;QAChB,KAAK,EAAE,aAAa;QACpB,gBAAgB,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC;QAC/C,SAAS,EAAE,IAAI;QACf,SAAS,EAAE,IAAI;QACf,gBAAgB,EAAE,OAAO,CAAC,UAAU;QACpC,oBAAoB,EAAE,yBAAyB,CAAC,OAAO,CAAC;QACxD,eAAe,EAAE,SAAS;QAC1B,iBAAiB,EAAE,SAAS;KAC7B,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,OAA8B,EAC9B,SAAiB,EACjB,SAAiB;IAEjB,OAAO;;;;;YAKG,gBAAgB,CAAC,OAAO,CAAC,UAAU,CAAC;mBAC7B,gBAAgB,CAAC,OAAO,CAAC,UAAU,CAAC;EACrD,MAAM,CAAC,OAAO,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC;SACjD,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,eAAe,GAAG,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;SACtE,IAAI,CAAC,IAAI,CAAC;;;wBAGW,SAAS;uBACV,SAAS;;;;CAI/B,CAAC;AACF,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,OAA8B;IAE9B,OAAO;QACL,kBAAkB,EAAE,OAAO,CAAC,SAAS;QACrC,sBAAsB,EAAE,OAAO,CAAC,UAAU;QAC1C,oBAAoB,EAAE,OAAO,CAAC,QAAQ;KACvC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,QAAgB,EAChB,UAAgD,EAChD,OAA8B;IAE9B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IAC9C,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC9E,CAAC;IACD,MAAM,aAAa,GAAG,OAAO,GAAG,IAAI,aAAa,EAAE,CAAC;IACpD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,KAAK,CACvC,WAAW,EACX,CAAC,OAAO,EAAE,aAAa,CAAC,EACxB,EAAE,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,CACnC,CAAC;IACF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,CACtB,WAAW,EACX,CAAC,WAAW,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,CAAC,EACrC,EAAE,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,CACnC,CAAC;IACJ,CAAC;SAAM,IAAI,UAAU,KAAK,WAAW,EAAE,CAAC;QACtC,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,SAAS,EAAE,aAAa,CAAC,EAAE;YAChE,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM;SAC/B,CAAC,CAAC;QACH,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,CACtB,WAAW,EACX,CAAC,WAAW,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,CAAC,EACrC,EAAE,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,CACnC,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;QACjC,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,CACtB,WAAW,EACX,CAAC,WAAW,EAAE,IAAI,EAAE,aAAa,CAAC,EAClC,EAAE,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,CACnC,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,QAAgB,EAChB,OAA8B;IAE9B,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,eAAe,CAAC,EAAE;QACjE,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM;KAC/B,CAAC,CAAC;IACH,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY;QAC7C,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,CAAC;QAC7C,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;IACvC,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,UAAU,EAAE;QAChD,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM;KAC/B,CAAC,CAAC;IACH,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,WAAW,EAAE,iCAAiC,CAAC,CAAC;AAClF,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa;IACrC,IAAI,0BAA0B,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACzD,OAAO,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC;AACtE,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa;IACrC,OAAO,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AACxF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/feishu/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/onboard/types.ts"],"names":[],"mappings":""}