@openacp/cli 2026.331.1 → 2026.331.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 (182) hide show
  1. package/README.md +2 -1
  2. package/dist/cli.js +24987 -270
  3. package/dist/cli.js.map +1 -1
  4. package/dist/data/registry-snapshot.json +1 -1
  5. package/dist/index.d.ts +10 -0
  6. package/dist/index.js +17669 -406
  7. package/dist/index.js.map +1 -1
  8. package/package.json +2 -2
  9. package/dist/adapter-ELG3VRZ3.js +0 -14
  10. package/dist/adapter-ELG3VRZ3.js.map +0 -1
  11. package/dist/agent-catalog-UYD26QDK.js +0 -10
  12. package/dist/agent-catalog-UYD26QDK.js.map +0 -1
  13. package/dist/agent-dependencies-ED2ZTUHG.js +0 -23
  14. package/dist/agent-dependencies-ED2ZTUHG.js.map +0 -1
  15. package/dist/agent-registry-YOGP656W.js +0 -8
  16. package/dist/agent-registry-YOGP656W.js.map +0 -1
  17. package/dist/agent-store-5UHZH2XI.js +0 -8
  18. package/dist/agent-store-5UHZH2XI.js.map +0 -1
  19. package/dist/api-client-PEMHYL5U.js +0 -13
  20. package/dist/api-client-PEMHYL5U.js.map +0 -1
  21. package/dist/api-server-DATG2KBR.js +0 -10
  22. package/dist/api-server-DATG2KBR.js.map +0 -1
  23. package/dist/api-server-L5Z7XACW.js +0 -7
  24. package/dist/api-server-L5Z7XACW.js.map +0 -1
  25. package/dist/autostart-CUPZMKKC.js +0 -22
  26. package/dist/autostart-CUPZMKKC.js.map +0 -1
  27. package/dist/chunk-23SRIVG4.js +0 -50
  28. package/dist/chunk-23SRIVG4.js.map +0 -1
  29. package/dist/chunk-2KT6TROD.js +0 -129
  30. package/dist/chunk-2KT6TROD.js.map +0 -1
  31. package/dist/chunk-2R5XM3ES.js +0 -154
  32. package/dist/chunk-2R5XM3ES.js.map +0 -1
  33. package/dist/chunk-3EWTPOF7.js +0 -51
  34. package/dist/chunk-3EWTPOF7.js.map +0 -1
  35. package/dist/chunk-566W6INH.js +0 -83
  36. package/dist/chunk-566W6INH.js.map +0 -1
  37. package/dist/chunk-5WGVYX3C.js +0 -55
  38. package/dist/chunk-5WGVYX3C.js.map +0 -1
  39. package/dist/chunk-7GXEMMEV.js +0 -44
  40. package/dist/chunk-7GXEMMEV.js.map +0 -1
  41. package/dist/chunk-7U6IZIJP.js +0 -186
  42. package/dist/chunk-7U6IZIJP.js.map +0 -1
  43. package/dist/chunk-7YIKTRSM.js +0 -105
  44. package/dist/chunk-7YIKTRSM.js.map +0 -1
  45. package/dist/chunk-7ZCQF6QM.js +0 -27
  46. package/dist/chunk-7ZCQF6QM.js.map +0 -1
  47. package/dist/chunk-AFKX424Q.js +0 -92
  48. package/dist/chunk-AFKX424Q.js.map +0 -1
  49. package/dist/chunk-BYCJQPMN.js +0 -543
  50. package/dist/chunk-BYCJQPMN.js.map +0 -1
  51. package/dist/chunk-CDAUYTVP.js +0 -41
  52. package/dist/chunk-CDAUYTVP.js.map +0 -1
  53. package/dist/chunk-EWVXSTQK.js +0 -6544
  54. package/dist/chunk-EWVXSTQK.js.map +0 -1
  55. package/dist/chunk-FNRSWA2K.js +0 -1
  56. package/dist/chunk-FNRSWA2K.js.map +0 -1
  57. package/dist/chunk-FPKQYCQS.js +0 -776
  58. package/dist/chunk-FPKQYCQS.js.map +0 -1
  59. package/dist/chunk-IZ5UEZF7.js +0 -138
  60. package/dist/chunk-IZ5UEZF7.js.map +0 -1
  61. package/dist/chunk-K6UY5M75.js +0 -653
  62. package/dist/chunk-K6UY5M75.js.map +0 -1
  63. package/dist/chunk-KGAQW6F4.js +0 -106
  64. package/dist/chunk-KGAQW6F4.js.map +0 -1
  65. package/dist/chunk-LGFWH3AE.js +0 -26
  66. package/dist/chunk-LGFWH3AE.js.map +0 -1
  67. package/dist/chunk-LRV56K2M.js +0 -4106
  68. package/dist/chunk-LRV56K2M.js.map +0 -1
  69. package/dist/chunk-MDJHCCFS.js +0 -485
  70. package/dist/chunk-MDJHCCFS.js.map +0 -1
  71. package/dist/chunk-MLF4W5R6.js +0 -101
  72. package/dist/chunk-MLF4W5R6.js.map +0 -1
  73. package/dist/chunk-NHD5XDD2.js +0 -686
  74. package/dist/chunk-NHD5XDD2.js.map +0 -1
  75. package/dist/chunk-NJX75BLK.js +0 -259
  76. package/dist/chunk-NJX75BLK.js.map +0 -1
  77. package/dist/chunk-NOEAJNTK.js +0 -156
  78. package/dist/chunk-NOEAJNTK.js.map +0 -1
  79. package/dist/chunk-ON7HB5O7.js +0 -58
  80. package/dist/chunk-ON7HB5O7.js.map +0 -1
  81. package/dist/chunk-OSBZXY2W.js +0 -126
  82. package/dist/chunk-OSBZXY2W.js.map +0 -1
  83. package/dist/chunk-OYSAN7UX.js +0 -15
  84. package/dist/chunk-OYSAN7UX.js.map +0 -1
  85. package/dist/chunk-P3HHJANC.js +0 -209
  86. package/dist/chunk-P3HHJANC.js.map +0 -1
  87. package/dist/chunk-R2YLDQLI.js +0 -1115
  88. package/dist/chunk-R2YLDQLI.js.map +0 -1
  89. package/dist/chunk-R6KZYF7D.js +0 -231
  90. package/dist/chunk-R6KZYF7D.js.map +0 -1
  91. package/dist/chunk-S64CB6J3.js +0 -98
  92. package/dist/chunk-S64CB6J3.js.map +0 -1
  93. package/dist/chunk-SSLVNCEA.js +0 -236
  94. package/dist/chunk-SSLVNCEA.js.map +0 -1
  95. package/dist/chunk-TGP34LQN.js +0 -681
  96. package/dist/chunk-TGP34LQN.js.map +0 -1
  97. package/dist/chunk-VUSCVRJL.js +0 -229
  98. package/dist/chunk-VUSCVRJL.js.map +0 -1
  99. package/dist/chunk-W26AUH5B.js +0 -61
  100. package/dist/chunk-W26AUH5B.js.map +0 -1
  101. package/dist/chunk-WQCJTU2C.js +0 -84
  102. package/dist/chunk-WQCJTU2C.js.map +0 -1
  103. package/dist/chunk-XRJUS6FE.js +0 -53
  104. package/dist/chunk-XRJUS6FE.js.map +0 -1
  105. package/dist/chunk-YZCKSNRN.js +0 -453
  106. package/dist/chunk-YZCKSNRN.js.map +0 -1
  107. package/dist/chunk-ZIRH6QWW.js +0 -69
  108. package/dist/chunk-ZIRH6QWW.js.map +0 -1
  109. package/dist/chunk-ZSLHHQPQ.js +0 -282
  110. package/dist/chunk-ZSLHHQPQ.js.map +0 -1
  111. package/dist/config-X4UP7H6R.js +0 -13
  112. package/dist/config-X4UP7H6R.js.map +0 -1
  113. package/dist/config-editor-7BENRVG5.js +0 -11
  114. package/dist/config-editor-7BENRVG5.js.map +0 -1
  115. package/dist/config-registry-M3FFWEVM.js +0 -18
  116. package/dist/config-registry-M3FFWEVM.js.map +0 -1
  117. package/dist/context-FVGCU5TI.js +0 -9
  118. package/dist/context-FVGCU5TI.js.map +0 -1
  119. package/dist/core-plugins-JSY2I44L.js +0 -25
  120. package/dist/core-plugins-JSY2I44L.js.map +0 -1
  121. package/dist/daemon-UOSRDEXW.js +0 -34
  122. package/dist/daemon-UOSRDEXW.js.map +0 -1
  123. package/dist/dev-loader-7P3HZCIA.js +0 -37
  124. package/dist/dev-loader-7P3HZCIA.js.map +0 -1
  125. package/dist/doctor-6DLACBR4.js +0 -10
  126. package/dist/doctor-6DLACBR4.js.map +0 -1
  127. package/dist/file-service-FQQYME7M.js +0 -8
  128. package/dist/file-service-FQQYME7M.js.map +0 -1
  129. package/dist/install-cloudflared-LNS5L5FR.js +0 -33
  130. package/dist/install-cloudflared-LNS5L5FR.js.map +0 -1
  131. package/dist/install-context-KZO5FR4D.js +0 -78
  132. package/dist/install-context-KZO5FR4D.js.map +0 -1
  133. package/dist/install-jq-SN4IA5K4.js +0 -31
  134. package/dist/install-jq-SN4IA5K4.js.map +0 -1
  135. package/dist/instance-context-FLCE7VZ4.js +0 -13
  136. package/dist/instance-context-FLCE7VZ4.js.map +0 -1
  137. package/dist/instance-registry-SW5FWKHO.js +0 -7
  138. package/dist/instance-registry-SW5FWKHO.js.map +0 -1
  139. package/dist/integrate-JIEZYDOR.js +0 -371
  140. package/dist/integrate-JIEZYDOR.js.map +0 -1
  141. package/dist/log-YZ243M5G.js +0 -25
  142. package/dist/log-YZ243M5G.js.map +0 -1
  143. package/dist/main-D7M2AKRM.js +0 -697
  144. package/dist/main-D7M2AKRM.js.map +0 -1
  145. package/dist/menu-ALFN37IR.js +0 -15
  146. package/dist/menu-ALFN37IR.js.map +0 -1
  147. package/dist/notifications-MO23S7S3.js +0 -8
  148. package/dist/notifications-MO23S7S3.js.map +0 -1
  149. package/dist/plugin-create-HFKS23JY.js +0 -968
  150. package/dist/plugin-create-HFKS23JY.js.map +0 -1
  151. package/dist/plugin-installer-VSTYZSXC.js +0 -9
  152. package/dist/plugin-installer-VSTYZSXC.js.map +0 -1
  153. package/dist/plugin-registry-6J3YSFHF.js +0 -7
  154. package/dist/plugin-registry-6J3YSFHF.js.map +0 -1
  155. package/dist/plugin-search-MGKAL5JM.js +0 -39
  156. package/dist/plugin-search-MGKAL5JM.js.map +0 -1
  157. package/dist/post-upgrade-F4YPMTUT.js +0 -79
  158. package/dist/post-upgrade-F4YPMTUT.js.map +0 -1
  159. package/dist/read-text-file-DJBTITIB.js +0 -7
  160. package/dist/read-text-file-DJBTITIB.js.map +0 -1
  161. package/dist/registry-client-GTBWLXYU.js +0 -7
  162. package/dist/registry-client-GTBWLXYU.js.map +0 -1
  163. package/dist/security-O4XGN2CM.js +0 -8
  164. package/dist/security-O4XGN2CM.js.map +0 -1
  165. package/dist/settings-manager-B4UN2LAC.js +0 -7
  166. package/dist/settings-manager-B4UN2LAC.js.map +0 -1
  167. package/dist/setup-44WLBIOT.js +0 -989
  168. package/dist/setup-44WLBIOT.js.map +0 -1
  169. package/dist/speech-GHTSWDAN.js +0 -9
  170. package/dist/speech-GHTSWDAN.js.map +0 -1
  171. package/dist/suggest-RST5VOHB.js +0 -36
  172. package/dist/suggest-RST5VOHB.js.map +0 -1
  173. package/dist/telegram-D7ASLVEB.js +0 -7
  174. package/dist/telegram-D7ASLVEB.js.map +0 -1
  175. package/dist/tunnel-ALJDPFDQ.js +0 -10
  176. package/dist/tunnel-ALJDPFDQ.js.map +0 -1
  177. package/dist/tunnel-service-TBAHDXMF.js +0 -755
  178. package/dist/tunnel-service-TBAHDXMF.js.map +0 -1
  179. package/dist/validators-GITLOFXC.js +0 -11
  180. package/dist/validators-GITLOFXC.js.map +0 -1
  181. package/dist/version-AXXV6IV2.js +0 -15
  182. package/dist/version-AXXV6IV2.js.map +0 -1
@@ -1 +0,0 @@
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 +0,0 @@
1
- import {
2
- speech_default
3
- } from "./chunk-VUSCVRJL.js";
4
- import "./chunk-5WGVYX3C.js";
5
- import "./chunk-2KT6TROD.js";
6
- export {
7
- speech_default as default
8
- };
9
- //# sourceMappingURL=speech-GHTSWDAN.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1,36 +0,0 @@
1
- // src/cli/suggest.ts
2
- import { distance } from "fastest-levenshtein";
3
- function suggestMatch(input, candidates, maxDistance = 2) {
4
- if (candidates.length === 0) return void 0;
5
- const lower = input.toLowerCase();
6
- if (candidates.some((c) => c.toLowerCase() === lower)) return void 0;
7
- const prefixMatches = candidates.filter(
8
- (c) => c.toLowerCase().startsWith(lower)
9
- );
10
- if (prefixMatches.length > 0) {
11
- return prefixMatches.sort((a, b) => a.length - b.length)[0];
12
- }
13
- if (lower.length >= 3) {
14
- const substringMatches = candidates.filter(
15
- (c) => c.toLowerCase().includes(lower)
16
- );
17
- if (substringMatches.length > 0) {
18
- return substringMatches.sort((a, b) => a.length - b.length)[0];
19
- }
20
- }
21
- let best;
22
- let bestDist = Infinity;
23
- for (const candidate of candidates) {
24
- const effectiveMax = candidate.length <= 3 ? Math.min(maxDistance, 1) : maxDistance;
25
- const d = distance(lower, candidate.toLowerCase());
26
- if (d <= effectiveMax && d < bestDist) {
27
- bestDist = d;
28
- best = candidate;
29
- }
30
- }
31
- return best;
32
- }
33
- export {
34
- suggestMatch
35
- };
36
- //# sourceMappingURL=suggest-RST5VOHB.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/cli/suggest.ts"],"sourcesContent":["import { distance } from \"fastest-levenshtein\";\n\nexport function suggestMatch(\n input: string,\n candidates: string[],\n maxDistance: number = 2,\n): string | undefined {\n if (candidates.length === 0) return undefined;\n\n const lower = input.toLowerCase();\n\n // Exact match — no suggestion needed\n if (candidates.some((c) => c.toLowerCase() === lower)) return undefined;\n\n // 1. Prefix match — candidate starts with input\n const prefixMatches = candidates.filter((c) =>\n c.toLowerCase().startsWith(lower),\n );\n if (prefixMatches.length > 0) {\n return prefixMatches.sort((a, b) => a.length - b.length)[0];\n }\n\n // 2. Substring match — candidate contains input (min 3 chars to avoid noise)\n if (lower.length >= 3) {\n const substringMatches = candidates.filter((c) =>\n c.toLowerCase().includes(lower),\n );\n if (substringMatches.length > 0) {\n return substringMatches.sort((a, b) => a.length - b.length)[0];\n }\n }\n\n // 3. Levenshtein distance\n let best: string | undefined;\n let bestDist = Infinity;\n for (const candidate of candidates) {\n const effectiveMax = candidate.length <= 3 ? Math.min(maxDistance, 1) : maxDistance;\n const d = distance(lower, candidate.toLowerCase());\n if (d <= effectiveMax && d < bestDist) {\n bestDist = d;\n best = candidate;\n }\n }\n\n return best;\n}\n"],"mappings":";AAAA,SAAS,gBAAgB;AAElB,SAAS,aACd,OACA,YACA,cAAsB,GACF;AACpB,MAAI,WAAW,WAAW,EAAG,QAAO;AAEpC,QAAM,QAAQ,MAAM,YAAY;AAGhC,MAAI,WAAW,KAAK,CAAC,MAAM,EAAE,YAAY,MAAM,KAAK,EAAG,QAAO;AAG9D,QAAM,gBAAgB,WAAW;AAAA,IAAO,CAAC,MACvC,EAAE,YAAY,EAAE,WAAW,KAAK;AAAA,EAClC;AACA,MAAI,cAAc,SAAS,GAAG;AAC5B,WAAO,cAAc,KAAK,CAAC,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;AAAA,EAC5D;AAGA,MAAI,MAAM,UAAU,GAAG;AACrB,UAAM,mBAAmB,WAAW;AAAA,MAAO,CAAC,MAC1C,EAAE,YAAY,EAAE,SAAS,KAAK;AAAA,IAChC;AACA,QAAI,iBAAiB,SAAS,GAAG;AAC/B,aAAO,iBAAiB,KAAK,CAAC,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;AAAA,IAC/D;AAAA,EACF;AAGA,MAAI;AACJ,MAAI,WAAW;AACf,aAAW,aAAa,YAAY;AAClC,UAAM,eAAe,UAAU,UAAU,IAAI,KAAK,IAAI,aAAa,CAAC,IAAI;AACxE,UAAM,IAAI,SAAS,OAAO,UAAU,YAAY,CAAC;AACjD,QAAI,KAAK,gBAAgB,IAAI,UAAU;AACrC,iBAAW;AACX,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;","names":[]}
@@ -1,7 +0,0 @@
1
- import {
2
- telegram_default
3
- } from "./chunk-SSLVNCEA.js";
4
- export {
5
- telegram_default as default
6
- };
7
- //# sourceMappingURL=telegram-D7ASLVEB.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1,10 +0,0 @@
1
- import {
2
- tunnel_default
3
- } from "./chunk-P3HHJANC.js";
4
- import "./chunk-NHD5XDD2.js";
5
- import "./chunk-R6KZYF7D.js";
6
- import "./chunk-ZSLHHQPQ.js";
7
- export {
8
- tunnel_default as default
9
- };
10
- //# sourceMappingURL=tunnel-ALJDPFDQ.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}