@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.
- package/dist/{admin-3ZHEO5VP.js → admin-SCP25TN2.js} +3 -3
- package/dist/agent-catalog-SBZQRYOD.js +10 -0
- package/dist/agent-store-CGE4G6PA.js +8 -0
- package/dist/{agents-SXIY4IEF.js → agents-QJPHNWK2.js} +3 -3
- package/dist/{autostart-A7JRU4WJ.js → autostart-6M3FZAKW.js} +3 -3
- package/dist/{chunk-PMGNLNSH.js → chunk-2CJ46J3C.js} +2 -2
- package/dist/{chunk-5HGXUCMX.js → chunk-34M4OS5P.js} +2 -2
- package/dist/{chunk-TMCQZAXN.js → chunk-3CHBVO4T.js} +3 -3
- package/dist/{chunk-TTDSLV35.js → chunk-4CTX774K.js} +3 -3
- package/dist/{chunk-NXEQXRQR.js → chunk-774Y4RAK.js} +2 -2
- package/dist/{chunk-SM3G6UAX.js → chunk-BNLGTZ34.js} +2 -2
- package/dist/{chunk-AVCHZESZ.js → chunk-DJIXG62C.js} +49 -20
- package/dist/chunk-DJIXG62C.js.map +1 -0
- package/dist/{chunk-KO5RL7MZ.js → chunk-DOCFD5JR.js} +2 -2
- package/dist/{chunk-HP2IJYCA.js → chunk-E56PPPAE.js} +9 -9
- package/dist/chunk-E56PPPAE.js.map +1 -0
- package/dist/{chunk-ESOPMQAY.js → chunk-GAK6PIBW.js} +25 -2
- package/dist/chunk-GAK6PIBW.js.map +1 -0
- package/dist/{chunk-3KGRVAEV.js → chunk-J4SJTKIK.js} +2 -2
- package/dist/{chunk-FZ5BIWG5.js → chunk-JV6XQRAE.js} +4 -4
- package/dist/{chunk-EWYNCHUH.js → chunk-L5KZXYJD.js} +2 -2
- package/dist/{chunk-G3OHCXZG.js → chunk-N6E3HE42.js} +194 -133
- package/dist/chunk-N6E3HE42.js.map +1 -0
- package/dist/{chunk-EVFJW45N.js → chunk-S64CB6J3.js} +13 -13
- package/dist/{chunk-EVFJW45N.js.map → chunk-S64CB6J3.js.map} +1 -1
- package/dist/{chunk-6LSFRNHE.js → chunk-TNFXJQZP.js} +3 -3
- package/dist/{chunk-OHR6SBMC.js → chunk-TOQPQB5Q.js} +3 -3
- package/dist/{chunk-CKOK7JW6.js → chunk-UKT3G5IA.js} +3 -3
- package/dist/{chunk-PWFPTG5X.js → chunk-V5GZQEIY.js} +2 -2
- package/dist/{chunk-IER5UCY7.js → chunk-YQRF3IOR.js} +2 -2
- package/dist/cli.js +54 -44
- package/dist/cli.js.map +1 -1
- package/dist/{config-4YSJ4NCI.js → config-XDUOULXX.js} +3 -3
- package/dist/config-editor-3GGBY7NL.js +12 -0
- package/dist/{daemon-I6XMRQ6P.js → daemon-QY7WXHQ3.js} +4 -4
- package/dist/{discord-VHCBN3JJ.js → discord-4DE22BQC.js} +19 -19
- package/dist/doctor-D3YZ6VHJ.js +14 -0
- package/dist/doctor-SNSQ5SS2.js +9 -0
- package/dist/index.js +11 -11
- package/dist/{install-cloudflared-G2GUKCHA.js → install-cloudflared-FSILDS5J.js} +3 -3
- package/dist/{install-jq-7QTU7XYY.js → install-jq-P6RUBKPV.js} +3 -3
- package/dist/{log-SPS2S6FO.js → log-RCVBXLTN.js} +8 -4
- package/dist/{main-P4X6SAPZ.js → main-GVTLD7VI.js} +46 -26
- package/dist/main-GVTLD7VI.js.map +1 -0
- package/dist/{new-session-PUNUHGYP.js → new-session-K6UCWYOP.js} +5 -5
- package/dist/{post-upgrade-6N4JCV5S.js → post-upgrade-62LUHDJO.js} +5 -5
- package/dist/{session-ZMAM67AA.js → session-O6ZPLJIZ.js} +4 -4
- package/dist/{settings-OEQEZS5Y.js → settings-RRF77IC4.js} +3 -3
- package/dist/{setup-7YBFKRG7.js → setup-D6BU36ZL.js} +4 -4
- package/dist/{tunnel-service-BMIBHUBK.js → tunnel-service-NJJH4I26.js} +3 -3
- package/dist/{version-ALWGGVKM.js → version-AXXV6IV2.js} +2 -2
- package/package.json +3 -2
- package/dist/agent-catalog-IVU2KANH.js +0 -10
- package/dist/agent-store-ZBXGOFPH.js +0 -8
- package/dist/chunk-AVCHZESZ.js.map +0 -1
- package/dist/chunk-ESOPMQAY.js.map +0 -1
- package/dist/chunk-G3OHCXZG.js.map +0 -1
- package/dist/chunk-HP2IJYCA.js.map +0 -1
- package/dist/config-editor-F25HEMGL.js +0 -12
- package/dist/doctor-GPW5ECK6.js +0 -14
- package/dist/doctor-Y3SCSVPI.js +0 -9
- package/dist/main-P4X6SAPZ.js.map +0 -1
- /package/dist/{admin-3ZHEO5VP.js.map → admin-SCP25TN2.js.map} +0 -0
- /package/dist/{agent-catalog-IVU2KANH.js.map → agent-catalog-SBZQRYOD.js.map} +0 -0
- /package/dist/{agent-store-ZBXGOFPH.js.map → agent-store-CGE4G6PA.js.map} +0 -0
- /package/dist/{agents-SXIY4IEF.js.map → agents-QJPHNWK2.js.map} +0 -0
- /package/dist/{autostart-A7JRU4WJ.js.map → autostart-6M3FZAKW.js.map} +0 -0
- /package/dist/{chunk-PMGNLNSH.js.map → chunk-2CJ46J3C.js.map} +0 -0
- /package/dist/{chunk-5HGXUCMX.js.map → chunk-34M4OS5P.js.map} +0 -0
- /package/dist/{chunk-TMCQZAXN.js.map → chunk-3CHBVO4T.js.map} +0 -0
- /package/dist/{chunk-TTDSLV35.js.map → chunk-4CTX774K.js.map} +0 -0
- /package/dist/{chunk-NXEQXRQR.js.map → chunk-774Y4RAK.js.map} +0 -0
- /package/dist/{chunk-SM3G6UAX.js.map → chunk-BNLGTZ34.js.map} +0 -0
- /package/dist/{chunk-KO5RL7MZ.js.map → chunk-DOCFD5JR.js.map} +0 -0
- /package/dist/{chunk-3KGRVAEV.js.map → chunk-J4SJTKIK.js.map} +0 -0
- /package/dist/{chunk-FZ5BIWG5.js.map → chunk-JV6XQRAE.js.map} +0 -0
- /package/dist/{chunk-EWYNCHUH.js.map → chunk-L5KZXYJD.js.map} +0 -0
- /package/dist/{chunk-6LSFRNHE.js.map → chunk-TNFXJQZP.js.map} +0 -0
- /package/dist/{chunk-OHR6SBMC.js.map → chunk-TOQPQB5Q.js.map} +0 -0
- /package/dist/{chunk-CKOK7JW6.js.map → chunk-UKT3G5IA.js.map} +0 -0
- /package/dist/{chunk-PWFPTG5X.js.map → chunk-V5GZQEIY.js.map} +0 -0
- /package/dist/{chunk-IER5UCY7.js.map → chunk-YQRF3IOR.js.map} +0 -0
- /package/dist/{config-4YSJ4NCI.js.map → config-XDUOULXX.js.map} +0 -0
- /package/dist/{config-editor-F25HEMGL.js.map → config-editor-3GGBY7NL.js.map} +0 -0
- /package/dist/{daemon-I6XMRQ6P.js.map → daemon-QY7WXHQ3.js.map} +0 -0
- /package/dist/{discord-VHCBN3JJ.js.map → discord-4DE22BQC.js.map} +0 -0
- /package/dist/{doctor-GPW5ECK6.js.map → doctor-D3YZ6VHJ.js.map} +0 -0
- /package/dist/{doctor-Y3SCSVPI.js.map → doctor-SNSQ5SS2.js.map} +0 -0
- /package/dist/{install-cloudflared-G2GUKCHA.js.map → install-cloudflared-FSILDS5J.js.map} +0 -0
- /package/dist/{install-jq-7QTU7XYY.js.map → install-jq-P6RUBKPV.js.map} +0 -0
- /package/dist/{log-SPS2S6FO.js.map → log-RCVBXLTN.js.map} +0 -0
- /package/dist/{new-session-PUNUHGYP.js.map → new-session-K6UCWYOP.js.map} +0 -0
- /package/dist/{post-upgrade-6N4JCV5S.js.map → post-upgrade-62LUHDJO.js.map} +0 -0
- /package/dist/{session-ZMAM67AA.js.map → session-O6ZPLJIZ.js.map} +0 -0
- /package/dist/{settings-OEQEZS5Y.js.map → settings-RRF77IC4.js.map} +0 -0
- /package/dist/{setup-7YBFKRG7.js.map → setup-D6BU36ZL.js.map} +0 -0
- /package/dist/{tunnel-service-BMIBHUBK.js.map → tunnel-service-NJJH4I26.js.map} +0 -0
- /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: {
|
|
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-
|
|
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-
|
|
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-
|
|
203
|
+
//# sourceMappingURL=chunk-J4SJTKIK.js.map
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
buildSessionControlKeyboard
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-774Y4RAK.js";
|
|
4
4
|
import {
|
|
5
5
|
createSessionThread,
|
|
6
6
|
deleteSessionThread
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-BNLGTZ34.js";
|
|
8
8
|
import {
|
|
9
9
|
log
|
|
10
|
-
} from "./chunk-
|
|
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-
|
|
145
|
+
//# sourceMappingURL=chunk-JV6XQRAE.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createChildLogger
|
|
3
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
6
|
+
} from "./chunk-L5KZXYJD.js";
|
|
7
7
|
|
|
8
8
|
// src/core/setup.ts
|
|
9
9
|
import { execFileSync } from "child_process";
|
|
10
|
-
import
|
|
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
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
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
|
|
195
|
-
|
|
204
|
+
const options = [...groups.entries()].map(([id, title]) => ({
|
|
205
|
+
label: `${title} (${id})`,
|
|
196
206
|
value: id
|
|
197
207
|
}));
|
|
198
|
-
return
|
|
199
|
-
|
|
200
|
-
|
|
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 =
|
|
249
|
-
|
|
250
|
-
|
|
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 =
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
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
|
|
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
|
|
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 =
|
|
343
|
-
|
|
344
|
-
|
|
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 =
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
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 =
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
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-
|
|
382
|
-
const {
|
|
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
|
-
|
|
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-
|
|
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
|
-
|
|
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
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
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
|
-
|
|
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
|
-
|
|
482
|
+
installSpinner.stop(ok("done"));
|
|
437
483
|
} else {
|
|
438
|
-
|
|
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 =
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
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 =
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
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 =
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
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-
|
|
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(
|
|
555
|
+
function applyGradient(text2) {
|
|
504
556
|
const colors = [135, 99, 63, 33, 39, 44, 44];
|
|
505
|
-
const lines =
|
|
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-
|
|
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
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
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
|
|
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
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
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
|
-
|
|
585
|
-
|
|
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
|
-
|
|
644
|
-
|
|
645
|
-
ok(
|
|
646
|
-
|
|
647
|
-
|
|
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
|
-
|
|
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-
|
|
735
|
+
//# sourceMappingURL=chunk-N6E3HE42.js.map
|