@openacp/cli 0.6.3 → 0.6.4

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 (98) hide show
  1. package/dist/{admin-3ZHEO5VP.js → admin-SCP25TN2.js} +3 -3
  2. package/dist/agent-catalog-SBZQRYOD.js +10 -0
  3. package/dist/agent-store-CGE4G6PA.js +8 -0
  4. package/dist/{agents-SXIY4IEF.js → agents-QJPHNWK2.js} +3 -3
  5. package/dist/{autostart-A7JRU4WJ.js → autostart-6M3FZAKW.js} +3 -3
  6. package/dist/{chunk-PMGNLNSH.js → chunk-2CJ46J3C.js} +2 -2
  7. package/dist/{chunk-5HGXUCMX.js → chunk-34M4OS5P.js} +2 -2
  8. package/dist/{chunk-TMCQZAXN.js → chunk-3CHBVO4T.js} +3 -3
  9. package/dist/{chunk-TTDSLV35.js → chunk-4CTX774K.js} +3 -3
  10. package/dist/{chunk-NXEQXRQR.js → chunk-774Y4RAK.js} +2 -2
  11. package/dist/{chunk-SM3G6UAX.js → chunk-BNLGTZ34.js} +2 -2
  12. package/dist/{chunk-AVCHZESZ.js → chunk-DJIXG62C.js} +49 -20
  13. package/dist/chunk-DJIXG62C.js.map +1 -0
  14. package/dist/{chunk-KO5RL7MZ.js → chunk-DOCFD5JR.js} +2 -2
  15. package/dist/{chunk-HP2IJYCA.js → chunk-E56PPPAE.js} +9 -9
  16. package/dist/chunk-E56PPPAE.js.map +1 -0
  17. package/dist/{chunk-ESOPMQAY.js → chunk-GAK6PIBW.js} +25 -2
  18. package/dist/chunk-GAK6PIBW.js.map +1 -0
  19. package/dist/{chunk-3KGRVAEV.js → chunk-J4SJTKIK.js} +2 -2
  20. package/dist/{chunk-FZ5BIWG5.js → chunk-JV6XQRAE.js} +4 -4
  21. package/dist/{chunk-EWYNCHUH.js → chunk-L5KZXYJD.js} +2 -2
  22. package/dist/{chunk-G3OHCXZG.js → chunk-N6E3HE42.js} +194 -133
  23. package/dist/chunk-N6E3HE42.js.map +1 -0
  24. package/dist/{chunk-EVFJW45N.js → chunk-S64CB6J3.js} +13 -13
  25. package/dist/{chunk-EVFJW45N.js.map → chunk-S64CB6J3.js.map} +1 -1
  26. package/dist/{chunk-6LSFRNHE.js → chunk-TNFXJQZP.js} +3 -3
  27. package/dist/{chunk-OHR6SBMC.js → chunk-TOQPQB5Q.js} +3 -3
  28. package/dist/{chunk-CKOK7JW6.js → chunk-UKT3G5IA.js} +3 -3
  29. package/dist/{chunk-PWFPTG5X.js → chunk-V5GZQEIY.js} +2 -2
  30. package/dist/{chunk-IER5UCY7.js → chunk-YQRF3IOR.js} +2 -2
  31. package/dist/cli.js +54 -44
  32. package/dist/cli.js.map +1 -1
  33. package/dist/{config-4YSJ4NCI.js → config-XDUOULXX.js} +3 -3
  34. package/dist/config-editor-3GGBY7NL.js +12 -0
  35. package/dist/{daemon-I6XMRQ6P.js → daemon-QY7WXHQ3.js} +4 -4
  36. package/dist/{discord-VHCBN3JJ.js → discord-4DE22BQC.js} +19 -19
  37. package/dist/doctor-D3YZ6VHJ.js +14 -0
  38. package/dist/doctor-SNSQ5SS2.js +9 -0
  39. package/dist/index.js +11 -11
  40. package/dist/{install-cloudflared-G2GUKCHA.js → install-cloudflared-FSILDS5J.js} +3 -3
  41. package/dist/{install-jq-7QTU7XYY.js → install-jq-P6RUBKPV.js} +3 -3
  42. package/dist/{log-SPS2S6FO.js → log-RCVBXLTN.js} +8 -4
  43. package/dist/{main-P4X6SAPZ.js → main-GVTLD7VI.js} +46 -26
  44. package/dist/main-GVTLD7VI.js.map +1 -0
  45. package/dist/{new-session-PUNUHGYP.js → new-session-K6UCWYOP.js} +5 -5
  46. package/dist/{post-upgrade-6N4JCV5S.js → post-upgrade-62LUHDJO.js} +5 -5
  47. package/dist/{session-ZMAM67AA.js → session-O6ZPLJIZ.js} +4 -4
  48. package/dist/{settings-OEQEZS5Y.js → settings-RRF77IC4.js} +3 -3
  49. package/dist/{setup-7YBFKRG7.js → setup-D6BU36ZL.js} +4 -4
  50. package/dist/{tunnel-service-BMIBHUBK.js → tunnel-service-NJJH4I26.js} +3 -3
  51. package/dist/{version-ALWGGVKM.js → version-AXXV6IV2.js} +2 -2
  52. package/package.json +3 -2
  53. package/dist/agent-catalog-IVU2KANH.js +0 -10
  54. package/dist/agent-store-ZBXGOFPH.js +0 -8
  55. package/dist/chunk-AVCHZESZ.js.map +0 -1
  56. package/dist/chunk-ESOPMQAY.js.map +0 -1
  57. package/dist/chunk-G3OHCXZG.js.map +0 -1
  58. package/dist/chunk-HP2IJYCA.js.map +0 -1
  59. package/dist/config-editor-F25HEMGL.js +0 -12
  60. package/dist/doctor-GPW5ECK6.js +0 -14
  61. package/dist/doctor-Y3SCSVPI.js +0 -9
  62. package/dist/main-P4X6SAPZ.js.map +0 -1
  63. /package/dist/{admin-3ZHEO5VP.js.map → admin-SCP25TN2.js.map} +0 -0
  64. /package/dist/{agent-catalog-IVU2KANH.js.map → agent-catalog-SBZQRYOD.js.map} +0 -0
  65. /package/dist/{agent-store-ZBXGOFPH.js.map → agent-store-CGE4G6PA.js.map} +0 -0
  66. /package/dist/{agents-SXIY4IEF.js.map → agents-QJPHNWK2.js.map} +0 -0
  67. /package/dist/{autostart-A7JRU4WJ.js.map → autostart-6M3FZAKW.js.map} +0 -0
  68. /package/dist/{chunk-PMGNLNSH.js.map → chunk-2CJ46J3C.js.map} +0 -0
  69. /package/dist/{chunk-5HGXUCMX.js.map → chunk-34M4OS5P.js.map} +0 -0
  70. /package/dist/{chunk-TMCQZAXN.js.map → chunk-3CHBVO4T.js.map} +0 -0
  71. /package/dist/{chunk-TTDSLV35.js.map → chunk-4CTX774K.js.map} +0 -0
  72. /package/dist/{chunk-NXEQXRQR.js.map → chunk-774Y4RAK.js.map} +0 -0
  73. /package/dist/{chunk-SM3G6UAX.js.map → chunk-BNLGTZ34.js.map} +0 -0
  74. /package/dist/{chunk-KO5RL7MZ.js.map → chunk-DOCFD5JR.js.map} +0 -0
  75. /package/dist/{chunk-3KGRVAEV.js.map → chunk-J4SJTKIK.js.map} +0 -0
  76. /package/dist/{chunk-FZ5BIWG5.js.map → chunk-JV6XQRAE.js.map} +0 -0
  77. /package/dist/{chunk-EWYNCHUH.js.map → chunk-L5KZXYJD.js.map} +0 -0
  78. /package/dist/{chunk-6LSFRNHE.js.map → chunk-TNFXJQZP.js.map} +0 -0
  79. /package/dist/{chunk-OHR6SBMC.js.map → chunk-TOQPQB5Q.js.map} +0 -0
  80. /package/dist/{chunk-CKOK7JW6.js.map → chunk-UKT3G5IA.js.map} +0 -0
  81. /package/dist/{chunk-PWFPTG5X.js.map → chunk-V5GZQEIY.js.map} +0 -0
  82. /package/dist/{chunk-IER5UCY7.js.map → chunk-YQRF3IOR.js.map} +0 -0
  83. /package/dist/{config-4YSJ4NCI.js.map → config-XDUOULXX.js.map} +0 -0
  84. /package/dist/{config-editor-F25HEMGL.js.map → config-editor-3GGBY7NL.js.map} +0 -0
  85. /package/dist/{daemon-I6XMRQ6P.js.map → daemon-QY7WXHQ3.js.map} +0 -0
  86. /package/dist/{discord-VHCBN3JJ.js.map → discord-4DE22BQC.js.map} +0 -0
  87. /package/dist/{doctor-GPW5ECK6.js.map → doctor-D3YZ6VHJ.js.map} +0 -0
  88. /package/dist/{doctor-Y3SCSVPI.js.map → doctor-SNSQ5SS2.js.map} +0 -0
  89. /package/dist/{install-cloudflared-G2GUKCHA.js.map → install-cloudflared-FSILDS5J.js.map} +0 -0
  90. /package/dist/{install-jq-7QTU7XYY.js.map → install-jq-P6RUBKPV.js.map} +0 -0
  91. /package/dist/{log-SPS2S6FO.js.map → log-RCVBXLTN.js.map} +0 -0
  92. /package/dist/{new-session-PUNUHGYP.js.map → new-session-K6UCWYOP.js.map} +0 -0
  93. /package/dist/{post-upgrade-6N4JCV5S.js.map → post-upgrade-62LUHDJO.js.map} +0 -0
  94. /package/dist/{session-ZMAM67AA.js.map → session-O6ZPLJIZ.js.map} +0 -0
  95. /package/dist/{settings-OEQEZS5Y.js.map → settings-RRF77IC4.js.map} +0 -0
  96. /package/dist/{setup-7YBFKRG7.js.map → setup-D6BU36ZL.js.map} +0 -0
  97. /package/dist/{tunnel-service-BMIBHUBK.js.map → tunnel-service-NJJH4I26.js.map} +0 -0
  98. /package/dist/{version-ALWGGVKM.js.map → version-AXXV6IV2.js.map} +0 -0
@@ -59,6 +59,22 @@ function wrapVariadic(logger) {
59
59
  };
60
60
  }
61
61
  var log = wrapVariadic(rootLogger);
62
+ var muteCount = 0;
63
+ var savedLevel = "info";
64
+ function muteLogger() {
65
+ if (muteCount === 0) {
66
+ savedLevel = rootLogger.level;
67
+ rootLogger.level = "silent";
68
+ }
69
+ muteCount++;
70
+ }
71
+ function unmuteLogger() {
72
+ muteCount--;
73
+ if (muteCount <= 0) {
74
+ muteCount = 0;
75
+ rootLogger.level = savedLevel;
76
+ }
77
+ }
62
78
  function initLogger(config) {
63
79
  if (initialized) return rootLogger;
64
80
  const resolvedLogDir = expandHome(config.logDir);
@@ -74,7 +90,12 @@ function initLogger(config) {
74
90
  targets: [
75
91
  {
76
92
  target: "pino-pretty",
77
- options: { colorize: true, translateTime: "SYS:standard" },
93
+ options: {
94
+ colorize: true,
95
+ translateTime: "HH:mm:ss",
96
+ ignore: "pid,hostname",
97
+ singleLine: true
98
+ },
78
99
  level: config.level
79
100
  },
80
101
  {
@@ -191,6 +212,8 @@ async function cleanupOldSessionLogs(retentionDays) {
191
212
 
192
213
  export {
193
214
  log,
215
+ muteLogger,
216
+ unmuteLogger,
194
217
  initLogger,
195
218
  setLogLevel,
196
219
  createChildLogger,
@@ -198,4 +221,4 @@ export {
198
221
  shutdownLogger,
199
222
  cleanupOldSessionLogs
200
223
  };
201
- //# sourceMappingURL=chunk-ESOPMQAY.js.map
224
+ //# sourceMappingURL=chunk-GAK6PIBW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/core/log.ts"],"sourcesContent":["import pino from 'pino'\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport os from 'node:os'\nimport type { LoggingConfig } from './config.js'\n\nexport type Logger = pino.Logger\n\n// --- Default console-only logger (pre-init) ---\nlet rootLogger: pino.Logger = pino({\n level: 'debug',\n transport: { target: 'pino-pretty', options: { colorize: true, translateTime: 'SYS:standard' } },\n})\nlet initialized = false\nlet logDir: string | undefined\nlet currentTransport: ReturnType<typeof pino.transport> | undefined\n\nfunction expandHome(p: string): string {\n return p.startsWith('~') ? path.join(os.homedir(), p.slice(1)) : p\n}\n\n// --- Variadic wrapper for backward compatibility ---\nfunction wrapVariadic(logger: pino.Logger) {\n return {\n info: (...args: unknown[]) => {\n if (args.length === 0) return\n if (typeof args[0] === 'object' && args[0] !== null && !(args[0] instanceof Error)) {\n logger.info(args[0] as object, args.slice(1).join(' '))\n } else {\n logger.info(args.map(String).join(' '))\n }\n },\n warn: (...args: unknown[]) => {\n if (args.length === 0) return\n if (typeof args[0] === 'object' && args[0] !== null && !(args[0] instanceof Error)) {\n logger.warn(args[0] as object, args.slice(1).join(' '))\n } else {\n logger.warn(args.map(String).join(' '))\n }\n },\n error: (...args: unknown[]) => {\n if (args.length === 0) return\n if (typeof args[0] === 'object' && args[0] !== null && !(args[0] instanceof Error)) {\n logger.error(args[0] as object, args.slice(1).join(' '))\n } else {\n logger.error(args.map(String).join(' '))\n }\n },\n debug: (...args: unknown[]) => {\n if (args.length === 0) return\n if (typeof args[0] === 'object' && args[0] !== null && !(args[0] instanceof Error)) {\n logger.debug(args[0] as object, args.slice(1).join(' '))\n } else {\n logger.debug(args.map(String).join(' '))\n }\n },\n fatal: (...args: unknown[]) => {\n if (args.length === 0) return\n if (typeof args[0] === 'object' && args[0] !== null && !(args[0] instanceof Error)) {\n logger.fatal(args[0] as object, args.slice(1).join(' '))\n } else {\n logger.fatal(args.map(String).join(' '))\n }\n },\n child: (bindings: pino.Bindings) => logger.child(bindings),\n }\n}\n\nexport const log = wrapVariadic(rootLogger)\n\n// --- Mute/unmute (suppress pino output during interactive prompts) ---\n\nlet muteCount = 0\nlet savedLevel = 'info'\n\nexport function muteLogger(): void {\n if (muteCount === 0) {\n savedLevel = rootLogger.level\n rootLogger.level = 'silent'\n }\n muteCount++\n}\n\nexport function unmuteLogger(): void {\n muteCount--\n if (muteCount <= 0) {\n muteCount = 0\n rootLogger.level = savedLevel\n }\n}\n\n// --- Public API ---\n\nexport function initLogger(config: LoggingConfig): Logger {\n if (initialized) return rootLogger\n\n const resolvedLogDir = expandHome(config.logDir)\n logDir = resolvedLogDir\n\n try {\n fs.mkdirSync(resolvedLogDir, { recursive: true })\n fs.mkdirSync(path.join(resolvedLogDir, 'sessions'), { recursive: true })\n } catch (err) {\n console.error(`[WARN] Failed to create log directory ${resolvedLogDir}, falling back to console-only:`, err)\n return rootLogger\n }\n\n const transports = pino.transport({\n targets: [\n {\n target: 'pino-pretty',\n options: {\n colorize: true,\n translateTime: 'HH:mm:ss',\n ignore: 'pid,hostname',\n singleLine: true,\n },\n level: config.level,\n },\n {\n target: 'pino-roll',\n options: {\n file: path.join(resolvedLogDir, 'openacp.log'),\n size: config.maxFileSize,\n limit: { count: config.maxFiles },\n },\n level: config.level,\n },\n ],\n })\n\n currentTransport = transports\n rootLogger = pino({ level: config.level }, transports)\n initialized = true\n\n // Update the default log wrapper to use the new root logger\n Object.assign(log, wrapVariadic(rootLogger))\n\n return rootLogger\n}\n\n/** Change log level at runtime. Pino transport targets respect parent level changes automatically. */\nexport function setLogLevel(level: string): void {\n rootLogger.level = level\n}\n\nexport function createChildLogger(context: { module: string; [key: string]: unknown }): Logger {\n // Return a proxy that always delegates to the current rootLogger.\n // This ensures child loggers created at module-level (before initLogger)\n // pick up the initialized logger with pino-pretty transport.\n return new Proxy({} as Logger, {\n get(_target, prop, receiver) {\n const child = rootLogger.child(context)\n const value = Reflect.get(child, prop, receiver)\n return typeof value === 'function' ? value.bind(child) : value\n },\n })\n}\n\nexport function createSessionLogger(sessionId: string, parentLogger: Logger): Logger {\n const sessionLogDir = logDir ? path.join(logDir, 'sessions') : undefined\n if (!sessionLogDir) {\n return parentLogger.child({ sessionId })\n }\n\n try {\n const sessionLogPath = path.join(sessionLogDir, `${sessionId}.log`)\n const dest = pino.destination(sessionLogPath)\n const sessionFileLogger = pino({ level: parentLogger.level }, dest).child({ sessionId })\n\n // Create a logger that writes to both parent (combined) and session file\n const combinedChild = parentLogger.child({ sessionId })\n const originalInfo = combinedChild.info.bind(combinedChild)\n const originalWarn = combinedChild.warn.bind(combinedChild)\n const originalError = combinedChild.error.bind(combinedChild)\n const originalDebug = combinedChild.debug.bind(combinedChild)\n const originalFatal = combinedChild.fatal.bind(combinedChild)\n\n // Proxy log methods to write to both destinations\n combinedChild.info = ((objOrMsg: any, ...rest: any[]) => {\n sessionFileLogger.info(objOrMsg, ...rest)\n return originalInfo(objOrMsg, ...rest)\n }) as any\n combinedChild.warn = ((objOrMsg: any, ...rest: any[]) => {\n sessionFileLogger.warn(objOrMsg, ...rest)\n return originalWarn(objOrMsg, ...rest)\n }) as any\n combinedChild.error = ((objOrMsg: any, ...rest: any[]) => {\n sessionFileLogger.error(objOrMsg, ...rest)\n return originalError(objOrMsg, ...rest)\n }) as any\n combinedChild.debug = ((objOrMsg: any, ...rest: any[]) => {\n sessionFileLogger.debug(objOrMsg, ...rest)\n return originalDebug(objOrMsg, ...rest)\n }) as any\n combinedChild.fatal = ((objOrMsg: any, ...rest: any[]) => {\n sessionFileLogger.fatal(objOrMsg, ...rest)\n return originalFatal(objOrMsg, ...rest)\n }) as any\n\n // Store dest for cleanup\n ;(combinedChild as any).__sessionDest = dest\n\n return combinedChild\n } catch (err) {\n // Graceful degradation: session file failed, just use combined log\n parentLogger.warn({ sessionId, err }, 'Failed to create session log file, using combined log only')\n return parentLogger.child({ sessionId })\n }\n}\n\nexport async function shutdownLogger(): Promise<void> {\n if (!initialized) return\n\n const transport = currentTransport\n\n // Reset state immediately so re-init is possible\n rootLogger = pino({ level: 'debug' })\n Object.assign(log, wrapVariadic(rootLogger))\n currentTransport = undefined\n logDir = undefined\n initialized = false\n\n if (transport) {\n await new Promise<void>((resolve) => {\n const timeout = setTimeout(resolve, 3000)\n transport.on('close', () => {\n clearTimeout(timeout)\n resolve()\n })\n transport.end()\n })\n }\n}\n\nexport async function cleanupOldSessionLogs(retentionDays: number): Promise<void> {\n if (!logDir) return\n\n const sessionsDir = path.join(logDir, 'sessions')\n try {\n const files = await fs.promises.readdir(sessionsDir)\n const cutoff = Date.now() - retentionDays * 24 * 60 * 60 * 1000\n\n for (const file of files) {\n try {\n const filePath = path.join(sessionsDir, file)\n const stat = await fs.promises.stat(filePath)\n if (stat.mtimeMs < cutoff) {\n await fs.promises.unlink(filePath)\n rootLogger.debug({ file }, 'Deleted old session log')\n }\n } catch (err) {\n rootLogger.warn({ file, err }, 'Failed to delete old session log')\n }\n }\n } catch {\n // Sessions directory doesn't exist — no-op\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  log
3
- } from "./chunk-ESOPMQAY.js";
3
+ } from "./chunk-GAK6PIBW.js";
4
4
 
5
5
  // src/adapters/discord/commands/agents.ts
6
6
  import {
@@ -200,4 +200,4 @@ export {
200
200
  handleInstall,
201
201
  handleAgentButton
202
202
  };
203
- //# sourceMappingURL=chunk-3KGRVAEV.js.map
203
+ //# sourceMappingURL=chunk-J4SJTKIK.js.map
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  buildSessionControlKeyboard
3
- } from "./chunk-NXEQXRQR.js";
3
+ } from "./chunk-774Y4RAK.js";
4
4
  import {
5
5
  createSessionThread,
6
6
  deleteSessionThread
7
- } from "./chunk-SM3G6UAX.js";
7
+ } from "./chunk-BNLGTZ34.js";
8
8
  import {
9
9
  log
10
- } from "./chunk-ESOPMQAY.js";
10
+ } from "./chunk-GAK6PIBW.js";
11
11
 
12
12
  // src/adapters/discord/commands/new-session.ts
13
13
  import {
@@ -142,4 +142,4 @@ export {
142
142
  executeNewSession,
143
143
  handleNewSessionButton
144
144
  };
145
- //# sourceMappingURL=chunk-FZ5BIWG5.js.map
145
+ //# sourceMappingURL=chunk-JV6XQRAE.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createChildLogger
3
- } from "./chunk-ESOPMQAY.js";
3
+ } from "./chunk-GAK6PIBW.js";
4
4
 
5
5
  // src/core/config.ts
6
6
  import { z } from "zod";
@@ -412,4 +412,4 @@ export {
412
412
  expandHome,
413
413
  ConfigManager
414
414
  };
415
- //# sourceMappingURL=chunk-EWYNCHUH.js.map
415
+ //# sourceMappingURL=chunk-L5KZXYJD.js.map
@@ -3,11 +3,18 @@ import {
3
3
  } from "./chunk-JKBFUAJK.js";
4
4
  import {
5
5
  expandHome
6
- } from "./chunk-EWYNCHUH.js";
6
+ } from "./chunk-L5KZXYJD.js";
7
7
 
8
8
  // src/core/setup.ts
9
9
  import { execFileSync } from "child_process";
10
- import { input, select } from "@inquirer/prompts";
10
+ import * as clack from "@clack/prompts";
11
+ function guardCancel(value) {
12
+ if (clack.isCancel(value)) {
13
+ clack.cancel("Setup cancelled.");
14
+ process.exit(0);
15
+ }
16
+ return value;
17
+ }
11
18
  var c = {
12
19
  reset: "\x1B[0m",
13
20
  bold: "\x1B[1m",
@@ -101,15 +108,18 @@ async function validateBotAdmin(token, chatId) {
101
108
  return { ok: false, error: err.message };
102
109
  }
103
110
  }
104
- function promptManualChatId() {
105
- return input({
106
- message: "Supergroup chat ID (e.g. -1001234567890):",
107
- validate: (val) => {
108
- const n = Number(val.trim());
109
- if (isNaN(n) || !Number.isInteger(n)) return "Chat ID must be an integer";
110
- return true;
111
- }
112
- }).then((val) => Number(val.trim()));
111
+ async function promptManualChatId() {
112
+ const val = guardCancel(
113
+ await clack.text({
114
+ message: "Supergroup chat ID (e.g. -1001234567890):",
115
+ validate: (val2) => {
116
+ const n = Number((val2 ?? "").toString().trim());
117
+ if (isNaN(n) || !Number.isInteger(n)) return "Chat ID must be an integer";
118
+ return void 0;
119
+ }
120
+ })
121
+ );
122
+ return Number(val.trim());
113
123
  }
114
124
  async function detectChatId(token) {
115
125
  let lastUpdateId = 0;
@@ -191,14 +201,16 @@ async function detectChatId(token) {
191
201
  }
192
202
  if (groups.size > 1) {
193
203
  cleanup();
194
- const choices = [...groups.entries()].map(([id, title]) => ({
195
- name: `${title} (${id})`,
204
+ const options = [...groups.entries()].map(([id, title]) => ({
205
+ label: `${title} (${id})`,
196
206
  value: id
197
207
  }));
198
- return select({
199
- message: "Multiple groups found. Pick one:",
200
- choices
201
- });
208
+ return guardCancel(
209
+ await clack.select({
210
+ message: "Multiple groups found. Pick one:",
211
+ options
212
+ })
213
+ );
202
214
  }
203
215
  } catch {
204
216
  }
@@ -245,24 +257,31 @@ async function setupTelegram(stepNum = 1, totalSteps = 3) {
245
257
  console.log(step(stepNum, totalSteps, "Telegram Bot"));
246
258
  let botToken = "";
247
259
  while (true) {
248
- botToken = await input({
249
- message: "Bot token (from @BotFather):",
250
- validate: (val) => val.trim().length > 0 || "Token cannot be empty"
251
- });
260
+ botToken = guardCancel(
261
+ await clack.text({
262
+ message: "Bot token (from @BotFather):",
263
+ validate: (val) => (val ?? "").toString().trim().length > 0 ? void 0 : "Token cannot be empty"
264
+ })
265
+ );
252
266
  botToken = botToken.trim();
267
+ const s = clack.spinner();
268
+ s.start("Validating token...");
253
269
  const result = await validateBotToken(botToken);
270
+ s.stop("Token validated");
254
271
  if (result.ok) {
255
272
  console.log(ok(`Connected to @${result.botUsername}`));
256
273
  break;
257
274
  }
258
275
  console.log(fail(result.error));
259
- const action = await select({
260
- message: "What to do?",
261
- choices: [
262
- { name: "Re-enter token", value: "retry" },
263
- { name: "Use as-is (skip validation)", value: "skip" }
264
- ]
265
- });
276
+ const action = guardCancel(
277
+ await clack.select({
278
+ message: "What to do?",
279
+ options: [
280
+ { label: "Re-enter token", value: "retry" },
281
+ { label: "Use as-is (skip validation)", value: "skip" }
282
+ ]
283
+ })
284
+ );
266
285
  if (action === "skip") break;
267
286
  }
268
287
  let chatId;
@@ -277,7 +296,7 @@ async function setupTelegram(stepNum = 1, totalSteps = 3) {
277
296
  console.log(dim(" 2. The group must be a Supergroup (Group Settings \u2192 convert)"));
278
297
  console.log(dim(" 3. Send a message in the group after adding the bot"));
279
298
  console.log("");
280
- await input({ message: "Press Enter to try again..." });
299
+ guardCancel(await clack.text({ message: "Press Enter to try again..." }));
281
300
  continue;
282
301
  }
283
302
  console.log(
@@ -294,7 +313,7 @@ async function setupTelegram(stepNum = 1, totalSteps = 3) {
294
313
  console.log(dim(" 2. Go to Group Settings \u2192 Administrators"));
295
314
  console.log(dim(" 3. Add the bot as an administrator"));
296
315
  console.log("");
297
- await input({ message: "Press Enter to check again..." });
316
+ guardCancel(await clack.text({ message: "Press Enter to check again..." }));
298
317
  continue;
299
318
  }
300
319
  console.log(ok("Bot has admin privileges"));
@@ -339,35 +358,44 @@ async function setupDiscord() {
339
358
  console.log("");
340
359
  let botToken = "";
341
360
  while (true) {
342
- botToken = await input({
343
- message: "Bot token (from Discord Developer Portal):",
344
- validate: (val) => val.trim().length > 0 || "Token cannot be empty"
345
- });
361
+ botToken = guardCancel(
362
+ await clack.text({
363
+ message: "Bot token (from Discord Developer Portal):",
364
+ validate: (val) => (val ?? "").toString().trim().length > 0 ? void 0 : "Token cannot be empty"
365
+ })
366
+ );
346
367
  botToken = botToken.trim();
368
+ const s = clack.spinner();
369
+ s.start("Validating token...");
347
370
  const result = await validateDiscordToken(botToken);
371
+ s.stop("Token validated");
348
372
  if (result.ok) {
349
373
  console.log(ok(`Connected as @${result.username} (id: ${result.id})`));
350
374
  break;
351
375
  }
352
376
  console.log(fail(result.error));
353
- const action = await select({
354
- message: "What to do?",
355
- choices: [
356
- { name: "Re-enter token", value: "retry" },
357
- { name: "Use as-is (skip validation)", value: "skip" }
358
- ]
359
- });
377
+ const action = guardCancel(
378
+ await clack.select({
379
+ message: "What to do?",
380
+ options: [
381
+ { label: "Re-enter token", value: "retry" },
382
+ { label: "Use as-is (skip validation)", value: "skip" }
383
+ ]
384
+ })
385
+ );
360
386
  if (action === "skip") break;
361
387
  }
362
- const guildId = await input({
363
- message: "Guild (server) ID:",
364
- validate: (val) => {
365
- const trimmed = val.trim();
366
- if (!trimmed) return "Guild ID cannot be empty";
367
- if (!/^\d{17,20}$/.test(trimmed)) return "Guild ID must be a numeric Discord snowflake (17-20 digits)";
368
- return true;
369
- }
370
- });
388
+ const guildId = guardCancel(
389
+ await clack.text({
390
+ message: "Guild (server) ID:",
391
+ validate: (val) => {
392
+ const trimmed = (val ?? "").toString().trim();
393
+ if (!trimmed) return "Guild ID cannot be empty";
394
+ if (!/^\d{17,20}$/.test(trimmed)) return "Guild ID must be a numeric Discord snowflake (17-20 digits)";
395
+ return void 0;
396
+ }
397
+ })
398
+ );
371
399
  return {
372
400
  enabled: true,
373
401
  botToken,
@@ -378,18 +406,20 @@ async function setupDiscord() {
378
406
  };
379
407
  }
380
408
  async function setupAgents() {
381
- const { AgentCatalog } = await import("./agent-catalog-IVU2KANH.js");
382
- const { select: select2, checkbox } = await import("@inquirer/prompts");
409
+ const { AgentCatalog } = await import("./agent-catalog-SBZQRYOD.js");
410
+ const { muteLogger, unmuteLogger } = await import("./log-RCVBXLTN.js");
411
+ muteLogger();
383
412
  const catalog = new AgentCatalog();
384
413
  catalog.load();
385
- console.log(dim(" Checking available agents..."));
414
+ const s = clack.spinner();
415
+ s.start("Checking available agents...");
386
416
  await catalog.refreshRegistryIfStale();
387
417
  if (!catalog.getInstalledAgent("claude")) {
388
418
  const claudeRegistry = catalog.findRegistryAgent("claude-acp");
389
419
  if (claudeRegistry) {
390
420
  await catalog.install("claude-acp");
391
421
  } else {
392
- const { AgentStore } = await import("./agent-store-ZBXGOFPH.js");
422
+ const { AgentStore } = await import("./agent-store-CGE4G6PA.js");
393
423
  const store = new AgentStore();
394
424
  store.load();
395
425
  store.addAgent("claude", {
@@ -405,37 +435,53 @@ async function setupAgents() {
405
435
  });
406
436
  }
407
437
  }
408
- console.log(ok("Claude Agent ready"));
438
+ s.stop(ok("Claude Agent ready"));
439
+ unmuteLogger();
409
440
  const available = catalog.getAvailable();
410
441
  const installed = available.filter((a) => a.installed);
411
442
  const installable = available.filter((a) => !a.installed && a.available);
412
443
  if (installed.length > 0 || installable.length > 0) {
413
- const choices = [
414
- ...installed.map((a) => ({
415
- name: `${a.name} (installed)`,
416
- value: a.key,
417
- checked: true,
418
- disabled: "(already installed)"
419
- })),
420
- ...installable.slice(0, 10).map((a) => ({
421
- name: `${a.name} (${a.distribution})`,
422
- value: a.key,
423
- checked: false
424
- }))
425
- ];
426
- const selected = await checkbox({
427
- message: "Install additional agents? (Space to select, Enter to continue)",
428
- choices
429
- });
444
+ const seen = /* @__PURE__ */ new Set();
445
+ const options = [];
446
+ for (const a of installed) {
447
+ const dedupeKey = `${a.key}::${a.name}`;
448
+ if (seen.has(dedupeKey)) continue;
449
+ seen.add(dedupeKey);
450
+ options.push({
451
+ label: `${a.name} (installed)`,
452
+ value: a.key
453
+ });
454
+ }
455
+ for (const a of installable) {
456
+ const dedupeKey = `${a.key}::${a.name}`;
457
+ if (seen.has(dedupeKey)) continue;
458
+ seen.add(dedupeKey);
459
+ options.push({
460
+ label: `${a.name} (${a.distribution})`,
461
+ value: a.key
462
+ });
463
+ }
464
+ const installedKeys = installed.map((a) => a.key);
465
+ const selected = guardCancel(
466
+ await clack.autocompleteMultiselect({
467
+ message: "Install additional agents? (type to search, Space to select)",
468
+ options,
469
+ initialValues: installedKeys,
470
+ required: false
471
+ })
472
+ );
430
473
  for (const key of selected) {
431
474
  const regAgent = catalog.findRegistryAgent(key);
432
475
  if (regAgent) {
433
- process.stdout.write(` Installing ${regAgent.name}... `);
476
+ const installSpinner = clack.spinner();
477
+ installSpinner.start(`Installing ${regAgent.name}...`);
478
+ muteLogger();
434
479
  const result = await catalog.install(key);
480
+ unmuteLogger();
435
481
  if (result.ok) {
436
- console.log(ok("done"));
482
+ installSpinner.stop(ok("done"));
437
483
  } else {
438
- console.log(warn(`skipped: ${result.error}`));
484
+ installSpinner.stop(warn(`skipped: ${result.error}`));
439
485
  }
440
486
  }
441
487
  }
@@ -443,25 +489,29 @@ async function setupAgents() {
443
489
  const installedAgents = Object.keys(catalog.getInstalledEntries());
444
490
  let defaultAgent = "claude";
445
491
  if (installedAgents.length > 1) {
446
- defaultAgent = await select2({
447
- message: "Which agent should be the default?",
448
- choices: installedAgents.map((key) => {
449
- const agent = catalog.getInstalledAgent(key);
450
- return { name: `${agent.name} (${key})`, value: key };
451
- }),
452
- default: "claude"
453
- });
492
+ defaultAgent = guardCancel(
493
+ await clack.select({
494
+ message: "Which agent should be the default?",
495
+ options: installedAgents.map((key) => {
496
+ const agent = catalog.getInstalledAgent(key);
497
+ return { label: `${agent.name} (${key})`, value: key };
498
+ }),
499
+ initialValue: "claude"
500
+ })
501
+ );
454
502
  }
455
503
  console.log(ok(`Default agent: ${c.bold}${defaultAgent}${c.reset}`));
456
504
  return { defaultAgent };
457
505
  }
458
506
  async function setupWorkspace(stepNum = 2, totalSteps = 3) {
459
507
  console.log(step(stepNum, totalSteps, "Workspace"));
460
- const baseDir = await input({
461
- message: "Base directory for workspaces:",
462
- default: "~/openacp-workspace",
463
- validate: (val) => val.trim().length > 0 || "Path cannot be empty"
464
- });
508
+ const baseDir = guardCancel(
509
+ await clack.text({
510
+ message: "Base directory for workspaces:",
511
+ initialValue: "~/openacp-workspace",
512
+ validate: (val) => (val ?? "").toString().trim().length > 0 ? void 0 : "Path cannot be empty"
513
+ })
514
+ );
465
515
  return { baseDir: baseDir.trim().replace(/^['"]|['"]$/g, "") };
466
516
  }
467
517
  async function setupRunMode(stepNum = 3, totalSteps = 3) {
@@ -470,23 +520,25 @@ async function setupRunMode(stepNum = 3, totalSteps = 3) {
470
520
  console.log(dim(" (Daemon mode not available on Windows)"));
471
521
  return { runMode: "foreground", autoStart: false };
472
522
  }
473
- const mode = await select({
474
- message: "How would you like to run OpenACP?",
475
- choices: [
476
- {
477
- name: "Background (daemon)",
478
- value: "daemon",
479
- description: "Runs silently, auto-starts on boot. Manage with: openacp status | stop | logs"
480
- },
481
- {
482
- name: "Foreground (terminal)",
483
- value: "foreground",
484
- description: "Runs in current terminal session. Start with: openacp"
485
- }
486
- ]
487
- });
523
+ const mode = guardCancel(
524
+ await clack.select({
525
+ message: "How would you like to run OpenACP?",
526
+ options: [
527
+ {
528
+ label: "Background (daemon)",
529
+ value: "daemon",
530
+ hint: "Runs silently, auto-starts on boot. Manage with: openacp status | stop | logs"
531
+ },
532
+ {
533
+ label: "Foreground (terminal)",
534
+ value: "foreground",
535
+ hint: "Runs in current terminal session. Start with: openacp"
536
+ }
537
+ ]
538
+ })
539
+ );
488
540
  if (mode === "daemon") {
489
- const { installAutoStart, isAutoStartSupported } = await import("./autostart-A7JRU4WJ.js");
541
+ const { installAutoStart, isAutoStartSupported } = await import("./autostart-6M3FZAKW.js");
490
542
  const autoStart = isAutoStartSupported();
491
543
  if (autoStart) {
492
544
  const result = installAutoStart(expandHome("~/.openacp/logs"));
@@ -500,9 +552,9 @@ async function setupRunMode(stepNum = 3, totalSteps = 3) {
500
552
  }
501
553
  return { runMode: "foreground", autoStart: false };
502
554
  }
503
- function applyGradient(text) {
555
+ function applyGradient(text2) {
504
556
  const colors = [135, 99, 63, 33, 39, 44, 44];
505
- const lines = text.split("\n");
557
+ const lines = text2.split("\n");
506
558
  return lines.map((line, i) => {
507
559
  const colorIdx = Math.min(i, colors.length - 1);
508
560
  return `\x1B[38;5;${colors[colorIdx]}m${line}\x1B[0m`;
@@ -519,7 +571,7 @@ var BANNER = `
519
571
  async function printStartBanner() {
520
572
  let version = "0.0.0";
521
573
  try {
522
- const { getCurrentVersion } = await import("./version-ALWGGVKM.js");
574
+ const { getCurrentVersion } = await import("./version-AXXV6IV2.js");
523
575
  version = getCurrentVersion();
524
576
  } catch {
525
577
  }
@@ -530,22 +582,25 @@ async function printStartBanner() {
530
582
  async function printWelcomeBanner() {
531
583
  await printStartBanner();
532
584
  }
533
- async function runSetup(configManager) {
585
+ async function runSetup(configManager, opts) {
534
586
  await printWelcomeBanner();
587
+ clack.intro("Let's set up OpenACP");
535
588
  try {
536
- const { select: selectChannel } = await import("@inquirer/prompts");
537
- const channelChoice = await selectChannel({
538
- message: "Which messaging platform do you want to use?",
539
- choices: [
540
- { name: "Telegram", value: "telegram" },
541
- { name: "Discord", value: "discord" },
542
- { name: "Both", value: "both" }
543
- ]
544
- });
589
+ const channelChoice = guardCancel(
590
+ await clack.select({
591
+ message: "Which messaging platform do you want to use?",
592
+ options: [
593
+ { label: "Telegram", value: "telegram" },
594
+ { label: "Discord", value: "discord" },
595
+ { label: "Both", value: "both" }
596
+ ]
597
+ })
598
+ );
545
599
  let telegram;
546
600
  let discord;
547
601
  const channelSteps = channelChoice === "both" ? 2 : 1;
548
- const totalSteps = channelSteps + 2;
602
+ const runModeSteps = opts?.skipRunMode ? 0 : 1;
603
+ const totalSteps = channelSteps + 1 + runModeSteps;
549
604
  let currentStep = 0;
550
605
  if (channelChoice === "telegram" || channelChoice === "both") {
551
606
  currentStep++;
@@ -557,11 +612,12 @@ async function runSetup(configManager) {
557
612
  }
558
613
  const { defaultAgent } = await setupAgents();
559
614
  {
560
- const { confirm } = await import("@inquirer/prompts");
561
- const installClaude = await confirm({
562
- message: "Install session transfer for Claude? (enables /openacp:handoff in your terminal)",
563
- default: true
564
- });
615
+ const installClaude = guardCancel(
616
+ await clack.confirm({
617
+ message: "Install session transfer for Claude? (enables /openacp:handoff in your terminal)",
618
+ initialValue: true
619
+ })
620
+ );
565
621
  if (installClaude) {
566
622
  try {
567
623
  const { getIntegration } = await import("./integrate-O4OCR4SN.js");
@@ -581,8 +637,14 @@ async function runSetup(configManager) {
581
637
  }
582
638
  currentStep++;
583
639
  const workspace = await setupWorkspace(currentStep, totalSteps);
584
- currentStep++;
585
- const { runMode, autoStart } = await setupRunMode(currentStep, totalSteps);
640
+ let runMode = "foreground";
641
+ let autoStart = false;
642
+ if (!opts?.skipRunMode) {
643
+ currentStep++;
644
+ const result = await setupRunMode(currentStep, totalSteps);
645
+ runMode = result.runMode;
646
+ autoStart = result.autoStart;
647
+ }
586
648
  const security = {
587
649
  allowedUserIds: [],
588
650
  maxConcurrentSessions: 20,
@@ -640,16 +702,15 @@ async function runSetup(configManager) {
640
702
  );
641
703
  return false;
642
704
  }
643
- console.log("");
644
- console.log(
645
- ok(`Config saved to ${c.bold}${configManager.getConfigPath()}`)
646
- );
647
- console.log(ok("Starting OpenACP..."));
648
- console.log("");
705
+ clack.outro(`Config saved to ${configManager.getConfigPath()}`);
706
+ if (!opts?.skipRunMode) {
707
+ console.log(ok("Starting OpenACP..."));
708
+ console.log("");
709
+ }
649
710
  return true;
650
711
  } catch (err) {
651
712
  if (err.name === "ExitPromptError") {
652
- console.log(dim("\nSetup cancelled."));
713
+ clack.cancel("Setup cancelled.");
653
714
  return false;
654
715
  }
655
716
  throw err;
@@ -671,4 +732,4 @@ export {
671
732
  printStartBanner,
672
733
  runSetup
673
734
  };
674
- //# sourceMappingURL=chunk-G3OHCXZG.js.map
735
+ //# sourceMappingURL=chunk-N6E3HE42.js.map