@openacp/cli 0.6.10 → 2026.41.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +34 -16
- package/dist/cli.d.ts +11 -0
- package/dist/cli.js +27787 -467
- package/dist/cli.js.map +1 -1
- package/dist/data/registry-snapshot.json +1 -1
- package/dist/index.d.ts +1944 -463
- package/dist/index.js +17365 -102
- package/dist/index.js.map +1 -1
- package/package.json +13 -7
- package/dist/action-detect-P7ZE4NEM.js +0 -16
- package/dist/action-detect-P7ZE4NEM.js.map +0 -1
- package/dist/adapter-ZOANORGM.js +0 -799
- package/dist/adapter-ZOANORGM.js.map +0 -1
- package/dist/admin-6SYB6XCZ.js +0 -23
- package/dist/admin-6SYB6XCZ.js.map +0 -1
- package/dist/agent-catalog-FC3HGDEQ.js +0 -11
- package/dist/agent-catalog-FC3HGDEQ.js.map +0 -1
- package/dist/agent-dependencies-4OWBMZWZ.js +0 -24
- package/dist/agent-dependencies-4OWBMZWZ.js.map +0 -1
- package/dist/agent-registry-WT4NXPYG.js +0 -9
- package/dist/agent-registry-WT4NXPYG.js.map +0 -1
- package/dist/agent-store-VZLFPTZU.js +0 -9
- package/dist/agent-store-VZLFPTZU.js.map +0 -1
- package/dist/agents-QO7DKARJ.js +0 -15
- package/dist/agents-QO7DKARJ.js.map +0 -1
- package/dist/api-client-CFQT5U7D.js +0 -14
- package/dist/api-client-CFQT5U7D.js.map +0 -1
- package/dist/autostart-X33OGMX6.js +0 -23
- package/dist/autostart-X33OGMX6.js.map +0 -1
- package/dist/chunk-2CJ46J3C.js +0 -154
- package/dist/chunk-2CJ46J3C.js.map +0 -1
- package/dist/chunk-2HMQOC7N.js +0 -134
- package/dist/chunk-2HMQOC7N.js.map +0 -1
- package/dist/chunk-33RP6K2O.js +0 -435
- package/dist/chunk-33RP6K2O.js.map +0 -1
- package/dist/chunk-34M4OS5P.js +0 -83
- package/dist/chunk-34M4OS5P.js.map +0 -1
- package/dist/chunk-4CTX774K.js +0 -265
- package/dist/chunk-4CTX774K.js.map +0 -1
- package/dist/chunk-7QJS2XBD.js +0 -92
- package/dist/chunk-7QJS2XBD.js.map +0 -1
- package/dist/chunk-BNLGTZ34.js +0 -122
- package/dist/chunk-BNLGTZ34.js.map +0 -1
- package/dist/chunk-CS3KCJ5D.js +0 -4788
- package/dist/chunk-CS3KCJ5D.js.map +0 -1
- package/dist/chunk-GAK6PIBW.js +0 -224
- package/dist/chunk-GAK6PIBW.js.map +0 -1
- package/dist/chunk-I7WC6E5S.js +0 -71
- package/dist/chunk-I7WC6E5S.js.map +0 -1
- package/dist/chunk-J4SJTKIK.js +0 -203
- package/dist/chunk-J4SJTKIK.js.map +0 -1
- package/dist/chunk-JHYXKVV2.js +0 -183
- package/dist/chunk-JHYXKVV2.js.map +0 -1
- package/dist/chunk-JKBFUAJK.js +0 -282
- package/dist/chunk-JKBFUAJK.js.map +0 -1
- package/dist/chunk-KIRH7TUJ.js +0 -219
- package/dist/chunk-KIRH7TUJ.js.map +0 -1
- package/dist/chunk-LBIKITQT.js +0 -22
- package/dist/chunk-LBIKITQT.js.map +0 -1
- package/dist/chunk-LCRLAV4G.js +0 -1085
- package/dist/chunk-LCRLAV4G.js.map +0 -1
- package/dist/chunk-LGP2YGRL.js +0 -4880
- package/dist/chunk-LGP2YGRL.js.map +0 -1
- package/dist/chunk-MKHUZLII.js +0 -738
- package/dist/chunk-MKHUZLII.js.map +0 -1
- package/dist/chunk-NAMYZIS5.js +0 -1
- package/dist/chunk-NAMYZIS5.js.map +0 -1
- package/dist/chunk-NVPG6JCL.js +0 -724
- package/dist/chunk-NVPG6JCL.js.map +0 -1
- package/dist/chunk-O7CPGUAI.js +0 -298
- package/dist/chunk-O7CPGUAI.js.map +0 -1
- package/dist/chunk-OWP7RZ62.js +0 -697
- package/dist/chunk-OWP7RZ62.js.map +0 -1
- package/dist/chunk-S64CB6J3.js +0 -98
- package/dist/chunk-S64CB6J3.js.map +0 -1
- package/dist/chunk-UKT3G5IA.js +0 -484
- package/dist/chunk-UKT3G5IA.js.map +0 -1
- package/dist/chunk-V5GZQEIY.js +0 -101
- package/dist/chunk-V5GZQEIY.js.map +0 -1
- package/dist/chunk-VOIJ6OY4.js +0 -63
- package/dist/chunk-VOIJ6OY4.js.map +0 -1
- package/dist/chunk-VUNV25KB.js +0 -16
- package/dist/chunk-VUNV25KB.js.map +0 -1
- package/dist/chunk-W3EYKZNQ.js +0 -45
- package/dist/chunk-W3EYKZNQ.js.map +0 -1
- package/dist/chunk-WTZDAYZX.js +0 -172
- package/dist/chunk-WTZDAYZX.js.map +0 -1
- package/dist/chunk-XANPHG7W.js +0 -145
- package/dist/chunk-XANPHG7W.js.map +0 -1
- package/dist/config-6S355X75.js +0 -15
- package/dist/config-6S355X75.js.map +0 -1
- package/dist/config-editor-QQTZMWGD.js +0 -13
- package/dist/config-editor-QQTZMWGD.js.map +0 -1
- package/dist/config-registry-AHYI4MYL.js +0 -18
- package/dist/config-registry-AHYI4MYL.js.map +0 -1
- package/dist/daemon-4CS6HMB5.js +0 -30
- package/dist/daemon-4CS6HMB5.js.map +0 -1
- package/dist/discord-OMC52Y54.js +0 -2239
- package/dist/discord-OMC52Y54.js.map +0 -1
- package/dist/dist-UHQK5CXN.js +0 -21151
- package/dist/dist-UHQK5CXN.js.map +0 -1
- package/dist/doctor-HZZ5BSHB.js +0 -10
- package/dist/doctor-HZZ5BSHB.js.map +0 -1
- package/dist/doctor-OLYBO3V3.js +0 -15
- package/dist/doctor-OLYBO3V3.js.map +0 -1
- package/dist/install-cloudflared-Z7VCGOVG.js +0 -33
- package/dist/install-cloudflared-Z7VCGOVG.js.map +0 -1
- package/dist/install-jq-HUYSQWKR.js +0 -32
- package/dist/install-jq-HUYSQWKR.js.map +0 -1
- package/dist/integrate-PNEHRY2I.js +0 -373
- package/dist/integrate-PNEHRY2I.js.map +0 -1
- package/dist/log-NXABYJTT.js +0 -24
- package/dist/log-NXABYJTT.js.map +0 -1
- package/dist/main-XOZCLFUK.js +0 -238
- package/dist/main-XOZCLFUK.js.map +0 -1
- package/dist/menu-YY5MKHEK.js +0 -16
- package/dist/menu-YY5MKHEK.js.map +0 -1
- package/dist/new-session-FEO4J4VU.js +0 -17
- package/dist/new-session-FEO4J4VU.js.map +0 -1
- package/dist/post-upgrade-CJG5I7M2.js +0 -80
- package/dist/post-upgrade-CJG5I7M2.js.map +0 -1
- package/dist/session-IUSI7P5S.js +0 -20
- package/dist/session-IUSI7P5S.js.map +0 -1
- package/dist/settings-RQPAM4KC.js +0 -14
- package/dist/settings-RQPAM4KC.js.map +0 -1
- package/dist/setup-XHS4OMPM.js +0 -37
- package/dist/setup-XHS4OMPM.js.map +0 -1
- package/dist/suggest-7D6B542M.js +0 -38
- package/dist/suggest-7D6B542M.js.map +0 -1
- package/dist/tunnel-service-CJLUH6SZ.js +0 -1174
- package/dist/tunnel-service-CJLUH6SZ.js.map +0 -1
- package/dist/version-NQZBM5M7.js +0 -16
- package/dist/version-NQZBM5M7.js.map +0 -1
package/dist/chunk-GAK6PIBW.js
DELETED
|
@@ -1,224 +0,0 @@
|
|
|
1
|
-
// src/core/log.ts
|
|
2
|
-
import pino from "pino";
|
|
3
|
-
import fs from "fs";
|
|
4
|
-
import path from "path";
|
|
5
|
-
import os from "os";
|
|
6
|
-
var rootLogger = pino({
|
|
7
|
-
level: "debug",
|
|
8
|
-
transport: { target: "pino-pretty", options: { colorize: true, translateTime: "SYS:standard" } }
|
|
9
|
-
});
|
|
10
|
-
var initialized = false;
|
|
11
|
-
var logDir;
|
|
12
|
-
var currentTransport;
|
|
13
|
-
function expandHome(p) {
|
|
14
|
-
return p.startsWith("~") ? path.join(os.homedir(), p.slice(1)) : p;
|
|
15
|
-
}
|
|
16
|
-
function wrapVariadic(logger) {
|
|
17
|
-
return {
|
|
18
|
-
info: (...args) => {
|
|
19
|
-
if (args.length === 0) return;
|
|
20
|
-
if (typeof args[0] === "object" && args[0] !== null && !(args[0] instanceof Error)) {
|
|
21
|
-
logger.info(args[0], args.slice(1).join(" "));
|
|
22
|
-
} else {
|
|
23
|
-
logger.info(args.map(String).join(" "));
|
|
24
|
-
}
|
|
25
|
-
},
|
|
26
|
-
warn: (...args) => {
|
|
27
|
-
if (args.length === 0) return;
|
|
28
|
-
if (typeof args[0] === "object" && args[0] !== null && !(args[0] instanceof Error)) {
|
|
29
|
-
logger.warn(args[0], args.slice(1).join(" "));
|
|
30
|
-
} else {
|
|
31
|
-
logger.warn(args.map(String).join(" "));
|
|
32
|
-
}
|
|
33
|
-
},
|
|
34
|
-
error: (...args) => {
|
|
35
|
-
if (args.length === 0) return;
|
|
36
|
-
if (typeof args[0] === "object" && args[0] !== null && !(args[0] instanceof Error)) {
|
|
37
|
-
logger.error(args[0], args.slice(1).join(" "));
|
|
38
|
-
} else {
|
|
39
|
-
logger.error(args.map(String).join(" "));
|
|
40
|
-
}
|
|
41
|
-
},
|
|
42
|
-
debug: (...args) => {
|
|
43
|
-
if (args.length === 0) return;
|
|
44
|
-
if (typeof args[0] === "object" && args[0] !== null && !(args[0] instanceof Error)) {
|
|
45
|
-
logger.debug(args[0], args.slice(1).join(" "));
|
|
46
|
-
} else {
|
|
47
|
-
logger.debug(args.map(String).join(" "));
|
|
48
|
-
}
|
|
49
|
-
},
|
|
50
|
-
fatal: (...args) => {
|
|
51
|
-
if (args.length === 0) return;
|
|
52
|
-
if (typeof args[0] === "object" && args[0] !== null && !(args[0] instanceof Error)) {
|
|
53
|
-
logger.fatal(args[0], args.slice(1).join(" "));
|
|
54
|
-
} else {
|
|
55
|
-
logger.fatal(args.map(String).join(" "));
|
|
56
|
-
}
|
|
57
|
-
},
|
|
58
|
-
child: (bindings) => logger.child(bindings)
|
|
59
|
-
};
|
|
60
|
-
}
|
|
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
|
-
}
|
|
78
|
-
function initLogger(config) {
|
|
79
|
-
if (initialized) return rootLogger;
|
|
80
|
-
const resolvedLogDir = expandHome(config.logDir);
|
|
81
|
-
logDir = resolvedLogDir;
|
|
82
|
-
try {
|
|
83
|
-
fs.mkdirSync(resolvedLogDir, { recursive: true });
|
|
84
|
-
fs.mkdirSync(path.join(resolvedLogDir, "sessions"), { recursive: true });
|
|
85
|
-
} catch (err) {
|
|
86
|
-
console.error(`[WARN] Failed to create log directory ${resolvedLogDir}, falling back to console-only:`, err);
|
|
87
|
-
return rootLogger;
|
|
88
|
-
}
|
|
89
|
-
const transports = pino.transport({
|
|
90
|
-
targets: [
|
|
91
|
-
{
|
|
92
|
-
target: "pino-pretty",
|
|
93
|
-
options: {
|
|
94
|
-
colorize: true,
|
|
95
|
-
translateTime: "HH:mm:ss",
|
|
96
|
-
ignore: "pid,hostname",
|
|
97
|
-
singleLine: true
|
|
98
|
-
},
|
|
99
|
-
level: config.level
|
|
100
|
-
},
|
|
101
|
-
{
|
|
102
|
-
target: "pino-roll",
|
|
103
|
-
options: {
|
|
104
|
-
file: path.join(resolvedLogDir, "openacp.log"),
|
|
105
|
-
size: config.maxFileSize,
|
|
106
|
-
limit: { count: config.maxFiles }
|
|
107
|
-
},
|
|
108
|
-
level: config.level
|
|
109
|
-
}
|
|
110
|
-
]
|
|
111
|
-
});
|
|
112
|
-
currentTransport = transports;
|
|
113
|
-
rootLogger = pino({ level: config.level }, transports);
|
|
114
|
-
initialized = true;
|
|
115
|
-
Object.assign(log, wrapVariadic(rootLogger));
|
|
116
|
-
return rootLogger;
|
|
117
|
-
}
|
|
118
|
-
function setLogLevel(level) {
|
|
119
|
-
rootLogger.level = level;
|
|
120
|
-
}
|
|
121
|
-
function createChildLogger(context) {
|
|
122
|
-
return new Proxy({}, {
|
|
123
|
-
get(_target, prop, receiver) {
|
|
124
|
-
const child = rootLogger.child(context);
|
|
125
|
-
const value = Reflect.get(child, prop, receiver);
|
|
126
|
-
return typeof value === "function" ? value.bind(child) : value;
|
|
127
|
-
}
|
|
128
|
-
});
|
|
129
|
-
}
|
|
130
|
-
function createSessionLogger(sessionId, parentLogger) {
|
|
131
|
-
const sessionLogDir = logDir ? path.join(logDir, "sessions") : void 0;
|
|
132
|
-
if (!sessionLogDir) {
|
|
133
|
-
return parentLogger.child({ sessionId });
|
|
134
|
-
}
|
|
135
|
-
try {
|
|
136
|
-
const sessionLogPath = path.join(sessionLogDir, `${sessionId}.log`);
|
|
137
|
-
const dest = pino.destination(sessionLogPath);
|
|
138
|
-
const sessionFileLogger = pino({ level: parentLogger.level }, dest).child({ sessionId });
|
|
139
|
-
const combinedChild = parentLogger.child({ sessionId });
|
|
140
|
-
const originalInfo = combinedChild.info.bind(combinedChild);
|
|
141
|
-
const originalWarn = combinedChild.warn.bind(combinedChild);
|
|
142
|
-
const originalError = combinedChild.error.bind(combinedChild);
|
|
143
|
-
const originalDebug = combinedChild.debug.bind(combinedChild);
|
|
144
|
-
const originalFatal = combinedChild.fatal.bind(combinedChild);
|
|
145
|
-
combinedChild.info = ((objOrMsg, ...rest) => {
|
|
146
|
-
sessionFileLogger.info(objOrMsg, ...rest);
|
|
147
|
-
return originalInfo(objOrMsg, ...rest);
|
|
148
|
-
});
|
|
149
|
-
combinedChild.warn = ((objOrMsg, ...rest) => {
|
|
150
|
-
sessionFileLogger.warn(objOrMsg, ...rest);
|
|
151
|
-
return originalWarn(objOrMsg, ...rest);
|
|
152
|
-
});
|
|
153
|
-
combinedChild.error = ((objOrMsg, ...rest) => {
|
|
154
|
-
sessionFileLogger.error(objOrMsg, ...rest);
|
|
155
|
-
return originalError(objOrMsg, ...rest);
|
|
156
|
-
});
|
|
157
|
-
combinedChild.debug = ((objOrMsg, ...rest) => {
|
|
158
|
-
sessionFileLogger.debug(objOrMsg, ...rest);
|
|
159
|
-
return originalDebug(objOrMsg, ...rest);
|
|
160
|
-
});
|
|
161
|
-
combinedChild.fatal = ((objOrMsg, ...rest) => {
|
|
162
|
-
sessionFileLogger.fatal(objOrMsg, ...rest);
|
|
163
|
-
return originalFatal(objOrMsg, ...rest);
|
|
164
|
-
});
|
|
165
|
-
combinedChild.__sessionDest = dest;
|
|
166
|
-
return combinedChild;
|
|
167
|
-
} catch (err) {
|
|
168
|
-
parentLogger.warn({ sessionId, err }, "Failed to create session log file, using combined log only");
|
|
169
|
-
return parentLogger.child({ sessionId });
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
async function shutdownLogger() {
|
|
173
|
-
if (!initialized) return;
|
|
174
|
-
const transport = currentTransport;
|
|
175
|
-
rootLogger = pino({ level: "debug" });
|
|
176
|
-
Object.assign(log, wrapVariadic(rootLogger));
|
|
177
|
-
currentTransport = void 0;
|
|
178
|
-
logDir = void 0;
|
|
179
|
-
initialized = false;
|
|
180
|
-
if (transport) {
|
|
181
|
-
await new Promise((resolve) => {
|
|
182
|
-
const timeout = setTimeout(resolve, 3e3);
|
|
183
|
-
transport.on("close", () => {
|
|
184
|
-
clearTimeout(timeout);
|
|
185
|
-
resolve();
|
|
186
|
-
});
|
|
187
|
-
transport.end();
|
|
188
|
-
});
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
async function cleanupOldSessionLogs(retentionDays) {
|
|
192
|
-
if (!logDir) return;
|
|
193
|
-
const sessionsDir = path.join(logDir, "sessions");
|
|
194
|
-
try {
|
|
195
|
-
const files = await fs.promises.readdir(sessionsDir);
|
|
196
|
-
const cutoff = Date.now() - retentionDays * 24 * 60 * 60 * 1e3;
|
|
197
|
-
for (const file of files) {
|
|
198
|
-
try {
|
|
199
|
-
const filePath = path.join(sessionsDir, file);
|
|
200
|
-
const stat = await fs.promises.stat(filePath);
|
|
201
|
-
if (stat.mtimeMs < cutoff) {
|
|
202
|
-
await fs.promises.unlink(filePath);
|
|
203
|
-
rootLogger.debug({ file }, "Deleted old session log");
|
|
204
|
-
}
|
|
205
|
-
} catch (err) {
|
|
206
|
-
rootLogger.warn({ file, err }, "Failed to delete old session log");
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
} catch {
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
export {
|
|
214
|
-
log,
|
|
215
|
-
muteLogger,
|
|
216
|
-
unmuteLogger,
|
|
217
|
-
initLogger,
|
|
218
|
-
setLogLevel,
|
|
219
|
-
createChildLogger,
|
|
220
|
-
createSessionLogger,
|
|
221
|
-
shutdownLogger,
|
|
222
|
-
cleanupOldSessionLogs
|
|
223
|
-
};
|
|
224
|
-
//# sourceMappingURL=chunk-GAK6PIBW.js.map
|
|
@@ -1 +0,0 @@
|
|
|
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":";AAAA,OAAO,UAAU;AACjB,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,OAAO,QAAQ;AAMf,IAAI,aAA0B,KAAK;AAAA,EACjC,OAAO;AAAA,EACP,WAAW,EAAE,QAAQ,eAAe,SAAS,EAAE,UAAU,MAAM,eAAe,eAAe,EAAE;AACjG,CAAC;AACD,IAAI,cAAc;AAClB,IAAI;AACJ,IAAI;AAEJ,SAAS,WAAW,GAAmB;AACrC,SAAO,EAAE,WAAW,GAAG,IAAI,KAAK,KAAK,GAAG,QAAQ,GAAG,EAAE,MAAM,CAAC,CAAC,IAAI;AACnE;AAGA,SAAS,aAAa,QAAqB;AACzC,SAAO;AAAA,IACL,MAAM,IAAI,SAAoB;AAC5B,UAAI,KAAK,WAAW,EAAG;AACvB,UAAI,OAAO,KAAK,CAAC,MAAM,YAAY,KAAK,CAAC,MAAM,QAAQ,EAAE,KAAK,CAAC,aAAa,QAAQ;AAClF,eAAO,KAAK,KAAK,CAAC,GAAa,KAAK,MAAM,CAAC,EAAE,KAAK,GAAG,CAAC;AAAA,MACxD,OAAO;AACL,eAAO,KAAK,KAAK,IAAI,MAAM,EAAE,KAAK,GAAG,CAAC;AAAA,MACxC;AAAA,IACF;AAAA,IACA,MAAM,IAAI,SAAoB;AAC5B,UAAI,KAAK,WAAW,EAAG;AACvB,UAAI,OAAO,KAAK,CAAC,MAAM,YAAY,KAAK,CAAC,MAAM,QAAQ,EAAE,KAAK,CAAC,aAAa,QAAQ;AAClF,eAAO,KAAK,KAAK,CAAC,GAAa,KAAK,MAAM,CAAC,EAAE,KAAK,GAAG,CAAC;AAAA,MACxD,OAAO;AACL,eAAO,KAAK,KAAK,IAAI,MAAM,EAAE,KAAK,GAAG,CAAC;AAAA,MACxC;AAAA,IACF;AAAA,IACA,OAAO,IAAI,SAAoB;AAC7B,UAAI,KAAK,WAAW,EAAG;AACvB,UAAI,OAAO,KAAK,CAAC,MAAM,YAAY,KAAK,CAAC,MAAM,QAAQ,EAAE,KAAK,CAAC,aAAa,QAAQ;AAClF,eAAO,MAAM,KAAK,CAAC,GAAa,KAAK,MAAM,CAAC,EAAE,KAAK,GAAG,CAAC;AAAA,MACzD,OAAO;AACL,eAAO,MAAM,KAAK,IAAI,MAAM,EAAE,KAAK,GAAG,CAAC;AAAA,MACzC;AAAA,IACF;AAAA,IACA,OAAO,IAAI,SAAoB;AAC7B,UAAI,KAAK,WAAW,EAAG;AACvB,UAAI,OAAO,KAAK,CAAC,MAAM,YAAY,KAAK,CAAC,MAAM,QAAQ,EAAE,KAAK,CAAC,aAAa,QAAQ;AAClF,eAAO,MAAM,KAAK,CAAC,GAAa,KAAK,MAAM,CAAC,EAAE,KAAK,GAAG,CAAC;AAAA,MACzD,OAAO;AACL,eAAO,MAAM,KAAK,IAAI,MAAM,EAAE,KAAK,GAAG,CAAC;AAAA,MACzC;AAAA,IACF;AAAA,IACA,OAAO,IAAI,SAAoB;AAC7B,UAAI,KAAK,WAAW,EAAG;AACvB,UAAI,OAAO,KAAK,CAAC,MAAM,YAAY,KAAK,CAAC,MAAM,QAAQ,EAAE,KAAK,CAAC,aAAa,QAAQ;AAClF,eAAO,MAAM,KAAK,CAAC,GAAa,KAAK,MAAM,CAAC,EAAE,KAAK,GAAG,CAAC;AAAA,MACzD,OAAO;AACL,eAAO,MAAM,KAAK,IAAI,MAAM,EAAE,KAAK,GAAG,CAAC;AAAA,MACzC;AAAA,IACF;AAAA,IACA,OAAO,CAAC,aAA4B,OAAO,MAAM,QAAQ;AAAA,EAC3D;AACF;AAEO,IAAM,MAAM,aAAa,UAAU;AAI1C,IAAI,YAAY;AAChB,IAAI,aAAa;AAEV,SAAS,aAAmB;AACjC,MAAI,cAAc,GAAG;AACnB,iBAAa,WAAW;AACxB,eAAW,QAAQ;AAAA,EACrB;AACA;AACF;AAEO,SAAS,eAAqB;AACnC;AACA,MAAI,aAAa,GAAG;AAClB,gBAAY;AACZ,eAAW,QAAQ;AAAA,EACrB;AACF;AAIO,SAAS,WAAW,QAA+B;AACxD,MAAI,YAAa,QAAO;AAExB,QAAM,iBAAiB,WAAW,OAAO,MAAM;AAC/C,WAAS;AAET,MAAI;AACF,OAAG,UAAU,gBAAgB,EAAE,WAAW,KAAK,CAAC;AAChD,OAAG,UAAU,KAAK,KAAK,gBAAgB,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,EACzE,SAAS,KAAK;AACZ,YAAQ,MAAM,yCAAyC,cAAc,mCAAmC,GAAG;AAC3G,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,KAAK,UAAU;AAAA,IAChC,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,UAAU;AAAA,UACV,eAAe;AAAA,UACf,QAAQ;AAAA,UACR,YAAY;AAAA,QACd;AAAA,QACA,OAAO,OAAO;AAAA,MAChB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,MAAM,KAAK,KAAK,gBAAgB,aAAa;AAAA,UAC7C,MAAM,OAAO;AAAA,UACb,OAAO,EAAE,OAAO,OAAO,SAAS;AAAA,QAClC;AAAA,QACA,OAAO,OAAO;AAAA,MAChB;AAAA,IACF;AAAA,EACF,CAAC;AAED,qBAAmB;AACnB,eAAa,KAAK,EAAE,OAAO,OAAO,MAAM,GAAG,UAAU;AACrD,gBAAc;AAGd,SAAO,OAAO,KAAK,aAAa,UAAU,CAAC;AAE3C,SAAO;AACT;AAGO,SAAS,YAAY,OAAqB;AAC/C,aAAW,QAAQ;AACrB;AAEO,SAAS,kBAAkB,SAA6D;AAI7F,SAAO,IAAI,MAAM,CAAC,GAAa;AAAA,IAC7B,IAAI,SAAS,MAAM,UAAU;AAC3B,YAAM,QAAQ,WAAW,MAAM,OAAO;AACtC,YAAM,QAAQ,QAAQ,IAAI,OAAO,MAAM,QAAQ;AAC/C,aAAO,OAAO,UAAU,aAAa,MAAM,KAAK,KAAK,IAAI;AAAA,IAC3D;AAAA,EACF,CAAC;AACH;AAEO,SAAS,oBAAoB,WAAmB,cAA8B;AACnF,QAAM,gBAAgB,SAAS,KAAK,KAAK,QAAQ,UAAU,IAAI;AAC/D,MAAI,CAAC,eAAe;AAClB,WAAO,aAAa,MAAM,EAAE,UAAU,CAAC;AAAA,EACzC;AAEA,MAAI;AACF,UAAM,iBAAiB,KAAK,KAAK,eAAe,GAAG,SAAS,MAAM;AAClE,UAAM,OAAO,KAAK,YAAY,cAAc;AAC5C,UAAM,oBAAoB,KAAK,EAAE,OAAO,aAAa,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC;AAGvF,UAAM,gBAAgB,aAAa,MAAM,EAAE,UAAU,CAAC;AACtD,UAAM,eAAe,cAAc,KAAK,KAAK,aAAa;AAC1D,UAAM,eAAe,cAAc,KAAK,KAAK,aAAa;AAC1D,UAAM,gBAAgB,cAAc,MAAM,KAAK,aAAa;AAC5D,UAAM,gBAAgB,cAAc,MAAM,KAAK,aAAa;AAC5D,UAAM,gBAAgB,cAAc,MAAM,KAAK,aAAa;AAG5D,kBAAc,QAAQ,CAAC,aAAkB,SAAgB;AACvD,wBAAkB,KAAK,UAAU,GAAG,IAAI;AACxC,aAAO,aAAa,UAAU,GAAG,IAAI;AAAA,IACvC;AACA,kBAAc,QAAQ,CAAC,aAAkB,SAAgB;AACvD,wBAAkB,KAAK,UAAU,GAAG,IAAI;AACxC,aAAO,aAAa,UAAU,GAAG,IAAI;AAAA,IACvC;AACA,kBAAc,SAAS,CAAC,aAAkB,SAAgB;AACxD,wBAAkB,MAAM,UAAU,GAAG,IAAI;AACzC,aAAO,cAAc,UAAU,GAAG,IAAI;AAAA,IACxC;AACA,kBAAc,SAAS,CAAC,aAAkB,SAAgB;AACxD,wBAAkB,MAAM,UAAU,GAAG,IAAI;AACzC,aAAO,cAAc,UAAU,GAAG,IAAI;AAAA,IACxC;AACA,kBAAc,SAAS,CAAC,aAAkB,SAAgB;AACxD,wBAAkB,MAAM,UAAU,GAAG,IAAI;AACzC,aAAO,cAAc,UAAU,GAAG,IAAI;AAAA,IACxC;AAGC,IAAC,cAAsB,gBAAgB;AAExC,WAAO;AAAA,EACT,SAAS,KAAK;AAEZ,iBAAa,KAAK,EAAE,WAAW,IAAI,GAAG,4DAA4D;AAClG,WAAO,aAAa,MAAM,EAAE,UAAU,CAAC;AAAA,EACzC;AACF;AAEA,eAAsB,iBAAgC;AACpD,MAAI,CAAC,YAAa;AAElB,QAAM,YAAY;AAGlB,eAAa,KAAK,EAAE,OAAO,QAAQ,CAAC;AACpC,SAAO,OAAO,KAAK,aAAa,UAAU,CAAC;AAC3C,qBAAmB;AACnB,WAAS;AACT,gBAAc;AAEd,MAAI,WAAW;AACb,UAAM,IAAI,QAAc,CAAC,YAAY;AACnC,YAAM,UAAU,WAAW,SAAS,GAAI;AACxC,gBAAU,GAAG,SAAS,MAAM;AAC1B,qBAAa,OAAO;AACpB,gBAAQ;AAAA,MACV,CAAC;AACD,gBAAU,IAAI;AAAA,IAChB,CAAC;AAAA,EACH;AACF;AAEA,eAAsB,sBAAsB,eAAsC;AAChF,MAAI,CAAC,OAAQ;AAEb,QAAM,cAAc,KAAK,KAAK,QAAQ,UAAU;AAChD,MAAI;AACF,UAAM,QAAQ,MAAM,GAAG,SAAS,QAAQ,WAAW;AACnD,UAAM,SAAS,KAAK,IAAI,IAAI,gBAAgB,KAAK,KAAK,KAAK;AAE3D,eAAW,QAAQ,OAAO;AACxB,UAAI;AACF,cAAM,WAAW,KAAK,KAAK,aAAa,IAAI;AAC5C,cAAM,OAAO,MAAM,GAAG,SAAS,KAAK,QAAQ;AAC5C,YAAI,KAAK,UAAU,QAAQ;AACzB,gBAAM,GAAG,SAAS,OAAO,QAAQ;AACjC,qBAAW,MAAM,EAAE,KAAK,GAAG,yBAAyB;AAAA,QACtD;AAAA,MACF,SAAS,KAAK;AACZ,mBAAW,KAAK,EAAE,MAAM,IAAI,GAAG,kCAAkC;AAAA,MACnE;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AACF;","names":[]}
|
package/dist/chunk-I7WC6E5S.js
DELETED
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
// src/adapters/discord/action-detect.ts
|
|
2
|
-
import { nanoid } from "nanoid";
|
|
3
|
-
import { ActionRowBuilder, ButtonBuilder, ButtonStyle } from "discord.js";
|
|
4
|
-
var CMD_NEW_RE = /\/new(?:\s+([^\s\u0080-\uFFFF]+)(?:\s+([^\s\u0080-\uFFFF]+))?)?/;
|
|
5
|
-
var CMD_CANCEL_RE = /\/cancel\b/;
|
|
6
|
-
var KW_NEW_RE = /(?:create|new)\s+session/i;
|
|
7
|
-
var KW_CANCEL_RE = /(?:cancel|stop)\s+session/i;
|
|
8
|
-
function detectAction(text) {
|
|
9
|
-
if (!text) return null;
|
|
10
|
-
const cancelCmd = CMD_CANCEL_RE.exec(text);
|
|
11
|
-
if (cancelCmd) return { type: "cancel_session" };
|
|
12
|
-
const newCmd = CMD_NEW_RE.exec(text);
|
|
13
|
-
if (newCmd) {
|
|
14
|
-
return {
|
|
15
|
-
type: "new_session",
|
|
16
|
-
agent: newCmd[1] || void 0,
|
|
17
|
-
workspace: newCmd[2] || void 0
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
|
-
if (KW_CANCEL_RE.test(text)) return { type: "cancel_session" };
|
|
21
|
-
if (KW_NEW_RE.test(text)) return { type: "new_session", agent: void 0, workspace: void 0 };
|
|
22
|
-
return null;
|
|
23
|
-
}
|
|
24
|
-
var ACTION_TTL_MS = 5 * 60 * 1e3;
|
|
25
|
-
var actionMap = /* @__PURE__ */ new Map();
|
|
26
|
-
function storeAction(action) {
|
|
27
|
-
const id = nanoid(8);
|
|
28
|
-
actionMap.set(id, { action, createdAt: Date.now() });
|
|
29
|
-
for (const [key, entry] of actionMap) {
|
|
30
|
-
if (Date.now() - entry.createdAt > ACTION_TTL_MS) {
|
|
31
|
-
actionMap.delete(key);
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
return id;
|
|
35
|
-
}
|
|
36
|
-
function getAction(id) {
|
|
37
|
-
const entry = actionMap.get(id);
|
|
38
|
-
if (!entry) return void 0;
|
|
39
|
-
if (Date.now() - entry.createdAt > ACTION_TTL_MS) {
|
|
40
|
-
actionMap.delete(id);
|
|
41
|
-
return void 0;
|
|
42
|
-
}
|
|
43
|
-
return entry.action;
|
|
44
|
-
}
|
|
45
|
-
function removeAction(id) {
|
|
46
|
-
actionMap.delete(id);
|
|
47
|
-
}
|
|
48
|
-
function buildActionKeyboard(actionId, action) {
|
|
49
|
-
const row = new ActionRowBuilder();
|
|
50
|
-
if (action.type === "new_session") {
|
|
51
|
-
row.addComponents(
|
|
52
|
-
new ButtonBuilder().setCustomId(`a:${actionId}`).setLabel("\u2705 Create session").setStyle(ButtonStyle.Success),
|
|
53
|
-
new ButtonBuilder().setCustomId(`a:dismiss:${actionId}`).setLabel("\u274C Cancel").setStyle(ButtonStyle.Secondary)
|
|
54
|
-
);
|
|
55
|
-
} else {
|
|
56
|
-
row.addComponents(
|
|
57
|
-
new ButtonBuilder().setCustomId(`a:${actionId}`).setLabel("\u26D4 Cancel session").setStyle(ButtonStyle.Danger),
|
|
58
|
-
new ButtonBuilder().setCustomId(`a:dismiss:${actionId}`).setLabel("\u274C No").setStyle(ButtonStyle.Secondary)
|
|
59
|
-
);
|
|
60
|
-
}
|
|
61
|
-
return row;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
export {
|
|
65
|
-
detectAction,
|
|
66
|
-
storeAction,
|
|
67
|
-
getAction,
|
|
68
|
-
removeAction,
|
|
69
|
-
buildActionKeyboard
|
|
70
|
-
};
|
|
71
|
-
//# sourceMappingURL=chunk-I7WC6E5S.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/adapters/discord/action-detect.ts"],"sourcesContent":["import { nanoid } from 'nanoid'\nimport { ActionRowBuilder, ButtonBuilder, ButtonStyle } from 'discord.js'\n\nexport interface DetectedAction {\n type: 'new_session' | 'cancel_session'\n agent?: string\n workspace?: string\n}\n\n// Command patterns: /new [agent] [workspace], /cancel\n// Agent and workspace are ASCII-only tokens (no Unicode letters) to avoid matching non-ASCII words\nconst CMD_NEW_RE = /\\/new(?:\\s+([^\\s\\u0080-\\uFFFF]+)(?:\\s+([^\\s\\u0080-\\uFFFF]+))?)?/\nconst CMD_CANCEL_RE = /\\/cancel\\b/\n\n// Keyword patterns (compound phrases only to avoid false positives)\nconst KW_NEW_RE = /(?:create|new)\\s+session/i\nconst KW_CANCEL_RE = /(?:cancel|stop)\\s+session/i\n\nexport function detectAction(text: string): DetectedAction | null {\n if (!text) return null\n\n // Priority 1: command pattern\n const cancelCmd = CMD_CANCEL_RE.exec(text)\n if (cancelCmd) return { type: 'cancel_session' }\n\n const newCmd = CMD_NEW_RE.exec(text)\n if (newCmd) {\n return {\n type: 'new_session',\n agent: newCmd[1] || undefined,\n workspace: newCmd[2] || undefined,\n }\n }\n\n // Priority 2: keyword matching\n if (KW_CANCEL_RE.test(text)) return { type: 'cancel_session' }\n if (KW_NEW_RE.test(text)) return { type: 'new_session', agent: undefined, workspace: undefined }\n\n return null\n}\n\n// --- TTL action map ---\n\nconst ACTION_TTL_MS = 5 * 60 * 1000 // 5 minutes\nconst actionMap: Map<string, { action: DetectedAction; createdAt: number }> = new Map()\n\nexport function storeAction(action: DetectedAction): string {\n const id = nanoid(8)\n actionMap.set(id, { action, createdAt: Date.now() })\n // Cleanup expired entries\n for (const [key, entry] of actionMap) {\n if (Date.now() - entry.createdAt > ACTION_TTL_MS) {\n actionMap.delete(key)\n }\n }\n return id\n}\n\nexport function getAction(id: string): DetectedAction | undefined {\n const entry = actionMap.get(id)\n if (!entry) return undefined\n if (Date.now() - entry.createdAt > ACTION_TTL_MS) {\n actionMap.delete(id)\n return undefined\n }\n return entry.action\n}\n\nexport function removeAction(id: string): void {\n actionMap.delete(id)\n}\n\nexport function buildActionKeyboard(\n actionId: string,\n action: DetectedAction,\n): ActionRowBuilder<ButtonBuilder> {\n const row = new ActionRowBuilder<ButtonBuilder>()\n\n if (action.type === 'new_session') {\n row.addComponents(\n new ButtonBuilder()\n .setCustomId(`a:${actionId}`)\n .setLabel('✅ Create session')\n .setStyle(ButtonStyle.Success),\n new ButtonBuilder()\n .setCustomId(`a:dismiss:${actionId}`)\n .setLabel('❌ Cancel')\n .setStyle(ButtonStyle.Secondary),\n )\n } else {\n row.addComponents(\n new ButtonBuilder()\n .setCustomId(`a:${actionId}`)\n .setLabel('⛔ Cancel session')\n .setStyle(ButtonStyle.Danger),\n new ButtonBuilder()\n .setCustomId(`a:dismiss:${actionId}`)\n .setLabel('❌ No')\n .setStyle(ButtonStyle.Secondary),\n )\n }\n\n return row\n}\n"],"mappings":";AAAA,SAAS,cAAc;AACvB,SAAS,kBAAkB,eAAe,mBAAmB;AAU7D,IAAM,aAAa;AACnB,IAAM,gBAAgB;AAGtB,IAAM,YAAY;AAClB,IAAM,eAAe;AAEd,SAAS,aAAa,MAAqC;AAChE,MAAI,CAAC,KAAM,QAAO;AAGlB,QAAM,YAAY,cAAc,KAAK,IAAI;AACzC,MAAI,UAAW,QAAO,EAAE,MAAM,iBAAiB;AAE/C,QAAM,SAAS,WAAW,KAAK,IAAI;AACnC,MAAI,QAAQ;AACV,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO,OAAO,CAAC,KAAK;AAAA,MACpB,WAAW,OAAO,CAAC,KAAK;AAAA,IAC1B;AAAA,EACF;AAGA,MAAI,aAAa,KAAK,IAAI,EAAG,QAAO,EAAE,MAAM,iBAAiB;AAC7D,MAAI,UAAU,KAAK,IAAI,EAAG,QAAO,EAAE,MAAM,eAAe,OAAO,QAAW,WAAW,OAAU;AAE/F,SAAO;AACT;AAIA,IAAM,gBAAgB,IAAI,KAAK;AAC/B,IAAM,YAAwE,oBAAI,IAAI;AAE/E,SAAS,YAAY,QAAgC;AAC1D,QAAM,KAAK,OAAO,CAAC;AACnB,YAAU,IAAI,IAAI,EAAE,QAAQ,WAAW,KAAK,IAAI,EAAE,CAAC;AAEnD,aAAW,CAAC,KAAK,KAAK,KAAK,WAAW;AACpC,QAAI,KAAK,IAAI,IAAI,MAAM,YAAY,eAAe;AAChD,gBAAU,OAAO,GAAG;AAAA,IACtB;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,UAAU,IAAwC;AAChE,QAAM,QAAQ,UAAU,IAAI,EAAE;AAC9B,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,KAAK,IAAI,IAAI,MAAM,YAAY,eAAe;AAChD,cAAU,OAAO,EAAE;AACnB,WAAO;AAAA,EACT;AACA,SAAO,MAAM;AACf;AAEO,SAAS,aAAa,IAAkB;AAC7C,YAAU,OAAO,EAAE;AACrB;AAEO,SAAS,oBACd,UACA,QACiC;AACjC,QAAM,MAAM,IAAI,iBAAgC;AAEhD,MAAI,OAAO,SAAS,eAAe;AACjC,QAAI;AAAA,MACF,IAAI,cAAc,EACf,YAAY,KAAK,QAAQ,EAAE,EAC3B,SAAS,uBAAkB,EAC3B,SAAS,YAAY,OAAO;AAAA,MAC/B,IAAI,cAAc,EACf,YAAY,aAAa,QAAQ,EAAE,EACnC,SAAS,eAAU,EACnB,SAAS,YAAY,SAAS;AAAA,IACnC;AAAA,EACF,OAAO;AACL,QAAI;AAAA,MACF,IAAI,cAAc,EACf,YAAY,KAAK,QAAQ,EAAE,EAC3B,SAAS,uBAAkB,EAC3B,SAAS,YAAY,MAAM;AAAA,MAC9B,IAAI,cAAc,EACf,YAAY,aAAa,QAAQ,EAAE,EACnC,SAAS,WAAM,EACf,SAAS,YAAY,SAAS;AAAA,IACnC;AAAA,EACF;AAEA,SAAO;AACT;","names":[]}
|
package/dist/chunk-J4SJTKIK.js
DELETED
|
@@ -1,203 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
log
|
|
3
|
-
} from "./chunk-GAK6PIBW.js";
|
|
4
|
-
|
|
5
|
-
// src/adapters/discord/commands/agents.ts
|
|
6
|
-
import {
|
|
7
|
-
ActionRowBuilder,
|
|
8
|
-
ButtonBuilder,
|
|
9
|
-
ButtonStyle
|
|
10
|
-
} from "discord.js";
|
|
11
|
-
var AGENTS_PER_PAGE = 5;
|
|
12
|
-
function buildProgressBar(percent) {
|
|
13
|
-
const filled = Math.round(percent / 10);
|
|
14
|
-
const empty = 10 - filled;
|
|
15
|
-
return "\u2588".repeat(filled) + "\u2591".repeat(empty);
|
|
16
|
-
}
|
|
17
|
-
function truncate(text, maxLen) {
|
|
18
|
-
if (text.length <= maxLen) return text;
|
|
19
|
-
return text.slice(0, maxLen - 1) + "\u2026";
|
|
20
|
-
}
|
|
21
|
-
async function handleAgents(interaction, adapter, page = 0) {
|
|
22
|
-
await interaction.deferReply({ ephemeral: true });
|
|
23
|
-
const { content, components } = buildAgentsContent(adapter, page);
|
|
24
|
-
await interaction.editReply({ content, components });
|
|
25
|
-
}
|
|
26
|
-
async function showAgentsList(interaction, adapter, page = 0) {
|
|
27
|
-
const { content, components } = buildAgentsContent(adapter, page);
|
|
28
|
-
await interaction.followUp({ content, components, ephemeral: true });
|
|
29
|
-
}
|
|
30
|
-
function buildAgentsContent(adapter, page) {
|
|
31
|
-
const catalog = adapter.core.agentCatalog;
|
|
32
|
-
const items = catalog.getAvailable();
|
|
33
|
-
const installed = items.filter((i) => i.installed);
|
|
34
|
-
const available = items.filter((i) => !i.installed);
|
|
35
|
-
let content = "**\u{1F916} Agents**\n\n";
|
|
36
|
-
if (installed.length > 0) {
|
|
37
|
-
content += "**Installed:**\n";
|
|
38
|
-
for (const item of installed) {
|
|
39
|
-
content += `\u2705 **${item.name}**`;
|
|
40
|
-
if (item.description) content += ` \u2014 *${truncate(item.description, 50)}*`;
|
|
41
|
-
content += "\n";
|
|
42
|
-
}
|
|
43
|
-
content += "\n";
|
|
44
|
-
}
|
|
45
|
-
const components = [];
|
|
46
|
-
if (available.length > 0) {
|
|
47
|
-
const totalPages = Math.ceil(available.length / AGENTS_PER_PAGE);
|
|
48
|
-
const safePage = Math.max(0, Math.min(page, totalPages - 1));
|
|
49
|
-
const pageItems = available.slice(safePage * AGENTS_PER_PAGE, (safePage + 1) * AGENTS_PER_PAGE);
|
|
50
|
-
content += `**Available to install:**`;
|
|
51
|
-
if (totalPages > 1) content += ` (${safePage + 1}/${totalPages})`;
|
|
52
|
-
content += "\n";
|
|
53
|
-
for (const item of pageItems) {
|
|
54
|
-
if (item.available) {
|
|
55
|
-
content += `\u2B07\uFE0F **${item.name}**`;
|
|
56
|
-
} else {
|
|
57
|
-
const deps = item.missingDeps?.join(", ") ?? "requirements not met";
|
|
58
|
-
content += `\u26A0\uFE0F **${item.name}** *(needs: ${deps})*`;
|
|
59
|
-
}
|
|
60
|
-
if (item.description) content += `
|
|
61
|
-
*${truncate(item.description, 60)}*`;
|
|
62
|
-
content += "\n";
|
|
63
|
-
}
|
|
64
|
-
const installable = pageItems.filter((i) => i.available);
|
|
65
|
-
if (installable.length > 0) {
|
|
66
|
-
const installRow = new ActionRowBuilder();
|
|
67
|
-
for (const item of installable) {
|
|
68
|
-
installRow.addComponents(
|
|
69
|
-
new ButtonBuilder().setCustomId(`ag:install:${item.key}`).setLabel(`\u2B07\uFE0F ${item.name}`).setStyle(ButtonStyle.Secondary)
|
|
70
|
-
);
|
|
71
|
-
}
|
|
72
|
-
components.push(installRow);
|
|
73
|
-
}
|
|
74
|
-
if (totalPages > 1) {
|
|
75
|
-
const pageRow = new ActionRowBuilder();
|
|
76
|
-
if (safePage > 0) {
|
|
77
|
-
pageRow.addComponents(
|
|
78
|
-
new ButtonBuilder().setCustomId(`ag:page:${safePage - 1}`).setLabel("\u25C0\uFE0F Prev").setStyle(ButtonStyle.Secondary)
|
|
79
|
-
);
|
|
80
|
-
}
|
|
81
|
-
if (safePage < totalPages - 1) {
|
|
82
|
-
pageRow.addComponents(
|
|
83
|
-
new ButtonBuilder().setCustomId(`ag:page:${safePage + 1}`).setLabel("Next \u25B6\uFE0F").setStyle(ButtonStyle.Secondary)
|
|
84
|
-
);
|
|
85
|
-
}
|
|
86
|
-
if (pageRow.components.length > 0) components.push(pageRow);
|
|
87
|
-
}
|
|
88
|
-
} else {
|
|
89
|
-
content += "*All agents are already installed!*";
|
|
90
|
-
}
|
|
91
|
-
return { content, components };
|
|
92
|
-
}
|
|
93
|
-
async function handleInstall(interaction, adapter) {
|
|
94
|
-
await interaction.deferReply({ ephemeral: true });
|
|
95
|
-
const nameOrId = interaction.options.getString("name", true);
|
|
96
|
-
await installAgentWithProgress(interaction, adapter, nameOrId);
|
|
97
|
-
}
|
|
98
|
-
async function handleAgentButton(interaction, adapter) {
|
|
99
|
-
const { customId } = interaction;
|
|
100
|
-
if (customId.startsWith("ag:install:")) {
|
|
101
|
-
const nameOrId = customId.replace("ag:install:", "");
|
|
102
|
-
try {
|
|
103
|
-
await interaction.deferReply({ ephemeral: true });
|
|
104
|
-
} catch {
|
|
105
|
-
}
|
|
106
|
-
await installAgentWithProgress(interaction, adapter, nameOrId);
|
|
107
|
-
return;
|
|
108
|
-
}
|
|
109
|
-
if (customId.startsWith("ag:page:")) {
|
|
110
|
-
const page = parseInt(customId.replace("ag:page:", ""), 10);
|
|
111
|
-
const { content, components } = buildAgentsContent(adapter, page);
|
|
112
|
-
try {
|
|
113
|
-
await interaction.update({ content, components });
|
|
114
|
-
} catch (err) {
|
|
115
|
-
log.warn({ err }, "[discord-agents] Failed to update page");
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
async function installAgentWithProgress(interaction, adapter, nameOrId) {
|
|
120
|
-
const catalog = adapter.core.agentCatalog;
|
|
121
|
-
let statusText = `\u23F3 Installing **${nameOrId}**...`;
|
|
122
|
-
let lastEdit = 0;
|
|
123
|
-
const EDIT_THROTTLE_MS = 1500;
|
|
124
|
-
const editStatus = async (text) => {
|
|
125
|
-
const now = Date.now();
|
|
126
|
-
if (now - lastEdit > EDIT_THROTTLE_MS) {
|
|
127
|
-
lastEdit = now;
|
|
128
|
-
statusText = text;
|
|
129
|
-
try {
|
|
130
|
-
if (interaction.deferred || interaction.replied) {
|
|
131
|
-
await interaction.editReply(text);
|
|
132
|
-
}
|
|
133
|
-
} catch {
|
|
134
|
-
}
|
|
135
|
-
} else {
|
|
136
|
-
statusText = text;
|
|
137
|
-
}
|
|
138
|
-
};
|
|
139
|
-
try {
|
|
140
|
-
if (interaction.deferred || interaction.replied) {
|
|
141
|
-
await interaction.editReply(statusText);
|
|
142
|
-
}
|
|
143
|
-
} catch {
|
|
144
|
-
}
|
|
145
|
-
const progress = {
|
|
146
|
-
onStart(_id, _name) {
|
|
147
|
-
},
|
|
148
|
-
async onStep(step) {
|
|
149
|
-
await editStatus(`\u23F3 **${nameOrId}**: ${step}`);
|
|
150
|
-
},
|
|
151
|
-
async onDownloadProgress(percent) {
|
|
152
|
-
const bar = buildProgressBar(percent);
|
|
153
|
-
await editStatus(`\u23F3 **${nameOrId}**
|
|
154
|
-
Downloading... ${bar} ${percent}%`);
|
|
155
|
-
},
|
|
156
|
-
async onSuccess(name) {
|
|
157
|
-
const row = new ActionRowBuilder().addComponents(
|
|
158
|
-
new ButtonBuilder().setCustomId(`na:${nameOrId}`).setLabel(`\u{1F680} Start session with ${name}`).setStyle(ButtonStyle.Primary)
|
|
159
|
-
);
|
|
160
|
-
try {
|
|
161
|
-
if (interaction.deferred || interaction.replied) {
|
|
162
|
-
await interaction.editReply({
|
|
163
|
-
content: `\u2705 **${name}** installed!`,
|
|
164
|
-
components: [row]
|
|
165
|
-
});
|
|
166
|
-
}
|
|
167
|
-
} catch {
|
|
168
|
-
}
|
|
169
|
-
},
|
|
170
|
-
async onError(error) {
|
|
171
|
-
try {
|
|
172
|
-
if (interaction.deferred || interaction.replied) {
|
|
173
|
-
await interaction.editReply(`\u274C ${error}`);
|
|
174
|
-
}
|
|
175
|
-
} catch {
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
};
|
|
179
|
-
const result = await catalog.install(nameOrId, progress);
|
|
180
|
-
if (result.ok && result.setupSteps?.length) {
|
|
181
|
-
let setupText = `\u{1F4CB} **Setup for ${result.agentKey}:**
|
|
182
|
-
|
|
183
|
-
`;
|
|
184
|
-
for (const step of result.setupSteps) {
|
|
185
|
-
setupText += `\u2192 ${step}
|
|
186
|
-
`;
|
|
187
|
-
}
|
|
188
|
-
setupText += `
|
|
189
|
-
*Run in terminal: \`openacp agents info ${result.agentKey}\`*`;
|
|
190
|
-
try {
|
|
191
|
-
await interaction.followUp({ content: setupText, ephemeral: true });
|
|
192
|
-
} catch {
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
export {
|
|
198
|
-
handleAgents,
|
|
199
|
-
showAgentsList,
|
|
200
|
-
handleInstall,
|
|
201
|
-
handleAgentButton
|
|
202
|
-
};
|
|
203
|
-
//# sourceMappingURL=chunk-J4SJTKIK.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/adapters/discord/commands/agents.ts"],"sourcesContent":["import {\n ActionRowBuilder,\n ButtonBuilder,\n ButtonStyle,\n} from 'discord.js'\nimport type { ChatInputCommandInteraction, ButtonInteraction } from 'discord.js'\nimport { log } from '../../../core/log.js'\nimport type { InstallProgress } from '../../../core/types.js'\nimport type { DiscordAdapter } from '../adapter.js'\n\nconst AGENTS_PER_PAGE = 5\n\nfunction buildProgressBar(percent: number): string {\n const filled = Math.round(percent / 10)\n const empty = 10 - filled\n return '█'.repeat(filled) + '░'.repeat(empty)\n}\n\nfunction truncate(text: string, maxLen: number): string {\n if (text.length <= maxLen) return text\n return text.slice(0, maxLen - 1) + '…'\n}\n\nexport async function handleAgents(\n interaction: ChatInputCommandInteraction,\n adapter: DiscordAdapter,\n page = 0,\n): Promise<void> {\n await interaction.deferReply({ ephemeral: true })\n const { content, components } = buildAgentsContent(adapter, page)\n await interaction.editReply({ content, components })\n}\n\nexport async function showAgentsList(\n interaction: ButtonInteraction,\n adapter: DiscordAdapter,\n page = 0,\n): Promise<void> {\n const { content, components } = buildAgentsContent(adapter, page)\n await interaction.followUp({ content, components, ephemeral: true })\n}\n\nfunction buildAgentsContent(\n adapter: DiscordAdapter,\n page: number,\n): { content: string; components: ActionRowBuilder<ButtonBuilder>[] } {\n const catalog = adapter.core.agentCatalog\n const items = catalog.getAvailable()\n\n const installed = items.filter((i: any) => i.installed)\n const available = items.filter((i: any) => !i.installed)\n\n let content = '**🤖 Agents**\\n\\n'\n\n if (installed.length > 0) {\n content += '**Installed:**\\n'\n for (const item of installed) {\n content += `✅ **${item.name}**`\n if (item.description) content += ` — *${truncate(item.description, 50)}*`\n content += '\\n'\n }\n content += '\\n'\n }\n\n const components: ActionRowBuilder<ButtonBuilder>[] = []\n\n if (available.length > 0) {\n const totalPages = Math.ceil(available.length / AGENTS_PER_PAGE)\n const safePage = Math.max(0, Math.min(page, totalPages - 1))\n const pageItems = available.slice(safePage * AGENTS_PER_PAGE, (safePage + 1) * AGENTS_PER_PAGE)\n\n content += `**Available to install:**`\n if (totalPages > 1) content += ` (${safePage + 1}/${totalPages})`\n content += '\\n'\n\n for (const item of pageItems) {\n if (item.available) {\n content += `⬇️ **${item.name}**`\n } else {\n const deps = item.missingDeps?.join(', ') ?? 'requirements not met'\n content += `⚠️ **${item.name}** *(needs: ${deps})*`\n }\n if (item.description) content += `\\n *${truncate(item.description, 60)}*`\n content += '\\n'\n }\n\n // Install buttons row\n const installable = pageItems.filter((i: any) => i.available)\n if (installable.length > 0) {\n const installRow = new ActionRowBuilder<ButtonBuilder>()\n for (const item of installable) {\n installRow.addComponents(\n new ButtonBuilder()\n .setCustomId(`ag:install:${item.key}`)\n .setLabel(`⬇️ ${item.name}`)\n .setStyle(ButtonStyle.Secondary),\n )\n }\n components.push(installRow)\n }\n\n // Pagination row\n if (totalPages > 1) {\n const pageRow = new ActionRowBuilder<ButtonBuilder>()\n if (safePage > 0) {\n pageRow.addComponents(\n new ButtonBuilder()\n .setCustomId(`ag:page:${safePage - 1}`)\n .setLabel('◀️ Prev')\n .setStyle(ButtonStyle.Secondary),\n )\n }\n if (safePage < totalPages - 1) {\n pageRow.addComponents(\n new ButtonBuilder()\n .setCustomId(`ag:page:${safePage + 1}`)\n .setLabel('Next ▶️')\n .setStyle(ButtonStyle.Secondary),\n )\n }\n if (pageRow.components.length > 0) components.push(pageRow)\n }\n } else {\n content += '*All agents are already installed!*'\n }\n\n return { content, components }\n}\n\nexport async function handleInstall(\n interaction: ChatInputCommandInteraction,\n adapter: DiscordAdapter,\n): Promise<void> {\n await interaction.deferReply({ ephemeral: true })\n\n const nameOrId = interaction.options.getString('name', true)\n await installAgentWithProgress(interaction, adapter, nameOrId)\n}\n\nexport async function handleAgentButton(\n interaction: ButtonInteraction,\n adapter: DiscordAdapter,\n): Promise<void> {\n const { customId } = interaction\n\n if (customId.startsWith('ag:install:')) {\n const nameOrId = customId.replace('ag:install:', '')\n try { await interaction.deferReply({ ephemeral: true }) } catch { /* ignore */ }\n await installAgentWithProgress(interaction, adapter, nameOrId)\n return\n }\n\n if (customId.startsWith('ag:page:')) {\n const page = parseInt(customId.replace('ag:page:', ''), 10)\n const { content, components } = buildAgentsContent(adapter, page)\n try {\n await interaction.update({ content, components })\n } catch (err) {\n log.warn({ err }, '[discord-agents] Failed to update page')\n }\n }\n}\n\nasync function installAgentWithProgress(\n interaction: ChatInputCommandInteraction | ButtonInteraction,\n adapter: DiscordAdapter,\n nameOrId: string,\n): Promise<void> {\n const catalog = adapter.core.agentCatalog\n\n // Track the latest status for periodic edits\n let statusText = `⏳ Installing **${nameOrId}**...`\n let lastEdit = 0\n const EDIT_THROTTLE_MS = 1500\n\n const editStatus = async (text: string) => {\n const now = Date.now()\n if (now - lastEdit > EDIT_THROTTLE_MS) {\n lastEdit = now\n statusText = text\n try {\n if (interaction.deferred || interaction.replied) {\n await interaction.editReply(text)\n }\n } catch { /* rate limit or unchanged */ }\n } else {\n statusText = text\n }\n }\n\n // Set initial message\n try {\n if (interaction.deferred || interaction.replied) {\n await interaction.editReply(statusText)\n }\n } catch { /* ignore */ }\n\n const progress: InstallProgress = {\n onStart(_id, _name) { /* initial message already sent */ },\n async onStep(step) { await editStatus(`⏳ **${nameOrId}**: ${step}`) },\n async onDownloadProgress(percent) {\n const bar = buildProgressBar(percent)\n await editStatus(`⏳ **${nameOrId}**\\nDownloading... ${bar} ${percent}%`)\n },\n async onSuccess(name) {\n const row = new ActionRowBuilder<ButtonBuilder>().addComponents(\n new ButtonBuilder()\n .setCustomId(`na:${nameOrId}`)\n .setLabel(`🚀 Start session with ${name}`)\n .setStyle(ButtonStyle.Primary),\n )\n try {\n if (interaction.deferred || interaction.replied) {\n await interaction.editReply({\n content: `✅ **${name}** installed!`,\n components: [row],\n })\n }\n } catch { /* ignore */ }\n },\n async onError(error) {\n try {\n if (interaction.deferred || interaction.replied) {\n await interaction.editReply(`❌ ${error}`)\n }\n } catch { /* ignore */ }\n },\n }\n\n const result = await catalog.install(nameOrId, progress)\n\n // Show setup steps as a follow-up message\n if (result.ok && result.setupSteps?.length) {\n let setupText = `📋 **Setup for ${result.agentKey}:**\\n\\n`\n for (const step of result.setupSteps) {\n setupText += `→ ${step}\\n`\n }\n setupText += `\\n*Run in terminal: \\`openacp agents info ${result.agentKey}\\`*`\n try {\n await interaction.followUp({ content: setupText, ephemeral: true })\n } catch { /* ignore */ }\n }\n}\n"],"mappings":"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","names":[]}
|