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.
Files changed (227) hide show
  1. package/dist/index.js +163 -969
  2. package/package.json +18 -24
  3. package/scripts/install.command +0 -0
  4. package/dist/agent/adapters/claude.d.ts +0 -13
  5. package/dist/agent/adapters/claude.d.ts.map +0 -1
  6. package/dist/agent/adapters/claude.js +0 -199
  7. package/dist/agent/adapters/claude.js.map +0 -1
  8. package/dist/agent/memory.d.ts +0 -13
  9. package/dist/agent/memory.d.ts.map +0 -1
  10. package/dist/agent/memory.js +0 -70
  11. package/dist/agent/memory.js.map +0 -1
  12. package/dist/agent/process-pool.d.ts +0 -61
  13. package/dist/agent/process-pool.d.ts.map +0 -1
  14. package/dist/agent/process-pool.js +0 -312
  15. package/dist/agent/process-pool.js.map +0 -1
  16. package/dist/agent/protocol.d.ts +0 -56
  17. package/dist/agent/protocol.d.ts.map +0 -1
  18. package/dist/agent/protocol.js +0 -9
  19. package/dist/agent/protocol.js.map +0 -1
  20. package/dist/agent/queue.d.ts +0 -14
  21. package/dist/agent/queue.d.ts.map +0 -1
  22. package/dist/agent/queue.js +0 -93
  23. package/dist/agent/queue.js.map +0 -1
  24. package/dist/agent/runner.d.ts +0 -49
  25. package/dist/agent/runner.d.ts.map +0 -1
  26. package/dist/agent/runner.js +0 -157
  27. package/dist/agent/runner.js.map +0 -1
  28. package/dist/agent/session-pool.d.ts +0 -37
  29. package/dist/agent/session-pool.d.ts.map +0 -1
  30. package/dist/agent/session-pool.js +0 -214
  31. package/dist/agent/session-pool.js.map +0 -1
  32. package/dist/agent/session.d.ts +0 -34
  33. package/dist/agent/session.d.ts.map +0 -1
  34. package/dist/agent/session.js +0 -200
  35. package/dist/agent/session.js.map +0 -1
  36. package/dist/agent/usage.d.ts +0 -30
  37. package/dist/agent/usage.d.ts.map +0 -1
  38. package/dist/agent/usage.js +0 -76
  39. package/dist/agent/usage.js.map +0 -1
  40. package/dist/api/server.d.ts +0 -7
  41. package/dist/api/server.d.ts.map +0 -1
  42. package/dist/api/server.js +0 -221
  43. package/dist/api/server.js.map +0 -1
  44. package/dist/approval/server.d.ts +0 -34
  45. package/dist/approval/server.d.ts.map +0 -1
  46. package/dist/approval/server.js +0 -156
  47. package/dist/approval/server.js.map +0 -1
  48. package/dist/approval/setup.d.ts +0 -7
  49. package/dist/approval/setup.d.ts.map +0 -1
  50. package/dist/approval/setup.js +0 -112
  51. package/dist/approval/setup.js.map +0 -1
  52. package/dist/cli/config.d.ts +0 -2
  53. package/dist/cli/config.d.ts.map +0 -1
  54. package/dist/cli/config.js +0 -94
  55. package/dist/cli/config.js.map +0 -1
  56. package/dist/cli/env.d.ts +0 -3
  57. package/dist/cli/env.d.ts.map +0 -1
  58. package/dist/cli/env.js +0 -27
  59. package/dist/cli/env.js.map +0 -1
  60. package/dist/cli/help.d.ts +0 -2
  61. package/dist/cli/help.d.ts.map +0 -1
  62. package/dist/cli/help.js +0 -27
  63. package/dist/cli/help.js.map +0 -1
  64. package/dist/cli/init.d.ts +0 -2
  65. package/dist/cli/init.d.ts.map +0 -1
  66. package/dist/cli/init.js +0 -56
  67. package/dist/cli/init.js.map +0 -1
  68. package/dist/cli/onboard.d.ts +0 -2
  69. package/dist/cli/onboard.d.ts.map +0 -1
  70. package/dist/cli/onboard.js +0 -426
  71. package/dist/cli/onboard.js.map +0 -1
  72. package/dist/cli/prompts.d.ts +0 -11
  73. package/dist/cli/prompts.d.ts.map +0 -1
  74. package/dist/cli/prompts.js +0 -47
  75. package/dist/cli/prompts.js.map +0 -1
  76. package/dist/cli.d.ts +0 -3
  77. package/dist/cli.d.ts.map +0 -1
  78. package/dist/cli.js +0 -62307
  79. package/dist/cli.js.map +0 -1
  80. package/dist/config.d.ts +0 -42
  81. package/dist/config.d.ts.map +0 -1
  82. package/dist/config.js +0 -72
  83. package/dist/config.js.map +0 -1
  84. package/dist/credentials/atlassian.d.ts +0 -15
  85. package/dist/credentials/atlassian.d.ts.map +0 -1
  86. package/dist/credentials/atlassian.js +0 -65
  87. package/dist/credentials/atlassian.js.map +0 -1
  88. package/dist/events/bus.d.ts +0 -11
  89. package/dist/events/bus.d.ts.map +0 -1
  90. package/dist/events/bus.js +0 -19
  91. package/dist/events/bus.js.map +0 -1
  92. package/dist/index.d.ts +0 -2
  93. package/dist/index.d.ts.map +0 -1
  94. package/dist/index.js.map +0 -1
  95. package/dist/scheduler/briefing.d.ts +0 -7
  96. package/dist/scheduler/briefing.d.ts.map +0 -1
  97. package/dist/scheduler/briefing.js +0 -165
  98. package/dist/scheduler/briefing.js.map +0 -1
  99. package/dist/slack/agent-executor.d.ts +0 -13
  100. package/dist/slack/agent-executor.d.ts.map +0 -1
  101. package/dist/slack/agent-executor.js +0 -283
  102. package/dist/slack/agent-executor.js.map +0 -1
  103. package/dist/slack/app.d.ts +0 -3
  104. package/dist/slack/app.d.ts.map +0 -1
  105. package/dist/slack/app.js +0 -11
  106. package/dist/slack/app.js.map +0 -1
  107. package/dist/slack/approval-actions.d.ts +0 -13
  108. package/dist/slack/approval-actions.d.ts.map +0 -1
  109. package/dist/slack/approval-actions.js +0 -199
  110. package/dist/slack/approval-actions.js.map +0 -1
  111. package/dist/slack/commands/briefing.d.ts +0 -3
  112. package/dist/slack/commands/briefing.d.ts.map +0 -1
  113. package/dist/slack/commands/briefing.js +0 -22
  114. package/dist/slack/commands/briefing.js.map +0 -1
  115. package/dist/slack/commands/compact.d.ts +0 -3
  116. package/dist/slack/commands/compact.d.ts.map +0 -1
  117. package/dist/slack/commands/compact.js +0 -53
  118. package/dist/slack/commands/compact.js.map +0 -1
  119. package/dist/slack/commands/help.d.ts +0 -3
  120. package/dist/slack/commands/help.d.ts.map +0 -1
  121. package/dist/slack/commands/help.js +0 -57
  122. package/dist/slack/commands/help.js.map +0 -1
  123. package/dist/slack/commands/index.d.ts +0 -7
  124. package/dist/slack/commands/index.d.ts.map +0 -1
  125. package/dist/slack/commands/index.js +0 -53
  126. package/dist/slack/commands/index.js.map +0 -1
  127. package/dist/slack/commands/inject.d.ts +0 -3
  128. package/dist/slack/commands/inject.d.ts.map +0 -1
  129. package/dist/slack/commands/inject.js +0 -44
  130. package/dist/slack/commands/inject.js.map +0 -1
  131. package/dist/slack/commands/memory.d.ts +0 -3
  132. package/dist/slack/commands/memory.d.ts.map +0 -1
  133. package/dist/slack/commands/memory.js +0 -82
  134. package/dist/slack/commands/memory.js.map +0 -1
  135. package/dist/slack/commands/model.d.ts +0 -3
  136. package/dist/slack/commands/model.d.ts.map +0 -1
  137. package/dist/slack/commands/model.js +0 -43
  138. package/dist/slack/commands/model.js.map +0 -1
  139. package/dist/slack/commands/new.d.ts +0 -3
  140. package/dist/slack/commands/new.d.ts.map +0 -1
  141. package/dist/slack/commands/new.js +0 -24
  142. package/dist/slack/commands/new.js.map +0 -1
  143. package/dist/slack/commands/permission.d.ts +0 -3
  144. package/dist/slack/commands/permission.d.ts.map +0 -1
  145. package/dist/slack/commands/permission.js +0 -51
  146. package/dist/slack/commands/permission.js.map +0 -1
  147. package/dist/slack/commands/project.d.ts +0 -3
  148. package/dist/slack/commands/project.d.ts.map +0 -1
  149. package/dist/slack/commands/project.js +0 -41
  150. package/dist/slack/commands/project.js.map +0 -1
  151. package/dist/slack/commands/resume.d.ts +0 -3
  152. package/dist/slack/commands/resume.d.ts.map +0 -1
  153. package/dist/slack/commands/resume.js +0 -93
  154. package/dist/slack/commands/resume.js.map +0 -1
  155. package/dist/slack/commands/session-info.d.ts +0 -3
  156. package/dist/slack/commands/session-info.d.ts.map +0 -1
  157. package/dist/slack/commands/session-info.js +0 -33
  158. package/dist/slack/commands/session-info.js.map +0 -1
  159. package/dist/slack/commands/sessions.d.ts +0 -3
  160. package/dist/slack/commands/sessions.d.ts.map +0 -1
  161. package/dist/slack/commands/sessions.js +0 -54
  162. package/dist/slack/commands/sessions.js.map +0 -1
  163. package/dist/slack/commands/status.d.ts +0 -3
  164. package/dist/slack/commands/status.d.ts.map +0 -1
  165. package/dist/slack/commands/status.js +0 -64
  166. package/dist/slack/commands/status.js.map +0 -1
  167. package/dist/slack/commands/stop.d.ts +0 -3
  168. package/dist/slack/commands/stop.d.ts.map +0 -1
  169. package/dist/slack/commands/stop.js +0 -31
  170. package/dist/slack/commands/stop.js.map +0 -1
  171. package/dist/slack/commands/types.d.ts +0 -22
  172. package/dist/slack/commands/types.d.ts.map +0 -1
  173. package/dist/slack/commands/types.js +0 -2
  174. package/dist/slack/commands/types.js.map +0 -1
  175. package/dist/slack/commands/usage.d.ts +0 -8
  176. package/dist/slack/commands/usage.d.ts.map +0 -1
  177. package/dist/slack/commands/usage.js +0 -143
  178. package/dist/slack/commands/usage.js.map +0 -1
  179. package/dist/slack/context.d.ts +0 -16
  180. package/dist/slack/context.d.ts.map +0 -1
  181. package/dist/slack/context.js +0 -90
  182. package/dist/slack/context.js.map +0 -1
  183. package/dist/slack/file-downloader.d.ts +0 -18
  184. package/dist/slack/file-downloader.d.ts.map +0 -1
  185. package/dist/slack/file-downloader.js +0 -196
  186. package/dist/slack/file-downloader.js.map +0 -1
  187. package/dist/slack/formatter.d.ts +0 -36
  188. package/dist/slack/formatter.d.ts.map +0 -1
  189. package/dist/slack/formatter.js +0 -247
  190. package/dist/slack/formatter.js.map +0 -1
  191. package/dist/slack/handlers.d.ts +0 -5
  192. package/dist/slack/handlers.d.ts.map +0 -1
  193. package/dist/slack/handlers.js +0 -636
  194. package/dist/slack/handlers.js.map +0 -1
  195. package/dist/slack/link-resolver.d.ts +0 -24
  196. package/dist/slack/link-resolver.d.ts.map +0 -1
  197. package/dist/slack/link-resolver.js +0 -52
  198. package/dist/slack/link-resolver.js.map +0 -1
  199. package/dist/slack/middleware.d.ts +0 -17
  200. package/dist/slack/middleware.d.ts.map +0 -1
  201. package/dist/slack/middleware.js +0 -73
  202. package/dist/slack/middleware.js.map +0 -1
  203. package/dist/slack/response.d.ts +0 -19
  204. package/dist/slack/response.d.ts.map +0 -1
  205. package/dist/slack/response.js +0 -99
  206. package/dist/slack/response.js.map +0 -1
  207. package/dist/slack/slack-retry.d.ts +0 -18
  208. package/dist/slack/slack-retry.d.ts.map +0 -1
  209. package/dist/slack/slack-retry.js +0 -71
  210. package/dist/slack/slack-retry.js.map +0 -1
  211. package/dist/slack/streaming.d.ts +0 -54
  212. package/dist/slack/streaming.d.ts.map +0 -1
  213. package/dist/slack/streaming.js +0 -151
  214. package/dist/slack/streaming.js.map +0 -1
  215. package/dist/slack/tool-formatter.d.ts +0 -18
  216. package/dist/slack/tool-formatter.d.ts.map +0 -1
  217. package/dist/slack/tool-formatter.js +0 -154
  218. package/dist/slack/tool-formatter.js.map +0 -1
  219. package/dist/slack/types.d.ts +0 -22
  220. package/dist/slack/types.d.ts.map +0 -1
  221. package/dist/slack/types.js +0 -2
  222. package/dist/slack/types.js.map +0 -1
  223. package/dist/utils/logger.d.ts +0 -9
  224. package/dist/utils/logger.d.ts.map +0 -1
  225. package/dist/utils/logger.js +0 -49
  226. package/dist/utils/logger.js.map +0 -1
  227. 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 crypto2 = __require("crypto");
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 = crypto2.createDecipheriv("aes-256-gcm", key, nonce);
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 crypto2 = __require("crypto");
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 = "--------------------------" + crypto2.randomBytes(12).toString("hex");
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 = log18;
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 log18(...args) {
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 crypto2 = __require("crypto");
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(crypto2);
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 crypto2 = __require("crypto");
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 crypto2.createPublicKey === "function";
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 = crypto2.createHmac("sha" + bits, secret);
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 crypto2 ? function timingSafeEqual2(a2, b2) {
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 crypto2.timingSafeEqual(a2, b2);
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 = crypto2.createSign("RSA-SHA" + bits);
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 = crypto2.createVerify("RSA-SHA" + bits);
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 = crypto2.createSign("RSA-SHA" + bits);
22258
+ var signer = crypto.createSign("RSA-SHA" + bits);
22259
22259
  var sig = (signer.update(thing), signer.sign({
22260
22260
  key: privateKey,
22261
- padding: crypto2.constants.RSA_PKCS1_PSS_PADDING,
22262
- saltLength: crypto2.constants.RSA_PSS_SALTLEN_DIGEST
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 = crypto2.createVerify("RSA-SHA" + bits);
22272
+ var verifier = crypto.createVerify("RSA-SHA" + bits);
22273
22273
  verifier.update(thing);
22274
22274
  return verifier.verify({
22275
22275
  key: publicKey,
22276
- padding: crypto2.constants.RSA_PKCS1_PSS_PADDING,
22277
- saltLength: crypto2.constants.RSA_PSS_SALTLEN_DIGEST
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
- log18.call(deprecate, message);
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 log18(message, site) {
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, log18, this, message, site);
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
- log18.call(deprecate, message, site);
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
- log18.call(deprecate, message, site);
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 crypto2 = __require("crypto");
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 (crypto2.timingSafeEqual) {
31921
- return crypto2.timingSafeEqual(a2, b2);
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 = crypto2.pseudoRandomBytes(32);
31934
- var ah = crypto2.createHmac("sha256", key).update(sa).digest();
31935
- var bh = crypto2.createHmac("sha256", key).update(sb).digest();
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 dirname6 = path.dirname;
50872
+ var dirname5 = path.dirname;
50873
50873
  var basename = path.basename;
50874
50874
  var extname2 = path.extname;
50875
- var join7 = path.join;
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 = dirname6(loc);
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 = join7(dir, file);
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 = join7(dir, basename(file, ext), "index" + ext);
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 crypto2 = __require("crypto");
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 = crypto2.createHash("sha1").update(entity, "utf8").digest("base64").substring(0, 27);
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 crypto2 = __require("crypto");
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 + "." + crypto2.createHmac("sha256", secret).update(val).digest("base64").replace(/\=+$/, "");
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 && crypto2.timingSafeEqual(expectedBuffer, inputBuffer) ? tentativeValue : false;
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 join7 = path.join;
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(join7(root, path2));
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 = join7(path2, self2._index[i2]);
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 log18(level, message, data) {
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) => log18("debug", message, data),
65724
- info: (message, data) => log18("info", message, data),
65725
- warn: (message, data) => log18("warn", message, data),
65726
- error: (message, data) => log18("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 extractFileInfo2(toolName, toolInput) {
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 = extractFileInfo2(block.name, toolInput);
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 = extractFileInfo2(toolName, toolInput);
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
- log2.info("unhandled SDK event", { type: msg.type });
65912
+ log.info("unhandled SDK event", { type: msg.type });
66083
65913
  }
66084
65914
  }
66085
65915
  }
66086
- var log2;
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
- log2 = createLogger("adapter:sdk");
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
- if (config.agent.backend === "sdk") {
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: permMode,
65995
+ permissionMode: "bypassPermissions",
66185
65996
  env: sdkEnv,
66186
- // bypassPermissions 모드에서 SDK가 요구하는 필수 플래그
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
- function runAgent(options) {
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
- log3.info("\uC138\uC158 \uBCF5\uC6D0\uB428", { count: store.size });
66081
+ log2.info("\uC138\uC158 \uBCF5\uC6D0\uB428", { count: store.size });
66393
66082
  } catch {
66394
- log3.warn("\uC138\uC158 \uD30C\uC77C \uD30C\uC2F1 \uC2E4\uD328, \uBE48 \uC0C1\uD0DC\uB85C \uC2DC\uC791");
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
- log3.error("\uC138\uC158 \uC800\uC7A5 \uC2E4\uD328", { error: String(err) });
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
- log3.error("\uC138\uC158 \uB3D9\uAE30 \uC800\uC7A5 \uC2E4\uD328", { error: String(err) });
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
- log3.info("idle \uB9AC\uC14B", { threadTs, idleMinutes: config.session.idleResetMinutes });
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
- log3.info("daily \uB9AC\uC14B", { threadTs, resetHour });
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 log3, store, SESSION_TTL_MS, saveTimer, SAVE_DEBOUNCE_MS;
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
- log3 = createLogger("session");
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
- log4.info(`\uC2A4\uB808\uB4DC ${threadTs} \uD050 \uC815\uB9AC\uB428`);
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
- log4.error(`\uC2A4\uB808\uB4DC ${threadTs} \uC791\uC5C5 \uC2E4\uD589 \uC911 \uC624\uB958`, { error: String(err) });
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 log4, CLEANUP_DELAY_MS, queues;
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
- log4 = createLogger("queue");
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
- log5.info("Slack \uB9C1\uD06C \uD30C\uC2F1", { channel, threadTs });
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
- log5.info("\uB9C1\uD06C\uB41C \uC2A4\uB808\uB4DC\uC5D0 \uC138\uC158 \uC5C6\uC74C", { threadTs: link.threadTs });
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
- log5.info("\uB9C1\uD06C\uC5D0\uC11C \uC138\uC158 \uC870\uD68C \uC131\uACF5", { threadTs: link.threadTs, sessionId });
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 log5;
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
- log5 = createLogger("link-resolver");
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
- log6.error("\uC0AC\uC6A9\uB7C9 \uAE30\uB85D \uC2E4\uD328", { error: String(err) });
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 log6;
66866
+ var log5;
67239
66867
  var init_usage = __esm({
67240
66868
  "src/agent/usage.ts"() {
67241
66869
  "use strict";
67242
66870
  init_logger();
67243
- log6 = createLogger("usage");
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
- log7.warn("\uBA54\uBAA8\uB9AC \uD30C\uC77C \uD30C\uC2F1 \uC2E4\uD328", { filePath });
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 log7;
67294
+ var log6;
67669
67295
  var init_memory = __esm({
67670
67296
  "src/agent/memory.ts"() {
67671
67297
  "use strict";
67672
67298
  init_logger();
67673
- log7 = createLogger("memory");
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 log8, BOOT_TS, processedMessages, DEDUP_TTL_MS, mentionStartedThreads, MENTION_TRACK_TTL_MS, MAX_CONCURRENT, activeAgentCount, activeKills;
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
- log8 = createLogger("middleware");
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
- log9.warn("\uC2A4\uB808\uB4DC \uCEE8\uD14D\uC2A4\uD2B8 \uC870\uD68C \uC2E4\uD328", { error: String(err) });
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 log9, MAX_CONTEXT_CHARS;
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
- log9 = createLogger("context");
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
- log12.error(`${label} \uCD5C\uC885 \uC2E4\uD328`, { attempt, error: String(err) });
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
- log12.warn(`${label} \uC7AC\uC2DC\uB3C4 ${attempt + 1}/${opts.maxRetries}`, { delayMs: Math.round(delayMs), error: String(err) });
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
- log12.warn(`${label} best-effort \uC2E4\uD328, \uBB34\uC2DC`);
67875
+ log9.warn(`${label} best-effort \uC2E4\uD328, \uBB34\uC2DC`);
68505
67876
  return void 0;
68506
67877
  }
68507
67878
  }
68508
- var log12, DEFAULT_OPTIONS;
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
- log12 = createLogger("slack-retry");
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 mkdir4, writeFile as writeFile4, readFile as readFile4, rm } from "node:fs/promises";
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 join5 } from "node:path";
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
- log13.info("\uCCA8\uBD80 \uD30C\uC77C \uC815\uB9AC \uC644\uB8CC", { dir: dirPath });
68073
+ log10.info("\uCCA8\uBD80 \uD30C\uC77C \uC815\uB9AC \uC644\uB8CC", { dir: dirPath });
68707
68074
  } catch (err) {
68708
- log13.warn("\uCCA8\uBD80 \uD30C\uC77C \uC815\uB9AC \uC2E4\uD328", { dir: dirPath, error: String(err) });
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
- log13.info("files.info \uC870\uD68C \uC131\uACF5", { fileId, hasDownloadUrl: !!info.file?.url_private_download });
68088
+ log10.info("files.info \uC870\uD68C \uC131\uACF5", { fileId, hasDownloadUrl: !!info.file?.url_private_download });
68722
68089
  } catch (err) {
68723
- log13.warn("files.info \uC870\uD68C \uC2E4\uD328, fallback URL \uC0AC\uC6A9", { fileId, error: String(err) });
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
- log13.info("\uB9AC\uB2E4\uC774\uB809\uD2B8 \uB530\uB77C\uAC10", { location: location.slice(0, 80) });
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 readFile4(f.localPath, "utf-8");
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 = join5(BASE_DIR, sanitize(threadTs));
68190
+ const dir = join4(BASE_DIR, sanitize(threadTs));
68824
68191
  if (!existsSync6(dir)) {
68825
- await mkdir4(dir, { recursive: true });
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
- log13.info("\uD30C\uC77C \uB2E4\uC6B4\uB85C\uB4DC \uC2DC\uC791", { name: f.name, fileId: f.id, mimetype: f.mimetype });
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 = join5(dir, safeName);
68834
- await writeFile4(localPath, buffer);
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
- log13.info("\uD30C\uC77C \uB2E4\uC6B4\uB85C\uB4DC \uC644\uB8CC", { name: f.name, size: buffer.length, path: localPath });
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
- log13.error("\uD30C\uC77C \uB2E4\uC6B4\uB85C\uB4DC \uC2E4\uD328", { name: f.name, error: String(err) });
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 log13, MAX_FILE_SIZE, MAX_TOTAL_SIZE, TEXT_INLINE_THRESHOLD, TEXT_PREVIEW_LINES, BASE_DIR, CLEANUP_DELAY_MS2, TEXT_MIME_PREFIXES, TEXT_FILETYPES;
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
- log13 = createLogger("file-downloader");
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
- log14.info("\uBD80\uD305 \uC774\uC804 \uBA54\uC2DC\uC9C0 \uBB34\uC2DC", { messageTs });
68297
+ log11.info("\uBD80\uD305 \uC774\uC804 \uBA54\uC2DC\uC9C0 \uBB34\uC2DC", { messageTs });
68934
68298
  return;
68935
68299
  }
68936
68300
  if (isDuplicate(messageTs)) {
68937
- log14.info("\uC911\uBCF5 \uBA54\uC2DC\uC9C0 \uBB34\uC2DC", { messageTs });
68301
+ log11.info("\uC911\uBCF5 \uBA54\uC2DC\uC9C0 \uBB34\uC2DC", { messageTs });
68938
68302
  return;
68939
68303
  }
68940
68304
  if (!isAllowedUser(userId)) {
68941
- log14.warn("\uD5C8\uC6A9\uB418\uC9C0 \uC54A\uC740 \uC0AC\uC6A9\uC790", { userId });
68305
+ log11.warn("\uD5C8\uC6A9\uB418\uC9C0 \uC54A\uC740 \uC0AC\uC6A9\uC790", { userId });
68942
68306
  return;
68943
68307
  }
68944
68308
  }
68945
- log14.info("\uBA54\uC2DC\uC9C0 \uC218\uC2E0", { text: text.slice(0, 50), threadTs });
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
- log14.info("\uB9C1\uD06C\uC5D0\uC11C \uC138\uC158 \uC790\uB3D9 \uC5F0\uACB0", { threadTs, linkedSessionId: linked.sessionId });
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
- log14.warn("\uB3D9\uC2DC \uD504\uB85C\uC138\uC2A4 \uC81C\uD55C \uCD08\uACFC", { activeAgentCount: activeAgentCount2, MAX_CONCURRENT: MAX_CONCURRENT2 });
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
- log14.info("\uD050 \uB300\uAE30 \uC911", { threadTs, queueSize });
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
- log14.warn("subprocess \uC751\uB2F5 \uC5C6\uC74C", { threadTs, idleCheckCount, maxChecks: config.agent.maxIdleChecks });
68356
+ log11.warn("subprocess \uC751\uB2F5 \uC5C6\uC74C", { threadTs, idleCheckCount, maxChecks: config.agent.maxIdleChecks });
68993
68357
  if (idleCheckCount >= config.agent.maxIdleChecks) {
68994
- log14.warn("\uCD5C\uB300 idle \uCCB4\uD06C \uCD08\uACFC, \uD504\uB85C\uC138\uC2A4 \uC911\uB2E8", { threadTs });
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 permMode = config.agent.permissionMode;
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
- log14.error("\uC2A4\uD2B8\uB9BC \uCC98\uB9AC \uC624\uB958", { error: String(streamErr) });
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
- log14.info("\uC138\uC158 \uC800\uC7A5", { threadTs, sessionId: newSessionId });
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
- log14.error("\uC2A4\uB2C8\uD3AB \uC5C5\uB85C\uB4DC \uC2E4\uD328", { filename: snippet.filename, error: String(e2) });
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
- log14.info("\uB3C4\uAD6C \uC0AC\uC6A9", { threadTs, toolUseCount });
68545
+ log11.info("\uB3C4\uAD6C \uC0AC\uC6A9", { threadTs, toolUseCount });
69224
68546
  }
69225
68547
  } catch (error) {
69226
- log14.error("\uCC98\uB9AC \uC624\uB958", { error: String(error), threadTs });
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
- log14.info("transient \uC5D0\uB7EC, \uC7AC\uC2DC\uB3C4 \uC548\uB0B4", { threadTs: ctx.threadTs });
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
- log14.info("session corrupt, \uC138\uC158 \uCD08\uAE30\uD654", { threadTs: ctx.threadTs });
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
- log14.info("context overflow, \uC790\uB3D9 \uC555\uCD95 \uC2DC\uB3C4", { threadTs: ctx.threadTs });
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
- log14.error("\uC790\uB3D9 \uC555\uCD95 \uC2E4\uD328", { error: String(compactErr) });
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
- log14.info("userMessage \uC218\uC2E0", { text: text?.slice(0, 50), subtype: msg.subtype, filesCount: msg.files?.length ?? 0, msgKeys: Object.keys(message) });
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`$permission <\uBAA8\uB4DC>` \u2014 \uAD8C\uD55C \uBAA8\uB4DC \uBCC0\uACBD (bypass/plan/accept)\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"
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
- log14.error("App Home \uC5C5\uB370\uC774\uD2B8 \uC2E4\uD328", { error: String(e2), user: event.user });
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, log14, STREAM_UPDATE_INTERVAL_MS, activeApprovalServers, pendingApprovals;
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
- log14 = createLogger("handler");
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 readFile5, writeFile as writeFile5, mkdir as mkdir5, rm as rm2 } from "node:fs/promises";
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 join6 } from "node:path";
68822
+ import { join as join5 } from "node:path";
69629
68823
  import { homedir } from "node:os";
69630
- var log15 = createLogger("credentials");
69631
- var CONFIG_DIR = join6(homedir(), ".config", "choavis-agent");
69632
- var CRED_FILE = join6(CONFIG_DIR, "atlassian-credentials.json");
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 readFile5(CRED_FILE, "utf-8");
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
- log15.info("Atlassian \uD658\uACBD\uBCC0\uC218 \uC8FC\uC785 \uC644\uB8CC", { url: creds.jiraUrl });
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 as createServer2 } from "node:http";
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 dirname5 } from "node:path";
69666
- import { fileURLToPath as fileURLToPath4 } from "node:url";
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 log16 = createLogger("api");
68877
+ var log13 = createLogger("api");
69684
68878
  var VERSION = "1.0.0";
69685
- var __dirname4 = dirname5(fileURLToPath4(import.meta.url));
69686
- var FRONTEND_DIR = process.env.FRONTEND_DIR ?? (existsSync8(resolve3(__dirname4, "../dist-frontend")) ? resolve3(__dirname4, "../dist-frontend") : resolve3(__dirname4, "../../dist-frontend"));
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
- log16.error("\uC0AC\uC6A9\uB7C9 \uC870\uD68C \uC2E4\uD328", { error: String(err) });
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 = createServer2((req, res) => {
69036
+ httpServer = createServer((req, res) => {
69843
69037
  handleRequest(req, res).catch((err) => {
69844
- log16.error("\uC694\uCCAD \uCC98\uB9AC \uC624\uB958", { error: String(err) });
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
- log16.info("WebSocket \uD074\uB77C\uC774\uC5B8\uD2B8 \uC5F0\uACB0");
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
- log16.info("WebSocket \uD074\uB77C\uC774\uC5B8\uD2B8 \uC5F0\uACB0 \uC885\uB8CC");
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
- log16.error("API \uC11C\uBC84 \uC624\uB958", { error: String(err) });
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
- log16.info("API + WebSocket \uC11C\uBC84 \uC2DC\uC791", { port });
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 log17 = createLogger("main");
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
- log17.info("\uC885\uB8CC \uC2DC\uC791");
69125
+ log14.info("\uC885\uB8CC \uC2DC\uC791");
69932
69126
  releaseLock();
69933
69127
  try {
69934
69128
  saveSessionsSync();
69935
69129
  } catch (e2) {
69936
- log17.error("\uC138\uC158 \uC800\uC7A5 \uC2E4\uD328", { error: String(e2) });
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
- log17.info("\uC885\uB8CC \uC644\uB8CC");
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
- log17.info("Atlassian \uC5F0\uB3D9 \uD65C\uC131\uD654\uB428");
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
- log17.info("\uBAA8\uB2C8\uD130\uB9C1 API \uC11C\uBC84 \uC2DC\uC791", { port: config.monitorPort });
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
- log17.info("Choavis Agent\uAC00 \uC2E4\uD589 \uC911\uC785\uB2C8\uB2E4 (Socket Mode)");
69157
+ log14.info("Choavis Agent\uAC00 \uC2E4\uD589 \uC911\uC785\uB2C8\uB2E4 (Socket Mode)");
69964
69158
  }
69965
69159
  main().catch((err) => {
69966
- log17.error("\uC2DC\uC791 \uC2E4\uD328", { error: String(err) });
69160
+ log14.error("\uC2DC\uC791 \uC2E4\uD328", { error: String(err) });
69967
69161
  releaseLock();
69968
69162
  process.exit(1);
69969
69163
  });