@geminixiang/mikan 1.0.0-beta.76 → 1.0.0-beta.77

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 (506) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/adapters/commands/login.d.ts.map +1 -1
  3. package/dist/adapters/commands/login.js +0 -9
  4. package/dist/adapters/commands/login.js.map +1 -1
  5. package/dist/adapters/commands/manifest.d.ts +0 -19
  6. package/dist/adapters/commands/manifest.d.ts.map +1 -1
  7. package/dist/adapters/commands/manifest.js +0 -34
  8. package/dist/adapters/commands/manifest.js.map +1 -1
  9. package/dist/adapters/commands/model.d.ts +0 -5
  10. package/dist/adapters/commands/model.d.ts.map +1 -1
  11. package/dist/adapters/commands/model.js +0 -5
  12. package/dist/adapters/commands/model.js.map +1 -1
  13. package/dist/adapters/commands/new.d.ts.map +1 -1
  14. package/dist/adapters/commands/new.js +0 -2
  15. package/dist/adapters/commands/new.js.map +1 -1
  16. package/dist/adapters/commands/registry.d.ts +0 -1
  17. package/dist/adapters/commands/registry.d.ts.map +1 -1
  18. package/dist/adapters/commands/registry.js +0 -8
  19. package/dist/adapters/commands/registry.js.map +1 -1
  20. package/dist/adapters/commands/session-view.d.ts.map +1 -1
  21. package/dist/adapters/commands/session-view.js +0 -2
  22. package/dist/adapters/commands/session-view.js.map +1 -1
  23. package/dist/adapters/commands/types.d.ts +0 -29
  24. package/dist/adapters/commands/types.d.ts.map +1 -1
  25. package/dist/adapters/commands/types.js.map +1 -1
  26. package/dist/adapters/commands/utils.d.ts +0 -3
  27. package/dist/adapters/commands/utils.d.ts.map +1 -1
  28. package/dist/adapters/commands/utils.js +0 -3
  29. package/dist/adapters/commands/utils.js.map +1 -1
  30. package/dist/adapters/discord/bot.d.ts +0 -4
  31. package/dist/adapters/discord/bot.d.ts.map +1 -1
  32. package/dist/adapters/discord/bot.js +5 -41
  33. package/dist/adapters/discord/bot.js.map +1 -1
  34. package/dist/adapters/discord/components.d.ts +0 -23
  35. package/dist/adapters/discord/components.d.ts.map +1 -1
  36. package/dist/adapters/discord/components.js +0 -23
  37. package/dist/adapters/discord/components.js.map +1 -1
  38. package/dist/adapters/discord/context.d.ts.map +1 -1
  39. package/dist/adapters/discord/context.js +1 -11
  40. package/dist/adapters/discord/context.js.map +1 -1
  41. package/dist/adapters/discord/format.d.ts +0 -1
  42. package/dist/adapters/discord/format.d.ts.map +1 -1
  43. package/dist/adapters/discord/format.js +0 -37
  44. package/dist/adapters/discord/format.js.map +1 -1
  45. package/dist/adapters/github/bot.d.ts +0 -44
  46. package/dist/adapters/github/bot.d.ts.map +1 -1
  47. package/dist/adapters/github/bot.js +1 -120
  48. package/dist/adapters/github/bot.js.map +1 -1
  49. package/dist/adapters/github/client.d.ts +0 -57
  50. package/dist/adapters/github/client.d.ts.map +1 -1
  51. package/dist/adapters/github/client.js +0 -59
  52. package/dist/adapters/github/client.js.map +1 -1
  53. package/dist/adapters/github/context.d.ts.map +1 -1
  54. package/dist/adapters/github/context.js +1 -8
  55. package/dist/adapters/github/context.js.map +1 -1
  56. package/dist/adapters/github/github-ops.d.ts +0 -55
  57. package/dist/adapters/github/github-ops.d.ts.map +1 -1
  58. package/dist/adapters/github/github-ops.js +0 -59
  59. package/dist/adapters/github/github-ops.js.map +1 -1
  60. package/dist/adapters/github/ids.d.ts +0 -27
  61. package/dist/adapters/github/ids.d.ts.map +1 -1
  62. package/dist/adapters/github/ids.js +0 -29
  63. package/dist/adapters/github/ids.js.map +1 -1
  64. package/dist/adapters/github/repo.d.ts +0 -25
  65. package/dist/adapters/github/repo.d.ts.map +1 -1
  66. package/dist/adapters/github/repo.js +0 -49
  67. package/dist/adapters/github/repo.js.map +1 -1
  68. package/dist/adapters/github/tool-pack.d.ts +0 -10
  69. package/dist/adapters/github/tool-pack.d.ts.map +1 -1
  70. package/dist/adapters/github/tool-pack.js +0 -10
  71. package/dist/adapters/github/tool-pack.js.map +1 -1
  72. package/dist/adapters/github/tools/checks.d.ts +0 -6
  73. package/dist/adapters/github/tools/checks.d.ts.map +1 -1
  74. package/dist/adapters/github/tools/checks.js +0 -7
  75. package/dist/adapters/github/tools/checks.js.map +1 -1
  76. package/dist/adapters/github/tools/issue.d.ts +0 -5
  77. package/dist/adapters/github/tools/issue.d.ts.map +1 -1
  78. package/dist/adapters/github/tools/issue.js +0 -5
  79. package/dist/adapters/github/tools/issue.js.map +1 -1
  80. package/dist/adapters/github/tools/pr.d.ts +0 -7
  81. package/dist/adapters/github/tools/pr.d.ts.map +1 -1
  82. package/dist/adapters/github/tools/pr.js +0 -7
  83. package/dist/adapters/github/tools/pr.js.map +1 -1
  84. package/dist/adapters/github/tools/read.d.ts +0 -6
  85. package/dist/adapters/github/tools/read.d.ts.map +1 -1
  86. package/dist/adapters/github/tools/read.js +0 -8
  87. package/dist/adapters/github/tools/read.js.map +1 -1
  88. package/dist/adapters/github/tools/review-reply.d.ts +0 -5
  89. package/dist/adapters/github/tools/review-reply.d.ts.map +1 -1
  90. package/dist/adapters/github/tools/review-reply.js +0 -5
  91. package/dist/adapters/github/tools/review-reply.js.map +1 -1
  92. package/dist/adapters/github/tools/sync.d.ts +0 -6
  93. package/dist/adapters/github/tools/sync.d.ts.map +1 -1
  94. package/dist/adapters/github/tools/sync.js +0 -6
  95. package/dist/adapters/github/tools/sync.js.map +1 -1
  96. package/dist/adapters/github/types.d.ts +0 -88
  97. package/dist/adapters/github/types.d.ts.map +1 -1
  98. package/dist/adapters/github/types.js.map +1 -1
  99. package/dist/adapters/github/webhook.d.ts +0 -13
  100. package/dist/adapters/github/webhook.d.ts.map +1 -1
  101. package/dist/adapters/github/webhook.js +0 -16
  102. package/dist/adapters/github/webhook.js.map +1 -1
  103. package/dist/adapters/index.d.ts +3 -4
  104. package/dist/adapters/index.d.ts.map +1 -1
  105. package/dist/adapters/index.js +4 -4
  106. package/dist/adapters/index.js.map +1 -1
  107. package/dist/adapters/intake.d.ts +0 -17
  108. package/dist/adapters/intake.d.ts.map +1 -1
  109. package/dist/adapters/intake.js +6 -32
  110. package/dist/adapters/intake.js.map +1 -1
  111. package/dist/adapters/markdown-tables.d.ts +0 -10
  112. package/dist/adapters/markdown-tables.d.ts.map +1 -1
  113. package/dist/adapters/markdown-tables.js +1 -42
  114. package/dist/adapters/markdown-tables.js.map +1 -1
  115. package/dist/adapters/progressive-renderer.d.ts.map +1 -1
  116. package/dist/adapters/progressive-renderer.js +3 -25
  117. package/dist/adapters/progressive-renderer.js.map +1 -1
  118. package/dist/adapters/shared.d.ts +0 -57
  119. package/dist/adapters/shared.d.ts.map +1 -1
  120. package/dist/adapters/shared.js +0 -71
  121. package/dist/adapters/shared.js.map +1 -1
  122. package/dist/adapters/slack/assistant.d.ts +0 -49
  123. package/dist/adapters/slack/assistant.d.ts.map +1 -1
  124. package/dist/adapters/slack/assistant.js +0 -97
  125. package/dist/adapters/slack/assistant.js.map +1 -1
  126. package/dist/adapters/slack/auto-reply-context.d.ts +0 -7
  127. package/dist/adapters/slack/auto-reply-context.d.ts.map +1 -1
  128. package/dist/adapters/slack/auto-reply-context.js +0 -7
  129. package/dist/adapters/slack/auto-reply-context.js.map +1 -1
  130. package/dist/adapters/slack/blocks.d.ts +0 -9
  131. package/dist/adapters/slack/blocks.d.ts.map +1 -1
  132. package/dist/adapters/slack/blocks.js +0 -20
  133. package/dist/adapters/slack/blocks.js.map +1 -1
  134. package/dist/adapters/slack/bot.d.ts +0 -116
  135. package/dist/adapters/slack/bot.d.ts.map +1 -1
  136. package/dist/adapters/slack/bot.js +7 -231
  137. package/dist/adapters/slack/bot.js.map +1 -1
  138. package/dist/adapters/slack/context.d.ts.map +1 -1
  139. package/dist/adapters/slack/context.js +1 -3
  140. package/dist/adapters/slack/context.js.map +1 -1
  141. package/dist/adapters/slack/jev-context.d.ts +0 -13
  142. package/dist/adapters/slack/jev-context.d.ts.map +1 -1
  143. package/dist/adapters/slack/jev-context.js +0 -12
  144. package/dist/adapters/slack/jev-context.js.map +1 -1
  145. package/dist/adapters/slack/markdown.d.ts +0 -1
  146. package/dist/adapters/slack/markdown.d.ts.map +1 -1
  147. package/dist/adapters/slack/markdown.js +0 -5
  148. package/dist/adapters/slack/markdown.js.map +1 -1
  149. package/dist/adapters/slack/persona.d.ts +0 -9
  150. package/dist/adapters/slack/persona.d.ts.map +1 -1
  151. package/dist/adapters/slack/persona.js +0 -9
  152. package/dist/adapters/slack/persona.js.map +1 -1
  153. package/dist/adapters/slack/response-lifecycle.d.ts.map +1 -1
  154. package/dist/adapters/slack/response-lifecycle.js +1 -45
  155. package/dist/adapters/slack/response-lifecycle.js.map +1 -1
  156. package/dist/adapters/slack/session.d.ts +2 -1
  157. package/dist/adapters/slack/session.d.ts.map +1 -1
  158. package/dist/adapters/slack/session.js +2 -2
  159. package/dist/adapters/slack/session.js.map +1 -1
  160. package/dist/adapters/slack/stream-limits.d.ts +0 -25
  161. package/dist/adapters/slack/stream-limits.d.ts.map +1 -1
  162. package/dist/adapters/slack/stream-limits.js +0 -34
  163. package/dist/adapters/slack/stream-limits.js.map +1 -1
  164. package/dist/adapters/slack/task-intent.d.ts +0 -13
  165. package/dist/adapters/slack/task-intent.d.ts.map +1 -1
  166. package/dist/adapters/slack/task-intent.js +0 -7
  167. package/dist/adapters/slack/task-intent.js.map +1 -1
  168. package/dist/adapters/slack/task-status.d.ts +0 -1
  169. package/dist/adapters/slack/task-status.d.ts.map +1 -1
  170. package/dist/adapters/slack/task-status.js +1 -9
  171. package/dist/adapters/slack/task-status.js.map +1 -1
  172. package/dist/adapters/slack/tool-pack.d.ts +0 -6
  173. package/dist/adapters/slack/tool-pack.d.ts.map +1 -1
  174. package/dist/adapters/slack/tool-pack.js +0 -6
  175. package/dist/adapters/slack/tool-pack.js.map +1 -1
  176. package/dist/adapters/slack/tools/blockkit.d.ts.map +1 -1
  177. package/dist/adapters/slack/tools/blockkit.js +0 -11
  178. package/dist/adapters/slack/tools/blockkit.js.map +1 -1
  179. package/dist/adapters/slack/types.d.ts +0 -19
  180. package/dist/adapters/slack/types.d.ts.map +1 -1
  181. package/dist/adapters/slack/types.js.map +1 -1
  182. package/dist/adapters/slack/update-diagnostics.d.ts +0 -1
  183. package/dist/adapters/slack/update-diagnostics.d.ts.map +1 -1
  184. package/dist/adapters/slack/update-diagnostics.js +1 -7
  185. package/dist/adapters/slack/update-diagnostics.js.map +1 -1
  186. package/dist/adapters/telegram/bot.d.ts +0 -6
  187. package/dist/adapters/telegram/bot.d.ts.map +1 -1
  188. package/dist/adapters/telegram/bot.js +1 -50
  189. package/dist/adapters/telegram/bot.js.map +1 -1
  190. package/dist/adapters/telegram/context.d.ts.map +1 -1
  191. package/dist/adapters/telegram/context.js +1 -8
  192. package/dist/adapters/telegram/context.js.map +1 -1
  193. package/dist/adapters/types.d.ts +0 -57
  194. package/dist/adapters/types.d.ts.map +1 -1
  195. package/dist/adapters/types.js.map +1 -1
  196. package/dist/adapters/web/admin/client-assets.d.ts +4 -0
  197. package/dist/adapters/web/admin/client-assets.d.ts.map +1 -0
  198. package/dist/adapters/web/admin/client-assets.js +1765 -0
  199. package/dist/adapters/web/admin/client-assets.js.map +1 -0
  200. package/dist/adapters/web/admin/portal.d.ts +0 -10
  201. package/dist/adapters/web/admin/portal.d.ts.map +1 -1
  202. package/dist/adapters/web/admin/portal.js +6 -1909
  203. package/dist/adapters/web/admin/portal.js.map +1 -1
  204. package/dist/adapters/web/admin/types.d.ts +0 -3
  205. package/dist/adapters/web/admin/types.d.ts.map +1 -1
  206. package/dist/adapters/web/admin/types.js.map +1 -1
  207. package/dist/adapters/web/login/oauth.d.ts.map +1 -1
  208. package/dist/adapters/web/login/oauth.js +0 -5
  209. package/dist/adapters/web/login/oauth.js.map +1 -1
  210. package/dist/adapters/web/login/portal.d.ts +0 -10
  211. package/dist/adapters/web/login/portal.d.ts.map +1 -1
  212. package/dist/adapters/web/login/portal.js +1 -35
  213. package/dist/adapters/web/login/portal.js.map +1 -1
  214. package/dist/adapters/web/login/types.d.ts +0 -5
  215. package/dist/adapters/web/login/types.d.ts.map +1 -1
  216. package/dist/adapters/web/login/types.js.map +1 -1
  217. package/dist/adapters/web/portal-shell.d.ts +0 -12
  218. package/dist/adapters/web/portal-shell.d.ts.map +1 -1
  219. package/dist/adapters/web/portal-shell.js +8 -25
  220. package/dist/adapters/web/portal-shell.js.map +1 -1
  221. package/dist/adapters/web/server.d.ts +0 -1
  222. package/dist/adapters/web/server.d.ts.map +1 -1
  223. package/dist/adapters/web/server.js +0 -2
  224. package/dist/adapters/web/server.js.map +1 -1
  225. package/dist/adapters/web/session-view/portal.d.ts.map +1 -1
  226. package/dist/adapters/web/session-view/portal.js +13 -24
  227. package/dist/adapters/web/session-view/portal.js.map +1 -1
  228. package/dist/adapters/web/session-view/types.d.ts.map +1 -1
  229. package/dist/adapters/web/session-view/types.js.map +1 -1
  230. package/dist/adapters/web/token-store.d.ts +0 -2
  231. package/dist/adapters/web/token-store.d.ts.map +1 -1
  232. package/dist/adapters/web/token-store.js +0 -2
  233. package/dist/adapters/web/token-store.js.map +1 -1
  234. package/dist/cli/arg-grammar.d.ts +0 -3
  235. package/dist/cli/arg-grammar.d.ts.map +1 -1
  236. package/dist/cli/arg-grammar.js +0 -3
  237. package/dist/cli/arg-grammar.js.map +1 -1
  238. package/dist/cli/boot.d.ts.map +1 -1
  239. package/dist/cli/boot.js +0 -11
  240. package/dist/cli/boot.js.map +1 -1
  241. package/dist/cli/download.d.ts.map +1 -1
  242. package/dist/cli/download.js +2 -6
  243. package/dist/cli/download.js.map +1 -1
  244. package/dist/cli/office.d.ts.map +1 -1
  245. package/dist/cli/office.js +0 -31
  246. package/dist/cli/office.js.map +1 -1
  247. package/dist/cli/onboard.d.ts +0 -2
  248. package/dist/cli/onboard.d.ts.map +1 -1
  249. package/dist/cli/onboard.js +0 -30
  250. package/dist/cli/onboard.js.map +1 -1
  251. package/dist/cli/process-lifecycle.d.ts +0 -5
  252. package/dist/cli/process-lifecycle.d.ts.map +1 -1
  253. package/dist/cli/process-lifecycle.js +0 -6
  254. package/dist/cli/process-lifecycle.js.map +1 -1
  255. package/dist/cli/sessions.d.ts.map +1 -1
  256. package/dist/cli/sessions.js +0 -11
  257. package/dist/cli/sessions.js.map +1 -1
  258. package/dist/cli/types.d.ts +0 -5
  259. package/dist/cli/types.d.ts.map +1 -1
  260. package/dist/cli/types.js.map +1 -1
  261. package/dist/dream/index.js +0 -2
  262. package/dist/dream/index.js.map +1 -1
  263. package/dist/env-manifest.d.ts +0 -21
  264. package/dist/env-manifest.d.ts.map +1 -1
  265. package/dist/env-manifest.js +0 -11
  266. package/dist/env-manifest.js.map +1 -1
  267. package/dist/events/index.d.ts +0 -51
  268. package/dist/events/index.d.ts.map +1 -1
  269. package/dist/events/index.js +0 -42
  270. package/dist/events/index.js.map +1 -1
  271. package/dist/events/scheduler.d.ts +0 -8
  272. package/dist/events/scheduler.d.ts.map +1 -1
  273. package/dist/events/scheduler.js +0 -8
  274. package/dist/events/scheduler.js.map +1 -1
  275. package/dist/file-guards.d.ts +0 -15
  276. package/dist/file-guards.d.ts.map +1 -1
  277. package/dist/file-guards.js +2 -26
  278. package/dist/file-guards.js.map +1 -1
  279. package/dist/harness/execution-env.d.ts +0 -15
  280. package/dist/harness/execution-env.d.ts.map +1 -1
  281. package/dist/harness/execution-env.js +4 -55
  282. package/dist/harness/execution-env.js.map +1 -1
  283. package/dist/harness/http.d.ts +0 -12
  284. package/dist/harness/http.d.ts.map +1 -1
  285. package/dist/harness/http.js +0 -34
  286. package/dist/harness/http.js.map +1 -1
  287. package/dist/harness/index.d.ts +0 -7
  288. package/dist/harness/index.d.ts.map +1 -1
  289. package/dist/harness/index.js +0 -7
  290. package/dist/harness/index.js.map +1 -1
  291. package/dist/harness/jev.d.ts +0 -28
  292. package/dist/harness/jev.d.ts.map +1 -1
  293. package/dist/harness/jev.js +0 -45
  294. package/dist/harness/jev.js.map +1 -1
  295. package/dist/harness/mcp.d.ts +0 -19
  296. package/dist/harness/mcp.d.ts.map +1 -1
  297. package/dist/harness/mcp.js +0 -34
  298. package/dist/harness/mcp.js.map +1 -1
  299. package/dist/harness/models.d.ts +0 -19
  300. package/dist/harness/models.d.ts.map +1 -1
  301. package/dist/harness/models.js +0 -52
  302. package/dist/harness/models.js.map +1 -1
  303. package/dist/harness/open-connector.d.ts +0 -12
  304. package/dist/harness/open-connector.d.ts.map +1 -1
  305. package/dist/harness/open-connector.js +0 -22
  306. package/dist/harness/open-connector.js.map +1 -1
  307. package/dist/harness/presenter.d.ts.map +1 -1
  308. package/dist/harness/presenter.js +15 -65
  309. package/dist/harness/presenter.js.map +1 -1
  310. package/dist/harness/prompt.d.ts +0 -11
  311. package/dist/harness/prompt.d.ts.map +1 -1
  312. package/dist/harness/prompt.js +0 -17
  313. package/dist/harness/prompt.js.map +1 -1
  314. package/dist/harness/runner.d.ts.map +1 -1
  315. package/dist/harness/runner.js +0 -25
  316. package/dist/harness/runner.js.map +1 -1
  317. package/dist/harness/session.d.ts +11 -28
  318. package/dist/harness/session.d.ts.map +1 -1
  319. package/dist/harness/session.js +100 -38
  320. package/dist/harness/session.js.map +1 -1
  321. package/dist/harness/skills.d.ts +0 -22
  322. package/dist/harness/skills.d.ts.map +1 -1
  323. package/dist/harness/skills.js +0 -20
  324. package/dist/harness/skills.js.map +1 -1
  325. package/dist/harness/subagent-profiles.d.ts +0 -4
  326. package/dist/harness/subagent-profiles.d.ts.map +1 -1
  327. package/dist/harness/subagent-profiles.js +0 -29
  328. package/dist/harness/subagent-profiles.js.map +1 -1
  329. package/dist/harness/subagent.d.ts +0 -25
  330. package/dist/harness/subagent.d.ts.map +1 -1
  331. package/dist/harness/subagent.js +1 -70
  332. package/dist/harness/subagent.js.map +1 -1
  333. package/dist/harness/tools/event.d.ts.map +1 -1
  334. package/dist/harness/tools/event.js +0 -9
  335. package/dist/harness/tools/event.js.map +1 -1
  336. package/dist/harness/tools/generate-image.d.ts +0 -6
  337. package/dist/harness/tools/generate-image.d.ts.map +1 -1
  338. package/dist/harness/tools/generate-image.js.map +1 -1
  339. package/dist/harness/tools/host-fn-tool.d.ts +0 -17
  340. package/dist/harness/tools/host-fn-tool.d.ts.map +1 -1
  341. package/dist/harness/tools/host-fn-tool.js +0 -16
  342. package/dist/harness/tools/host-fn-tool.js.map +1 -1
  343. package/dist/harness/tools/index.d.ts +1 -7
  344. package/dist/harness/tools/index.d.ts.map +1 -1
  345. package/dist/harness/tools/index.js +3 -14
  346. package/dist/harness/tools/index.js.map +1 -1
  347. package/dist/harness/tools/jev-browser.d.ts +4 -94
  348. package/dist/harness/tools/jev-browser.d.ts.map +1 -1
  349. package/dist/harness/tools/jev-browser.js +203 -92
  350. package/dist/harness/tools/jev-browser.js.map +1 -1
  351. package/dist/harness/tools/jev.d.ts +0 -8
  352. package/dist/harness/tools/jev.d.ts.map +1 -1
  353. package/dist/harness/tools/jev.js +0 -11
  354. package/dist/harness/tools/jev.js.map +1 -1
  355. package/dist/harness/tools/pi-tools.d.ts +0 -11
  356. package/dist/harness/tools/pi-tools.d.ts.map +1 -1
  357. package/dist/harness/tools/pi-tools.js +0 -29
  358. package/dist/harness/tools/pi-tools.js.map +1 -1
  359. package/dist/harness/tools/react.d.ts +0 -5
  360. package/dist/harness/tools/react.d.ts.map +1 -1
  361. package/dist/harness/tools/react.js +0 -5
  362. package/dist/harness/tools/react.js.map +1 -1
  363. package/dist/harness/tools/secret-redaction.d.ts +0 -25
  364. package/dist/harness/tools/secret-redaction.d.ts.map +1 -1
  365. package/dist/harness/tools/secret-redaction.js +3 -36
  366. package/dist/harness/tools/secret-redaction.js.map +1 -1
  367. package/dist/harness/tools/subagent.d.ts +0 -34
  368. package/dist/harness/tools/subagent.d.ts.map +1 -1
  369. package/dist/harness/tools/subagent.js +0 -92
  370. package/dist/harness/tools/subagent.js.map +1 -1
  371. package/dist/harness/tools/task.d.ts +0 -1
  372. package/dist/harness/tools/task.d.ts.map +1 -1
  373. package/dist/harness/tools/task.js +0 -1
  374. package/dist/harness/tools/task.js.map +1 -1
  375. package/dist/harness/tools/types.d.ts +0 -16
  376. package/dist/harness/tools/types.d.ts.map +1 -1
  377. package/dist/harness/tools/types.js.map +1 -1
  378. package/dist/harness/types.d.ts +0 -76
  379. package/dist/harness/types.d.ts.map +1 -1
  380. package/dist/harness/types.js.map +1 -1
  381. package/dist/index.d.ts.map +1 -1
  382. package/dist/index.js +0 -2
  383. package/dist/index.js.map +1 -1
  384. package/dist/log.d.ts.map +1 -1
  385. package/dist/log.js +0 -13
  386. package/dist/log.js.map +1 -1
  387. package/dist/main.js +0 -47
  388. package/dist/main.js.map +1 -1
  389. package/dist/observability/index.d.ts +0 -9
  390. package/dist/observability/index.d.ts.map +1 -1
  391. package/dist/observability/index.js +0 -9
  392. package/dist/observability/index.js.map +1 -1
  393. package/dist/observability/instrument.js +0 -5
  394. package/dist/observability/instrument.js.map +1 -1
  395. package/dist/observability/otel.js +0 -1
  396. package/dist/observability/otel.js.map +1 -1
  397. package/dist/observability/sentry.d.ts +0 -18
  398. package/dist/observability/sentry.d.ts.map +1 -1
  399. package/dist/observability/sentry.js +0 -36
  400. package/dist/observability/sentry.js.map +1 -1
  401. package/dist/observability/types.d.ts +0 -9
  402. package/dist/observability/types.d.ts.map +1 -1
  403. package/dist/observability/types.js.map +1 -1
  404. package/dist/office/index.d.ts +0 -76
  405. package/dist/office/index.d.ts.map +1 -1
  406. package/dist/office/index.js +2 -153
  407. package/dist/office/index.js.map +1 -1
  408. package/dist/office/projection.d.ts +0 -29
  409. package/dist/office/projection.d.ts.map +1 -1
  410. package/dist/office/projection.js +0 -37
  411. package/dist/office/projection.js.map +1 -1
  412. package/dist/office/types.d.ts +0 -66
  413. package/dist/office/types.d.ts.map +1 -1
  414. package/dist/office/types.js.map +1 -1
  415. package/dist/runtime/conversation-runtime.d.ts.map +1 -1
  416. package/dist/runtime/conversation-runtime.js +9 -27
  417. package/dist/runtime/conversation-runtime.js.map +1 -1
  418. package/dist/runtime/session-lifecycle.d.ts +0 -10
  419. package/dist/runtime/session-lifecycle.d.ts.map +1 -1
  420. package/dist/runtime/session-lifecycle.js +0 -12
  421. package/dist/runtime/session-lifecycle.js.map +1 -1
  422. package/dist/runtime/types.d.ts +0 -28
  423. package/dist/runtime/types.d.ts.map +1 -1
  424. package/dist/runtime/types.js.map +1 -1
  425. package/dist/sandbox/container.d.ts.map +1 -1
  426. package/dist/sandbox/container.js +0 -1
  427. package/dist/sandbox/container.js.map +1 -1
  428. package/dist/sandbox/host.d.ts.map +1 -1
  429. package/dist/sandbox/host.js +0 -2
  430. package/dist/sandbox/host.js.map +1 -1
  431. package/dist/sandbox/identity.d.ts +0 -28
  432. package/dist/sandbox/identity.d.ts.map +1 -1
  433. package/dist/sandbox/identity.js +0 -28
  434. package/dist/sandbox/identity.js.map +1 -1
  435. package/dist/sandbox/index.d.ts +0 -18
  436. package/dist/sandbox/index.d.ts.map +1 -1
  437. package/dist/sandbox/index.js +0 -18
  438. package/dist/sandbox/index.js.map +1 -1
  439. package/dist/sandbox/provisioner.d.ts +0 -61
  440. package/dist/sandbox/provisioner.d.ts.map +1 -1
  441. package/dist/sandbox/provisioner.js +3 -105
  442. package/dist/sandbox/provisioner.js.map +1 -1
  443. package/dist/sandbox/types.d.ts +0 -39
  444. package/dist/sandbox/types.d.ts.map +1 -1
  445. package/dist/sandbox/types.js.map +1 -1
  446. package/dist/sandbox/utils.d.ts +2 -5
  447. package/dist/sandbox/utils.d.ts.map +1 -1
  448. package/dist/sandbox/utils.js +31 -31
  449. package/dist/sandbox/utils.js.map +1 -1
  450. package/dist/sessions/chat-history-sync.d.ts +0 -6
  451. package/dist/sessions/chat-history-sync.d.ts.map +1 -1
  452. package/dist/sessions/chat-history-sync.js +1 -33
  453. package/dist/sessions/chat-history-sync.js.map +1 -1
  454. package/dist/sessions/history-line.d.ts +0 -20
  455. package/dist/sessions/history-line.d.ts.map +1 -1
  456. package/dist/sessions/history-line.js +0 -20
  457. package/dist/sessions/history-line.js.map +1 -1
  458. package/dist/sessions/migrate-common.d.ts +0 -15
  459. package/dist/sessions/migrate-common.d.ts.map +1 -1
  460. package/dist/sessions/migrate-common.js +0 -19
  461. package/dist/sessions/migrate-common.js.map +1 -1
  462. package/dist/sessions/migrate-pi-084.d.ts.map +1 -1
  463. package/dist/sessions/migrate-pi-084.js +0 -7
  464. package/dist/sessions/migrate-pi-084.js.map +1 -1
  465. package/dist/sessions/migrate-v3.d.ts +0 -7
  466. package/dist/sessions/migrate-v3.d.ts.map +1 -1
  467. package/dist/sessions/migrate-v3.js +1 -67
  468. package/dist/sessions/migrate-v3.js.map +1 -1
  469. package/dist/sessions/session-key.d.ts +3 -17
  470. package/dist/sessions/session-key.d.ts.map +1 -1
  471. package/dist/sessions/session-key.js +8 -35
  472. package/dist/sessions/session-key.js.map +1 -1
  473. package/dist/sessions/session-store.d.ts +0 -6
  474. package/dist/sessions/session-store.d.ts.map +1 -1
  475. package/dist/sessions/session-store.js +8 -50
  476. package/dist/sessions/session-store.js.map +1 -1
  477. package/dist/sessions/store.d.ts +0 -59
  478. package/dist/sessions/store.d.ts.map +1 -1
  479. package/dist/sessions/store.js +6 -88
  480. package/dist/sessions/store.js.map +1 -1
  481. package/dist/sessions/types.d.ts +0 -17
  482. package/dist/sessions/types.d.ts.map +1 -1
  483. package/dist/sessions/types.js.map +1 -1
  484. package/dist/settings/apply.d.ts +0 -6
  485. package/dist/settings/apply.d.ts.map +1 -1
  486. package/dist/settings/apply.js +0 -29
  487. package/dist/settings/apply.js.map +1 -1
  488. package/dist/settings/index.d.ts +0 -53
  489. package/dist/settings/index.d.ts.map +1 -1
  490. package/dist/settings/index.js +0 -77
  491. package/dist/settings/index.js.map +1 -1
  492. package/dist/settings/migrate.d.ts +0 -5
  493. package/dist/settings/migrate.d.ts.map +1 -1
  494. package/dist/settings/migrate.js +0 -17
  495. package/dist/settings/migrate.js.map +1 -1
  496. package/dist/types.d.ts +0 -159
  497. package/dist/types.d.ts.map +1 -1
  498. package/dist/types.js.map +1 -1
  499. package/dist/vault/index.d.ts +2 -36
  500. package/dist/vault/index.d.ts.map +1 -1
  501. package/dist/vault/index.js +128 -59
  502. package/dist/vault/index.js.map +1 -1
  503. package/dist/vault/types.d.ts +0 -15
  504. package/dist/vault/types.d.ts.map +1 -1
  505. package/dist/vault/types.js.map +1 -1
  506. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/adapters/commands/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/adapters/commands/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EACV,mBAAmB,EACnB,uBAAuB,EACvB,YAAY,EACZ,aAAa,EACb,YAAY,EACb,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAC3E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAC;AAElF,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,CACJ,QAAQ,EAAE,YAAY,EACtB,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CACtB;AAED,MAAM,WAAW,yBAAyB;IACxC,MAAM,CAAC,OAAO,EAAE,6BAA6B,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CACnE;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,IAAI,EAAE;QACX,QAAQ,EAAE,YAAY,CAAC;QACvB,cAAc,EAAE,MAAM,CAAC;QACvB,cAAc,EAAE,MAAM,CAAC;QACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CACvB;AAED,UAAU,oBAAoB;IAC5B,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE,uBAAuB,CAAC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1F,8BAA8B,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC;CACjE;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,SAAS,CAAC;IACrB,OAAO,CAAC,EAAE,oBAAoB,CAAC;IAC/B,OAAO,EAAE,aAAa,CAAC;IACvB,YAAY,EAAE,YAAY,CAAC;IAC3B,WAAW,CAAC,EAAE,sBAAsB,CAAC;IACrC,kBAAkB,CAAC,EAAE,yBAAyB,CAAC;IAC/C,cAAc,EAAE,kBAAkB,CAAC;IACnC,qBAAqB,EAAE,yBAAyB,CAAC;IACjD,eAAe,EAAE,mBAAmB,CAAC;IACrC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,YAAY,CAAC;IAClB,SAAS,EAAE,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAC5C,QAAQ,EAAE,YAAY,CAAC;IACvB,OAAO,EAAE,aAAa,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,QAAQ,EAAE,eAAe,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACtD;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;CACjE;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,KAAK,CAAC,EAAE,cAAc,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,EAAE,OAAO,GAAG,YAAY,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,kBAAkB,GAC1B;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,GACnB;IAAE,MAAM,EAAE,eAAe,GAAG,eAAe,GAAG,eAAe,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC7E;IAAE,MAAM,EAAE,aAAa,CAAA;CAAE,GACzB;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/adapters/commands/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type { Api, Model } from \"@earendil-works/pi-ai\";\nimport type {\n ConversationContext,\n HandleNewCommandOptions,\n MessagingBot,\n OfficeAddress,\n PlatformName,\n} from \"../index.js\";\nimport type { Workspace } from \"../../office/index.js\";\nimport type { DockerContainerManager } from \"../../sandbox/provisioner.js\";\nimport type { SandboxConfig } from \"../../sandbox/index.js\";\nimport type { SandboxResourceController } from \"../../types.js\";\nimport type { VaultManager } from \"../../vault/index.js\";\nimport type { SessionViewTokenCreateOptions } from \"../web/session-view/types.js\";\n\ninterface CommandArgSpec {\n name: string;\n description: string;\n required: boolean;\n}\n\n/**\n * Data for the Slack adapter's generic slash route (how the synthesized\n * command event is built). All flags default to false.\n */\nexport interface SlackSlashRoute {\n /** Append the slash payload's free text to the synthesized command text. */\n includeText?: boolean;\n /** Scope the event to the invoking thread (thread-scoped session key). */\n thread?: boolean;\n /** Outside DMs, mark the event `private_command` so replies stay between the bot and the user. */\n privateCommand?: boolean;\n}\n\nexport interface CommandManifestEntry {\n /** Canonical name without slash, e.g. \"login\"; `/login` and `/pi-login` are derived. */\n name: string;\n description: string;\n /** Extra accepted spellings beyond `name` (e.g. \"autoreply\"); each also gets a `pi-` form. */\n aliases?: readonly string[];\n /** Optional single free-text argument for platforms that register typed args. */\n arg?: CommandArgSpec;\n /** Accepted without a leading slash. Per CONTEXT.md, only `session`. */\n bare?: boolean;\n /**\n * Routed by conversation intake as a magic word, never by a command\n * handler. Such an entry exists for platform registration/UI only.\n */\n magicWord?: boolean;\n /** Slack slash-command name, e.g. \"/pi-login\". Absent = not a Slack slash command. */\n slackCommand?: string;\n /** Slack routing data; absent for `new`, whose Slack dispatch is bespoke. */\n slackRoute?: SlackSlashRoute;\n /** Registered as a Discord application command. */\n discord?: boolean;\n /** Listed in Telegram's command menu; `description` overrides the shared one. */\n telegramMenu?: { description?: string };\n /**\n * Registered as a native grammY command handler, bypassing conversation\n * intake (no trigger/busy policy). Other menu commands reach the runtime\n * through the catch-all message path.\n */\n telegramCommand?: boolean;\n}\n\nexport interface LinkTokenStoreLike {\n create(\n platform: PlatformName,\n platformUserId: string,\n conversationId: string,\n vaultId: string,\n providerId: string,\n ): { token: string };\n}\n\nexport interface SessionViewTokenStoreLike {\n create(options: SessionViewTokenCreateOptions): { token: string };\n}\n\nexport interface AdminTokenStoreLike {\n create(args: {\n platform: PlatformName;\n platformUserId: string;\n conversationId: string;\n platformUserName?: string;\n }): { token: string };\n}\n\ninterface CommandRuntimeBridge {\n handleNewCommand(options: HandleNewCommandOptions): Promise<void>;\n switchConversationModel(address: OfficeAddress, provider: string, model: string): boolean;\n refreshConversationEnvironment(address: OfficeAddress): boolean;\n}\n\nexport interface CommandServices {\n workspace: Workspace;\n runtime?: CommandRuntimeBridge;\n sandbox: SandboxConfig;\n vaultManager: VaultManager;\n provisioner?: DockerContainerManager;\n resourceController?: SandboxResourceController;\n linkTokenStore: LinkTokenStoreLike;\n sessionViewTokenStore: SessionViewTokenStoreLike;\n adminTokenStore: AdminTokenStoreLike;\n portalBaseUrl?: string;\n}\n\nexport interface CommandContext {\n bot: MessagingBot;\n responder: ConversationContext[\"responder\"];\n platform: PlatformName;\n address: OfficeAddress;\n platformUserId: string;\n platformUserName?: string;\n conversationId: string;\n vaultConversationId?: string;\n sessionKey: string;\n commandText: string;\n privateConversation: boolean;\n services: CommandServices;\n}\n\nexport interface CommandHandler {\n tryHandle(context: CommandContext): Promise<boolean>;\n}\n\n/** Minimal model lookup contract used by the model command. */\nexport interface ModelRegistry {\n find(provider: string, modelId: string): Model<Api> | undefined;\n}\n\n// ── command-specific parsed types ────────────────────────────────────────────\n\nexport interface ParsedModelCommand {\n provider?: string;\n /** Model id without a thinking-level suffix, when one was supplied. */\n model?: string;\n /** Complete model id candidate, including a possible colon suffix. */\n modelCandidate?: string;\n /** Suffix kept for handler-side validation after exact model lookup. */\n thinkingLevelCandidate?: string;\n thinkingLevel?: ThinkingLevel;\n error?: \"invalid_spec\";\n}\n\nexport interface ParsedSandboxCommand {\n action?: \"boost\" | \"visibility\";\n /** Raw visibility argument; the handler validates it so typos get a usage reply. */\n visibility?: string;\n}\n\nexport type ParsedLoginCommand =\n | { action: \"setup\" }\n | { action: \"shared_create\" | \"shared_update\" | \"shared_delete\"; name: string }\n | { action: \"shared_list\" }\n | { action: \"copy_shared\"; name: string };\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/adapters/commands/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type { Api, Model } from \"@earendil-works/pi-ai\";\nimport type {\n ConversationContext,\n HandleNewCommandOptions,\n MessagingBot,\n OfficeAddress,\n PlatformName,\n} from \"../index.js\";\nimport type { Workspace } from \"../../office/index.js\";\nimport type { DockerContainerManager } from \"../../sandbox/provisioner.js\";\nimport type { SandboxConfig } from \"../../sandbox/index.js\";\nimport type { SandboxResourceController } from \"../../types.js\";\nimport type { VaultManager } from \"../../vault/index.js\";\nimport type { SessionViewTokenCreateOptions } from \"../web/session-view/types.js\";\n\ninterface CommandArgSpec {\n name: string;\n description: string;\n required: boolean;\n}\n\nexport interface SlackSlashRoute {\n includeText?: boolean;\n thread?: boolean;\n privateCommand?: boolean;\n}\n\nexport interface CommandManifestEntry {\n name: string;\n description: string;\n aliases?: readonly string[];\n arg?: CommandArgSpec;\n bare?: boolean;\n magicWord?: boolean;\n slackCommand?: string;\n slackRoute?: SlackSlashRoute;\n discord?: boolean;\n telegramMenu?: { description?: string };\n telegramCommand?: boolean;\n}\n\nexport interface LinkTokenStoreLike {\n create(\n platform: PlatformName,\n platformUserId: string,\n conversationId: string,\n vaultId: string,\n providerId: string,\n ): { token: string };\n}\n\nexport interface SessionViewTokenStoreLike {\n create(options: SessionViewTokenCreateOptions): { token: string };\n}\n\nexport interface AdminTokenStoreLike {\n create(args: {\n platform: PlatformName;\n platformUserId: string;\n conversationId: string;\n platformUserName?: string;\n }): { token: string };\n}\n\ninterface CommandRuntimeBridge {\n handleNewCommand(options: HandleNewCommandOptions): Promise<void>;\n switchConversationModel(address: OfficeAddress, provider: string, model: string): boolean;\n refreshConversationEnvironment(address: OfficeAddress): boolean;\n}\n\nexport interface CommandServices {\n workspace: Workspace;\n runtime?: CommandRuntimeBridge;\n sandbox: SandboxConfig;\n vaultManager: VaultManager;\n provisioner?: DockerContainerManager;\n resourceController?: SandboxResourceController;\n linkTokenStore: LinkTokenStoreLike;\n sessionViewTokenStore: SessionViewTokenStoreLike;\n adminTokenStore: AdminTokenStoreLike;\n portalBaseUrl?: string;\n}\n\nexport interface CommandContext {\n bot: MessagingBot;\n responder: ConversationContext[\"responder\"];\n platform: PlatformName;\n address: OfficeAddress;\n platformUserId: string;\n platformUserName?: string;\n conversationId: string;\n vaultConversationId?: string;\n sessionKey: string;\n commandText: string;\n privateConversation: boolean;\n services: CommandServices;\n}\n\nexport interface CommandHandler {\n tryHandle(context: CommandContext): Promise<boolean>;\n}\n\nexport interface ModelRegistry {\n find(provider: string, modelId: string): Model<Api> | undefined;\n}\n\nexport interface ParsedModelCommand {\n provider?: string;\n model?: string;\n modelCandidate?: string;\n thinkingLevelCandidate?: string;\n thinkingLevel?: ThinkingLevel;\n error?: \"invalid_spec\";\n}\n\nexport interface ParsedSandboxCommand {\n action?: \"boost\" | \"visibility\";\n visibility?: string;\n}\n\nexport type ParsedLoginCommand =\n | { action: \"setup\" }\n | { action: \"shared_create\" | \"shared_update\" | \"shared_delete\"; name: string }\n | { action: \"shared_list\" }\n | { action: \"copy_shared\"; name: string };\n"]}
@@ -3,11 +3,8 @@ import type { CommandContext } from "./types.js";
3
3
  export declare function replyPrivatelyWithContext(context: CommandContext, text: string, options?: {
4
4
  style?: "muted" | "error";
5
5
  }): Promise<void>;
6
- /** Shared reply body for the commands that need the link portal configured. */
7
6
  export declare function portalNotConfiguredLines(feature: string): string[];
8
- /** Muted `_Title_` summary reply in the conversation the command arrived from. */
9
7
  export declare function replySummary(context: CommandContext, title: string, lines: string[]): Promise<void>;
10
- /** Same summary, routed to the user privately when the conversation is shared. */
11
8
  export declare function replySummaryPrivately(context: CommandContext, title: string, lines: string[]): Promise<void>;
12
9
  export declare function formatCommandSummary(title: string, lines: string[]): string;
13
10
  export declare function isPrivateConversation(event: ConversationEvent): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/adapters/commands/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAYjD,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,cAAc,EACvB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAA;CAAE,GACtC,OAAO,CAAC,IAAI,CAAC,CAsBf;AAED,+EAA+E;AAC/E,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAKlE;AAED,kFAAkF;AAClF,wBAAsB,YAAY,CAChC,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EAAE,GACd,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,kFAAkF;AAClF,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EAAE,GACd,OAAO,CAAC,IAAI,CAAC,CAEf;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAK3E;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAIvE"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/adapters/commands/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAYjD,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,cAAc,EACvB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAA;CAAE,GACtC,OAAO,CAAC,IAAI,CAAC,CAsBf;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAKlE;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EAAE,GACd,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EAAE,GACd,OAAO,CAAC,IAAI,CAAC,CAEf;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAK3E;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAIvE"}
@@ -18,20 +18,17 @@ export async function replyPrivatelyWithContext(context, text, options) {
18
18
  }
19
19
  await replyDiagnosticWithContext(context.responder, text, options);
20
20
  }
21
- /** Shared reply body for the commands that need the link portal configured. */
22
21
  export function portalNotConfiguredLines(feature) {
23
22
  return [
24
23
  `${feature} is not configured.`,
25
24
  "Set `MIKAN_LINK_URL` or `MIKAN_LINK_PORT` on the server.",
26
25
  ];
27
26
  }
28
- /** Muted `_Title_` summary reply in the conversation the command arrived from. */
29
27
  export async function replySummary(context, title, lines) {
30
28
  await replyDiagnosticWithContext(context.responder, formatCommandSummary(title, lines), {
31
29
  style: "muted",
32
30
  });
33
31
  }
34
- /** Same summary, routed to the user privately when the conversation is shared. */
35
32
  export async function replySummaryPrivately(context, title, lines) {
36
33
  await replyPrivatelyWithContext(context, formatCommandSummary(title, lines), { style: "muted" });
37
34
  }
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/adapters/commands/utils.ts"],"names":[],"mappings":"AAGA,KAAK,UAAU,0BAA0B,CACvC,SAAsC,EACtC,IAAY,EACZ,OAAuC;IAEvC,MAAM,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACjC,MAAM,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAClC,MAAM,SAAS,CAAC,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,OAAuB,EACvB,IAAY,EACZ,OAAuC;IAEvC,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;QAChC,MAAM,0BAA0B,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QACnE,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC;QACtC,MAAM,OAAO,CAAC,GAAG,CAAC,qBAAqB,CACrC,OAAO,CAAC,cAAc,EACtB,OAAO,CAAC,cAAc,EACtB,IAAI,EACJ,OAAO,CACR,CAAC;QACF,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;QAC5B,MAAM,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;QACpF,OAAO;IACT,CAAC;IAED,MAAM,0BAA0B,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AACrE,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,wBAAwB,CAAC,OAAe;IACtD,OAAO;QACL,GAAG,OAAO,qBAAqB;QAC/B,0DAA0D;KAC3D,CAAC;AACJ,CAAC;AAED,kFAAkF;AAClF,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAuB,EACvB,KAAa,EACb,KAAe;IAEf,MAAM,0BAA0B,CAAC,OAAO,CAAC,SAAS,EAAE,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE;QACtF,KAAK,EAAE,OAAO;KACf,CAAC,CAAC;AACL,CAAC;AAED,kFAAkF;AAClF,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,OAAuB,EACvB,KAAa,EACb,KAAe;IAEf,MAAM,yBAAyB,CAAC,OAAO,EAAE,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;AACnG,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAa,EAAE,KAAe;IACjE,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAChE,MAAM,YAAY,GAChB,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACjF,OAAO,CAAC,IAAI,KAAK,GAAG,EAAE,GAAG,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAwB;IAC5D,OAAO,CACL,KAAK,CAAC,gBAAgB,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,CAC/F,CAAC;AACJ,CAAC","sourcesContent":["import type { ConversationEvent } from \"../index.js\";\nimport type { CommandContext } from \"./types.js\";\n\nasync function replyDiagnosticWithContext(\n responder: CommandContext[\"responder\"],\n text: string,\n options?: { style?: \"muted\" | \"error\" },\n): Promise<void> {\n await responder.setTyping(false);\n await responder.setWorking(false);\n await responder.respondDiagnostic(text, options);\n}\n\nexport async function replyPrivatelyWithContext(\n context: CommandContext,\n text: string,\n options?: { style?: \"muted\" | \"error\" },\n): Promise<void> {\n if (context.privateConversation) {\n await replyDiagnosticWithContext(context.responder, text, options);\n return;\n }\n\n if (context.bot.postPrivateDiagnostic) {\n await context.bot.postPrivateDiagnostic(\n context.conversationId,\n context.platformUserId,\n text,\n options,\n );\n return;\n }\n\n if (context.bot.postPrivate) {\n await context.bot.postPrivate(context.conversationId, context.platformUserId, text);\n return;\n }\n\n await replyDiagnosticWithContext(context.responder, text, options);\n}\n\n/** Shared reply body for the commands that need the link portal configured. */\nexport function portalNotConfiguredLines(feature: string): string[] {\n return [\n `${feature} is not configured.`,\n \"Set `MIKAN_LINK_URL` or `MIKAN_LINK_PORT` on the server.\",\n ];\n}\n\n/** Muted `_Title_` summary reply in the conversation the command arrived from. */\nexport async function replySummary(\n context: CommandContext,\n title: string,\n lines: string[],\n): Promise<void> {\n await replyDiagnosticWithContext(context.responder, formatCommandSummary(title, lines), {\n style: \"muted\",\n });\n}\n\n/** Same summary, routed to the user privately when the conversation is shared. */\nexport async function replySummaryPrivately(\n context: CommandContext,\n title: string,\n lines: string[],\n): Promise<void> {\n await replyPrivatelyWithContext(context, formatCommandSummary(title, lines), { style: \"muted\" });\n}\n\nexport function formatCommandSummary(title: string, lines: string[]): string {\n const nonEmpty = lines.filter((line) => line.trim().length > 0);\n const compactLines =\n nonEmpty.length <= 2 ? nonEmpty : [nonEmpty[0], nonEmpty.slice(1).join(\" · \")];\n return [`_${title}_`, ...compactLines].join(\"\\n\");\n}\n\nexport function isPrivateConversation(event: ConversationEvent): boolean {\n return (\n event.conversationKind === \"direct\" || event.type === \"dm\" || event.type === \"private_command\"\n );\n}\n"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/adapters/commands/utils.ts"],"names":[],"mappings":"AAGA,KAAK,UAAU,0BAA0B,CACvC,SAAsC,EACtC,IAAY,EACZ,OAAuC;IAEvC,MAAM,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACjC,MAAM,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAClC,MAAM,SAAS,CAAC,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,OAAuB,EACvB,IAAY,EACZ,OAAuC;IAEvC,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;QAChC,MAAM,0BAA0B,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QACnE,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC;QACtC,MAAM,OAAO,CAAC,GAAG,CAAC,qBAAqB,CACrC,OAAO,CAAC,cAAc,EACtB,OAAO,CAAC,cAAc,EACtB,IAAI,EACJ,OAAO,CACR,CAAC;QACF,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;QAC5B,MAAM,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;QACpF,OAAO;IACT,CAAC;IAED,MAAM,0BAA0B,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,OAAe;IACtD,OAAO;QACL,GAAG,OAAO,qBAAqB;QAC/B,0DAA0D;KAC3D,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAuB,EACvB,KAAa,EACb,KAAe;IAEf,MAAM,0BAA0B,CAAC,OAAO,CAAC,SAAS,EAAE,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE;QACtF,KAAK,EAAE,OAAO;KACf,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,OAAuB,EACvB,KAAa,EACb,KAAe;IAEf,MAAM,yBAAyB,CAAC,OAAO,EAAE,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;AACnG,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAa,EAAE,KAAe;IACjE,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAChE,MAAM,YAAY,GAChB,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACjF,OAAO,CAAC,IAAI,KAAK,GAAG,EAAE,GAAG,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAwB;IAC5D,OAAO,CACL,KAAK,CAAC,gBAAgB,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,CAC/F,CAAC;AACJ,CAAC","sourcesContent":["import type { ConversationEvent } from \"../index.js\";\nimport type { CommandContext } from \"./types.js\";\n\nasync function replyDiagnosticWithContext(\n responder: CommandContext[\"responder\"],\n text: string,\n options?: { style?: \"muted\" | \"error\" },\n): Promise<void> {\n await responder.setTyping(false);\n await responder.setWorking(false);\n await responder.respondDiagnostic(text, options);\n}\n\nexport async function replyPrivatelyWithContext(\n context: CommandContext,\n text: string,\n options?: { style?: \"muted\" | \"error\" },\n): Promise<void> {\n if (context.privateConversation) {\n await replyDiagnosticWithContext(context.responder, text, options);\n return;\n }\n\n if (context.bot.postPrivateDiagnostic) {\n await context.bot.postPrivateDiagnostic(\n context.conversationId,\n context.platformUserId,\n text,\n options,\n );\n return;\n }\n\n if (context.bot.postPrivate) {\n await context.bot.postPrivate(context.conversationId, context.platformUserId, text);\n return;\n }\n\n await replyDiagnosticWithContext(context.responder, text, options);\n}\n\nexport function portalNotConfiguredLines(feature: string): string[] {\n return [\n `${feature} is not configured.`,\n \"Set `MIKAN_LINK_URL` or `MIKAN_LINK_PORT` on the server.\",\n ];\n}\n\nexport async function replySummary(\n context: CommandContext,\n title: string,\n lines: string[],\n): Promise<void> {\n await replyDiagnosticWithContext(context.responder, formatCommandSummary(title, lines), {\n style: \"muted\",\n });\n}\n\nexport async function replySummaryPrivately(\n context: CommandContext,\n title: string,\n lines: string[],\n): Promise<void> {\n await replyPrivatelyWithContext(context, formatCommandSummary(title, lines), { style: \"muted\" });\n}\n\nexport function formatCommandSummary(title: string, lines: string[]): string {\n const nonEmpty = lines.filter((line) => line.trim().length > 0);\n const compactLines =\n nonEmpty.length <= 2 ? nonEmpty : [nonEmpty[0], nonEmpty.slice(1).join(\" · \")];\n return [`_${title}_`, ...compactLines].join(\"\\n\");\n}\n\nexport function isPrivateConversation(event: ConversationEvent): boolean {\n return (\n event.conversationKind === \"direct\" || event.type === \"dm\" || event.type === \"private_command\"\n );\n}\n"]}
@@ -45,10 +45,6 @@ export declare class DiscordMessagingBot implements MessagingBot {
45
45
  }[];
46
46
  logToFile(channelId: string, entry: object): void;
47
47
  logBotResponse(channelId: string, text: string, ts: string): void;
48
- /**
49
- * Process attachments from a Discord message.
50
- * Downloads files before returning so the agent can read them immediately.
51
- */
52
48
  processAttachments(channelId: string, attachments: Collection<string, Attachment>): Promise<{
53
49
  name: string;
54
50
  localPath: string;
@@ -1 +1 @@
1
- {"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../../../src/adapters/discord/bot.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../../../src/adapters/discord/bot.ts"],"names":[],"mappings":"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"}
@@ -11,8 +11,6 @@ import { appendBotResponseLog, appendChannelLog, MessagingEventQueue, MessagingI
11
11
  import { COMMAND_MANIFEST } from "../commands/manifest.js";
12
12
  import { processMessageIntake } from "../intake.js";
13
13
  import { createDiscordAdapters } from "./context.js";
14
- // discord.js: DiscordAPIError exposes `.status` (HTTP status) and a `.code`.
15
- // RateLimitError fires when the internal queue gives up. MessagingBoth should retry.
16
14
  function discordIsRateLimited(err) {
17
15
  if (err.status === 429)
18
16
  return true;
@@ -23,9 +21,6 @@ function discordIsRateLimited(err) {
23
21
  return false;
24
22
  }
25
23
  const discordRetry = (fn) => withRetry(fn, { isRateLimited: discordIsRateLimited });
26
- // ============================================================================
27
- // DiscordMessagingBot
28
- // ============================================================================
29
24
  export class DiscordMessagingBot {
30
25
  constructor(handler, config) {
31
26
  this.botUserId = null;
@@ -48,9 +43,6 @@ export class DiscordMessagingBot {
48
43
  partials: [Partials.Channel, Partials.Message],
49
44
  });
50
45
  }
51
- // ==========================================================================
52
- // Public API (implements MessagingBot)
53
- // ==========================================================================
54
46
  async start() {
55
47
  this.stopped = false;
56
48
  await new Promise((resolve, reject) => {
@@ -66,8 +58,6 @@ export class DiscordMessagingBot {
66
58
  this.loadCachedGuildData();
67
59
  this.setupEventHandlers();
68
60
  try {
69
- // Registration derives from the command manifest; routing below
70
- // handles new/stop natively and the rest through one generic path.
71
61
  await readyClient.application.commands.set(COMMAND_MANIFEST.filter((entry) => entry.discord).map((entry) => Object.assign({
72
62
  name: entry.name,
73
63
  description: entry.description,
@@ -114,9 +104,6 @@ export class DiscordMessagingBot {
114
104
  await this.updateMessageRaw(channel, ts, text);
115
105
  }
116
106
  async addReaction(channel, messageTs, emoji) {
117
- // Discord's reaction API takes a Unicode character (or a custom emoji
118
- // id); the `react` tool and prompt speak Slack-style short names, so
119
- // translate here rather than push that mapping onto every caller.
120
107
  await discordRetry(async () => {
121
108
  const ch = await this.fetchTextChannel(channel);
122
109
  const msg = await ch.messages.fetch(messageTs);
@@ -126,7 +113,7 @@ export class DiscordMessagingBot {
126
113
  enqueueEvent(event) {
127
114
  if (this.stopped)
128
115
  return false;
129
- const conversationId = event.conversationId;
116
+ const conversationId = event.address.conversationId;
130
117
  const queue = this.getQueue(conversationId);
131
118
  if (queue.size() >= 5) {
132
119
  log.logWarning(`Event queue full for ${conversationId}, discarding: ${event.text.substring(0, 50)}`);
@@ -150,9 +137,6 @@ export class DiscordMessagingBot {
150
137
  },
151
138
  };
152
139
  }
153
- // ==========================================================================
154
- // Internal helpers (used by context.ts)
155
- // ==========================================================================
156
140
  async updateMessageRaw(channelId, messageId, text) {
157
141
  return discordRetry(async () => {
158
142
  const ch = await this.fetchTextChannel(channelId);
@@ -169,7 +153,6 @@ export class DiscordMessagingBot {
169
153
  });
170
154
  }
171
155
  async postInThread(channelId, threadOrMessageId, text) {
172
- // Try as a thread channel first, then fall back to posting in the channel
173
156
  try {
174
157
  const thread = await this.client.channels.fetch(threadOrMessageId);
175
158
  if (thread && (thread.isThread() || thread.isTextBased())) {
@@ -179,9 +162,7 @@ export class DiscordMessagingBot {
179
162
  });
180
163
  }
181
164
  }
182
- catch {
183
- // Not a thread channel, treat as message ID for reply
184
- }
165
+ catch { }
185
166
  return this.postReply(channelId, threadOrMessageId, text);
186
167
  }
187
168
  async deleteMessageRaw(channelId, messageId) {
@@ -190,18 +171,14 @@ export class DiscordMessagingBot {
190
171
  const msg = await ch.messages.fetch(messageId);
191
172
  await msg.delete();
192
173
  }
193
- catch {
194
- // Ignore if already deleted
195
- }
174
+ catch { }
196
175
  }
197
176
  async sendTyping(channelId) {
198
177
  try {
199
178
  const ch = await this.fetchTextChannel(channelId);
200
179
  await ch.sendTyping();
201
180
  }
202
- catch {
203
- // Non-fatal
204
- }
181
+ catch { }
205
182
  }
206
183
  async uploadFile(channelId, filePath, title) {
207
184
  return discordRetry(async () => {
@@ -233,10 +210,6 @@ export class DiscordMessagingBot {
233
210
  logBotResponse(channelId, text, ts) {
234
211
  appendBotResponseLog(this.workspace.office(createOfficeAddress("discord", channelId)), text, ts);
235
212
  }
236
- /**
237
- * Process attachments from a Discord message.
238
- * Downloads files before returning so the agent can read them immediately.
239
- */
240
213
  async processAttachments(channelId, attachments) {
241
214
  const items = [];
242
215
  for (const attachment of attachments.values()) {
@@ -256,9 +229,6 @@ export class DiscordMessagingBot {
256
229
  }
257
230
  return saved.map((item) => ({ name: item.original, localPath: item.localPath }));
258
231
  }
259
- // ==========================================================================
260
- // Private - Event Handlers
261
- // ==========================================================================
262
232
  getQueue(channelId) {
263
233
  let queue = this.queues.get(channelId);
264
234
  if (!queue) {
@@ -420,8 +390,6 @@ export class DiscordMessagingBot {
420
390
  });
421
391
  const context = this.createSlashCommandAdapters(interaction, commandText, sessionKey, conversationId);
422
392
  try {
423
- // Magic words are conversation-intake controls, not command handlers;
424
- // the manifest's metadata routes them (today only `stop`).
425
393
  if (manifestEntry.magicWord) {
426
394
  const stopTarget = this.resolveStopTarget(conversationId, sessionKey);
427
395
  if (stopTarget) {
@@ -458,13 +426,11 @@ export class DiscordMessagingBot {
458
426
  }
459
427
  }
460
428
  async handleMessageCreate(msg) {
461
- // Skip messages from before startup
462
429
  if (msg.createdTimestamp < this.startupTime)
463
430
  return;
464
- // Skip bot messages
465
431
  if (msg.author.bot)
466
432
  return;
467
- const isDM = msg.channel.type === 1; // ChannelType.DM = 1
433
+ const isDM = msg.channel.type === 1;
468
434
  const isInThread = msg.channel.isThread();
469
435
  const referencedMsgId = msg.reference?.messageId;
470
436
  const isThreadReply = isInThread || !!referencedMsgId;
@@ -480,13 +446,11 @@ export class DiscordMessagingBot {
480
446
  const userId = msg.author.id;
481
447
  const userName = msg.author.username;
482
448
  const msgId = msg.id;
483
- // Track user
484
449
  this.users.set(userId, {
485
450
  id: userId,
486
451
  userName,
487
452
  displayName: msg.member?.displayName ?? userName,
488
453
  });
489
- // Track channel
490
454
  if (!this.channels.has(conversationId) && "name" in msg.channel) {
491
455
  const ch = msg.channel;
492
456
  this.channels.set(conversationId, { id: conversationId, name: ch.name });
@@ -1 +1 @@
1
- {"version":3,"file":"bot.js","sourceRoot":"","sources":["../../../src/adapters/discord/bot.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ApplicationCommandOptionType,\n Client,\n Events,\n GatewayIntentBits,\n Partials,\n type ChatInputCommandInteraction,\n type Collection,\n type Interaction,\n type Message,\n type Attachment,\n type TextChannel,\n type DMChannel,\n type NewsChannel,\n type ThreadChannel,\n} from \"discord.js\";\nimport { readFileSync } from \"node:fs\";\nimport { basename } from \"node:path\";\n\nimport type {\n ConversationContext,\n ConversationEvent,\n MessagingEventHandler,\n ConversationResponder,\n ChatToolResult,\n} from \"../index.js\";\nimport { discordTextPayload } from \"./components.js\";\nimport {\n createConversationEvent,\n createConversationMessage,\n type MessagingBot,\n type MessagingInfo,\n} from \"../index.js\";\nimport type { DiscordEvent } from \"./types.js\";\nimport * as log from \"../../log.js\";\nimport { createOfficeAddress, type Workspace } from \"../../office/index.js\";\nimport { resolveChatSessionKey } from \"../../sessions/session-key.js\";\nimport { formatNothingRunning } from \"../messages.js\";\nimport {\n appendBotResponseLog,\n appendChannelLog,\n MessagingEventQueue,\n MessagingIntakeTracker,\n downloadUrlToFile,\n resolveOnlyScopedStopTarget,\n resolveStopTarget,\n saveIncomingAttachments,\n shortNameToUnicodeEmoji,\n withRetry,\n type IncomingAttachment,\n} from \"../shared.js\";\nimport { COMMAND_MANIFEST } from \"../commands/manifest.js\";\nimport { processMessageIntake } from \"../intake.js\";\nimport { createDiscordAdapters } from \"./context.js\";\n\n// discord.js: DiscordAPIError exposes `.status` (HTTP status) and a `.code`.\n// RateLimitError fires when the internal queue gives up. MessagingBoth should retry.\nfunction discordIsRateLimited(err: Error): boolean {\n if ((err as { status?: number }).status === 429) return true;\n if ((err as { httpStatus?: number }).httpStatus === 429) return true;\n if (err.name === \"RateLimitError\") return true;\n return false;\n}\n\nconst discordRetry = <T>(fn: () => Promise<T>): Promise<T> =>\n withRetry(fn, { isRateLimited: discordIsRateLimited });\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type { DiscordEvent } from \"./types.js\";\n\n// ============================================================================\n// DiscordMessagingBot\n// ============================================================================\n\nexport class DiscordMessagingBot implements MessagingBot {\n private client: Client;\n private handler: MessagingEventHandler;\n private token: string;\n private workspace: Workspace;\n private botUserId: string | null = null;\n private stopped = false;\n private queues = new Map<string, MessagingEventQueue>();\n private intake = new MessagingIntakeTracker(\"Discord\");\n private startupTime: number = 0;\n private channels = new Map<string, { id: string; name: string }>();\n private users = new Map<string, { id: string; userName: string; displayName: string }>();\n\n constructor(handler: MessagingEventHandler, config: { token: string; workspace: Workspace }) {\n this.handler = handler;\n this.token = config.token;\n this.workspace = config.workspace;\n this.client = new Client({\n intents: [\n GatewayIntentBits.Guilds,\n GatewayIntentBits.GuildMessages,\n GatewayIntentBits.MessageContent,\n GatewayIntentBits.DirectMessages,\n ],\n partials: [Partials.Channel, Partials.Message],\n });\n }\n\n // ==========================================================================\n // Public API (implements MessagingBot)\n // ==========================================================================\n\n async start(): Promise<void> {\n this.stopped = false;\n await new Promise<void>((resolve, reject) => {\n this.client.once(Events.ClientReady, async (readyClient) => {\n if (this.stopped) {\n resolve();\n return;\n }\n this.botUserId = readyClient.user.id;\n this.startupTime = Date.now();\n log.logConnected(\"Discord\");\n log.logInfo(`Discord bot started as ${readyClient.user.tag}`);\n this.loadCachedGuildData();\n this.setupEventHandlers();\n try {\n // Registration derives from the command manifest; routing below\n // handles new/stop natively and the rest through one generic path.\n await readyClient.application.commands.set(\n COMMAND_MANIFEST.filter((entry) => entry.discord).map((entry) =>\n Object.assign(\n {\n name: entry.name,\n description: entry.description,\n },\n entry.arg\n ? {\n options: [\n {\n name: entry.arg.name,\n description: entry.arg.description,\n type: ApplicationCommandOptionType.String as const,\n required: entry.arg.required,\n },\n ],\n }\n : {},\n ),\n ),\n );\n } catch (err) {\n log.logWarning(\n \"Failed to register Discord slash commands\",\n err instanceof Error ? err.message : String(err),\n );\n }\n resolve();\n });\n this.client.once(Events.Error, reject);\n this.client.login(this.token).catch(reject);\n });\n }\n\n async stop(): Promise<void> {\n this.stopped = true;\n try {\n this.client.destroy();\n } finally {\n await this.intake.close();\n await Promise.all([...this.queues.values()].map((queue) => queue.close()));\n }\n }\n\n async postMessage(channel: string, text: string): Promise<string> {\n return discordRetry(async () => {\n const ch = await this.fetchTextChannel(channel);\n const msg = await ch.send(discordTextPayload(text));\n return msg.id;\n });\n }\n\n async updateMessage(channel: string, ts: string, text: string): Promise<void> {\n await this.updateMessageRaw(channel, ts, text);\n }\n\n async addReaction(channel: string, messageTs: string, emoji: string): Promise<void> {\n // Discord's reaction API takes a Unicode character (or a custom emoji\n // id); the `react` tool and prompt speak Slack-style short names, so\n // translate here rather than push that mapping onto every caller.\n await discordRetry(async () => {\n const ch = await this.fetchTextChannel(channel);\n const msg = await ch.messages.fetch(messageTs);\n await msg.react(shortNameToUnicodeEmoji(emoji));\n });\n }\n\n enqueueEvent(event: ConversationEvent): boolean {\n if (this.stopped) return false;\n const conversationId = event.conversationId;\n const queue = this.getQueue(conversationId);\n if (queue.size() >= 5) {\n log.logWarning(\n `Event queue full for ${conversationId}, discarding: ${event.text.substring(0, 50)}`,\n );\n return false;\n }\n log.logInfo(`Enqueueing event for ${conversationId}: ${event.text.substring(0, 50)}`);\n return queue.enqueue(() => {\n const context = createDiscordAdapters(event as DiscordEvent, this);\n return this.handler.handleEvent(event, this, context);\n });\n }\n\n getMessagingInfo(): MessagingInfo {\n return {\n name: \"discord\",\n trustModel: \"membership\",\n formattingGuide:\n \"## Discord Formatting (Markdown)\\nBold: **text**, Italic: *text*, Code: `code`, Block: ```language\\ncode```\\nLinks: [text](url), Spoiler: ||text||, Headings: # ## ###\\nWrite ordinary Markdown, including tables — the adapter converts anything Discord cannot render. Use code blocks for code.\",\n channels: this.getAllChannels(),\n users: this.getAllUsers(),\n diagnostics: {\n showUsageSummary: false,\n },\n };\n }\n\n // ==========================================================================\n // Internal helpers (used by context.ts)\n // ==========================================================================\n\n async updateMessageRaw(channelId: string, messageId: string, text: string): Promise<void> {\n return discordRetry(async () => {\n const ch = await this.fetchTextChannel(channelId);\n const msg = await ch.messages.fetch(messageId);\n await msg.edit(discordTextPayload(text));\n });\n }\n\n async postReply(channelId: string, replyToId: string, text: string): Promise<string> {\n return discordRetry(async () => {\n const ch = await this.fetchTextChannel(channelId);\n const replyTarget = await ch.messages.fetch(replyToId);\n const sent = await replyTarget.reply(discordTextPayload(text));\n return sent.id;\n });\n }\n\n async postInThread(channelId: string, threadOrMessageId: string, text: string): Promise<string> {\n // Try as a thread channel first, then fall back to posting in the channel\n try {\n const thread = await this.client.channels.fetch(threadOrMessageId);\n if (thread && (thread.isThread() || thread.isTextBased())) {\n return discordRetry(async () => {\n const msg = await (thread as ThreadChannel).send(discordTextPayload(text));\n return msg.id;\n });\n }\n } catch {\n // Not a thread channel, treat as message ID for reply\n }\n return this.postReply(channelId, threadOrMessageId, text);\n }\n\n async deleteMessageRaw(channelId: string, messageId: string): Promise<void> {\n try {\n const ch = await this.fetchTextChannel(channelId);\n const msg = await ch.messages.fetch(messageId);\n await msg.delete();\n } catch {\n // Ignore if already deleted\n }\n }\n\n async sendTyping(channelId: string): Promise<void> {\n try {\n const ch = await this.fetchTextChannel(channelId);\n await ch.sendTyping();\n } catch {\n // Non-fatal\n }\n }\n\n async uploadFile(channelId: string, filePath: string, title?: string): Promise<void> {\n return discordRetry(async () => {\n const ch = await this.fetchTextChannel(channelId);\n const fileName = title ?? basename(filePath);\n const fileContent = readFileSync(filePath);\n await ch.send({ files: [{ attachment: fileContent, name: fileName }] });\n });\n }\n\n async sendDirectMessage(userId: string, text: string): Promise<string> {\n return discordRetry(async () => {\n const user = await this.client.users.fetch(userId);\n const msg = await user.send(discordTextPayload(text));\n return msg.id;\n });\n }\n\n async postPrivate(_conversationId: string, userId: string, text: string): Promise<void> {\n await this.sendDirectMessage(userId, text);\n }\n\n getAllChannels(): { id: string; name: string }[] {\n return Array.from(this.channels.values());\n }\n\n getAllUsers(): { id: string; userName: string; displayName: string }[] {\n return Array.from(this.users.values());\n }\n\n logToFile(channelId: string, entry: object): void {\n appendChannelLog(this.workspace.office(createOfficeAddress(\"discord\", channelId)), entry);\n }\n\n logBotResponse(channelId: string, text: string, ts: string): void {\n appendBotResponseLog(\n this.workspace.office(createOfficeAddress(\"discord\", channelId)),\n text,\n ts,\n );\n }\n\n /**\n * Process attachments from a Discord message.\n * Downloads files before returning so the agent can read them immediately.\n */\n async processAttachments(\n channelId: string,\n attachments: Collection<string, Attachment>,\n ): Promise<{ name: string; localPath: string }[]> {\n const items: IncomingAttachment[] = [];\n for (const attachment of attachments.values()) {\n if (!attachment.name) {\n log.logWarning(\"Discord attachment missing name, skipping\", attachment.url);\n continue;\n }\n items.push({\n name: attachment.name,\n download: (destPath) => downloadUrlToFile(attachment.url, destPath),\n });\n }\n\n const office = this.workspace.office(createOfficeAddress(\"discord\", channelId));\n const { saved, failed } = await saveIncomingAttachments(office, items);\n for (const failure of failed) {\n log.logWarning(`Failed to download Discord attachment`, `${failure.name}: ${failure.error}`);\n }\n return saved.map((item) => ({ name: item.original, localPath: item.localPath }));\n }\n\n // ==========================================================================\n // Private - Event Handlers\n // ==========================================================================\n\n private getQueue(channelId: string): MessagingEventQueue {\n let queue = this.queues.get(channelId);\n if (!queue) {\n queue = new MessagingEventQueue(\"Discord\");\n this.queues.set(channelId, queue);\n }\n return queue;\n }\n\n private resolveStopTarget(channelId: string, sessionKey: string): string | null {\n const address = createOfficeAddress(\"discord\", channelId);\n const directTarget = resolveStopTarget({ handler: this.handler, address, sessionKey });\n if (directTarget) return directTarget;\n if (sessionKey !== channelId) return null;\n return resolveOnlyScopedStopTarget(this.handler, address);\n }\n\n private loadCachedGuildData(): void {\n for (const guild of this.client.guilds.cache.values()) {\n for (const channel of guild.channels.cache.values()) {\n if (channel.isTextBased() && \"name\" in channel) {\n this.channels.set(channel.id, { id: channel.id, name: channel.name ?? channel.id });\n }\n }\n for (const member of guild.members.cache.values()) {\n this.users.set(member.id, {\n id: member.id,\n userName: member.user.username,\n displayName: member.displayName,\n });\n }\n }\n }\n\n private stripMessagingBotMention(text: string): string {\n if (!this.botUserId) return text;\n return text.replace(new RegExp(`<@!?${this.botUserId}>`, \"g\"), \"\").trim();\n }\n\n private resolveConversationContext(input: {\n channelId: string;\n inGuild: boolean;\n isThread: boolean;\n parentChannelId?: string | null;\n referencedMsgId?: string;\n }): { conversationId: string; threadTs?: string } {\n if (!input.inGuild) {\n return {\n conversationId: input.channelId,\n threadTs: input.referencedMsgId,\n };\n }\n\n if (input.isThread) {\n return {\n conversationId: input.parentChannelId ?? input.channelId,\n threadTs: input.channelId,\n };\n }\n\n return {\n conversationId: input.channelId,\n threadTs: input.referencedMsgId,\n };\n }\n\n private createSlashCommandAdapters(\n interaction: ChatInputCommandInteraction,\n commandText: string,\n sessionKey: string,\n conversationId: string,\n ): ConversationContext {\n const isDM = !interaction.inGuild();\n const userId = interaction.user.id;\n const userName = interaction.user.username;\n const platform = this.getMessagingInfo();\n const shouldUseEphemeral = !isDM;\n\n const message = createConversationMessage({\n platform: \"discord\",\n conversationId,\n id: interaction.id,\n sessionKey,\n conversationKind: isDM ? \"direct\" : \"shared\",\n userId,\n userName,\n text: commandText,\n attachments: [],\n });\n\n const respondPrivately = async (text: string, replace = false): Promise<void> => {\n if (interaction.replied || interaction.deferred) {\n if (replace) {\n await interaction.editReply({ content: text });\n } else {\n await interaction.followUp({ content: text, ephemeral: shouldUseEphemeral });\n }\n return;\n }\n\n await interaction.reply({ content: text, ephemeral: shouldUseEphemeral });\n };\n\n const responder: ConversationResponder = {\n respond: async (text: string) => {\n await respondPrivately(text);\n },\n replaceResponse: async (text: string) => {\n await respondPrivately(text, true);\n },\n respondDiagnostic: async (text: string) => {\n await respondPrivately(text);\n },\n respondToolResult: async (result: ChatToolResult) => {\n const duration = (result.durationMs / 1000).toFixed(1);\n const formatted = `${result.isError ? \"Error\" : \"Done\"} ${result.toolName} (${duration}s)\\n${result.result}`;\n await respondPrivately(formatted);\n },\n setTyping: async () => {},\n setWorking: async (working: boolean) => {\n if (working && !interaction.replied && !interaction.deferred) {\n await interaction.deferReply({ ephemeral: shouldUseEphemeral });\n }\n },\n uploadFile: async (filePath: string, title?: string) => {\n await this.uploadFile(conversationId, filePath, title);\n },\n deleteResponse: async () => {},\n };\n\n return { address: message.address, message, responder, platform };\n }\n\n private setupEventHandlers(): void {\n this.client.on(Events.InteractionCreate, (interaction) => {\n void this.intake.run(() => this.handleInteractionCreate(interaction));\n });\n this.client.on(Events.MessageCreate, (message) => {\n void this.intake.run(() => this.handleMessageCreate(message));\n });\n }\n\n private async handleInteractionCreate(interaction: Interaction): Promise<void> {\n if (!interaction.isChatInputCommand()) return;\n const manifestEntry = COMMAND_MANIFEST.find(\n (entry) => entry.discord && entry.name === interaction.commandName,\n );\n if (!manifestEntry) return;\n\n const isDM = !interaction.inGuild();\n const { conversationId, threadTs } = this.resolveConversationContext({\n channelId: interaction.channelId,\n inGuild: interaction.inGuild(),\n isThread: interaction.channel?.isThread() ?? false,\n parentChannelId:\n interaction.channel && \"parentId\" in interaction.channel\n ? interaction.channel.parentId\n : null,\n });\n const sessionKey = resolveChatSessionKey({\n conversationId,\n conversationKind: isDM ? \"direct\" : \"shared\",\n messageId: interaction.id,\n persistentTopLevel: true,\n threadTs,\n });\n const commandArg = manifestEntry.arg\n ? interaction.options.getString(manifestEntry.arg.name)?.trim()\n : undefined;\n const commandText = commandArg\n ? `/${interaction.commandName} ${commandArg}`\n : `/${interaction.commandName}`;\n\n this.logToFile(conversationId, {\n date: new Date(interaction.createdTimestamp).toISOString(),\n ts: interaction.id,\n ...(threadTs ? { threadTs } : {}),\n user: interaction.user.id,\n userName: interaction.user.username,\n text: commandText,\n attachments: [],\n isMessagingBot: false,\n });\n\n const context = this.createSlashCommandAdapters(\n interaction,\n commandText,\n sessionKey,\n conversationId,\n );\n try {\n // Magic words are conversation-intake controls, not command handlers;\n // the manifest's metadata routes them (today only `stop`).\n if (manifestEntry.magicWord) {\n const stopTarget = this.resolveStopTarget(conversationId, sessionKey);\n if (stopTarget) {\n await this.handler.handleStop(\n createOfficeAddress(\"discord\", conversationId),\n stopTarget,\n this,\n );\n await context.responder.respond(\"Stopped the current conversation.\");\n } else {\n await context.responder.respond(formatNothingRunning(\"discord\"));\n }\n return;\n }\n\n const event = createConversationEvent({\n platform: \"discord\",\n type: \"dm\",\n conversationId,\n conversationKind: isDM ? \"direct\" : \"shared\",\n ts: interaction.id,\n thread_ts: threadTs,\n sessionKey,\n user: interaction.user.id,\n text: commandText,\n attachments: [],\n });\n\n await this.handler.handleEvent(event, this, context);\n } catch (err) {\n log.logWarning(\n \"Discord slash command error\",\n err instanceof Error ? err.message : String(err),\n );\n if (!interaction.replied && !interaction.deferred) {\n await interaction.reply({\n content: `${interaction.commandName} command failed. Please try again later.`,\n ephemeral: !isDM,\n });\n }\n }\n }\n\n private async handleMessageCreate(msg: Message): Promise<void> {\n // Skip messages from before startup\n if (msg.createdTimestamp < this.startupTime) return;\n // Skip bot messages\n if (msg.author.bot) return;\n const isDM = msg.channel.type === 1; // ChannelType.DM = 1\n const isInThread = msg.channel.isThread();\n const referencedMsgId = msg.reference?.messageId;\n const isThreadReply = isInThread || !!referencedMsgId;\n const isMentioned = msg.mentions.users.has(this.botUserId ?? \"\");\n const addressed = isDM || isMentioned || isThreadReply;\n\n const { conversationId, threadTs } = this.resolveConversationContext({\n channelId: msg.channelId,\n inGuild: !isDM,\n isThread: isInThread,\n parentChannelId: \"parentId\" in msg.channel ? msg.channel.parentId : null,\n referencedMsgId,\n });\n const userId = msg.author.id;\n const userName = msg.author.username;\n const msgId = msg.id;\n\n // Track user\n this.users.set(userId, {\n id: userId,\n userName,\n displayName: msg.member?.displayName ?? userName,\n });\n\n // Track channel\n if (!this.channels.has(conversationId) && \"name\" in msg.channel) {\n const ch = msg.channel as TextChannel | NewsChannel;\n this.channels.set(conversationId, { id: conversationId, name: ch.name });\n }\n\n const conversationKind = isDM ? \"direct\" : \"shared\";\n const sessionKey = resolveChatSessionKey({\n conversationId,\n conversationKind,\n messageId: msgId,\n persistentTopLevel: true,\n threadTs,\n });\n\n const cleanedText = this.stripMessagingBotMention(msg.content);\n\n const eventBase = createConversationEvent({\n platform: \"discord\",\n type: isDM ? \"dm\" : \"mention\",\n conversationId,\n conversationKind,\n ts: msgId,\n thread_ts: threadTs,\n sessionKey,\n user: userId,\n userName,\n text: cleanedText,\n }) as DiscordEvent;\n\n await processMessageIntake({\n eventBase,\n addressed,\n magicWord: { addressed, scopeFallback: \"top-level\" },\n busyPolicy: \"queue\",\n logEntryBase: {\n date: msg.createdAt.toISOString(),\n ts: msgId,\n ...(!isDM && threadTs ? { threadTs } : {}),\n user: userId,\n userName,\n text: cleanedText,\n isMessagingBot: false,\n },\n log: (entry) => this.logToFile(conversationId, entry),\n processAttachments: () => this.processAttachments(conversationId, msg.attachments),\n queueKey: sessionKey,\n enqueue: (queueKey, work) => this.getQueue(queueKey).enqueue(work),\n handler: this.handler,\n bot: this,\n createContext: (event) => createDiscordAdapters(event, this),\n });\n }\n\n private async fetchTextChannel(\n channelId: string,\n ): Promise<TextChannel | DMChannel | NewsChannel | ThreadChannel> {\n const ch = await this.client.channels.fetch(channelId);\n if (!ch || !ch.isTextBased()) {\n throw new Error(`Channel ${channelId} is not a text channel`);\n }\n return ch as TextChannel | DMChannel | NewsChannel | ThreadChannel;\n }\n}\n"]}
1
+ {"version":3,"file":"bot.js","sourceRoot":"","sources":["../../../src/adapters/discord/bot.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ApplicationCommandOptionType,\n Client,\n Events,\n GatewayIntentBits,\n Partials,\n type ChatInputCommandInteraction,\n type Collection,\n type Interaction,\n type Message,\n type Attachment,\n type TextChannel,\n type DMChannel,\n type NewsChannel,\n type ThreadChannel,\n} from \"discord.js\";\nimport { readFileSync } from \"node:fs\";\nimport { basename } from \"node:path\";\n\nimport type {\n ConversationContext,\n ConversationEvent,\n MessagingEventHandler,\n ConversationResponder,\n ChatToolResult,\n} from \"../index.js\";\nimport { discordTextPayload } from \"./components.js\";\nimport {\n createConversationEvent,\n createConversationMessage,\n type MessagingBot,\n type MessagingInfo,\n} from \"../index.js\";\nimport type { DiscordEvent } from \"./types.js\";\nimport * as log from \"../../log.js\";\nimport { createOfficeAddress, type Workspace } from \"../../office/index.js\";\nimport { resolveChatSessionKey } from \"../../sessions/session-key.js\";\nimport { formatNothingRunning } from \"../messages.js\";\nimport {\n appendBotResponseLog,\n appendChannelLog,\n MessagingEventQueue,\n MessagingIntakeTracker,\n downloadUrlToFile,\n resolveOnlyScopedStopTarget,\n resolveStopTarget,\n saveIncomingAttachments,\n shortNameToUnicodeEmoji,\n withRetry,\n type IncomingAttachment,\n} from \"../shared.js\";\nimport { COMMAND_MANIFEST } from \"../commands/manifest.js\";\nimport { processMessageIntake } from \"../intake.js\";\nimport { createDiscordAdapters } from \"./context.js\";\n\nfunction discordIsRateLimited(err: Error): boolean {\n if ((err as { status?: number }).status === 429) return true;\n if ((err as { httpStatus?: number }).httpStatus === 429) return true;\n if (err.name === \"RateLimitError\") return true;\n return false;\n}\n\nconst discordRetry = <T>(fn: () => Promise<T>): Promise<T> =>\n withRetry(fn, { isRateLimited: discordIsRateLimited });\n\nexport type { DiscordEvent } from \"./types.js\";\n\nexport class DiscordMessagingBot implements MessagingBot {\n private client: Client;\n private handler: MessagingEventHandler;\n private token: string;\n private workspace: Workspace;\n private botUserId: string | null = null;\n private stopped = false;\n private queues = new Map<string, MessagingEventQueue>();\n private intake = new MessagingIntakeTracker(\"Discord\");\n private startupTime: number = 0;\n private channels = new Map<string, { id: string; name: string }>();\n private users = new Map<string, { id: string; userName: string; displayName: string }>();\n\n constructor(handler: MessagingEventHandler, config: { token: string; workspace: Workspace }) {\n this.handler = handler;\n this.token = config.token;\n this.workspace = config.workspace;\n this.client = new Client({\n intents: [\n GatewayIntentBits.Guilds,\n GatewayIntentBits.GuildMessages,\n GatewayIntentBits.MessageContent,\n GatewayIntentBits.DirectMessages,\n ],\n partials: [Partials.Channel, Partials.Message],\n });\n }\n\n async start(): Promise<void> {\n this.stopped = false;\n await new Promise<void>((resolve, reject) => {\n this.client.once(Events.ClientReady, async (readyClient) => {\n if (this.stopped) {\n resolve();\n return;\n }\n this.botUserId = readyClient.user.id;\n this.startupTime = Date.now();\n log.logConnected(\"Discord\");\n log.logInfo(`Discord bot started as ${readyClient.user.tag}`);\n this.loadCachedGuildData();\n this.setupEventHandlers();\n try {\n await readyClient.application.commands.set(\n COMMAND_MANIFEST.filter((entry) => entry.discord).map((entry) =>\n Object.assign(\n {\n name: entry.name,\n description: entry.description,\n },\n entry.arg\n ? {\n options: [\n {\n name: entry.arg.name,\n description: entry.arg.description,\n type: ApplicationCommandOptionType.String as const,\n required: entry.arg.required,\n },\n ],\n }\n : {},\n ),\n ),\n );\n } catch (err) {\n log.logWarning(\n \"Failed to register Discord slash commands\",\n err instanceof Error ? err.message : String(err),\n );\n }\n resolve();\n });\n this.client.once(Events.Error, reject);\n this.client.login(this.token).catch(reject);\n });\n }\n\n async stop(): Promise<void> {\n this.stopped = true;\n try {\n this.client.destroy();\n } finally {\n await this.intake.close();\n await Promise.all([...this.queues.values()].map((queue) => queue.close()));\n }\n }\n\n async postMessage(channel: string, text: string): Promise<string> {\n return discordRetry(async () => {\n const ch = await this.fetchTextChannel(channel);\n const msg = await ch.send(discordTextPayload(text));\n return msg.id;\n });\n }\n\n async updateMessage(channel: string, ts: string, text: string): Promise<void> {\n await this.updateMessageRaw(channel, ts, text);\n }\n\n async addReaction(channel: string, messageTs: string, emoji: string): Promise<void> {\n await discordRetry(async () => {\n const ch = await this.fetchTextChannel(channel);\n const msg = await ch.messages.fetch(messageTs);\n await msg.react(shortNameToUnicodeEmoji(emoji));\n });\n }\n\n enqueueEvent(event: ConversationEvent): boolean {\n if (this.stopped) return false;\n const conversationId = event.address.conversationId;\n const queue = this.getQueue(conversationId);\n if (queue.size() >= 5) {\n log.logWarning(\n `Event queue full for ${conversationId}, discarding: ${event.text.substring(0, 50)}`,\n );\n return false;\n }\n log.logInfo(`Enqueueing event for ${conversationId}: ${event.text.substring(0, 50)}`);\n return queue.enqueue(() => {\n const context = createDiscordAdapters(event as DiscordEvent, this);\n return this.handler.handleEvent(event, this, context);\n });\n }\n\n getMessagingInfo(): MessagingInfo {\n return {\n name: \"discord\",\n trustModel: \"membership\",\n formattingGuide:\n \"## Discord Formatting (Markdown)\\nBold: **text**, Italic: *text*, Code: `code`, Block: ```language\\ncode```\\nLinks: [text](url), Spoiler: ||text||, Headings: # ## ###\\nWrite ordinary Markdown, including tables — the adapter converts anything Discord cannot render. Use code blocks for code.\",\n channels: this.getAllChannels(),\n users: this.getAllUsers(),\n diagnostics: {\n showUsageSummary: false,\n },\n };\n }\n\n async updateMessageRaw(channelId: string, messageId: string, text: string): Promise<void> {\n return discordRetry(async () => {\n const ch = await this.fetchTextChannel(channelId);\n const msg = await ch.messages.fetch(messageId);\n await msg.edit(discordTextPayload(text));\n });\n }\n\n async postReply(channelId: string, replyToId: string, text: string): Promise<string> {\n return discordRetry(async () => {\n const ch = await this.fetchTextChannel(channelId);\n const replyTarget = await ch.messages.fetch(replyToId);\n const sent = await replyTarget.reply(discordTextPayload(text));\n return sent.id;\n });\n }\n\n async postInThread(channelId: string, threadOrMessageId: string, text: string): Promise<string> {\n try {\n const thread = await this.client.channels.fetch(threadOrMessageId);\n if (thread && (thread.isThread() || thread.isTextBased())) {\n return discordRetry(async () => {\n const msg = await (thread as ThreadChannel).send(discordTextPayload(text));\n return msg.id;\n });\n }\n } catch {}\n return this.postReply(channelId, threadOrMessageId, text);\n }\n\n async deleteMessageRaw(channelId: string, messageId: string): Promise<void> {\n try {\n const ch = await this.fetchTextChannel(channelId);\n const msg = await ch.messages.fetch(messageId);\n await msg.delete();\n } catch {}\n }\n\n async sendTyping(channelId: string): Promise<void> {\n try {\n const ch = await this.fetchTextChannel(channelId);\n await ch.sendTyping();\n } catch {}\n }\n\n async uploadFile(channelId: string, filePath: string, title?: string): Promise<void> {\n return discordRetry(async () => {\n const ch = await this.fetchTextChannel(channelId);\n const fileName = title ?? basename(filePath);\n const fileContent = readFileSync(filePath);\n await ch.send({ files: [{ attachment: fileContent, name: fileName }] });\n });\n }\n\n async sendDirectMessage(userId: string, text: string): Promise<string> {\n return discordRetry(async () => {\n const user = await this.client.users.fetch(userId);\n const msg = await user.send(discordTextPayload(text));\n return msg.id;\n });\n }\n\n async postPrivate(_conversationId: string, userId: string, text: string): Promise<void> {\n await this.sendDirectMessage(userId, text);\n }\n\n getAllChannels(): { id: string; name: string }[] {\n return Array.from(this.channels.values());\n }\n\n getAllUsers(): { id: string; userName: string; displayName: string }[] {\n return Array.from(this.users.values());\n }\n\n logToFile(channelId: string, entry: object): void {\n appendChannelLog(this.workspace.office(createOfficeAddress(\"discord\", channelId)), entry);\n }\n\n logBotResponse(channelId: string, text: string, ts: string): void {\n appendBotResponseLog(\n this.workspace.office(createOfficeAddress(\"discord\", channelId)),\n text,\n ts,\n );\n }\n\n async processAttachments(\n channelId: string,\n attachments: Collection<string, Attachment>,\n ): Promise<{ name: string; localPath: string }[]> {\n const items: IncomingAttachment[] = [];\n for (const attachment of attachments.values()) {\n if (!attachment.name) {\n log.logWarning(\"Discord attachment missing name, skipping\", attachment.url);\n continue;\n }\n items.push({\n name: attachment.name,\n download: (destPath) => downloadUrlToFile(attachment.url, destPath),\n });\n }\n\n const office = this.workspace.office(createOfficeAddress(\"discord\", channelId));\n const { saved, failed } = await saveIncomingAttachments(office, items);\n for (const failure of failed) {\n log.logWarning(`Failed to download Discord attachment`, `${failure.name}: ${failure.error}`);\n }\n return saved.map((item) => ({ name: item.original, localPath: item.localPath }));\n }\n\n private getQueue(channelId: string): MessagingEventQueue {\n let queue = this.queues.get(channelId);\n if (!queue) {\n queue = new MessagingEventQueue(\"Discord\");\n this.queues.set(channelId, queue);\n }\n return queue;\n }\n\n private resolveStopTarget(channelId: string, sessionKey: string): string | null {\n const address = createOfficeAddress(\"discord\", channelId);\n const directTarget = resolveStopTarget({ handler: this.handler, address, sessionKey });\n if (directTarget) return directTarget;\n if (sessionKey !== channelId) return null;\n return resolveOnlyScopedStopTarget(this.handler, address);\n }\n\n private loadCachedGuildData(): void {\n for (const guild of this.client.guilds.cache.values()) {\n for (const channel of guild.channels.cache.values()) {\n if (channel.isTextBased() && \"name\" in channel) {\n this.channels.set(channel.id, { id: channel.id, name: channel.name ?? channel.id });\n }\n }\n for (const member of guild.members.cache.values()) {\n this.users.set(member.id, {\n id: member.id,\n userName: member.user.username,\n displayName: member.displayName,\n });\n }\n }\n }\n\n private stripMessagingBotMention(text: string): string {\n if (!this.botUserId) return text;\n return text.replace(new RegExp(`<@!?${this.botUserId}>`, \"g\"), \"\").trim();\n }\n\n private resolveConversationContext(input: {\n channelId: string;\n inGuild: boolean;\n isThread: boolean;\n parentChannelId?: string | null;\n referencedMsgId?: string;\n }): { conversationId: string; threadTs?: string } {\n if (!input.inGuild) {\n return {\n conversationId: input.channelId,\n threadTs: input.referencedMsgId,\n };\n }\n\n if (input.isThread) {\n return {\n conversationId: input.parentChannelId ?? input.channelId,\n threadTs: input.channelId,\n };\n }\n\n return {\n conversationId: input.channelId,\n threadTs: input.referencedMsgId,\n };\n }\n\n private createSlashCommandAdapters(\n interaction: ChatInputCommandInteraction,\n commandText: string,\n sessionKey: string,\n conversationId: string,\n ): ConversationContext {\n const isDM = !interaction.inGuild();\n const userId = interaction.user.id;\n const userName = interaction.user.username;\n const platform = this.getMessagingInfo();\n const shouldUseEphemeral = !isDM;\n\n const message = createConversationMessage({\n platform: \"discord\",\n conversationId,\n id: interaction.id,\n sessionKey,\n conversationKind: isDM ? \"direct\" : \"shared\",\n userId,\n userName,\n text: commandText,\n attachments: [],\n });\n\n const respondPrivately = async (text: string, replace = false): Promise<void> => {\n if (interaction.replied || interaction.deferred) {\n if (replace) {\n await interaction.editReply({ content: text });\n } else {\n await interaction.followUp({ content: text, ephemeral: shouldUseEphemeral });\n }\n return;\n }\n\n await interaction.reply({ content: text, ephemeral: shouldUseEphemeral });\n };\n\n const responder: ConversationResponder = {\n respond: async (text: string) => {\n await respondPrivately(text);\n },\n replaceResponse: async (text: string) => {\n await respondPrivately(text, true);\n },\n respondDiagnostic: async (text: string) => {\n await respondPrivately(text);\n },\n respondToolResult: async (result: ChatToolResult) => {\n const duration = (result.durationMs / 1000).toFixed(1);\n const formatted = `${result.isError ? \"Error\" : \"Done\"} ${result.toolName} (${duration}s)\\n${result.result}`;\n await respondPrivately(formatted);\n },\n setTyping: async () => {},\n setWorking: async (working: boolean) => {\n if (working && !interaction.replied && !interaction.deferred) {\n await interaction.deferReply({ ephemeral: shouldUseEphemeral });\n }\n },\n uploadFile: async (filePath: string, title?: string) => {\n await this.uploadFile(conversationId, filePath, title);\n },\n deleteResponse: async () => {},\n };\n\n return { address: message.address, message, responder, platform };\n }\n\n private setupEventHandlers(): void {\n this.client.on(Events.InteractionCreate, (interaction) => {\n void this.intake.run(() => this.handleInteractionCreate(interaction));\n });\n this.client.on(Events.MessageCreate, (message) => {\n void this.intake.run(() => this.handleMessageCreate(message));\n });\n }\n\n private async handleInteractionCreate(interaction: Interaction): Promise<void> {\n if (!interaction.isChatInputCommand()) return;\n const manifestEntry = COMMAND_MANIFEST.find(\n (entry) => entry.discord && entry.name === interaction.commandName,\n );\n if (!manifestEntry) return;\n\n const isDM = !interaction.inGuild();\n const { conversationId, threadTs } = this.resolveConversationContext({\n channelId: interaction.channelId,\n inGuild: interaction.inGuild(),\n isThread: interaction.channel?.isThread() ?? false,\n parentChannelId:\n interaction.channel && \"parentId\" in interaction.channel\n ? interaction.channel.parentId\n : null,\n });\n const sessionKey = resolveChatSessionKey({\n conversationId,\n conversationKind: isDM ? \"direct\" : \"shared\",\n messageId: interaction.id,\n persistentTopLevel: true,\n threadTs,\n });\n const commandArg = manifestEntry.arg\n ? interaction.options.getString(manifestEntry.arg.name)?.trim()\n : undefined;\n const commandText = commandArg\n ? `/${interaction.commandName} ${commandArg}`\n : `/${interaction.commandName}`;\n\n this.logToFile(conversationId, {\n date: new Date(interaction.createdTimestamp).toISOString(),\n ts: interaction.id,\n ...(threadTs ? { threadTs } : {}),\n user: interaction.user.id,\n userName: interaction.user.username,\n text: commandText,\n attachments: [],\n isMessagingBot: false,\n });\n\n const context = this.createSlashCommandAdapters(\n interaction,\n commandText,\n sessionKey,\n conversationId,\n );\n try {\n if (manifestEntry.magicWord) {\n const stopTarget = this.resolveStopTarget(conversationId, sessionKey);\n if (stopTarget) {\n await this.handler.handleStop(\n createOfficeAddress(\"discord\", conversationId),\n stopTarget,\n this,\n );\n await context.responder.respond(\"Stopped the current conversation.\");\n } else {\n await context.responder.respond(formatNothingRunning(\"discord\"));\n }\n return;\n }\n\n const event = createConversationEvent({\n platform: \"discord\",\n type: \"dm\",\n conversationId,\n conversationKind: isDM ? \"direct\" : \"shared\",\n ts: interaction.id,\n thread_ts: threadTs,\n sessionKey,\n user: interaction.user.id,\n text: commandText,\n attachments: [],\n });\n\n await this.handler.handleEvent(event, this, context);\n } catch (err) {\n log.logWarning(\n \"Discord slash command error\",\n err instanceof Error ? err.message : String(err),\n );\n if (!interaction.replied && !interaction.deferred) {\n await interaction.reply({\n content: `${interaction.commandName} command failed. Please try again later.`,\n ephemeral: !isDM,\n });\n }\n }\n }\n\n private async handleMessageCreate(msg: Message): Promise<void> {\n if (msg.createdTimestamp < this.startupTime) return;\n if (msg.author.bot) return;\n const isDM = msg.channel.type === 1;\n const isInThread = msg.channel.isThread();\n const referencedMsgId = msg.reference?.messageId;\n const isThreadReply = isInThread || !!referencedMsgId;\n const isMentioned = msg.mentions.users.has(this.botUserId ?? \"\");\n const addressed = isDM || isMentioned || isThreadReply;\n\n const { conversationId, threadTs } = this.resolveConversationContext({\n channelId: msg.channelId,\n inGuild: !isDM,\n isThread: isInThread,\n parentChannelId: \"parentId\" in msg.channel ? msg.channel.parentId : null,\n referencedMsgId,\n });\n const userId = msg.author.id;\n const userName = msg.author.username;\n const msgId = msg.id;\n\n this.users.set(userId, {\n id: userId,\n userName,\n displayName: msg.member?.displayName ?? userName,\n });\n\n if (!this.channels.has(conversationId) && \"name\" in msg.channel) {\n const ch = msg.channel as TextChannel | NewsChannel;\n this.channels.set(conversationId, { id: conversationId, name: ch.name });\n }\n\n const conversationKind = isDM ? \"direct\" : \"shared\";\n const sessionKey = resolveChatSessionKey({\n conversationId,\n conversationKind,\n messageId: msgId,\n persistentTopLevel: true,\n threadTs,\n });\n\n const cleanedText = this.stripMessagingBotMention(msg.content);\n\n const eventBase = createConversationEvent({\n platform: \"discord\",\n type: isDM ? \"dm\" : \"mention\",\n conversationId,\n conversationKind,\n ts: msgId,\n thread_ts: threadTs,\n sessionKey,\n user: userId,\n userName,\n text: cleanedText,\n }) as DiscordEvent;\n\n await processMessageIntake({\n eventBase,\n addressed,\n magicWord: { addressed, scopeFallback: \"top-level\" },\n busyPolicy: \"queue\",\n logEntryBase: {\n date: msg.createdAt.toISOString(),\n ts: msgId,\n ...(!isDM && threadTs ? { threadTs } : {}),\n user: userId,\n userName,\n text: cleanedText,\n isMessagingBot: false,\n },\n log: (entry) => this.logToFile(conversationId, entry),\n processAttachments: () => this.processAttachments(conversationId, msg.attachments),\n queueKey: sessionKey,\n enqueue: (queueKey, work) => this.getQueue(queueKey).enqueue(work),\n handler: this.handler,\n bot: this,\n createContext: (event) => createDiscordAdapters(event, this),\n });\n }\n\n private async fetchTextChannel(\n channelId: string,\n ): Promise<TextChannel | DMChannel | NewsChannel | ThreadChannel> {\n const ch = await this.client.channels.fetch(channelId);\n if (!ch || !ch.isTextBased()) {\n throw new Error(`Channel ${channelId} is not a text channel`);\n }\n return ch as TextChannel | DMChannel | NewsChannel | ThreadChannel;\n }\n}\n"]}
@@ -1,28 +1,5 @@
1
1
  import type { DiscordTextPayload } from "./types.js";
2
2
  export type { DiscordTextPayload } from "./types.js";
3
- /**
4
- * Discord message payloads, built once for every path that sends text.
5
- *
6
- * Components V2 is a per-message choice that **cannot be undone**: once a
7
- * message carries the flag, `content` stops working on it forever, so a
8
- * response that is posted as V2 must also be edited as V2. Building every
9
- * outbound payload here is what keeps that true — a single path that forgets
10
- * would leave a message that can never be updated again.
11
- *
12
- * What it buys is the ceiling. Classic `content` caps at 2000 characters, so a
13
- * long answer arrived as a string of `(continued 1)` posts; V2 allows 4000
14
- * across a message's text, which halves that. Note the limit is the *sum* over
15
- * all text displays, not per display — extra components buy layout, not room.
16
- */
17
- /** Sum of all text in one Components V2 message. */
18
3
  export declare const DISCORD_V2_TEXT_LIMIT = 4000;
19
- /**
20
- * A text message as Components V2.
21
- *
22
- * One Text Display rather than several: the character budget is shared, so
23
- * splitting prose across components would add structure without adding room,
24
- * and Discord renders the markdown inside a single display exactly as it
25
- * renders `content` today.
26
- */
27
4
  export declare function discordTextPayload(text: string): DiscordTextPayload;
28
5
  //# sourceMappingURL=components.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../../../src/adapters/discord/components.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,YAAY,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD;;;;;;;;;;;;;GAaG;AAEH,oDAAoD;AACpD,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAE1C;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAKnE"}
1
+ {"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../../../src/adapters/discord/components.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,YAAY,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAE1C,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAKnE"}
@@ -1,28 +1,5 @@
1
1
  import { ComponentType, MessageFlags } from "discord.js";
2
- /**
3
- * Discord message payloads, built once for every path that sends text.
4
- *
5
- * Components V2 is a per-message choice that **cannot be undone**: once a
6
- * message carries the flag, `content` stops working on it forever, so a
7
- * response that is posted as V2 must also be edited as V2. Building every
8
- * outbound payload here is what keeps that true — a single path that forgets
9
- * would leave a message that can never be updated again.
10
- *
11
- * What it buys is the ceiling. Classic `content` caps at 2000 characters, so a
12
- * long answer arrived as a string of `(continued 1)` posts; V2 allows 4000
13
- * across a message's text, which halves that. Note the limit is the *sum* over
14
- * all text displays, not per display — extra components buy layout, not room.
15
- */
16
- /** Sum of all text in one Components V2 message. */
17
2
  export const DISCORD_V2_TEXT_LIMIT = 4000;
18
- /**
19
- * A text message as Components V2.
20
- *
21
- * One Text Display rather than several: the character budget is shared, so
22
- * splitting prose across components would add structure without adding room,
23
- * and Discord renders the markdown inside a single display exactly as it
24
- * renders `content` today.
25
- */
26
3
  export function discordTextPayload(text) {
27
4
  return {
28
5
  flags: MessageFlags.IsComponentsV2,
@@ -1 +1 @@
1
- {"version":3,"file":"components.js","sourceRoot":"","sources":["../../../src/adapters/discord/components.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAKzD;;;;;;;;;;;;;GAaG;AAEH,oDAAoD;AACpD,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAE1C;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO;QACL,KAAK,EAAE,YAAY,CAAC,cAAc;QAClC,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,CAAC,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;KACjE,CAAC;AACJ,CAAC","sourcesContent":["import { ComponentType, MessageFlags } from \"discord.js\";\nimport type { DiscordTextPayload } from \"./types.js\";\n\nexport type { DiscordTextPayload } from \"./types.js\";\n\n/**\n * Discord message payloads, built once for every path that sends text.\n *\n * Components V2 is a per-message choice that **cannot be undone**: once a\n * message carries the flag, `content` stops working on it forever, so a\n * response that is posted as V2 must also be edited as V2. Building every\n * outbound payload here is what keeps that true — a single path that forgets\n * would leave a message that can never be updated again.\n *\n * What it buys is the ceiling. Classic `content` caps at 2000 characters, so a\n * long answer arrived as a string of `(continued 1)` posts; V2 allows 4000\n * across a message's text, which halves that. Note the limit is the *sum* over\n * all text displays, not per display — extra components buy layout, not room.\n */\n\n/** Sum of all text in one Components V2 message. */\nexport const DISCORD_V2_TEXT_LIMIT = 4000;\n\n/**\n * A text message as Components V2.\n *\n * One Text Display rather than several: the character budget is shared, so\n * splitting prose across components would add structure without adding room,\n * and Discord renders the markdown inside a single display exactly as it\n * renders `content` today.\n */\nexport function discordTextPayload(text: string): DiscordTextPayload {\n return {\n flags: MessageFlags.IsComponentsV2,\n components: [{ type: ComponentType.TextDisplay, content: text }],\n };\n}\n"]}
1
+ {"version":3,"file":"components.js","sourceRoot":"","sources":["../../../src/adapters/discord/components.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAKzD,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAE1C,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO;QACL,KAAK,EAAE,YAAY,CAAC,cAAc;QAClC,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,CAAC,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;KACjE,CAAC;AACJ,CAAC","sourcesContent":["import { ComponentType, MessageFlags } from \"discord.js\";\nimport type { DiscordTextPayload } from \"./types.js\";\n\nexport type { DiscordTextPayload } from \"./types.js\";\n\nexport const DISCORD_V2_TEXT_LIMIT = 4000;\n\nexport function discordTextPayload(text: string): DiscordTextPayload {\n return {\n flags: MessageFlags.IsComponentsV2,\n components: [{ type: ComponentType.TextDisplay, content: text }],\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/adapters/discord/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAKlF,OAAO,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAalE,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,YAAY,EACnB,GAAG,EAAE,mBAAmB,GACvB,mBAAmB,CAmFrB"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/adapters/discord/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAKlF,OAAO,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAUlE,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,YAAY,EACnB,GAAG,EAAE,mBAAmB,GACvB,mBAAmB,CA4ErB"}