@openacp/cli 2026.330.2 → 2026.331.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -0
- package/dist/adapter-ELG3VRZ3.js +14 -0
- package/dist/{agent-catalog-SZQQERV7.js → agent-catalog-UYD26QDK.js} +3 -3
- package/dist/{api-client-XTLRRFPX.js → api-client-PEMHYL5U.js} +2 -2
- package/dist/{api-server-JLBDKCU4.js → api-server-DATG2KBR.js} +3 -3
- package/dist/api-server-L5Z7XACW.js +7 -0
- package/dist/chunk-23SRIVG4.js +50 -0
- package/dist/chunk-23SRIVG4.js.map +1 -0
- package/dist/{chunk-YIGBJFJL.js → chunk-7GXEMMEV.js} +15 -15
- package/dist/{chunk-QWVHCTCA.js → chunk-7U6IZIJP.js} +37 -23
- package/dist/chunk-7U6IZIJP.js.map +1 -0
- package/dist/{chunk-FCTC7KDT.js → chunk-7YIKTRSM.js} +14 -10
- package/dist/chunk-7YIKTRSM.js.map +1 -0
- package/dist/{chunk-MITTQMGZ.js → chunk-BYCJQPMN.js} +5 -5
- package/dist/chunk-BYCJQPMN.js.map +1 -0
- package/dist/{chunk-5ZNBNIK3.js → chunk-EWVXSTQK.js} +193 -53
- package/dist/chunk-EWVXSTQK.js.map +1 -0
- package/dist/{chunk-UWH7KIAA.js → chunk-FPKQYCQS.js} +88 -13
- package/dist/chunk-FPKQYCQS.js.map +1 -0
- package/dist/{chunk-GEOXPGCO.js → chunk-K6UY5M75.js} +12 -9
- package/dist/chunk-K6UY5M75.js.map +1 -0
- package/dist/{chunk-KDU3ZEWT.js → chunk-KGAQW6F4.js} +12 -3
- package/dist/chunk-KGAQW6F4.js.map +1 -0
- package/dist/{chunk-7RKPIM3E.js → chunk-LRV56K2M.js} +205 -16
- package/dist/chunk-LRV56K2M.js.map +1 -0
- package/dist/{chunk-V2YZWYXT.js → chunk-MDJHCCFS.js} +18 -17
- package/dist/chunk-MDJHCCFS.js.map +1 -0
- package/dist/chunk-NHD5XDD2.js +686 -0
- package/dist/chunk-NHD5XDD2.js.map +1 -0
- package/dist/{chunk-APS6UEFU.js → chunk-NJX75BLK.js} +1 -1
- package/dist/chunk-NJX75BLK.js.map +1 -0
- package/dist/{chunk-5HKQCYOI.js → chunk-NOEAJNTK.js} +14 -3
- package/dist/chunk-NOEAJNTK.js.map +1 -0
- package/dist/chunk-ON7HB5O7.js +58 -0
- package/dist/chunk-ON7HB5O7.js.map +1 -0
- package/dist/{chunk-5OCGO27U.js → chunk-OSBZXY2W.js} +2 -1
- package/dist/chunk-OSBZXY2W.js.map +1 -0
- package/dist/{chunk-PA6MNBG4.js → chunk-P3HHJANC.js} +32 -13
- package/dist/chunk-P3HHJANC.js.map +1 -0
- package/dist/{chunk-BTJHGSLM.js → chunk-R2YLDQLI.js} +9 -10
- package/dist/chunk-R2YLDQLI.js.map +1 -0
- package/dist/{chunk-CFUJGWOP.js → chunk-SSLVNCEA.js} +27 -3
- package/dist/chunk-SSLVNCEA.js.map +1 -0
- package/dist/{chunk-MPGEHTGE.js → chunk-TGP34LQN.js} +9 -7
- package/dist/chunk-TGP34LQN.js.map +1 -0
- package/dist/{chunk-TMVTSWVH.js → chunk-VUSCVRJL.js} +2 -1
- package/dist/chunk-VUSCVRJL.js.map +1 -0
- package/dist/chunk-XRJUS6FE.js +53 -0
- package/dist/chunk-XRJUS6FE.js.map +1 -0
- package/dist/{chunk-W4LK6WJP.js → chunk-YZCKSNRN.js} +24 -17
- package/dist/chunk-YZCKSNRN.js.map +1 -0
- package/dist/{chunk-3NAFXVQM.js → chunk-ZIRH6QWW.js} +7 -5
- package/dist/chunk-ZIRH6QWW.js.map +1 -0
- package/dist/cli.d.ts +11 -0
- package/dist/cli.js +334 -140
- package/dist/cli.js.map +1 -1
- package/dist/config-X4UP7H6R.js +13 -0
- package/dist/config-editor-7BENRVG5.js +11 -0
- package/dist/{config-registry-ZXAIJNYB.js → config-registry-M3FFWEVM.js} +3 -2
- package/dist/context-FVGCU5TI.js +9 -0
- package/dist/core-plugins-JSY2I44L.js +25 -0
- package/dist/{daemon-XFEMMJSZ.js → daemon-UOSRDEXW.js} +8 -3
- package/dist/doctor-6DLACBR4.js +10 -0
- package/dist/{file-service-HHB3JQIO.js → file-service-FQQYME7M.js} +2 -2
- package/dist/index.d.ts +265 -32
- package/dist/index.js +44 -33
- package/dist/index.js.map +1 -1
- package/dist/{install-cloudflared-JRJ4BSOM.js → install-cloudflared-LNS5L5FR.js} +5 -4
- package/dist/install-cloudflared-LNS5L5FR.js.map +1 -0
- package/dist/{install-context-EHYV5WRY.js → install-context-KZO5FR4D.js} +4 -3
- package/dist/install-context-KZO5FR4D.js.map +1 -0
- package/dist/{install-jq-ISTGT263.js → install-jq-SN4IA5K4.js} +3 -3
- package/dist/instance-context-FLCE7VZ4.js +13 -0
- package/dist/instance-registry-SW5FWKHO.js +7 -0
- package/dist/{main-L2M4NTJY.js → main-D7M2AKRM.js} +91 -48
- package/dist/main-D7M2AKRM.js.map +1 -0
- package/dist/{plugin-create-EHL76ZZG.js → plugin-create-HFKS23JY.js} +4 -2
- package/dist/{plugin-create-EHL76ZZG.js.map → plugin-create-HFKS23JY.js.map} +1 -1
- package/dist/{post-upgrade-Y26S2ZQ7.js → post-upgrade-F4YPMTUT.js} +6 -6
- package/dist/{security-2BA265LN.js → security-O4XGN2CM.js} +2 -2
- package/dist/{setup-E6BNEYCS.js → setup-44WLBIOT.js} +209 -22
- package/dist/setup-44WLBIOT.js.map +1 -0
- package/dist/{speech-SG62JYIF.js → speech-GHTSWDAN.js} +2 -2
- package/dist/telegram-D7ASLVEB.js +7 -0
- package/dist/telegram-D7ASLVEB.js.map +1 -0
- package/dist/tunnel-ALJDPFDQ.js +10 -0
- package/dist/tunnel-ALJDPFDQ.js.map +1 -0
- package/dist/{tunnel-service-ZMO4THKE.js → tunnel-service-TBAHDXMF.js} +41 -547
- package/dist/tunnel-service-TBAHDXMF.js.map +1 -0
- package/package.json +1 -1
- package/dist/adapter-4U6MC5ZS.js +0 -13
- package/dist/api-server-5VNYFWJE.js +0 -7
- package/dist/chunk-3NAFXVQM.js.map +0 -1
- package/dist/chunk-4WXALZA3.js +0 -45
- package/dist/chunk-4WXALZA3.js.map +0 -1
- package/dist/chunk-5HKQCYOI.js.map +0 -1
- package/dist/chunk-5OCGO27U.js.map +0 -1
- package/dist/chunk-5ZNBNIK3.js.map +0 -1
- package/dist/chunk-7RKPIM3E.js.map +0 -1
- package/dist/chunk-APS6UEFU.js.map +0 -1
- package/dist/chunk-BTJHGSLM.js.map +0 -1
- package/dist/chunk-CFUJGWOP.js.map +0 -1
- package/dist/chunk-FCTC7KDT.js.map +0 -1
- package/dist/chunk-GEOXPGCO.js.map +0 -1
- package/dist/chunk-KDU3ZEWT.js.map +0 -1
- package/dist/chunk-MITTQMGZ.js.map +0 -1
- package/dist/chunk-MPGEHTGE.js.map +0 -1
- package/dist/chunk-PA6MNBG4.js.map +0 -1
- package/dist/chunk-QWVHCTCA.js.map +0 -1
- package/dist/chunk-TMVTSWVH.js.map +0 -1
- package/dist/chunk-UWH7KIAA.js.map +0 -1
- package/dist/chunk-V2YZWYXT.js.map +0 -1
- package/dist/chunk-W4LK6WJP.js.map +0 -1
- package/dist/config-KN6NKKPF.js +0 -20
- package/dist/config-editor-76RVZS4B.js +0 -10
- package/dist/context-NXXW62NJ.js +0 -9
- package/dist/core-plugins-OCHKGCIZ.js +0 -22
- package/dist/doctor-AV6AUO22.js +0 -9
- package/dist/install-cloudflared-JRJ4BSOM.js.map +0 -1
- package/dist/install-context-EHYV5WRY.js.map +0 -1
- package/dist/main-L2M4NTJY.js.map +0 -1
- package/dist/setup-E6BNEYCS.js.map +0 -1
- package/dist/telegram-EAVRDNFU.js +0 -7
- package/dist/tunnel-HWJ27WDH.js +0 -7
- package/dist/tunnel-service-ZMO4THKE.js.map +0 -1
- /package/dist/{adapter-4U6MC5ZS.js.map → adapter-ELG3VRZ3.js.map} +0 -0
- /package/dist/{agent-catalog-SZQQERV7.js.map → agent-catalog-UYD26QDK.js.map} +0 -0
- /package/dist/{api-client-XTLRRFPX.js.map → api-client-PEMHYL5U.js.map} +0 -0
- /package/dist/{api-server-5VNYFWJE.js.map → api-server-DATG2KBR.js.map} +0 -0
- /package/dist/{api-server-JLBDKCU4.js.map → api-server-L5Z7XACW.js.map} +0 -0
- /package/dist/{chunk-YIGBJFJL.js.map → chunk-7GXEMMEV.js.map} +0 -0
- /package/dist/{config-KN6NKKPF.js.map → config-X4UP7H6R.js.map} +0 -0
- /package/dist/{config-editor-76RVZS4B.js.map → config-editor-7BENRVG5.js.map} +0 -0
- /package/dist/{config-registry-ZXAIJNYB.js.map → config-registry-M3FFWEVM.js.map} +0 -0
- /package/dist/{context-NXXW62NJ.js.map → context-FVGCU5TI.js.map} +0 -0
- /package/dist/{core-plugins-OCHKGCIZ.js.map → core-plugins-JSY2I44L.js.map} +0 -0
- /package/dist/{daemon-XFEMMJSZ.js.map → daemon-UOSRDEXW.js.map} +0 -0
- /package/dist/{doctor-AV6AUO22.js.map → doctor-6DLACBR4.js.map} +0 -0
- /package/dist/{file-service-HHB3JQIO.js.map → file-service-FQQYME7M.js.map} +0 -0
- /package/dist/{install-jq-ISTGT263.js.map → install-jq-SN4IA5K4.js.map} +0 -0
- /package/dist/{security-2BA265LN.js.map → instance-context-FLCE7VZ4.js.map} +0 -0
- /package/dist/{speech-SG62JYIF.js.map → instance-registry-SW5FWKHO.js.map} +0 -0
- /package/dist/{post-upgrade-Y26S2ZQ7.js.map → post-upgrade-F4YPMTUT.js.map} +0 -0
- /package/dist/{telegram-EAVRDNFU.js.map → security-O4XGN2CM.js.map} +0 -0
- /package/dist/{tunnel-HWJ27WDH.js.map → speech-GHTSWDAN.js.map} +0 -0
|
@@ -4,19 +4,26 @@ import {
|
|
|
4
4
|
validateChatId
|
|
5
5
|
} from "./chunk-WQCJTU2C.js";
|
|
6
6
|
import {
|
|
7
|
-
|
|
8
|
-
} from "./chunk-
|
|
7
|
+
InstanceRegistry
|
|
8
|
+
} from "./chunk-23SRIVG4.js";
|
|
9
9
|
import {
|
|
10
10
|
expandHome
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-YZCKSNRN.js";
|
|
12
12
|
import "./chunk-R6KZYF7D.js";
|
|
13
|
+
import {
|
|
14
|
+
commandExists
|
|
15
|
+
} from "./chunk-ZSLHHQPQ.js";
|
|
16
|
+
import {
|
|
17
|
+
generateSlug,
|
|
18
|
+
getGlobalRoot
|
|
19
|
+
} from "./chunk-ON7HB5O7.js";
|
|
13
20
|
import {
|
|
14
21
|
RegistryClient
|
|
15
22
|
} from "./chunk-CDAUYTVP.js";
|
|
16
23
|
|
|
17
24
|
// src/core/setup/wizard.ts
|
|
18
|
-
import * as
|
|
19
|
-
import * as
|
|
25
|
+
import * as path3 from "path";
|
|
26
|
+
import * as fs2 from "fs";
|
|
20
27
|
import * as clack7 from "@clack/prompts";
|
|
21
28
|
|
|
22
29
|
// src/core/setup/types.ts
|
|
@@ -58,9 +65,9 @@ function guardCancel(value) {
|
|
|
58
65
|
}
|
|
59
66
|
return value;
|
|
60
67
|
}
|
|
61
|
-
function applyGradient(
|
|
68
|
+
function applyGradient(text3) {
|
|
62
69
|
const colors = [135, 99, 63, 33, 39, 44, 44];
|
|
63
|
-
const lines =
|
|
70
|
+
const lines = text3.split("\n");
|
|
64
71
|
return lines.map((line, i) => {
|
|
65
72
|
const colorIdx = Math.min(i, colors.length - 1);
|
|
66
73
|
return `\x1B[38;5;${colors[colorIdx]}m${line}\x1B[0m`;
|
|
@@ -141,7 +148,7 @@ async function validateAgentCommand(command) {
|
|
|
141
148
|
}
|
|
142
149
|
}
|
|
143
150
|
async function setupAgents() {
|
|
144
|
-
const { AgentCatalog } = await import("./agent-catalog-
|
|
151
|
+
const { AgentCatalog } = await import("./agent-catalog-UYD26QDK.js");
|
|
145
152
|
const { muteLogger, unmuteLogger } = await import("./log-YZ243M5G.js");
|
|
146
153
|
muteLogger();
|
|
147
154
|
const catalog = new AgentCatalog();
|
|
@@ -307,7 +314,7 @@ async function setupRunMode(opts) {
|
|
|
307
314
|
const { muteLogger, unmuteLogger } = await import("./log-YZ243M5G.js");
|
|
308
315
|
muteLogger();
|
|
309
316
|
try {
|
|
310
|
-
const { stopDaemon } = await import("./daemon-
|
|
317
|
+
const { stopDaemon } = await import("./daemon-UOSRDEXW.js");
|
|
311
318
|
const result = await stopDaemon();
|
|
312
319
|
unmuteLogger();
|
|
313
320
|
if (result.stopped) {
|
|
@@ -358,7 +365,6 @@ async function setupIntegrations(config) {
|
|
|
358
365
|
}
|
|
359
366
|
|
|
360
367
|
// src/core/setup/setup-channels.ts
|
|
361
|
-
import * as os from "os";
|
|
362
368
|
import * as path from "path";
|
|
363
369
|
import * as clack6 from "@clack/prompts";
|
|
364
370
|
function getChannelStatuses(config) {
|
|
@@ -424,8 +430,8 @@ async function configureViaPlugin(channelId) {
|
|
|
424
430
|
}
|
|
425
431
|
if (plugin?.configure) {
|
|
426
432
|
const { SettingsManager } = await import("./settings-manager-B4UN2LAC.js");
|
|
427
|
-
const { createInstallContext } = await import("./install-context-
|
|
428
|
-
const basePath = path.join(
|
|
433
|
+
const { createInstallContext } = await import("./install-context-KZO5FR4D.js");
|
|
434
|
+
const basePath = path.join(getGlobalRoot(), "plugins", "data");
|
|
429
435
|
const settingsManager = new SettingsManager(basePath);
|
|
430
436
|
const ctx = createInstallContext({
|
|
431
437
|
pluginName: plugin.name,
|
|
@@ -493,6 +499,99 @@ async function configureChannels(config) {
|
|
|
493
499
|
return { config: next, changed };
|
|
494
500
|
}
|
|
495
501
|
|
|
502
|
+
// src/core/instance-copy.ts
|
|
503
|
+
import fs from "fs";
|
|
504
|
+
import path2 from "path";
|
|
505
|
+
async function copyInstance(src, dst, opts) {
|
|
506
|
+
const { inheritableKeys = {}, onProgress } = opts;
|
|
507
|
+
fs.mkdirSync(dst, { recursive: true });
|
|
508
|
+
const configSrc = path2.join(src, "config.json");
|
|
509
|
+
if (fs.existsSync(configSrc)) {
|
|
510
|
+
onProgress?.("Configuration", "start");
|
|
511
|
+
const config = JSON.parse(fs.readFileSync(configSrc, "utf-8"));
|
|
512
|
+
delete config.instanceName;
|
|
513
|
+
if (config.api) delete config.api.port;
|
|
514
|
+
if (config.tunnel) delete config.tunnel.port;
|
|
515
|
+
fs.writeFileSync(path2.join(dst, "config.json"), JSON.stringify(config, null, 2));
|
|
516
|
+
onProgress?.("Configuration", "done");
|
|
517
|
+
}
|
|
518
|
+
const pluginsSrc = path2.join(src, "plugins.json");
|
|
519
|
+
if (fs.existsSync(pluginsSrc)) {
|
|
520
|
+
onProgress?.("Plugin list", "start");
|
|
521
|
+
fs.copyFileSync(pluginsSrc, path2.join(dst, "plugins.json"));
|
|
522
|
+
onProgress?.("Plugin list", "done");
|
|
523
|
+
}
|
|
524
|
+
const pluginsDir = path2.join(src, "plugins");
|
|
525
|
+
if (fs.existsSync(pluginsDir)) {
|
|
526
|
+
onProgress?.("Plugins", "start");
|
|
527
|
+
const dstPlugins = path2.join(dst, "plugins");
|
|
528
|
+
fs.mkdirSync(dstPlugins, { recursive: true });
|
|
529
|
+
const pkgJson = path2.join(pluginsDir, "package.json");
|
|
530
|
+
if (fs.existsSync(pkgJson)) fs.copyFileSync(pkgJson, path2.join(dstPlugins, "package.json"));
|
|
531
|
+
const nodeModules = path2.join(pluginsDir, "node_modules");
|
|
532
|
+
if (fs.existsSync(nodeModules)) fs.cpSync(nodeModules, path2.join(dstPlugins, "node_modules"), { recursive: true });
|
|
533
|
+
onProgress?.("Plugins", "done");
|
|
534
|
+
}
|
|
535
|
+
const agentsJson = path2.join(src, "agents.json");
|
|
536
|
+
if (fs.existsSync(agentsJson)) {
|
|
537
|
+
onProgress?.("Agents", "start");
|
|
538
|
+
fs.copyFileSync(agentsJson, path2.join(dst, "agents.json"));
|
|
539
|
+
const agentsDir = path2.join(src, "agents");
|
|
540
|
+
if (fs.existsSync(agentsDir)) fs.cpSync(agentsDir, path2.join(dst, "agents"), { recursive: true });
|
|
541
|
+
onProgress?.("Agents", "done");
|
|
542
|
+
}
|
|
543
|
+
const binDir = path2.join(src, "bin");
|
|
544
|
+
if (fs.existsSync(binDir)) {
|
|
545
|
+
onProgress?.("Tools", "start");
|
|
546
|
+
fs.cpSync(binDir, path2.join(dst, "bin"), { recursive: true });
|
|
547
|
+
onProgress?.("Tools", "done");
|
|
548
|
+
}
|
|
549
|
+
const pluginDataSrc = path2.join(src, "plugins", "data");
|
|
550
|
+
if (fs.existsSync(pluginDataSrc)) {
|
|
551
|
+
onProgress?.("Preferences", "start");
|
|
552
|
+
copyPluginSettings(pluginDataSrc, path2.join(dst, "plugins", "data"), inheritableKeys);
|
|
553
|
+
onProgress?.("Preferences", "done");
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
function copyPluginSettings(srcData, dstData, inheritableKeys) {
|
|
557
|
+
walkPluginDirs(srcData, (pluginName, settingsPath) => {
|
|
558
|
+
const allowedKeys = inheritableKeys[pluginName];
|
|
559
|
+
if (!allowedKeys || allowedKeys.length === 0) return;
|
|
560
|
+
try {
|
|
561
|
+
const settings = JSON.parse(fs.readFileSync(settingsPath, "utf-8"));
|
|
562
|
+
const filtered = {};
|
|
563
|
+
for (const key of allowedKeys) {
|
|
564
|
+
if (key in settings) filtered[key] = settings[key];
|
|
565
|
+
}
|
|
566
|
+
if (Object.keys(filtered).length > 0) {
|
|
567
|
+
const relative = path2.relative(srcData, path2.dirname(settingsPath));
|
|
568
|
+
const dstDir = path2.join(dstData, relative);
|
|
569
|
+
fs.mkdirSync(dstDir, { recursive: true });
|
|
570
|
+
fs.writeFileSync(path2.join(dstDir, "settings.json"), JSON.stringify(filtered, null, 2));
|
|
571
|
+
}
|
|
572
|
+
} catch {
|
|
573
|
+
}
|
|
574
|
+
});
|
|
575
|
+
}
|
|
576
|
+
function walkPluginDirs(base, cb) {
|
|
577
|
+
if (!fs.existsSync(base)) return;
|
|
578
|
+
for (const entry of fs.readdirSync(base, { withFileTypes: true })) {
|
|
579
|
+
if (!entry.isDirectory()) continue;
|
|
580
|
+
if (entry.name.startsWith("@")) {
|
|
581
|
+
const scopeDir = path2.join(base, entry.name);
|
|
582
|
+
for (const sub of fs.readdirSync(scopeDir, { withFileTypes: true })) {
|
|
583
|
+
if (!sub.isDirectory()) continue;
|
|
584
|
+
const pluginName = `${entry.name}/${sub.name}`;
|
|
585
|
+
const settingsPath = path2.join(scopeDir, sub.name, "settings.json");
|
|
586
|
+
if (fs.existsSync(settingsPath)) cb(pluginName, settingsPath);
|
|
587
|
+
}
|
|
588
|
+
} else {
|
|
589
|
+
const settingsPath = path2.join(base, entry.name, "settings.json");
|
|
590
|
+
if (fs.existsSync(settingsPath)) cb(entry.name, settingsPath);
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
|
|
496
595
|
// src/core/setup/wizard.ts
|
|
497
596
|
async function fetchCommunityAdapters() {
|
|
498
597
|
try {
|
|
@@ -517,6 +616,80 @@ async function runSetup(configManager, opts) {
|
|
|
517
616
|
console.log(fail("Plugin system not initialized. Cannot set up channels."));
|
|
518
617
|
return false;
|
|
519
618
|
}
|
|
619
|
+
const instanceRoot = opts?.instanceRoot ?? getGlobalRoot();
|
|
620
|
+
const isGlobal = instanceRoot === getGlobalRoot();
|
|
621
|
+
let instanceName = opts?.instanceName;
|
|
622
|
+
if (!instanceName) {
|
|
623
|
+
const defaultName = isGlobal ? "Main" : `openacp-${Date.now()}`;
|
|
624
|
+
const nameResult = await clack7.text({
|
|
625
|
+
message: "Give this setup a name",
|
|
626
|
+
defaultValue: defaultName,
|
|
627
|
+
validate: (v) => !v?.trim() ? "Name cannot be empty" : void 0
|
|
628
|
+
});
|
|
629
|
+
if (clack7.isCancel(nameResult)) return false;
|
|
630
|
+
instanceName = nameResult.trim();
|
|
631
|
+
}
|
|
632
|
+
const globalRoot = getGlobalRoot();
|
|
633
|
+
const registryPath = path3.join(globalRoot, "instances.json");
|
|
634
|
+
const instanceRegistry = new InstanceRegistry(registryPath);
|
|
635
|
+
await instanceRegistry.load();
|
|
636
|
+
let didCopy = false;
|
|
637
|
+
if (opts?.from) {
|
|
638
|
+
const fromRoot = path3.join(opts.from, ".openacp");
|
|
639
|
+
if (fs2.existsSync(path3.join(fromRoot, "config.json"))) {
|
|
640
|
+
const inheritableMap = buildInheritableKeysMap();
|
|
641
|
+
await copyInstance(fromRoot, instanceRoot, { inheritableKeys: inheritableMap });
|
|
642
|
+
didCopy = true;
|
|
643
|
+
} else {
|
|
644
|
+
console.error(`No OpenACP setup found at ${fromRoot}`);
|
|
645
|
+
return false;
|
|
646
|
+
}
|
|
647
|
+
}
|
|
648
|
+
if (!didCopy) {
|
|
649
|
+
const existingInstances = instanceRegistry.list().filter(
|
|
650
|
+
(e) => fs2.existsSync(path3.join(e.root, "config.json")) && e.root !== instanceRoot
|
|
651
|
+
);
|
|
652
|
+
if (existingInstances.length > 0) {
|
|
653
|
+
const shouldCopy = await clack7.confirm({
|
|
654
|
+
message: "Use settings from an existing setup as a starting point?",
|
|
655
|
+
initialValue: true
|
|
656
|
+
});
|
|
657
|
+
if (clack7.isCancel(shouldCopy)) return false;
|
|
658
|
+
if (shouldCopy === true) {
|
|
659
|
+
let sourceRoot;
|
|
660
|
+
if (existingInstances.length === 1) {
|
|
661
|
+
sourceRoot = existingInstances[0].root;
|
|
662
|
+
} else {
|
|
663
|
+
const choice = await clack7.select({
|
|
664
|
+
message: "Which setup to copy from?",
|
|
665
|
+
options: existingInstances.map((e) => {
|
|
666
|
+
let name = e.id;
|
|
667
|
+
try {
|
|
668
|
+
const cfg = JSON.parse(fs2.readFileSync(path3.join(e.root, "config.json"), "utf-8"));
|
|
669
|
+
if (cfg.instanceName) name = cfg.instanceName;
|
|
670
|
+
} catch {
|
|
671
|
+
}
|
|
672
|
+
const displayPath = e.root.replace(/\/.openacp$/, "");
|
|
673
|
+
return { value: e.root, label: `${name} (${displayPath})` };
|
|
674
|
+
})
|
|
675
|
+
});
|
|
676
|
+
if (clack7.isCancel(choice)) return false;
|
|
677
|
+
sourceRoot = choice;
|
|
678
|
+
}
|
|
679
|
+
const inheritableMap = buildInheritableKeysMap();
|
|
680
|
+
await copyInstance(sourceRoot, instanceRoot, {
|
|
681
|
+
inheritableKeys: inheritableMap,
|
|
682
|
+
onProgress: (step2, status) => {
|
|
683
|
+
if (status === "done") console.log(` \u2713 ${step2}`);
|
|
684
|
+
}
|
|
685
|
+
});
|
|
686
|
+
didCopy = true;
|
|
687
|
+
}
|
|
688
|
+
}
|
|
689
|
+
}
|
|
690
|
+
if (didCopy && await configManager.exists()) {
|
|
691
|
+
await configManager.load();
|
|
692
|
+
}
|
|
520
693
|
const communityAdapters = await fetchCommunityAdapters();
|
|
521
694
|
const builtInOptions = [
|
|
522
695
|
{ label: "Telegram", value: "telegram" }
|
|
@@ -540,11 +713,11 @@ async function runSetup(configManager, opts) {
|
|
|
540
713
|
const runModeSteps = opts?.skipRunMode ? 0 : 1;
|
|
541
714
|
const totalSteps = channelSteps + 1 + runModeSteps;
|
|
542
715
|
let currentStep = 0;
|
|
543
|
-
const { createInstallContext } = await import("./install-context-
|
|
716
|
+
const { createInstallContext } = await import("./install-context-KZO5FR4D.js");
|
|
544
717
|
for (const channelId of channelChoices) {
|
|
545
718
|
currentStep++;
|
|
546
719
|
if (channelId === "telegram") {
|
|
547
|
-
const telegramPlugin = (await import("./telegram-
|
|
720
|
+
const telegramPlugin = (await import("./telegram-D7ASLVEB.js")).default;
|
|
548
721
|
const ctx = createInstallContext({
|
|
549
722
|
pluginName: telegramPlugin.name,
|
|
550
723
|
settingsManager,
|
|
@@ -562,8 +735,8 @@ async function runSetup(configManager, opts) {
|
|
|
562
735
|
if (channelId.startsWith("community:")) {
|
|
563
736
|
const npmPackage = channelId.slice("community:".length);
|
|
564
737
|
const { execFileSync: execFileSync2 } = await import("child_process");
|
|
565
|
-
const pluginsDir =
|
|
566
|
-
const nodeModulesDir =
|
|
738
|
+
const pluginsDir = path3.join(getGlobalRoot(), "plugins");
|
|
739
|
+
const nodeModulesDir = path3.join(pluginsDir, "node_modules");
|
|
567
740
|
try {
|
|
568
741
|
execFileSync2("npm", ["install", npmPackage, "--prefix", pluginsDir, "--save"], {
|
|
569
742
|
stdio: "inherit",
|
|
@@ -574,10 +747,10 @@ async function runSetup(configManager, opts) {
|
|
|
574
747
|
return false;
|
|
575
748
|
}
|
|
576
749
|
try {
|
|
577
|
-
const { readFileSync } = await import("fs");
|
|
578
|
-
const installedPkgPath =
|
|
579
|
-
const installedPkg = JSON.parse(
|
|
580
|
-
const pluginModule = await import(
|
|
750
|
+
const { readFileSync: readFileSync2 } = await import("fs");
|
|
751
|
+
const installedPkgPath = path3.join(nodeModulesDir, npmPackage, "package.json");
|
|
752
|
+
const installedPkg = JSON.parse(readFileSync2(installedPkgPath, "utf-8"));
|
|
753
|
+
const pluginModule = await import(path3.join(nodeModulesDir, npmPackage, installedPkg.main ?? "dist/index.js"));
|
|
581
754
|
const plugin = pluginModule.default;
|
|
582
755
|
if (plugin?.install) {
|
|
583
756
|
const installCtx = createInstallContext({
|
|
@@ -624,6 +797,7 @@ async function runSetup(configManager, opts) {
|
|
|
624
797
|
sessionTimeoutMinutes: 60
|
|
625
798
|
};
|
|
626
799
|
const config = {
|
|
800
|
+
instanceName,
|
|
627
801
|
channels: {},
|
|
628
802
|
agents: {},
|
|
629
803
|
defaultAgent,
|
|
@@ -662,7 +836,8 @@ async function runSetup(configManager, opts) {
|
|
|
662
836
|
speech: {
|
|
663
837
|
stt: { provider: null, providers: {} },
|
|
664
838
|
tts: { provider: null, providers: {} }
|
|
665
|
-
}
|
|
839
|
+
},
|
|
840
|
+
agentSwitch: { labelHistory: true }
|
|
666
841
|
};
|
|
667
842
|
try {
|
|
668
843
|
await configManager.writeNew(config);
|
|
@@ -676,6 +851,9 @@ async function runSetup(configManager, opts) {
|
|
|
676
851
|
await registerBuiltinPlugins(settingsManager, pluginRegistry);
|
|
677
852
|
await pluginRegistry.save();
|
|
678
853
|
}
|
|
854
|
+
const id = instanceRegistry.uniqueId(generateSlug(instanceName));
|
|
855
|
+
instanceRegistry.register(id, instanceRoot);
|
|
856
|
+
await instanceRegistry.save();
|
|
679
857
|
clack7.outro(`Config saved to ${configManager.getConfigPath()}`);
|
|
680
858
|
if (!opts?.skipRunMode) {
|
|
681
859
|
console.log(ok("Starting OpenACP..."));
|
|
@@ -712,6 +890,15 @@ async function registerBuiltinPlugins(settingsManager, pluginRegistry) {
|
|
|
712
890
|
}
|
|
713
891
|
}
|
|
714
892
|
}
|
|
893
|
+
function buildInheritableKeysMap() {
|
|
894
|
+
return {
|
|
895
|
+
"@openacp/tunnel": ["provider", "maxUserTunnels", "auth"],
|
|
896
|
+
"@openacp/api-server": ["host"],
|
|
897
|
+
"@openacp/security": ["allowedUsers", "maxSessionsPerUser", "rateLimits"],
|
|
898
|
+
"@openacp/usage": ["budget"],
|
|
899
|
+
"@openacp/speech": ["tts"]
|
|
900
|
+
};
|
|
901
|
+
}
|
|
715
902
|
async function selectSection(hasSelection) {
|
|
716
903
|
return guardCancel(
|
|
717
904
|
await clack7.select({
|
|
@@ -799,4 +986,4 @@ export {
|
|
|
799
986
|
validateBotToken,
|
|
800
987
|
validateChatId
|
|
801
988
|
};
|
|
802
|
-
//# sourceMappingURL=setup-
|
|
989
|
+
//# sourceMappingURL=setup-44WLBIOT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/core/setup/wizard.ts","../../src/core/setup/types.ts","../../src/core/setup/helpers.ts","../../src/core/setup/setup-agents.ts","../../src/core/setup/setup-workspace.ts","../../src/core/setup/setup-run-mode.ts","../../src/core/setup/setup-integrations.ts","../../src/core/setup/setup-channels.ts","../../src/core/instance-copy.ts"],"sourcesContent":["import * as path from \"node:path\";\nimport * as fs from \"node:fs\";\nimport * as clack from \"@clack/prompts\";\nimport type { Config, ConfigManager } from \"../config/config.js\";\nimport type { ChannelId } from \"./types.js\";\nimport type { OnboardSection } from \"./types.js\";\nimport { ONBOARD_SECTION_OPTIONS } from \"./types.js\";\nimport type { CommunityAdapterOption } from \"./types.js\";\nimport { guardCancel, ok, fail, printStartBanner, summarizeConfig } from \"./helpers.js\";\nimport { setupAgents } from \"./setup-agents.js\";\nimport { setupWorkspace } from \"./setup-workspace.js\";\nimport { setupRunMode } from \"./setup-run-mode.js\";\nimport { setupIntegrations } from \"./setup-integrations.js\";\nimport { configureChannels } from \"./setup-channels.js\";\nimport { RegistryClient } from \"../plugin/registry-client.js\";\nimport type { SettingsManager } from \"../plugin/settings-manager.js\";\nimport type { PluginRegistry } from \"../plugin/plugin-registry.js\";\nimport { InstanceRegistry } from \"../instance-registry.js\";\nimport { generateSlug, getGlobalRoot } from \"../instance-context.js\";\nimport { copyInstance } from \"../instance-copy.js\";\n\n// ─── Registry discovery ───\n\nasync function fetchCommunityAdapters(): Promise<CommunityAdapterOption[]> {\n try {\n const client = new RegistryClient()\n const registry = await client.getRegistry()\n return registry.plugins\n .filter(p => p.category === 'adapter' && p.verified)\n .map(p => ({\n name: p.npm,\n displayName: p.displayName ?? p.name,\n icon: p.icon,\n verified: p.verified,\n }))\n } catch {\n return []\n }\n}\n\n// ─── First-run setup ───\n\nexport async function runSetup(\n configManager: ConfigManager,\n opts?: {\n skipRunMode?: boolean\n settingsManager?: SettingsManager\n pluginRegistry?: PluginRegistry\n instanceName?: string\n from?: string // path to copy from (parent dir, not .openacp)\n instanceRoot?: string // the .openacp dir being set up\n },\n): Promise<boolean> {\n await printStartBanner();\n clack.intro(\"Let's set up OpenACP\");\n\n const { settingsManager, pluginRegistry } = opts ?? {};\n\n try {\n if (!settingsManager || !pluginRegistry) {\n console.log(fail('Plugin system not initialized. Cannot set up channels.'));\n return false;\n }\n\n // ─── Instance name prompt ───\n\n const instanceRoot = opts?.instanceRoot ?? getGlobalRoot();\n const isGlobal = instanceRoot === getGlobalRoot();\n\n let instanceName = opts?.instanceName;\n if (!instanceName) {\n const defaultName = isGlobal ? 'Main' : `openacp-${Date.now()}`;\n const nameResult = await clack.text({\n message: 'Give this setup a name',\n defaultValue: defaultName,\n validate: (v) => (!v?.trim() ? 'Name cannot be empty' : undefined),\n });\n if (clack.isCancel(nameResult)) return false;\n instanceName = nameResult.trim();\n }\n\n // ─── Copy-from flow ───\n\n const globalRoot = getGlobalRoot();\n const registryPath = path.join(globalRoot, 'instances.json');\n const instanceRegistry = new InstanceRegistry(registryPath);\n await instanceRegistry.load();\n\n let didCopy = false;\n\n // Check --from flag first\n if (opts?.from) {\n const fromRoot = path.join(opts.from, '.openacp');\n if (fs.existsSync(path.join(fromRoot, 'config.json'))) {\n const inheritableMap = buildInheritableKeysMap();\n await copyInstance(fromRoot, instanceRoot, { inheritableKeys: inheritableMap });\n didCopy = true;\n } else {\n console.error(`No OpenACP setup found at ${fromRoot}`);\n return false;\n }\n }\n\n // If no --from, check if we can offer to copy interactively\n if (!didCopy) {\n const existingInstances = instanceRegistry.list().filter(e =>\n fs.existsSync(path.join(e.root, 'config.json')) && e.root !== instanceRoot\n );\n\n if (existingInstances.length > 0) {\n const shouldCopy = await clack.confirm({\n message: 'Use settings from an existing setup as a starting point?',\n initialValue: true,\n });\n\n if (clack.isCancel(shouldCopy)) return false;\n\n if (shouldCopy === true) {\n let sourceRoot: string;\n if (existingInstances.length === 1) {\n sourceRoot = existingInstances[0]!.root;\n } else {\n const choice = await clack.select({\n message: 'Which setup to copy from?',\n options: existingInstances.map(e => {\n let name = e.id;\n try {\n const cfg = JSON.parse(fs.readFileSync(path.join(e.root, 'config.json'), 'utf-8'));\n if (cfg.instanceName) name = cfg.instanceName;\n } catch {}\n const displayPath = e.root.replace(/\\/.openacp$/, '');\n return { value: e.root, label: `${name} (${displayPath})` };\n }),\n });\n if (clack.isCancel(choice)) return false;\n sourceRoot = choice;\n }\n\n const inheritableMap = buildInheritableKeysMap();\n await copyInstance(sourceRoot, instanceRoot, {\n inheritableKeys: inheritableMap,\n onProgress: (step, status) => {\n if (status === 'done') console.log(` ✓ ${step}`);\n },\n });\n didCopy = true;\n }\n }\n }\n\n // If copied, reload config so the wizard sees existing values\n if (didCopy && await configManager.exists()) {\n await configManager.load();\n }\n\n const communityAdapters = await fetchCommunityAdapters()\n\n const builtInOptions = [\n { label: 'Telegram', value: 'telegram' },\n ]\n\n const communityOptions = communityAdapters.map(a => ({\n label: `${a.icon} ${a.displayName}${a.verified ? ' (verified)' : ''}`,\n value: `community:${a.name}`,\n }))\n\n // Ask user which channels to set up\n const channelChoices = guardCancel(\n await clack.multiselect({\n message: 'Which channels do you want to set up?',\n options: [\n ...builtInOptions.map(o => ({ value: o.value, label: o.label, hint: 'built-in' })),\n ...(communityOptions.length > 0\n ? communityOptions.map(o => ({ value: o.value, label: o.label, hint: 'from plugin registry' }))\n : []),\n ],\n required: true,\n initialValues: ['telegram' as const],\n }),\n ) as string[];\n\n // Calculate total steps dynamically: channel(s) + workspace + run mode\n const channelSteps = channelChoices.length;\n const runModeSteps = opts?.skipRunMode ? 0 : 1;\n const totalSteps = channelSteps + 1 + runModeSteps; // + workspace + optional run mode\n\n let currentStep = 0;\n\n const { createInstallContext } = await import('../plugin/install-context.js');\n\n for (const channelId of channelChoices) {\n currentStep++;\n\n if (channelId === 'telegram') {\n const telegramPlugin = (await import('../../plugins/telegram/index.js')).default;\n const ctx = createInstallContext({\n pluginName: telegramPlugin.name,\n settingsManager,\n basePath: settingsManager.getBasePath(),\n });\n await telegramPlugin.install!(ctx);\n pluginRegistry.register(telegramPlugin.name, {\n version: telegramPlugin.version,\n source: 'builtin',\n enabled: true,\n settingsPath: settingsManager.getSettingsPath(telegramPlugin.name),\n description: telegramPlugin.description,\n });\n }\n\n\n // Handle community plugin selections\n if (channelId.startsWith('community:')) {\n const npmPackage = channelId.slice('community:'.length);\n const { execFileSync } = await import('node:child_process');\n const pluginsDir = path.join(getGlobalRoot(), 'plugins');\n const nodeModulesDir = path.join(pluginsDir, 'node_modules');\n\n // Install from npm\n try {\n execFileSync('npm', ['install', npmPackage, '--prefix', pluginsDir, '--save'], {\n stdio: 'inherit',\n timeout: 60000,\n });\n } catch {\n console.log(fail(`Failed to install ${npmPackage}.`));\n return false;\n }\n\n // Load and run install hook\n try {\n const { readFileSync } = await import('node:fs');\n const installedPkgPath = path.join(nodeModulesDir, npmPackage, 'package.json');\n const installedPkg = JSON.parse(readFileSync(installedPkgPath, 'utf-8'));\n const pluginModule = await import(path.join(nodeModulesDir, npmPackage, installedPkg.main ?? 'dist/index.js'));\n const plugin = pluginModule.default;\n\n if (plugin?.install) {\n const installCtx = createInstallContext({\n pluginName: plugin.name ?? npmPackage,\n settingsManager,\n basePath: settingsManager.getBasePath(),\n });\n await plugin.install(installCtx);\n }\n\n pluginRegistry.register(plugin?.name ?? npmPackage, {\n version: installedPkg.version,\n source: 'npm',\n enabled: true,\n settingsPath: settingsManager.getSettingsPath(plugin?.name ?? npmPackage),\n description: plugin?.description ?? installedPkg.description,\n });\n } catch (err) {\n // Plugin installed via npm but failed to load — register as disabled\n console.log(fail(`Failed to load ${npmPackage}: ${(err as Error).message}`));\n pluginRegistry.register(npmPackage, {\n version: 'unknown',\n source: 'npm',\n enabled: false,\n settingsPath: settingsManager.getSettingsPath(npmPackage),\n });\n }\n }\n }\n\n // Persist any community plugin registrations from the loop above\n await pluginRegistry.save();\n\n const { defaultAgent } = await setupAgents();\n\n // Offer Claude CLI integration\n await setupIntegrations();\n\n currentStep++;\n const workspace = await setupWorkspace({ stepNum: currentStep, totalSteps });\n\n let runMode: 'foreground' | 'daemon' = 'foreground';\n let autoStart = false;\n if (!opts?.skipRunMode) {\n currentStep++;\n const result = await setupRunMode({ stepNum: currentStep, totalSteps });\n runMode = result.runMode;\n autoStart = result.autoStart;\n }\n\n const security = {\n allowedUserIds: [] as string[],\n maxConcurrentSessions: 20,\n sessionTimeoutMinutes: 60,\n };\n\n const config: Config = {\n instanceName,\n channels: {},\n agents: {},\n defaultAgent,\n workspace,\n security,\n logging: {\n level: \"info\",\n logDir: \"~/.openacp/logs\",\n maxFileSize: \"10m\",\n maxFiles: 7,\n sessionLogRetentionDays: 30,\n },\n runMode,\n autoStart,\n api: {\n port: 21420,\n host: '127.0.0.1',\n },\n sessionStore: { ttlDays: 30 },\n tunnel: {\n enabled: true,\n port: 3100,\n provider: \"cloudflare\",\n options: {},\n maxUserTunnels: 5,\n storeTtlMinutes: 60,\n auth: { enabled: false },\n },\n usage: {\n enabled: true,\n warningThreshold: 0.8,\n currency: \"USD\",\n retentionDays: 90,\n },\n integrations: {},\n speech: {\n stt: { provider: null, providers: {} },\n tts: { provider: null, providers: {} },\n },\n agentSwitch: { labelHistory: true },\n };\n\n try {\n await configManager.writeNew(config);\n } catch (writeErr) {\n console.log(\n fail(`Could not save config: ${(writeErr as Error).message}`),\n );\n return false;\n }\n\n // Auto-register remaining built-in plugins in the registry\n if (settingsManager && pluginRegistry) {\n await registerBuiltinPlugins(settingsManager, pluginRegistry);\n await pluginRegistry.save();\n }\n\n // Register instance in the global registry\n const id = instanceRegistry.uniqueId(generateSlug(instanceName));\n instanceRegistry.register(id, instanceRoot);\n await instanceRegistry.save();\n\n clack.outro(`Config saved to ${configManager.getConfigPath()}`);\n\n if (!opts?.skipRunMode) {\n console.log(ok(\"Starting OpenACP...\"));\n console.log(\"\");\n }\n\n return true;\n } catch (err) {\n if ((err as Error).name === \"ExitPromptError\") {\n clack.cancel(\"Setup cancelled.\");\n return false;\n }\n throw err;\n }\n}\n\n/**\n * Register all built-in plugins that haven't been registered yet.\n * Called after first-run setup to populate the registry with defaults.\n */\nasync function registerBuiltinPlugins(\n settingsManager: SettingsManager,\n pluginRegistry: PluginRegistry,\n): Promise<void> {\n const builtinPlugins = [\n { name: '@openacp/security', version: '1.0.0', description: 'User access control and session limits' },\n { name: '@openacp/file-service', version: '1.0.0', description: 'File storage and management' },\n { name: '@openacp/context', version: '1.0.0', description: 'Conversation context management' },\n { name: '@openacp/speech', version: '1.0.0', description: 'Text-to-speech and speech-to-text' },\n { name: '@openacp/notifications', version: '1.0.0', description: 'Cross-session notification routing' },\n { name: '@openacp/tunnel', version: '1.0.0', description: 'Expose local services via tunnel' },\n { name: '@openacp/api-server', version: '1.0.0', description: 'REST API + SSE streaming server' },\n ];\n\n for (const p of builtinPlugins) {\n if (!pluginRegistry.get(p.name)) {\n pluginRegistry.register(p.name, {\n version: p.version,\n source: 'builtin',\n enabled: true,\n settingsPath: settingsManager.getSettingsPath(p.name),\n description: p.description,\n });\n }\n }\n}\n\n// ─── Inheritable keys for copy flow ───\n\nfunction buildInheritableKeysMap(): Record<string, string[]> {\n // Hardcoded for built-in plugins — community plugins declare their own\n return {\n '@openacp/tunnel': ['provider', 'maxUserTunnels', 'auth'],\n '@openacp/api-server': ['host'],\n '@openacp/security': ['allowedUsers', 'maxSessionsPerUser', 'rateLimits'],\n '@openacp/usage': ['budget'],\n '@openacp/speech': ['tts'],\n };\n}\n\n// ─── Reconfigure (section-based, for existing config) ───\n\ntype ReconfigureSection = OnboardSection | \"__continue\";\n\nasync function selectSection(hasSelection: boolean): Promise<ReconfigureSection> {\n return guardCancel(\n await clack.select({\n message: \"Select sections to configure\",\n options: [\n ...ONBOARD_SECTION_OPTIONS,\n {\n value: \"__continue\" as const,\n label: \"Continue\",\n hint: hasSelection ? \"Done\" : \"Skip for now\",\n },\n ],\n initialValue: ONBOARD_SECTION_OPTIONS[0].value,\n }),\n ) as ReconfigureSection;\n}\n\nexport async function runReconfigure(configManager: ConfigManager): Promise<void> {\n await printStartBanner();\n clack.intro(\"OpenACP — Reconfigure\");\n\n try {\n await configManager.load();\n let config = configManager.get();\n\n // Show current config summary\n clack.note(summarizeConfig(config), \"Current configuration\");\n\n let ranSection = false;\n\n while (true) {\n const choice = await selectSection(ranSection);\n if (choice === \"__continue\") break;\n ranSection = true;\n\n if (choice === \"channels\") {\n const result = await configureChannels(config);\n if (result.changed) {\n // IMPORTANT: Use writeNew() instead of save() because save() uses deepMerge\n // which cannot delete keys. Channel deletion (delete next.channels.telegram)\n // would be silently ignored by deepMerge. writeNew() overwrites the full config.\n config = { ...config, channels: result.config.channels };\n await configManager.writeNew(config);\n }\n }\n\n if (choice === \"agents\") {\n const { defaultAgent } = await setupAgents();\n await configManager.save({ defaultAgent });\n config = configManager.get();\n }\n\n if (choice === \"workspace\") {\n const { baseDir } = await setupWorkspace({\n existing: config.workspace.baseDir,\n });\n await configManager.save({ workspace: { baseDir } });\n config = configManager.get();\n }\n\n if (choice === \"runMode\") {\n const result = await setupRunMode({\n existing: { runMode: config.runMode, autoStart: config.autoStart },\n });\n await configManager.save({\n runMode: result.runMode,\n autoStart: result.autoStart,\n });\n config = configManager.get();\n }\n\n if (choice === \"integrations\") {\n await setupIntegrations(config);\n }\n }\n\n if (!ranSection) {\n clack.outro(\"No changes made.\");\n return;\n }\n\n clack.outro(`Config saved to ${configManager.getConfigPath()}`);\n } catch (err) {\n if ((err as Error).name === \"ExitPromptError\") {\n clack.cancel(\"Setup cancelled.\");\n return;\n }\n throw err;\n }\n}\n","export type OnboardSection =\n | \"channels\"\n | \"agents\"\n | \"workspace\"\n | \"runMode\"\n | \"integrations\";\n\nexport type ConfiguredChannelAction = \"modify\" | \"disable\" | \"delete\" | \"skip\";\n\nexport type ChannelId = string;\n\nexport type ChannelStatus = {\n id: ChannelId;\n label: string;\n configured: boolean;\n enabled: boolean;\n hint?: string;\n};\n\nexport const ONBOARD_SECTION_OPTIONS: Array<{\n value: OnboardSection;\n label: string;\n hint: string;\n}> = [\n { value: \"channels\", label: \"Channels\", hint: \"Link/update messaging platforms\" },\n { value: \"agents\", label: \"Agents\", hint: \"Install agents, change default\" },\n { value: \"workspace\", label: \"Workspace\", hint: \"Set workspace directory\" },\n { value: \"runMode\", label: \"Run mode\", hint: \"Foreground/daemon, auto-start\" },\n { value: \"integrations\", label: \"Integrations\", hint: \"Claude CLI session transfer\" },\n];\n\nexport const CHANNEL_META: Record<string, { label: string; method: string }> = {\n telegram: { label: \"Telegram\", method: \"Bot API\" },\n discord: { label: \"Discord\", method: \"Bot API\" },\n};\n\nexport interface CommunityAdapterOption {\n name: string // npm package name, e.g. \"@openacp/adapter-slack\"\n displayName: string // e.g. \"Slack Adapter\"\n icon: string // e.g. \"💬\"\n verified: boolean\n}\n\n","import * as clack from \"@clack/prompts\";\nimport type { Config } from \"../config/config.js\";\n\n// --- ANSI colors ---\n\nexport const c = {\n reset: \"\\x1b[0m\",\n bold: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n red: \"\\x1b[31m\",\n cyan: \"\\x1b[36m\",\n white: \"\\x1b[37m\",\n};\n\nexport const ok = (msg: string) =>\n `${c.green}${c.bold}✓${c.reset} ${c.green}${msg}${c.reset}`;\nexport const warn = (msg: string) => `${c.yellow}⚠ ${msg}${c.reset}`;\nexport const fail = (msg: string) => `${c.red}✗ ${msg}${c.reset}`;\nexport const step = (n: number, total: number, title: string) =>\n `\\n${c.cyan}${c.bold}[${n}/${total}]${c.reset} ${c.bold}${title}${c.reset}\\n`;\nexport const dim = (msg: string) => `${c.dim}${msg}${c.reset}`;\n\nexport function guardCancel<T>(value: T | symbol): T {\n if (clack.isCancel(value)) {\n clack.cancel(\"Setup cancelled.\");\n process.exit(0);\n }\n return value as T;\n}\n\n// --- Banner ---\n\nfunction applyGradient(text: string): string {\n const colors = [135, 99, 63, 33, 39, 44, 44];\n const lines = text.split(\"\\n\");\n return lines\n .map((line, i) => {\n const colorIdx = Math.min(i, colors.length - 1);\n return `\\x1b[38;5;${colors[colorIdx]}m${line}\\x1b[0m`;\n })\n .join(\"\\n\");\n}\n\nconst BANNER = `\n ██████╗ ██████╗ ███████╗███╗ ██╗ █████╗ ██████╗██████╗\n ██╔═══██╗██╔══██╗██╔════╝████╗ ██║██╔══██╗██╔════╝██╔══██╗\n ██║ ██║██████╔╝█████╗ ██╔██╗ ██║███████║██║ ██████╔╝\n ██║ ██║██╔═══╝ ██╔══╝ ██║╚██╗██║██╔══██║██║ ██╔═══╝\n ╚██████╔╝██║ ███████╗██║ ╚████║██║ ██║╚██████╗██║\n ╚═════╝ ╚═╝ ╚══════╝╚═╝ ╚═══╝╚═╝ ╚═╝ ╚═════╝╚═╝\n`;\n\nexport async function printStartBanner(): Promise<void> {\n let version = \"0.0.0\";\n try {\n const { getCurrentVersion } = await import(\"../../cli/version.js\");\n version = getCurrentVersion();\n } catch {\n // ignore\n }\n console.log(applyGradient(BANNER));\n console.log(`${c.dim} AI coding agents, anywhere. v${version}${c.reset}\\n`);\n}\n\n// --- Config summary ---\n\nexport function summarizeConfig(config: Config): string {\n const lines: string[] = [];\n\n // Channels\n const channelStatuses: string[] = [];\n for (const [id, meta] of Object.entries({\n telegram: \"Telegram\",\n discord: \"Discord\",\n })) {\n const ch = config.channels[id] as { enabled?: boolean } | undefined;\n if (ch?.enabled) {\n channelStatuses.push(`${meta} (enabled)`);\n } else if (ch && Object.keys(ch).length > 1) {\n channelStatuses.push(`${meta} (disabled)`);\n } else {\n channelStatuses.push(`${meta} (not configured)`);\n }\n }\n lines.push(`Channels: ${channelStatuses.join(\", \")}`);\n\n // Default agent\n lines.push(`Default agent: ${config.defaultAgent}`);\n\n // Workspace\n lines.push(`Workspace: ${config.workspace.baseDir}`);\n\n // Run mode\n lines.push(`Run mode: ${config.runMode}${config.autoStart ? \" (auto-start)\" : \"\"}`);\n\n return lines.join(\"\\n\");\n}\n","import { execFileSync } from \"node:child_process\";\nimport * as clack from \"@clack/prompts\";\nimport { commandExists } from \"../agents/agent-dependencies.js\";\nimport { guardCancel, ok, warn, c } from \"./helpers.js\";\n\nconst KNOWN_AGENTS: Array<{ name: string; commands: string[] }> = [\n // claude-agent-acp is bundled as a dependency — no detection needed, but\n // kept here so detectAgents() still returns it for display purposes.\n { name: \"claude\", commands: [\"claude-agent-acp\"] },\n { name: \"codex\", commands: [\"codex\"] },\n];\n\nexport async function detectAgents(): Promise<\n Array<{ name: string; command: string }>\n> {\n const found: Array<{ name: string; command: string }> = [];\n for (const agent of KNOWN_AGENTS) {\n // Find all available commands for this agent (PATH + node_modules/.bin)\n const available: string[] = [];\n for (const cmd of agent.commands) {\n if (commandExists(cmd)) {\n available.push(cmd);\n }\n }\n if (available.length > 0) {\n // Prefer claude-agent-acp over claude/claude-code (priority order)\n found.push({ name: agent.name, command: available[0] });\n }\n }\n return found;\n}\n\nexport async function validateAgentCommand(command: string): Promise<boolean> {\n try {\n execFileSync(\"which\", [command], { stdio: \"pipe\" });\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function setupAgents(): Promise<{\n defaultAgent: string;\n}> {\n const { AgentCatalog } = await import(\"../agents/agent-catalog.js\");\n const { muteLogger, unmuteLogger } = await import(\"../utils/log.js\");\n\n muteLogger();\n const catalog = new AgentCatalog();\n catalog.load();\n\n const s = clack.spinner();\n s.start(\"Checking available agents...\");\n await catalog.refreshRegistryIfStale();\n\n // Claude is always pre-installed (bundled dependency)\n if (!catalog.getInstalledAgent(\"claude\")) {\n const claudeRegistry = catalog.findRegistryAgent(\"claude-acp\");\n if (claudeRegistry) {\n await catalog.install(\"claude-acp\");\n } else {\n // Fallback: register bundled claude-agent-acp directly\n const { AgentStore } = await import(\"../agents/agent-store.js\");\n const store = new AgentStore();\n store.load();\n store.addAgent(\"claude\", {\n registryId: \"claude-acp\",\n name: \"Claude Agent\",\n version: \"bundled\",\n distribution: \"npx\",\n command: \"npx\",\n args: [\"@zed-industries/claude-agent-acp\"],\n env: {},\n installedAt: new Date().toISOString(),\n binaryPath: null,\n });\n }\n }\n s.stop(ok(\"Claude Agent ready\"));\n unmuteLogger();\n\n const available = catalog.getAvailable();\n const installed = available.filter((a) => a.installed);\n const installable = available.filter((a) => !a.installed && a.available);\n\n // Offer agent selection — show installed agents as pre-checked + installable agents\n if (installed.length > 0 || installable.length > 0) {\n // Deduplicate by key AND name\n const seen = new Set<string>();\n const options: Array<{ label: string; value: string }> = [];\n\n for (const a of installed) {\n const dedupeKey = `${a.key}::${a.name}`;\n if (seen.has(dedupeKey)) continue;\n seen.add(dedupeKey);\n options.push({\n label: `${a.name} (installed)`,\n value: a.key,\n });\n }\n for (const a of installable) {\n const dedupeKey = `${a.key}::${a.name}`;\n if (seen.has(dedupeKey)) continue;\n seen.add(dedupeKey);\n options.push({\n label: `${a.name} (${a.distribution})`,\n value: a.key,\n });\n }\n\n const installedKeys = installed.map(a => a.key);\n const selected = guardCancel(\n await clack.autocompleteMultiselect({\n message: \"Install additional agents? (type to search, Space to select)\",\n options,\n initialValues: installedKeys,\n required: false,\n }),\n ) as string[];\n\n for (const key of selected) {\n const regAgent = catalog.findRegistryAgent(key);\n if (regAgent) {\n const installSpinner = clack.spinner();\n installSpinner.start(`Installing ${regAgent.name}...`);\n muteLogger();\n const result = await catalog.install(key);\n unmuteLogger();\n if (result.ok) {\n installSpinner.stop(ok(\"done\"));\n } else {\n installSpinner.stop(warn(`skipped: ${result.error}`));\n }\n }\n }\n }\n\n // Choose default agent\n const installedAgents = Object.keys(catalog.getInstalledEntries());\n let defaultAgent = \"claude\";\n\n if (installedAgents.length > 1) {\n defaultAgent = guardCancel(\n await clack.select({\n message: \"Which agent should be the default?\",\n options: installedAgents.map((key) => {\n const agent = catalog.getInstalledAgent(key)!;\n return { label: `${agent.name} (${key})`, value: key };\n }),\n initialValue: \"claude\",\n }),\n ) as string;\n }\n\n console.log(ok(`Default agent: ${c.bold}${defaultAgent}${c.reset}`));\n return { defaultAgent };\n}\n","import * as clack from \"@clack/prompts\";\nimport { guardCancel, step } from \"./helpers.js\";\n\nexport async function setupWorkspace(opts?: {\n existing?: string;\n stepNum?: number;\n totalSteps?: number;\n}): Promise<{ baseDir: string }> {\n const { existing, stepNum, totalSteps } = opts ?? {};\n if (stepNum != null && totalSteps != null) {\n console.log(step(stepNum, totalSteps, \"Workspace\"));\n }\n\n const baseDir = guardCancel(\n await clack.text({\n message: \"Base directory for workspaces:\",\n initialValue: existing ?? \"~/openacp-workspace\",\n validate: (val) =>\n (val ?? \"\").toString().trim().length > 0 ? undefined : \"Path cannot be empty\",\n }),\n ) as string;\n\n return { baseDir: baseDir.trim().replace(/^['\"]|['\"]$/g, \"\") };\n}\n","import * as clack from \"@clack/prompts\";\nimport { expandHome } from \"../config/config.js\";\nimport { guardCancel, ok, warn, dim, step } from \"./helpers.js\";\n\nexport async function setupRunMode(opts?: {\n existing?: { runMode: string; autoStart: boolean };\n stepNum?: number;\n totalSteps?: number;\n}): Promise<{ runMode: 'foreground' | 'daemon'; autoStart: boolean }> {\n const { existing, stepNum, totalSteps } = opts ?? {};\n if (stepNum != null && totalSteps != null) {\n console.log(step(stepNum, totalSteps, 'Run Mode'));\n }\n\n // Don't show daemon option on Windows\n if (process.platform === 'win32') {\n console.log(dim(' (Daemon mode not available on Windows)'));\n return { runMode: 'foreground', autoStart: false };\n }\n\n const initialValue = (existing?.runMode === 'daemon' ? 'daemon' : 'foreground') as 'foreground' | 'daemon';\n\n const mode = guardCancel(\n await clack.select({\n message: 'How would you like to run OpenACP?',\n options: [\n {\n label: 'Background (daemon)',\n value: 'daemon' as const,\n hint: 'Runs silently, auto-starts on boot. Manage with: openacp status | stop | logs',\n },\n {\n label: 'Foreground (terminal)',\n value: 'foreground' as const,\n hint: 'Runs in current terminal session. Start with: openacp',\n },\n ],\n initialValue,\n }),\n );\n\n const wasDaemon = existing?.runMode === 'daemon';\n\n if (mode === 'daemon') {\n const { installAutoStart, isAutoStartSupported } = await import('../../cli/autostart.js');\n const { muteLogger, unmuteLogger } = await import('../utils/log.js');\n const autoStart = isAutoStartSupported();\n if (autoStart) {\n muteLogger();\n const result = installAutoStart(expandHome('~/.openacp/logs'));\n unmuteLogger();\n if (result.success) {\n console.log(ok('Auto-start on boot enabled'));\n } else {\n console.log(warn(`Auto-start failed: ${result.error}`));\n }\n }\n return { runMode: 'daemon', autoStart };\n }\n\n // Switching from daemon → foreground: stop daemon + uninstall autostart\n if (wasDaemon) {\n const { muteLogger, unmuteLogger } = await import('../utils/log.js');\n muteLogger();\n try {\n const { stopDaemon } = await import('../../cli/daemon.js');\n const result = await stopDaemon();\n unmuteLogger();\n if (result.stopped) {\n console.log(ok(`Daemon stopped (was PID ${result.pid})`));\n }\n } catch {\n unmuteLogger();\n // Daemon may not be running\n }\n muteLogger();\n try {\n const { uninstallAutoStart } = await import('../../cli/autostart.js');\n uninstallAutoStart();\n unmuteLogger();\n } catch {\n unmuteLogger();\n // ignore\n }\n }\n\n return { runMode: 'foreground', autoStart: false };\n}\n","import * as clack from \"@clack/prompts\";\nimport type { Config } from \"../config/config.js\";\nimport { guardCancel } from \"./helpers.js\";\n\nexport async function setupIntegrations(config?: Config): Promise<void> {\n const claudeIntegration = (config?.integrations as Record<string, unknown> | undefined)?.claude as { installed?: boolean } | undefined;\n const isInstalled = claudeIntegration?.installed === true;\n\n const installClaude = guardCancel(\n await clack.confirm({\n message: isInstalled\n ? \"Claude CLI integration is installed. Reinstall?\"\n : \"Install session transfer for Claude? (enables /openacp:handoff in your terminal)\",\n initialValue: !isInstalled,\n }),\n );\n\n if (installClaude) {\n try {\n const { getIntegration } = await import(\"../../cli/integrate.js\");\n const integration = getIntegration(\"claude\");\n if (integration) {\n for (const item of integration.items) {\n const result = await item.install();\n for (const log of result.logs) console.log(` ${log}`);\n }\n }\n console.log(\"Claude CLI integration installed.\\n\");\n } catch (err) {\n console.log(`Could not install Claude CLI integration: ${err instanceof Error ? err.message : err}`);\n console.log(\" You can install it later with: openacp integrate claude\\n\");\n }\n }\n}\n","import * as path from \"node:path\";\nimport { getGlobalRoot } from \"../instance-context.js\";\nimport * as clack from \"@clack/prompts\";\nimport type { Config } from \"../config/config.js\";\nimport type { ConfiguredChannelAction, ChannelId, ChannelStatus } from \"./types.js\";\nimport { CHANNEL_META } from \"./types.js\";\nimport { guardCancel, ok, c } from \"./helpers.js\";\n\nexport function getChannelStatuses(config: Config): ChannelStatus[] {\n const statuses: ChannelStatus[] = [];\n\n for (const [id, meta] of Object.entries(CHANNEL_META) as [ChannelId, typeof CHANNEL_META[ChannelId]][]) {\n const ch = config.channels[id] as Record<string, unknown> | undefined;\n const enabled = ch?.enabled === true;\n const configured = !!ch && Object.keys(ch).length > 1;\n\n let hint: string | undefined;\n if (id === \"telegram\" && ch?.botToken && typeof ch.botToken === \"string\" && ch.botToken !== \"YOUR_BOT_TOKEN_HERE\") {\n hint = `Chat ID: ${ch.chatId}`;\n }\n if (id === \"discord\" && ch?.guildId) {\n hint = `Guild: ${ch.guildId}`;\n }\n\n statuses.push({ id, label: meta.label, configured, enabled, hint });\n }\n\n return statuses;\n}\n\nexport function noteChannelStatus(config: Config): void {\n const statuses = getChannelStatuses(config);\n const lines = statuses.map((s) => {\n const status = s.enabled ? \"enabled\" : s.configured ? \"disabled\" : \"not configured\";\n const hintStr = s.hint ? ` — ${s.hint}` : \"\";\n return ` ${s.label}: ${status}${hintStr}`;\n });\n\n console.log(\"\");\n console.log(`${c.bold} Channel status${c.reset}`);\n for (const line of lines) console.log(line);\n console.log(\"\");\n}\n\nasync function promptConfiguredAction(label: string): Promise<ConfiguredChannelAction> {\n return guardCancel(\n await clack.select({\n message: `${label} already configured. What do you want to do?`,\n options: [\n { value: \"modify\" as const, label: \"Modify settings\" },\n { value: \"disable\" as const, label: \"Disable bot\" },\n { value: \"delete\" as const, label: \"Delete config\" },\n { value: \"skip\" as const, label: \"Skip (leave as-is)\" },\n ],\n initialValue: \"modify\" as const,\n }),\n );\n}\n\nasync function configureViaPlugin(channelId: string): Promise<void> {\n const pluginMap: Record<string, { importPath: string; name: string }> = {\n telegram: { importPath: '../../plugins/telegram/index.js', name: '@openacp/telegram' },\n };\n\n const pluginInfo = pluginMap[channelId];\n\n let plugin: any;\n if (pluginInfo) {\n const pluginModule = await import(pluginInfo.importPath);\n plugin = pluginModule.default;\n } else {\n // Try dynamic import for community plugins (npm package name)\n try {\n const pluginModule = await import(channelId);\n plugin = pluginModule.default;\n } catch (err) {\n console.log(`Could not load plugin \"${channelId}\": ${(err as Error).message}`);\n return;\n }\n }\n\n if (plugin?.configure) {\n const { SettingsManager } = await import('../plugin/settings-manager.js');\n const { createInstallContext } = await import('../plugin/install-context.js');\n const basePath = path.join(getGlobalRoot(), 'plugins', 'data');\n const settingsManager = new SettingsManager(basePath);\n const ctx = createInstallContext({\n pluginName: plugin.name,\n settingsManager,\n basePath,\n });\n await plugin.configure(ctx);\n }\n}\n\nexport async function configureChannels(config: Config): Promise<{ config: Config; changed: boolean }> {\n const next = structuredClone(config);\n let changed = false;\n\n noteChannelStatus(next);\n\n while (true) {\n const statuses = getChannelStatuses(next);\n const options = statuses.map((s) => {\n const status = s.enabled ? \"enabled\" : s.configured ? \"disabled\" : \"not configured\";\n return {\n value: s.id,\n label: `${s.label} (${CHANNEL_META[s.id].method})`,\n hint: status + (s.hint ? ` · ${s.hint}` : \"\"),\n };\n });\n\n const choice = guardCancel(\n await clack.select({\n message: \"Select a channel\",\n options: [\n ...options,\n { value: \"__done__\" as const, label: \"Finished\" },\n ],\n }),\n );\n\n if (choice === \"__done__\") break;\n\n const channelId = choice as ChannelId;\n const meta = CHANNEL_META[channelId];\n const existing = next.channels[channelId] as Record<string, unknown> | undefined;\n const isConfigured = !!existing && Object.keys(existing).length > 1;\n\n if (isConfigured) {\n const action = await promptConfiguredAction(meta.label);\n\n if (action === \"skip\") continue;\n if (action === \"disable\") {\n (next.channels[channelId] as Record<string, unknown>).enabled = false;\n changed = true;\n console.log(ok(`${meta.label} disabled`));\n continue;\n }\n if (action === \"delete\") {\n const confirmed = guardCancel(\n await clack.confirm({\n message: `Delete ${meta.label} config? This cannot be undone.`,\n initialValue: false,\n }),\n );\n if (confirmed) {\n delete next.channels[channelId];\n changed = true;\n console.log(ok(`${meta.label} config deleted`));\n }\n continue;\n }\n // action === \"modify\" — fall through to plugin configure\n }\n\n // Run channel configuration via plugin configure()\n await configureViaPlugin(channelId);\n changed = true;\n }\n\n return { config: next, changed };\n}\n","// src/core/instance-copy.ts\nimport fs from 'node:fs'\nimport path from 'node:path'\n\nexport interface CopyOptions {\n inheritableKeys?: Record<string, string[]>\n onProgress?: (step: string, status: 'start' | 'done') => void\n}\n\nexport async function copyInstance(src: string, dst: string, opts: CopyOptions): Promise<void> {\n const { inheritableKeys = {}, onProgress } = opts\n fs.mkdirSync(dst, { recursive: true })\n\n // 1. config.json — remove instanceName and port fields\n const configSrc = path.join(src, 'config.json')\n if (fs.existsSync(configSrc)) {\n onProgress?.('Configuration', 'start')\n const config = JSON.parse(fs.readFileSync(configSrc, 'utf-8'))\n delete config.instanceName\n if (config.api) delete config.api.port\n if (config.tunnel) delete config.tunnel.port\n fs.writeFileSync(path.join(dst, 'config.json'), JSON.stringify(config, null, 2))\n onProgress?.('Configuration', 'done')\n }\n\n // 2. plugins.json\n const pluginsSrc = path.join(src, 'plugins.json')\n if (fs.existsSync(pluginsSrc)) {\n onProgress?.('Plugin list', 'start')\n fs.copyFileSync(pluginsSrc, path.join(dst, 'plugins.json'))\n onProgress?.('Plugin list', 'done')\n }\n\n // 3. plugins/ (package.json + node_modules)\n const pluginsDir = path.join(src, 'plugins')\n if (fs.existsSync(pluginsDir)) {\n onProgress?.('Plugins', 'start')\n const dstPlugins = path.join(dst, 'plugins')\n fs.mkdirSync(dstPlugins, { recursive: true })\n const pkgJson = path.join(pluginsDir, 'package.json')\n if (fs.existsSync(pkgJson)) fs.copyFileSync(pkgJson, path.join(dstPlugins, 'package.json'))\n const nodeModules = path.join(pluginsDir, 'node_modules')\n if (fs.existsSync(nodeModules)) fs.cpSync(nodeModules, path.join(dstPlugins, 'node_modules'), { recursive: true })\n onProgress?.('Plugins', 'done')\n }\n\n // 4. agents.json + agents/\n const agentsJson = path.join(src, 'agents.json')\n if (fs.existsSync(agentsJson)) {\n onProgress?.('Agents', 'start')\n fs.copyFileSync(agentsJson, path.join(dst, 'agents.json'))\n const agentsDir = path.join(src, 'agents')\n if (fs.existsSync(agentsDir)) fs.cpSync(agentsDir, path.join(dst, 'agents'), { recursive: true })\n onProgress?.('Agents', 'done')\n }\n\n // 5. bin/\n const binDir = path.join(src, 'bin')\n if (fs.existsSync(binDir)) {\n onProgress?.('Tools', 'start')\n fs.cpSync(binDir, path.join(dst, 'bin'), { recursive: true })\n onProgress?.('Tools', 'done')\n }\n\n // 6. Plugin settings filtered by inheritableKeys\n const pluginDataSrc = path.join(src, 'plugins', 'data')\n if (fs.existsSync(pluginDataSrc)) {\n onProgress?.('Preferences', 'start')\n copyPluginSettings(pluginDataSrc, path.join(dst, 'plugins', 'data'), inheritableKeys)\n onProgress?.('Preferences', 'done')\n }\n}\n\nfunction copyPluginSettings(srcData: string, dstData: string, inheritableKeys: Record<string, string[]>): void {\n walkPluginDirs(srcData, (pluginName, settingsPath) => {\n const allowedKeys = inheritableKeys[pluginName]\n if (!allowedKeys || allowedKeys.length === 0) return\n try {\n const settings = JSON.parse(fs.readFileSync(settingsPath, 'utf-8'))\n const filtered: Record<string, unknown> = {}\n for (const key of allowedKeys) {\n if (key in settings) filtered[key] = settings[key]\n }\n if (Object.keys(filtered).length > 0) {\n const relative = path.relative(srcData, path.dirname(settingsPath))\n const dstDir = path.join(dstData, relative)\n fs.mkdirSync(dstDir, { recursive: true })\n fs.writeFileSync(path.join(dstDir, 'settings.json'), JSON.stringify(filtered, null, 2))\n }\n } catch { /* skip invalid */ }\n })\n}\n\nfunction walkPluginDirs(base: string, cb: (pluginName: string, settingsPath: string) => void): void {\n if (!fs.existsSync(base)) return\n for (const entry of fs.readdirSync(base, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue\n if (entry.name.startsWith('@')) {\n const scopeDir = path.join(base, entry.name)\n for (const sub of fs.readdirSync(scopeDir, { withFileTypes: true })) {\n if (!sub.isDirectory()) continue\n const pluginName = `${entry.name}/${sub.name}`\n const settingsPath = path.join(scopeDir, sub.name, 'settings.json')\n if (fs.existsSync(settingsPath)) cb(pluginName, settingsPath)\n }\n } else {\n const settingsPath = path.join(base, entry.name, 'settings.json')\n if (fs.existsSync(settingsPath)) cb(entry.name, settingsPath)\n }\n }\n}\n"],"mappings":"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","names":["path","fs","clack","text","clack","clack","clack","clack","clack","path","step","execFileSync","readFileSync"]}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
speech_default
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-VUSCVRJL.js";
|
|
4
4
|
import "./chunk-5WGVYX3C.js";
|
|
5
5
|
import "./chunk-2KT6TROD.js";
|
|
6
6
|
export {
|
|
7
7
|
speech_default as default
|
|
8
8
|
};
|
|
9
|
-
//# sourceMappingURL=speech-
|
|
9
|
+
//# sourceMappingURL=speech-GHTSWDAN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|