cli-jaw 2.0.1 → 2.0.2

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 (607) hide show
  1. package/README.ko.md +3 -2
  2. package/README.md +41 -12
  3. package/dist/bin/_http-client.js +34 -0
  4. package/dist/bin/_http-client.js.map +1 -0
  5. package/dist/bin/cli-jaw.js +10 -5
  6. package/dist/bin/cli-jaw.js.map +1 -1
  7. package/dist/bin/commands/browser-web-ai.js +155 -38
  8. package/dist/bin/commands/browser-web-ai.js.map +1 -1
  9. package/dist/bin/commands/browser.js +265 -37
  10. package/dist/bin/commands/browser.js.map +1 -1
  11. package/dist/bin/commands/chat.js +18 -14
  12. package/dist/bin/commands/chat.js.map +1 -1
  13. package/dist/bin/commands/clone.js +3 -2
  14. package/dist/bin/commands/clone.js.map +1 -1
  15. package/dist/bin/commands/dashboard.js +22 -18
  16. package/dist/bin/commands/dashboard.js.map +1 -1
  17. package/dist/bin/commands/dispatch.js +9 -11
  18. package/dist/bin/commands/dispatch.js.map +1 -1
  19. package/dist/bin/commands/doctor.js +26 -14
  20. package/dist/bin/commands/doctor.js.map +1 -1
  21. package/dist/bin/commands/employee.js +12 -7
  22. package/dist/bin/commands/employee.js.map +1 -1
  23. package/dist/bin/commands/init.js +9 -9
  24. package/dist/bin/commands/init.js.map +1 -1
  25. package/dist/bin/commands/launchd.js +17 -7
  26. package/dist/bin/commands/launchd.js.map +1 -1
  27. package/dist/bin/commands/mcp.js +7 -4
  28. package/dist/bin/commands/mcp.js.map +1 -1
  29. package/dist/bin/commands/memory.js +7 -5
  30. package/dist/bin/commands/memory.js.map +1 -1
  31. package/dist/bin/commands/orchestrate.js +6 -3
  32. package/dist/bin/commands/orchestrate.js.map +1 -1
  33. package/dist/bin/commands/reset.js +4 -3
  34. package/dist/bin/commands/reset.js.map +1 -1
  35. package/dist/bin/commands/serve.js +3 -2
  36. package/dist/bin/commands/serve.js.map +1 -1
  37. package/dist/bin/commands/service.js +2 -2
  38. package/dist/bin/commands/service.js.map +1 -1
  39. package/dist/bin/commands/status.js +10 -9
  40. package/dist/bin/commands/status.js.map +1 -1
  41. package/dist/bin/commands/tui/api.js +26 -18
  42. package/dist/bin/commands/tui/api.js.map +1 -1
  43. package/dist/bin/commands/tui/overlays.js +3 -1
  44. package/dist/bin/commands/tui/overlays.js.map +1 -1
  45. package/dist/bin/commands/tui/simple-mode.js +1 -1
  46. package/dist/bin/commands/tui/simple-mode.js.map +1 -1
  47. package/dist/bin/commands/tui/types.js.map +1 -1
  48. package/dist/bin/postinstall.js +153 -65
  49. package/dist/bin/postinstall.js.map +1 -1
  50. package/dist/bin/star-prompt.js +4 -3
  51. package/dist/bin/star-prompt.js.map +1 -1
  52. package/dist/lib/mcp/format-converters.js +15 -10
  53. package/dist/lib/mcp/format-converters.js.map +1 -1
  54. package/dist/lib/mcp/mcp-install.js +2 -2
  55. package/dist/lib/mcp/mcp-install.js.map +1 -1
  56. package/dist/lib/mcp/skills-distribution.js +2 -2
  57. package/dist/lib/mcp/skills-distribution.js.map +1 -1
  58. package/dist/lib/mcp/skills-reset.js +5 -4
  59. package/dist/lib/mcp/skills-reset.js.map +1 -1
  60. package/dist/lib/mcp/skills-symlinks.js +9 -9
  61. package/dist/lib/mcp/skills-symlinks.js.map +1 -1
  62. package/dist/lib/mcp/skills-utils.js +5 -4
  63. package/dist/lib/mcp/skills-utils.js.map +1 -1
  64. package/dist/lib/mcp/unified-config.js +3 -2
  65. package/dist/lib/mcp/unified-config.js.map +1 -1
  66. package/dist/lib/mime-detect.js +65 -0
  67. package/dist/lib/mime-detect.js.map +1 -0
  68. package/dist/lib/quota-copilot.js +12 -10
  69. package/dist/lib/quota-copilot.js.map +1 -1
  70. package/dist/lib/stt.js +3 -3
  71. package/dist/lib/stt.js.map +1 -1
  72. package/dist/lib/upload.js +14 -5
  73. package/dist/lib/upload.js.map +1 -1
  74. package/dist/scripts/i18n-registry.js +4 -4
  75. package/dist/scripts/i18n-registry.js.map +1 -1
  76. package/dist/server.js +61 -57
  77. package/dist/server.js.map +1 -1
  78. package/dist/src/agent/alert-escalation.js +61 -0
  79. package/dist/src/agent/alert-escalation.js.map +1 -0
  80. package/dist/src/agent/args.js +71 -2
  81. package/dist/src/agent/args.js.map +1 -1
  82. package/dist/src/agent/error-classifier.js +9 -4
  83. package/dist/src/agent/error-classifier.js.map +1 -1
  84. package/dist/src/agent/events.js +130 -101
  85. package/dist/src/agent/events.js.map +1 -1
  86. package/dist/src/agent/lifecycle-handler.js +44 -19
  87. package/dist/src/agent/lifecycle-handler.js.map +1 -1
  88. package/dist/src/agent/live-run-state.js +7 -3
  89. package/dist/src/agent/live-run-state.js.map +1 -1
  90. package/dist/src/agent/memory-flush-controller.js +6 -4
  91. package/dist/src/agent/memory-flush-controller.js.map +1 -1
  92. package/dist/src/agent/opencode-diagnostics.js +7 -6
  93. package/dist/src/agent/opencode-diagnostics.js.map +1 -1
  94. package/dist/src/agent/session-persistence.js +1 -1
  95. package/dist/src/agent/session-persistence.js.map +1 -1
  96. package/dist/src/agent/spawn-env.js +33 -16
  97. package/dist/src/agent/spawn-env.js.map +1 -1
  98. package/dist/src/agent/spawn.js +176 -110
  99. package/dist/src/agent/spawn.js.map +1 -1
  100. package/dist/src/agent/watchdog.js +56 -0
  101. package/dist/src/agent/watchdog.js.map +1 -0
  102. package/dist/src/browser/actions.js +179 -70
  103. package/dist/src/browser/actions.js.map +1 -1
  104. package/dist/src/browser/connection.js +296 -19
  105. package/dist/src/browser/connection.js.map +1 -1
  106. package/dist/src/browser/index.js +4 -1
  107. package/dist/src/browser/index.js.map +1 -1
  108. package/dist/src/browser/launch-policy.js +1 -1
  109. package/dist/src/browser/launch-policy.js.map +1 -1
  110. package/dist/src/browser/primitives.js +11 -7
  111. package/dist/src/browser/primitives.js.map +1 -1
  112. package/dist/src/browser/runtime-diagnostics.js +45 -0
  113. package/dist/src/browser/runtime-diagnostics.js.map +1 -0
  114. package/dist/src/browser/runtime-orphans.js +127 -0
  115. package/dist/src/browser/runtime-orphans.js.map +1 -0
  116. package/dist/src/browser/runtime-owner-store.js +51 -0
  117. package/dist/src/browser/runtime-owner-store.js.map +1 -0
  118. package/dist/src/browser/runtime-owner.js +2 -2
  119. package/dist/src/browser/runtime-owner.js.map +1 -1
  120. package/dist/src/browser/tab-lifecycle.js +157 -0
  121. package/dist/src/browser/tab-lifecycle.js.map +1 -0
  122. package/dist/src/browser/vision.js +35 -11
  123. package/dist/src/browser/vision.js.map +1 -1
  124. package/dist/src/browser/web-ai/action-breadth.js +56 -0
  125. package/dist/src/browser/web-ai/action-breadth.js.map +1 -0
  126. package/dist/src/browser/web-ai/action-cache.js +9 -8
  127. package/dist/src/browser/web-ai/action-cache.js.map +1 -1
  128. package/dist/src/browser/web-ai/action-intent.js +64 -0
  129. package/dist/src/browser/web-ai/action-intent.js.map +1 -0
  130. package/dist/src/browser/web-ai/action-memory.js +82 -0
  131. package/dist/src/browser/web-ai/action-memory.js.map +1 -0
  132. package/dist/src/browser/web-ai/action-trace.js +11 -6
  133. package/dist/src/browser/web-ai/action-trace.js.map +1 -1
  134. package/dist/src/browser/web-ai/annotated-screenshot.js +2 -1
  135. package/dist/src/browser/web-ai/annotated-screenshot.js.map +1 -1
  136. package/dist/src/browser/web-ai/answer-artifact.js +97 -0
  137. package/dist/src/browser/web-ai/answer-artifact.js.map +1 -0
  138. package/dist/src/browser/web-ai/ax-snapshot.js +3 -2
  139. package/dist/src/browser/web-ai/ax-snapshot.js.map +1 -1
  140. package/dist/src/browser/web-ai/browser-primitives.js +10 -7
  141. package/dist/src/browser/web-ai/browser-primitives.js.map +1 -1
  142. package/dist/src/browser/web-ai/capability-registry.js +1 -1
  143. package/dist/src/browser/web-ai/capability-registry.js.map +1 -1
  144. package/dist/src/browser/web-ai/chatgpt-composer.js +12 -12
  145. package/dist/src/browser/web-ai/chatgpt-composer.js.map +1 -1
  146. package/dist/src/browser/web-ai/chatgpt-model.js +469 -50
  147. package/dist/src/browser/web-ai/chatgpt-model.js.map +1 -1
  148. package/dist/src/browser/web-ai/chatgpt-response.js +82 -10
  149. package/dist/src/browser/web-ai/chatgpt-response.js.map +1 -1
  150. package/dist/src/browser/web-ai/chatgpt.js +325 -49
  151. package/dist/src/browser/web-ai/chatgpt.js.map +1 -1
  152. package/dist/src/browser/web-ai/churn-log.js +1 -1
  153. package/dist/src/browser/web-ai/churn-log.js.map +1 -1
  154. package/dist/src/browser/web-ai/cli-sessions.js +42 -26
  155. package/dist/src/browser/web-ai/cli-sessions.js.map +1 -1
  156. package/dist/src/browser/web-ai/context-pack/builder.js +1 -1
  157. package/dist/src/browser/web-ai/context-pack/builder.js.map +1 -1
  158. package/dist/src/browser/web-ai/context-pack/file-selector.js +2 -2
  159. package/dist/src/browser/web-ai/context-pack/file-selector.js.map +1 -1
  160. package/dist/src/browser/web-ai/context-pack/report.js +1 -1
  161. package/dist/src/browser/web-ai/context-pack/report.js.map +1 -1
  162. package/dist/src/browser/web-ai/copy-markdown.js +25 -5
  163. package/dist/src/browser/web-ai/copy-markdown.js.map +1 -1
  164. package/dist/src/browser/web-ai/diagnostics.js +17 -14
  165. package/dist/src/browser/web-ai/diagnostics.js.map +1 -1
  166. package/dist/src/browser/web-ai/doctor.js +10 -6
  167. package/dist/src/browser/web-ai/doctor.js.map +1 -1
  168. package/dist/src/browser/web-ai/dom-hash.js.map +1 -1
  169. package/dist/src/browser/web-ai/errors.js +5 -22
  170. package/dist/src/browser/web-ai/errors.js.map +1 -1
  171. package/dist/src/browser/web-ai/gemini-live.js +7 -6
  172. package/dist/src/browser/web-ai/gemini-live.js.map +1 -1
  173. package/dist/src/browser/web-ai/grok-live.js +9 -5
  174. package/dist/src/browser/web-ai/grok-live.js.map +1 -1
  175. package/dist/src/browser/web-ai/index.js +5 -0
  176. package/dist/src/browser/web-ai/index.js.map +1 -1
  177. package/dist/src/browser/web-ai/observation-bundle.js +90 -0
  178. package/dist/src/browser/web-ai/observation-bundle.js.map +1 -0
  179. package/dist/src/browser/web-ai/observe-actions.js +186 -0
  180. package/dist/src/browser/web-ai/observe-actions.js.map +1 -0
  181. package/dist/src/browser/web-ai/observe-targets.js +6 -1
  182. package/dist/src/browser/web-ai/observe-targets.js.map +1 -1
  183. package/dist/src/browser/web-ai/planner-contract.js +18 -0
  184. package/dist/src/browser/web-ai/planner-contract.js.map +1 -0
  185. package/dist/src/browser/web-ai/post-action-assert.js +8 -7
  186. package/dist/src/browser/web-ai/post-action-assert.js.map +1 -1
  187. package/dist/src/browser/web-ai/product-surfaces.js +2 -1
  188. package/dist/src/browser/web-ai/product-surfaces.js.map +1 -1
  189. package/dist/src/browser/web-ai/provider-adapter.js.map +1 -1
  190. package/dist/src/browser/web-ai/question.js +14 -7
  191. package/dist/src/browser/web-ai/question.js.map +1 -1
  192. package/dist/src/browser/web-ai/ref-registry.js.map +1 -1
  193. package/dist/src/browser/web-ai/self-heal.js +20 -14
  194. package/dist/src/browser/web-ai/self-heal.js.map +1 -1
  195. package/dist/src/browser/web-ai/session-store.js +61 -1
  196. package/dist/src/browser/web-ai/session-store.js.map +1 -1
  197. package/dist/src/browser/web-ai/session.js +43 -2
  198. package/dist/src/browser/web-ai/session.js.map +1 -1
  199. package/dist/src/browser/web-ai/source-audit.js +116 -0
  200. package/dist/src/browser/web-ai/source-audit.js.map +1 -0
  201. package/dist/src/browser/web-ai/tab-finalizer.js +18 -0
  202. package/dist/src/browser/web-ai/tab-finalizer.js.map +1 -0
  203. package/dist/src/browser/web-ai/tab-lease-store.js +390 -0
  204. package/dist/src/browser/web-ai/tab-lease-store.js.map +1 -0
  205. package/dist/src/browser/web-ai/tab-pool.js +44 -0
  206. package/dist/src/browser/web-ai/tab-pool.js.map +1 -0
  207. package/dist/src/browser/web-ai/target-resolver.js +31 -0
  208. package/dist/src/browser/web-ai/target-resolver.js.map +1 -0
  209. package/dist/src/browser/web-ai/trace-persistence.js +4 -2
  210. package/dist/src/browser/web-ai/trace-persistence.js.map +1 -1
  211. package/dist/src/browser/web-ai/vendor-editor-contract.js.map +1 -1
  212. package/dist/src/browser/web-ai/watcher.js +8 -7
  213. package/dist/src/browser/web-ai/watcher.js.map +1 -1
  214. package/dist/src/cli/acp-client.js +40 -26
  215. package/dist/src/cli/acp-client.js.map +1 -1
  216. package/dist/src/cli/command-context.js +3 -3
  217. package/dist/src/cli/command-context.js.map +1 -1
  218. package/dist/src/cli/commands.js +25 -16
  219. package/dist/src/cli/commands.js.map +1 -1
  220. package/dist/src/cli/compact.js.map +1 -1
  221. package/dist/src/cli/handlers-completions.js +6 -4
  222. package/dist/src/cli/handlers-completions.js.map +1 -1
  223. package/dist/src/cli/handlers-runtime.js +45 -38
  224. package/dist/src/cli/handlers-runtime.js.map +1 -1
  225. package/dist/src/cli/handlers.js +44 -36
  226. package/dist/src/cli/handlers.js.map +1 -1
  227. package/dist/src/cli/readiness.js +3 -1
  228. package/dist/src/cli/readiness.js.map +1 -1
  229. package/dist/src/cli/registry.js +1 -1
  230. package/dist/src/cli/registry.js.map +1 -1
  231. package/dist/src/cli/tui/overlay.js +4 -1
  232. package/dist/src/cli/tui/overlay.js.map +1 -1
  233. package/dist/src/cli/types.js +4 -0
  234. package/dist/src/cli/types.js.map +1 -0
  235. package/dist/src/command-contract/catalog.js +1 -1
  236. package/dist/src/command-contract/catalog.js.map +1 -1
  237. package/dist/src/command-contract/help-renderer.js +1 -1
  238. package/dist/src/command-contract/help-renderer.js.map +1 -1
  239. package/dist/src/core/browser-open-default.js +13 -0
  240. package/dist/src/core/browser-open-default.js.map +1 -0
  241. package/dist/src/core/browser-open.js +41 -0
  242. package/dist/src/core/browser-open.js.map +1 -0
  243. package/dist/src/core/bus.js +13 -2
  244. package/dist/src/core/bus.js.map +1 -1
  245. package/dist/src/core/compact.js +5 -4
  246. package/dist/src/core/compact.js.map +1 -1
  247. package/dist/src/core/config.js +51 -52
  248. package/dist/src/core/config.js.map +1 -1
  249. package/dist/src/core/db.js +48 -6
  250. package/dist/src/core/db.js.map +1 -1
  251. package/dist/src/core/employees.js +9 -8
  252. package/dist/src/core/employees.js.map +1 -1
  253. package/dist/src/core/instance.js +7 -6
  254. package/dist/src/core/instance.js.map +1 -1
  255. package/dist/src/core/logger.js +1 -1
  256. package/dist/src/core/logger.js.map +1 -1
  257. package/dist/src/core/main-session.js +7 -7
  258. package/dist/src/core/main-session.js.map +1 -1
  259. package/dist/src/core/path-expand.js +10 -0
  260. package/dist/src/core/path-expand.js.map +1 -0
  261. package/dist/src/core/runtime-path.js +1 -1
  262. package/dist/src/core/runtime-path.js.map +1 -1
  263. package/dist/src/core/runtime-settings.js +13 -13
  264. package/dist/src/core/runtime-settings.js.map +1 -1
  265. package/dist/src/core/settings-merge.js +14 -14
  266. package/dist/src/core/settings-merge.js.map +1 -1
  267. package/dist/src/core/strip-undefined.js +13 -0
  268. package/dist/src/core/strip-undefined.js.map +1 -0
  269. package/dist/src/core/tcc.js +1 -1
  270. package/dist/src/core/tcc.js.map +1 -1
  271. package/dist/src/discord/bot.js +19 -18
  272. package/dist/src/discord/bot.js.map +1 -1
  273. package/dist/src/discord/channel-types.js +14 -0
  274. package/dist/src/discord/channel-types.js.map +1 -0
  275. package/dist/src/discord/commands.js +7 -6
  276. package/dist/src/discord/commands.js.map +1 -1
  277. package/dist/src/discord/discord-file.js.map +1 -1
  278. package/dist/src/discord/forwarder.js +3 -3
  279. package/dist/src/discord/forwarder.js.map +1 -1
  280. package/dist/src/http/error-middleware.js +3 -3
  281. package/dist/src/http/error-middleware.js.map +1 -1
  282. package/dist/src/http/response.js +2 -2
  283. package/dist/src/http/response.js.map +1 -1
  284. package/dist/src/ide/diff.js +7 -7
  285. package/dist/src/ide/diff.js.map +1 -1
  286. package/dist/src/manager/board/routes.js +28 -27
  287. package/dist/src/manager/board/routes.js.map +1 -1
  288. package/dist/src/manager/dashboard-home.js +3 -5
  289. package/dist/src/manager/dashboard-home.js.map +1 -1
  290. package/dist/src/manager/dashboard-service.js +2 -2
  291. package/dist/src/manager/dashboard-service.js.map +1 -1
  292. package/dist/src/manager/health-history.js +10 -9
  293. package/dist/src/manager/health-history.js.map +1 -1
  294. package/dist/src/manager/launchd-service.js +2 -2
  295. package/dist/src/manager/launchd-service.js.map +1 -1
  296. package/dist/src/manager/lifecycle-helpers.js +7 -6
  297. package/dist/src/manager/lifecycle-helpers.js.map +1 -1
  298. package/dist/src/manager/lifecycle.js +7 -6
  299. package/dist/src/manager/lifecycle.js.map +1 -1
  300. package/dist/src/manager/logs.js +18 -18
  301. package/dist/src/manager/logs.js.map +1 -1
  302. package/dist/src/manager/metadata.js +10 -2
  303. package/dist/src/manager/metadata.js.map +1 -1
  304. package/dist/src/manager/notes/assets.js +216 -0
  305. package/dist/src/manager/notes/assets.js.map +1 -0
  306. package/dist/src/manager/notes/capabilities.js +56 -0
  307. package/dist/src/manager/notes/capabilities.js.map +1 -0
  308. package/dist/src/manager/notes/constants.js +11 -0
  309. package/dist/src/manager/notes/constants.js.map +1 -0
  310. package/dist/src/manager/notes/frontmatter.js +120 -0
  311. package/dist/src/manager/notes/frontmatter.js.map +1 -0
  312. package/dist/src/manager/notes/link-resolver.js +96 -0
  313. package/dist/src/manager/notes/link-resolver.js.map +1 -0
  314. package/dist/src/manager/notes/path-guards.js +4 -0
  315. package/dist/src/manager/notes/path-guards.js.map +1 -1
  316. package/dist/src/manager/notes/remote-assets.js +128 -0
  317. package/dist/src/manager/notes/remote-assets.js.map +1 -0
  318. package/dist/src/manager/notes/routes.js +63 -13
  319. package/dist/src/manager/notes/routes.js.map +1 -1
  320. package/dist/src/manager/notes/store.js +3 -2
  321. package/dist/src/manager/notes/store.js.map +1 -1
  322. package/dist/src/manager/notes/system-trash.js +3 -3
  323. package/dist/src/manager/notes/system-trash.js.map +1 -1
  324. package/dist/src/manager/notes/vault-index.js +220 -0
  325. package/dist/src/manager/notes/vault-index.js.map +1 -0
  326. package/dist/src/manager/notes/watcher.js +27 -0
  327. package/dist/src/manager/notes/watcher.js.map +1 -0
  328. package/dist/src/manager/notes/wiki-links.js +109 -0
  329. package/dist/src/manager/notes/wiki-links.js.map +1 -0
  330. package/dist/src/manager/process-verify.js +29 -0
  331. package/dist/src/manager/process-verify.js.map +1 -1
  332. package/dist/src/manager/profiles.js +3 -2
  333. package/dist/src/manager/profiles.js.map +1 -1
  334. package/dist/src/manager/registry.js +60 -58
  335. package/dist/src/manager/registry.js.map +1 -1
  336. package/dist/src/manager/routes/electron-metrics.js +22 -22
  337. package/dist/src/manager/routes/electron-metrics.js.map +1 -1
  338. package/dist/src/manager/scan.js +2 -2
  339. package/dist/src/manager/scan.js.map +1 -1
  340. package/dist/src/manager/schedule/routes.js +24 -23
  341. package/dist/src/manager/schedule/routes.js.map +1 -1
  342. package/dist/src/manager/server.js +28 -28
  343. package/dist/src/manager/server.js.map +1 -1
  344. package/dist/src/manager/systemd-service.js +1 -1
  345. package/dist/src/manager/systemd-service.js.map +1 -1
  346. package/dist/src/memory/bootstrap.js +5 -4
  347. package/dist/src/memory/bootstrap.js.map +1 -1
  348. package/dist/src/memory/heartbeat-schedule.js +10 -10
  349. package/dist/src/memory/heartbeat-schedule.js.map +1 -1
  350. package/dist/src/memory/heartbeat.js +23 -22
  351. package/dist/src/memory/heartbeat.js.map +1 -1
  352. package/dist/src/memory/indexing.js.map +1 -1
  353. package/dist/src/memory/keyword-expand.js +1 -1
  354. package/dist/src/memory/keyword-expand.js.map +1 -1
  355. package/dist/src/memory/memory.js +2 -2
  356. package/dist/src/memory/memory.js.map +1 -1
  357. package/dist/src/memory/runtime.js +6 -5
  358. package/dist/src/memory/runtime.js.map +1 -1
  359. package/dist/src/memory/shared.js +2 -1
  360. package/dist/src/memory/shared.js.map +1 -1
  361. package/dist/src/memory/worklog.js +1 -1
  362. package/dist/src/memory/worklog.js.map +1 -1
  363. package/dist/src/messaging/runtime.js +13 -10
  364. package/dist/src/messaging/runtime.js.map +1 -1
  365. package/dist/src/messaging/send.js +16 -15
  366. package/dist/src/messaging/send.js.map +1 -1
  367. package/dist/src/orchestrator/collect.js +6 -6
  368. package/dist/src/orchestrator/collect.js.map +1 -1
  369. package/dist/src/orchestrator/distribute.js +112 -77
  370. package/dist/src/orchestrator/distribute.js.map +1 -1
  371. package/dist/src/orchestrator/gateway.js +6 -5
  372. package/dist/src/orchestrator/gateway.js.map +1 -1
  373. package/dist/src/orchestrator/pipeline.js +42 -42
  374. package/dist/src/orchestrator/pipeline.js.map +1 -1
  375. package/dist/src/orchestrator/state-machine.js +3 -3
  376. package/dist/src/orchestrator/state-machine.js.map +1 -1
  377. package/dist/src/orchestrator/worker-registry.js +4 -3
  378. package/dist/src/orchestrator/worker-registry.js.map +1 -1
  379. package/dist/src/prompt/builder.js +24 -19
  380. package/dist/src/prompt/builder.js.map +1 -1
  381. package/dist/src/prompt/templates/a1-system.md +15 -10
  382. package/dist/src/prompt/templates/control-system.md +9 -7
  383. package/dist/src/prompt/templates/employee.md +5 -4
  384. package/dist/src/prompt/templates/vision-click.md +1 -1
  385. package/dist/src/routes/_http-error.js +15 -0
  386. package/dist/src/routes/_http-error.js.map +1 -0
  387. package/dist/src/routes/avatar.js +6 -5
  388. package/dist/src/routes/avatar.js.map +1 -1
  389. package/dist/src/routes/browser.js +132 -45
  390. package/dist/src/routes/browser.js.map +1 -1
  391. package/dist/src/routes/employees.js +28 -21
  392. package/dist/src/routes/employees.js.map +1 -1
  393. package/dist/src/routes/heartbeat.js +12 -9
  394. package/dist/src/routes/heartbeat.js.map +1 -1
  395. package/dist/src/routes/i18n.js +13 -7
  396. package/dist/src/routes/i18n.js.map +1 -1
  397. package/dist/src/routes/jaw-memory.js +15 -11
  398. package/dist/src/routes/jaw-memory.js.map +1 -1
  399. package/dist/src/routes/memory.js +25 -20
  400. package/dist/src/routes/memory.js.map +1 -1
  401. package/dist/src/routes/messaging.js +50 -29
  402. package/dist/src/routes/messaging.js.map +1 -1
  403. package/dist/src/routes/orchestrate.js +38 -24
  404. package/dist/src/routes/orchestrate.js.map +1 -1
  405. package/dist/src/routes/quota.js +81 -17
  406. package/dist/src/routes/quota.js.map +1 -1
  407. package/dist/src/routes/settings.js +28 -18
  408. package/dist/src/routes/settings.js.map +1 -1
  409. package/dist/src/routes/skills.js +22 -13
  410. package/dist/src/routes/skills.js.map +1 -1
  411. package/dist/src/routes/traces.js +77 -0
  412. package/dist/src/routes/traces.js.map +1 -0
  413. package/dist/src/security/path-guards.js +2 -1
  414. package/dist/src/security/path-guards.js.map +1 -1
  415. package/dist/src/shared/tool-log-sanitize.js +191 -0
  416. package/dist/src/shared/tool-log-sanitize.js.map +1 -0
  417. package/dist/src/telegram/bot.js +65 -55
  418. package/dist/src/telegram/bot.js.map +1 -1
  419. package/dist/src/telegram/forwarder.js +5 -9
  420. package/dist/src/telegram/forwarder.js.map +1 -1
  421. package/dist/src/telegram/telegram-file.js +28 -24
  422. package/dist/src/telegram/telegram-file.js.map +1 -1
  423. package/dist/src/telegram/voice.js +4 -3
  424. package/dist/src/telegram/voice.js.map +1 -1
  425. package/dist/src/trace/redact.js +50 -0
  426. package/dist/src/trace/redact.js.map +1 -0
  427. package/dist/src/trace/store.js +162 -0
  428. package/dist/src/trace/store.js.map +1 -0
  429. package/dist/src/trace/types.js +2 -0
  430. package/dist/src/trace/types.js.map +1 -0
  431. package/dist/src/types/cli-engine.js +34 -0
  432. package/dist/src/types/cli-engine.js.map +1 -0
  433. package/dist/src/types/cli-events.js +31 -0
  434. package/dist/src/types/cli-events.js.map +1 -0
  435. package/package.json +22 -2
  436. package/public/css/tool-ui.css +3 -1
  437. package/public/css/trace-drawer.css +48 -0
  438. package/public/dist/assets/{AdvancedExport-3WAYIabE.js → AdvancedExport-DJZ2VmBR.js} +1 -1
  439. package/public/dist/assets/Agent-CgpLT8IY.js +1 -0
  440. package/public/dist/assets/Browser-CrkiQoB8.js +1 -0
  441. package/public/dist/assets/{ChannelsDiscord-UzFPlWT4.js → ChannelsDiscord-CVUC22D4.js} +1 -1
  442. package/public/dist/assets/{ChannelsTelegram-DNWtPX0w.js → ChannelsTelegram-DEatIQNM.js} +1 -1
  443. package/public/dist/assets/{DashboardMeta-Y_6nVeJO.js → DashboardMeta-BKoxRc7i.js} +1 -1
  444. package/public/dist/assets/{Display-D8vGOl4s.js → Display-DnNGV9Km.js} +1 -1
  445. package/public/dist/assets/{Employees-YR_sIRK4.js → Employees-DZ2iJYKy.js} +1 -1
  446. package/public/dist/assets/{HealthBadge-CPePajyU.js → HealthBadge-Cq2c7G9s.js} +1 -1
  447. package/public/dist/assets/{Heartbeat-DTpAULQR.js → Heartbeat-BML6eTXZ.js} +1 -1
  448. package/public/dist/assets/{Mcp-DM-PgG6z.js → Mcp-BlEviQ3h.js} +1 -1
  449. package/public/dist/assets/{Memory-C_LvJnkn.js → Memory-BRyH80He.js} +1 -1
  450. package/public/dist/assets/MilkdownWysiwygEditor-Cm3uXfWf.js +52 -0
  451. package/public/dist/assets/ModelProvider-DxyR7EL9.js +1 -0
  452. package/public/dist/assets/Network-DDOOESh1.js +1 -0
  453. package/public/dist/assets/{Permissions-B1naJjjw.js → Permissions-Br0eSbKb.js} +1 -1
  454. package/public/dist/assets/{Permissions-BKffrMJD.js → Permissions-QHkzStqQ.js} +1 -1
  455. package/public/dist/assets/{Profile-DIqjSe2C.js → Profile-C79NKumk.js} +1 -1
  456. package/public/dist/assets/{Prompts-BMfbV6Y4.js → Prompts-BmiIDiXW.js} +1 -1
  457. package/public/dist/assets/{SpeechKeys-DjiQTzSL.js → SpeechKeys-B8304XJK.js} +1 -1
  458. package/public/dist/assets/app-Be58Cs3Y.js +32 -0
  459. package/public/dist/assets/{app-BzvwJJiv.css → app-CphocJzo.css} +1 -1
  460. package/public/dist/assets/{dist-DTvxN3ux.js → dist-BD0UXfgF2.js} +1 -1
  461. package/public/dist/assets/{dist-CASeq-Tl.js → dist-BNfXO3Yr.js} +1 -1
  462. package/public/dist/assets/{dist-BMPiaUzF.js → dist-BUnPYbK3.js} +1 -1
  463. package/public/dist/assets/{dist-CT_X3hVT.js → dist-BZosRD2u.js} +1 -1
  464. package/public/dist/assets/{dist-4J6YbNXv.js → dist-Bd9PlnQm.js} +1 -1
  465. package/public/dist/assets/{dist-BcZjyn5g.js → dist-BsT5UdNP.js} +1 -1
  466. package/public/dist/assets/{dist-BfBhOPR-.js → dist-CIuXW-sc.js} +1 -1
  467. package/public/dist/assets/{dist-BMiCig3A2.js → dist-CL4PTYWf.js} +1 -1
  468. package/public/dist/assets/{dist-VyP6-HLb.js → dist-Ch5VAlV9.js} +1 -1
  469. package/public/dist/assets/dist-ClqO40BE.js +1 -0
  470. package/public/dist/assets/{dist-c98Tp7bP.js → dist-Cp42cMcI.js} +1 -1
  471. package/public/dist/assets/{dist-CIlYL1qe.js → dist-CpUK8ypo.js} +1 -1
  472. package/public/dist/assets/dist-CxeLAw2Y.js +1 -0
  473. package/public/dist/assets/dist-D2SH8nxa.js +1 -0
  474. package/public/dist/assets/{dist-84fwQ7bO.js → dist-D6cUXP7K.js} +1 -1
  475. package/public/dist/assets/{dist-BOCcQAyF.js → dist-D7bCuS3f.js} +1 -1
  476. package/public/dist/assets/{dist-DMmpfLVP.js → dist-DFYRUAjN.js} +1 -1
  477. package/public/dist/assets/{dist-DdY6pTJr.js → dist-DZsFVYF4.js} +1 -1
  478. package/public/dist/assets/{dist-B0p3Eyme.js → dist-Db16ogVk.js} +1 -1
  479. package/public/dist/assets/{dist-DlnNtr6L.js → dist-DfodGES_.js} +1 -1
  480. package/public/dist/assets/{dist-DO9so2a2.js → dist-SU-YTAIg.js} +1 -1
  481. package/public/dist/assets/{dist-DUjXiMLP.js → dist-UYn7T-GH.js} +1 -1
  482. package/public/dist/assets/{dist-BW1409rz.js → dist-W51oDoeA.js} +1 -1
  483. package/public/dist/assets/{dist-BimBQZx1.js → dist-eU7TyC86.js} +1 -1
  484. package/public/dist/assets/dist-l9HH00ip.js +1 -0
  485. package/public/dist/assets/{dist-BrOPNxdH.js → dist-urPTQzXL.js} +1 -1
  486. package/public/dist/assets/{dist-AloEV3J52.js → dist-yHP6L0Ty.js} +1 -1
  487. package/public/dist/assets/{employees-Bbabvbyx.js → employees-CxdghzoD.js} +7 -7
  488. package/public/dist/assets/{error-normalize-DdvKGLt_.js → error-normalize-5n-zlEQ3.js} +1 -1
  489. package/public/dist/assets/insert-image-markdown-DIEa-zjk.js +22 -0
  490. package/public/dist/assets/{manager-DyB2ZUr9.css → manager-DEiyrWDP.css} +1 -1
  491. package/public/dist/assets/manager-UEXd1_9T.js +25 -0
  492. package/public/dist/assets/{memory-B_plvcuQ.js → memory-CsMNkYtv.js} +9 -9
  493. package/public/dist/assets/memory-DXad_DPO.js +1 -0
  494. package/public/dist/assets/{page-shell-DML_HneX.js → page-shell-D5tbivHH.js} +1 -1
  495. package/public/dist/assets/{render-DEhbfUAW.js → render-DGQX46ei.js} +2 -2
  496. package/public/dist/assets/{settings-D7F-_kYG.js → settings-BH213Yv3.js} +14 -14
  497. package/public/dist/assets/settings-DXT87G2U.js +1 -0
  498. package/public/dist/assets/settings-client-ajlwI-oK.js +1 -0
  499. package/public/dist/assets/skills-5o_1v0nz.js +1 -0
  500. package/public/dist/assets/{skills-DoGJOc0D.js → skills-CQtCtHPA.js} +6 -6
  501. package/public/dist/assets/slash-commands-D4-hrrmh.js +1 -0
  502. package/public/dist/assets/{slash-commands-khNFPOyF.js → slash-commands-Dzk1xHWS.js} +1 -1
  503. package/public/dist/assets/trace-drawer-SRKcfm2S.js +15 -0
  504. package/public/dist/assets/ui-CdRKN2S6.js +141 -0
  505. package/public/dist/assets/ui-n43jmg_f.js +1 -0
  506. package/public/dist/assets/{ws-B2aJ-nD2.js → ws-CTHQFzM1.js} +8 -8
  507. package/public/dist/index.html +2 -2
  508. package/public/dist/manager/index.html +2 -2
  509. package/public/index.html +1 -0
  510. package/public/js/constants.ts +5 -5
  511. package/public/js/diagram/iframe-renderer.ts +11 -11
  512. package/public/js/features/chat.ts +1 -1
  513. package/public/js/features/memory.ts +10 -10
  514. package/public/js/features/pending-queue.ts +2 -2
  515. package/public/js/features/process-block.ts +257 -29
  516. package/public/js/features/process-step-match.ts +18 -0
  517. package/public/js/features/settings-cli-status.ts +1 -1
  518. package/public/js/features/settings-stt.ts +37 -11
  519. package/public/js/features/settings-templates.ts +2 -2
  520. package/public/js/features/slash-commands.ts +1 -1
  521. package/public/js/features/tool-ui.ts +13 -7
  522. package/public/js/features/trace-drawer.ts +122 -0
  523. package/public/js/icons.ts +1 -1
  524. package/public/js/main.ts +28 -28
  525. package/public/js/provider-icons.ts +1 -1
  526. package/public/js/render.ts +29 -27
  527. package/public/js/sanitizer.ts +4 -0
  528. package/public/js/ui.ts +234 -68
  529. package/public/js/virtual-scroll.ts +19 -33
  530. package/public/js/ws.ts +22 -10
  531. package/public/manager/src/App.tsx +34 -6
  532. package/public/manager/src/api.ts +55 -1
  533. package/public/manager/src/components/ActivityTimeline.tsx +1 -1
  534. package/public/manager/src/components/InstanceDetailPanel.tsx +2 -2
  535. package/public/manager/src/components/InstanceGroups.tsx +5 -5
  536. package/public/manager/src/components/InstanceListContent.tsx +1 -1
  537. package/public/manager/src/dashboard-features.ts +1 -1
  538. package/public/manager/src/manager-notes.css +49 -2
  539. package/public/manager/src/notes/MarkdownEditor.tsx +7 -3
  540. package/public/manager/src/notes/NotesFileTree.tsx +45 -6
  541. package/public/manager/src/notes/NotesSidebar.tsx +24 -55
  542. package/public/manager/src/notes/NotesWorkspace.tsx +50 -3
  543. package/public/manager/src/notes/image-assets/clipboard-images.ts +100 -0
  544. package/public/manager/src/notes/image-assets/insert-image-markdown.ts +85 -0
  545. package/public/manager/src/notes/notes-api.ts +2 -0
  546. package/public/manager/src/notes/notes-types.ts +8 -1
  547. package/public/manager/src/notes/rendering/MarkdownRenderer.tsx +6 -0
  548. package/public/manager/src/notes/rendering/markdown-render-security.ts +19 -1
  549. package/public/manager/src/notes/rich-markdown/paste-policy.ts +6 -2
  550. package/public/manager/src/notes/rich-markdown/rich-markdown-extension.ts +5 -5
  551. package/public/manager/src/notes/rich-markdown/rich-widget.ts +8 -8
  552. package/public/manager/src/notes/useNotesExternalSync.ts +37 -0
  553. package/public/manager/src/notes/useNotesModel.ts +91 -0
  554. package/public/manager/src/notes/wysiwyg/MilkdownWysiwygEditor.tsx +157 -17
  555. package/public/manager/src/notes/wysiwyg/milkdown-block-keymap.ts +14 -2
  556. package/public/manager/src/notes/wysiwyg/milkdown-code-block-view.ts +20 -20
  557. package/public/manager/src/notes/wysiwyg/milkdown-heading-source-view.ts +8 -8
  558. package/public/manager/src/notes/wysiwyg/milkdown-math.ts +25 -25
  559. package/public/manager/src/settings/pages/Browser.tsx +38 -20
  560. package/public/manager/src/settings/pages/ModelProvider.tsx +11 -9
  561. package/public/manager/src/settings/pages/Network.tsx +10 -10
  562. package/public/manager/src/settings/pages/components/HealthBadge.tsx +12 -12
  563. package/public/manager/src/settings/pages/components/agent/runtime-employees-helpers.ts +12 -10
  564. package/public/manager/src/settings/pages/components/employees-helpers.ts +9 -9
  565. package/public/manager/src/settings/pages/components/heartbeat-helpers.ts +13 -13
  566. package/public/manager/src/settings/pages/components/memory-helpers.ts +4 -4
  567. package/public/manager/src/settings/pages/mcp-helpers.ts +7 -7
  568. package/public/manager/src/settings/settings-client.ts +4 -3
  569. package/public/manager/src/sync/IframeBridge.tsx +29 -0
  570. package/public/manager/src/sync/VisibilityBridge.tsx +24 -0
  571. package/public/manager/src/sync/invalidation-bus.ts +30 -0
  572. package/public/manager/src/sync/useInvalidationSubscription.ts +19 -0
  573. package/public/manager/src/types.ts +101 -0
  574. package/scripts/check-strict-baseline.mjs +255 -0
  575. package/scripts/claim-audit.mjs +159 -0
  576. package/scripts/i18n-registry.ts +4 -4
  577. package/scripts/install-officecli.sh +2 -2
  578. package/scripts/install-wsl.sh +2 -1
  579. package/scripts/release-gates.mjs +347 -0
  580. package/scripts/release-preview.sh +3 -0
  581. package/scripts/release.sh +4 -0
  582. package/scripts/smoke/opencode-external-dir-smoke.ts +14 -5
  583. package/public/dist/assets/Agent-BYdzZwD0.js +0 -1
  584. package/public/dist/assets/Browser-CkGeczuN.js +0 -1
  585. package/public/dist/assets/MilkdownWysiwygEditor-B7k9bAey.js +0 -52
  586. package/public/dist/assets/ModelProvider-CX3Qhowu.js +0 -1
  587. package/public/dist/assets/Network-DfPLFAvw.js +0 -1
  588. package/public/dist/assets/app-DLYoRkU9.js +0 -32
  589. package/public/dist/assets/dist-8zNAQAIa.js +0 -1
  590. package/public/dist/assets/dist-BgeY6nvK.js +0 -1
  591. package/public/dist/assets/dist-BzDGGxHQ.js +0 -1
  592. package/public/dist/assets/dist-D3YKbVi-.js +0 -1
  593. package/public/dist/assets/manager-CUSgFbMO.js +0 -25
  594. package/public/dist/assets/markdown-render-security-DJfJPWO-.js +0 -22
  595. package/public/dist/assets/memory-DQ6dU0qs.js +0 -1
  596. package/public/dist/assets/settings-DxLPUbpj.js +0 -1
  597. package/public/dist/assets/settings-client-CGf3uPPf.js +0 -1
  598. package/public/dist/assets/skills-yMfNYJ8m.js +0 -1
  599. package/public/dist/assets/slash-commands-CZcwr1W6.js +0 -1
  600. package/public/dist/assets/ui-04YlOMgn.js +0 -136
  601. package/public/dist/assets/ui-D6hlMjRq.js +0 -1
  602. /package/public/dist/assets/{InlineWarn-CqgWEC41.js → InlineWarn-BooBRm7o.js} +0 -0
  603. /package/public/dist/assets/{agent-meta-puNn13DV.js → agent-meta-DHddpWHQ.js} +0 -0
  604. /package/public/dist/assets/{fields-DH9JS3mb.js → fields-BtncIZYA.js} +0 -0
  605. /package/public/dist/assets/{mermaid-loader-6XC0y10y.js → mermaid-loader-BEFIOoJn.js} +0 -0
  606. /package/public/dist/assets/{path-utils-CtsDDGZg.js → path-utils-BuEEtj9w.js} +0 -0
  607. /package/public/dist/assets/{w3c-keyname-VSld09PZ.js → w3c-keyname-IiiZScED.js} +0 -0
@@ -0,0 +1,191 @@
1
+ export const MAX_TOOL_LOG_RAW_INPUT_CHARS = 180_000;
2
+ export const MAX_TOOL_LOG_ENTRIES = 160;
3
+ export const MAX_TOOL_LOG_STRING_CHARS = 240;
4
+ export const MAX_TOOL_LOG_DETAIL_CHARS = 3_000;
5
+ export const MAX_TOOL_LOG_TOTAL_DETAIL_CHARS = 24_000;
6
+ export const MAX_TOOL_LOG_JSON_CHARS = 64_000;
7
+ const TRUNCATION_ICON = '⚠️';
8
+ const TRUNCATION_LABEL = 'Tool log truncated';
9
+ const TRUNCATION_DETAIL = 'Inline preview capped.';
10
+ const TRACE_RUN_ID_RE = /^tr_[A-Za-z0-9_-]{16,80}$/;
11
+ function asBoundedString(value, max) {
12
+ if (value == null)
13
+ return undefined;
14
+ const raw = String(value);
15
+ if (!raw)
16
+ return undefined;
17
+ if (raw.length <= max)
18
+ return raw;
19
+ return `${raw.slice(0, Math.max(0, max - 1))}…`;
20
+ }
21
+ function truncationNotice(kept, total) {
22
+ return `[detail truncated: kept ${kept} of ${total} chars]`;
23
+ }
24
+ function makeOverflowEntry(omitted) {
25
+ const suffix = omitted > 0 ? `${omitted} tool event${omitted === 1 ? '' : 's'} omitted` : TRUNCATION_LABEL;
26
+ return {
27
+ icon: TRUNCATION_ICON,
28
+ label: asBoundedString(suffix, MAX_TOOL_LOG_STRING_CHARS) || TRUNCATION_LABEL,
29
+ toolType: 'tool',
30
+ status: 'done',
31
+ detail: TRUNCATION_DETAIL,
32
+ };
33
+ }
34
+ function boundedNumber(value, max) {
35
+ const n = Number(value);
36
+ if (!Number.isFinite(n) || n < 0)
37
+ return undefined;
38
+ return Math.min(Math.floor(n), max);
39
+ }
40
+ export function sanitizeToolLogEntry(entry, detailBudget = MAX_TOOL_LOG_DETAIL_CHARS) {
41
+ const detailRaw = entry.detail == null ? '' : String(entry.detail);
42
+ const allowedDetail = Math.max(0, Math.min(MAX_TOOL_LOG_DETAIL_CHARS, detailBudget));
43
+ let detail = asBoundedString(detailRaw, allowedDetail);
44
+ if (detail && detailRaw.length > allowedDetail) {
45
+ const notice = truncationNotice(detail.length, detailRaw.length);
46
+ const room = Math.max(0, allowedDetail - notice.length - 1);
47
+ detail = `${detailRaw.slice(0, room)}\n${notice}`;
48
+ }
49
+ const sanitized = {
50
+ icon: asBoundedString(entry.icon, MAX_TOOL_LOG_STRING_CHARS) || '🔧',
51
+ label: asBoundedString(entry.label, MAX_TOOL_LOG_STRING_CHARS) || 'tool',
52
+ };
53
+ const rawIcon = asBoundedString(entry.rawIcon, MAX_TOOL_LOG_STRING_CHARS);
54
+ const toolType = asBoundedString(entry.toolType, MAX_TOOL_LOG_STRING_CHARS);
55
+ const stepRef = asBoundedString(entry.stepRef, MAX_TOOL_LOG_STRING_CHARS);
56
+ const status = asBoundedString(entry.status, MAX_TOOL_LOG_STRING_CHARS);
57
+ const traceRunId = asBoundedString(entry.traceRunId, 96);
58
+ const traceSeq = boundedNumber(entry.traceSeq, Number.MAX_SAFE_INTEGER);
59
+ const detailBytes = boundedNumber(entry.detailBytes, Number.MAX_SAFE_INTEGER);
60
+ const rawRetentionStatus = asBoundedString(entry.rawRetentionStatus, 32);
61
+ if (rawIcon)
62
+ sanitized.rawIcon = rawIcon;
63
+ if (detail)
64
+ sanitized.detail = detail;
65
+ if (toolType)
66
+ sanitized.toolType = toolType;
67
+ if (stepRef)
68
+ sanitized.stepRef = stepRef;
69
+ if (status)
70
+ sanitized.status = status;
71
+ if (entry['isEmployee'] === true)
72
+ sanitized.isEmployee = true;
73
+ if (traceRunId && TRACE_RUN_ID_RE.test(traceRunId))
74
+ sanitized.traceRunId = traceRunId;
75
+ if (traceSeq != null && traceSeq > 0)
76
+ sanitized.traceSeq = traceSeq;
77
+ if (entry.detailAvailable === true)
78
+ sanitized.detailAvailable = true;
79
+ if (detailBytes != null)
80
+ sanitized.detailBytes = detailBytes;
81
+ if (rawRetentionStatus)
82
+ sanitized.rawRetentionStatus = rawRetentionStatus;
83
+ return sanitized;
84
+ }
85
+ export function sanitizeToolLogForDurableStorage(entries) {
86
+ if (!Array.isArray(entries) || entries.length === 0)
87
+ return [];
88
+ const overflow = Math.max(0, entries.length - MAX_TOOL_LOG_ENTRIES);
89
+ const cappedEntries = entries.slice(0, MAX_TOOL_LOG_ENTRIES);
90
+ const output = [];
91
+ let detailBudgetLeft = MAX_TOOL_LOG_TOTAL_DETAIL_CHARS;
92
+ for (const raw of cappedEntries) {
93
+ const entry = (raw && typeof raw === 'object')
94
+ ? raw
95
+ : { label: raw };
96
+ const detailRawLength = entry.detail == null ? 0 : String(entry.detail).length;
97
+ const detailBudget = Math.min(MAX_TOOL_LOG_DETAIL_CHARS, detailBudgetLeft);
98
+ const sanitized = sanitizeToolLogEntry(entry, detailBudget);
99
+ output.push(sanitized);
100
+ detailBudgetLeft = Math.max(0, detailBudgetLeft - Math.min(detailRawLength, detailBudget));
101
+ if (detailBudgetLeft <= 0)
102
+ detailBudgetLeft = 0;
103
+ }
104
+ if (overflow > 0) {
105
+ if (output.length >= MAX_TOOL_LOG_ENTRIES)
106
+ output.pop();
107
+ output.push(makeOverflowEntry(overflow));
108
+ }
109
+ return fitToolLogToJsonCap(output);
110
+ }
111
+ function shrinkEntryForJson(entry) {
112
+ const shrunk = {
113
+ icon: asBoundedString(entry.icon, 24) || '🔧',
114
+ label: asBoundedString(entry.label, 80) || 'tool',
115
+ };
116
+ const toolType = asBoundedString(entry.toolType, 48);
117
+ const stepRef = asBoundedString(entry.stepRef, 80);
118
+ const status = asBoundedString(entry.status, 24);
119
+ const detail = asBoundedString(entry.detail, 180);
120
+ const traceRunId = asBoundedString(entry.traceRunId, 96);
121
+ const traceSeq = boundedNumber(entry.traceSeq, Number.MAX_SAFE_INTEGER);
122
+ const detailBytes = boundedNumber(entry.detailBytes, Number.MAX_SAFE_INTEGER);
123
+ const rawRetentionStatus = asBoundedString(entry.rawRetentionStatus, 32);
124
+ if (toolType)
125
+ shrunk.toolType = toolType;
126
+ if (stepRef)
127
+ shrunk.stepRef = stepRef;
128
+ if (status)
129
+ shrunk.status = status;
130
+ if (detail)
131
+ shrunk.detail = detail;
132
+ if (entry.isEmployee === true)
133
+ shrunk.isEmployee = true;
134
+ if (traceRunId && TRACE_RUN_ID_RE.test(traceRunId))
135
+ shrunk.traceRunId = traceRunId;
136
+ if (traceSeq != null && traceSeq > 0)
137
+ shrunk.traceSeq = traceSeq;
138
+ if (entry.detailAvailable === true)
139
+ shrunk.detailAvailable = true;
140
+ if (detailBytes != null)
141
+ shrunk.detailBytes = detailBytes;
142
+ if (rawRetentionStatus)
143
+ shrunk.rawRetentionStatus = rawRetentionStatus;
144
+ return shrunk;
145
+ }
146
+ function fitToolLogToJsonCap(entries) {
147
+ let fitted = entries.map(shrinkEntryForJson);
148
+ let json = JSON.stringify(fitted);
149
+ while (json.length > MAX_TOOL_LOG_JSON_CHARS && fitted.length > 1) {
150
+ fitted.splice(Math.max(0, fitted.length - 2), 1);
151
+ fitted[fitted.length - 1] = makeOverflowEntry(entries.length - fitted.length + 1);
152
+ json = JSON.stringify(fitted);
153
+ }
154
+ if (json.length <= MAX_TOOL_LOG_JSON_CHARS)
155
+ return fitted;
156
+ const minimal = [{
157
+ icon: TRUNCATION_ICON,
158
+ label: TRUNCATION_LABEL,
159
+ toolType: 'tool',
160
+ status: 'done',
161
+ detail: TRUNCATION_DETAIL,
162
+ }];
163
+ return JSON.stringify(minimal).length <= MAX_TOOL_LOG_JSON_CHARS ? minimal : [];
164
+ }
165
+ export function serializeSanitizedToolLog(entries) {
166
+ const sanitized = sanitizeToolLogForDurableStorage(entries);
167
+ if (sanitized.length === 0)
168
+ return null;
169
+ const json = JSON.stringify(sanitized);
170
+ if (json.length <= MAX_TOOL_LOG_JSON_CHARS)
171
+ return json;
172
+ return JSON.stringify(fitToolLogToJsonCap(sanitized));
173
+ }
174
+ export function parseToolLogBounded(raw) {
175
+ if (!raw)
176
+ return [];
177
+ if (raw.length > MAX_TOOL_LOG_RAW_INPUT_CHARS) {
178
+ return [makeOverflowEntry(1)];
179
+ }
180
+ try {
181
+ const parsed = JSON.parse(raw);
182
+ return sanitizeToolLogForDurableStorage(parsed);
183
+ }
184
+ catch {
185
+ return [];
186
+ }
187
+ }
188
+ export function sanitizeSerializedToolLog(raw) {
189
+ return serializeSanitizedToolLog(parseToolLogBounded(raw));
190
+ }
191
+ //# sourceMappingURL=tool-log-sanitize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-log-sanitize.js","sourceRoot":"","sources":["../../../src/shared/tool-log-sanitize.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ import { Bot } from 'grammy';
4
4
  import { sequentialize } from '@grammyjs/runner';
5
5
  import { addBroadcastListener, removeBroadcastListener } from '../core/bus.js';
6
6
  import { settings } from '../core/config.js';
7
+ import { stripUndefined } from '../core/strip-undefined.js';
7
8
  import { t, normalizeLocale } from '../core/i18n.js';
8
9
  import { isResetIntent } from '../orchestrator/pipeline.js';
9
10
  import { submitMessage } from '../orchestrator/gateway.js';
@@ -36,28 +37,28 @@ const telegramForwarderLifecycle = createForwarderLifecycle({
36
37
  addListener: addBroadcastListener,
37
38
  removeListener: removeBroadcastListener,
38
39
  buildForwarder: ({ bot }) => createTelegramForwarder({
39
- bot,
40
+ bot: bot,
40
41
  getLastChatId: () => {
41
42
  const chatIds = Array.from(telegramActiveChatIds);
42
- return chatIds.length ? chatIds[chatIds.length - 1] : null;
43
+ return chatIds.length ? (chatIds[chatIds.length - 1] ?? null) : null;
43
44
  },
44
- shouldSkip: (data) => data.origin === 'telegram', // handled by tgOrchestrate already
45
+ shouldSkip: (data) => data["origin"] === 'telegram', // handled by tgOrchestrate already
45
46
  log: ({ chatId, preview }) => {
46
47
  console.log(`[tg:forward] → chat ${chatId}: ${String(preview).slice(0, 60)}...`);
47
48
  },
48
49
  }),
49
50
  });
50
51
  function currentLocale() {
51
- return normalizeLocale(settings.locale, 'ko');
52
+ return normalizeLocale(settings["locale"], 'ko');
52
53
  }
53
54
  function markChatActive(chatId, ctx) {
54
55
  // Refresh insertion order so Array.from(set).at(-1) points to latest active chat.
55
56
  telegramActiveChatIds.delete(chatId);
56
57
  telegramActiveChatIds.add(chatId);
57
58
  // Auto-persist to settings.json so forwarding survives server restart
58
- const allowed = settings.telegram?.allowedChatIds || [];
59
+ const allowed = settings["telegram"]?.allowedChatIds || [];
59
60
  if (!allowed.includes(chatId)) {
60
- settings.telegram.allowedChatIds = [...allowed, chatId];
61
+ settings["telegram"].allowedChatIds = [...allowed, chatId];
61
62
  import('../core/config.js').then(m => m.saveSettings(settings)).catch(() => { });
62
63
  }
63
64
  // Update messaging runtime targets
@@ -95,8 +96,8 @@ export function getLatestTelegramChatId() {
95
96
  return Array.from(telegramActiveChatIds).at(-1) ?? null;
96
97
  }
97
98
  export function getTelegramTargetIds() {
98
- return settings.telegram.allowedChatIds?.length
99
- ? [...settings.telegram.allowedChatIds]
99
+ return settings["telegram"].allowedChatIds?.length
100
+ ? [...settings["telegram"].allowedChatIds]
100
101
  : [...telegramActiveChatIds];
101
102
  }
102
103
  export async function sendTelegramText(chatId, text) {
@@ -107,13 +108,13 @@ export async function sendTelegramText(chatId, text) {
107
108
  function buildTelegramTarget(ctx) {
108
109
  const chatType = ctx.chat?.type;
109
110
  const isGroup = chatType === 'group' || chatType === 'supergroup';
110
- return {
111
+ return stripUndefined({
111
112
  channel: 'telegram',
112
113
  targetKind: 'channel',
113
114
  peerKind: isGroup ? 'group' : 'direct',
114
- targetId: String(ctx.chat.id),
115
+ targetId: String(ctx.chat?.id ?? ''),
115
116
  threadId: ctx.message?.message_thread_id ? String(ctx.message.message_thread_id) : undefined,
116
- };
117
+ });
117
118
  }
118
119
  async function telegramSendHandler(req) {
119
120
  if (!telegramBot)
@@ -144,7 +145,7 @@ async function telegramSendHandler(req) {
144
145
  return { ok: false, error: 'file_path required for non-text types' };
145
146
  const { validateFileSize, sendTelegramFile } = await import('./telegram-file.js');
146
147
  validateFileSize(filePath, req.type);
147
- const result = await sendTelegramFile(telegramBot, chatId, filePath, req.type, { caption: req.caption });
148
+ const result = await sendTelegramFile(telegramBot, chatId, filePath, req.type, stripUndefined({ caption: req.caption }));
148
149
  return result;
149
150
  }
150
151
  // Register transport at module load time
@@ -162,7 +163,7 @@ function syncTelegramCommands(bot) {
162
163
  const cmds = getTelegramMenuCommands()
163
164
  .map((c) => ({
164
165
  command: c.name,
165
- description: toTelegramCommandDescription(c.tgDescKey ? t(c.tgDescKey, {}, locale) : (c.descKey ? t(c.descKey, {}, locale) : c.desc)),
166
+ description: toTelegramCommandDescription((c.tgDescKey ? t(c.tgDescKey, {}, locale) : (c.descKey ? t(c.descKey, {}, locale) : c.desc)) ?? ''),
166
167
  }));
167
168
  // Set commands with language_code per Telegram Bot API
168
169
  // Also set default (no language_code) for users without language preference
@@ -222,34 +223,37 @@ async function _initTelegramInner() {
222
223
  await new Promise(r => setTimeout(r, 2000));
223
224
  }
224
225
  }
225
- const envToken = process.env.TELEGRAM_TOKEN;
226
+ const envToken = process.env["TELEGRAM_TOKEN"];
226
227
  if (envToken)
227
- settings.telegram.token = envToken;
228
- const envChatIds = process.env.TELEGRAM_ALLOWED_CHAT_IDS;
228
+ settings["telegram"].token = envToken;
229
+ const envChatIds = process.env["TELEGRAM_ALLOWED_CHAT_IDS"];
229
230
  if (envChatIds) {
230
- settings.telegram.allowedChatIds = envChatIds
231
+ settings["telegram"].allowedChatIds = envChatIds
231
232
  .split(',')
232
233
  .map(id => parseInt(id.trim(), 10))
233
234
  .filter(id => !isNaN(id));
234
235
  }
235
- if (!settings.telegram?.enabled || !settings.telegram?.token) {
236
+ if (!settings["telegram"]?.enabled || !settings["telegram"]?.token) {
236
237
  console.log('[tg] ⏭️ Telegram pending (disabled or no token)');
237
238
  return;
238
239
  }
239
240
  // Pre-seed telegramActiveChatIds from persisted allowedChatIds
240
- if (settings.telegram.allowedChatIds?.length) {
241
- for (const id of settings.telegram.allowedChatIds)
241
+ if (settings["telegram"].allowedChatIds?.length) {
242
+ for (const id of settings["telegram"].allowedChatIds)
242
243
  telegramActiveChatIds.add(id);
243
- console.log(`[tg] Pre-seeded ${settings.telegram.allowedChatIds.length} chat(s) from allowedChatIds`);
244
+ console.log(`[tg] Pre-seeded ${settings["telegram"].allowedChatIds.length} chat(s) from allowedChatIds`);
244
245
  }
245
246
  const ipv4Agent = new https.Agent({ family: 4 });
246
247
  const ipv4Fetch = (url, init = {}) => {
247
248
  return new Promise((resolve, reject) => {
248
249
  const u = new URL(url);
250
+ const headersInit = init["headers"];
249
251
  const opts = {
250
252
  hostname: u.hostname, port: u.port || 443, path: u.pathname + u.search,
251
- method: init.method || 'GET', agent: ipv4Agent,
252
- headers: init.headers instanceof Headers ? Object.fromEntries(init.headers) : (init.headers || {}),
253
+ method: init["method"] || 'GET', agent: ipv4Agent,
254
+ headers: headersInit instanceof Headers
255
+ ? Object.fromEntries(headersInit)
256
+ : (headersInit || {}),
253
257
  };
254
258
  const req = https.request(opts, (res) => {
255
259
  let data = '';
@@ -262,12 +266,13 @@ async function _initTelegramInner() {
262
266
  }));
263
267
  });
264
268
  req.on('error', reject);
265
- if (init.body)
266
- req.write(typeof init.body === 'string' ? init.body : JSON.stringify(init.body));
269
+ const body = init["body"];
270
+ if (body)
271
+ req.write(typeof body === 'string' ? body : JSON.stringify(body));
267
272
  req.end();
268
273
  });
269
274
  };
270
- const bot = new Bot(settings.telegram.token, {
275
+ const bot = new Bot(settings["telegram"].token, {
271
276
  client: { fetch: ipv4Fetch },
272
277
  });
273
278
  bot.catch((err) => console.error('[tg:error]', err.message || err));
@@ -277,7 +282,7 @@ async function _initTelegramInner() {
277
282
  await next();
278
283
  });
279
284
  bot.use(async (ctx, next) => {
280
- const allowed = settings.telegram.allowedChatIds;
285
+ const allowed = settings["telegram"].allowedChatIds;
281
286
  if (allowed?.length > 0 && !allowed.includes(ctx.chat?.id)) {
282
287
  console.log(`[tg:blocked] chatId=${ctx.chat?.id}`);
283
288
  return;
@@ -286,7 +291,7 @@ async function _initTelegramInner() {
286
291
  });
287
292
  // Group chat @mention gating (configurable)
288
293
  bot.use(async (ctx, next) => {
289
- if (settings.telegram.mentionOnly === false) {
294
+ if (settings["telegram"].mentionOnly === false) {
290
295
  await next();
291
296
  return;
292
297
  }
@@ -300,19 +305,22 @@ async function _initTelegramInner() {
300
305
  await next();
301
306
  });
302
307
  bot.command('start', (ctx) => ctx.reply(t('tg.connected', {}, currentLocale())));
303
- bot.command('id', (ctx) => ctx.reply(`Chat ID: <code>${ctx.chat.id}</code>`, { parse_mode: 'HTML' }));
308
+ bot.command('id', (ctx) => ctx.reply(`Chat ID: <code>${ctx.chat?.id ?? ''}</code>`, { parse_mode: 'HTML' }));
304
309
  async function tgOrchestrate(ctx, prompt, displayMsg) {
305
310
  const chatId = ctx.chat?.id;
306
- const result = submitMessage(prompt, { origin: 'telegram', displayText: displayMsg, skipOrchestrate: true, chatId });
311
+ if (!ctx.chat)
312
+ return;
313
+ const chat = ctx.chat;
314
+ const result = submitMessage(prompt, stripUndefined({ origin: 'telegram', displayText: displayMsg, skipOrchestrate: true, chatId }));
307
315
  if (result.action === 'queued') {
308
316
  console.log(`[tg:queue] agent busy, queued (${result.pending} pending)`);
309
317
  await ctx.reply(t('tg.queued', { count: result.pending }, currentLocale()));
310
318
  // 큐 처리 후 응답을 이 채팅으로 전달 — requestId로 request-level 격리
311
319
  const requestId = result.requestId;
312
320
  const queueHandler = (type, data) => {
313
- if (type === 'orchestrate_done' && data.text && data.origin === 'telegram' && data.requestId === requestId) {
321
+ if (type === 'orchestrate_done' && data["text"] && data["origin"] === 'telegram' && data["requestId"] === requestId) {
314
322
  removeBroadcastListener(queueHandler);
315
- const html = markdownToTelegramHtml(data.text);
323
+ const html = markdownToTelegramHtml(String(data["text"]));
316
324
  const chunks = chunkTelegramMessage(html);
317
325
  for (const chunk of chunks) {
318
326
  ctx.reply(chunk, { parse_mode: 'HTML' })
@@ -330,7 +338,7 @@ async function _initTelegramInner() {
330
338
  }
331
339
  // result.action === 'started' — TG 출력 로직 진입
332
340
  const submitRequestId = result.requestId;
333
- markChatActive(ctx.chat.id, ctx);
341
+ markChatActive(chat.id, ctx);
334
342
  await ctx.replyWithChatAction('typing')
335
343
  .then(() => console.log('[tg:typing] ✅ sent'))
336
344
  .catch((e) => console.log('[tg:typing] ❌', e.message));
@@ -339,7 +347,7 @@ async function _initTelegramInner() {
339
347
  .then(() => console.log('[tg:typing] ✅ refresh'))
340
348
  .catch((e) => console.log('[tg:typing] ❌ refresh', e.message));
341
349
  }, 4000);
342
- const showTools = settings.telegram?.showToolUse !== false;
350
+ const showTools = settings["telegram"]?.showToolUse !== false;
343
351
  let statusMsgId = null;
344
352
  let statusMsgCreatePromise = null;
345
353
  let statusUpdateTimer = null;
@@ -365,7 +373,7 @@ async function _initTelegramInner() {
365
373
  await statusMsgCreatePromise;
366
374
  return;
367
375
  }
368
- await ctx.api.editMessageText(ctx.chat.id, statusMsgId, `🔄 ${display}`)
376
+ await ctx.api.editMessageText(chat.id, statusMsgId, `🔄 ${display}`)
369
377
  .catch(() => { });
370
378
  };
371
379
  const scheduleStatusUpdate = () => {
@@ -400,19 +408,19 @@ async function _initTelegramInner() {
400
408
  };
401
409
  const toolHandler = showTools ? (type, data) => {
402
410
  if (type === 'agent_retry') {
403
- pushToolLine(`⏳ ${data.cli} 429 — ${data.delay}s 후 재시도`);
411
+ pushToolLine(`⏳ ${data["cli"]} 429 — ${data["delay"]}s 후 재시도`);
404
412
  }
405
413
  else if (type === 'agent_fallback') {
406
- pushToolLine(`⚡ ${data.from} → ${data.to}`);
414
+ pushToolLine(`⚡ ${data["from"]} → ${data["to"]}`);
407
415
  }
408
416
  else if (type === 'agent_smoke') {
409
- console.log(`[tg:smoke] ${data.cli} smoke detected — auto-continuing`);
417
+ console.log(`[tg:smoke] ${data["cli"]} smoke detected — auto-continuing`);
410
418
  }
411
- else if (type === 'agent_tool' && data.icon && data.label) {
419
+ else if (type === 'agent_tool' && data["icon"] && data["label"]) {
412
420
  // Copilot ACP emits many thought chunks; hide them on Telegram to avoid message storms.
413
- if (data.icon === '💭')
421
+ if (data["icon"] === '💭')
414
422
  return;
415
- pushToolLine(`${data.icon} ${data.label}`);
423
+ pushToolLine(`${data["icon"]} ${data["label"]}`);
416
424
  }
417
425
  else {
418
426
  return;
@@ -421,7 +429,7 @@ async function _initTelegramInner() {
421
429
  if (toolHandler)
422
430
  addBroadcastListener(toolHandler);
423
431
  try {
424
- const result = await orchestrateAndCollect(prompt, { origin: 'telegram', chatId: ctx.chat.id, requestId: submitRequestId, _skipInsert: true });
432
+ const result = await orchestrateAndCollect(prompt, { origin: 'telegram', chatId: chat.id, requestId: submitRequestId, _skipInsert: true });
425
433
  clearInterval(typingInterval);
426
434
  if (statusUpdateTimer) {
427
435
  clearTimeout(statusUpdateTimer);
@@ -430,7 +438,7 @@ async function _initTelegramInner() {
430
438
  if (toolHandler)
431
439
  removeBroadcastListener(toolHandler);
432
440
  if (statusMsgId) {
433
- ctx.api.deleteMessage(ctx.chat.id, statusMsgId).catch(() => { });
441
+ ctx.api.deleteMessage(chat.id, statusMsgId).catch(() => { });
434
442
  }
435
443
  const html = markdownToTelegramHtml(result);
436
444
  const chunks = chunkTelegramMessage(html);
@@ -442,7 +450,7 @@ async function _initTelegramInner() {
442
450
  await ctx.reply(chunk.replace(/<[^>]+>/g, ''));
443
451
  }
444
452
  }
445
- console.log(`[tg:out] ${ctx.chat.id}: ${result.slice(0, 80)}`);
453
+ console.log(`[tg:out] ${chat.id}: ${result.slice(0, 80)}`);
446
454
  }
447
455
  catch (err) {
448
456
  clearInterval(typingInterval);
@@ -453,13 +461,15 @@ async function _initTelegramInner() {
453
461
  if (toolHandler)
454
462
  removeBroadcastListener(toolHandler);
455
463
  if (statusMsgId) {
456
- ctx.api.deleteMessage(ctx.chat.id, statusMsgId).catch(() => { });
464
+ ctx.api.deleteMessage(chat.id, statusMsgId).catch(() => { });
457
465
  }
458
466
  console.error('[tg:error]', err);
459
467
  await ctx.reply(`❌ Error: ${err.message}`);
460
468
  }
461
469
  }
462
470
  bot.on('message:text', async (ctx) => {
471
+ if (!ctx.chat)
472
+ return;
463
473
  markChatActive(ctx.chat.id, ctx);
464
474
  let text = ctx.message.text;
465
475
  if (botUsername) {
@@ -496,7 +506,7 @@ async function _initTelegramInner() {
496
506
  }
497
507
  return;
498
508
  }
499
- console.log(`[tg:in] ${ctx.chat.id}: ${text.slice(0, 80)}`);
509
+ console.log(`[tg:in] ${ctx.chat?.id}: ${text.slice(0, 80)}`);
500
510
  // Reset intent: use submitMessage gateway for consistency
501
511
  if (isResetIntent(text)) {
502
512
  const result = submitMessage(text, { origin: 'telegram' });
@@ -514,14 +524,14 @@ async function _initTelegramInner() {
514
524
  const photos = ctx.message.photo;
515
525
  const largest = photos[photos.length - 1];
516
526
  const caption = ctx.message.caption || '';
517
- console.log(`[tg:photo] ${ctx.chat.id}: fileId=${largest.file_id.slice(0, 20)}... caption=${caption.slice(0, 40)}`);
527
+ console.log(`[tg:photo] ${ctx.chat?.id}: fileId=${largest.file_id.slice(0, 20)}... caption=${caption.slice(0, 40)}`);
518
528
  try {
519
- const dlResult = await downloadTelegramFile(largest.file_id, settings.telegram.token, {
529
+ const dlResult = await downloadTelegramFile(largest.file_id, settings["telegram"].token, stripUndefined({
520
530
  kind: 'photo',
521
531
  maxBytes: TELEGRAM_DOWNLOAD_LIMITS.photo,
522
532
  fileSize: largest.file_size,
523
- });
524
- const filePath = saveUpload(dlResult.buffer, `photo${dlResult.ext}`);
533
+ }));
534
+ const filePath = saveUpload(dlResult["buffer"], `photo${dlResult["ext"]}`);
525
535
  const prompt = buildMediaPrompt(filePath, caption);
526
536
  tgOrchestrate(ctx, prompt, `${t('tg.imageCaption', { caption }, currentLocale())}`);
527
537
  }
@@ -533,14 +543,14 @@ async function _initTelegramInner() {
533
543
  bot.on('message:document', async (ctx) => {
534
544
  const doc = ctx.message.document;
535
545
  const caption = ctx.message.caption || '';
536
- console.log(`[tg:doc] ${ctx.chat.id}: ${doc.file_name} (${doc.file_size} bytes)`);
546
+ console.log(`[tg:doc] ${ctx.chat?.id}: ${doc.file_name} (${doc.file_size} bytes)`);
537
547
  try {
538
- const dlResult = await downloadTelegramFile(doc.file_id, settings.telegram.token, {
548
+ const dlResult = await downloadTelegramFile(doc.file_id, settings["telegram"].token, stripUndefined({
539
549
  kind: 'document',
540
550
  maxBytes: TELEGRAM_DOWNLOAD_LIMITS.document,
541
551
  fileSize: doc.file_size,
542
- });
543
- const filePath = saveUpload(dlResult.buffer, doc.file_name || 'document');
552
+ }));
553
+ const filePath = saveUpload(dlResult["buffer"], doc.file_name || 'document');
544
554
  const prompt = buildMediaPrompt(filePath, caption);
545
555
  tgOrchestrate(ctx, prompt, `[📎 ${doc.file_name || 'file'}] ${caption}`);
546
556
  }
@@ -551,7 +561,7 @@ async function _initTelegramInner() {
551
561
  });
552
562
  bot.on('message:voice', (ctx) => handleVoice(ctx, currentLocale, tgOrchestrate));
553
563
  // ─── Global Forwarding: non-Telegram responses → Telegram ───
554
- if (settings.telegram?.forwardAll !== false) {
564
+ if (settings["telegram"]?.forwardAll !== false) {
555
565
  attachTelegramForwarder(bot);
556
566
  }
557
567
  void syncTelegramCommands(bot).catch((e) => {