@openacp/cli 2026.327.5 → 2026.330.2

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 (188) hide show
  1. package/README.md +13 -13
  2. package/dist/adapter-4U6MC5ZS.js +13 -0
  3. package/dist/agent-catalog-SZQQERV7.js +10 -0
  4. package/dist/{agent-dependencies-WS7Z2DFW.js → agent-dependencies-ED2ZTUHG.js} +1 -2
  5. package/dist/{agent-registry-5LZT7CUB.js → agent-registry-YOGP656W.js} +1 -2
  6. package/dist/agent-store-5UHZH2XI.js +8 -0
  7. package/dist/{api-client-AQPNKXI2.js → api-client-XTLRRFPX.js} +1 -2
  8. package/dist/api-server-5VNYFWJE.js +7 -0
  9. package/dist/api-server-JLBDKCU4.js +10 -0
  10. package/dist/{autostart-6JS565RY.js → autostart-CUPZMKKC.js} +3 -4
  11. package/dist/{chunk-WIIZNPCR.js → chunk-2KT6TROD.js} +12 -33
  12. package/dist/chunk-2KT6TROD.js.map +1 -0
  13. package/dist/{chunk-PPSMUECX.js → chunk-2R5XM3ES.js} +2 -2
  14. package/dist/{chunk-SNPYTMPR.js → chunk-3EWTPOF7.js} +2 -2
  15. package/dist/{chunk-YEULD3SG.js → chunk-3NAFXVQM.js} +7 -2
  16. package/dist/{chunk-YEULD3SG.js.map → chunk-3NAFXVQM.js.map} +1 -1
  17. package/dist/{chunk-A6Y4GZM3.js → chunk-566W6INH.js} +2 -2
  18. package/dist/{chunk-ODUM3D6X.js → chunk-5HKQCYOI.js} +1 -39
  19. package/dist/chunk-5HKQCYOI.js.map +1 -0
  20. package/dist/{plugin-installer-QVJP6VKV.js → chunk-5WGVYX3C.js} +18 -5
  21. package/dist/chunk-5WGVYX3C.js.map +1 -0
  22. package/dist/{chunk-XWDW3XBE.js → chunk-5ZNBNIK3.js} +1331 -237
  23. package/dist/chunk-5ZNBNIK3.js.map +1 -0
  24. package/dist/{chunk-XIBG7LSL.js → chunk-7RKPIM3E.js} +482 -175
  25. package/dist/chunk-7RKPIM3E.js.map +1 -0
  26. package/dist/{chunk-WXVT3AOY.js → chunk-7ZCQF6QM.js} +8 -3
  27. package/dist/chunk-7ZCQF6QM.js.map +1 -0
  28. package/dist/{chunk-2YCW3QDV.js → chunk-BTJHGSLM.js} +8 -7
  29. package/dist/chunk-BTJHGSLM.js.map +1 -0
  30. package/dist/{chunk-P2G275VD.js → chunk-CFUJGWOP.js} +3 -3
  31. package/dist/{chunk-RBYBSSGO.js → chunk-FCTC7KDT.js} +2 -2
  32. package/dist/{chunk-QAQDGPB4.js → chunk-GEOXPGCO.js} +3 -3
  33. package/dist/{chunk-BLQUXO7S.js → chunk-IZ5UEZF7.js} +27 -2
  34. package/dist/chunk-IZ5UEZF7.js.map +1 -0
  35. package/dist/{chunk-4GMLGCF2.js → chunk-KDU3ZEWT.js} +2 -2
  36. package/dist/{chunk-QWP76EBW.js → chunk-MITTQMGZ.js} +16 -9
  37. package/dist/chunk-MITTQMGZ.js.map +1 -0
  38. package/dist/{chunk-HRKAXFWR.js → chunk-MPGEHTGE.js} +9 -9
  39. package/dist/{chunk-KMMEFXIE.js → chunk-PA6MNBG4.js} +41 -9
  40. package/dist/chunk-PA6MNBG4.js.map +1 -0
  41. package/dist/{chunk-BQ6FR32N.js → chunk-QWVHCTCA.js} +2 -2
  42. package/dist/{chunk-XMMAGAT4.js → chunk-R6KZYF7D.js} +8 -1
  43. package/dist/{chunk-XMMAGAT4.js.map → chunk-R6KZYF7D.js.map} +1 -1
  44. package/dist/{chunk-AD3X6DGK.js → chunk-TMVTSWVH.js} +75 -13
  45. package/dist/chunk-TMVTSWVH.js.map +1 -0
  46. package/dist/chunk-UWH7KIAA.js +701 -0
  47. package/dist/chunk-UWH7KIAA.js.map +1 -0
  48. package/dist/{chunk-SHTGQGAU.js → chunk-V2YZWYXT.js} +3 -3
  49. package/dist/{chunk-QVMEF6FB.js → chunk-W4LK6WJP.js} +38 -27
  50. package/dist/chunk-W4LK6WJP.js.map +1 -0
  51. package/dist/{chunk-S3ZGPPXY.js → chunk-YIGBJFJL.js} +9 -13
  52. package/dist/{chunk-S3ZGPPXY.js.map → chunk-YIGBJFJL.js.map} +1 -1
  53. package/dist/cli.js +133 -132
  54. package/dist/cli.js.map +1 -1
  55. package/dist/config-KN6NKKPF.js +20 -0
  56. package/dist/config-editor-76RVZS4B.js +10 -0
  57. package/dist/{config-registry-CUMNXFGK.js → config-registry-ZXAIJNYB.js} +2 -3
  58. package/dist/context-NXXW62NJ.js +9 -0
  59. package/dist/core-plugins-OCHKGCIZ.js +22 -0
  60. package/dist/{daemon-PXO5QPCR.js → daemon-XFEMMJSZ.js} +4 -5
  61. package/dist/{dev-loader-DRU3R7ZM.js → dev-loader-7P3HZCIA.js} +1 -3
  62. package/dist/{dev-loader-DRU3R7ZM.js.map → dev-loader-7P3HZCIA.js.map} +1 -1
  63. package/dist/doctor-AV6AUO22.js +9 -0
  64. package/dist/file-service-HHB3JQIO.js +8 -0
  65. package/dist/index.d.ts +141 -187
  66. package/dist/index.js +33 -29
  67. package/dist/index.js.map +1 -1
  68. package/dist/{install-cloudflared-AN24L4DP.js → install-cloudflared-JRJ4BSOM.js} +3 -4
  69. package/dist/{install-cloudflared-AN24L4DP.js.map → install-cloudflared-JRJ4BSOM.js.map} +1 -1
  70. package/dist/{install-context-XPWTFT3J.js → install-context-EHYV5WRY.js} +2 -3
  71. package/dist/{install-context-XPWTFT3J.js.map → install-context-EHYV5WRY.js.map} +1 -1
  72. package/dist/{install-jq-CRVDJGF3.js → install-jq-ISTGT263.js} +3 -4
  73. package/dist/{install-jq-CRVDJGF3.js.map → install-jq-ISTGT263.js.map} +1 -1
  74. package/dist/{integrate-G6CVXTGT.js → integrate-JIEZYDOR.js} +1 -2
  75. package/dist/{integrate-G6CVXTGT.js.map → integrate-JIEZYDOR.js.map} +1 -1
  76. package/dist/{log-LZ7FTRKG.js → log-YZ243M5G.js} +4 -3
  77. package/dist/{main-3GF3EQTE.js → main-L2M4NTJY.js} +135 -50
  78. package/dist/main-L2M4NTJY.js.map +1 -0
  79. package/dist/{menu-YDQ2LWAR.js → menu-ALFN37IR.js} +1 -2
  80. package/dist/notifications-MO23S7S3.js +8 -0
  81. package/dist/{plugin-create-5HQRF2ID.js → plugin-create-EHL76ZZG.js} +1 -2
  82. package/dist/{plugin-create-5HQRF2ID.js.map → plugin-create-EHL76ZZG.js.map} +1 -1
  83. package/dist/plugin-installer-VSTYZSXC.js +9 -0
  84. package/dist/{plugin-registry-WB3DR67H.js → plugin-registry-6J3YSFHF.js} +1 -2
  85. package/dist/{plugin-search-HQ4WQKOF.js → plugin-search-MGKAL5JM.js} +1 -2
  86. package/dist/{plugin-search-HQ4WQKOF.js.map → plugin-search-MGKAL5JM.js.map} +1 -1
  87. package/dist/{post-upgrade-3ADZRMYJ.js → post-upgrade-Y26S2ZQ7.js} +6 -7
  88. package/dist/{post-upgrade-3ADZRMYJ.js.map → post-upgrade-Y26S2ZQ7.js.map} +1 -1
  89. package/dist/{read-text-file-IRZM3QLM.js → read-text-file-DJBTITIB.js} +1 -2
  90. package/dist/{registry-client-AVGRE4CF.js → registry-client-GTBWLXYU.js} +1 -2
  91. package/dist/{security-YNRBW6S7.js → security-2BA265LN.js} +1 -2
  92. package/dist/{settings-manager-MD2U4ZV2.js → settings-manager-B4UN2LAC.js} +1 -2
  93. package/dist/{setup-A7VPW46C.js → setup-E6BNEYCS.js} +109 -83
  94. package/dist/setup-E6BNEYCS.js.map +1 -0
  95. package/dist/speech-SG62JYIF.js +9 -0
  96. package/dist/{suggest-7D6B542M.js → suggest-RST5VOHB.js} +1 -3
  97. package/dist/{suggest-7D6B542M.js.map → suggest-RST5VOHB.js.map} +1 -1
  98. package/dist/telegram-EAVRDNFU.js +7 -0
  99. package/dist/tunnel-HWJ27WDH.js +7 -0
  100. package/dist/{tunnel-service-QJPUYEKU.js → tunnel-service-ZMO4THKE.js} +90 -11
  101. package/dist/tunnel-service-ZMO4THKE.js.map +1 -0
  102. package/dist/{validators-WSTBNKRW.js → validators-GITLOFXC.js} +1 -2
  103. package/dist/{version-NQZBM5M7.js → version-AXXV6IV2.js} +1 -2
  104. package/package.json +1 -3
  105. package/dist/adapter-JQFQ3JAO.js +0 -15
  106. package/dist/adapter-UORRGHNH.js +0 -1030
  107. package/dist/adapter-UORRGHNH.js.map +0 -1
  108. package/dist/agent-catalog-YHBFERYO.js +0 -11
  109. package/dist/agent-store-VSHNY5GT.js +0 -9
  110. package/dist/api-server-7G3ZUZRM.js +0 -8
  111. package/dist/api-server-CAYNPUF2.js +0 -11
  112. package/dist/chunk-2YCW3QDV.js.map +0 -1
  113. package/dist/chunk-32LVIEPW.js +0 -477
  114. package/dist/chunk-32LVIEPW.js.map +0 -1
  115. package/dist/chunk-AD3X6DGK.js.map +0 -1
  116. package/dist/chunk-BLQUXO7S.js.map +0 -1
  117. package/dist/chunk-KMMEFXIE.js.map +0 -1
  118. package/dist/chunk-ODUM3D6X.js.map +0 -1
  119. package/dist/chunk-QVMEF6FB.js.map +0 -1
  120. package/dist/chunk-QWP76EBW.js.map +0 -1
  121. package/dist/chunk-VUNV25KB.js +0 -16
  122. package/dist/chunk-WIIZNPCR.js.map +0 -1
  123. package/dist/chunk-WXVT3AOY.js.map +0 -1
  124. package/dist/chunk-XIBG7LSL.js.map +0 -1
  125. package/dist/chunk-XWDW3XBE.js.map +0 -1
  126. package/dist/chunk-ZHGPZBS4.js +0 -49
  127. package/dist/chunk-ZHGPZBS4.js.map +0 -1
  128. package/dist/chunk-ZNSO2QVC.js +0 -124
  129. package/dist/chunk-ZNSO2QVC.js.map +0 -1
  130. package/dist/config-I4FMCJGZ.js +0 -15
  131. package/dist/config-editor-7PKW42GZ.js +0 -11
  132. package/dist/context-XM6E22LM.js +0 -10
  133. package/dist/core-plugins-Y5US6RED.js +0 -23
  134. package/dist/dist-UHQK5CXN.js +0 -21151
  135. package/dist/dist-UHQK5CXN.js.map +0 -1
  136. package/dist/doctor-QZQAP46W.js +0 -10
  137. package/dist/file-service-EUODJAIT.js +0 -9
  138. package/dist/main-3GF3EQTE.js.map +0 -1
  139. package/dist/notifications-D5BRDNSU.js +0 -9
  140. package/dist/plugin-installer-QVJP6VKV.js.map +0 -1
  141. package/dist/setup-A7VPW46C.js.map +0 -1
  142. package/dist/slack-2XNWBOWH.js +0 -8
  143. package/dist/speech-2GHQNRIO.js +0 -9
  144. package/dist/telegram-E65IWFBW.js +0 -8
  145. package/dist/tunnel-45HA72MB.js +0 -8
  146. package/dist/tunnel-service-QJPUYEKU.js.map +0 -1
  147. package/dist/version-NQZBM5M7.js.map +0 -1
  148. /package/dist/{adapter-JQFQ3JAO.js.map → adapter-4U6MC5ZS.js.map} +0 -0
  149. /package/dist/{agent-catalog-YHBFERYO.js.map → agent-catalog-SZQQERV7.js.map} +0 -0
  150. /package/dist/{agent-dependencies-WS7Z2DFW.js.map → agent-dependencies-ED2ZTUHG.js.map} +0 -0
  151. /package/dist/{agent-registry-5LZT7CUB.js.map → agent-registry-YOGP656W.js.map} +0 -0
  152. /package/dist/{agent-store-VSHNY5GT.js.map → agent-store-5UHZH2XI.js.map} +0 -0
  153. /package/dist/{api-client-AQPNKXI2.js.map → api-client-XTLRRFPX.js.map} +0 -0
  154. /package/dist/{api-server-7G3ZUZRM.js.map → api-server-5VNYFWJE.js.map} +0 -0
  155. /package/dist/{api-server-CAYNPUF2.js.map → api-server-JLBDKCU4.js.map} +0 -0
  156. /package/dist/{autostart-6JS565RY.js.map → autostart-CUPZMKKC.js.map} +0 -0
  157. /package/dist/{chunk-PPSMUECX.js.map → chunk-2R5XM3ES.js.map} +0 -0
  158. /package/dist/{chunk-SNPYTMPR.js.map → chunk-3EWTPOF7.js.map} +0 -0
  159. /package/dist/{chunk-A6Y4GZM3.js.map → chunk-566W6INH.js.map} +0 -0
  160. /package/dist/{chunk-P2G275VD.js.map → chunk-CFUJGWOP.js.map} +0 -0
  161. /package/dist/{chunk-RBYBSSGO.js.map → chunk-FCTC7KDT.js.map} +0 -0
  162. /package/dist/{chunk-QAQDGPB4.js.map → chunk-GEOXPGCO.js.map} +0 -0
  163. /package/dist/{chunk-4GMLGCF2.js.map → chunk-KDU3ZEWT.js.map} +0 -0
  164. /package/dist/{chunk-HRKAXFWR.js.map → chunk-MPGEHTGE.js.map} +0 -0
  165. /package/dist/{chunk-BQ6FR32N.js.map → chunk-QWVHCTCA.js.map} +0 -0
  166. /package/dist/{chunk-SHTGQGAU.js.map → chunk-V2YZWYXT.js.map} +0 -0
  167. /package/dist/{chunk-VUNV25KB.js.map → config-KN6NKKPF.js.map} +0 -0
  168. /package/dist/{config-I4FMCJGZ.js.map → config-editor-76RVZS4B.js.map} +0 -0
  169. /package/dist/{config-editor-7PKW42GZ.js.map → config-registry-ZXAIJNYB.js.map} +0 -0
  170. /package/dist/{config-registry-CUMNXFGK.js.map → context-NXXW62NJ.js.map} +0 -0
  171. /package/dist/{context-XM6E22LM.js.map → core-plugins-OCHKGCIZ.js.map} +0 -0
  172. /package/dist/{core-plugins-Y5US6RED.js.map → daemon-XFEMMJSZ.js.map} +0 -0
  173. /package/dist/{daemon-PXO5QPCR.js.map → doctor-AV6AUO22.js.map} +0 -0
  174. /package/dist/{doctor-QZQAP46W.js.map → file-service-HHB3JQIO.js.map} +0 -0
  175. /package/dist/{file-service-EUODJAIT.js.map → log-YZ243M5G.js.map} +0 -0
  176. /package/dist/{log-LZ7FTRKG.js.map → menu-ALFN37IR.js.map} +0 -0
  177. /package/dist/{menu-YDQ2LWAR.js.map → notifications-MO23S7S3.js.map} +0 -0
  178. /package/dist/{notifications-D5BRDNSU.js.map → plugin-installer-VSTYZSXC.js.map} +0 -0
  179. /package/dist/{plugin-registry-WB3DR67H.js.map → plugin-registry-6J3YSFHF.js.map} +0 -0
  180. /package/dist/{read-text-file-IRZM3QLM.js.map → read-text-file-DJBTITIB.js.map} +0 -0
  181. /package/dist/{registry-client-AVGRE4CF.js.map → registry-client-GTBWLXYU.js.map} +0 -0
  182. /package/dist/{security-YNRBW6S7.js.map → security-2BA265LN.js.map} +0 -0
  183. /package/dist/{settings-manager-MD2U4ZV2.js.map → settings-manager-B4UN2LAC.js.map} +0 -0
  184. /package/dist/{slack-2XNWBOWH.js.map → speech-SG62JYIF.js.map} +0 -0
  185. /package/dist/{speech-2GHQNRIO.js.map → telegram-EAVRDNFU.js.map} +0 -0
  186. /package/dist/{telegram-E65IWFBW.js.map → tunnel-HWJ27WDH.js.map} +0 -0
  187. /package/dist/{tunnel-45HA72MB.js.map → validators-GITLOFXC.js.map} +0 -0
  188. /package/dist/{validators-WSTBNKRW.js.map → version-AXXV6IV2.js.map} +0 -0
@@ -8,11 +8,15 @@ import {
8
8
  } from "./chunk-ZSLHHQPQ.js";
9
9
  import {
10
10
  expandHome
11
- } from "./chunk-QVMEF6FB.js";
12
- import "./chunk-XMMAGAT4.js";
13
- import "./chunk-VUNV25KB.js";
11
+ } from "./chunk-W4LK6WJP.js";
12
+ import "./chunk-R6KZYF7D.js";
13
+ import {
14
+ RegistryClient
15
+ } from "./chunk-CDAUYTVP.js";
14
16
 
15
17
  // src/core/setup/wizard.ts
18
+ import * as os2 from "os";
19
+ import * as path2 from "path";
16
20
  import * as clack7 from "@clack/prompts";
17
21
 
18
22
  // src/core/setup/types.ts
@@ -73,7 +77,7 @@ var BANNER = `
73
77
  async function printStartBanner() {
74
78
  let version = "0.0.0";
75
79
  try {
76
- const { getCurrentVersion } = await import("./version-NQZBM5M7.js");
80
+ const { getCurrentVersion } = await import("./version-AXXV6IV2.js");
77
81
  version = getCurrentVersion();
78
82
  } catch {
79
83
  }
@@ -137,8 +141,8 @@ async function validateAgentCommand(command) {
137
141
  }
138
142
  }
139
143
  async function setupAgents() {
140
- const { AgentCatalog } = await import("./agent-catalog-YHBFERYO.js");
141
- const { muteLogger, unmuteLogger } = await import("./log-LZ7FTRKG.js");
144
+ const { AgentCatalog } = await import("./agent-catalog-SZQQERV7.js");
145
+ const { muteLogger, unmuteLogger } = await import("./log-YZ243M5G.js");
142
146
  muteLogger();
143
147
  const catalog = new AgentCatalog();
144
148
  catalog.load();
@@ -150,7 +154,7 @@ async function setupAgents() {
150
154
  if (claudeRegistry) {
151
155
  await catalog.install("claude-acp");
152
156
  } else {
153
- const { AgentStore } = await import("./agent-store-VSHNY5GT.js");
157
+ const { AgentStore } = await import("./agent-store-5UHZH2XI.js");
154
158
  const store = new AgentStore();
155
159
  store.load();
156
160
  store.addAgent("claude", {
@@ -284,8 +288,8 @@ async function setupRunMode(opts) {
284
288
  );
285
289
  const wasDaemon = existing?.runMode === "daemon";
286
290
  if (mode === "daemon") {
287
- const { installAutoStart, isAutoStartSupported } = await import("./autostart-6JS565RY.js");
288
- const { muteLogger, unmuteLogger } = await import("./log-LZ7FTRKG.js");
291
+ const { installAutoStart, isAutoStartSupported } = await import("./autostart-CUPZMKKC.js");
292
+ const { muteLogger, unmuteLogger } = await import("./log-YZ243M5G.js");
289
293
  const autoStart = isAutoStartSupported();
290
294
  if (autoStart) {
291
295
  muteLogger();
@@ -300,10 +304,10 @@ async function setupRunMode(opts) {
300
304
  return { runMode: "daemon", autoStart };
301
305
  }
302
306
  if (wasDaemon) {
303
- const { muteLogger, unmuteLogger } = await import("./log-LZ7FTRKG.js");
307
+ const { muteLogger, unmuteLogger } = await import("./log-YZ243M5G.js");
304
308
  muteLogger();
305
309
  try {
306
- const { stopDaemon } = await import("./daemon-PXO5QPCR.js");
310
+ const { stopDaemon } = await import("./daemon-XFEMMJSZ.js");
307
311
  const result = await stopDaemon();
308
312
  unmuteLogger();
309
313
  if (result.stopped) {
@@ -314,7 +318,7 @@ async function setupRunMode(opts) {
314
318
  }
315
319
  muteLogger();
316
320
  try {
317
- const { uninstallAutoStart } = await import("./autostart-6JS565RY.js");
321
+ const { uninstallAutoStart } = await import("./autostart-CUPZMKKC.js");
318
322
  uninstallAutoStart();
319
323
  unmuteLogger();
320
324
  } catch {
@@ -337,7 +341,7 @@ async function setupIntegrations(config) {
337
341
  );
338
342
  if (installClaude) {
339
343
  try {
340
- const { getIntegration } = await import("./integrate-G6CVXTGT.js");
344
+ const { getIntegration } = await import("./integrate-JIEZYDOR.js");
341
345
  const integration = getIntegration("claude");
342
346
  if (integration) {
343
347
  for (const item of integration.items) {
@@ -401,31 +405,28 @@ async function promptConfiguredAction(label) {
401
405
  );
402
406
  }
403
407
  async function configureViaPlugin(channelId) {
404
- const pluginImports = {
405
- telegram: () => import("./telegram-E65IWFBW.js"),
406
- discord: async () => {
407
- const pkg = "@openacp/adapter-discord";
408
- try {
409
- return await import(
410
- /* webpackIgnore: true */
411
- pkg
412
- );
413
- } catch {
414
- throw new Error(
415
- `${pkg} is not installed. Run: openacp plugin add ${pkg}`
416
- );
417
- }
418
- }
408
+ const pluginMap = {
409
+ telegram: { importPath: "../../plugins/telegram/index.js", name: "@openacp/telegram" }
419
410
  };
420
- const importer = pluginImports[channelId];
421
- if (!importer) return;
422
- const { SettingsManager } = await import("./settings-manager-MD2U4ZV2.js");
423
- const { createInstallContext } = await import("./install-context-XPWTFT3J.js");
424
- const basePath = path.join(os.homedir(), ".openacp", "plugins");
425
- const settingsManager = new SettingsManager(basePath);
426
- const pluginModule = await importer();
427
- const plugin = pluginModule.default;
411
+ const pluginInfo = pluginMap[channelId];
412
+ let plugin;
413
+ if (pluginInfo) {
414
+ const pluginModule = await import(pluginInfo.importPath);
415
+ plugin = pluginModule.default;
416
+ } else {
417
+ try {
418
+ const pluginModule = await import(channelId);
419
+ plugin = pluginModule.default;
420
+ } catch (err) {
421
+ console.log(`Could not load plugin "${channelId}": ${err.message}`);
422
+ return;
423
+ }
424
+ }
428
425
  if (plugin?.configure) {
426
+ const { SettingsManager } = await import("./settings-manager-B4UN2LAC.js");
427
+ const { createInstallContext } = await import("./install-context-EHYV5WRY.js");
428
+ const basePath = path.join(os.homedir(), ".openacp", "plugins", "data");
429
+ const settingsManager = new SettingsManager(basePath);
429
430
  const ctx = createInstallContext({
430
431
  pluginName: plugin.name,
431
432
  settingsManager,
@@ -493,6 +494,20 @@ async function configureChannels(config) {
493
494
  }
494
495
 
495
496
  // src/core/setup/wizard.ts
497
+ async function fetchCommunityAdapters() {
498
+ try {
499
+ const client = new RegistryClient();
500
+ const registry = await client.getRegistry();
501
+ return registry.plugins.filter((p) => p.category === "adapter" && p.verified).map((p) => ({
502
+ name: p.npm,
503
+ displayName: p.displayName ?? p.name,
504
+ icon: p.icon,
505
+ verified: p.verified
506
+ }));
507
+ } catch {
508
+ return [];
509
+ }
510
+ }
496
511
  async function runSetup(configManager, opts) {
497
512
  await printStartBanner();
498
513
  clack7.intro("Let's set up OpenACP");
@@ -502,12 +517,20 @@ async function runSetup(configManager, opts) {
502
517
  console.log(fail("Plugin system not initialized. Cannot set up channels."));
503
518
  return false;
504
519
  }
520
+ const communityAdapters = await fetchCommunityAdapters();
521
+ const builtInOptions = [
522
+ { label: "Telegram", value: "telegram" }
523
+ ];
524
+ const communityOptions = communityAdapters.map((a) => ({
525
+ label: `${a.icon} ${a.displayName}${a.verified ? " (verified)" : ""}`,
526
+ value: `community:${a.name}`
527
+ }));
505
528
  const channelChoices = guardCancel(
506
529
  await clack7.multiselect({
507
530
  message: "Which channels do you want to set up?",
508
531
  options: [
509
- { value: "telegram", label: "Telegram", hint: "built-in" },
510
- { value: "discord", label: "Discord", hint: "will install @openacp/adapter-discord" }
532
+ ...builtInOptions.map((o) => ({ value: o.value, label: o.label, hint: "built-in" })),
533
+ ...communityOptions.length > 0 ? communityOptions.map((o) => ({ value: o.value, label: o.label, hint: "from plugin registry" })) : []
511
534
  ],
512
535
  required: true,
513
536
  initialValues: ["telegram"]
@@ -517,11 +540,11 @@ async function runSetup(configManager, opts) {
517
540
  const runModeSteps = opts?.skipRunMode ? 0 : 1;
518
541
  const totalSteps = channelSteps + 1 + runModeSteps;
519
542
  let currentStep = 0;
520
- const { createInstallContext } = await import("./install-context-XPWTFT3J.js");
543
+ const { createInstallContext } = await import("./install-context-EHYV5WRY.js");
521
544
  for (const channelId of channelChoices) {
522
545
  currentStep++;
523
546
  if (channelId === "telegram") {
524
- const telegramPlugin = (await import("./telegram-E65IWFBW.js")).default;
547
+ const telegramPlugin = (await import("./telegram-EAVRDNFU.js")).default;
525
548
  const ctx = createInstallContext({
526
549
  pluginName: telegramPlugin.name,
527
550
  settingsManager,
@@ -536,10 +559,53 @@ async function runSetup(configManager, opts) {
536
559
  description: telegramPlugin.description
537
560
  });
538
561
  }
539
- if (channelId === "discord") {
540
- await installAndSetupDiscord(settingsManager, pluginRegistry);
562
+ if (channelId.startsWith("community:")) {
563
+ const npmPackage = channelId.slice("community:".length);
564
+ const { execFileSync: execFileSync2 } = await import("child_process");
565
+ const pluginsDir = path2.join(os2.homedir(), ".openacp", "plugins");
566
+ const nodeModulesDir = path2.join(pluginsDir, "node_modules");
567
+ try {
568
+ execFileSync2("npm", ["install", npmPackage, "--prefix", pluginsDir, "--save"], {
569
+ stdio: "inherit",
570
+ timeout: 6e4
571
+ });
572
+ } catch {
573
+ console.log(fail(`Failed to install ${npmPackage}.`));
574
+ return false;
575
+ }
576
+ try {
577
+ const { readFileSync } = await import("fs");
578
+ const installedPkgPath = path2.join(nodeModulesDir, npmPackage, "package.json");
579
+ const installedPkg = JSON.parse(readFileSync(installedPkgPath, "utf-8"));
580
+ const pluginModule = await import(path2.join(nodeModulesDir, npmPackage, installedPkg.main ?? "dist/index.js"));
581
+ const plugin = pluginModule.default;
582
+ if (plugin?.install) {
583
+ const installCtx = createInstallContext({
584
+ pluginName: plugin.name ?? npmPackage,
585
+ settingsManager,
586
+ basePath: settingsManager.getBasePath()
587
+ });
588
+ await plugin.install(installCtx);
589
+ }
590
+ pluginRegistry.register(plugin?.name ?? npmPackage, {
591
+ version: installedPkg.version,
592
+ source: "npm",
593
+ enabled: true,
594
+ settingsPath: settingsManager.getSettingsPath(plugin?.name ?? npmPackage),
595
+ description: plugin?.description ?? installedPkg.description
596
+ });
597
+ } catch (err) {
598
+ console.log(fail(`Failed to load ${npmPackage}: ${err.message}`));
599
+ pluginRegistry.register(npmPackage, {
600
+ version: "unknown",
601
+ source: "npm",
602
+ enabled: false,
603
+ settingsPath: settingsManager.getSettingsPath(npmPackage)
604
+ });
605
+ }
541
606
  }
542
607
  }
608
+ await pluginRegistry.save();
543
609
  const { defaultAgent } = await setupAgents();
544
610
  await setupIntegrations();
545
611
  currentStep++;
@@ -624,51 +690,11 @@ async function runSetup(configManager, opts) {
624
690
  throw err;
625
691
  }
626
692
  }
627
- async function installAndSetupDiscord(settingsManager, pluginRegistry) {
628
- const packageName = "@openacp/adapter-discord";
629
- let discordPlugin;
630
- const pluginsDir = settingsManager.getBasePath();
631
- try {
632
- const { importFromDir } = await import("./plugin-installer-QVJP6VKV.js");
633
- const mod = await importFromDir(packageName, pluginsDir);
634
- discordPlugin = mod.default;
635
- } catch {
636
- const spinner3 = clack7.spinner();
637
- spinner3.start(`Installing ${packageName}...`);
638
- try {
639
- const { installNpmPlugin } = await import("./plugin-installer-QVJP6VKV.js");
640
- const mod = await installNpmPlugin(packageName, pluginsDir);
641
- discordPlugin = mod.default;
642
- spinner3.stop(ok(`${packageName} installed`));
643
- } catch (installErr) {
644
- spinner3.stop(fail(`Failed to install ${packageName}: ${installErr.message}`));
645
- console.log(fail("You can install it later with: openacp plugin add @openacp/adapter-discord"));
646
- return;
647
- }
648
- }
649
- const { createInstallContext } = await import("./install-context-XPWTFT3J.js");
650
- const ctx = createInstallContext({
651
- pluginName: discordPlugin.name,
652
- settingsManager,
653
- basePath: settingsManager.getBasePath()
654
- });
655
- if (discordPlugin.install) {
656
- await discordPlugin.install(ctx);
657
- }
658
- pluginRegistry.register(discordPlugin.name, {
659
- version: discordPlugin.version,
660
- source: "npm",
661
- enabled: true,
662
- settingsPath: settingsManager.getSettingsPath(discordPlugin.name),
663
- description: discordPlugin.description
664
- });
665
- }
666
693
  async function registerBuiltinPlugins(settingsManager, pluginRegistry) {
667
694
  const builtinPlugins = [
668
695
  { name: "@openacp/security", version: "1.0.0", description: "User access control and session limits" },
669
696
  { name: "@openacp/file-service", version: "1.0.0", description: "File storage and management" },
670
697
  { name: "@openacp/context", version: "1.0.0", description: "Conversation context management" },
671
- { name: "@openacp/usage", version: "1.0.0", description: "Token usage tracking and budget enforcement" },
672
698
  { name: "@openacp/speech", version: "1.0.0", description: "Text-to-speech and speech-to-text" },
673
699
  { name: "@openacp/notifications", version: "1.0.0", description: "Cross-session notification routing" },
674
700
  { name: "@openacp/tunnel", version: "1.0.0", description: "Expose local services via tunnel" },
@@ -773,4 +799,4 @@ export {
773
799
  validateBotToken,
774
800
  validateChatId
775
801
  };
776
- //# sourceMappingURL=setup-A7VPW46C.js.map
802
+ //# sourceMappingURL=setup-E6BNEYCS.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"],"sourcesContent":["import * as os from \"node:os\";\nimport * as path from \"node:path\";\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\";\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?: { skipRunMode?: boolean; settingsManager?: SettingsManager; pluginRegistry?: PluginRegistry },\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 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(os.homedir(), '.openacp', '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 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 };\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 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// ─── 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 os from \"node:os\";\nimport * as path from \"node:path\";\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(os.homedir(), '.openacp', '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"],"mappings":";;;;;;;;;;;;;;;;;AAAA,YAAYA,SAAQ;AACpB,YAAYC,WAAU;AACtB,YAAYC,YAAW;;;ACiBhB,IAAM,0BAIR;AAAA,EACH,EAAE,OAAO,YAAY,OAAO,YAAY,MAAM,kCAAkC;AAAA,EAChF,EAAE,OAAO,UAAU,OAAO,UAAU,MAAM,iCAAiC;AAAA,EAC3E,EAAE,OAAO,aAAa,OAAO,aAAa,MAAM,0BAA0B;AAAA,EAC1E,EAAE,OAAO,WAAW,OAAO,YAAY,MAAM,gCAAgC;AAAA,EAC7E,EAAE,OAAO,gBAAgB,OAAO,gBAAgB,MAAM,8BAA8B;AACtF;AAEO,IAAM,eAAkE;AAAA,EAC7E,UAAU,EAAE,OAAO,YAAY,QAAQ,UAAU;AAAA,EACjD,SAAS,EAAE,OAAO,WAAW,QAAQ,UAAU;AACjD;;;AClCA,YAAY,WAAW;AAKhB,IAAM,IAAI;AAAA,EACf,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AACT;AAEO,IAAM,KAAK,CAAC,QACjB,GAAG,EAAE,KAAK,GAAG,EAAE,IAAI,SAAI,EAAE,KAAK,IAAI,EAAE,KAAK,GAAG,GAAG,GAAG,EAAE,KAAK;AACpD,IAAM,OAAO,CAAC,QAAgB,GAAG,EAAE,MAAM,UAAK,GAAG,GAAG,EAAE,KAAK;AAC3D,IAAM,OAAO,CAAC,QAAgB,GAAG,EAAE,GAAG,UAAK,GAAG,GAAG,EAAE,KAAK;AACxD,IAAM,OAAO,CAAC,GAAW,OAAe,UAC7C;AAAA,EAAK,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,KAAK,IAAI,EAAE,IAAI,GAAG,KAAK,GAAG,EAAE,KAAK;AAAA;AACpE,IAAM,MAAM,CAAC,QAAgB,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,EAAE,KAAK;AAErD,SAAS,YAAe,OAAsB;AACnD,MAAU,eAAS,KAAK,GAAG;AACzB,IAAM,aAAO,kBAAkB;AAC/B,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,SAAO;AACT;AAIA,SAAS,cAAcC,OAAsB;AAC3C,QAAM,SAAS,CAAC,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;AAC3C,QAAM,QAAQA,MAAK,MAAM,IAAI;AAC7B,SAAO,MACJ,IAAI,CAAC,MAAM,MAAM;AAChB,UAAM,WAAW,KAAK,IAAI,GAAG,OAAO,SAAS,CAAC;AAC9C,WAAO,aAAa,OAAO,QAAQ,CAAC,IAAI,IAAI;AAAA,EAC9C,CAAC,EACA,KAAK,IAAI;AACd;AAEA,IAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASf,eAAsB,mBAAkC;AACtD,MAAI,UAAU;AACd,MAAI;AACF,UAAM,EAAE,kBAAkB,IAAI,MAAM,OAAO,uBAAsB;AACjE,cAAU,kBAAkB;AAAA,EAC9B,QAAQ;AAAA,EAER;AACA,UAAQ,IAAI,cAAc,MAAM,CAAC;AACjC,UAAQ,IAAI,GAAG,EAAE,GAAG,+CAA+C,OAAO,GAAG,EAAE,KAAK;AAAA,CAAI;AAC1F;AAIO,SAAS,gBAAgB,QAAwB;AACtD,QAAM,QAAkB,CAAC;AAGzB,QAAM,kBAA4B,CAAC;AACnC,aAAW,CAAC,IAAI,IAAI,KAAK,OAAO,QAAQ;AAAA,IACtC,UAAU;AAAA,IACV,SAAS;AAAA,EACX,CAAC,GAAG;AACF,UAAM,KAAK,OAAO,SAAS,EAAE;AAC7B,QAAI,IAAI,SAAS;AACf,sBAAgB,KAAK,GAAG,IAAI,YAAY;AAAA,IAC1C,WAAW,MAAM,OAAO,KAAK,EAAE,EAAE,SAAS,GAAG;AAC3C,sBAAgB,KAAK,GAAG,IAAI,aAAa;AAAA,IAC3C,OAAO;AACL,sBAAgB,KAAK,GAAG,IAAI,mBAAmB;AAAA,IACjD;AAAA,EACF;AACA,QAAM,KAAK,aAAa,gBAAgB,KAAK,IAAI,CAAC,EAAE;AAGpD,QAAM,KAAK,kBAAkB,OAAO,YAAY,EAAE;AAGlD,QAAM,KAAK,cAAc,OAAO,UAAU,OAAO,EAAE;AAGnD,QAAM,KAAK,aAAa,OAAO,OAAO,GAAG,OAAO,YAAY,kBAAkB,EAAE,EAAE;AAElF,SAAO,MAAM,KAAK,IAAI;AACxB;;;AClGA,SAAS,oBAAoB;AAC7B,YAAYC,YAAW;AAIvB,IAAM,eAA4D;AAAA;AAAA;AAAA,EAGhE,EAAE,MAAM,UAAU,UAAU,CAAC,kBAAkB,EAAE;AAAA,EACjD,EAAE,MAAM,SAAS,UAAU,CAAC,OAAO,EAAE;AACvC;AAEA,eAAsB,eAEpB;AACA,QAAM,QAAkD,CAAC;AACzD,aAAW,SAAS,cAAc;AAEhC,UAAM,YAAsB,CAAC;AAC7B,eAAW,OAAO,MAAM,UAAU;AAChC,UAAI,cAAc,GAAG,GAAG;AACtB,kBAAU,KAAK,GAAG;AAAA,MACpB;AAAA,IACF;AACA,QAAI,UAAU,SAAS,GAAG;AAExB,YAAM,KAAK,EAAE,MAAM,MAAM,MAAM,SAAS,UAAU,CAAC,EAAE,CAAC;AAAA,IACxD;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAsB,qBAAqB,SAAmC;AAC5E,MAAI;AACF,iBAAa,SAAS,CAAC,OAAO,GAAG,EAAE,OAAO,OAAO,CAAC;AAClD,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,cAEnB;AACD,QAAM,EAAE,aAAa,IAAI,MAAM,OAAO,6BAA4B;AAClE,QAAM,EAAE,YAAY,aAAa,IAAI,MAAM,OAAO,mBAAiB;AAEnE,aAAW;AACX,QAAM,UAAU,IAAI,aAAa;AACjC,UAAQ,KAAK;AAEb,QAAM,IAAU,eAAQ;AACxB,IAAE,MAAM,8BAA8B;AACtC,QAAM,QAAQ,uBAAuB;AAGrC,MAAI,CAAC,QAAQ,kBAAkB,QAAQ,GAAG;AACxC,UAAM,iBAAiB,QAAQ,kBAAkB,YAAY;AAC7D,QAAI,gBAAgB;AAClB,YAAM,QAAQ,QAAQ,YAAY;AAAA,IACpC,OAAO;AAEL,YAAM,EAAE,WAAW,IAAI,MAAM,OAAO,2BAA0B;AAC9D,YAAM,QAAQ,IAAI,WAAW;AAC7B,YAAM,KAAK;AACX,YAAM,SAAS,UAAU;AAAA,QACvB,YAAY;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,cAAc;AAAA,QACd,SAAS;AAAA,QACT,MAAM,CAAC,kCAAkC;AAAA,QACzC,KAAK,CAAC;AAAA,QACN,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,QACpC,YAAY;AAAA,MACd,CAAC;AAAA,IACH;AAAA,EACF;AACA,IAAE,KAAK,GAAG,oBAAoB,CAAC;AAC/B,eAAa;AAEb,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,YAAY,UAAU,OAAO,CAAC,MAAM,EAAE,SAAS;AACrD,QAAM,cAAc,UAAU,OAAO,CAAC,MAAM,CAAC,EAAE,aAAa,EAAE,SAAS;AAGvE,MAAI,UAAU,SAAS,KAAK,YAAY,SAAS,GAAG;AAElD,UAAM,OAAO,oBAAI,IAAY;AAC7B,UAAM,UAAmD,CAAC;AAE1D,eAAW,KAAK,WAAW;AACzB,YAAM,YAAY,GAAG,EAAE,GAAG,KAAK,EAAE,IAAI;AACrC,UAAI,KAAK,IAAI,SAAS,EAAG;AACzB,WAAK,IAAI,SAAS;AAClB,cAAQ,KAAK;AAAA,QACX,OAAO,GAAG,EAAE,IAAI;AAAA,QAChB,OAAO,EAAE;AAAA,MACX,CAAC;AAAA,IACH;AACA,eAAW,KAAK,aAAa;AAC3B,YAAM,YAAY,GAAG,EAAE,GAAG,KAAK,EAAE,IAAI;AACrC,UAAI,KAAK,IAAI,SAAS,EAAG;AACzB,WAAK,IAAI,SAAS;AAClB,cAAQ,KAAK;AAAA,QACX,OAAO,GAAG,EAAE,IAAI,KAAK,EAAE,YAAY;AAAA,QACnC,OAAO,EAAE;AAAA,MACX,CAAC;AAAA,IACH;AAEA,UAAM,gBAAgB,UAAU,IAAI,OAAK,EAAE,GAAG;AAC9C,UAAM,WAAW;AAAA,MACf,MAAY,+BAAwB;AAAA,QAClC,SAAS;AAAA,QACT;AAAA,QACA,eAAe;AAAA,QACf,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAEA,eAAW,OAAO,UAAU;AAC1B,YAAM,WAAW,QAAQ,kBAAkB,GAAG;AAC9C,UAAI,UAAU;AACZ,cAAM,iBAAuB,eAAQ;AACrC,uBAAe,MAAM,cAAc,SAAS,IAAI,KAAK;AACrD,mBAAW;AACX,cAAM,SAAS,MAAM,QAAQ,QAAQ,GAAG;AACxC,qBAAa;AACb,YAAI,OAAO,IAAI;AACb,yBAAe,KAAK,GAAG,MAAM,CAAC;AAAA,QAChC,OAAO;AACL,yBAAe,KAAK,KAAK,YAAY,OAAO,KAAK,EAAE,CAAC;AAAA,QACtD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,kBAAkB,OAAO,KAAK,QAAQ,oBAAoB,CAAC;AACjE,MAAI,eAAe;AAEnB,MAAI,gBAAgB,SAAS,GAAG;AAC9B,mBAAe;AAAA,MACb,MAAY,cAAO;AAAA,QACjB,SAAS;AAAA,QACT,SAAS,gBAAgB,IAAI,CAAC,QAAQ;AACpC,gBAAM,QAAQ,QAAQ,kBAAkB,GAAG;AAC3C,iBAAO,EAAE,OAAO,GAAG,MAAM,IAAI,KAAK,GAAG,KAAK,OAAO,IAAI;AAAA,QACvD,CAAC;AAAA,QACD,cAAc;AAAA,MAChB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,UAAQ,IAAI,GAAG,kBAAkB,EAAE,IAAI,GAAG,YAAY,GAAG,EAAE,KAAK,EAAE,CAAC;AACnE,SAAO,EAAE,aAAa;AACxB;;;AC5JA,YAAYC,YAAW;AAGvB,eAAsB,eAAe,MAIJ;AAC/B,QAAM,EAAE,UAAU,SAAS,WAAW,IAAI,QAAQ,CAAC;AACnD,MAAI,WAAW,QAAQ,cAAc,MAAM;AACzC,YAAQ,IAAI,KAAK,SAAS,YAAY,WAAW,CAAC;AAAA,EACpD;AAEA,QAAM,UAAU;AAAA,IACd,MAAY,YAAK;AAAA,MACf,SAAS;AAAA,MACT,cAAc,YAAY;AAAA,MAC1B,UAAU,CAAC,SACR,OAAO,IAAI,SAAS,EAAE,KAAK,EAAE,SAAS,IAAI,SAAY;AAAA,IAC3D,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,SAAS,QAAQ,KAAK,EAAE,QAAQ,gBAAgB,EAAE,EAAE;AAC/D;;;ACvBA,YAAYC,YAAW;AAIvB,eAAsB,aAAa,MAImC;AACpE,QAAM,EAAE,UAAU,SAAS,WAAW,IAAI,QAAQ,CAAC;AACnD,MAAI,WAAW,QAAQ,cAAc,MAAM;AACzC,YAAQ,IAAI,KAAK,SAAS,YAAY,UAAU,CAAC;AAAA,EACnD;AAGA,MAAI,QAAQ,aAAa,SAAS;AAChC,YAAQ,IAAI,IAAI,0CAA0C,CAAC;AAC3D,WAAO,EAAE,SAAS,cAAc,WAAW,MAAM;AAAA,EACnD;AAEA,QAAM,eAAgB,UAAU,YAAY,WAAW,WAAW;AAElE,QAAM,OAAO;AAAA,IACX,MAAY,cAAO;AAAA,MACjB,SAAS;AAAA,MACT,SAAS;AAAA,QACP;AAAA,UACE,OAAO;AAAA,UACP,OAAO;AAAA,UACP,MAAM;AAAA,QACR;AAAA,QACA;AAAA,UACE,OAAO;AAAA,UACP,OAAO;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,YAAY,UAAU,YAAY;AAExC,MAAI,SAAS,UAAU;AACrB,UAAM,EAAE,kBAAkB,qBAAqB,IAAI,MAAM,OAAO,yBAAwB;AACxF,UAAM,EAAE,YAAY,aAAa,IAAI,MAAM,OAAO,mBAAiB;AACnE,UAAM,YAAY,qBAAqB;AACvC,QAAI,WAAW;AACb,iBAAW;AACX,YAAM,SAAS,iBAAiB,WAAW,iBAAiB,CAAC;AAC7D,mBAAa;AACb,UAAI,OAAO,SAAS;AAClB,gBAAQ,IAAI,GAAG,4BAA4B,CAAC;AAAA,MAC9C,OAAO;AACL,gBAAQ,IAAI,KAAK,sBAAsB,OAAO,KAAK,EAAE,CAAC;AAAA,MACxD;AAAA,IACF;AACA,WAAO,EAAE,SAAS,UAAU,UAAU;AAAA,EACxC;AAGA,MAAI,WAAW;AACb,UAAM,EAAE,YAAY,aAAa,IAAI,MAAM,OAAO,mBAAiB;AACnE,eAAW;AACX,QAAI;AACF,YAAM,EAAE,WAAW,IAAI,MAAM,OAAO,sBAAqB;AACzD,YAAM,SAAS,MAAM,WAAW;AAChC,mBAAa;AACb,UAAI,OAAO,SAAS;AAClB,gBAAQ,IAAI,GAAG,2BAA2B,OAAO,GAAG,GAAG,CAAC;AAAA,MAC1D;AAAA,IACF,QAAQ;AACN,mBAAa;AAAA,IAEf;AACA,eAAW;AACX,QAAI;AACF,YAAM,EAAE,mBAAmB,IAAI,MAAM,OAAO,yBAAwB;AACpE,yBAAmB;AACnB,mBAAa;AAAA,IACf,QAAQ;AACN,mBAAa;AAAA,IAEf;AAAA,EACF;AAEA,SAAO,EAAE,SAAS,cAAc,WAAW,MAAM;AACnD;;;ACvFA,YAAYC,YAAW;AAIvB,eAAsB,kBAAkB,QAAgC;AACtE,QAAM,oBAAqB,QAAQ,cAAsD;AACzF,QAAM,cAAc,mBAAmB,cAAc;AAErD,QAAM,gBAAgB;AAAA,IACpB,MAAY,eAAQ;AAAA,MAClB,SAAS,cACL,oDACA;AAAA,MACJ,cAAc,CAAC;AAAA,IACjB,CAAC;AAAA,EACH;AAEA,MAAI,eAAe;AACjB,QAAI;AACF,YAAM,EAAE,eAAe,IAAI,MAAM,OAAO,yBAAwB;AAChE,YAAM,cAAc,eAAe,QAAQ;AAC3C,UAAI,aAAa;AACf,mBAAW,QAAQ,YAAY,OAAO;AACpC,gBAAM,SAAS,MAAM,KAAK,QAAQ;AAClC,qBAAW,OAAO,OAAO,KAAM,SAAQ,IAAI,KAAK,GAAG,EAAE;AAAA,QACvD;AAAA,MACF;AACA,cAAQ,IAAI,qCAAqC;AAAA,IACnD,SAAS,KAAK;AACZ,cAAQ,IAAI,6CAA6C,eAAe,QAAQ,IAAI,UAAU,GAAG,EAAE;AACnG,cAAQ,IAAI,6DAA6D;AAAA,IAC3E;AAAA,EACF;AACF;;;ACjCA,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB,YAAYC,YAAW;AAMhB,SAAS,mBAAmB,QAAiC;AAClE,QAAM,WAA4B,CAAC;AAEnC,aAAW,CAAC,IAAI,IAAI,KAAK,OAAO,QAAQ,YAAY,GAAoD;AACtG,UAAM,KAAK,OAAO,SAAS,EAAE;AAC7B,UAAM,UAAU,IAAI,YAAY;AAChC,UAAM,aAAa,CAAC,CAAC,MAAM,OAAO,KAAK,EAAE,EAAE,SAAS;AAEpD,QAAI;AACJ,QAAI,OAAO,cAAc,IAAI,YAAY,OAAO,GAAG,aAAa,YAAY,GAAG,aAAa,uBAAuB;AACjH,aAAO,YAAY,GAAG,MAAM;AAAA,IAC9B;AACA,QAAI,OAAO,aAAa,IAAI,SAAS;AACnC,aAAO,UAAU,GAAG,OAAO;AAAA,IAC7B;AAEA,aAAS,KAAK,EAAE,IAAI,OAAO,KAAK,OAAO,YAAY,SAAS,KAAK,CAAC;AAAA,EACpE;AAEA,SAAO;AACT;AAEO,SAAS,kBAAkB,QAAsB;AACtD,QAAM,WAAW,mBAAmB,MAAM;AAC1C,QAAM,QAAQ,SAAS,IAAI,CAAC,MAAM;AAChC,UAAM,SAAS,EAAE,UAAU,YAAY,EAAE,aAAa,aAAa;AACnE,UAAM,UAAU,EAAE,OAAO,WAAM,EAAE,IAAI,KAAK;AAC1C,WAAO,KAAK,EAAE,KAAK,KAAK,MAAM,GAAG,OAAO;AAAA,EAC1C,CAAC;AAED,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,GAAG,EAAE,IAAI,mBAAmB,EAAE,KAAK,EAAE;AACjD,aAAW,QAAQ,MAAO,SAAQ,IAAI,IAAI;AAC1C,UAAQ,IAAI,EAAE;AAChB;AAEA,eAAe,uBAAuB,OAAiD;AACrF,SAAO;AAAA,IACL,MAAY,cAAO;AAAA,MACjB,SAAS,GAAG,KAAK;AAAA,MACjB,SAAS;AAAA,QACP,EAAE,OAAO,UAAmB,OAAO,kBAAkB;AAAA,QACrD,EAAE,OAAO,WAAoB,OAAO,cAAc;AAAA,QAClD,EAAE,OAAO,UAAmB,OAAO,gBAAgB;AAAA,QACnD,EAAE,OAAO,QAAiB,OAAO,qBAAqB;AAAA,MACxD;AAAA,MACA,cAAc;AAAA,IAChB,CAAC;AAAA,EACH;AACF;AAEA,eAAe,mBAAmB,WAAkC;AAClE,QAAM,YAAkE;AAAA,IACtE,UAAU,EAAE,YAAY,mCAAmC,MAAM,oBAAoB;AAAA,EACvF;AAEA,QAAM,aAAa,UAAU,SAAS;AAEtC,MAAI;AACJ,MAAI,YAAY;AACd,UAAM,eAAe,MAAM,OAAO,WAAW;AAC7C,aAAS,aAAa;AAAA,EACxB,OAAO;AAEL,QAAI;AACF,YAAM,eAAe,MAAM,OAAO;AAClC,eAAS,aAAa;AAAA,IACxB,SAAS,KAAK;AACZ,cAAQ,IAAI,0BAA0B,SAAS,MAAO,IAAc,OAAO,EAAE;AAC7E;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ,WAAW;AACrB,UAAM,EAAE,gBAAgB,IAAI,MAAM,OAAO,gCAA+B;AACxE,UAAM,EAAE,qBAAqB,IAAI,MAAM,OAAO,+BAA8B;AAC5E,UAAM,WAAgB,UAAQ,WAAQ,GAAG,YAAY,WAAW,MAAM;AACtE,UAAM,kBAAkB,IAAI,gBAAgB,QAAQ;AACpD,UAAM,MAAM,qBAAqB;AAAA,MAC/B,YAAY,OAAO;AAAA,MACnB;AAAA,MACA;AAAA,IACF,CAAC;AACD,UAAM,OAAO,UAAU,GAAG;AAAA,EAC5B;AACF;AAEA,eAAsB,kBAAkB,QAA+D;AACrG,QAAM,OAAO,gBAAgB,MAAM;AACnC,MAAI,UAAU;AAEd,oBAAkB,IAAI;AAEtB,SAAO,MAAM;AACX,UAAM,WAAW,mBAAmB,IAAI;AACxC,UAAM,UAAU,SAAS,IAAI,CAAC,MAAM;AAClC,YAAM,SAAS,EAAE,UAAU,YAAY,EAAE,aAAa,aAAa;AACnE,aAAO;AAAA,QACL,OAAO,EAAE;AAAA,QACT,OAAO,GAAG,EAAE,KAAK,KAAK,aAAa,EAAE,EAAE,EAAE,MAAM;AAAA,QAC/C,MAAM,UAAU,EAAE,OAAO,SAAM,EAAE,IAAI,KAAK;AAAA,MAC5C;AAAA,IACF,CAAC;AAED,UAAM,SAAS;AAAA,MACb,MAAY,cAAO;AAAA,QACjB,SAAS;AAAA,QACT,SAAS;AAAA,UACP,GAAG;AAAA,UACH,EAAE,OAAO,YAAqB,OAAO,WAAW;AAAA,QAClD;AAAA,MACF,CAAC;AAAA,IACH;AAEA,QAAI,WAAW,WAAY;AAE3B,UAAM,YAAY;AAClB,UAAM,OAAO,aAAa,SAAS;AACnC,UAAM,WAAW,KAAK,SAAS,SAAS;AACxC,UAAM,eAAe,CAAC,CAAC,YAAY,OAAO,KAAK,QAAQ,EAAE,SAAS;AAElE,QAAI,cAAc;AAChB,YAAM,SAAS,MAAM,uBAAuB,KAAK,KAAK;AAEtD,UAAI,WAAW,OAAQ;AACvB,UAAI,WAAW,WAAW;AACxB,QAAC,KAAK,SAAS,SAAS,EAA8B,UAAU;AAChE,kBAAU;AACV,gBAAQ,IAAI,GAAG,GAAG,KAAK,KAAK,WAAW,CAAC;AACxC;AAAA,MACF;AACA,UAAI,WAAW,UAAU;AACvB,cAAM,YAAY;AAAA,UAChB,MAAY,eAAQ;AAAA,YAClB,SAAS,UAAU,KAAK,KAAK;AAAA,YAC7B,cAAc;AAAA,UAChB,CAAC;AAAA,QACH;AACA,YAAI,WAAW;AACb,iBAAO,KAAK,SAAS,SAAS;AAC9B,oBAAU;AACV,kBAAQ,IAAI,GAAG,GAAG,KAAK,KAAK,iBAAiB,CAAC;AAAA,QAChD;AACA;AAAA,MACF;AAAA,IAEF;AAGA,UAAM,mBAAmB,SAAS;AAClC,cAAU;AAAA,EACZ;AAEA,SAAO,EAAE,QAAQ,MAAM,QAAQ;AACjC;;;AP9IA,eAAe,yBAA4D;AACzE,MAAI;AACF,UAAM,SAAS,IAAI,eAAe;AAClC,UAAM,WAAW,MAAM,OAAO,YAAY;AAC1C,WAAO,SAAS,QACb,OAAO,OAAK,EAAE,aAAa,aAAa,EAAE,QAAQ,EAClD,IAAI,QAAM;AAAA,MACT,MAAM,EAAE;AAAA,MACR,aAAa,EAAE,eAAe,EAAE;AAAA,MAChC,MAAM,EAAE;AAAA,MACR,UAAU,EAAE;AAAA,IACd,EAAE;AAAA,EACN,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAIA,eAAsB,SACpB,eACA,MACkB;AAClB,QAAM,iBAAiB;AACvB,EAAM,aAAM,sBAAsB;AAElC,QAAM,EAAE,iBAAiB,eAAe,IAAI,QAAQ,CAAC;AAErD,MAAI;AACF,QAAI,CAAC,mBAAmB,CAAC,gBAAgB;AACvC,cAAQ,IAAI,KAAK,wDAAwD,CAAC;AAC1E,aAAO;AAAA,IACT;AAEA,UAAM,oBAAoB,MAAM,uBAAuB;AAEvD,UAAM,iBAAiB;AAAA,MACrB,EAAE,OAAO,YAAY,OAAO,WAAW;AAAA,IACzC;AAEA,UAAM,mBAAmB,kBAAkB,IAAI,QAAM;AAAA,MACnD,OAAO,GAAG,EAAE,IAAI,IAAI,EAAE,WAAW,GAAG,EAAE,WAAW,gBAAgB,EAAE;AAAA,MACnE,OAAO,aAAa,EAAE,IAAI;AAAA,IAC5B,EAAE;AAGF,UAAM,iBAAiB;AAAA,MACrB,MAAY,mBAAY;AAAA,QACtB,SAAS;AAAA,QACT,SAAS;AAAA,UACP,GAAG,eAAe,IAAI,QAAM,EAAE,OAAO,EAAE,OAAO,OAAO,EAAE,OAAO,MAAM,WAAW,EAAE;AAAA,UACjF,GAAI,iBAAiB,SAAS,IAC1B,iBAAiB,IAAI,QAAM,EAAE,OAAO,EAAE,OAAO,OAAO,EAAE,OAAO,MAAM,uBAAuB,EAAE,IAC5F,CAAC;AAAA,QACP;AAAA,QACA,UAAU;AAAA,QACV,eAAe,CAAC,UAAmB;AAAA,MACrC,CAAC;AAAA,IACH;AAGA,UAAM,eAAe,eAAe;AACpC,UAAM,eAAe,MAAM,cAAc,IAAI;AAC7C,UAAM,aAAa,eAAe,IAAI;AAEtC,QAAI,cAAc;AAElB,UAAM,EAAE,qBAAqB,IAAI,MAAM,OAAO,+BAA8B;AAE5E,eAAW,aAAa,gBAAgB;AACtC;AAEA,UAAI,cAAc,YAAY;AAC5B,cAAM,kBAAkB,MAAM,OAAO,wBAAiC,GAAG;AACzE,cAAM,MAAM,qBAAqB;AAAA,UAC/B,YAAY,eAAe;AAAA,UAC3B;AAAA,UACA,UAAU,gBAAgB,YAAY;AAAA,QACxC,CAAC;AACD,cAAM,eAAe,QAAS,GAAG;AACjC,uBAAe,SAAS,eAAe,MAAM;AAAA,UAC3C,SAAS,eAAe;AAAA,UACxB,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,cAAc,gBAAgB,gBAAgB,eAAe,IAAI;AAAA,UACjE,aAAa,eAAe;AAAA,QAC9B,CAAC;AAAA,MACH;AAIA,UAAI,UAAU,WAAW,YAAY,GAAG;AACtC,cAAM,aAAa,UAAU,MAAM,aAAa,MAAM;AACtD,cAAM,EAAE,cAAAC,cAAa,IAAI,MAAM,OAAO,eAAoB;AAC1D,cAAM,aAAkB,WAAQ,YAAQ,GAAG,YAAY,SAAS;AAChE,cAAM,iBAAsB,WAAK,YAAY,cAAc;AAG3D,YAAI;AACF,UAAAA,cAAa,OAAO,CAAC,WAAW,YAAY,YAAY,YAAY,QAAQ,GAAG;AAAA,YAC7E,OAAO;AAAA,YACP,SAAS;AAAA,UACX,CAAC;AAAA,QACH,QAAQ;AACN,kBAAQ,IAAI,KAAK,qBAAqB,UAAU,GAAG,CAAC;AACpD,iBAAO;AAAA,QACT;AAGA,YAAI;AACF,gBAAM,EAAE,aAAa,IAAI,MAAM,OAAO,IAAS;AAC/C,gBAAM,mBAAwB,WAAK,gBAAgB,YAAY,cAAc;AAC7E,gBAAM,eAAe,KAAK,MAAM,aAAa,kBAAkB,OAAO,CAAC;AACvE,gBAAM,eAAe,MAAM,OAAY,WAAK,gBAAgB,YAAY,aAAa,QAAQ,eAAe;AAC5G,gBAAM,SAAS,aAAa;AAE5B,cAAI,QAAQ,SAAS;AACnB,kBAAM,aAAa,qBAAqB;AAAA,cACtC,YAAY,OAAO,QAAQ;AAAA,cAC3B;AAAA,cACA,UAAU,gBAAgB,YAAY;AAAA,YACxC,CAAC;AACD,kBAAM,OAAO,QAAQ,UAAU;AAAA,UACjC;AAEA,yBAAe,SAAS,QAAQ,QAAQ,YAAY;AAAA,YAClD,SAAS,aAAa;AAAA,YACtB,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,cAAc,gBAAgB,gBAAgB,QAAQ,QAAQ,UAAU;AAAA,YACxE,aAAa,QAAQ,eAAe,aAAa;AAAA,UACnD,CAAC;AAAA,QACH,SAAS,KAAK;AAEZ,kBAAQ,IAAI,KAAK,kBAAkB,UAAU,KAAM,IAAc,OAAO,EAAE,CAAC;AAC3E,yBAAe,SAAS,YAAY;AAAA,YAClC,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,cAAc,gBAAgB,gBAAgB,UAAU;AAAA,UAC1D,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAGA,UAAM,eAAe,KAAK;AAE1B,UAAM,EAAE,aAAa,IAAI,MAAM,YAAY;AAG3C,UAAM,kBAAkB;AAExB;AACA,UAAM,YAAY,MAAM,eAAe,EAAE,SAAS,aAAa,WAAW,CAAC;AAE3E,QAAI,UAAmC;AACvC,QAAI,YAAY;AAChB,QAAI,CAAC,MAAM,aAAa;AACtB;AACA,YAAM,SAAS,MAAM,aAAa,EAAE,SAAS,aAAa,WAAW,CAAC;AACtE,gBAAU,OAAO;AACjB,kBAAY,OAAO;AAAA,IACrB;AAEA,UAAM,WAAW;AAAA,MACf,gBAAgB,CAAC;AAAA,MACjB,uBAAuB;AAAA,MACvB,uBAAuB;AAAA,IACzB;AAEA,UAAM,SAAiB;AAAA,MACrB,UAAU,CAAC;AAAA,MACX,QAAQ,CAAC;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS;AAAA,QACP,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,aAAa;AAAA,QACb,UAAU;AAAA,QACV,yBAAyB;AAAA,MAC3B;AAAA,MACA;AAAA,MACA;AAAA,MACA,KAAK;AAAA,QACH,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA,cAAc,EAAE,SAAS,GAAG;AAAA,MAC5B,QAAQ;AAAA,QACN,SAAS;AAAA,QACT,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,CAAC;AAAA,QACV,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,QACjB,MAAM,EAAE,SAAS,MAAM;AAAA,MACzB;AAAA,MACA,OAAO;AAAA,QACL,SAAS;AAAA,QACT,kBAAkB;AAAA,QAClB,UAAU;AAAA,QACV,eAAe;AAAA,MACjB;AAAA,MACA,cAAc,CAAC;AAAA,MACf,QAAQ;AAAA,QACN,KAAK,EAAE,UAAU,MAAM,WAAW,CAAC,EAAE;AAAA,QACrC,KAAK,EAAE,UAAU,MAAM,WAAW,CAAC,EAAE;AAAA,MACvC;AAAA,IACF;AAEA,QAAI;AACF,YAAM,cAAc,SAAS,MAAM;AAAA,IACrC,SAAS,UAAU;AACjB,cAAQ;AAAA,QACN,KAAK,0BAA2B,SAAmB,OAAO,EAAE;AAAA,MAC9D;AACA,aAAO;AAAA,IACT;AAGA,QAAI,mBAAmB,gBAAgB;AACrC,YAAM,uBAAuB,iBAAiB,cAAc;AAC5D,YAAM,eAAe,KAAK;AAAA,IAC5B;AAEA,IAAM,aAAM,mBAAmB,cAAc,cAAc,CAAC,EAAE;AAE9D,QAAI,CAAC,MAAM,aAAa;AACtB,cAAQ,IAAI,GAAG,qBAAqB,CAAC;AACrC,cAAQ,IAAI,EAAE;AAAA,IAChB;AAEA,WAAO;AAAA,EACT,SAAS,KAAK;AACZ,QAAK,IAAc,SAAS,mBAAmB;AAC7C,MAAM,cAAO,kBAAkB;AAC/B,aAAO;AAAA,IACT;AACA,UAAM;AAAA,EACR;AACF;AAMA,eAAe,uBACb,iBACA,gBACe;AACf,QAAM,iBAAiB;AAAA,IACrB,EAAE,MAAM,qBAAqB,SAAS,SAAS,aAAa,yCAAyC;AAAA,IACrG,EAAE,MAAM,yBAAyB,SAAS,SAAS,aAAa,8BAA8B;AAAA,IAC9F,EAAE,MAAM,oBAAoB,SAAS,SAAS,aAAa,kCAAkC;AAAA,IAC7F,EAAE,MAAM,mBAAmB,SAAS,SAAS,aAAa,oCAAoC;AAAA,IAC9F,EAAE,MAAM,0BAA0B,SAAS,SAAS,aAAa,qCAAqC;AAAA,IACtG,EAAE,MAAM,mBAAmB,SAAS,SAAS,aAAa,mCAAmC;AAAA,IAC7F,EAAE,MAAM,uBAAuB,SAAS,SAAS,aAAa,kCAAkC;AAAA,EAClG;AAEA,aAAW,KAAK,gBAAgB;AAC9B,QAAI,CAAC,eAAe,IAAI,EAAE,IAAI,GAAG;AAC/B,qBAAe,SAAS,EAAE,MAAM;AAAA,QAC9B,SAAS,EAAE;AAAA,QACX,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,cAAc,gBAAgB,gBAAgB,EAAE,IAAI;AAAA,QACpD,aAAa,EAAE;AAAA,MACjB,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAMA,eAAe,cAAc,cAAoD;AAC/E,SAAO;AAAA,IACL,MAAY,cAAO;AAAA,MACjB,SAAS;AAAA,MACT,SAAS;AAAA,QACP,GAAG;AAAA,QACH;AAAA,UACE,OAAO;AAAA,UACP,OAAO;AAAA,UACP,MAAM,eAAe,SAAS;AAAA,QAChC;AAAA,MACF;AAAA,MACA,cAAc,wBAAwB,CAAC,EAAE;AAAA,IAC3C,CAAC;AAAA,EACH;AACF;AAEA,eAAsB,eAAe,eAA6C;AAChF,QAAM,iBAAiB;AACvB,EAAM,aAAM,4BAAuB;AAEnC,MAAI;AACF,UAAM,cAAc,KAAK;AACzB,QAAI,SAAS,cAAc,IAAI;AAG/B,IAAM,YAAK,gBAAgB,MAAM,GAAG,uBAAuB;AAE3D,QAAI,aAAa;AAEjB,WAAO,MAAM;AACX,YAAM,SAAS,MAAM,cAAc,UAAU;AAC7C,UAAI,WAAW,aAAc;AAC7B,mBAAa;AAEb,UAAI,WAAW,YAAY;AACzB,cAAM,SAAS,MAAM,kBAAkB,MAAM;AAC7C,YAAI,OAAO,SAAS;AAIlB,mBAAS,EAAE,GAAG,QAAQ,UAAU,OAAO,OAAO,SAAS;AACvD,gBAAM,cAAc,SAAS,MAAM;AAAA,QACrC;AAAA,MACF;AAEA,UAAI,WAAW,UAAU;AACvB,cAAM,EAAE,aAAa,IAAI,MAAM,YAAY;AAC3C,cAAM,cAAc,KAAK,EAAE,aAAa,CAAC;AACzC,iBAAS,cAAc,IAAI;AAAA,MAC7B;AAEA,UAAI,WAAW,aAAa;AAC1B,cAAM,EAAE,QAAQ,IAAI,MAAM,eAAe;AAAA,UACvC,UAAU,OAAO,UAAU;AAAA,QAC7B,CAAC;AACD,cAAM,cAAc,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;AACnD,iBAAS,cAAc,IAAI;AAAA,MAC7B;AAEA,UAAI,WAAW,WAAW;AACxB,cAAM,SAAS,MAAM,aAAa;AAAA,UAChC,UAAU,EAAE,SAAS,OAAO,SAAS,WAAW,OAAO,UAAU;AAAA,QACnE,CAAC;AACD,cAAM,cAAc,KAAK;AAAA,UACvB,SAAS,OAAO;AAAA,UAChB,WAAW,OAAO;AAAA,QACpB,CAAC;AACD,iBAAS,cAAc,IAAI;AAAA,MAC7B;AAEA,UAAI,WAAW,gBAAgB;AAC7B,cAAM,kBAAkB,MAAM;AAAA,MAChC;AAAA,IACF;AAEA,QAAI,CAAC,YAAY;AACf,MAAM,aAAM,kBAAkB;AAC9B;AAAA,IACF;AAEA,IAAM,aAAM,mBAAmB,cAAc,cAAc,CAAC,EAAE;AAAA,EAChE,SAAS,KAAK;AACZ,QAAK,IAAc,SAAS,mBAAmB;AAC7C,MAAM,cAAO,kBAAkB;AAC/B;AAAA,IACF;AACA,UAAM;AAAA,EACR;AACF;","names":["os","path","clack","text","clack","clack","clack","clack","clack","execFileSync"]}
@@ -0,0 +1,9 @@
1
+ import {
2
+ speech_default
3
+ } from "./chunk-TMVTSWVH.js";
4
+ import "./chunk-5WGVYX3C.js";
5
+ import "./chunk-2KT6TROD.js";
6
+ export {
7
+ speech_default as default
8
+ };
9
+ //# sourceMappingURL=speech-SG62JYIF.js.map
@@ -1,5 +1,3 @@
1
- import "./chunk-VUNV25KB.js";
2
-
3
1
  // src/cli/suggest.ts
4
2
  import { distance } from "fastest-levenshtein";
5
3
  function suggestMatch(input, candidates, maxDistance = 2) {
@@ -35,4 +33,4 @@ function suggestMatch(input, candidates, maxDistance = 2) {
35
33
  export {
36
34
  suggestMatch
37
35
  };
38
- //# sourceMappingURL=suggest-7D6B542M.js.map
36
+ //# sourceMappingURL=suggest-RST5VOHB.js.map
@@ -1 +1 @@
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
+ {"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":[]}
@@ -0,0 +1,7 @@
1
+ import {
2
+ telegram_default
3
+ } from "./chunk-CFUJGWOP.js";
4
+ export {
5
+ telegram_default as default
6
+ };
7
+ //# sourceMappingURL=telegram-EAVRDNFU.js.map
@@ -0,0 +1,7 @@
1
+ import {
2
+ tunnel_default
3
+ } from "./chunk-PA6MNBG4.js";
4
+ export {
5
+ tunnel_default as default
6
+ };
7
+ //# sourceMappingURL=tunnel-HWJ27WDH.js.map