choavis-agent 1.5.25 → 1.5.26
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/index.js +163 -969
- package/package.json +18 -24
- package/scripts/install.command +0 -0
- package/dist/agent/adapters/claude.d.ts +0 -13
- package/dist/agent/adapters/claude.d.ts.map +0 -1
- package/dist/agent/adapters/claude.js +0 -199
- package/dist/agent/adapters/claude.js.map +0 -1
- package/dist/agent/memory.d.ts +0 -13
- package/dist/agent/memory.d.ts.map +0 -1
- package/dist/agent/memory.js +0 -70
- package/dist/agent/memory.js.map +0 -1
- package/dist/agent/process-pool.d.ts +0 -61
- package/dist/agent/process-pool.d.ts.map +0 -1
- package/dist/agent/process-pool.js +0 -312
- package/dist/agent/process-pool.js.map +0 -1
- package/dist/agent/protocol.d.ts +0 -56
- package/dist/agent/protocol.d.ts.map +0 -1
- package/dist/agent/protocol.js +0 -9
- package/dist/agent/protocol.js.map +0 -1
- package/dist/agent/queue.d.ts +0 -14
- package/dist/agent/queue.d.ts.map +0 -1
- package/dist/agent/queue.js +0 -93
- package/dist/agent/queue.js.map +0 -1
- package/dist/agent/runner.d.ts +0 -49
- package/dist/agent/runner.d.ts.map +0 -1
- package/dist/agent/runner.js +0 -157
- package/dist/agent/runner.js.map +0 -1
- package/dist/agent/session-pool.d.ts +0 -37
- package/dist/agent/session-pool.d.ts.map +0 -1
- package/dist/agent/session-pool.js +0 -214
- package/dist/agent/session-pool.js.map +0 -1
- package/dist/agent/session.d.ts +0 -34
- package/dist/agent/session.d.ts.map +0 -1
- package/dist/agent/session.js +0 -200
- package/dist/agent/session.js.map +0 -1
- package/dist/agent/usage.d.ts +0 -30
- package/dist/agent/usage.d.ts.map +0 -1
- package/dist/agent/usage.js +0 -76
- package/dist/agent/usage.js.map +0 -1
- package/dist/api/server.d.ts +0 -7
- package/dist/api/server.d.ts.map +0 -1
- package/dist/api/server.js +0 -221
- package/dist/api/server.js.map +0 -1
- package/dist/approval/server.d.ts +0 -34
- package/dist/approval/server.d.ts.map +0 -1
- package/dist/approval/server.js +0 -156
- package/dist/approval/server.js.map +0 -1
- package/dist/approval/setup.d.ts +0 -7
- package/dist/approval/setup.d.ts.map +0 -1
- package/dist/approval/setup.js +0 -112
- package/dist/approval/setup.js.map +0 -1
- package/dist/cli/config.d.ts +0 -2
- package/dist/cli/config.d.ts.map +0 -1
- package/dist/cli/config.js +0 -94
- package/dist/cli/config.js.map +0 -1
- package/dist/cli/env.d.ts +0 -3
- package/dist/cli/env.d.ts.map +0 -1
- package/dist/cli/env.js +0 -27
- package/dist/cli/env.js.map +0 -1
- package/dist/cli/help.d.ts +0 -2
- package/dist/cli/help.d.ts.map +0 -1
- package/dist/cli/help.js +0 -27
- package/dist/cli/help.js.map +0 -1
- package/dist/cli/init.d.ts +0 -2
- package/dist/cli/init.d.ts.map +0 -1
- package/dist/cli/init.js +0 -56
- package/dist/cli/init.js.map +0 -1
- package/dist/cli/onboard.d.ts +0 -2
- package/dist/cli/onboard.d.ts.map +0 -1
- package/dist/cli/onboard.js +0 -426
- package/dist/cli/onboard.js.map +0 -1
- package/dist/cli/prompts.d.ts +0 -11
- package/dist/cli/prompts.d.ts.map +0 -1
- package/dist/cli/prompts.js +0 -47
- package/dist/cli/prompts.js.map +0 -1
- package/dist/cli.d.ts +0 -3
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -62307
- package/dist/cli.js.map +0 -1
- package/dist/config.d.ts +0 -42
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -72
- package/dist/config.js.map +0 -1
- package/dist/credentials/atlassian.d.ts +0 -15
- package/dist/credentials/atlassian.d.ts.map +0 -1
- package/dist/credentials/atlassian.js +0 -65
- package/dist/credentials/atlassian.js.map +0 -1
- package/dist/events/bus.d.ts +0 -11
- package/dist/events/bus.d.ts.map +0 -1
- package/dist/events/bus.js +0 -19
- package/dist/events/bus.js.map +0 -1
- package/dist/index.d.ts +0 -2
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/scheduler/briefing.d.ts +0 -7
- package/dist/scheduler/briefing.d.ts.map +0 -1
- package/dist/scheduler/briefing.js +0 -165
- package/dist/scheduler/briefing.js.map +0 -1
- package/dist/slack/agent-executor.d.ts +0 -13
- package/dist/slack/agent-executor.d.ts.map +0 -1
- package/dist/slack/agent-executor.js +0 -283
- package/dist/slack/agent-executor.js.map +0 -1
- package/dist/slack/app.d.ts +0 -3
- package/dist/slack/app.d.ts.map +0 -1
- package/dist/slack/app.js +0 -11
- package/dist/slack/app.js.map +0 -1
- package/dist/slack/approval-actions.d.ts +0 -13
- package/dist/slack/approval-actions.d.ts.map +0 -1
- package/dist/slack/approval-actions.js +0 -199
- package/dist/slack/approval-actions.js.map +0 -1
- package/dist/slack/commands/briefing.d.ts +0 -3
- package/dist/slack/commands/briefing.d.ts.map +0 -1
- package/dist/slack/commands/briefing.js +0 -22
- package/dist/slack/commands/briefing.js.map +0 -1
- package/dist/slack/commands/compact.d.ts +0 -3
- package/dist/slack/commands/compact.d.ts.map +0 -1
- package/dist/slack/commands/compact.js +0 -53
- package/dist/slack/commands/compact.js.map +0 -1
- package/dist/slack/commands/help.d.ts +0 -3
- package/dist/slack/commands/help.d.ts.map +0 -1
- package/dist/slack/commands/help.js +0 -57
- package/dist/slack/commands/help.js.map +0 -1
- package/dist/slack/commands/index.d.ts +0 -7
- package/dist/slack/commands/index.d.ts.map +0 -1
- package/dist/slack/commands/index.js +0 -53
- package/dist/slack/commands/index.js.map +0 -1
- package/dist/slack/commands/inject.d.ts +0 -3
- package/dist/slack/commands/inject.d.ts.map +0 -1
- package/dist/slack/commands/inject.js +0 -44
- package/dist/slack/commands/inject.js.map +0 -1
- package/dist/slack/commands/memory.d.ts +0 -3
- package/dist/slack/commands/memory.d.ts.map +0 -1
- package/dist/slack/commands/memory.js +0 -82
- package/dist/slack/commands/memory.js.map +0 -1
- package/dist/slack/commands/model.d.ts +0 -3
- package/dist/slack/commands/model.d.ts.map +0 -1
- package/dist/slack/commands/model.js +0 -43
- package/dist/slack/commands/model.js.map +0 -1
- package/dist/slack/commands/new.d.ts +0 -3
- package/dist/slack/commands/new.d.ts.map +0 -1
- package/dist/slack/commands/new.js +0 -24
- package/dist/slack/commands/new.js.map +0 -1
- package/dist/slack/commands/permission.d.ts +0 -3
- package/dist/slack/commands/permission.d.ts.map +0 -1
- package/dist/slack/commands/permission.js +0 -51
- package/dist/slack/commands/permission.js.map +0 -1
- package/dist/slack/commands/project.d.ts +0 -3
- package/dist/slack/commands/project.d.ts.map +0 -1
- package/dist/slack/commands/project.js +0 -41
- package/dist/slack/commands/project.js.map +0 -1
- package/dist/slack/commands/resume.d.ts +0 -3
- package/dist/slack/commands/resume.d.ts.map +0 -1
- package/dist/slack/commands/resume.js +0 -93
- package/dist/slack/commands/resume.js.map +0 -1
- package/dist/slack/commands/session-info.d.ts +0 -3
- package/dist/slack/commands/session-info.d.ts.map +0 -1
- package/dist/slack/commands/session-info.js +0 -33
- package/dist/slack/commands/session-info.js.map +0 -1
- package/dist/slack/commands/sessions.d.ts +0 -3
- package/dist/slack/commands/sessions.d.ts.map +0 -1
- package/dist/slack/commands/sessions.js +0 -54
- package/dist/slack/commands/sessions.js.map +0 -1
- package/dist/slack/commands/status.d.ts +0 -3
- package/dist/slack/commands/status.d.ts.map +0 -1
- package/dist/slack/commands/status.js +0 -64
- package/dist/slack/commands/status.js.map +0 -1
- package/dist/slack/commands/stop.d.ts +0 -3
- package/dist/slack/commands/stop.d.ts.map +0 -1
- package/dist/slack/commands/stop.js +0 -31
- package/dist/slack/commands/stop.js.map +0 -1
- package/dist/slack/commands/types.d.ts +0 -22
- package/dist/slack/commands/types.d.ts.map +0 -1
- package/dist/slack/commands/types.js +0 -2
- package/dist/slack/commands/types.js.map +0 -1
- package/dist/slack/commands/usage.d.ts +0 -8
- package/dist/slack/commands/usage.d.ts.map +0 -1
- package/dist/slack/commands/usage.js +0 -143
- package/dist/slack/commands/usage.js.map +0 -1
- package/dist/slack/context.d.ts +0 -16
- package/dist/slack/context.d.ts.map +0 -1
- package/dist/slack/context.js +0 -90
- package/dist/slack/context.js.map +0 -1
- package/dist/slack/file-downloader.d.ts +0 -18
- package/dist/slack/file-downloader.d.ts.map +0 -1
- package/dist/slack/file-downloader.js +0 -196
- package/dist/slack/file-downloader.js.map +0 -1
- package/dist/slack/formatter.d.ts +0 -36
- package/dist/slack/formatter.d.ts.map +0 -1
- package/dist/slack/formatter.js +0 -247
- package/dist/slack/formatter.js.map +0 -1
- package/dist/slack/handlers.d.ts +0 -5
- package/dist/slack/handlers.d.ts.map +0 -1
- package/dist/slack/handlers.js +0 -636
- package/dist/slack/handlers.js.map +0 -1
- package/dist/slack/link-resolver.d.ts +0 -24
- package/dist/slack/link-resolver.d.ts.map +0 -1
- package/dist/slack/link-resolver.js +0 -52
- package/dist/slack/link-resolver.js.map +0 -1
- package/dist/slack/middleware.d.ts +0 -17
- package/dist/slack/middleware.d.ts.map +0 -1
- package/dist/slack/middleware.js +0 -73
- package/dist/slack/middleware.js.map +0 -1
- package/dist/slack/response.d.ts +0 -19
- package/dist/slack/response.d.ts.map +0 -1
- package/dist/slack/response.js +0 -99
- package/dist/slack/response.js.map +0 -1
- package/dist/slack/slack-retry.d.ts +0 -18
- package/dist/slack/slack-retry.d.ts.map +0 -1
- package/dist/slack/slack-retry.js +0 -71
- package/dist/slack/slack-retry.js.map +0 -1
- package/dist/slack/streaming.d.ts +0 -54
- package/dist/slack/streaming.d.ts.map +0 -1
- package/dist/slack/streaming.js +0 -151
- package/dist/slack/streaming.js.map +0 -1
- package/dist/slack/tool-formatter.d.ts +0 -18
- package/dist/slack/tool-formatter.d.ts.map +0 -1
- package/dist/slack/tool-formatter.js +0 -154
- package/dist/slack/tool-formatter.js.map +0 -1
- package/dist/slack/types.d.ts +0 -22
- package/dist/slack/types.d.ts.map +0 -1
- package/dist/slack/types.js +0 -2
- package/dist/slack/types.js.map +0 -1
- package/dist/utils/logger.d.ts +0 -9
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js +0 -49
- package/dist/utils/logger.js.map +0 -1
- package/scripts/pretool-hook.mjs +0 -134
package/dist/index.js
CHANGED
|
@@ -112,7 +112,7 @@ var require_main = __commonJS({
|
|
|
112
112
|
var fs = __require("fs");
|
|
113
113
|
var path = __require("path");
|
|
114
114
|
var os = __require("os");
|
|
115
|
-
var
|
|
115
|
+
var crypto = __require("crypto");
|
|
116
116
|
var packageJson = require_package();
|
|
117
117
|
var version = packageJson.version;
|
|
118
118
|
var LINE = /(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/mg;
|
|
@@ -331,7 +331,7 @@ var require_main = __commonJS({
|
|
|
331
331
|
const authTag = ciphertext.subarray(-16);
|
|
332
332
|
ciphertext = ciphertext.subarray(12, -16);
|
|
333
333
|
try {
|
|
334
|
-
const aesgcm =
|
|
334
|
+
const aesgcm = crypto.createDecipheriv("aes-256-gcm", key, nonce);
|
|
335
335
|
aesgcm.setAuthTag(authTag);
|
|
336
336
|
return `${aesgcm.update(ciphertext)}${aesgcm.final()}`;
|
|
337
337
|
} catch (error) {
|
|
@@ -10995,7 +10995,7 @@ var require_form_data = __commonJS({
|
|
|
10995
10995
|
var parseUrl2 = __require("url").parse;
|
|
10996
10996
|
var fs = __require("fs");
|
|
10997
10997
|
var Stream = __require("stream").Stream;
|
|
10998
|
-
var
|
|
10998
|
+
var crypto = __require("crypto");
|
|
10999
10999
|
var mime = require_mime_types();
|
|
11000
11000
|
var asynckit = require_asynckit();
|
|
11001
11001
|
var setToStringTag = require_es_set_tostringtag();
|
|
@@ -11201,7 +11201,7 @@ var require_form_data = __commonJS({
|
|
|
11201
11201
|
return Buffer.concat([dataBuffer, Buffer.from(this._lastBoundary())]);
|
|
11202
11202
|
};
|
|
11203
11203
|
FormData2.prototype._generateBoundary = function() {
|
|
11204
|
-
this._boundary = "--------------------------" +
|
|
11204
|
+
this._boundary = "--------------------------" + crypto.randomBytes(12).toString("hex");
|
|
11205
11205
|
};
|
|
11206
11206
|
FormData2.prototype.getLengthSync = function() {
|
|
11207
11207
|
var knownLength = this._overheadLength + this._valueLength;
|
|
@@ -11968,7 +11968,7 @@ var require_node = __commonJS({
|
|
|
11968
11968
|
var tty = __require("tty");
|
|
11969
11969
|
var util = __require("util");
|
|
11970
11970
|
exports.init = init;
|
|
11971
|
-
exports.log =
|
|
11971
|
+
exports.log = log15;
|
|
11972
11972
|
exports.formatArgs = formatArgs;
|
|
11973
11973
|
exports.save = save;
|
|
11974
11974
|
exports.load = load;
|
|
@@ -12103,7 +12103,7 @@ var require_node = __commonJS({
|
|
|
12103
12103
|
}
|
|
12104
12104
|
return (/* @__PURE__ */ new Date()).toISOString() + " ";
|
|
12105
12105
|
}
|
|
12106
|
-
function
|
|
12106
|
+
function log15(...args) {
|
|
12107
12107
|
return process.stderr.write(util.formatWithOptions(exports.inspectOpts, ...args) + "\n");
|
|
12108
12108
|
}
|
|
12109
12109
|
function save(namespaces) {
|
|
@@ -12668,7 +12668,7 @@ var require_axios = __commonJS({
|
|
|
12668
12668
|
"node_modules/.pnpm/axios@1.13.5/node_modules/axios/dist/node/axios.cjs"(exports, module) {
|
|
12669
12669
|
"use strict";
|
|
12670
12670
|
var FormData$1 = require_form_data();
|
|
12671
|
-
var
|
|
12671
|
+
var crypto = __require("crypto");
|
|
12672
12672
|
var url = __require("url");
|
|
12673
12673
|
var proxyFromEnv = require_proxy_from_env();
|
|
12674
12674
|
var http = __require("http");
|
|
@@ -12683,7 +12683,7 @@ var require_axios = __commonJS({
|
|
|
12683
12683
|
return e2 && typeof e2 === "object" && "default" in e2 ? e2 : { "default": e2 };
|
|
12684
12684
|
}
|
|
12685
12685
|
var FormData__default = /* @__PURE__ */ _interopDefaultLegacy(FormData$1);
|
|
12686
|
-
var crypto__default = /* @__PURE__ */ _interopDefaultLegacy(
|
|
12686
|
+
var crypto__default = /* @__PURE__ */ _interopDefaultLegacy(crypto);
|
|
12687
12687
|
var url__default = /* @__PURE__ */ _interopDefaultLegacy(url);
|
|
12688
12688
|
var proxyFromEnv__default = /* @__PURE__ */ _interopDefaultLegacy(proxyFromEnv);
|
|
12689
12689
|
var http__default = /* @__PURE__ */ _interopDefaultLegacy(http);
|
|
@@ -22112,14 +22112,14 @@ var require_buffer_equal_constant_time = __commonJS({
|
|
|
22112
22112
|
var require_jwa = __commonJS({
|
|
22113
22113
|
"node_modules/.pnpm/jwa@2.0.1/node_modules/jwa/index.js"(exports, module) {
|
|
22114
22114
|
var Buffer2 = require_safe_buffer().Buffer;
|
|
22115
|
-
var
|
|
22115
|
+
var crypto = __require("crypto");
|
|
22116
22116
|
var formatEcdsa = require_ecdsa_sig_formatter();
|
|
22117
22117
|
var util = __require("util");
|
|
22118
22118
|
var MSG_INVALID_ALGORITHM = '"%s" is not a valid algorithm.\n Supported algorithms are:\n "HS256", "HS384", "HS512", "RS256", "RS384", "RS512", "PS256", "PS384", "PS512", "ES256", "ES384", "ES512" and "none".';
|
|
22119
22119
|
var MSG_INVALID_SECRET = "secret must be a string or buffer";
|
|
22120
22120
|
var MSG_INVALID_VERIFIER_KEY = "key must be a string or a buffer";
|
|
22121
22121
|
var MSG_INVALID_SIGNER_KEY = "key must be a string, a buffer or an object";
|
|
22122
|
-
var supportsKeyObjects = typeof
|
|
22122
|
+
var supportsKeyObjects = typeof crypto.createPublicKey === "function";
|
|
22123
22123
|
if (supportsKeyObjects) {
|
|
22124
22124
|
MSG_INVALID_VERIFIER_KEY += " or a KeyObject";
|
|
22125
22125
|
MSG_INVALID_SECRET += "or a KeyObject";
|
|
@@ -22209,17 +22209,17 @@ var require_jwa = __commonJS({
|
|
|
22209
22209
|
return function sign(thing, secret) {
|
|
22210
22210
|
checkIsSecretKey(secret);
|
|
22211
22211
|
thing = normalizeInput(thing);
|
|
22212
|
-
var hmac =
|
|
22212
|
+
var hmac = crypto.createHmac("sha" + bits, secret);
|
|
22213
22213
|
var sig = (hmac.update(thing), hmac.digest("base64"));
|
|
22214
22214
|
return fromBase64(sig);
|
|
22215
22215
|
};
|
|
22216
22216
|
}
|
|
22217
22217
|
var bufferEqual;
|
|
22218
|
-
var timingSafeEqual = "timingSafeEqual" in
|
|
22218
|
+
var timingSafeEqual = "timingSafeEqual" in crypto ? function timingSafeEqual2(a2, b2) {
|
|
22219
22219
|
if (a2.byteLength !== b2.byteLength) {
|
|
22220
22220
|
return false;
|
|
22221
22221
|
}
|
|
22222
|
-
return
|
|
22222
|
+
return crypto.timingSafeEqual(a2, b2);
|
|
22223
22223
|
} : function timingSafeEqual2(a2, b2) {
|
|
22224
22224
|
if (!bufferEqual) {
|
|
22225
22225
|
bufferEqual = require_buffer_equal_constant_time();
|
|
@@ -22236,7 +22236,7 @@ var require_jwa = __commonJS({
|
|
|
22236
22236
|
return function sign(thing, privateKey) {
|
|
22237
22237
|
checkIsPrivateKey(privateKey);
|
|
22238
22238
|
thing = normalizeInput(thing);
|
|
22239
|
-
var signer =
|
|
22239
|
+
var signer = crypto.createSign("RSA-SHA" + bits);
|
|
22240
22240
|
var sig = (signer.update(thing), signer.sign(privateKey, "base64"));
|
|
22241
22241
|
return fromBase64(sig);
|
|
22242
22242
|
};
|
|
@@ -22246,7 +22246,7 @@ var require_jwa = __commonJS({
|
|
|
22246
22246
|
checkIsPublicKey(publicKey);
|
|
22247
22247
|
thing = normalizeInput(thing);
|
|
22248
22248
|
signature = toBase64(signature);
|
|
22249
|
-
var verifier =
|
|
22249
|
+
var verifier = crypto.createVerify("RSA-SHA" + bits);
|
|
22250
22250
|
verifier.update(thing);
|
|
22251
22251
|
return verifier.verify(publicKey, signature, "base64");
|
|
22252
22252
|
};
|
|
@@ -22255,11 +22255,11 @@ var require_jwa = __commonJS({
|
|
|
22255
22255
|
return function sign(thing, privateKey) {
|
|
22256
22256
|
checkIsPrivateKey(privateKey);
|
|
22257
22257
|
thing = normalizeInput(thing);
|
|
22258
|
-
var signer =
|
|
22258
|
+
var signer = crypto.createSign("RSA-SHA" + bits);
|
|
22259
22259
|
var sig = (signer.update(thing), signer.sign({
|
|
22260
22260
|
key: privateKey,
|
|
22261
|
-
padding:
|
|
22262
|
-
saltLength:
|
|
22261
|
+
padding: crypto.constants.RSA_PKCS1_PSS_PADDING,
|
|
22262
|
+
saltLength: crypto.constants.RSA_PSS_SALTLEN_DIGEST
|
|
22263
22263
|
}, "base64"));
|
|
22264
22264
|
return fromBase64(sig);
|
|
22265
22265
|
};
|
|
@@ -22269,12 +22269,12 @@ var require_jwa = __commonJS({
|
|
|
22269
22269
|
checkIsPublicKey(publicKey);
|
|
22270
22270
|
thing = normalizeInput(thing);
|
|
22271
22271
|
signature = toBase64(signature);
|
|
22272
|
-
var verifier =
|
|
22272
|
+
var verifier = crypto.createVerify("RSA-SHA" + bits);
|
|
22273
22273
|
verifier.update(thing);
|
|
22274
22274
|
return verifier.verify({
|
|
22275
22275
|
key: publicKey,
|
|
22276
|
-
padding:
|
|
22277
|
-
saltLength:
|
|
22276
|
+
padding: crypto.constants.RSA_PKCS1_PSS_PADDING,
|
|
22277
|
+
saltLength: crypto.constants.RSA_PSS_SALTLEN_DIGEST
|
|
22278
22278
|
}, signature, "base64");
|
|
22279
22279
|
};
|
|
22280
22280
|
}
|
|
@@ -27266,7 +27266,7 @@ var require_depd = __commonJS({
|
|
|
27266
27266
|
var site = callSiteLocation(stack[1]);
|
|
27267
27267
|
var file = site[0];
|
|
27268
27268
|
function deprecate(message) {
|
|
27269
|
-
|
|
27269
|
+
log15.call(deprecate, message);
|
|
27270
27270
|
}
|
|
27271
27271
|
deprecate._file = file;
|
|
27272
27272
|
deprecate._ignored = isignored(namespace);
|
|
@@ -27295,7 +27295,7 @@ var require_depd = __commonJS({
|
|
|
27295
27295
|
var str = process.env.TRACE_DEPRECATION || "";
|
|
27296
27296
|
return containsNamespace(str, namespace);
|
|
27297
27297
|
}
|
|
27298
|
-
function
|
|
27298
|
+
function log15(message, site) {
|
|
27299
27299
|
var haslisteners = eehaslisteners(process, "deprecation");
|
|
27300
27300
|
if (!haslisteners && this._ignored) {
|
|
27301
27301
|
return;
|
|
@@ -27435,7 +27435,7 @@ var require_depd = __commonJS({
|
|
|
27435
27435
|
"message",
|
|
27436
27436
|
"site",
|
|
27437
27437
|
'"use strict"\nreturn function (' + args + ") {log.call(deprecate, message, site)\nreturn fn.apply(this, arguments)\n}"
|
|
27438
|
-
)(fn,
|
|
27438
|
+
)(fn, log15, this, message, site);
|
|
27439
27439
|
return deprecatedfn;
|
|
27440
27440
|
}
|
|
27441
27441
|
function wrapproperty(obj, prop, message) {
|
|
@@ -27460,13 +27460,13 @@ var require_depd = __commonJS({
|
|
|
27460
27460
|
var set = descriptor.set;
|
|
27461
27461
|
if (typeof get === "function") {
|
|
27462
27462
|
descriptor.get = function getter() {
|
|
27463
|
-
|
|
27463
|
+
log15.call(deprecate, message, site);
|
|
27464
27464
|
return get.apply(this, arguments);
|
|
27465
27465
|
};
|
|
27466
27466
|
}
|
|
27467
27467
|
if (typeof set === "function") {
|
|
27468
27468
|
descriptor.set = function setter() {
|
|
27469
|
-
|
|
27469
|
+
log15.call(deprecate, message, site);
|
|
27470
27470
|
return set.apply(this, arguments);
|
|
27471
27471
|
};
|
|
27472
27472
|
}
|
|
@@ -31912,13 +31912,13 @@ var require_raw_body = __commonJS({
|
|
|
31912
31912
|
var require_lib2 = __commonJS({
|
|
31913
31913
|
"node_modules/.pnpm/tsscmp@1.0.6/node_modules/tsscmp/lib/index.js"(exports, module) {
|
|
31914
31914
|
"use strict";
|
|
31915
|
-
var
|
|
31915
|
+
var crypto = __require("crypto");
|
|
31916
31916
|
function bufferEqual(a2, b2) {
|
|
31917
31917
|
if (a2.length !== b2.length) {
|
|
31918
31918
|
return false;
|
|
31919
31919
|
}
|
|
31920
|
-
if (
|
|
31921
|
-
return
|
|
31920
|
+
if (crypto.timingSafeEqual) {
|
|
31921
|
+
return crypto.timingSafeEqual(a2, b2);
|
|
31922
31922
|
}
|
|
31923
31923
|
for (var i2 = 0; i2 < a2.length; i2++) {
|
|
31924
31924
|
if (a2[i2] !== b2[i2]) {
|
|
@@ -31930,9 +31930,9 @@ var require_lib2 = __commonJS({
|
|
|
31930
31930
|
function timeSafeCompare(a2, b2) {
|
|
31931
31931
|
var sa = String(a2);
|
|
31932
31932
|
var sb = String(b2);
|
|
31933
|
-
var key =
|
|
31934
|
-
var ah =
|
|
31935
|
-
var bh =
|
|
31933
|
+
var key = crypto.pseudoRandomBytes(32);
|
|
31934
|
+
var ah = crypto.createHmac("sha256", key).update(sa).digest();
|
|
31935
|
+
var bh = crypto.createHmac("sha256", key).update(sb).digest();
|
|
31936
31936
|
return bufferEqual(ah, bh) && a2 === b2;
|
|
31937
31937
|
}
|
|
31938
31938
|
module.exports = timeSafeCompare;
|
|
@@ -50869,10 +50869,10 @@ var require_view2 = __commonJS({
|
|
|
50869
50869
|
var debug = require_src()("express:view");
|
|
50870
50870
|
var path = __require("node:path");
|
|
50871
50871
|
var fs = __require("node:fs");
|
|
50872
|
-
var
|
|
50872
|
+
var dirname5 = path.dirname;
|
|
50873
50873
|
var basename = path.basename;
|
|
50874
50874
|
var extname2 = path.extname;
|
|
50875
|
-
var
|
|
50875
|
+
var join6 = path.join;
|
|
50876
50876
|
var resolve5 = path.resolve;
|
|
50877
50877
|
module.exports = View;
|
|
50878
50878
|
function View(name, options) {
|
|
@@ -50908,7 +50908,7 @@ var require_view2 = __commonJS({
|
|
|
50908
50908
|
for (var i2 = 0; i2 < roots.length && !path2; i2++) {
|
|
50909
50909
|
var root = roots[i2];
|
|
50910
50910
|
var loc = resolve5(root, name);
|
|
50911
|
-
var dir =
|
|
50911
|
+
var dir = dirname5(loc);
|
|
50912
50912
|
var file = basename(loc);
|
|
50913
50913
|
path2 = this.resolve(dir, file);
|
|
50914
50914
|
}
|
|
@@ -50934,12 +50934,12 @@ var require_view2 = __commonJS({
|
|
|
50934
50934
|
};
|
|
50935
50935
|
View.prototype.resolve = function resolve6(dir, file) {
|
|
50936
50936
|
var ext = this.ext;
|
|
50937
|
-
var path2 =
|
|
50937
|
+
var path2 = join6(dir, file);
|
|
50938
50938
|
var stat = tryStat(path2);
|
|
50939
50939
|
if (stat && stat.isFile()) {
|
|
50940
50940
|
return path2;
|
|
50941
50941
|
}
|
|
50942
|
-
path2 =
|
|
50942
|
+
path2 = join6(dir, basename(file, ext), "index" + ext);
|
|
50943
50943
|
stat = tryStat(path2);
|
|
50944
50944
|
if (stat && stat.isFile()) {
|
|
50945
50945
|
return path2;
|
|
@@ -50961,14 +50961,14 @@ var require_etag = __commonJS({
|
|
|
50961
50961
|
"node_modules/.pnpm/etag@1.8.1/node_modules/etag/index.js"(exports, module) {
|
|
50962
50962
|
"use strict";
|
|
50963
50963
|
module.exports = etag;
|
|
50964
|
-
var
|
|
50964
|
+
var crypto = __require("crypto");
|
|
50965
50965
|
var Stats = __require("fs").Stats;
|
|
50966
50966
|
var toString = Object.prototype.toString;
|
|
50967
50967
|
function entitytag(entity) {
|
|
50968
50968
|
if (entity.length === 0) {
|
|
50969
50969
|
return '"0-2jmj7l5rSw0yVb/vlWAYkK/YBwk"';
|
|
50970
50970
|
}
|
|
50971
|
-
var hash =
|
|
50971
|
+
var hash = crypto.createHash("sha1").update(entity, "utf8").digest("base64").substring(0, 27);
|
|
50972
50972
|
var len = typeof entity === "string" ? Buffer.byteLength(entity, "utf8") : entity.length;
|
|
50973
50973
|
return '"' + len.toString(16) + "-" + hash + '"';
|
|
50974
50974
|
}
|
|
@@ -54028,17 +54028,17 @@ var require_content_disposition = __commonJS({
|
|
|
54028
54028
|
// node_modules/.pnpm/cookie-signature@1.2.2/node_modules/cookie-signature/index.js
|
|
54029
54029
|
var require_cookie_signature = __commonJS({
|
|
54030
54030
|
"node_modules/.pnpm/cookie-signature@1.2.2/node_modules/cookie-signature/index.js"(exports) {
|
|
54031
|
-
var
|
|
54031
|
+
var crypto = __require("crypto");
|
|
54032
54032
|
exports.sign = function(val, secret) {
|
|
54033
54033
|
if ("string" != typeof val) throw new TypeError("Cookie value must be provided as a string.");
|
|
54034
54034
|
if (null == secret) throw new TypeError("Secret key must be provided.");
|
|
54035
|
-
return val + "." +
|
|
54035
|
+
return val + "." + crypto.createHmac("sha256", secret).update(val).digest("base64").replace(/\=+$/, "");
|
|
54036
54036
|
};
|
|
54037
54037
|
exports.unsign = function(input, secret) {
|
|
54038
54038
|
if ("string" != typeof input) throw new TypeError("Signed cookie string must be provided.");
|
|
54039
54039
|
if (null == secret) throw new TypeError("Secret key must be provided.");
|
|
54040
54040
|
var tentativeValue = input.slice(0, input.lastIndexOf(".")), expectedInput = exports.sign(tentativeValue, secret), expectedBuffer = Buffer.from(expectedInput), inputBuffer = Buffer.from(input);
|
|
54041
|
-
return expectedBuffer.length === inputBuffer.length &&
|
|
54041
|
+
return expectedBuffer.length === inputBuffer.length && crypto.timingSafeEqual(expectedBuffer, inputBuffer) ? tentativeValue : false;
|
|
54042
54042
|
};
|
|
54043
54043
|
}
|
|
54044
54044
|
});
|
|
@@ -54229,7 +54229,7 @@ var require_send = __commonJS({
|
|
|
54229
54229
|
var Stream = __require("stream");
|
|
54230
54230
|
var util = __require("util");
|
|
54231
54231
|
var extname2 = path.extname;
|
|
54232
|
-
var
|
|
54232
|
+
var join6 = path.join;
|
|
54233
54233
|
var normalize = path.normalize;
|
|
54234
54234
|
var resolve5 = path.resolve;
|
|
54235
54235
|
var sep = path.sep;
|
|
@@ -54401,7 +54401,7 @@ var require_send = __commonJS({
|
|
|
54401
54401
|
return res;
|
|
54402
54402
|
}
|
|
54403
54403
|
parts = path2.split(sep);
|
|
54404
|
-
path2 = normalize(
|
|
54404
|
+
path2 = normalize(join6(root, path2));
|
|
54405
54405
|
} else {
|
|
54406
54406
|
if (UP_PATH_REGEXP.test(path2)) {
|
|
54407
54407
|
debug('malicious path "%s"', path2);
|
|
@@ -54534,7 +54534,7 @@ var require_send = __commonJS({
|
|
|
54534
54534
|
if (err) return self2.onStatError(err);
|
|
54535
54535
|
return self2.error(404);
|
|
54536
54536
|
}
|
|
54537
|
-
var p2 =
|
|
54537
|
+
var p2 = join6(path2, self2._index[i2]);
|
|
54538
54538
|
debug('stat "%s"', p2);
|
|
54539
54539
|
fs.stat(p2, function(err2, stat) {
|
|
54540
54540
|
if (err2) return next(err2);
|
|
@@ -56601,8 +56601,6 @@ var init_config = __esm({
|
|
|
56601
56601
|
workDir: process.env.AGENT_WORK_DIR || process.cwd(),
|
|
56602
56602
|
claudePath: process.env.CLAUDE_PATH || "claude",
|
|
56603
56603
|
model: process.env.CLAUDE_MODEL || "",
|
|
56604
|
-
permissionMode: process.env.AGENT_PERMISSION_MODE || "bypassPermissions",
|
|
56605
|
-
backend: process.env.AGENT_BACKEND || "sdk",
|
|
56606
56604
|
idleCheckInterval: 18e4,
|
|
56607
56605
|
// 3분 — subprocess 응답 없음 체크 간격
|
|
56608
56606
|
maxIdleChecks: 10,
|
|
@@ -65706,7 +65704,7 @@ function writeLog(entry) {
|
|
|
65706
65704
|
}
|
|
65707
65705
|
}
|
|
65708
65706
|
function createLogger(module) {
|
|
65709
|
-
function
|
|
65707
|
+
function log15(level, message, data) {
|
|
65710
65708
|
if (!shouldLog(level)) return;
|
|
65711
65709
|
const entry = {
|
|
65712
65710
|
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
@@ -65720,10 +65718,10 @@ function createLogger(module) {
|
|
|
65720
65718
|
writeLog(entry);
|
|
65721
65719
|
}
|
|
65722
65720
|
return {
|
|
65723
|
-
debug: (message, data) =>
|
|
65724
|
-
info: (message, data) =>
|
|
65725
|
-
warn: (message, data) =>
|
|
65726
|
-
error: (message, data) =>
|
|
65721
|
+
debug: (message, data) => log15("debug", message, data),
|
|
65722
|
+
info: (message, data) => log15("info", message, data),
|
|
65723
|
+
warn: (message, data) => log15("warn", message, data),
|
|
65724
|
+
error: (message, data) => log15("error", message, data)
|
|
65727
65725
|
};
|
|
65728
65726
|
}
|
|
65729
65727
|
var LOG_LEVEL_PRIORITY, minLogLevel;
|
|
@@ -65746,176 +65744,8 @@ var init_logger = __esm({
|
|
|
65746
65744
|
}
|
|
65747
65745
|
});
|
|
65748
65746
|
|
|
65749
|
-
// src/agent/adapters/claude.ts
|
|
65750
|
-
function extractFileInfo(toolName, toolInput) {
|
|
65751
|
-
const filePath = toolInput.file_path || toolInput.notebook_path || null;
|
|
65752
|
-
if (!filePath) return null;
|
|
65753
|
-
const actionMap = {
|
|
65754
|
-
Read: "read",
|
|
65755
|
-
Write: "write",
|
|
65756
|
-
Edit: "edit",
|
|
65757
|
-
MultiEdit: "edit",
|
|
65758
|
-
NotebookEdit: "edit"
|
|
65759
|
-
};
|
|
65760
|
-
const action = actionMap[toolName];
|
|
65761
|
-
if (!action) return null;
|
|
65762
|
-
return { path: filePath, action };
|
|
65763
|
-
}
|
|
65764
|
-
function extractToolUse(raw) {
|
|
65765
|
-
if (raw.type === "tool_use") {
|
|
65766
|
-
const toolName = raw.tool_name || raw.name || "unknown";
|
|
65767
|
-
const toolInput = raw.tool_input || raw.input || {};
|
|
65768
|
-
return { toolName, toolInput };
|
|
65769
|
-
}
|
|
65770
|
-
if (raw.type === "content_block_start") {
|
|
65771
|
-
const block = raw.content_block;
|
|
65772
|
-
if (block?.type === "tool_use" && block.name) {
|
|
65773
|
-
return {
|
|
65774
|
-
toolName: block.name,
|
|
65775
|
-
toolInput: block.input || {}
|
|
65776
|
-
};
|
|
65777
|
-
}
|
|
65778
|
-
}
|
|
65779
|
-
return null;
|
|
65780
|
-
}
|
|
65781
|
-
function extractErrorText(event) {
|
|
65782
|
-
const content = event.message?.content;
|
|
65783
|
-
if (!Array.isArray(content)) return "Unknown error";
|
|
65784
|
-
return content.filter((c2) => c2.type === "text").map((c2) => c2.text || "").join("");
|
|
65785
|
-
}
|
|
65786
|
-
async function* adaptClaude(rawStream) {
|
|
65787
|
-
let didEmitTurnStart = false;
|
|
65788
|
-
for await (const raw of rawStream) {
|
|
65789
|
-
const ts = Date.now();
|
|
65790
|
-
if (raw.type === "system" && raw.subtype === "init") {
|
|
65791
|
-
yield {
|
|
65792
|
-
type: "start",
|
|
65793
|
-
timestamp: ts,
|
|
65794
|
-
sessionId: raw.session_id,
|
|
65795
|
-
_raw: raw
|
|
65796
|
-
};
|
|
65797
|
-
continue;
|
|
65798
|
-
}
|
|
65799
|
-
if (raw.type === "assistant") {
|
|
65800
|
-
if (!didEmitTurnStart) {
|
|
65801
|
-
didEmitTurnStart = true;
|
|
65802
|
-
yield { type: "turn-start", timestamp: ts };
|
|
65803
|
-
}
|
|
65804
|
-
const msg = raw.message;
|
|
65805
|
-
if (msg?.content && Array.isArray(msg.content)) {
|
|
65806
|
-
const fullText = msg.content.filter((block) => block.type === "text" && block.text).map((block) => block.text).join("");
|
|
65807
|
-
if (fullText) {
|
|
65808
|
-
yield {
|
|
65809
|
-
type: "text",
|
|
65810
|
-
timestamp: ts,
|
|
65811
|
-
text: { content: fullText, replace: true },
|
|
65812
|
-
_raw: raw
|
|
65813
|
-
};
|
|
65814
|
-
}
|
|
65815
|
-
for (const block of msg.content) {
|
|
65816
|
-
if (block.type === "tool_use" && block.name) {
|
|
65817
|
-
const toolInput = block.input || {};
|
|
65818
|
-
yield {
|
|
65819
|
-
type: "tool-call-start",
|
|
65820
|
-
timestamp: ts,
|
|
65821
|
-
tool: { toolName: block.name, toolInput }
|
|
65822
|
-
};
|
|
65823
|
-
const fileInfo = extractFileInfo(block.name, toolInput);
|
|
65824
|
-
if (fileInfo) {
|
|
65825
|
-
yield { type: "file", timestamp: ts, file: fileInfo };
|
|
65826
|
-
}
|
|
65827
|
-
}
|
|
65828
|
-
}
|
|
65829
|
-
}
|
|
65830
|
-
continue;
|
|
65831
|
-
}
|
|
65832
|
-
if (raw.type === "content_block_delta" && raw.delta?.text) {
|
|
65833
|
-
if (!didEmitTurnStart) {
|
|
65834
|
-
didEmitTurnStart = true;
|
|
65835
|
-
yield { type: "turn-start", timestamp: ts };
|
|
65836
|
-
}
|
|
65837
|
-
yield {
|
|
65838
|
-
type: "text",
|
|
65839
|
-
timestamp: ts,
|
|
65840
|
-
text: { content: raw.delta.text, replace: false },
|
|
65841
|
-
_raw: raw
|
|
65842
|
-
};
|
|
65843
|
-
continue;
|
|
65844
|
-
}
|
|
65845
|
-
{
|
|
65846
|
-
const toolInfo = extractToolUse(raw);
|
|
65847
|
-
if (toolInfo) {
|
|
65848
|
-
yield {
|
|
65849
|
-
type: "tool-call-start",
|
|
65850
|
-
timestamp: ts,
|
|
65851
|
-
tool: toolInfo,
|
|
65852
|
-
_raw: raw
|
|
65853
|
-
};
|
|
65854
|
-
const fileInfo = extractFileInfo(toolInfo.toolName, toolInfo.toolInput);
|
|
65855
|
-
if (fileInfo) {
|
|
65856
|
-
yield {
|
|
65857
|
-
type: "file",
|
|
65858
|
-
timestamp: ts,
|
|
65859
|
-
file: fileInfo
|
|
65860
|
-
};
|
|
65861
|
-
}
|
|
65862
|
-
continue;
|
|
65863
|
-
}
|
|
65864
|
-
}
|
|
65865
|
-
if (raw.type === "result") {
|
|
65866
|
-
const turnEnd = {
|
|
65867
|
-
type: "turn-end",
|
|
65868
|
-
timestamp: ts,
|
|
65869
|
-
sessionId: raw.session_id,
|
|
65870
|
-
turn: {
|
|
65871
|
-
result: raw.result
|
|
65872
|
-
},
|
|
65873
|
-
_raw: raw
|
|
65874
|
-
};
|
|
65875
|
-
if (raw.usage) {
|
|
65876
|
-
turnEnd.turn.usage = {
|
|
65877
|
-
inputTokens: raw.usage.input_tokens || 0,
|
|
65878
|
-
outputTokens: raw.usage.output_tokens || 0,
|
|
65879
|
-
model: raw.model
|
|
65880
|
-
};
|
|
65881
|
-
}
|
|
65882
|
-
yield turnEnd;
|
|
65883
|
-
didEmitTurnStart = false;
|
|
65884
|
-
continue;
|
|
65885
|
-
}
|
|
65886
|
-
if (raw.type === "error") {
|
|
65887
|
-
const message = extractErrorText(raw);
|
|
65888
|
-
const errorType = raw.errorType;
|
|
65889
|
-
const retryable = errorType === "transient";
|
|
65890
|
-
yield {
|
|
65891
|
-
type: "service",
|
|
65892
|
-
timestamp: ts,
|
|
65893
|
-
service: {
|
|
65894
|
-
message,
|
|
65895
|
-
severity: "error",
|
|
65896
|
-
errorType,
|
|
65897
|
-
retryable
|
|
65898
|
-
},
|
|
65899
|
-
_raw: raw
|
|
65900
|
-
};
|
|
65901
|
-
continue;
|
|
65902
|
-
}
|
|
65903
|
-
if (raw.type !== "content_block_delta" && raw.type !== "content_block_stop") {
|
|
65904
|
-
log.info("unhandled event", { type: raw.type, subtype: raw.subtype });
|
|
65905
|
-
}
|
|
65906
|
-
}
|
|
65907
|
-
}
|
|
65908
|
-
var log;
|
|
65909
|
-
var init_claude = __esm({
|
|
65910
|
-
"src/agent/adapters/claude.ts"() {
|
|
65911
|
-
"use strict";
|
|
65912
|
-
init_logger();
|
|
65913
|
-
log = createLogger("adapter:claude");
|
|
65914
|
-
}
|
|
65915
|
-
});
|
|
65916
|
-
|
|
65917
65747
|
// src/agent/adapters/sdk.ts
|
|
65918
|
-
function
|
|
65748
|
+
function extractFileInfo(toolName, toolInput) {
|
|
65919
65749
|
const filePath = toolInput.file_path || toolInput.notebook_path || null;
|
|
65920
65750
|
if (!filePath) return null;
|
|
65921
65751
|
const actionMap = {
|
|
@@ -65979,7 +65809,7 @@ async function* adaptSdk(sdkStream) {
|
|
|
65979
65809
|
timestamp: ts,
|
|
65980
65810
|
tool: { toolName: block.name, toolInput }
|
|
65981
65811
|
};
|
|
65982
|
-
const fileInfo =
|
|
65812
|
+
const fileInfo = extractFileInfo(block.name, toolInput);
|
|
65983
65813
|
if (fileInfo) {
|
|
65984
65814
|
yield { type: "file", timestamp: ts, file: fileInfo };
|
|
65985
65815
|
}
|
|
@@ -66013,7 +65843,7 @@ async function* adaptSdk(sdkStream) {
|
|
|
66013
65843
|
tool: { toolName, toolInput },
|
|
66014
65844
|
_raw: msg
|
|
66015
65845
|
};
|
|
66016
|
-
const fileInfo =
|
|
65846
|
+
const fileInfo = extractFileInfo(toolName, toolInput);
|
|
66017
65847
|
if (fileInfo) {
|
|
66018
65848
|
yield { type: "file", timestamp: ts, file: fileInfo };
|
|
66019
65849
|
}
|
|
@@ -66079,16 +65909,16 @@ async function* adaptSdk(sdkStream) {
|
|
|
66079
65909
|
continue;
|
|
66080
65910
|
}
|
|
66081
65911
|
if (msg.type !== "user" && msg.type !== "compact_boundary") {
|
|
66082
|
-
|
|
65912
|
+
log.info("unhandled SDK event", { type: msg.type });
|
|
66083
65913
|
}
|
|
66084
65914
|
}
|
|
66085
65915
|
}
|
|
66086
|
-
var
|
|
65916
|
+
var log;
|
|
66087
65917
|
var init_sdk2 = __esm({
|
|
66088
65918
|
"src/agent/adapters/sdk.ts"() {
|
|
66089
65919
|
"use strict";
|
|
66090
65920
|
init_logger();
|
|
66091
|
-
|
|
65921
|
+
log = createLogger("adapter:sdk");
|
|
66092
65922
|
}
|
|
66093
65923
|
});
|
|
66094
65924
|
|
|
@@ -66136,26 +65966,8 @@ var init_skills = __esm({
|
|
|
66136
65966
|
});
|
|
66137
65967
|
|
|
66138
65968
|
// src/agent/runner.ts
|
|
66139
|
-
import { spawn } from "node:child_process";
|
|
66140
|
-
import { createInterface } from "node:readline";
|
|
66141
|
-
function classifyError(exitCode, stderr) {
|
|
66142
|
-
if (stderr.includes("context window") || stderr.includes("too many tokens") || stderr.includes("context_length_exceeded")) {
|
|
66143
|
-
return "context_overflow";
|
|
66144
|
-
}
|
|
66145
|
-
if (stderr.includes("session") && (stderr.includes("corrupt") || stderr.includes("invalid") || stderr.includes("not found"))) {
|
|
66146
|
-
return "session_corrupt";
|
|
66147
|
-
}
|
|
66148
|
-
if (exitCode === 1 && (stderr.includes("network") || stderr.includes("timeout") || stderr.includes("ECONNREFUSED") || stderr.includes("ETIMEDOUT"))) {
|
|
66149
|
-
return "transient";
|
|
66150
|
-
}
|
|
66151
|
-
return "fatal";
|
|
66152
|
-
}
|
|
66153
65969
|
function runSession(options) {
|
|
66154
|
-
|
|
66155
|
-
return runWithSdk(options);
|
|
66156
|
-
}
|
|
66157
|
-
const { stream, kill } = runAgent(options);
|
|
66158
|
-
return { stream: adaptClaude(stream), kill };
|
|
65970
|
+
return runWithSdk(options);
|
|
66159
65971
|
}
|
|
66160
65972
|
function runWithSdk(options) {
|
|
66161
65973
|
if (options.abortSignal?.aborted) {
|
|
@@ -66175,16 +65987,14 @@ function runWithSdk(options) {
|
|
|
66175
65987
|
} };
|
|
66176
65988
|
}
|
|
66177
65989
|
const workDir = options.workDir || config.agent.workDir;
|
|
66178
|
-
const permMode = options.permissionMode || config.agent.permissionMode;
|
|
66179
65990
|
const sdkEnv = { ...process.env };
|
|
66180
65991
|
delete sdkEnv.CLAUDECODE;
|
|
66181
65992
|
delete sdkEnv.CLAUDE_CODE;
|
|
66182
65993
|
const sdkOptions = {
|
|
66183
65994
|
cwd: workDir,
|
|
66184
|
-
permissionMode:
|
|
65995
|
+
permissionMode: "bypassPermissions",
|
|
66185
65996
|
env: sdkEnv,
|
|
66186
|
-
|
|
66187
|
-
...permMode === "bypassPermissions" && { allowDangerouslySkipPermissions: true },
|
|
65997
|
+
allowDangerouslySkipPermissions: true,
|
|
66188
65998
|
// Claude CLI 경로 지정 (기본 'claude' → 시스템 PATH에서 탐색)
|
|
66189
65999
|
pathToClaudeCodeExecutable: config.agent.claudePath,
|
|
66190
66000
|
// CLAUDE.md 로드 (CLI와 동일 동작 보장)
|
|
@@ -66211,12 +66021,8 @@ function runWithSdk(options) {
|
|
|
66211
66021
|
if (options.allowedTools && options.allowedTools.length > 0) {
|
|
66212
66022
|
sdkOptions.allowedTools = options.allowedTools;
|
|
66213
66023
|
}
|
|
66214
|
-
if (options.canUseTool) {
|
|
66215
|
-
sdkOptions.canUseTool = options.canUseTool;
|
|
66216
|
-
}
|
|
66217
66024
|
logger.info("SDK query \uC2DC\uC791", {
|
|
66218
66025
|
cwd: workDir,
|
|
66219
|
-
permissionMode: permMode,
|
|
66220
66026
|
resume: options.sessionId || null,
|
|
66221
66027
|
promptLength: options.prompt.length
|
|
66222
66028
|
});
|
|
@@ -66241,133 +66047,16 @@ function runWithSdk(options) {
|
|
|
66241
66047
|
};
|
|
66242
66048
|
return { stream: adaptSdk(q), kill };
|
|
66243
66049
|
}
|
|
66244
|
-
|
|
66245
|
-
if (options.abortSignal?.aborted) {
|
|
66246
|
-
const stream2 = (async function* () {
|
|
66247
|
-
yield {
|
|
66248
|
-
type: "error",
|
|
66249
|
-
message: { content: [{ type: "text", text: "AbortSignal\uC774 \uC774\uBBF8 abort \uC0C1\uD0DC\uC785\uB2C8\uB2E4." }] }
|
|
66250
|
-
};
|
|
66251
|
-
})();
|
|
66252
|
-
return { stream: stream2, kill: () => {
|
|
66253
|
-
} };
|
|
66254
|
-
}
|
|
66255
|
-
const args = [
|
|
66256
|
-
"-p",
|
|
66257
|
-
options.prompt,
|
|
66258
|
-
"--output-format",
|
|
66259
|
-
"stream-json",
|
|
66260
|
-
"--verbose"
|
|
66261
|
-
];
|
|
66262
|
-
const model = config.agent.model;
|
|
66263
|
-
if (model) {
|
|
66264
|
-
args.push("--model", model);
|
|
66265
|
-
}
|
|
66266
|
-
const permMode = options.permissionMode || config.agent.permissionMode;
|
|
66267
|
-
args.push("--permission-mode", permMode);
|
|
66268
|
-
if (options.allowedTools && options.allowedTools.length > 0) {
|
|
66269
|
-
args.push("--allowedTools", options.allowedTools.join(","));
|
|
66270
|
-
}
|
|
66271
|
-
if (options.sessionId) {
|
|
66272
|
-
args.push("--resume", options.sessionId);
|
|
66273
|
-
}
|
|
66274
|
-
const workDir = options.workDir || config.agent.workDir;
|
|
66275
|
-
const maskedArgs = args.map(
|
|
66276
|
-
(arg, i2) => args[i2 - 1] === "-p" ? `[prompt:${arg.length}chars]` : arg
|
|
66277
|
-
);
|
|
66278
|
-
logger.info(`claude ${maskedArgs.join(" ")}`, { cwd: workDir });
|
|
66279
|
-
const childEnv = { ...process.env };
|
|
66280
|
-
delete childEnv.CLAUDECODE;
|
|
66281
|
-
delete childEnv.CLAUDE_CODE;
|
|
66282
|
-
if (options.approvalPort) {
|
|
66283
|
-
childEnv.CHOAVIS_APPROVAL_PORT = String(options.approvalPort);
|
|
66284
|
-
}
|
|
66285
|
-
const proc = spawn(config.agent.claudePath, args, {
|
|
66286
|
-
cwd: workDir,
|
|
66287
|
-
env: childEnv,
|
|
66288
|
-
stdio: ["ignore", "pipe", "pipe"]
|
|
66289
|
-
});
|
|
66290
|
-
if (options.abortSignal) {
|
|
66291
|
-
const onAbort = () => {
|
|
66292
|
-
logger.info("AbortSignal triggered, killing process");
|
|
66293
|
-
kill();
|
|
66294
|
-
};
|
|
66295
|
-
options.abortSignal.addEventListener("abort", onAbort, { once: true });
|
|
66296
|
-
proc.on("close", () => {
|
|
66297
|
-
options.abortSignal.removeEventListener("abort", onAbort);
|
|
66298
|
-
});
|
|
66299
|
-
}
|
|
66300
|
-
const kill = () => {
|
|
66301
|
-
if (!proc.killed) {
|
|
66302
|
-
logger.info("kill() called, sending SIGTERM");
|
|
66303
|
-
proc.kill("SIGTERM");
|
|
66304
|
-
setTimeout(() => {
|
|
66305
|
-
if (!proc.killed) {
|
|
66306
|
-
logger.warn("Process did not exit after SIGTERM, sending SIGKILL");
|
|
66307
|
-
proc.kill("SIGKILL");
|
|
66308
|
-
}
|
|
66309
|
-
}, 5e3);
|
|
66310
|
-
}
|
|
66311
|
-
};
|
|
66312
|
-
const stream = createStream(proc, options.abortSignal);
|
|
66313
|
-
return { stream, kill };
|
|
66314
|
-
}
|
|
66315
|
-
async function* createStream(proc, abortSignal) {
|
|
66316
|
-
const stderrChunks = [];
|
|
66317
|
-
let stderrBytes = 0;
|
|
66318
|
-
proc.stderr.on("data", (chunk) => {
|
|
66319
|
-
const text = chunk.toString();
|
|
66320
|
-
logger.error(`[stderr] ${text.trimEnd()}`);
|
|
66321
|
-
if (stderrBytes < MAX_STDERR_BYTES) {
|
|
66322
|
-
const remaining = MAX_STDERR_BYTES - stderrBytes;
|
|
66323
|
-
stderrChunks.push(text.slice(0, remaining));
|
|
66324
|
-
}
|
|
66325
|
-
stderrBytes += Buffer.byteLength(text);
|
|
66326
|
-
});
|
|
66327
|
-
const rl = createInterface({ input: proc.stdout });
|
|
66328
|
-
for await (const line of rl) {
|
|
66329
|
-
if (abortSignal?.aborted) {
|
|
66330
|
-
break;
|
|
66331
|
-
}
|
|
66332
|
-
if (!line.trim()) continue;
|
|
66333
|
-
let event;
|
|
66334
|
-
try {
|
|
66335
|
-
event = JSON.parse(line);
|
|
66336
|
-
} catch {
|
|
66337
|
-
logger.warn(`JSON \uD30C\uC2F1 \uC2E4\uD328: ${line.slice(0, 100)}`);
|
|
66338
|
-
continue;
|
|
66339
|
-
}
|
|
66340
|
-
yield event;
|
|
66341
|
-
}
|
|
66342
|
-
const exitCode = await new Promise((resolve5) => {
|
|
66343
|
-
if (proc.exitCode !== null) {
|
|
66344
|
-
resolve5(proc.exitCode);
|
|
66345
|
-
} else {
|
|
66346
|
-
proc.on("close", resolve5);
|
|
66347
|
-
}
|
|
66348
|
-
});
|
|
66349
|
-
if (exitCode !== 0 && !abortSignal?.aborted) {
|
|
66350
|
-
const errMsg = stderrChunks.join("");
|
|
66351
|
-
logger.error(`claude \uD504\uB85C\uC138\uC2A4 \uC885\uB8CC \uCF54\uB4DC: ${exitCode}`);
|
|
66352
|
-
yield {
|
|
66353
|
-
type: "error",
|
|
66354
|
-
errorType: classifyError(exitCode, errMsg),
|
|
66355
|
-
message: { content: [{ type: "text", text: `Claude \uD504\uB85C\uC138\uC2A4 \uC624\uB958 (exit ${exitCode}): ${errMsg.slice(0, 500)}` }] }
|
|
66356
|
-
};
|
|
66357
|
-
}
|
|
66358
|
-
}
|
|
66359
|
-
var logger, MAX_STDERR_BYTES;
|
|
66050
|
+
var logger;
|
|
66360
66051
|
var init_runner = __esm({
|
|
66361
66052
|
"src/agent/runner.ts"() {
|
|
66362
66053
|
"use strict";
|
|
66363
66054
|
init_sdk();
|
|
66364
66055
|
init_config();
|
|
66365
66056
|
init_logger();
|
|
66366
|
-
init_claude();
|
|
66367
66057
|
init_sdk2();
|
|
66368
66058
|
init_skills();
|
|
66369
66059
|
logger = createLogger("runner");
|
|
66370
|
-
MAX_STDERR_BYTES = 10 * 1024;
|
|
66371
66060
|
}
|
|
66372
66061
|
});
|
|
66373
66062
|
|
|
@@ -66389,9 +66078,9 @@ function loadSessions() {
|
|
|
66389
66078
|
store.set(k2, v);
|
|
66390
66079
|
}
|
|
66391
66080
|
}
|
|
66392
|
-
|
|
66081
|
+
log2.info("\uC138\uC158 \uBCF5\uC6D0\uB428", { count: store.size });
|
|
66393
66082
|
} catch {
|
|
66394
|
-
|
|
66083
|
+
log2.warn("\uC138\uC158 \uD30C\uC77C \uD30C\uC2F1 \uC2E4\uD328, \uBE48 \uC0C1\uD0DC\uB85C \uC2DC\uC791");
|
|
66395
66084
|
}
|
|
66396
66085
|
}
|
|
66397
66086
|
function serializeSessions() {
|
|
@@ -66408,7 +66097,7 @@ function ensureStoreDir() {
|
|
|
66408
66097
|
function saveSessions() {
|
|
66409
66098
|
ensureStoreDir();
|
|
66410
66099
|
void writeFile(config.session.storePath, serializeSessions()).catch((err) => {
|
|
66411
|
-
|
|
66100
|
+
log2.error("\uC138\uC158 \uC800\uC7A5 \uC2E4\uD328", { error: String(err) });
|
|
66412
66101
|
});
|
|
66413
66102
|
}
|
|
66414
66103
|
function saveSessionsSync() {
|
|
@@ -66416,7 +66105,7 @@ function saveSessionsSync() {
|
|
|
66416
66105
|
try {
|
|
66417
66106
|
writeFileSync(config.session.storePath, serializeSessions());
|
|
66418
66107
|
} catch (err) {
|
|
66419
|
-
|
|
66108
|
+
log2.error("\uC138\uC158 \uB3D9\uAE30 \uC800\uC7A5 \uC2E4\uD328", { error: String(err) });
|
|
66420
66109
|
}
|
|
66421
66110
|
}
|
|
66422
66111
|
function debouncedSave() {
|
|
@@ -66436,7 +66125,7 @@ function getSession(threadTs) {
|
|
|
66436
66125
|
}
|
|
66437
66126
|
const idleMs = config.session.idleResetMinutes * 60 * 1e3;
|
|
66438
66127
|
if (idleMs > 0 && now - entry.lastAccessedAt > idleMs) {
|
|
66439
|
-
|
|
66128
|
+
log2.info("idle \uB9AC\uC14B", { threadTs, idleMinutes: config.session.idleResetMinutes });
|
|
66440
66129
|
entry.sessionId = "";
|
|
66441
66130
|
entry.lastAccessedAt = now;
|
|
66442
66131
|
debouncedSave();
|
|
@@ -66449,7 +66138,7 @@ function getSession(threadTs) {
|
|
|
66449
66138
|
const todayReset = new Date(nowDate);
|
|
66450
66139
|
todayReset.setHours(resetHour, 0, 0, 0);
|
|
66451
66140
|
if (lastAccess < todayReset && nowDate >= todayReset) {
|
|
66452
|
-
|
|
66141
|
+
log2.info("daily \uB9AC\uC14B", { threadTs, resetHour });
|
|
66453
66142
|
entry.sessionId = "";
|
|
66454
66143
|
entry.lastAccessedAt = now;
|
|
66455
66144
|
debouncedSave();
|
|
@@ -66540,13 +66229,13 @@ function setWorkDir(threadTs, workDir) {
|
|
|
66540
66229
|
}
|
|
66541
66230
|
debouncedSave();
|
|
66542
66231
|
}
|
|
66543
|
-
var
|
|
66232
|
+
var log2, store, SESSION_TTL_MS, saveTimer, SAVE_DEBOUNCE_MS;
|
|
66544
66233
|
var init_session = __esm({
|
|
66545
66234
|
"src/agent/session.ts"() {
|
|
66546
66235
|
"use strict";
|
|
66547
66236
|
init_config();
|
|
66548
66237
|
init_logger();
|
|
66549
|
-
|
|
66238
|
+
log2 = createLogger("session");
|
|
66550
66239
|
store = /* @__PURE__ */ new Map();
|
|
66551
66240
|
SESSION_TTL_MS = 24 * 60 * 60 * 1e3;
|
|
66552
66241
|
saveTimer = null;
|
|
@@ -66626,7 +66315,7 @@ function scheduleCleanup(threadTs, queue) {
|
|
|
66626
66315
|
queue.cleanup = setTimeout(() => {
|
|
66627
66316
|
if (queue.items.length === 0 && !queue.processing) {
|
|
66628
66317
|
queues.delete(threadTs);
|
|
66629
|
-
|
|
66318
|
+
log3.info(`\uC2A4\uB808\uB4DC ${threadTs} \uD050 \uC815\uB9AC\uB428`);
|
|
66630
66319
|
}
|
|
66631
66320
|
}, CLEANUP_DELAY_MS);
|
|
66632
66321
|
}
|
|
@@ -66642,7 +66331,7 @@ async function processQueue(threadTs, queue) {
|
|
|
66642
66331
|
try {
|
|
66643
66332
|
await item.execute();
|
|
66644
66333
|
} catch (err) {
|
|
66645
|
-
|
|
66334
|
+
log3.error(`\uC2A4\uB808\uB4DC ${threadTs} \uC791\uC5C5 \uC2E4\uD589 \uC911 \uC624\uB958`, { error: String(err) });
|
|
66646
66335
|
}
|
|
66647
66336
|
queue.items.shift();
|
|
66648
66337
|
}
|
|
@@ -66681,12 +66370,12 @@ function getQueueSize(threadTs) {
|
|
|
66681
66370
|
if (!queue) return 0;
|
|
66682
66371
|
return queue.items.length;
|
|
66683
66372
|
}
|
|
66684
|
-
var
|
|
66373
|
+
var log3, CLEANUP_DELAY_MS, queues;
|
|
66685
66374
|
var init_queue = __esm({
|
|
66686
66375
|
"src/agent/queue.ts"() {
|
|
66687
66376
|
"use strict";
|
|
66688
66377
|
init_logger();
|
|
66689
|
-
|
|
66378
|
+
log3 = createLogger("queue");
|
|
66690
66379
|
CLEANUP_DELAY_MS = 6e4;
|
|
66691
66380
|
queues = /* @__PURE__ */ new Map();
|
|
66692
66381
|
}
|
|
@@ -66936,7 +66625,7 @@ function parseSlackLink(text) {
|
|
|
66936
66625
|
if (rawTs.length <= 6) return null;
|
|
66937
66626
|
threadTs = rawTs.slice(0, rawTs.length - 6) + "." + rawTs.slice(rawTs.length - 6);
|
|
66938
66627
|
}
|
|
66939
|
-
|
|
66628
|
+
log4.info("Slack \uB9C1\uD06C \uD30C\uC2F1", { channel, threadTs });
|
|
66940
66629
|
return { channel, threadTs };
|
|
66941
66630
|
}
|
|
66942
66631
|
function resolveSessionFromLink(text) {
|
|
@@ -66944,20 +66633,20 @@ function resolveSessionFromLink(text) {
|
|
|
66944
66633
|
if (!link) return null;
|
|
66945
66634
|
const sessionId = getSession(link.threadTs);
|
|
66946
66635
|
if (!sessionId) {
|
|
66947
|
-
|
|
66636
|
+
log4.info("\uB9C1\uD06C\uB41C \uC2A4\uB808\uB4DC\uC5D0 \uC138\uC158 \uC5C6\uC74C", { threadTs: link.threadTs });
|
|
66948
66637
|
return null;
|
|
66949
66638
|
}
|
|
66950
66639
|
const workDir = getWorkDir(link.threadTs);
|
|
66951
|
-
|
|
66640
|
+
log4.info("\uB9C1\uD06C\uC5D0\uC11C \uC138\uC158 \uC870\uD68C \uC131\uACF5", { threadTs: link.threadTs, sessionId });
|
|
66952
66641
|
return { sessionId, workDir };
|
|
66953
66642
|
}
|
|
66954
|
-
var
|
|
66643
|
+
var log4;
|
|
66955
66644
|
var init_link_resolver = __esm({
|
|
66956
66645
|
"src/slack/link-resolver.ts"() {
|
|
66957
66646
|
"use strict";
|
|
66958
66647
|
init_session();
|
|
66959
66648
|
init_logger();
|
|
66960
|
-
|
|
66649
|
+
log4 = createLogger("link-resolver");
|
|
66961
66650
|
}
|
|
66962
66651
|
});
|
|
66963
66652
|
|
|
@@ -67046,66 +66735,6 @@ var init_model = __esm({
|
|
|
67046
66735
|
}
|
|
67047
66736
|
});
|
|
67048
66737
|
|
|
67049
|
-
// src/slack/commands/permission.ts
|
|
67050
|
-
var VALID_MODES, permissionCommand;
|
|
67051
|
-
var init_permission = __esm({
|
|
67052
|
-
"src/slack/commands/permission.ts"() {
|
|
67053
|
-
"use strict";
|
|
67054
|
-
init_config();
|
|
67055
|
-
VALID_MODES = {
|
|
67056
|
-
bypass: "bypassPermissions",
|
|
67057
|
-
plan: "plan",
|
|
67058
|
-
accept: "acceptEdits",
|
|
67059
|
-
acceptedits: "acceptEdits"
|
|
67060
|
-
};
|
|
67061
|
-
permissionCommand = {
|
|
67062
|
-
name: "permission",
|
|
67063
|
-
match(text) {
|
|
67064
|
-
const lower = text.toLowerCase();
|
|
67065
|
-
if (lower === "$permission" || lower === "$\uAD8C\uD55C") {
|
|
67066
|
-
return { name: "permission", args: "" };
|
|
67067
|
-
}
|
|
67068
|
-
if (lower.startsWith("$permission ") || lower.startsWith("$\uAD8C\uD55C ")) {
|
|
67069
|
-
const args = text.slice(text.indexOf(" ") + 1).trim();
|
|
67070
|
-
return { name: "permission", args };
|
|
67071
|
-
}
|
|
67072
|
-
return null;
|
|
67073
|
-
},
|
|
67074
|
-
async execute(ctx) {
|
|
67075
|
-
const arg = ctx.text.trim();
|
|
67076
|
-
if (!arg) {
|
|
67077
|
-
await ctx.client.chat.postMessage({
|
|
67078
|
-
channel: ctx.channel,
|
|
67079
|
-
thread_ts: ctx.threadTs,
|
|
67080
|
-
text: `:lock: \uD604\uC7AC \uAD8C\uD55C \uBAA8\uB4DC: \`${config.agent.permissionMode}\``
|
|
67081
|
-
}).catch(() => {
|
|
67082
|
-
});
|
|
67083
|
-
return;
|
|
67084
|
-
}
|
|
67085
|
-
const resolved = VALID_MODES[arg.toLowerCase()];
|
|
67086
|
-
if (!resolved) {
|
|
67087
|
-
const validKeys = Object.keys(VALID_MODES).join(", ");
|
|
67088
|
-
await ctx.client.chat.postMessage({
|
|
67089
|
-
channel: ctx.channel,
|
|
67090
|
-
thread_ts: ctx.threadTs,
|
|
67091
|
-
text: `:warning: \uC54C \uC218 \uC5C6\uB294 \uBAA8\uB4DC: \`${arg}\`
|
|
67092
|
-
\uC0AC\uC6A9 \uAC00\uB2A5: ${validKeys}`
|
|
67093
|
-
}).catch(() => {
|
|
67094
|
-
});
|
|
67095
|
-
return;
|
|
67096
|
-
}
|
|
67097
|
-
setRuntimeConfig("permissionMode", resolved);
|
|
67098
|
-
await ctx.client.chat.postMessage({
|
|
67099
|
-
channel: ctx.channel,
|
|
67100
|
-
thread_ts: ctx.threadTs,
|
|
67101
|
-
text: `:lock: \uAD8C\uD55C \uBAA8\uB4DC \uBCC0\uACBD: \`${resolved}\``
|
|
67102
|
-
}).catch(() => {
|
|
67103
|
-
});
|
|
67104
|
-
}
|
|
67105
|
-
};
|
|
67106
|
-
}
|
|
67107
|
-
});
|
|
67108
|
-
|
|
67109
66738
|
// src/slack/commands/help.ts
|
|
67110
66739
|
var TRIGGERS, helpCommand;
|
|
67111
66740
|
var init_help = __esm({
|
|
@@ -67153,7 +66782,6 @@ var init_help = __esm({
|
|
|
67153
66782
|
" - `$compact` \u2014 \uCEE8\uD14D\uC2A4\uD2B8 \uC555\uCD95",
|
|
67154
66783
|
" - `$stop` / `$\uC911\uC9C0` \u2014 \uD604\uC7AC \uCC98\uB9AC \uC911\uB2E8",
|
|
67155
66784
|
" - `$model <\uC774\uB984>` \u2014 \uBAA8\uB378 \uBCC0\uACBD (sonnet/opus/haiku)",
|
|
67156
|
-
" - `$permission <\uBAA8\uB4DC>` \u2014 \uAD8C\uD55C \uBAA8\uB4DC \uBCC0\uACBD (bypass/plan/accept)",
|
|
67157
66785
|
" - `\uAE30\uC5B5\uD574: \uB0B4\uC6A9` \u2014 \uAE30\uC5B5 \uC800\uC7A5 (\uBAA8\uB4E0 \uB300\uD654\uC5D0 \uBC18\uC601)",
|
|
67158
66786
|
" - `\uAE30\uC5B5 \uBAA9\uB85D` \u2014 \uC800\uC7A5\uB41C \uAE30\uC5B5 \uC870\uD68C",
|
|
67159
66787
|
" - `$help` \u2014 \uC774 \uBA54\uC2DC\uC9C0",
|
|
@@ -67189,7 +66817,7 @@ async function recordUsage(record, baseDir) {
|
|
|
67189
66817
|
const filePath = getFilePath(baseDir, getDateString(record.timestamp));
|
|
67190
66818
|
const line = JSON.stringify(record) + "\n";
|
|
67191
66819
|
await appendFile(filePath, line).catch((err) => {
|
|
67192
|
-
|
|
66820
|
+
log5.error("\uC0AC\uC6A9\uB7C9 \uAE30\uB85D \uC2E4\uD328", { error: String(err) });
|
|
67193
66821
|
});
|
|
67194
66822
|
}
|
|
67195
66823
|
async function getUsageByDate(baseDir, date) {
|
|
@@ -67235,12 +66863,12 @@ async function getUsageSummary(baseDir, filter) {
|
|
|
67235
66863
|
byDate
|
|
67236
66864
|
};
|
|
67237
66865
|
}
|
|
67238
|
-
var
|
|
66866
|
+
var log5;
|
|
67239
66867
|
var init_usage = __esm({
|
|
67240
66868
|
"src/agent/usage.ts"() {
|
|
67241
66869
|
"use strict";
|
|
67242
66870
|
init_logger();
|
|
67243
|
-
|
|
66871
|
+
log5 = createLogger("usage");
|
|
67244
66872
|
}
|
|
67245
66873
|
});
|
|
67246
66874
|
|
|
@@ -67413,8 +67041,6 @@ var init_status = __esm({
|
|
|
67413
67041
|
`;
|
|
67414
67042
|
}
|
|
67415
67043
|
statusText += `:brain: *\uC138\uC158*: ${currentSession ? `\`${currentSession.slice(0, 8)}...\`` : "\uC5C6\uC74C (\uC0C8 \uB300\uD654)"}
|
|
67416
|
-
`;
|
|
67417
|
-
statusText += `:gear: *\uAD8C\uD55C \uBAA8\uB4DC*: ${config.agent.permissionMode}
|
|
67418
67044
|
`;
|
|
67419
67045
|
statusText += `:zap: *\uD65C\uC131 \uD504\uB85C\uC138\uC2A4*: ${activeCount}/${maxCount}
|
|
67420
67046
|
`;
|
|
@@ -67619,7 +67245,7 @@ async function loadStore(filePath) {
|
|
|
67619
67245
|
const data = await readFile2(filePath, "utf-8");
|
|
67620
67246
|
return JSON.parse(data);
|
|
67621
67247
|
} catch {
|
|
67622
|
-
|
|
67248
|
+
log6.warn("\uBA54\uBAA8\uB9AC \uD30C\uC77C \uD30C\uC2F1 \uC2E4\uD328", { filePath });
|
|
67623
67249
|
return { entries: [] };
|
|
67624
67250
|
}
|
|
67625
67251
|
}
|
|
@@ -67665,12 +67291,12 @@ async function buildMemoryContext(baseDir) {
|
|
|
67665
67291
|
}
|
|
67666
67292
|
return lines.join("\n");
|
|
67667
67293
|
}
|
|
67668
|
-
var
|
|
67294
|
+
var log6;
|
|
67669
67295
|
var init_memory = __esm({
|
|
67670
67296
|
"src/agent/memory.ts"() {
|
|
67671
67297
|
"use strict";
|
|
67672
67298
|
init_logger();
|
|
67673
|
-
|
|
67299
|
+
log6 = createLogger("memory");
|
|
67674
67300
|
}
|
|
67675
67301
|
});
|
|
67676
67302
|
|
|
@@ -67817,13 +67443,13 @@ async function setTypingStatus(client, channel, threadTs, status) {
|
|
|
67817
67443
|
} catch {
|
|
67818
67444
|
}
|
|
67819
67445
|
}
|
|
67820
|
-
var
|
|
67446
|
+
var log7, BOOT_TS, processedMessages, DEDUP_TTL_MS, mentionStartedThreads, MENTION_TRACK_TTL_MS, MAX_CONCURRENT, activeAgentCount, activeKills;
|
|
67821
67447
|
var init_middleware = __esm({
|
|
67822
67448
|
"src/slack/middleware.ts"() {
|
|
67823
67449
|
"use strict";
|
|
67824
67450
|
init_logger();
|
|
67825
67451
|
init_config();
|
|
67826
|
-
|
|
67452
|
+
log7 = createLogger("middleware");
|
|
67827
67453
|
BOOT_TS = Date.now() / 1e3;
|
|
67828
67454
|
processedMessages = /* @__PURE__ */ new Set();
|
|
67829
67455
|
DEDUP_TTL_MS = 6e4;
|
|
@@ -68106,7 +67732,6 @@ function registerAllCommands() {
|
|
|
68106
67732
|
commands.length = 0;
|
|
68107
67733
|
registerCommand(stopCommand);
|
|
68108
67734
|
registerCommand(modelCommand);
|
|
68109
|
-
registerCommand(permissionCommand);
|
|
68110
67735
|
registerCommand(helpCommand);
|
|
68111
67736
|
registerCommand(statusCommand);
|
|
68112
67737
|
registerCommand(newCommand);
|
|
@@ -68125,7 +67750,6 @@ var init_commands = __esm({
|
|
|
68125
67750
|
"use strict";
|
|
68126
67751
|
init_stop();
|
|
68127
67752
|
init_model();
|
|
68128
|
-
init_permission();
|
|
68129
67753
|
init_help();
|
|
68130
67754
|
init_status();
|
|
68131
67755
|
init_new();
|
|
@@ -68195,273 +67819,20 @@ ${full.slice(full.length - MAX_CONTEXT_CHARS)}`;
|
|
|
68195
67819
|
}
|
|
68196
67820
|
return { text: full, files: threadFiles };
|
|
68197
67821
|
} catch (err) {
|
|
68198
|
-
|
|
67822
|
+
log8.warn("\uC2A4\uB808\uB4DC \uCEE8\uD14D\uC2A4\uD2B8 \uC870\uD68C \uC2E4\uD328", { error: String(err) });
|
|
68199
67823
|
return { text: "", files: [] };
|
|
68200
67824
|
}
|
|
68201
67825
|
}
|
|
68202
|
-
var
|
|
67826
|
+
var log8, MAX_CONTEXT_CHARS;
|
|
68203
67827
|
var init_context = __esm({
|
|
68204
67828
|
"src/slack/context.ts"() {
|
|
68205
67829
|
"use strict";
|
|
68206
67830
|
init_logger();
|
|
68207
|
-
|
|
67831
|
+
log8 = createLogger("context");
|
|
68208
67832
|
MAX_CONTEXT_CHARS = 8e3;
|
|
68209
67833
|
}
|
|
68210
67834
|
});
|
|
68211
67835
|
|
|
68212
|
-
// src/approval/server.ts
|
|
68213
|
-
import { createServer } from "node:http";
|
|
68214
|
-
var log10, APPROVAL_TIMEOUT_MS, ApprovalServer;
|
|
68215
|
-
var init_server = __esm({
|
|
68216
|
-
"src/approval/server.ts"() {
|
|
68217
|
-
"use strict";
|
|
68218
|
-
init_logger();
|
|
68219
|
-
log10 = createLogger("approval-server");
|
|
68220
|
-
APPROVAL_TIMEOUT_MS = 12e4;
|
|
68221
|
-
ApprovalServer = class {
|
|
68222
|
-
server = null;
|
|
68223
|
-
port = 0;
|
|
68224
|
-
pending = /* @__PURE__ */ new Map();
|
|
68225
|
-
onRequest = null;
|
|
68226
|
-
allowedTools = /* @__PURE__ */ new Set();
|
|
68227
|
-
pendingToolNames = /* @__PURE__ */ new Map();
|
|
68228
|
-
setCallback(cb) {
|
|
68229
|
-
this.onRequest = cb;
|
|
68230
|
-
}
|
|
68231
|
-
/** 인메모리 허용 목록에 도구 추가 */
|
|
68232
|
-
addAllowedTool(toolName) {
|
|
68233
|
-
this.allowedTools.add(toolName);
|
|
68234
|
-
log10.info("\uB3C4\uAD6C \uD5C8\uC6A9 \uBAA9\uB85D\uC5D0 \uCD94\uAC00", { toolName });
|
|
68235
|
-
}
|
|
68236
|
-
/** 인메모리 허용 목록에 포함 여부 */
|
|
68237
|
-
isAllowed(toolName) {
|
|
68238
|
-
return this.allowedTools.has(toolName);
|
|
68239
|
-
}
|
|
68240
|
-
async start() {
|
|
68241
|
-
return new Promise((resolve5, reject) => {
|
|
68242
|
-
this.server = createServer((req, res) => this.handleHttp(req, res));
|
|
68243
|
-
this.server.listen(0, "127.0.0.1", () => {
|
|
68244
|
-
const addr = this.server.address();
|
|
68245
|
-
if (addr && typeof addr === "object") {
|
|
68246
|
-
this.port = addr.port;
|
|
68247
|
-
log10.info(`\uC2B9\uC778 \uC11C\uBC84 \uC2DC\uC791`, { port: this.port });
|
|
68248
|
-
resolve5(this.port);
|
|
68249
|
-
} else {
|
|
68250
|
-
reject(new Error("\uD3EC\uD2B8 \uBC14\uC778\uB529 \uC2E4\uD328"));
|
|
68251
|
-
}
|
|
68252
|
-
});
|
|
68253
|
-
this.server.on("error", reject);
|
|
68254
|
-
});
|
|
68255
|
-
}
|
|
68256
|
-
async stop() {
|
|
68257
|
-
for (const [id, entry] of this.pending) {
|
|
68258
|
-
clearTimeout(entry.timer);
|
|
68259
|
-
entry.resolve({ decision: "deny" });
|
|
68260
|
-
this.pending.delete(id);
|
|
68261
|
-
}
|
|
68262
|
-
this.pendingToolNames.clear();
|
|
68263
|
-
return new Promise((resolve5) => {
|
|
68264
|
-
if (this.server) {
|
|
68265
|
-
this.server.close(() => {
|
|
68266
|
-
log10.info("\uC2B9\uC778 \uC11C\uBC84 \uC885\uB8CC");
|
|
68267
|
-
this.server = null;
|
|
68268
|
-
resolve5();
|
|
68269
|
-
});
|
|
68270
|
-
} else {
|
|
68271
|
-
resolve5();
|
|
68272
|
-
}
|
|
68273
|
-
});
|
|
68274
|
-
}
|
|
68275
|
-
/**
|
|
68276
|
-
* 승인 결정 처리. alwaysAllow=true이면 인메모리 허용 목록에 추가.
|
|
68277
|
-
* 반환: 처리된 도구명 (없으면 null)
|
|
68278
|
-
*/
|
|
68279
|
-
resolve(requestId, decision, alwaysAllow = false) {
|
|
68280
|
-
const entry = this.pending.get(requestId);
|
|
68281
|
-
if (!entry) return null;
|
|
68282
|
-
clearTimeout(entry.timer);
|
|
68283
|
-
entry.resolve({ decision });
|
|
68284
|
-
this.pending.delete(requestId);
|
|
68285
|
-
const toolName = this.pendingToolNames.get(requestId) ?? null;
|
|
68286
|
-
log10.info("\uC2B9\uC778 \uACB0\uC815", { requestId, decision, alwaysAllow, toolName });
|
|
68287
|
-
if (alwaysAllow && decision === "allow" && toolName) {
|
|
68288
|
-
this.addAllowedTool(toolName);
|
|
68289
|
-
}
|
|
68290
|
-
this.pendingToolNames.delete(requestId);
|
|
68291
|
-
return toolName;
|
|
68292
|
-
}
|
|
68293
|
-
getPort() {
|
|
68294
|
-
return this.port;
|
|
68295
|
-
}
|
|
68296
|
-
handleHttp(req, res) {
|
|
68297
|
-
if (req.method === "POST" && req.url === "/request") {
|
|
68298
|
-
this.handleApprovalRequest(req, res);
|
|
68299
|
-
} else {
|
|
68300
|
-
res.writeHead(404);
|
|
68301
|
-
res.end("Not Found");
|
|
68302
|
-
}
|
|
68303
|
-
}
|
|
68304
|
-
handleApprovalRequest(req, res) {
|
|
68305
|
-
const MAX_BODY_SIZE = 1024 * 1024;
|
|
68306
|
-
let body = "";
|
|
68307
|
-
let tooLarge = false;
|
|
68308
|
-
req.on("data", (chunk) => {
|
|
68309
|
-
body += chunk.toString();
|
|
68310
|
-
if (body.length > MAX_BODY_SIZE) {
|
|
68311
|
-
tooLarge = true;
|
|
68312
|
-
res.writeHead(413);
|
|
68313
|
-
res.end(JSON.stringify({ error: "Request body too large" }));
|
|
68314
|
-
req.destroy();
|
|
68315
|
-
}
|
|
68316
|
-
});
|
|
68317
|
-
req.on("end", () => {
|
|
68318
|
-
if (tooLarge) return;
|
|
68319
|
-
let request;
|
|
68320
|
-
try {
|
|
68321
|
-
request = JSON.parse(body);
|
|
68322
|
-
} catch {
|
|
68323
|
-
res.writeHead(400);
|
|
68324
|
-
res.end(JSON.stringify({ error: "Invalid JSON" }));
|
|
68325
|
-
return;
|
|
68326
|
-
}
|
|
68327
|
-
if (!request.requestId || !request.toolName) {
|
|
68328
|
-
res.writeHead(400);
|
|
68329
|
-
res.end(JSON.stringify({ error: "Missing requestId or toolName" }));
|
|
68330
|
-
return;
|
|
68331
|
-
}
|
|
68332
|
-
log10.info("\uC2B9\uC778 \uC694\uCCAD \uC218\uC2E0", { requestId: request.requestId, toolName: request.toolName });
|
|
68333
|
-
if (this.allowedTools.has(request.toolName)) {
|
|
68334
|
-
log10.info("\uD5C8\uC6A9 \uBAA9\uB85D\uC5D0\uC11C \uC790\uB3D9 \uC2B9\uC778", { toolName: request.toolName });
|
|
68335
|
-
res.writeHead(200, { "Content-Type": "application/json" });
|
|
68336
|
-
res.end(JSON.stringify({ decision: "allow" }));
|
|
68337
|
-
return;
|
|
68338
|
-
}
|
|
68339
|
-
this.pendingToolNames.set(request.requestId, request.toolName);
|
|
68340
|
-
const resultPromise = new Promise((resolve5) => {
|
|
68341
|
-
const timer = setTimeout(() => {
|
|
68342
|
-
log10.warn("\uC2B9\uC778 \uD0C0\uC784\uC544\uC6C3", { requestId: request.requestId });
|
|
68343
|
-
this.pending.delete(request.requestId);
|
|
68344
|
-
this.pendingToolNames.delete(request.requestId);
|
|
68345
|
-
resolve5({ decision: "deny" });
|
|
68346
|
-
}, APPROVAL_TIMEOUT_MS);
|
|
68347
|
-
this.pending.set(request.requestId, { resolve: resolve5, timer });
|
|
68348
|
-
});
|
|
68349
|
-
if (this.onRequest) {
|
|
68350
|
-
this.onRequest(request);
|
|
68351
|
-
}
|
|
68352
|
-
resultPromise.then((result) => {
|
|
68353
|
-
res.writeHead(200, { "Content-Type": "application/json" });
|
|
68354
|
-
res.end(JSON.stringify(result));
|
|
68355
|
-
});
|
|
68356
|
-
});
|
|
68357
|
-
}
|
|
68358
|
-
};
|
|
68359
|
-
}
|
|
68360
|
-
});
|
|
68361
|
-
|
|
68362
|
-
// src/approval/setup.ts
|
|
68363
|
-
import { readFile as readFile3, writeFile as writeFile3, mkdir as mkdir3 } from "node:fs/promises";
|
|
68364
|
-
import { join as join4, resolve as resolvePath } from "node:path";
|
|
68365
|
-
import { fileURLToPath as fileURLToPath3 } from "node:url";
|
|
68366
|
-
import { dirname as dirname4 } from "node:path";
|
|
68367
|
-
function buildHookCommand() {
|
|
68368
|
-
return `node ${HOOK_SCRIPT_PATH}`;
|
|
68369
|
-
}
|
|
68370
|
-
async function installHook(workDir, port) {
|
|
68371
|
-
const settingsDir = join4(workDir, ".claude");
|
|
68372
|
-
const settingsPath = join4(settingsDir, "settings.local.json");
|
|
68373
|
-
let settings = {};
|
|
68374
|
-
try {
|
|
68375
|
-
const raw = await readFile3(settingsPath, "utf-8");
|
|
68376
|
-
settings = JSON.parse(raw);
|
|
68377
|
-
} catch {
|
|
68378
|
-
}
|
|
68379
|
-
const originalContent = JSON.stringify(settings);
|
|
68380
|
-
if (!settings.hooks) {
|
|
68381
|
-
settings.hooks = {};
|
|
68382
|
-
}
|
|
68383
|
-
if (!settings.hooks.PreToolUse) {
|
|
68384
|
-
settings.hooks.PreToolUse = [];
|
|
68385
|
-
}
|
|
68386
|
-
settings.hooks.PreToolUse = settings.hooks.PreToolUse.filter(
|
|
68387
|
-
(m) => !m.hooks?.some((h2) => h2.command.includes(HOOK_MARKER) || h2.command.includes("pretool-hook.mjs"))
|
|
68388
|
-
);
|
|
68389
|
-
const command = buildHookCommand();
|
|
68390
|
-
settings.hooks.PreToolUse.push({
|
|
68391
|
-
matcher: "*",
|
|
68392
|
-
hooks: [
|
|
68393
|
-
{
|
|
68394
|
-
type: "command",
|
|
68395
|
-
command: `CHOAVIS_APPROVAL_PORT=${port} ${command}`,
|
|
68396
|
-
timeout: 120
|
|
68397
|
-
}
|
|
68398
|
-
]
|
|
68399
|
-
});
|
|
68400
|
-
await mkdir3(settingsDir, { recursive: true });
|
|
68401
|
-
await writeFile3(settingsPath, JSON.stringify(settings, null, 2), "utf-8");
|
|
68402
|
-
log11.info("Hook \uC124\uC815 \uC124\uCE58", { settingsPath, port });
|
|
68403
|
-
return async () => {
|
|
68404
|
-
try {
|
|
68405
|
-
const original = JSON.parse(originalContent);
|
|
68406
|
-
if (Object.keys(original).length === 0) {
|
|
68407
|
-
const current = JSON.parse(await readFile3(settingsPath, "utf-8"));
|
|
68408
|
-
if (current.hooks?.PreToolUse) {
|
|
68409
|
-
current.hooks.PreToolUse = current.hooks.PreToolUse.filter(
|
|
68410
|
-
(m) => !m.hooks?.some((h2) => h2.command.includes("pretool-hook.mjs"))
|
|
68411
|
-
);
|
|
68412
|
-
if (current.hooks.PreToolUse.length === 0) {
|
|
68413
|
-
delete current.hooks.PreToolUse;
|
|
68414
|
-
}
|
|
68415
|
-
if (Object.keys(current.hooks).length === 0) {
|
|
68416
|
-
delete current.hooks;
|
|
68417
|
-
}
|
|
68418
|
-
}
|
|
68419
|
-
await writeFile3(settingsPath, JSON.stringify(current, null, 2), "utf-8");
|
|
68420
|
-
} else {
|
|
68421
|
-
await writeFile3(settingsPath, originalContent, "utf-8");
|
|
68422
|
-
}
|
|
68423
|
-
log11.info("Hook \uC124\uC815 \uC815\uB9AC \uC644\uB8CC", { settingsPath });
|
|
68424
|
-
} catch (e2) {
|
|
68425
|
-
log11.error("Hook \uC124\uC815 \uC815\uB9AC \uC2E4\uD328", { error: String(e2) });
|
|
68426
|
-
}
|
|
68427
|
-
};
|
|
68428
|
-
}
|
|
68429
|
-
async function addToolToSettings(workDir, toolName) {
|
|
68430
|
-
const settingsDir = join4(workDir, ".claude");
|
|
68431
|
-
const settingsPath = join4(settingsDir, "settings.local.json");
|
|
68432
|
-
let settings = {};
|
|
68433
|
-
try {
|
|
68434
|
-
const raw = await readFile3(settingsPath, "utf-8");
|
|
68435
|
-
settings = JSON.parse(raw);
|
|
68436
|
-
} catch {
|
|
68437
|
-
}
|
|
68438
|
-
if (!settings.permissions) {
|
|
68439
|
-
settings.permissions = {};
|
|
68440
|
-
}
|
|
68441
|
-
if (!Array.isArray(settings.permissions.allow)) {
|
|
68442
|
-
settings.permissions.allow = [];
|
|
68443
|
-
}
|
|
68444
|
-
if (settings.permissions.allow.includes(toolName)) {
|
|
68445
|
-
log11.info("\uC774\uBBF8 \uD5C8\uC6A9 \uBAA9\uB85D\uC5D0 \uC788\uC74C", { toolName });
|
|
68446
|
-
return;
|
|
68447
|
-
}
|
|
68448
|
-
settings.permissions.allow.push(toolName);
|
|
68449
|
-
await mkdir3(settingsDir, { recursive: true });
|
|
68450
|
-
await writeFile3(settingsPath, JSON.stringify(settings, null, 2), "utf-8");
|
|
68451
|
-
log11.info("settings.local.json\uC5D0 \uB3C4\uAD6C \uCD94\uAC00", { settingsPath, toolName });
|
|
68452
|
-
}
|
|
68453
|
-
var log11, __dirname3, HOOK_SCRIPT_PATH, HOOK_MARKER;
|
|
68454
|
-
var init_setup = __esm({
|
|
68455
|
-
"src/approval/setup.ts"() {
|
|
68456
|
-
"use strict";
|
|
68457
|
-
init_logger();
|
|
68458
|
-
log11 = createLogger("approval-setup");
|
|
68459
|
-
__dirname3 = dirname4(fileURLToPath3(import.meta.url));
|
|
68460
|
-
HOOK_SCRIPT_PATH = resolvePath(__dirname3, "../../scripts/pretool-hook.mjs");
|
|
68461
|
-
HOOK_MARKER = "choavis-pretool-hook";
|
|
68462
|
-
}
|
|
68463
|
-
});
|
|
68464
|
-
|
|
68465
67836
|
// src/slack/slack-retry.ts
|
|
68466
67837
|
function isRetryableError(err) {
|
|
68467
67838
|
if (err && typeof err === "object") {
|
|
@@ -68485,13 +67856,13 @@ async function withRetry(fn, label, options) {
|
|
|
68485
67856
|
return await fn();
|
|
68486
67857
|
} catch (err) {
|
|
68487
67858
|
if (attempt === opts.maxRetries || !isRetryableError(err)) {
|
|
68488
|
-
|
|
67859
|
+
log9.error(`${label} \uCD5C\uC885 \uC2E4\uD328`, { attempt, error: String(err) });
|
|
68489
67860
|
throw err;
|
|
68490
67861
|
}
|
|
68491
67862
|
const retryAfterMs = err.retryAfter ? err.retryAfter * 1e3 : void 0;
|
|
68492
67863
|
const jitter = Math.random() * 500;
|
|
68493
67864
|
const delayMs = retryAfterMs ?? Math.min(opts.baseDelayMs * 2 ** attempt + jitter, opts.maxDelayMs);
|
|
68494
|
-
|
|
67865
|
+
log9.warn(`${label} \uC7AC\uC2DC\uB3C4 ${attempt + 1}/${opts.maxRetries}`, { delayMs: Math.round(delayMs), error: String(err) });
|
|
68495
67866
|
await delay(delayMs);
|
|
68496
67867
|
}
|
|
68497
67868
|
}
|
|
@@ -68501,16 +67872,16 @@ async function bestEffort(fn, label) {
|
|
|
68501
67872
|
try {
|
|
68502
67873
|
return await withRetry(fn, label, { maxRetries: 1 });
|
|
68503
67874
|
} catch {
|
|
68504
|
-
|
|
67875
|
+
log9.warn(`${label} best-effort \uC2E4\uD328, \uBB34\uC2DC`);
|
|
68505
67876
|
return void 0;
|
|
68506
67877
|
}
|
|
68507
67878
|
}
|
|
68508
|
-
var
|
|
67879
|
+
var log9, DEFAULT_OPTIONS;
|
|
68509
67880
|
var init_slack_retry = __esm({
|
|
68510
67881
|
"src/slack/slack-retry.ts"() {
|
|
68511
67882
|
"use strict";
|
|
68512
67883
|
init_logger();
|
|
68513
|
-
|
|
67884
|
+
log9 = createLogger("slack-retry");
|
|
68514
67885
|
DEFAULT_OPTIONS = {
|
|
68515
67886
|
maxRetries: 3,
|
|
68516
67887
|
baseDelayMs: 1e3,
|
|
@@ -68608,10 +67979,6 @@ function formatSingleTool(event) {
|
|
|
68608
67979
|
if (formatter) return formatter(event.toolInput);
|
|
68609
67980
|
return formatDefault(event.toolName, event.toolInput);
|
|
68610
67981
|
}
|
|
68611
|
-
function formatToolInline(event) {
|
|
68612
|
-
const { label, detail } = formatSingleTool(event);
|
|
68613
|
-
return detail ? `${label}: ${detail}` : label;
|
|
68614
|
-
}
|
|
68615
67982
|
function formatToolSummary(events, maxDisplay = 8) {
|
|
68616
67983
|
if (events.length === 0) return "";
|
|
68617
67984
|
const lines = [];
|
|
@@ -68677,9 +68044,9 @@ var init_tool_formatter = __esm({
|
|
|
68677
68044
|
});
|
|
68678
68045
|
|
|
68679
68046
|
// src/slack/file-downloader.ts
|
|
68680
|
-
import { mkdir as
|
|
68047
|
+
import { mkdir as mkdir3, writeFile as writeFile3, readFile as readFile3, rm } from "node:fs/promises";
|
|
68681
68048
|
import { existsSync as existsSync6 } from "node:fs";
|
|
68682
|
-
import { join as
|
|
68049
|
+
import { join as join4 } from "node:path";
|
|
68683
68050
|
function isTextFile(mimetype, filetype) {
|
|
68684
68051
|
const lower = mimetype.toLowerCase();
|
|
68685
68052
|
if (TEXT_MIME_PREFIXES.some((p2) => lower.startsWith(p2))) return true;
|
|
@@ -68703,9 +68070,9 @@ function scheduleCleanup2(dirPath) {
|
|
|
68703
68070
|
setTimeout(async () => {
|
|
68704
68071
|
try {
|
|
68705
68072
|
await rm(dirPath, { recursive: true, force: true });
|
|
68706
|
-
|
|
68073
|
+
log10.info("\uCCA8\uBD80 \uD30C\uC77C \uC815\uB9AC \uC644\uB8CC", { dir: dirPath });
|
|
68707
68074
|
} catch (err) {
|
|
68708
|
-
|
|
68075
|
+
log10.warn("\uCCA8\uBD80 \uD30C\uC77C \uC815\uB9AC \uC2E4\uD328", { dir: dirPath, error: String(err) });
|
|
68709
68076
|
}
|
|
68710
68077
|
}, CLEANUP_DELAY_MS2);
|
|
68711
68078
|
}
|
|
@@ -68718,9 +68085,9 @@ async function downloadSlackFile(client, fileId, fallbackUrl, botToken) {
|
|
|
68718
68085
|
} else if (info.file?.url_private) {
|
|
68719
68086
|
downloadUrl = info.file.url_private;
|
|
68720
68087
|
}
|
|
68721
|
-
|
|
68088
|
+
log10.info("files.info \uC870\uD68C \uC131\uACF5", { fileId, hasDownloadUrl: !!info.file?.url_private_download });
|
|
68722
68089
|
} catch (err) {
|
|
68723
|
-
|
|
68090
|
+
log10.warn("files.info \uC870\uD68C \uC2E4\uD328, fallback URL \uC0AC\uC6A9", { fileId, error: String(err) });
|
|
68724
68091
|
}
|
|
68725
68092
|
const authHeaders = { Authorization: `Bearer ${botToken}` };
|
|
68726
68093
|
let res = await fetch(downloadUrl, {
|
|
@@ -68730,7 +68097,7 @@ async function downloadSlackFile(client, fileId, fallbackUrl, botToken) {
|
|
|
68730
68097
|
if (res.status >= 300 && res.status < 400) {
|
|
68731
68098
|
const location = res.headers.get("location");
|
|
68732
68099
|
if (location) {
|
|
68733
|
-
|
|
68100
|
+
log10.info("\uB9AC\uB2E4\uC774\uB809\uD2B8 \uB530\uB77C\uAC10", { location: location.slice(0, 80) });
|
|
68734
68101
|
res = await fetch(location, { headers: authHeaders });
|
|
68735
68102
|
}
|
|
68736
68103
|
}
|
|
@@ -68759,7 +68126,7 @@ async function buildFilePromptSection(files) {
|
|
|
68759
68126
|
`(\uC774 PDF\uB97C \uC77D\uC73C\uB824\uBA74 Read \uB3C4\uAD6C\uB85C \uC704 \uACBD\uB85C\uB97C \uC77D\uC73C\uC138\uC694.)`
|
|
68760
68127
|
);
|
|
68761
68128
|
} else if (f.isText) {
|
|
68762
|
-
const content = await
|
|
68129
|
+
const content = await readFile3(f.localPath, "utf-8");
|
|
68763
68130
|
if (f.size <= TEXT_INLINE_THRESHOLD) {
|
|
68764
68131
|
parts.push(
|
|
68765
68132
|
`
|
|
@@ -68820,18 +68187,18 @@ async function downloadAndPrepareFiles(slackFiles, threadTs, botToken, client) {
|
|
|
68820
68187
|
if (eligible.length === 0) {
|
|
68821
68188
|
return { files: [], promptSection: "", errors };
|
|
68822
68189
|
}
|
|
68823
|
-
const dir =
|
|
68190
|
+
const dir = join4(BASE_DIR, sanitize(threadTs));
|
|
68824
68191
|
if (!existsSync6(dir)) {
|
|
68825
|
-
await
|
|
68192
|
+
await mkdir3(dir, { recursive: true });
|
|
68826
68193
|
}
|
|
68827
68194
|
for (const f of eligible) {
|
|
68828
68195
|
try {
|
|
68829
68196
|
const fallbackUrl = f.url_private_download || f.url_private;
|
|
68830
|
-
|
|
68197
|
+
log10.info("\uD30C\uC77C \uB2E4\uC6B4\uB85C\uB4DC \uC2DC\uC791", { name: f.name, fileId: f.id, mimetype: f.mimetype });
|
|
68831
68198
|
const buffer = await downloadSlackFile(client, f.id, fallbackUrl, botToken);
|
|
68832
68199
|
const safeName = `${f.id}_${sanitize(f.name)}`;
|
|
68833
|
-
const localPath =
|
|
68834
|
-
await
|
|
68200
|
+
const localPath = join4(dir, safeName);
|
|
68201
|
+
await writeFile3(localPath, buffer);
|
|
68835
68202
|
downloaded.push({
|
|
68836
68203
|
originalName: f.name,
|
|
68837
68204
|
localPath,
|
|
@@ -68842,10 +68209,10 @@ async function downloadAndPrepareFiles(slackFiles, threadTs, botToken, client) {
|
|
|
68842
68209
|
isImage: isImageFile(f.mimetype),
|
|
68843
68210
|
isPdf: isPdfFile(f.mimetype, f.filetype)
|
|
68844
68211
|
});
|
|
68845
|
-
|
|
68212
|
+
log10.info("\uD30C\uC77C \uB2E4\uC6B4\uB85C\uB4DC \uC644\uB8CC", { name: f.name, size: buffer.length, path: localPath });
|
|
68846
68213
|
} catch (err) {
|
|
68847
68214
|
errors.push(`${f.name}: ${String(err)}`);
|
|
68848
|
-
|
|
68215
|
+
log10.error("\uD30C\uC77C \uB2E4\uC6B4\uB85C\uB4DC \uC2E4\uD328", { name: f.name, error: String(err) });
|
|
68849
68216
|
}
|
|
68850
68217
|
}
|
|
68851
68218
|
const promptSection = await buildFilePromptSection(downloaded);
|
|
@@ -68854,12 +68221,12 @@ async function downloadAndPrepareFiles(slackFiles, threadTs, botToken, client) {
|
|
|
68854
68221
|
}
|
|
68855
68222
|
return { files: downloaded, promptSection, errors };
|
|
68856
68223
|
}
|
|
68857
|
-
var
|
|
68224
|
+
var log10, MAX_FILE_SIZE, MAX_TOTAL_SIZE, TEXT_INLINE_THRESHOLD, TEXT_PREVIEW_LINES, BASE_DIR, CLEANUP_DELAY_MS2, TEXT_MIME_PREFIXES, TEXT_FILETYPES;
|
|
68858
68225
|
var init_file_downloader = __esm({
|
|
68859
68226
|
"src/slack/file-downloader.ts"() {
|
|
68860
68227
|
"use strict";
|
|
68861
68228
|
init_logger();
|
|
68862
|
-
|
|
68229
|
+
log10 = createLogger("file-downloader");
|
|
68863
68230
|
MAX_FILE_SIZE = 10 * 1024 * 1024;
|
|
68864
68231
|
MAX_TOTAL_SIZE = 25 * 1024 * 1024;
|
|
68865
68232
|
TEXT_INLINE_THRESHOLD = 50 * 1024;
|
|
@@ -68920,9 +68287,6 @@ __export(handlers_exports, {
|
|
|
68920
68287
|
handleIncomingDirect: () => handleIncomingDirect,
|
|
68921
68288
|
registerHandlers: () => registerHandlers
|
|
68922
68289
|
});
|
|
68923
|
-
function getApprovalKey(channel, threadTs) {
|
|
68924
|
-
return `${channel}:${threadTs}`;
|
|
68925
|
-
}
|
|
68926
68290
|
async function handleIncomingDirect(text, channel, threadTs, messageTs, client, userId) {
|
|
68927
68291
|
await handleIncoming({ text, channel, threadTs, messageTs, client, userId, bypassGuards: true });
|
|
68928
68292
|
}
|
|
@@ -68930,19 +68294,19 @@ async function handleIncoming(opts) {
|
|
|
68930
68294
|
const { text, channel, threadTs, messageTs, client, userId, slackContext, files, bypassGuards = false } = opts;
|
|
68931
68295
|
if (!bypassGuards) {
|
|
68932
68296
|
if (isBootMessage(messageTs)) {
|
|
68933
|
-
|
|
68297
|
+
log11.info("\uBD80\uD305 \uC774\uC804 \uBA54\uC2DC\uC9C0 \uBB34\uC2DC", { messageTs });
|
|
68934
68298
|
return;
|
|
68935
68299
|
}
|
|
68936
68300
|
if (isDuplicate(messageTs)) {
|
|
68937
|
-
|
|
68301
|
+
log11.info("\uC911\uBCF5 \uBA54\uC2DC\uC9C0 \uBB34\uC2DC", { messageTs });
|
|
68938
68302
|
return;
|
|
68939
68303
|
}
|
|
68940
68304
|
if (!isAllowedUser(userId)) {
|
|
68941
|
-
|
|
68305
|
+
log11.warn("\uD5C8\uC6A9\uB418\uC9C0 \uC54A\uC740 \uC0AC\uC6A9\uC790", { userId });
|
|
68942
68306
|
return;
|
|
68943
68307
|
}
|
|
68944
68308
|
}
|
|
68945
|
-
|
|
68309
|
+
log11.info("\uBA54\uC2DC\uC9C0 \uC218\uC2E0", { text: text.slice(0, 50), threadTs });
|
|
68946
68310
|
const cmdMatch = matchCommand(text);
|
|
68947
68311
|
if (cmdMatch) {
|
|
68948
68312
|
const activeAgentCount3 = getActiveAgentCount();
|
|
@@ -68957,13 +68321,13 @@ async function handleIncoming(opts) {
|
|
|
68957
68321
|
setWorkDir(threadTs, linked.workDir);
|
|
68958
68322
|
}
|
|
68959
68323
|
setSession(threadTs, linked.sessionId);
|
|
68960
|
-
|
|
68324
|
+
log11.info("\uB9C1\uD06C\uC5D0\uC11C \uC138\uC158 \uC790\uB3D9 \uC5F0\uACB0", { threadTs, linkedSessionId: linked.sessionId });
|
|
68961
68325
|
}
|
|
68962
68326
|
}
|
|
68963
68327
|
const activeAgentCount2 = getActiveAgentCount();
|
|
68964
68328
|
const MAX_CONCURRENT2 = getMaxConcurrent();
|
|
68965
68329
|
if (activeAgentCount2 >= MAX_CONCURRENT2) {
|
|
68966
|
-
|
|
68330
|
+
log11.warn("\uB3D9\uC2DC \uD504\uB85C\uC138\uC2A4 \uC81C\uD55C \uCD08\uACFC", { activeAgentCount: activeAgentCount2, MAX_CONCURRENT: MAX_CONCURRENT2 });
|
|
68967
68331
|
await withRetry(
|
|
68968
68332
|
() => client.chat.postMessage({ channel, thread_ts: threadTs, text: ":warning: \uD604\uC7AC \uCC98\uB9AC\uB7C9\uC774 \uB9CE\uC2B5\uB2C8\uB2E4. \uC7A0\uC2DC \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574\uC8FC\uC138\uC694." }),
|
|
68969
68333
|
"chat.postMessage(limit)"
|
|
@@ -68973,7 +68337,7 @@ async function handleIncoming(opts) {
|
|
|
68973
68337
|
}
|
|
68974
68338
|
const queueSize = getQueueSize(threadTs);
|
|
68975
68339
|
if (queueSize > 0) {
|
|
68976
|
-
|
|
68340
|
+
log11.info("\uD050 \uB300\uAE30 \uC911", { threadTs, queueSize });
|
|
68977
68341
|
}
|
|
68978
68342
|
await enqueue(threadTs, async () => {
|
|
68979
68343
|
incrementActiveCount();
|
|
@@ -68989,17 +68353,15 @@ async function handleIncoming(opts) {
|
|
|
68989
68353
|
const idleDuration = Date.now() - lastActivityAt;
|
|
68990
68354
|
if (idleDuration >= config.agent.idleCheckInterval) {
|
|
68991
68355
|
idleCheckCount++;
|
|
68992
|
-
|
|
68356
|
+
log11.warn("subprocess \uC751\uB2F5 \uC5C6\uC74C", { threadTs, idleCheckCount, maxChecks: config.agent.maxIdleChecks });
|
|
68993
68357
|
if (idleCheckCount >= config.agent.maxIdleChecks) {
|
|
68994
|
-
|
|
68358
|
+
log11.warn("\uCD5C\uB300 idle \uCCB4\uD06C \uCD08\uACFC, \uD504\uB85C\uC138\uC2A4 \uC911\uB2E8", { threadTs });
|
|
68995
68359
|
abortController.abort();
|
|
68996
68360
|
}
|
|
68997
68361
|
} else {
|
|
68998
68362
|
idleCheckCount = 0;
|
|
68999
68363
|
}
|
|
69000
68364
|
}, config.agent.idleCheckInterval);
|
|
69001
|
-
let approvalServer = null;
|
|
69002
|
-
let cleanupHook = null;
|
|
69003
68365
|
try {
|
|
69004
68366
|
const sessionId = getSession(threadTs);
|
|
69005
68367
|
const threadWorkDir = getWorkDir(threadTs) || config.agent.workDir;
|
|
@@ -69016,53 +68378,13 @@ async function handleIncoming(opts) {
|
|
|
69016
68378
|
);
|
|
69017
68379
|
}
|
|
69018
68380
|
}
|
|
69019
|
-
const
|
|
69020
|
-
const isSdk = config.agent.backend === "sdk";
|
|
69021
|
-
const skillsContext = isSdk ? "" : loadSkills();
|
|
69022
|
-
const promptParts = [skillsContext, memoryContext, slackContext, fileContext, text].filter(Boolean);
|
|
68381
|
+
const promptParts = [memoryContext, slackContext, fileContext, text].filter(Boolean);
|
|
69023
68382
|
const fullPrompt = promptParts.join("\n\n---\n\n");
|
|
69024
|
-
let approvalPort;
|
|
69025
|
-
let canUseTool;
|
|
69026
|
-
if (permMode !== "bypassPermissions") {
|
|
69027
|
-
if (isSdk) {
|
|
69028
|
-
const sdkAllowedTools = /* @__PURE__ */ new Set();
|
|
69029
|
-
canUseTool = async (toolName, toolInput) => {
|
|
69030
|
-
if (sdkAllowedTools.has(toolName)) {
|
|
69031
|
-
return { behavior: "allow" };
|
|
69032
|
-
}
|
|
69033
|
-
return new Promise((resolve5) => {
|
|
69034
|
-
const requestId = crypto.randomUUID();
|
|
69035
|
-
const timer = setTimeout(() => {
|
|
69036
|
-
pendingApprovals.delete(requestId);
|
|
69037
|
-
resolve5({ behavior: "deny", message: "\uC2B9\uC778 \uD0C0\uC784\uC544\uC6C3" });
|
|
69038
|
-
}, 12e4);
|
|
69039
|
-
pendingApprovals.set(requestId, { resolve: resolve5, timer, toolName, allowedTools: sdkAllowedTools });
|
|
69040
|
-
void sendApprovalButtons(client, channel, threadTs, {
|
|
69041
|
-
requestId,
|
|
69042
|
-
sessionId: sessionId || "",
|
|
69043
|
-
toolName,
|
|
69044
|
-
toolInput
|
|
69045
|
-
});
|
|
69046
|
-
});
|
|
69047
|
-
};
|
|
69048
|
-
} else {
|
|
69049
|
-
approvalServer = new ApprovalServer();
|
|
69050
|
-
approvalServer.setCallback((request) => {
|
|
69051
|
-
void sendApprovalButtons(client, channel, threadTs, request);
|
|
69052
|
-
});
|
|
69053
|
-
approvalPort = await approvalServer.start();
|
|
69054
|
-
cleanupHook = await installHook(threadWorkDir, approvalPort);
|
|
69055
|
-
const approvalKey = getApprovalKey(channel, threadTs);
|
|
69056
|
-
activeApprovalServers.set(approvalKey, approvalServer);
|
|
69057
|
-
}
|
|
69058
|
-
}
|
|
69059
68383
|
const { stream, kill } = runSession({
|
|
69060
68384
|
prompt: fullPrompt,
|
|
69061
68385
|
sessionId: sessionId || void 0,
|
|
69062
68386
|
workDir: threadWorkDir,
|
|
69063
|
-
abortSignal: abortController.signal
|
|
69064
|
-
approvalPort: isSdk ? void 0 : approvalPort,
|
|
69065
|
-
canUseTool
|
|
68387
|
+
abortSignal: abortController.signal
|
|
69066
68388
|
});
|
|
69067
68389
|
setActiveKill(threadTs, kill);
|
|
69068
68390
|
let responseText = "";
|
|
@@ -69165,7 +68487,7 @@ async function handleIncoming(opts) {
|
|
|
69165
68487
|
}
|
|
69166
68488
|
} catch (streamErr) {
|
|
69167
68489
|
if (!aborted) {
|
|
69168
|
-
|
|
68490
|
+
log11.error("\uC2A4\uD2B8\uB9BC \uCC98\uB9AC \uC624\uB958", { error: String(streamErr) });
|
|
69169
68491
|
kill();
|
|
69170
68492
|
}
|
|
69171
68493
|
}
|
|
@@ -69178,7 +68500,7 @@ async function handleIncoming(opts) {
|
|
|
69178
68500
|
model: config.agent.model || void 0,
|
|
69179
68501
|
lastPrompt: text
|
|
69180
68502
|
});
|
|
69181
|
-
|
|
68503
|
+
log11.info("\uC138\uC158 \uC800\uC7A5", { threadTs, sessionId: newSessionId });
|
|
69182
68504
|
}
|
|
69183
68505
|
if (aborted) {
|
|
69184
68506
|
responseText = responseText || "";
|
|
@@ -69216,14 +68538,14 @@ ${text2}` : text2;
|
|
|
69216
68538
|
}),
|
|
69217
68539
|
`filesUploadV2(${snippet.filename})`
|
|
69218
68540
|
).catch((e2) => {
|
|
69219
|
-
|
|
68541
|
+
log11.error("\uC2A4\uB2C8\uD3AB \uC5C5\uB85C\uB4DC \uC2E4\uD328", { filename: snippet.filename, error: String(e2) });
|
|
69220
68542
|
});
|
|
69221
68543
|
}
|
|
69222
68544
|
if (toolUseCount > 0) {
|
|
69223
|
-
|
|
68545
|
+
log11.info("\uB3C4\uAD6C \uC0AC\uC6A9", { threadTs, toolUseCount });
|
|
69224
68546
|
}
|
|
69225
68547
|
} catch (error) {
|
|
69226
|
-
|
|
68548
|
+
log11.error("\uCC98\uB9AC \uC624\uB958", { error: String(error), threadTs });
|
|
69227
68549
|
hadError = true;
|
|
69228
68550
|
emitAgentEvent("agent:error", threadTs, { error: String(error) });
|
|
69229
68551
|
const errMsg = `:x: \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4: ${error instanceof Error ? error.message : "\uC54C \uC218 \uC5C6\uB294 \uC624\uB958"}`;
|
|
@@ -69241,16 +68563,6 @@ ${text2}` : text2;
|
|
|
69241
68563
|
deleteActiveKill(threadTs);
|
|
69242
68564
|
clearInterval(idleCheckHandle);
|
|
69243
68565
|
await setTypingStatus(client, channel, threadTs, "");
|
|
69244
|
-
const approvalKey = getApprovalKey(channel, threadTs);
|
|
69245
|
-
activeApprovalServers.delete(approvalKey);
|
|
69246
|
-
if (approvalServer) {
|
|
69247
|
-
await approvalServer.stop().catch(() => {
|
|
69248
|
-
});
|
|
69249
|
-
}
|
|
69250
|
-
if (cleanupHook) {
|
|
69251
|
-
await cleanupHook().catch(() => {
|
|
69252
|
-
});
|
|
69253
|
-
}
|
|
69254
68566
|
decrementActiveCount();
|
|
69255
68567
|
}
|
|
69256
68568
|
});
|
|
@@ -69261,19 +68573,19 @@ async function handleServiceEvent(event, ctx) {
|
|
|
69261
68573
|
if (!svc) return result;
|
|
69262
68574
|
if (svc.errorType === "transient" && ctx.retryCount < 1) {
|
|
69263
68575
|
result.retried = true;
|
|
69264
|
-
|
|
68576
|
+
log11.info("transient \uC5D0\uB7EC, \uC7AC\uC2DC\uB3C4 \uC548\uB0B4", { threadTs: ctx.threadTs });
|
|
69265
68577
|
if (ctx.responseTs) {
|
|
69266
68578
|
await ctx.client.chat.update({ channel: ctx.channel, ts: ctx.responseTs, text: ":warning: \uC77C\uC2DC\uC801 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4..." }).catch(() => {
|
|
69267
68579
|
});
|
|
69268
68580
|
}
|
|
69269
68581
|
result.appendText = "\n:warning: \uC77C\uC2DC\uC801 \uC624\uB958 \uBC1C\uC0DD. \uC7AC\uC2DC\uB3C4\uD558\uB824\uBA74 \uAC19\uC740 \uBA54\uC2DC\uC9C0\uB97C \uB2E4\uC2DC \uBCF4\uB0B4\uC8FC\uC138\uC694.";
|
|
69270
68582
|
} else if (svc.errorType === "session_corrupt") {
|
|
69271
|
-
|
|
68583
|
+
log11.info("session corrupt, \uC138\uC158 \uCD08\uAE30\uD654", { threadTs: ctx.threadTs });
|
|
69272
68584
|
clearSession(ctx.threadTs);
|
|
69273
68585
|
result.appendText = "\n:warning: \uC138\uC158 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD558\uC5EC \uC138\uC158\uC744 \uCD08\uAE30\uD654\uD588\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uBA54\uC2DC\uC9C0\uB97C \uBCF4\uB0B4\uC8FC\uC138\uC694.";
|
|
69274
68586
|
} else if (svc.errorType === "context_overflow" && !ctx.didAutoCompact) {
|
|
69275
68587
|
result.compacted = true;
|
|
69276
|
-
|
|
68588
|
+
log11.info("context overflow, \uC790\uB3D9 \uC555\uCD95 \uC2DC\uB3C4", { threadTs: ctx.threadTs });
|
|
69277
68589
|
if (ctx.responseTs) {
|
|
69278
68590
|
await ctx.client.chat.update({ channel: ctx.channel, ts: ctx.responseTs, text: ":warning: \uCEE8\uD14D\uC2A4\uD2B8\uAC00 \uAC00\uB4DD \uCC28\uC11C \uC555\uCD95 \uC911..." }).catch(() => {
|
|
69279
68591
|
});
|
|
@@ -69292,7 +68604,7 @@ async function handleServiceEvent(event, ctx) {
|
|
|
69292
68604
|
}
|
|
69293
68605
|
result.appendText = "\n:warning: \uCEE8\uD14D\uC2A4\uD2B8\uB97C \uC790\uB3D9 \uC555\uCD95\uD588\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uBA54\uC2DC\uC9C0\uB97C \uBCF4\uB0B4\uC8FC\uC138\uC694.";
|
|
69294
68606
|
} catch (compactErr) {
|
|
69295
|
-
|
|
68607
|
+
log11.error("\uC790\uB3D9 \uC555\uCD95 \uC2E4\uD328", { error: String(compactErr) });
|
|
69296
68608
|
result.appendText = "\n:x: \uCEE8\uD14D\uC2A4\uD2B8 \uC555\uCD95 \uC2E4\uD328. `$new`\uB85C \uC138\uC158\uC744 \uCD08\uAE30\uD654\uD574\uC8FC\uC138\uC694.";
|
|
69297
68609
|
}
|
|
69298
68610
|
} else {
|
|
@@ -69301,61 +68613,6 @@ async function handleServiceEvent(event, ctx) {
|
|
|
69301
68613
|
}
|
|
69302
68614
|
return result;
|
|
69303
68615
|
}
|
|
69304
|
-
async function sendApprovalButtons(client, channel, threadTs, request) {
|
|
69305
|
-
const summary = formatToolInline({ toolName: request.toolName, toolInput: request.toolInput });
|
|
69306
|
-
const buttonValue = `${request.requestId}:${request.toolName}`;
|
|
69307
|
-
try {
|
|
69308
|
-
await client.chat.postMessage({
|
|
69309
|
-
channel,
|
|
69310
|
-
thread_ts: threadTs,
|
|
69311
|
-
text: `\uB3C4\uAD6C \uC0AC\uC6A9 \uC2B9\uC778 \uC694\uCCAD: ${request.toolName}`,
|
|
69312
|
-
blocks: [
|
|
69313
|
-
{
|
|
69314
|
-
type: "section",
|
|
69315
|
-
text: {
|
|
69316
|
-
type: "mrkdwn",
|
|
69317
|
-
text: `:lock: *\uB3C4\uAD6C \uC0AC\uC6A9 \uC2B9\uC778 \uC694\uCCAD*
|
|
69318
|
-
|
|
69319
|
-
*\uB3C4\uAD6C:* \`${request.toolName}\`
|
|
69320
|
-
*\uB0B4\uC6A9:* ${summary}`
|
|
69321
|
-
}
|
|
69322
|
-
},
|
|
69323
|
-
{
|
|
69324
|
-
type: "actions",
|
|
69325
|
-
elements: [
|
|
69326
|
-
{
|
|
69327
|
-
type: "button",
|
|
69328
|
-
text: { type: "plain_text", text: "\uC774\uBC88\uB9CC \uC2B9\uC778" },
|
|
69329
|
-
style: "primary",
|
|
69330
|
-
action_id: "approve_tool",
|
|
69331
|
-
value: buttonValue
|
|
69332
|
-
},
|
|
69333
|
-
{
|
|
69334
|
-
type: "button",
|
|
69335
|
-
text: { type: "plain_text", text: "\uD56D\uC0C1 \uD5C8\uC6A9" },
|
|
69336
|
-
action_id: "approve_tool_always",
|
|
69337
|
-
value: buttonValue
|
|
69338
|
-
},
|
|
69339
|
-
{
|
|
69340
|
-
type: "button",
|
|
69341
|
-
text: { type: "plain_text", text: "\uAC70\uBD80" },
|
|
69342
|
-
style: "danger",
|
|
69343
|
-
action_id: "deny_tool",
|
|
69344
|
-
value: buttonValue
|
|
69345
|
-
}
|
|
69346
|
-
]
|
|
69347
|
-
}
|
|
69348
|
-
]
|
|
69349
|
-
});
|
|
69350
|
-
} catch (e2) {
|
|
69351
|
-
log14.error("\uC2B9\uC778 \uBC84\uD2BC \uC804\uC1A1 \uC2E4\uD328", { error: String(e2) });
|
|
69352
|
-
}
|
|
69353
|
-
}
|
|
69354
|
-
function parseButtonValue(raw) {
|
|
69355
|
-
const idx = raw.indexOf(":");
|
|
69356
|
-
if (idx === -1) return [raw, ""];
|
|
69357
|
-
return [raw.slice(0, idx), raw.slice(idx + 1)];
|
|
69358
|
-
}
|
|
69359
68616
|
function registerHandlers(app) {
|
|
69360
68617
|
const assistant = new import_bolt2.Assistant({
|
|
69361
68618
|
threadStarted: async ({ say, setSuggestedPrompts, setTitle }) => {
|
|
@@ -69373,7 +68630,7 @@ function registerHandlers(app) {
|
|
|
69373
68630
|
const msg = message;
|
|
69374
68631
|
if (msg.subtype && msg.subtype !== "file_share" || msg.bot_id) return;
|
|
69375
68632
|
const text = msg.text;
|
|
69376
|
-
|
|
68633
|
+
log11.info("userMessage \uC218\uC2E0", { text: text?.slice(0, 50), subtype: msg.subtype, filesCount: msg.files?.length ?? 0, msgKeys: Object.keys(message) });
|
|
69377
68634
|
if (!text && !msg.files?.length) return;
|
|
69378
68635
|
const threadTs = msg.thread_ts || msg.ts;
|
|
69379
68636
|
await setStatus("\uCC98\uB9AC \uC911...").catch(() => {
|
|
@@ -69430,74 +68687,16 @@ function registerHandlers(app) {
|
|
|
69430
68687
|
type: "section",
|
|
69431
68688
|
text: {
|
|
69432
68689
|
type: "mrkdwn",
|
|
69433
|
-
text: "*\uBA85\uB839\uC5B4*\n\n`$stop` / `$\uC911\uC9C0` \u2014 \uC2E4\uD589 \uC911\uC778 \uC791\uC5C5 \uC911\uB2E8\n`$new` \u2014 \uC138\uC158 \uCD08\uAE30\uD654 (\uB300\uD654 \uB9AC\uC14B)\n`$compact` \u2014 \uCEE8\uD14D\uC2A4\uD2B8 \uC555\uCD95\n`$model <\uC774\uB984>` \u2014 \uBAA8\uB378 \uBCC0\uACBD (sonnet/opus/haiku)\n`$
|
|
68690
|
+
text: "*\uBA85\uB839\uC5B4*\n\n`$stop` / `$\uC911\uC9C0` \u2014 \uC2E4\uD589 \uC911\uC778 \uC791\uC5C5 \uC911\uB2E8\n`$new` \u2014 \uC138\uC158 \uCD08\uAE30\uD654 (\uB300\uD654 \uB9AC\uC14B)\n`$compact` \u2014 \uCEE8\uD14D\uC2A4\uD2B8 \uC555\uCD95\n`$model <\uC774\uB984>` \u2014 \uBAA8\uB378 \uBCC0\uACBD (sonnet/opus/haiku)\n`$status` \u2014 \uD604\uC7AC \uC124\uC815 \uBC0F \uC0C1\uD0DC \uD655\uC778\n`$sessions` / `$\uC138\uC158` \u2014 \uD65C\uC131 \uC138\uC158 \uBAA9\uB85D\n`$resume <ID>` / `$\uC774\uC5B4\uC11C` \u2014 \uAE30\uC874 \uC138\uC158\uC5D0 \uC5F0\uACB0\n`$inject <ID> <\uBA85\uB839>` \u2014 \uD2B9\uC815 \uC138\uC158\uC5D0 \uBA85\uB839 \uC8FC\uC785\n`$usage` / `\uC0AC\uC6A9\uB7C9` \u2014 \uC0AC\uC6A9\uB7C9 \uB300\uC2DC\uBCF4\uB4DC\n`\uAE30\uC5B5\uD574: \uB0B4\uC6A9` \u2014 \uAE30\uC5B5 \uC800\uC7A5\n`\uAE30\uC5B5 \uBAA9\uB85D` \u2014 \uC800\uC7A5\uB41C \uAE30\uC5B5 \uC870\uD68C\n`\uD504\uB85C\uC81D\uD2B8: \uC774\uB984` \u2014 \uC791\uC5C5 \uB514\uB809\uD1A0\uB9AC \uC804\uD658\n`$help` \u2014 \uC804\uCCB4 \uB3C4\uC6C0\uB9D0"
|
|
69434
68691
|
}
|
|
69435
68692
|
}
|
|
69436
68693
|
]
|
|
69437
68694
|
}
|
|
69438
68695
|
});
|
|
69439
68696
|
} catch (e2) {
|
|
69440
|
-
|
|
68697
|
+
log11.error("App Home \uC5C5\uB370\uC774\uD2B8 \uC2E4\uD328", { error: String(e2), user: event.user });
|
|
69441
68698
|
}
|
|
69442
68699
|
});
|
|
69443
|
-
const APPROVAL_ACTIONS = {
|
|
69444
|
-
approve_tool: { decision: "allow", alwaysAllow: false, icon: ":white_check_mark:", label: "\uC2B9\uC778\uB428 (\uC774\uBC88\uB9CC)" },
|
|
69445
|
-
approve_tool_always: { decision: "allow", alwaysAllow: true, icon: ":white_check_mark:", label: "\uD56D\uC0C1 \uD5C8\uC6A9\uB428" },
|
|
69446
|
-
deny_tool: { decision: "deny", alwaysAllow: false, icon: ":x:", label: "\uAC70\uBD80\uB428" }
|
|
69447
|
-
};
|
|
69448
|
-
for (const [actionId, actionConfig] of Object.entries(APPROVAL_ACTIONS)) {
|
|
69449
|
-
app.action(actionId, async ({ action, body, client, ack }) => {
|
|
69450
|
-
await ack();
|
|
69451
|
-
const raw = "value" in action ? action.value : "";
|
|
69452
|
-
const [requestId, toolName] = parseButtonValue(raw);
|
|
69453
|
-
const channel = body.channel?.id;
|
|
69454
|
-
const messageTs = body.message?.ts;
|
|
69455
|
-
let resolved = false;
|
|
69456
|
-
const sdkPending = pendingApprovals.get(requestId);
|
|
69457
|
-
if (sdkPending) {
|
|
69458
|
-
clearTimeout(sdkPending.timer);
|
|
69459
|
-
pendingApprovals.delete(requestId);
|
|
69460
|
-
if (actionConfig.alwaysAllow && actionConfig.decision === "allow") {
|
|
69461
|
-
sdkPending.allowedTools.add(sdkPending.toolName);
|
|
69462
|
-
}
|
|
69463
|
-
sdkPending.resolve({ behavior: actionConfig.decision });
|
|
69464
|
-
resolved = true;
|
|
69465
|
-
}
|
|
69466
|
-
if (!resolved) {
|
|
69467
|
-
for (const server of activeApprovalServers.values()) {
|
|
69468
|
-
if (server.resolve(requestId, actionConfig.decision, actionConfig.alwaysAllow)) {
|
|
69469
|
-
resolved = true;
|
|
69470
|
-
break;
|
|
69471
|
-
}
|
|
69472
|
-
}
|
|
69473
|
-
}
|
|
69474
|
-
if (actionConfig.alwaysAllow && toolName) {
|
|
69475
|
-
const threadTs = body.message?.thread_ts;
|
|
69476
|
-
const workDir = (threadTs ? getWorkDir(threadTs) : null) || config.agent.workDir;
|
|
69477
|
-
await addToolToSettings(workDir, toolName).catch((e2) => {
|
|
69478
|
-
log14.error("settings.local.json \uC5C5\uB370\uC774\uD2B8 \uC2E4\uD328", { error: String(e2), toolName });
|
|
69479
|
-
});
|
|
69480
|
-
}
|
|
69481
|
-
if (channel && messageTs) {
|
|
69482
|
-
const toolLabel = toolName ? ` \u2014 \`${toolName}\`` : "";
|
|
69483
|
-
await client.chat.update({
|
|
69484
|
-
channel,
|
|
69485
|
-
ts: messageTs,
|
|
69486
|
-
text: `${actionConfig.icon} ${actionConfig.label}`,
|
|
69487
|
-
blocks: [
|
|
69488
|
-
{
|
|
69489
|
-
type: "section",
|
|
69490
|
-
text: {
|
|
69491
|
-
type: "mrkdwn",
|
|
69492
|
-
text: `${actionConfig.icon} *${actionConfig.label}*${toolLabel} ${resolved ? "" : "(\uC774\uBBF8 \uCC98\uB9AC\uB428)"}`
|
|
69493
|
-
}
|
|
69494
|
-
}
|
|
69495
|
-
]
|
|
69496
|
-
}).catch(() => {
|
|
69497
|
-
});
|
|
69498
|
-
}
|
|
69499
|
-
});
|
|
69500
|
-
}
|
|
69501
68700
|
app.message(async ({ message, client }) => {
|
|
69502
68701
|
const msg = message;
|
|
69503
68702
|
if (msg.subtype && msg.subtype !== "file_share" || msg.bot_id) return;
|
|
@@ -69556,7 +68755,7 @@ function registerHandlers(app) {
|
|
|
69556
68755
|
});
|
|
69557
68756
|
});
|
|
69558
68757
|
}
|
|
69559
|
-
var import_bolt2,
|
|
68758
|
+
var import_bolt2, log11, STREAM_UPDATE_INTERVAL_MS;
|
|
69560
68759
|
var init_handlers = __esm({
|
|
69561
68760
|
"src/slack/handlers.ts"() {
|
|
69562
68761
|
"use strict";
|
|
@@ -69573,19 +68772,14 @@ var init_handlers = __esm({
|
|
|
69573
68772
|
init_commands();
|
|
69574
68773
|
init_usage();
|
|
69575
68774
|
init_memory();
|
|
69576
|
-
init_skills();
|
|
69577
68775
|
init_context();
|
|
69578
|
-
init_server();
|
|
69579
|
-
init_setup();
|
|
69580
68776
|
init_slack_retry();
|
|
69581
68777
|
init_tool_formatter();
|
|
69582
68778
|
init_middleware();
|
|
69583
68779
|
init_file_downloader();
|
|
69584
68780
|
registerAllCommands();
|
|
69585
|
-
|
|
68781
|
+
log11 = createLogger("handler");
|
|
69586
68782
|
STREAM_UPDATE_INTERVAL_MS = 3e3;
|
|
69587
|
-
activeApprovalServers = /* @__PURE__ */ new Map();
|
|
69588
|
-
pendingApprovals = /* @__PURE__ */ new Map();
|
|
69589
68783
|
}
|
|
69590
68784
|
});
|
|
69591
68785
|
|
|
@@ -69623,13 +68817,13 @@ init_session();
|
|
|
69623
68817
|
|
|
69624
68818
|
// src/credentials/atlassian.ts
|
|
69625
68819
|
init_logger();
|
|
69626
|
-
import { readFile as
|
|
68820
|
+
import { readFile as readFile4, writeFile as writeFile4, mkdir as mkdir4, rm as rm2 } from "node:fs/promises";
|
|
69627
68821
|
import { existsSync as existsSync7 } from "node:fs";
|
|
69628
|
-
import { join as
|
|
68822
|
+
import { join as join5 } from "node:path";
|
|
69629
68823
|
import { homedir } from "node:os";
|
|
69630
|
-
var
|
|
69631
|
-
var CONFIG_DIR =
|
|
69632
|
-
var CRED_FILE =
|
|
68824
|
+
var log12 = createLogger("credentials");
|
|
68825
|
+
var CONFIG_DIR = join5(homedir(), ".config", "choavis-agent");
|
|
68826
|
+
var CRED_FILE = join5(CONFIG_DIR, "atlassian-credentials.json");
|
|
69633
68827
|
var DEFAULT_JIRA_URL = "https://musinsa-oneteam.atlassian.net";
|
|
69634
68828
|
async function loadAtlassianCredentials() {
|
|
69635
68829
|
if (process.env.JIRA_USERNAME && process.env.JIRA_API_TOKEN) {
|
|
@@ -69641,7 +68835,7 @@ async function loadAtlassianCredentials() {
|
|
|
69641
68835
|
}
|
|
69642
68836
|
if (!existsSync7(CRED_FILE)) return null;
|
|
69643
68837
|
try {
|
|
69644
|
-
const raw = await
|
|
68838
|
+
const raw = await readFile4(CRED_FILE, "utf-8");
|
|
69645
68839
|
const data = JSON.parse(raw);
|
|
69646
68840
|
if (!data.jiraUrl || !data.username || !data.apiToken) return null;
|
|
69647
68841
|
return data;
|
|
@@ -69655,15 +68849,15 @@ async function injectAtlassianEnv() {
|
|
|
69655
68849
|
process.env.JIRA_URL = creds.jiraUrl;
|
|
69656
68850
|
process.env.JIRA_USERNAME = creds.username;
|
|
69657
68851
|
process.env.JIRA_API_TOKEN = creds.apiToken;
|
|
69658
|
-
|
|
68852
|
+
log12.info("Atlassian \uD658\uACBD\uBCC0\uC218 \uC8FC\uC785 \uC644\uB8CC", { url: creds.jiraUrl });
|
|
69659
68853
|
return true;
|
|
69660
68854
|
}
|
|
69661
68855
|
|
|
69662
68856
|
// src/api/server.ts
|
|
69663
|
-
import { createServer
|
|
68857
|
+
import { createServer } from "node:http";
|
|
69664
68858
|
import { readFileSync as readFileSync4, existsSync as existsSync8, statSync as statSync2 } from "node:fs";
|
|
69665
|
-
import { resolve as resolve3, extname, dirname as
|
|
69666
|
-
import { fileURLToPath as
|
|
68859
|
+
import { resolve as resolve3, extname, dirname as dirname4 } from "node:path";
|
|
68860
|
+
import { fileURLToPath as fileURLToPath3 } from "node:url";
|
|
69667
68861
|
|
|
69668
68862
|
// node_modules/.pnpm/ws@8.19.0/node_modules/ws/wrapper.mjs
|
|
69669
68863
|
var import_stream = __toESM(require_stream(), 1);
|
|
@@ -69680,10 +68874,10 @@ init_middleware();
|
|
|
69680
68874
|
init_config();
|
|
69681
68875
|
init_slack_info();
|
|
69682
68876
|
init_logger();
|
|
69683
|
-
var
|
|
68877
|
+
var log13 = createLogger("api");
|
|
69684
68878
|
var VERSION = "1.0.0";
|
|
69685
|
-
var
|
|
69686
|
-
var FRONTEND_DIR = process.env.FRONTEND_DIR ?? (existsSync8(resolve3(
|
|
68879
|
+
var __dirname3 = dirname4(fileURLToPath3(import.meta.url));
|
|
68880
|
+
var FRONTEND_DIR = process.env.FRONTEND_DIR ?? (existsSync8(resolve3(__dirname3, "../dist-frontend")) ? resolve3(__dirname3, "../dist-frontend") : resolve3(__dirname3, "../../dist-frontend"));
|
|
69687
68881
|
var MIME_TYPES = {
|
|
69688
68882
|
".html": "text/html; charset=utf-8",
|
|
69689
68883
|
".js": "application/javascript; charset=utf-8",
|
|
@@ -69780,7 +68974,7 @@ async function handleRequest(req, res) {
|
|
|
69780
68974
|
const summary = await getUsageSummary(config.usage.dataDir, { days });
|
|
69781
68975
|
sendJson(res, 200, summary);
|
|
69782
68976
|
} catch (err) {
|
|
69783
|
-
|
|
68977
|
+
log13.error("\uC0AC\uC6A9\uB7C9 \uC870\uD68C \uC2E4\uD328", { error: String(err) });
|
|
69784
68978
|
sendError(res, 500, "Failed to get usage summary");
|
|
69785
68979
|
}
|
|
69786
68980
|
return;
|
|
@@ -69839,28 +69033,28 @@ function createApiServer() {
|
|
|
69839
69033
|
},
|
|
69840
69034
|
async start(port) {
|
|
69841
69035
|
return new Promise((resolve5, reject) => {
|
|
69842
|
-
httpServer =
|
|
69036
|
+
httpServer = createServer((req, res) => {
|
|
69843
69037
|
handleRequest(req, res).catch((err) => {
|
|
69844
|
-
|
|
69038
|
+
log13.error("\uC694\uCCAD \uCC98\uB9AC \uC624\uB958", { error: String(err) });
|
|
69845
69039
|
if (!res.headersSent) sendError(res, 500, "Internal server error");
|
|
69846
69040
|
});
|
|
69847
69041
|
});
|
|
69848
69042
|
wss = new import_websocket_server.default({ server: httpServer, path: "/ws" });
|
|
69849
69043
|
wss.on("connection", (ws) => {
|
|
69850
|
-
|
|
69044
|
+
log13.info("WebSocket \uD074\uB77C\uC774\uC5B8\uD2B8 \uC5F0\uACB0");
|
|
69851
69045
|
ws.send(JSON.stringify({ type: "snapshot", data: getAllSessions() }));
|
|
69852
69046
|
ws.on("close", () => {
|
|
69853
|
-
|
|
69047
|
+
log13.info("WebSocket \uD074\uB77C\uC774\uC5B8\uD2B8 \uC5F0\uACB0 \uC885\uB8CC");
|
|
69854
69048
|
});
|
|
69855
69049
|
});
|
|
69856
69050
|
eventBus.on("agent", broadcast);
|
|
69857
69051
|
httpServer.on("error", (err) => {
|
|
69858
|
-
|
|
69052
|
+
log13.error("API \uC11C\uBC84 \uC624\uB958", { error: String(err) });
|
|
69859
69053
|
reject(err);
|
|
69860
69054
|
});
|
|
69861
69055
|
httpServer.listen(port, () => {
|
|
69862
69056
|
_port = port;
|
|
69863
|
-
|
|
69057
|
+
log13.info("API + WebSocket \uC11C\uBC84 \uC2DC\uC791", { port });
|
|
69864
69058
|
resolve5();
|
|
69865
69059
|
});
|
|
69866
69060
|
});
|
|
@@ -69920,7 +69114,7 @@ function releaseLock() {
|
|
|
69920
69114
|
} catch {
|
|
69921
69115
|
}
|
|
69922
69116
|
}
|
|
69923
|
-
var
|
|
69117
|
+
var log14 = createLogger("main");
|
|
69924
69118
|
async function main() {
|
|
69925
69119
|
if (!acquireLock()) {
|
|
69926
69120
|
process.exit(1);
|
|
@@ -69928,12 +69122,12 @@ async function main() {
|
|
|
69928
69122
|
let app;
|
|
69929
69123
|
let apiServer;
|
|
69930
69124
|
const shutdown = async () => {
|
|
69931
|
-
|
|
69125
|
+
log14.info("\uC885\uB8CC \uC2DC\uC791");
|
|
69932
69126
|
releaseLock();
|
|
69933
69127
|
try {
|
|
69934
69128
|
saveSessionsSync();
|
|
69935
69129
|
} catch (e2) {
|
|
69936
|
-
|
|
69130
|
+
log14.error("\uC138\uC158 \uC800\uC7A5 \uC2E4\uD328", { error: String(e2) });
|
|
69937
69131
|
}
|
|
69938
69132
|
try {
|
|
69939
69133
|
await apiServer?.stop();
|
|
@@ -69943,7 +69137,7 @@ async function main() {
|
|
|
69943
69137
|
await app?.stop();
|
|
69944
69138
|
} catch {
|
|
69945
69139
|
}
|
|
69946
|
-
|
|
69140
|
+
log14.info("\uC885\uB8CC \uC644\uB8CC");
|
|
69947
69141
|
process.exit(0);
|
|
69948
69142
|
};
|
|
69949
69143
|
process.on("SIGINT", () => void shutdown());
|
|
@@ -69951,19 +69145,19 @@ async function main() {
|
|
|
69951
69145
|
loadSessions();
|
|
69952
69146
|
const hasAtlassian = await injectAtlassianEnv();
|
|
69953
69147
|
if (hasAtlassian) {
|
|
69954
|
-
|
|
69148
|
+
log14.info("Atlassian \uC5F0\uB3D9 \uD65C\uC131\uD654\uB428");
|
|
69955
69149
|
}
|
|
69956
69150
|
app = createApp();
|
|
69957
69151
|
registerHandlers(app);
|
|
69958
69152
|
apiServer = createApiServer();
|
|
69959
69153
|
await apiServer.start(config.monitorPort);
|
|
69960
|
-
|
|
69154
|
+
log14.info("\uBAA8\uB2C8\uD130\uB9C1 API \uC11C\uBC84 \uC2DC\uC791", { port: config.monitorPort });
|
|
69961
69155
|
await initSlackInfo(app.client);
|
|
69962
69156
|
await app.start();
|
|
69963
|
-
|
|
69157
|
+
log14.info("Choavis Agent\uAC00 \uC2E4\uD589 \uC911\uC785\uB2C8\uB2E4 (Socket Mode)");
|
|
69964
69158
|
}
|
|
69965
69159
|
main().catch((err) => {
|
|
69966
|
-
|
|
69160
|
+
log14.error("\uC2DC\uC791 \uC2E4\uD328", { error: String(err) });
|
|
69967
69161
|
releaseLock();
|
|
69968
69162
|
process.exit(1);
|
|
69969
69163
|
});
|