@geminixiang/mikan 1.0.0-beta.64 → 1.0.0-beta.66

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 (236) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/README.md +1 -1
  3. package/dist/adapters/commands/auto-reply.d.ts.map +1 -1
  4. package/dist/adapters/commands/auto-reply.js +19 -10
  5. package/dist/adapters/commands/auto-reply.js.map +1 -1
  6. package/dist/adapters/commands/manifest.js +2 -2
  7. package/dist/adapters/commands/manifest.js.map +1 -1
  8. package/dist/adapters/commands/model.js +2 -2
  9. package/dist/adapters/commands/model.js.map +1 -1
  10. package/dist/adapters/commands/new.js +1 -1
  11. package/dist/adapters/commands/new.js.map +1 -1
  12. package/dist/adapters/commands/sandbox.js +2 -2
  13. package/dist/adapters/commands/sandbox.js.map +1 -1
  14. package/dist/adapters/commands/types.d.ts +1 -1
  15. package/dist/adapters/commands/types.d.ts.map +1 -1
  16. package/dist/adapters/commands/types.js.map +1 -1
  17. package/dist/adapters/commands/utils.d.ts +1 -1
  18. package/dist/adapters/commands/utils.d.ts.map +1 -1
  19. package/dist/adapters/commands/utils.js.map +1 -1
  20. package/dist/adapters/discord/bot.d.ts +2 -2
  21. package/dist/adapters/discord/bot.d.ts.map +1 -1
  22. package/dist/adapters/discord/bot.js +7 -6
  23. package/dist/adapters/discord/bot.js.map +1 -1
  24. package/dist/adapters/discord/context.d.ts +1 -1
  25. package/dist/adapters/discord/context.d.ts.map +1 -1
  26. package/dist/adapters/discord/context.js +2 -1
  27. package/dist/adapters/discord/context.js.map +1 -1
  28. package/dist/adapters/discord/types.d.ts +1 -1
  29. package/dist/adapters/discord/types.d.ts.map +1 -1
  30. package/dist/adapters/discord/types.js.map +1 -1
  31. package/dist/adapters/github/bot.d.ts +2 -2
  32. package/dist/adapters/github/bot.d.ts.map +1 -1
  33. package/dist/adapters/github/bot.js +1 -1
  34. package/dist/adapters/github/bot.js.map +1 -1
  35. package/dist/adapters/github/context.d.ts +1 -1
  36. package/dist/adapters/github/context.d.ts.map +1 -1
  37. package/dist/adapters/github/context.js +1 -1
  38. package/dist/adapters/github/context.js.map +1 -1
  39. package/dist/adapters/github/types.d.ts +1 -1
  40. package/dist/adapters/github/types.d.ts.map +1 -1
  41. package/dist/adapters/github/types.js.map +1 -1
  42. package/dist/{adapter.d.ts → adapters/index.d.ts} +3 -3
  43. package/dist/adapters/index.d.ts.map +1 -0
  44. package/dist/{adapter.js → adapters/index.js} +2 -2
  45. package/dist/adapters/index.js.map +1 -0
  46. package/dist/adapters/intake.d.ts +1 -1
  47. package/dist/adapters/intake.d.ts.map +1 -1
  48. package/dist/adapters/intake.js +1 -1
  49. package/dist/adapters/intake.js.map +1 -1
  50. package/dist/{platform-messages.d.ts → adapters/messages.d.ts} +2 -2
  51. package/dist/adapters/messages.d.ts.map +1 -0
  52. package/dist/{platform-messages.js → adapters/messages.js} +1 -1
  53. package/dist/adapters/messages.js.map +1 -0
  54. package/dist/adapters/progressive-renderer.d.ts +1 -1
  55. package/dist/adapters/progressive-renderer.d.ts.map +1 -1
  56. package/dist/adapters/progressive-renderer.js.map +1 -1
  57. package/dist/adapters/shared.d.ts +3 -1
  58. package/dist/adapters/shared.d.ts.map +1 -1
  59. package/dist/adapters/shared.js +25 -0
  60. package/dist/adapters/shared.js.map +1 -1
  61. package/dist/adapters/slack/bot.d.ts +14 -3
  62. package/dist/adapters/slack/bot.d.ts.map +1 -1
  63. package/dist/adapters/slack/bot.js +56 -7
  64. package/dist/adapters/slack/bot.js.map +1 -1
  65. package/dist/adapters/slack/context.d.ts +1 -1
  66. package/dist/adapters/slack/context.d.ts.map +1 -1
  67. package/dist/adapters/slack/context.js +1 -1
  68. package/dist/adapters/slack/context.js.map +1 -1
  69. package/dist/adapters/slack/persona.d.ts +15 -0
  70. package/dist/adapters/slack/persona.d.ts.map +1 -0
  71. package/dist/adapters/slack/persona.js +22 -0
  72. package/dist/adapters/slack/persona.js.map +1 -0
  73. package/dist/adapters/slack/response-lifecycle.d.ts +1 -1
  74. package/dist/adapters/slack/response-lifecycle.d.ts.map +1 -1
  75. package/dist/adapters/slack/response-lifecycle.js +21 -0
  76. package/dist/adapters/slack/response-lifecycle.js.map +1 -1
  77. package/dist/adapters/slack/types.d.ts +1 -1
  78. package/dist/adapters/slack/types.d.ts.map +1 -1
  79. package/dist/adapters/slack/types.js.map +1 -1
  80. package/dist/adapters/telegram/bot.d.ts +2 -2
  81. package/dist/adapters/telegram/bot.d.ts.map +1 -1
  82. package/dist/adapters/telegram/bot.js +6 -6
  83. package/dist/adapters/telegram/bot.js.map +1 -1
  84. package/dist/adapters/telegram/context.d.ts +1 -1
  85. package/dist/adapters/telegram/context.d.ts.map +1 -1
  86. package/dist/adapters/telegram/context.js +2 -1
  87. package/dist/adapters/telegram/context.js.map +1 -1
  88. package/dist/adapters/telegram/types.d.ts +1 -1
  89. package/dist/adapters/telegram/types.d.ts.map +1 -1
  90. package/dist/adapters/telegram/types.js.map +1 -1
  91. package/dist/adapters/types.d.ts +1 -1
  92. package/dist/adapters/types.d.ts.map +1 -1
  93. package/dist/adapters/types.js.map +1 -1
  94. package/dist/adapters/web/admin/portal.d.ts +2 -2
  95. package/dist/adapters/web/admin/portal.d.ts.map +1 -1
  96. package/dist/adapters/web/admin/portal.js +26 -16
  97. package/dist/adapters/web/admin/portal.js.map +1 -1
  98. package/dist/adapters/web/admin/types.d.ts +1 -1
  99. package/dist/adapters/web/admin/types.d.ts.map +1 -1
  100. package/dist/adapters/web/admin/types.js.map +1 -1
  101. package/dist/adapters/web/login/portal.d.ts +1 -1
  102. package/dist/adapters/web/login/portal.d.ts.map +1 -1
  103. package/dist/adapters/web/login/portal.js +2 -2
  104. package/dist/adapters/web/login/portal.js.map +1 -1
  105. package/dist/adapters/web/login/types.d.ts +1 -1
  106. package/dist/adapters/web/login/types.d.ts.map +1 -1
  107. package/dist/adapters/web/login/types.js.map +1 -1
  108. package/dist/adapters/web/portal-shell.js +2 -2
  109. package/dist/adapters/web/portal-shell.js.map +1 -1
  110. package/dist/adapters/web/server.d.ts +1 -1
  111. package/dist/adapters/web/server.d.ts.map +1 -1
  112. package/dist/adapters/web/server.js +1 -1
  113. package/dist/adapters/web/server.js.map +1 -1
  114. package/dist/adapters/web/session-view/portal.js +1 -1
  115. package/dist/adapters/web/session-view/portal.js.map +1 -1
  116. package/dist/adapters/web/session-view/types.d.ts +3 -3
  117. package/dist/adapters/web/session-view/types.d.ts.map +1 -1
  118. package/dist/adapters/web/session-view/types.js.map +1 -1
  119. package/dist/cli/office.js +1 -1
  120. package/dist/cli/office.js.map +1 -1
  121. package/dist/cli/onboard.js +2 -2
  122. package/dist/cli/onboard.js.map +1 -1
  123. package/dist/cli/process-lifecycle.d.ts.map +1 -0
  124. package/dist/cli/process-lifecycle.js.map +1 -0
  125. package/dist/dream/index.js +1 -1
  126. package/dist/dream/index.js.map +1 -1
  127. package/dist/dream/types.d.ts +1 -1
  128. package/dist/dream/types.d.ts.map +1 -1
  129. package/dist/dream/types.js.map +1 -1
  130. package/dist/env-manifest.d.ts +6 -0
  131. package/dist/env-manifest.d.ts.map +1 -1
  132. package/dist/env-manifest.js +16 -0
  133. package/dist/env-manifest.js.map +1 -1
  134. package/dist/events/scheduler.d.ts +1 -1
  135. package/dist/events/scheduler.d.ts.map +1 -1
  136. package/dist/events/scheduler.js +1 -1
  137. package/dist/events/scheduler.js.map +1 -1
  138. package/dist/file-guards.d.ts +8 -0
  139. package/dist/file-guards.d.ts.map +1 -1
  140. package/dist/file-guards.js +31 -0
  141. package/dist/file-guards.js.map +1 -1
  142. package/dist/harness/execution-resolver.js +1 -1
  143. package/dist/harness/execution-resolver.js.map +1 -1
  144. package/dist/harness/index.d.ts +1 -0
  145. package/dist/harness/index.d.ts.map +1 -1
  146. package/dist/harness/index.js +1 -0
  147. package/dist/harness/index.js.map +1 -1
  148. package/dist/harness/jev.d.ts +65 -0
  149. package/dist/harness/jev.d.ts.map +1 -0
  150. package/dist/harness/jev.js +109 -0
  151. package/dist/harness/jev.js.map +1 -0
  152. package/dist/harness/open-connector.js +1 -1
  153. package/dist/harness/open-connector.js.map +1 -1
  154. package/dist/harness/presenter.d.ts +2 -2
  155. package/dist/harness/presenter.d.ts.map +1 -1
  156. package/dist/harness/presenter.js +26 -0
  157. package/dist/harness/presenter.js.map +1 -1
  158. package/dist/harness/prompt.d.ts +1 -1
  159. package/dist/harness/prompt.d.ts.map +1 -1
  160. package/dist/harness/prompt.js +1 -0
  161. package/dist/harness/prompt.js.map +1 -1
  162. package/dist/harness/runner.js +1 -1
  163. package/dist/harness/runner.js.map +1 -1
  164. package/dist/harness/subagent-profiles.d.ts.map +1 -1
  165. package/dist/harness/subagent-profiles.js +14 -14
  166. package/dist/harness/subagent-profiles.js.map +1 -1
  167. package/dist/harness/tools/event.d.ts +1 -1
  168. package/dist/harness/tools/event.d.ts.map +1 -1
  169. package/dist/harness/tools/event.js.map +1 -1
  170. package/dist/harness/tools/index.d.ts +1 -1
  171. package/dist/harness/tools/index.d.ts.map +1 -1
  172. package/dist/harness/tools/index.js.map +1 -1
  173. package/dist/harness/tools/task.d.ts +1 -1
  174. package/dist/harness/tools/task.d.ts.map +1 -1
  175. package/dist/harness/tools/task.js.map +1 -1
  176. package/dist/harness/types.d.ts +2 -2
  177. package/dist/harness/types.d.ts.map +1 -1
  178. package/dist/harness/types.js.map +1 -1
  179. package/dist/index.d.ts +2 -2
  180. package/dist/index.d.ts.map +1 -1
  181. package/dist/index.js +1 -1
  182. package/dist/index.js.map +1 -1
  183. package/dist/main.js +4 -2
  184. package/dist/main.js.map +1 -1
  185. package/dist/observability/instrument.js +1 -1
  186. package/dist/observability/instrument.js.map +1 -1
  187. package/dist/office/projection.d.ts +8 -5
  188. package/dist/office/projection.d.ts.map +1 -1
  189. package/dist/office/projection.js +14 -6
  190. package/dist/office/projection.js.map +1 -1
  191. package/dist/office/types.d.ts +4 -1
  192. package/dist/office/types.d.ts.map +1 -1
  193. package/dist/office/types.js.map +1 -1
  194. package/dist/runtime/conversation-runtime.js +1 -1
  195. package/dist/runtime/conversation-runtime.js.map +1 -1
  196. package/dist/runtime/session-lifecycle.d.ts +1 -1
  197. package/dist/runtime/session-lifecycle.d.ts.map +1 -1
  198. package/dist/runtime/session-lifecycle.js.map +1 -1
  199. package/dist/runtime/types.d.ts +1 -1
  200. package/dist/runtime/types.d.ts.map +1 -1
  201. package/dist/runtime/types.js.map +1 -1
  202. package/dist/sessions/session-key.d.ts +1 -1
  203. package/dist/sessions/session-key.d.ts.map +1 -1
  204. package/dist/sessions/session-key.js.map +1 -1
  205. package/dist/sessions/types.d.ts +1 -1
  206. package/dist/sessions/types.d.ts.map +1 -1
  207. package/dist/sessions/types.js.map +1 -1
  208. package/dist/{settings-mutation.d.ts → settings/apply.d.ts} +4 -4
  209. package/dist/settings/apply.d.ts.map +1 -0
  210. package/dist/{settings-mutation.js → settings/apply.js} +2 -2
  211. package/dist/settings/apply.js.map +1 -0
  212. package/dist/settings/index.d.ts +126 -0
  213. package/dist/settings/index.d.ts.map +1 -0
  214. package/dist/{config.js → settings/index.js} +32 -143
  215. package/dist/settings/index.js.map +1 -0
  216. package/dist/settings/migrate.d.ts +21 -0
  217. package/dist/settings/migrate.d.ts.map +1 -0
  218. package/dist/settings/migrate.js +86 -0
  219. package/dist/settings/migrate.js.map +1 -0
  220. package/dist/types.d.ts +7 -0
  221. package/dist/types.d.ts.map +1 -1
  222. package/dist/types.js.map +1 -1
  223. package/package.json +2 -2
  224. package/dist/adapter.d.ts.map +0 -1
  225. package/dist/adapter.js.map +0 -1
  226. package/dist/config.d.ts +0 -92
  227. package/dist/config.d.ts.map +0 -1
  228. package/dist/config.js.map +0 -1
  229. package/dist/platform-messages.d.ts.map +0 -1
  230. package/dist/platform-messages.js.map +0 -1
  231. package/dist/process-lifecycle.d.ts.map +0 -1
  232. package/dist/process-lifecycle.js.map +0 -1
  233. package/dist/settings-mutation.d.ts.map +0 -1
  234. package/dist/settings-mutation.js.map +0 -1
  235. /package/dist/{process-lifecycle.d.ts → cli/process-lifecycle.d.ts} +0 -0
  236. /package/dist/{process-lifecycle.js → cli/process-lifecycle.js} +0 -0
@@ -1,4 +1,4 @@
1
- import type { MessagingBot, MessagingInfo } from "./adapter.js";
1
+ import type { MessagingBot, MessagingInfo } from "./index.js";
2
2
  export declare const PRODUCT_NAME = "mikan";
3
3
  type PlatformSource = MessagingBot | MessagingInfo | string;
4
4
  export declare function formatNothingRunning(source: PlatformSource): string;
@@ -10,4 +10,4 @@ export declare function formatAlreadyWorking(source: PlatformSource, stopCommand
10
10
  }): string;
11
11
  export declare function formatForceStopped(source: PlatformSource, actorLabel: string): string;
12
12
  export {};
13
- //# sourceMappingURL=platform-messages.d.ts.map
13
+ //# sourceMappingURL=messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/adapters/messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE9D,eAAO,MAAM,YAAY,UAAU,CAAC;AAEpC,KAAK,cAAc,GAAG,YAAY,GAAG,aAAa,GAAG,MAAM,CAAC;AAoB5D,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAEnE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAE7D;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAE5D;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAK/D;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,cAAc,EACtB,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,QAAQ,CAAA;CAAE,GAC7B,MAAM,CAMR;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAErF"}
@@ -36,4 +36,4 @@ export function formatAlreadyWorking(source, stopCommand, options) {
36
36
  export function formatForceStopped(source, actorLabel) {
37
37
  return formatItalic(resolvePlatformName(source), `Force stopped by ${actorLabel}.`);
38
38
  }
39
- //# sourceMappingURL=platform-messages.js.map
39
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/adapters/messages.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC;AAIpC,SAAS,mBAAmB,CAAC,MAAsB;IACjD,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC;IAC9C,IAAI,kBAAkB,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC,gBAAgB,EAAE,CAAC,IAAI,CAAC;IACxE,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,SAAS,sBAAsB,CAAC,YAAoB;IAClD,OAAO,YAAY,KAAK,UAAU,CAAC;AACrC,CAAC;AAED,SAAS,YAAY,CAAC,YAAoB,EAAE,IAAY;IACtD,OAAO,sBAAsB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC;AACnE,CAAC;AAED,SAAS,UAAU,CAAC,YAAoB,EAAE,IAAY;IACpD,OAAO,sBAAsB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC;AACvF,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAsB;IACzD,OAAO,YAAY,CAAC,mBAAmB,CAAC,MAAM,CAAC,EAAE,kBAAkB,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAsB;IACnD,OAAO,YAAY,CAAC,mBAAmB,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAsB;IAClD,OAAO,YAAY,CAAC,mBAAmB,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAsB;IACrD,OAAO,YAAY,CACjB,mBAAmB,CAAC,MAAM,CAAC,EAC3B,uFAAuF,CACxF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,MAAsB,EACtB,WAAmB,EACnB,OAA8B;IAE9B,MAAM,YAAY,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,UAAU,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IACtD,MAAM,MAAM,GACV,OAAO,EAAE,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,iCAAiC,CAAC,CAAC,CAAC,kBAAkB,CAAC;IACvF,OAAO,YAAY,CAAC,YAAY,EAAE,GAAG,MAAM,SAAS,OAAO,aAAa,CAAC,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAsB,EAAE,UAAkB;IAC3E,OAAO,YAAY,CAAC,mBAAmB,CAAC,MAAM,CAAC,EAAE,oBAAoB,UAAU,GAAG,CAAC,CAAC;AACtF,CAAC","sourcesContent":["import type { MessagingBot, MessagingInfo } from \"./index.js\";\n\nexport const PRODUCT_NAME = \"mikan\";\n\ntype PlatformSource = MessagingBot | MessagingInfo | string;\n\nfunction resolvePlatformName(source: PlatformSource): string {\n if (typeof source === \"string\") return source;\n if (\"getMessagingInfo\" in source) return source.getMessagingInfo().name;\n return source.name;\n}\n\nfunction supportsHtmlFormatting(platformName: string): boolean {\n return platformName === \"telegram\";\n}\n\nfunction formatItalic(platformName: string, text: string): string {\n return supportsHtmlFormatting(platformName) ? text : `_${text}_`;\n}\n\nfunction formatCode(platformName: string, text: string): string {\n return supportsHtmlFormatting(platformName) ? `<code>${text}</code>` : `\\`${text}\\``;\n}\n\nexport function formatNothingRunning(source: PlatformSource): string {\n return formatItalic(resolvePlatformName(source), \"Nothing running.\");\n}\n\nexport function formatStopping(source: PlatformSource): string {\n return formatItalic(resolvePlatformName(source), \"Stopping…\");\n}\n\nexport function formatStopped(source: PlatformSource): string {\n return formatItalic(resolvePlatformName(source), \"Stopped.\");\n}\n\nexport function formatRestarting(source: PlatformSource): string {\n return formatItalic(\n resolvePlatformName(source),\n \"Restarting for an update; this reply was interrupted. Please send your message again.\",\n );\n}\n\nexport function formatAlreadyWorking(\n source: PlatformSource,\n stopCommand: string,\n options?: { scope?: \"thread\" },\n): string {\n const platformName = resolvePlatformName(source);\n const command = formatCode(platformName, stopCommand);\n const prefix =\n options?.scope === \"thread\" ? \"Already working in this thread.\" : \"Already working.\";\n return formatItalic(platformName, `${prefix} Send ${command} to cancel.`);\n}\n\nexport function formatForceStopped(source: PlatformSource, actorLabel: string): string {\n return formatItalic(resolvePlatformName(source), `Force stopped by ${actorLabel}.`);\n}\n"]}
@@ -1,4 +1,4 @@
1
- import type { ChatToolResult, ConversationResponder } from "../adapter.js";
1
+ import type { ChatToolResult, ConversationResponder } from "./index.js";
2
2
  import type { ProgressiveRendererPlatform } from "./types.js";
3
3
  export declare function formatMarkdownToolResult(result: ChatToolResult): string;
4
4
  export declare function createProgressiveRenderer(platform: ProgressiveRendererPlatform): {
@@ -1 +1 @@
1
- {"version":3,"file":"progressive-renderer.d.ts","sourceRoot":"","sources":["../../src/adapters/progressive-renderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EAEtB,MAAM,eAAe,CAAC;AAQvB,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AAE9D,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CASvE;AA6hBD,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,2BAA2B,GAAG;IAChF,SAAS,EAAE,qBAAqB,CAAC;CAClC,CAEA"}
1
+ {"version":3,"file":"progressive-renderer.d.ts","sourceRoot":"","sources":["../../src/adapters/progressive-renderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAqB,EAA4B,MAAM,YAAY,CAAC;AAQlG,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AAE9D,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CASvE;AA6hBD,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,2BAA2B,GAAG;IAChF,SAAS,EAAE,qBAAqB,CAAC;CAClC,CAEA"}
@@ -1 +1 @@
1
- {"version":3,"file":"progressive-renderer.js","sourceRoot":"","sources":["../../src/adapters/progressive-renderer.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ChatToolResult,\n ConversationResponder,\n SubagentProgressSnapshot,\n} from \"../adapter.js\";\nimport * as log from \"../log.js\";\nimport {\n createChatResponseErrorReporter,\n formatToolArgs,\n splitText,\n type ChatResponseErrorOperation,\n} from \"./shared.js\";\nimport type { ProgressiveRendererPlatform } from \"./types.js\";\n\nexport function formatMarkdownToolResult(result: ChatToolResult): string {\n const argsFormatted = formatToolArgs(result.args);\n const duration = (result.durationMs / 1000).toFixed(1);\n let text = `**${result.isError ? \"Error\" : \"Done\"} ${result.toolName}**`;\n if (result.label) text += `: ${result.label}`;\n text += ` (${duration}s)\\n`;\n if (argsFormatted) text += `\\`\\`\\`\\n${argsFormatted}\\n\\`\\`\\`\\n`;\n text += `**Result:**\\n\\`\\`\\`\\n${result.result}\\n\\`\\`\\``;\n return text;\n}\n\ninterface RendererState {\n responseId: string | null;\n source: string;\n working: boolean;\n streamActive: boolean;\n streamUnavailable: boolean;\n streamedSource: string;\n pendingChars: number;\n lastFlushAt: number;\n resetDelta: boolean;\n typingInterval: ReturnType<typeof setInterval> | null;\n typingFailureWarned: boolean;\n extraIds: Array<string | number>;\n /**\n * Messages holding the overflow of a response too long for one message,\n * in order. Reused across redraws — see `postSplit`.\n */\n continuationIds: Array<string | number>;\n}\n\n/**\n * Floor on how often a streaming response redraws.\n *\n * Every platform meters edits per channel — Slack's is the tightest at roughly\n * fifty a minute — and a redraw sends the whole message, so the cost is the\n * number of calls, not their size. One second keeps a long answer inside that\n * budget while still reading as live.\n *\n * This is a floor, not a target: the interval is measured from when the last\n * redraw *finished*, so a platform that slows down under load slows the redraw\n * rate with it instead of queueing work it cannot deliver.\n */\nconst DEFAULT_FLUSH_INTERVAL_MS = 1000;\n\nclass ProgressiveRenderer {\n readonly responder: ConversationResponder;\n private readonly state: RendererState;\n private readonly sanitize: (text: string) => string;\n private readonly reportResponseError;\n private readonly now = Date.now;\n private readonly flushIntervalMs: number;\n private queueTail = Promise.resolve();\n\n constructor(private readonly platform: ProgressiveRendererPlatform) {\n this.state = {\n responseId: platform.initialResponseId ?? null,\n source: \"\",\n working: true,\n streamActive: false,\n streamUnavailable: false,\n streamedSource: \"\",\n pendingChars: 0,\n lastFlushAt: 0,\n resetDelta: false,\n typingInterval: null,\n typingFailureWarned: false,\n extraIds: [],\n continuationIds: [],\n };\n this.sanitize = platform.sanitize ?? ((text: string) => text);\n this.reportResponseError = platform.responseErrorContext\n ? createChatResponseErrorReporter(() => platform.responseErrorContext!(this.state.responseId))\n : undefined;\n this.flushIntervalMs = platform.flushIntervalMs ?? DEFAULT_FLUSH_INTERVAL_MS;\n this.responder = this.createResponder();\n }\n\n private createResponder(): ConversationResponder {\n return {\n respond: (text) => this.respond(text),\n appendResponseDelta:\n this.platform.supportsDeltas || this.platform.stream\n ? (delta) => this.appendDelta(delta)\n : undefined,\n finishResponse:\n this.platform.supportsDeltas || this.platform.stream\n ? (finalText) => this.finishResponse(finalText)\n : undefined,\n replaceResponse: (text, options) => this.replaceResponse(text, options),\n replaceSubagentProgress: this.platform.formatSubagentProgress\n ? (progress, finalText) => this.replaceSubagentProgress(progress, finalText)\n : undefined,\n respondDiagnostic: (text, options) => this.respondDiagnostic(text, options),\n respondToolResult: (result) => this.respondToolResult(result),\n setTyping: (isTyping) => this.setTyping(isTyping),\n setWorking: (working) => this.setWorking(working),\n uploadFile: (filePath, title) => this.uploadFile(filePath, title),\n ...(this.platform.react ? { react: this.platform.react } : {}),\n deleteResponse: () => this.deleteResponse(),\n };\n }\n\n private stopTyping(): void {\n if (this.state.typingInterval !== null) {\n clearInterval(this.state.typingInterval);\n this.state.typingInterval = null;\n }\n }\n\n private provisional(text: string, working: boolean): string {\n if (this.platform.formatProvisional) return this.platform.formatProvisional(text, working);\n return working && this.platform.workingIndicator ? text + this.platform.workingIndicator : text;\n }\n\n private split(text: string): string[] {\n return splitText(text, this.platform.maxLength, this.platform.formatContinuation);\n }\n\n private async postOrUpdate(text: string): Promise<void> {\n if (this.state.responseId !== null) {\n await this.platform.update(this.state.responseId, text);\n return;\n }\n if (this.platform.typing?.stopOnSend) this.stopTyping();\n this.state.responseId = await this.platform.post(text);\n }\n\n private async postSplit(text: string): Promise<void> {\n const [head = text, ...tail] = this.split(text);\n await this.postOrUpdate(head);\n for (const [index, part] of tail.entries()) {\n const existing = this.state.continuationIds[index];\n if (existing !== undefined) {\n await this.platform.update(String(existing), part);\n continue;\n }\n if (this.platform.typing?.stopOnSend) this.stopTyping();\n const id = await this.platform.postExtra(part, this.state.responseId);\n if (id !== undefined && id !== null) this.state.continuationIds[index] = id;\n }\n }\n\n private async postExtra(text: string): Promise<void> {\n if (this.platform.typing?.stopOnSend) this.stopTyping();\n await this.platform.postExtra(text, this.state.responseId);\n }\n\n private async stopNativeStream(): Promise<void> {\n if (!this.state.streamActive || this.state.responseId === null || !this.platform.stream) return;\n const streamId = this.state.responseId;\n this.state.streamActive = false;\n this.state.streamedSource = \"\";\n await this.platform.stream.stop(streamId);\n }\n\n private async abandonNativeStream(): Promise<void> {\n if (!this.platform.stream || this.state.responseId === null) return;\n const streamId = this.state.responseId;\n this.state.streamActive = false;\n this.state.streamedSource = \"\";\n await this.platform.stream.stop(streamId).catch(() => undefined);\n if (this.state.responseId === streamId) this.state.responseId = null;\n }\n\n private async renderRaw(\n text: string,\n operation: \"render\" | \"replace\",\n options?: { createOverflowLink?: () => string },\n canonicalText = text,\n ): Promise<string> {\n try {\n await this.postSplit(text);\n return canonicalText;\n } catch (err) {\n if (!this.platform.handleTooLong) throw err;\n if (this.platform.isTooLongError && !this.platform.isTooLongError(err)) throw err;\n const fallback = await this.platform.handleTooLong({\n text: canonicalText,\n operation,\n options,\n responseId: this.state.responseId,\n write: (fallbackText) => this.postSplit(fallbackText),\n getResponseId: () => this.state.responseId,\n });\n return fallback.text;\n }\n }\n\n private async renderDelta(text: string): Promise<string> {\n if (this.state.working && !text.trim()) return text;\n const prepared = this.platform.prepareSource?.(text, this.state.working) ?? text;\n const stream = this.platform.stream;\n const display = this.provisional(prepared, this.state.working);\n if (!stream || this.state.streamUnavailable) {\n await this.renderRaw(display, \"render\", undefined, prepared);\n return prepared;\n }\n if (this.state.responseId !== null && !this.state.streamActive) {\n await this.renderRaw(display, \"render\", undefined, prepared);\n return prepared;\n }\n if (\n this.state.responseId !== null &&\n this.state.streamActive &&\n !prepared.startsWith(this.state.streamedSource)\n ) {\n await this.abandonNativeStream();\n await this.renderRaw(display, \"render\", undefined, prepared);\n return prepared;\n }\n\n try {\n if (this.state.responseId !== null) {\n const delta = prepared.slice(this.state.streamedSource.length);\n if (delta && delta.length >= (stream.minDeltaChars ?? 0)) {\n await stream.append(this.state.responseId, delta);\n this.state.streamedSource = prepared;\n }\n return prepared;\n }\n this.state.responseId = await stream.start(prepared);\n this.state.streamActive = true;\n this.state.streamedSource = prepared;\n return prepared;\n } catch (err) {\n this.state.streamUnavailable = true;\n log.logWarning(\n \"Native response streaming unavailable; falling back to message updates\",\n err instanceof Error ? err.message : String(err),\n );\n await this.abandonNativeStream();\n await this.renderRaw(display, \"render\", undefined, prepared);\n return prepared;\n }\n }\n\n private async renderFinal(text: string): Promise<string> {\n const stream = this.platform.stream;\n if (stream && this.state.streamActive && this.state.responseId !== null) {\n let streamed = false;\n try {\n if (text.startsWith(this.state.streamedSource)) {\n const delta = text.slice(this.state.streamedSource.length);\n if (delta) await stream.append(this.state.responseId, delta);\n await stream.stop(this.state.responseId);\n streamed = true;\n }\n } catch (err) {\n this.state.streamUnavailable = true;\n log.logWarning(\n \"Native response streaming unavailable; falling back to message updates\",\n err instanceof Error ? err.message : String(err),\n );\n }\n this.state.streamActive = false;\n this.state.streamedSource = \"\";\n if (streamed) {\n if (this.platform.needsCanonicalRender?.(text)) await this.renderRaw(text, \"render\");\n return text;\n }\n await this.abandonNativeStream();\n }\n if (this.state.responseId !== null || text) return this.renderRaw(text, \"render\");\n return text;\n }\n\n private async run(\n label: string,\n operation: ChatResponseErrorOperation,\n work: () => Promise<void>,\n extra: () => Record<string, unknown>,\n ): Promise<void> {\n const operationPromise = this.queueTail.then(work);\n const handled = operationPromise.catch(async (err) => {\n const message = err instanceof Error ? err.message : String(err);\n log.logWarning(`${this.platform.label} ${label} error`, message);\n this.reportResponseError?.(err, operation, extra());\n if (this.platform.notifySendFailure) {\n try {\n await this.platform.notifySendFailure(message);\n } catch {\n // A secondary notification must not poison the response queue.\n }\n }\n // Incremental/status updates are best effort. Replacements and finalization\n // are delivery boundaries: callers must not mistake a rejected send for success.\n if (label === \"replaceResponse\" || label === \"finishResponse\") throw err;\n });\n this.queueTail = handled.catch(() => undefined);\n return handled;\n }\n\n private async appendDelta(delta: string): Promise<void> {\n await this.run(\n \"appendResponseDelta\",\n \"respond\",\n async () => {\n if (!delta) return;\n if (this.state.resetDelta) {\n this.state.source = \"\";\n this.state.pendingChars = 0;\n this.state.resetDelta = false;\n }\n const sanitized = this.sanitize(delta);\n this.state.source += sanitized;\n this.state.pendingChars += sanitized.length;\n const elapsed = this.now() - this.state.lastFlushAt;\n if (\n this.state.lastFlushAt === 0 ||\n (elapsed >= this.flushIntervalMs && this.state.pendingChars > 0)\n ) {\n this.state.pendingChars = 0;\n try {\n this.state.source = await this.renderDelta(this.state.source);\n } finally {\n // A rejected edit still spent an API call. Pace subsequent deltas\n // from its completion too, retaining source for the next attempt.\n this.state.lastFlushAt = this.now();\n }\n }\n },\n () => ({ textLength: delta.length, accumulatedLength: this.state.source.length }),\n );\n }\n\n private async respond(text: string): Promise<void> {\n await this.run(\n \"respond\",\n \"respond\",\n async () => {\n const sanitized = this.sanitize(text);\n this.state.source = this.state.source ? `${this.state.source}\\n${sanitized}` : sanitized;\n this.state.pendingChars = 0;\n this.state.source = await this.renderDelta(this.state.source);\n if (this.state.responseId !== null && this.platform.logIntermediateResponses) {\n this.platform.logBotResponse?.(text, this.state.responseId);\n }\n },\n () => ({\n phase: this.state.responseId ? \"update\" : \"initial_post\",\n textLength: text.length,\n accumulatedLength: this.state.source.length,\n }),\n );\n }\n\n private async finishResponse(finalText?: string): Promise<void> {\n await this.run(\n \"finishResponse\",\n \"set_working\",\n async () => {\n if (finalText !== undefined) this.state.source = this.sanitize(finalText);\n this.state.resetDelta = false;\n this.state.pendingChars = 0;\n this.stopTyping();\n this.state.working = false;\n this.state.source = await this.renderFinal(this.state.source);\n if (this.state.responseId !== null) {\n this.platform.logBotResponse?.(this.state.source, this.state.responseId);\n }\n await this.platform.onFinish?.(this.state.source, this.state.responseId);\n },\n () => ({ finalTextLength: finalText?.length }),\n );\n }\n\n private async replaceResponse(\n text: string,\n options?: { createOverflowLink?: () => string },\n ): Promise<void> {\n await this.run(\n \"replaceResponse\",\n \"replace_response\",\n async () => {\n this.state.source = this.sanitize(text);\n this.state.pendingChars = 0;\n this.state.resetDelta = true;\n if (this.state.streamActive) await this.stopNativeStream();\n if (this.state.working && !this.state.source.trim()) return;\n const prepared =\n this.platform.prepareSource?.(this.state.source, this.state.working) ?? this.state.source;\n this.state.source = await this.renderRaw(\n this.provisional(prepared, this.state.working),\n \"replace\",\n options,\n prepared,\n );\n },\n () => ({ textLength: text.length, hadExistingResponse: Boolean(this.state.responseId) }),\n );\n }\n\n private async replaceSubagentProgress(\n progress: SubagentProgressSnapshot,\n finalText?: string,\n ): Promise<void> {\n const dashboard = this.platform.formatSubagentProgress!(progress);\n await this.responder.replaceResponse(finalText ? `${dashboard}\\n\\n${finalText}` : dashboard);\n }\n\n private async respondDiagnostic(\n text: string,\n options: { style?: \"muted\" | \"error\" } = {},\n ): Promise<void> {\n await this.run(\n \"respondDiagnostic\",\n \"respond_diagnostic\",\n async () => {\n const ids = this.platform.postDiagnostic\n ? await this.platform.postDiagnostic(text, options, this.state.responseId)\n : await this.postDefaultDiagnostic(text, options);\n this.state.extraIds.push(...ids);\n },\n () => ({ textLength: text.length, style: options.style }),\n );\n }\n\n private async respondToolResult(result: ChatToolResult): Promise<void> {\n await this.responder.respondDiagnostic(this.platform.formatToolResult(result));\n }\n\n private async setTyping(isTyping: boolean): Promise<void> {\n await this.run(\n \"setTyping\",\n \"set_working\",\n async () => {\n if (this.platform.setTyping) {\n await this.platform.setTyping(isTyping, this.state.responseId);\n return;\n }\n const typing = this.platform.typing;\n if (!typing) return;\n const onTypingError = (err: unknown): void => {\n if (this.state.typingFailureWarned) return;\n this.state.typingFailureWarned = true;\n log.logWarning(\n `${this.platform.label} sendTyping failed (further occurrences suppressed for this session)`,\n err instanceof Error ? err.message : String(err),\n );\n };\n if (isTyping && this.state.typingInterval === null) {\n typing.send().catch(onTypingError);\n this.state.typingInterval = setInterval(() => {\n typing.send().catch(onTypingError);\n }, typing.intervalMs);\n } else if (!isTyping) {\n this.stopTyping();\n }\n },\n () => ({ working: isTyping }),\n );\n }\n\n private async setWorking(working: boolean): Promise<void> {\n await this.run(\n \"setWorking\",\n \"set_working\",\n async () => {\n this.state.working = working;\n if (!working) this.stopTyping();\n await this.platform.onWorkingChanged?.(working, this.state.responseId);\n if (\n this.state.responseId === null ||\n (!this.platform.workingIndicator && !this.platform.stream)\n ) {\n return;\n }\n if (working && !this.state.source.trim()) return;\n if (this.state.streamActive && !working) {\n await this.stopNativeStream();\n return;\n }\n if (this.state.responseId !== null) {\n this.state.source = await this.renderRaw(\n this.provisional(this.state.source, working),\n \"render\",\n undefined,\n this.state.source,\n );\n }\n },\n () => ({ working }),\n );\n }\n\n private async uploadFile(filePath: string, title?: string): Promise<void> {\n if (this.platform.uploadFile) {\n await this.platform.uploadFile(filePath, title);\n return;\n }\n const note = this.platform.uploadFallbackNote?.(title ?? filePath);\n if (note === undefined) return;\n await this.run(\n \"uploadFile\",\n \"respond_diagnostic\",\n () => this.postExtra(note),\n () => ({ filePath }),\n );\n }\n\n private async deleteResponse(): Promise<void> {\n await this.run(\n \"deleteResponse\",\n \"respond\",\n async () => {\n this.stopTyping();\n if (this.state.streamActive) await this.stopNativeStream().catch(() => undefined);\n for (const id of [...this.state.extraIds, ...this.state.continuationIds]) {\n try {\n await this.platform.deleteExtra?.(id);\n } catch {\n // Deleting diagnostics is best effort.\n }\n }\n this.state.extraIds = [];\n this.state.continuationIds = [];\n if (this.state.responseId !== null) {\n try {\n await this.platform.delete?.(this.state.responseId);\n } catch {\n // Deleting the main response is best effort.\n }\n }\n this.state.responseId = null;\n this.state.source = \"\";\n this.state.streamUnavailable = false;\n this.state.streamedSource = \"\";\n this.state.streamActive = false;\n this.state.resetDelta = false;\n this.state.working = true;\n },\n () => ({}),\n );\n }\n\n private async postDefaultDiagnostic(\n text: string,\n options: { style?: \"muted\" | \"error\" },\n ): Promise<Array<string | number>> {\n const prefix = options.style === \"error\" ? this.platform.errorPrefix : \"\";\n const ids: Array<string | number> = [];\n for (const part of this.split(this.sanitize(`${prefix}${text}`))) {\n const id = await this.platform.postExtra(part, this.state.responseId);\n if (typeof id === \"string\" || typeof id === \"number\") ids.push(id);\n }\n return ids;\n }\n}\n\nexport function createProgressiveRenderer(platform: ProgressiveRendererPlatform): {\n responder: ConversationResponder;\n} {\n return { responder: new ProgressiveRenderer(platform).responder };\n}\n"]}
1
+ {"version":3,"file":"progressive-renderer.js","sourceRoot":"","sources":["../../src/adapters/progressive-renderer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ChatToolResult, ConversationResponder, SubagentProgressSnapshot } from \"./index.js\";\nimport * as log from \"../log.js\";\nimport {\n createChatResponseErrorReporter,\n formatToolArgs,\n splitText,\n type ChatResponseErrorOperation,\n} from \"./shared.js\";\nimport type { ProgressiveRendererPlatform } from \"./types.js\";\n\nexport function formatMarkdownToolResult(result: ChatToolResult): string {\n const argsFormatted = formatToolArgs(result.args);\n const duration = (result.durationMs / 1000).toFixed(1);\n let text = `**${result.isError ? \"Error\" : \"Done\"} ${result.toolName}**`;\n if (result.label) text += `: ${result.label}`;\n text += ` (${duration}s)\\n`;\n if (argsFormatted) text += `\\`\\`\\`\\n${argsFormatted}\\n\\`\\`\\`\\n`;\n text += `**Result:**\\n\\`\\`\\`\\n${result.result}\\n\\`\\`\\``;\n return text;\n}\n\ninterface RendererState {\n responseId: string | null;\n source: string;\n working: boolean;\n streamActive: boolean;\n streamUnavailable: boolean;\n streamedSource: string;\n pendingChars: number;\n lastFlushAt: number;\n resetDelta: boolean;\n typingInterval: ReturnType<typeof setInterval> | null;\n typingFailureWarned: boolean;\n extraIds: Array<string | number>;\n /**\n * Messages holding the overflow of a response too long for one message,\n * in order. Reused across redraws — see `postSplit`.\n */\n continuationIds: Array<string | number>;\n}\n\n/**\n * Floor on how often a streaming response redraws.\n *\n * Every platform meters edits per channel — Slack's is the tightest at roughly\n * fifty a minute — and a redraw sends the whole message, so the cost is the\n * number of calls, not their size. One second keeps a long answer inside that\n * budget while still reading as live.\n *\n * This is a floor, not a target: the interval is measured from when the last\n * redraw *finished*, so a platform that slows down under load slows the redraw\n * rate with it instead of queueing work it cannot deliver.\n */\nconst DEFAULT_FLUSH_INTERVAL_MS = 1000;\n\nclass ProgressiveRenderer {\n readonly responder: ConversationResponder;\n private readonly state: RendererState;\n private readonly sanitize: (text: string) => string;\n private readonly reportResponseError;\n private readonly now = Date.now;\n private readonly flushIntervalMs: number;\n private queueTail = Promise.resolve();\n\n constructor(private readonly platform: ProgressiveRendererPlatform) {\n this.state = {\n responseId: platform.initialResponseId ?? null,\n source: \"\",\n working: true,\n streamActive: false,\n streamUnavailable: false,\n streamedSource: \"\",\n pendingChars: 0,\n lastFlushAt: 0,\n resetDelta: false,\n typingInterval: null,\n typingFailureWarned: false,\n extraIds: [],\n continuationIds: [],\n };\n this.sanitize = platform.sanitize ?? ((text: string) => text);\n this.reportResponseError = platform.responseErrorContext\n ? createChatResponseErrorReporter(() => platform.responseErrorContext!(this.state.responseId))\n : undefined;\n this.flushIntervalMs = platform.flushIntervalMs ?? DEFAULT_FLUSH_INTERVAL_MS;\n this.responder = this.createResponder();\n }\n\n private createResponder(): ConversationResponder {\n return {\n respond: (text) => this.respond(text),\n appendResponseDelta:\n this.platform.supportsDeltas || this.platform.stream\n ? (delta) => this.appendDelta(delta)\n : undefined,\n finishResponse:\n this.platform.supportsDeltas || this.platform.stream\n ? (finalText) => this.finishResponse(finalText)\n : undefined,\n replaceResponse: (text, options) => this.replaceResponse(text, options),\n replaceSubagentProgress: this.platform.formatSubagentProgress\n ? (progress, finalText) => this.replaceSubagentProgress(progress, finalText)\n : undefined,\n respondDiagnostic: (text, options) => this.respondDiagnostic(text, options),\n respondToolResult: (result) => this.respondToolResult(result),\n setTyping: (isTyping) => this.setTyping(isTyping),\n setWorking: (working) => this.setWorking(working),\n uploadFile: (filePath, title) => this.uploadFile(filePath, title),\n ...(this.platform.react ? { react: this.platform.react } : {}),\n deleteResponse: () => this.deleteResponse(),\n };\n }\n\n private stopTyping(): void {\n if (this.state.typingInterval !== null) {\n clearInterval(this.state.typingInterval);\n this.state.typingInterval = null;\n }\n }\n\n private provisional(text: string, working: boolean): string {\n if (this.platform.formatProvisional) return this.platform.formatProvisional(text, working);\n return working && this.platform.workingIndicator ? text + this.platform.workingIndicator : text;\n }\n\n private split(text: string): string[] {\n return splitText(text, this.platform.maxLength, this.platform.formatContinuation);\n }\n\n private async postOrUpdate(text: string): Promise<void> {\n if (this.state.responseId !== null) {\n await this.platform.update(this.state.responseId, text);\n return;\n }\n if (this.platform.typing?.stopOnSend) this.stopTyping();\n this.state.responseId = await this.platform.post(text);\n }\n\n private async postSplit(text: string): Promise<void> {\n const [head = text, ...tail] = this.split(text);\n await this.postOrUpdate(head);\n for (const [index, part] of tail.entries()) {\n const existing = this.state.continuationIds[index];\n if (existing !== undefined) {\n await this.platform.update(String(existing), part);\n continue;\n }\n if (this.platform.typing?.stopOnSend) this.stopTyping();\n const id = await this.platform.postExtra(part, this.state.responseId);\n if (id !== undefined && id !== null) this.state.continuationIds[index] = id;\n }\n }\n\n private async postExtra(text: string): Promise<void> {\n if (this.platform.typing?.stopOnSend) this.stopTyping();\n await this.platform.postExtra(text, this.state.responseId);\n }\n\n private async stopNativeStream(): Promise<void> {\n if (!this.state.streamActive || this.state.responseId === null || !this.platform.stream) return;\n const streamId = this.state.responseId;\n this.state.streamActive = false;\n this.state.streamedSource = \"\";\n await this.platform.stream.stop(streamId);\n }\n\n private async abandonNativeStream(): Promise<void> {\n if (!this.platform.stream || this.state.responseId === null) return;\n const streamId = this.state.responseId;\n this.state.streamActive = false;\n this.state.streamedSource = \"\";\n await this.platform.stream.stop(streamId).catch(() => undefined);\n if (this.state.responseId === streamId) this.state.responseId = null;\n }\n\n private async renderRaw(\n text: string,\n operation: \"render\" | \"replace\",\n options?: { createOverflowLink?: () => string },\n canonicalText = text,\n ): Promise<string> {\n try {\n await this.postSplit(text);\n return canonicalText;\n } catch (err) {\n if (!this.platform.handleTooLong) throw err;\n if (this.platform.isTooLongError && !this.platform.isTooLongError(err)) throw err;\n const fallback = await this.platform.handleTooLong({\n text: canonicalText,\n operation,\n options,\n responseId: this.state.responseId,\n write: (fallbackText) => this.postSplit(fallbackText),\n getResponseId: () => this.state.responseId,\n });\n return fallback.text;\n }\n }\n\n private async renderDelta(text: string): Promise<string> {\n if (this.state.working && !text.trim()) return text;\n const prepared = this.platform.prepareSource?.(text, this.state.working) ?? text;\n const stream = this.platform.stream;\n const display = this.provisional(prepared, this.state.working);\n if (!stream || this.state.streamUnavailable) {\n await this.renderRaw(display, \"render\", undefined, prepared);\n return prepared;\n }\n if (this.state.responseId !== null && !this.state.streamActive) {\n await this.renderRaw(display, \"render\", undefined, prepared);\n return prepared;\n }\n if (\n this.state.responseId !== null &&\n this.state.streamActive &&\n !prepared.startsWith(this.state.streamedSource)\n ) {\n await this.abandonNativeStream();\n await this.renderRaw(display, \"render\", undefined, prepared);\n return prepared;\n }\n\n try {\n if (this.state.responseId !== null) {\n const delta = prepared.slice(this.state.streamedSource.length);\n if (delta && delta.length >= (stream.minDeltaChars ?? 0)) {\n await stream.append(this.state.responseId, delta);\n this.state.streamedSource = prepared;\n }\n return prepared;\n }\n this.state.responseId = await stream.start(prepared);\n this.state.streamActive = true;\n this.state.streamedSource = prepared;\n return prepared;\n } catch (err) {\n this.state.streamUnavailable = true;\n log.logWarning(\n \"Native response streaming unavailable; falling back to message updates\",\n err instanceof Error ? err.message : String(err),\n );\n await this.abandonNativeStream();\n await this.renderRaw(display, \"render\", undefined, prepared);\n return prepared;\n }\n }\n\n private async renderFinal(text: string): Promise<string> {\n const stream = this.platform.stream;\n if (stream && this.state.streamActive && this.state.responseId !== null) {\n let streamed = false;\n try {\n if (text.startsWith(this.state.streamedSource)) {\n const delta = text.slice(this.state.streamedSource.length);\n if (delta) await stream.append(this.state.responseId, delta);\n await stream.stop(this.state.responseId);\n streamed = true;\n }\n } catch (err) {\n this.state.streamUnavailable = true;\n log.logWarning(\n \"Native response streaming unavailable; falling back to message updates\",\n err instanceof Error ? err.message : String(err),\n );\n }\n this.state.streamActive = false;\n this.state.streamedSource = \"\";\n if (streamed) {\n if (this.platform.needsCanonicalRender?.(text)) await this.renderRaw(text, \"render\");\n return text;\n }\n await this.abandonNativeStream();\n }\n if (this.state.responseId !== null || text) return this.renderRaw(text, \"render\");\n return text;\n }\n\n private async run(\n label: string,\n operation: ChatResponseErrorOperation,\n work: () => Promise<void>,\n extra: () => Record<string, unknown>,\n ): Promise<void> {\n const operationPromise = this.queueTail.then(work);\n const handled = operationPromise.catch(async (err) => {\n const message = err instanceof Error ? err.message : String(err);\n log.logWarning(`${this.platform.label} ${label} error`, message);\n this.reportResponseError?.(err, operation, extra());\n if (this.platform.notifySendFailure) {\n try {\n await this.platform.notifySendFailure(message);\n } catch {\n // A secondary notification must not poison the response queue.\n }\n }\n // Incremental/status updates are best effort. Replacements and finalization\n // are delivery boundaries: callers must not mistake a rejected send for success.\n if (label === \"replaceResponse\" || label === \"finishResponse\") throw err;\n });\n this.queueTail = handled.catch(() => undefined);\n return handled;\n }\n\n private async appendDelta(delta: string): Promise<void> {\n await this.run(\n \"appendResponseDelta\",\n \"respond\",\n async () => {\n if (!delta) return;\n if (this.state.resetDelta) {\n this.state.source = \"\";\n this.state.pendingChars = 0;\n this.state.resetDelta = false;\n }\n const sanitized = this.sanitize(delta);\n this.state.source += sanitized;\n this.state.pendingChars += sanitized.length;\n const elapsed = this.now() - this.state.lastFlushAt;\n if (\n this.state.lastFlushAt === 0 ||\n (elapsed >= this.flushIntervalMs && this.state.pendingChars > 0)\n ) {\n this.state.pendingChars = 0;\n try {\n this.state.source = await this.renderDelta(this.state.source);\n } finally {\n // A rejected edit still spent an API call. Pace subsequent deltas\n // from its completion too, retaining source for the next attempt.\n this.state.lastFlushAt = this.now();\n }\n }\n },\n () => ({ textLength: delta.length, accumulatedLength: this.state.source.length }),\n );\n }\n\n private async respond(text: string): Promise<void> {\n await this.run(\n \"respond\",\n \"respond\",\n async () => {\n const sanitized = this.sanitize(text);\n this.state.source = this.state.source ? `${this.state.source}\\n${sanitized}` : sanitized;\n this.state.pendingChars = 0;\n this.state.source = await this.renderDelta(this.state.source);\n if (this.state.responseId !== null && this.platform.logIntermediateResponses) {\n this.platform.logBotResponse?.(text, this.state.responseId);\n }\n },\n () => ({\n phase: this.state.responseId ? \"update\" : \"initial_post\",\n textLength: text.length,\n accumulatedLength: this.state.source.length,\n }),\n );\n }\n\n private async finishResponse(finalText?: string): Promise<void> {\n await this.run(\n \"finishResponse\",\n \"set_working\",\n async () => {\n if (finalText !== undefined) this.state.source = this.sanitize(finalText);\n this.state.resetDelta = false;\n this.state.pendingChars = 0;\n this.stopTyping();\n this.state.working = false;\n this.state.source = await this.renderFinal(this.state.source);\n if (this.state.responseId !== null) {\n this.platform.logBotResponse?.(this.state.source, this.state.responseId);\n }\n await this.platform.onFinish?.(this.state.source, this.state.responseId);\n },\n () => ({ finalTextLength: finalText?.length }),\n );\n }\n\n private async replaceResponse(\n text: string,\n options?: { createOverflowLink?: () => string },\n ): Promise<void> {\n await this.run(\n \"replaceResponse\",\n \"replace_response\",\n async () => {\n this.state.source = this.sanitize(text);\n this.state.pendingChars = 0;\n this.state.resetDelta = true;\n if (this.state.streamActive) await this.stopNativeStream();\n if (this.state.working && !this.state.source.trim()) return;\n const prepared =\n this.platform.prepareSource?.(this.state.source, this.state.working) ?? this.state.source;\n this.state.source = await this.renderRaw(\n this.provisional(prepared, this.state.working),\n \"replace\",\n options,\n prepared,\n );\n },\n () => ({ textLength: text.length, hadExistingResponse: Boolean(this.state.responseId) }),\n );\n }\n\n private async replaceSubagentProgress(\n progress: SubagentProgressSnapshot,\n finalText?: string,\n ): Promise<void> {\n const dashboard = this.platform.formatSubagentProgress!(progress);\n await this.responder.replaceResponse(finalText ? `${dashboard}\\n\\n${finalText}` : dashboard);\n }\n\n private async respondDiagnostic(\n text: string,\n options: { style?: \"muted\" | \"error\" } = {},\n ): Promise<void> {\n await this.run(\n \"respondDiagnostic\",\n \"respond_diagnostic\",\n async () => {\n const ids = this.platform.postDiagnostic\n ? await this.platform.postDiagnostic(text, options, this.state.responseId)\n : await this.postDefaultDiagnostic(text, options);\n this.state.extraIds.push(...ids);\n },\n () => ({ textLength: text.length, style: options.style }),\n );\n }\n\n private async respondToolResult(result: ChatToolResult): Promise<void> {\n await this.responder.respondDiagnostic(this.platform.formatToolResult(result));\n }\n\n private async setTyping(isTyping: boolean): Promise<void> {\n await this.run(\n \"setTyping\",\n \"set_working\",\n async () => {\n if (this.platform.setTyping) {\n await this.platform.setTyping(isTyping, this.state.responseId);\n return;\n }\n const typing = this.platform.typing;\n if (!typing) return;\n const onTypingError = (err: unknown): void => {\n if (this.state.typingFailureWarned) return;\n this.state.typingFailureWarned = true;\n log.logWarning(\n `${this.platform.label} sendTyping failed (further occurrences suppressed for this session)`,\n err instanceof Error ? err.message : String(err),\n );\n };\n if (isTyping && this.state.typingInterval === null) {\n typing.send().catch(onTypingError);\n this.state.typingInterval = setInterval(() => {\n typing.send().catch(onTypingError);\n }, typing.intervalMs);\n } else if (!isTyping) {\n this.stopTyping();\n }\n },\n () => ({ working: isTyping }),\n );\n }\n\n private async setWorking(working: boolean): Promise<void> {\n await this.run(\n \"setWorking\",\n \"set_working\",\n async () => {\n this.state.working = working;\n if (!working) this.stopTyping();\n await this.platform.onWorkingChanged?.(working, this.state.responseId);\n if (\n this.state.responseId === null ||\n (!this.platform.workingIndicator && !this.platform.stream)\n ) {\n return;\n }\n if (working && !this.state.source.trim()) return;\n if (this.state.streamActive && !working) {\n await this.stopNativeStream();\n return;\n }\n if (this.state.responseId !== null) {\n this.state.source = await this.renderRaw(\n this.provisional(this.state.source, working),\n \"render\",\n undefined,\n this.state.source,\n );\n }\n },\n () => ({ working }),\n );\n }\n\n private async uploadFile(filePath: string, title?: string): Promise<void> {\n if (this.platform.uploadFile) {\n await this.platform.uploadFile(filePath, title);\n return;\n }\n const note = this.platform.uploadFallbackNote?.(title ?? filePath);\n if (note === undefined) return;\n await this.run(\n \"uploadFile\",\n \"respond_diagnostic\",\n () => this.postExtra(note),\n () => ({ filePath }),\n );\n }\n\n private async deleteResponse(): Promise<void> {\n await this.run(\n \"deleteResponse\",\n \"respond\",\n async () => {\n this.stopTyping();\n if (this.state.streamActive) await this.stopNativeStream().catch(() => undefined);\n for (const id of [...this.state.extraIds, ...this.state.continuationIds]) {\n try {\n await this.platform.deleteExtra?.(id);\n } catch {\n // Deleting diagnostics is best effort.\n }\n }\n this.state.extraIds = [];\n this.state.continuationIds = [];\n if (this.state.responseId !== null) {\n try {\n await this.platform.delete?.(this.state.responseId);\n } catch {\n // Deleting the main response is best effort.\n }\n }\n this.state.responseId = null;\n this.state.source = \"\";\n this.state.streamUnavailable = false;\n this.state.streamedSource = \"\";\n this.state.streamActive = false;\n this.state.resetDelta = false;\n this.state.working = true;\n },\n () => ({}),\n );\n }\n\n private async postDefaultDiagnostic(\n text: string,\n options: { style?: \"muted\" | \"error\" },\n ): Promise<Array<string | number>> {\n const prefix = options.style === \"error\" ? this.platform.errorPrefix : \"\";\n const ids: Array<string | number> = [];\n for (const part of this.split(this.sanitize(`${prefix}${text}`))) {\n const id = await this.platform.postExtra(part, this.state.responseId);\n if (typeof id === \"string\" || typeof id === \"number\") ids.push(id);\n }\n return ids;\n }\n}\n\nexport function createProgressiveRenderer(platform: ProgressiveRendererPlatform): {\n responder: ConversationResponder;\n} {\n return { responder: new ProgressiveRenderer(platform).responder };\n}\n"]}
@@ -6,7 +6,7 @@
6
6
  * The split/normalize logic itself doesn't differ across platforms — only the
7
7
  * markup wrappers — so it lives here once.
8
8
  */
9
- import type { MessagingEventHandler, OfficeAddress } from "../adapter.js";
9
+ import type { MessagingEventHandler, OfficeAddress } from "./index.js";
10
10
  import { type Office } from "../office/index.js";
11
11
  export type { ChatResponseErrorContext, ChatResponseErrorOperation, ChatResponseErrorReporter, IncomingAttachment, ResolveStopTargetInput, RetryOptions, SavedAttachments, } from "./types.js";
12
12
  import type { ChatResponseErrorContext, ChatResponseErrorReporter, IncomingAttachment, RetryOptions, ResolveStopTargetInput, SavedAttachments } from "./types.js";
@@ -88,4 +88,6 @@ export declare function formatToolArgs(args: Record<string, unknown> | undefined
88
88
  * directories as needed. Throws on non-2xx responses or write failures.
89
89
  */
90
90
  export declare function downloadUrlToFile(url: string, destPath: string): Promise<void>;
91
+ /** Translate a Slack-style short name (colons optional) to Unicode; passes through anything else. */
92
+ export declare function shortNameToUnicodeEmoji(emoji: string): string;
91
93
  //# sourceMappingURL=shared.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/adapters/shared.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/adapters/shared.ts"],"names":[],"mappings":"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"}
@@ -286,4 +286,29 @@ export async function downloadUrlToFile(url, destPath) {
286
286
  await mkdir(dirname(destPath), { recursive: true });
287
287
  await writeFile(destPath, Buffer.from(buffer));
288
288
  }
289
+ /**
290
+ * Slack-style short names (as the `react` tool and prompt use) to Unicode
291
+ * emoji, for platforms whose reaction API takes a Unicode character rather
292
+ * than a name (Discord, Telegram). Covers what the system prompt actually
293
+ * recommends plus a few other common names; an unmapped name passes through
294
+ * unchanged so an unsupported reaction fails visibly at the platform call
295
+ * instead of silently.
296
+ */
297
+ const SHORT_NAME_TO_UNICODE_EMOJI = {
298
+ saluting_face: "\u{1FAE1}",
299
+ eyes: "\u{1F440}",
300
+ white_check_mark: "\u{2705}",
301
+ "+1": "\u{1F44D}",
302
+ thumbsup: "\u{1F44D}",
303
+ "-1": "\u{1F44E}",
304
+ thumbsdown: "\u{1F44E}",
305
+ heart: "\u{2764}",
306
+ tada: "\u{1F389}",
307
+ rocket: "\u{1F680}",
308
+ };
309
+ /** Translate a Slack-style short name (colons optional) to Unicode; passes through anything else. */
310
+ export function shortNameToUnicodeEmoji(emoji) {
311
+ const name = emoji.replace(/^:|:$/g, "");
312
+ return SHORT_NAME_TO_UNICODE_EMOJI[name] ?? emoji;
313
+ }
289
314
  //# sourceMappingURL=shared.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/adapters/shared.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Helpers shared across platform adapters.\n *\n * The agent runner is platform-agnostic: it hands strings and structured tool\n * results to each adapter, which decides how to split, format, and route them.\n * The split/normalize logic itself doesn't differ across platforms — only the\n * markup wrappers — so it lives here once.\n */\n\nimport { appendFileSync } from \"node:fs\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport type { MessagingEventHandler, OfficeAddress } from \"../adapter.js\";\nimport { sameOffice, type Office } from \"../office/index.js\";\nimport * as log from \"../log.js\";\nimport { reportUserFacingError } from \"../observability/index.js\";\nexport type {\n ChatResponseErrorContext,\n ChatResponseErrorOperation,\n ChatResponseErrorReporter,\n IncomingAttachment,\n ResolveStopTargetInput,\n RetryOptions,\n SavedAttachments,\n} from \"./types.js\";\nimport type {\n ChatResponseErrorContext,\n ChatResponseErrorReporter,\n IncomingAttachment,\n RetryOptions,\n ResolveStopTargetInput,\n SavedAttachments,\n} from \"./types.js\";\n\nexport function createChatResponseErrorReporter(\n resolve: () => Omit<ChatResponseErrorContext, \"operation\" | \"extra\">,\n): ChatResponseErrorReporter {\n return (err, operation, extra) => {\n reportChatResponseError(err, { ...resolve(), operation, extra });\n };\n}\n\nfunction reportChatResponseError(err: unknown, context: ChatResponseErrorContext): void {\n reportUserFacingError(err, {\n domain: \"chat_platform\",\n surface: \"chat_response\",\n operation: context.operation,\n severity: context.operation === \"set_working\" ? \"warning\" : \"error\",\n platform: context.platform,\n context: {\n conversationId: context.conversationId,\n channelId: context.channelId,\n chatId: context.chatId,\n messageId: context.messageId,\n sessionKey: context.sessionKey,\n responseMessageId: context.responseMessageId,\n threadTs: context.threadTs,\n replyTargetId: context.replyTargetId,\n replyToId: context.replyToId,\n conversationKind: context.conversationKind,\n isThreaded: context.isThreaded,\n ...context.extra,\n },\n });\n}\n\nexport class MessagingIntakeTracker {\n private accepting = true;\n private active = new Set<Promise<void>>();\n\n constructor(private readonly name: string) {}\n\n run(work: () => Promise<void> | void): Promise<void> {\n if (!this.accepting) return Promise.resolve();\n let result: Promise<void> | void;\n try {\n result = work();\n } catch (error) {\n result = Promise.reject(error);\n }\n const task = Promise.resolve(result).catch((error) => {\n log.logWarning(\n `${this.name} intake error`,\n error instanceof Error ? error.message : String(error),\n );\n });\n this.active.add(task);\n return task.finally(() => this.active.delete(task));\n }\n\n async close(): Promise<void> {\n this.accepting = false;\n await Promise.allSettled(this.active);\n }\n}\n\nexport class MessagingEventQueue {\n private queue: Array<() => Promise<void>> = [];\n private processing = false;\n private accepting = true;\n private drainWaiters: Array<() => void> = [];\n\n constructor(private readonly name: string = \"\") {}\n\n enqueue(work: () => Promise<void>): boolean {\n if (!this.accepting) return false;\n this.queue.push(work);\n this.processNext();\n return true;\n }\n\n size(): number {\n return this.queue.length;\n }\n\n close(): Promise<void> {\n this.accepting = false;\n if (!this.processing && this.queue.length === 0) return Promise.resolve();\n return new Promise((resolve) => this.drainWaiters.push(resolve));\n }\n\n private async processNext(): Promise<void> {\n if (this.processing || this.queue.length === 0) return;\n this.processing = true;\n const work = this.queue.shift()!;\n try {\n await work();\n } catch (err) {\n log.logWarning(\n `${this.name ? this.name + \" \" : \"\"}queue error`,\n err instanceof Error ? err.message : String(err),\n );\n }\n this.processing = false;\n if (this.queue.length > 0) {\n this.processNext();\n return;\n }\n for (const resolve of this.drainWaiters.splice(0)) resolve();\n }\n}\n\n// RetryOptions is defined in ./types.ts and re-exported from the top of this file.\n\n/**\n * Run `fn` and retry with exponential backoff when its error matches\n * `isRateLimited`. Other errors propagate immediately. Each platform supplies\n * its own predicate so we don't have to know every SDK's error shape here.\n */\nexport async function withRetry<T>(fn: () => Promise<T>, opts: RetryOptions): Promise<T> {\n const maxAttempts = opts.maxAttempts ?? 3;\n const baseDelayMs = opts.baseDelayMs ?? 1000;\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (err) {\n lastError = err instanceof Error ? err : new Error(String(err));\n\n const isLastAttempt = attempt === maxAttempts - 1;\n if (isLastAttempt || !opts.isRateLimited(lastError)) {\n throw lastError;\n }\n\n const delay = baseDelayMs * Math.pow(2, attempt);\n log.logWarning(\n `Retrying after error in ${delay}ms (attempt ${attempt + 1}/${maxAttempts}): ${lastError.message}`,\n );\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n throw lastError;\n}\n\n/**\n * Split `text` into chunks no larger than `limit`, appending a continuation\n * marker (e.g. `_(continued 1)_`) at the end of every part except the last.\n *\n * Each adapter passes its own `formatContinuation` so the marker uses the\n * platform's italic / emphasis convention.\n */\nexport function splitText(\n text: string,\n limit: number,\n formatContinuation: (partNum: number) => string,\n): string[] {\n if (text.length <= limit) return [text];\n const parts: string[] = [];\n let remaining = text;\n let partNum = 1;\n while (remaining.length > 0) {\n const suffixReserve = formatContinuation(partNum).length + 8;\n const chunkLimit = Math.max(1, limit - suffixReserve);\n const chunk = remaining.slice(0, chunkLimit);\n remaining = remaining.slice(chunkLimit);\n const suffix = remaining.length > 0 ? `\\n${formatContinuation(partNum)}` : \"\";\n parts.push(chunk + suffix);\n partNum++;\n }\n return parts;\n}\n\n/**\n * Append a JSON-serializable entry to the office's `log.jsonl`,\n * materializing the office on first use. This is the single write path every\n * adapter uses for human-readable message history.\n */\nexport function appendChannelLog(office: Office, entry: object): void {\n office.ensure();\n appendFileSync(office.logPath, `${JSON.stringify(entry)}\\n`);\n}\n\n/**\n * Save incoming platform files under the office's attachments directory.\n *\n * The one owner of the attachment convention: sanitized\n * `<timestamp>_<name>` filenames, the `<office key>/attachments/<file>`\n * workspace-relative localPath the agent reads, and office materialization\n * before the first write. Download mechanics and failure policy stay with\n * the adapter — failures come back in `failed` for the caller to throw or\n * warn about, matching its platform's behavior.\n */\nexport async function saveIncomingAttachments(\n office: Office,\n items: readonly IncomingAttachment[],\n): Promise<SavedAttachments> {\n if (items.length === 0) return { saved: [], failed: [] };\n // Attachment downloads can be the office's first write; materialize (and\n // register) it before composing office-relative attachment paths.\n office.ensure();\n await mkdir(office.attachmentsDir, { recursive: true });\n\n // Results keep the caller's item order regardless of download completion\n // order — platform message logs list attachments as the platform sent them.\n const results = await Promise.all(\n items.map(async (item) => {\n const sanitized = item.name.replace(/[^a-zA-Z0-9._-]/g, \"_\");\n const filename = `${item.timestampMs ?? Date.now()}_${sanitized}`;\n try {\n await item.download(join(office.attachmentsDir, filename));\n return {\n saved: { original: item.name, localPath: `${office.key}/attachments/${filename}` },\n };\n } catch (error) {\n return { failed: { name: item.name, error } };\n }\n }),\n );\n return {\n saved: results.flatMap((result) => (result.saved ? [result.saved] : [])),\n failed: results.flatMap((result) => (result.failed ? [result.failed] : [])),\n };\n}\n\n/** Convenience for appending the bot's own outbound message. */\nexport function appendBotResponseLog(\n office: Office,\n text: string,\n ts: string,\n threadTs?: string,\n extraFields: Record<string, unknown> = {},\n): void {\n appendChannelLog(office, {\n date: new Date().toISOString(),\n ts,\n ...(threadTs ? { threadTs } : {}),\n user: \"bot\",\n text,\n attachments: [],\n isMessagingBot: true,\n ...extraFields,\n });\n}\n\n// ResolveStopTargetInput is defined in ./types.ts and re-exported from the top of this file.\n\n/**\n * Pick which session key a `/stop` should target without applying any\n * platform-specific fallback policy. Order:\n * 1. The provided sessionKey, if running.\n * 2. The bare conversationId, if running.\n */\nexport function resolveStopTarget(input: ResolveStopTargetInput): string | null {\n const { handler, address, sessionKey } = input;\n\n if (sessionKey && handler.isRunning(address, sessionKey)) return sessionKey;\n if (handler.isRunning(address, address.conversationId)) return address.conversationId;\n return null;\n}\n\n/**\n * Return the single running scoped session for this office, or null when there\n * are zero or multiple matches. Another platform's identically named\n * conversation is a different office and is never a stop target.\n */\nexport function resolveOnlyScopedStopTarget(\n handler: MessagingEventHandler,\n address: OfficeAddress,\n): string | null {\n const runningScopes = handler\n .getRunningSessions()\n .filter((session) => sameOffice(session.address, address))\n .map((session) => session.sessionKey)\n .filter((key) => key.startsWith(`${address.conversationId}:`));\n\n return runningScopes.length === 1 ? (runningScopes[0] ?? null) : null;\n}\n\n/**\n * Render tool-call args for human display. Drops `label` (already in the\n * heading) and folds `path` + `offset`/`limit` into a single `path:start-end`\n * line. Pure data normalization with no platform-specific markup.\n */\nexport function formatToolArgs(args: Record<string, unknown> | undefined): string {\n if (!args) return \"\";\n const lines: string[] = [];\n\n for (const [key, value] of Object.entries(args)) {\n if (key === \"label\" || key === \"offset\" || key === \"limit\") continue;\n\n if (key === \"path\" && typeof value === \"string\") {\n const offset = args.offset as number | undefined;\n const limit = args.limit as number | undefined;\n lines.push(\n offset !== undefined && limit !== undefined\n ? `${value}:${offset}-${offset + limit}`\n : value,\n );\n continue;\n }\n\n lines.push(typeof value === \"string\" ? value : JSON.stringify(value));\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Fetch `url` and write the response body to `destPath`, creating parent\n * directories as needed. Throws on non-2xx responses or write failures.\n */\nexport async function downloadUrlToFile(url: string, destPath: string): Promise<void> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n const buffer = await response.arrayBuffer();\n await mkdir(dirname(destPath), { recursive: true });\n await writeFile(destPath, Buffer.from(buffer));\n}\n"]}
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/adapters/shared.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Helpers shared across platform adapters.\n *\n * The agent runner is platform-agnostic: it hands strings and structured tool\n * results to each adapter, which decides how to split, format, and route them.\n * The split/normalize logic itself doesn't differ across platforms — only the\n * markup wrappers — so it lives here once.\n */\n\nimport { appendFileSync } from \"node:fs\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport type { MessagingEventHandler, OfficeAddress } from \"./index.js\";\nimport { sameOffice, type Office } from \"../office/index.js\";\nimport * as log from \"../log.js\";\nimport { reportUserFacingError } from \"../observability/index.js\";\nexport type {\n ChatResponseErrorContext,\n ChatResponseErrorOperation,\n ChatResponseErrorReporter,\n IncomingAttachment,\n ResolveStopTargetInput,\n RetryOptions,\n SavedAttachments,\n} from \"./types.js\";\nimport type {\n ChatResponseErrorContext,\n ChatResponseErrorReporter,\n IncomingAttachment,\n RetryOptions,\n ResolveStopTargetInput,\n SavedAttachments,\n} from \"./types.js\";\n\nexport function createChatResponseErrorReporter(\n resolve: () => Omit<ChatResponseErrorContext, \"operation\" | \"extra\">,\n): ChatResponseErrorReporter {\n return (err, operation, extra) => {\n reportChatResponseError(err, { ...resolve(), operation, extra });\n };\n}\n\nfunction reportChatResponseError(err: unknown, context: ChatResponseErrorContext): void {\n reportUserFacingError(err, {\n domain: \"chat_platform\",\n surface: \"chat_response\",\n operation: context.operation,\n severity: context.operation === \"set_working\" ? \"warning\" : \"error\",\n platform: context.platform,\n context: {\n conversationId: context.conversationId,\n channelId: context.channelId,\n chatId: context.chatId,\n messageId: context.messageId,\n sessionKey: context.sessionKey,\n responseMessageId: context.responseMessageId,\n threadTs: context.threadTs,\n replyTargetId: context.replyTargetId,\n replyToId: context.replyToId,\n conversationKind: context.conversationKind,\n isThreaded: context.isThreaded,\n ...context.extra,\n },\n });\n}\n\nexport class MessagingIntakeTracker {\n private accepting = true;\n private active = new Set<Promise<void>>();\n\n constructor(private readonly name: string) {}\n\n run(work: () => Promise<void> | void): Promise<void> {\n if (!this.accepting) return Promise.resolve();\n let result: Promise<void> | void;\n try {\n result = work();\n } catch (error) {\n result = Promise.reject(error);\n }\n const task = Promise.resolve(result).catch((error) => {\n log.logWarning(\n `${this.name} intake error`,\n error instanceof Error ? error.message : String(error),\n );\n });\n this.active.add(task);\n return task.finally(() => this.active.delete(task));\n }\n\n async close(): Promise<void> {\n this.accepting = false;\n await Promise.allSettled(this.active);\n }\n}\n\nexport class MessagingEventQueue {\n private queue: Array<() => Promise<void>> = [];\n private processing = false;\n private accepting = true;\n private drainWaiters: Array<() => void> = [];\n\n constructor(private readonly name: string = \"\") {}\n\n enqueue(work: () => Promise<void>): boolean {\n if (!this.accepting) return false;\n this.queue.push(work);\n this.processNext();\n return true;\n }\n\n size(): number {\n return this.queue.length;\n }\n\n close(): Promise<void> {\n this.accepting = false;\n if (!this.processing && this.queue.length === 0) return Promise.resolve();\n return new Promise((resolve) => this.drainWaiters.push(resolve));\n }\n\n private async processNext(): Promise<void> {\n if (this.processing || this.queue.length === 0) return;\n this.processing = true;\n const work = this.queue.shift()!;\n try {\n await work();\n } catch (err) {\n log.logWarning(\n `${this.name ? this.name + \" \" : \"\"}queue error`,\n err instanceof Error ? err.message : String(err),\n );\n }\n this.processing = false;\n if (this.queue.length > 0) {\n this.processNext();\n return;\n }\n for (const resolve of this.drainWaiters.splice(0)) resolve();\n }\n}\n\n// RetryOptions is defined in ./types.ts and re-exported from the top of this file.\n\n/**\n * Run `fn` and retry with exponential backoff when its error matches\n * `isRateLimited`. Other errors propagate immediately. Each platform supplies\n * its own predicate so we don't have to know every SDK's error shape here.\n */\nexport async function withRetry<T>(fn: () => Promise<T>, opts: RetryOptions): Promise<T> {\n const maxAttempts = opts.maxAttempts ?? 3;\n const baseDelayMs = opts.baseDelayMs ?? 1000;\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (err) {\n lastError = err instanceof Error ? err : new Error(String(err));\n\n const isLastAttempt = attempt === maxAttempts - 1;\n if (isLastAttempt || !opts.isRateLimited(lastError)) {\n throw lastError;\n }\n\n const delay = baseDelayMs * Math.pow(2, attempt);\n log.logWarning(\n `Retrying after error in ${delay}ms (attempt ${attempt + 1}/${maxAttempts}): ${lastError.message}`,\n );\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n throw lastError;\n}\n\n/**\n * Split `text` into chunks no larger than `limit`, appending a continuation\n * marker (e.g. `_(continued 1)_`) at the end of every part except the last.\n *\n * Each adapter passes its own `formatContinuation` so the marker uses the\n * platform's italic / emphasis convention.\n */\nexport function splitText(\n text: string,\n limit: number,\n formatContinuation: (partNum: number) => string,\n): string[] {\n if (text.length <= limit) return [text];\n const parts: string[] = [];\n let remaining = text;\n let partNum = 1;\n while (remaining.length > 0) {\n const suffixReserve = formatContinuation(partNum).length + 8;\n const chunkLimit = Math.max(1, limit - suffixReserve);\n const chunk = remaining.slice(0, chunkLimit);\n remaining = remaining.slice(chunkLimit);\n const suffix = remaining.length > 0 ? `\\n${formatContinuation(partNum)}` : \"\";\n parts.push(chunk + suffix);\n partNum++;\n }\n return parts;\n}\n\n/**\n * Append a JSON-serializable entry to the office's `log.jsonl`,\n * materializing the office on first use. This is the single write path every\n * adapter uses for human-readable message history.\n */\nexport function appendChannelLog(office: Office, entry: object): void {\n office.ensure();\n appendFileSync(office.logPath, `${JSON.stringify(entry)}\\n`);\n}\n\n/**\n * Save incoming platform files under the office's attachments directory.\n *\n * The one owner of the attachment convention: sanitized\n * `<timestamp>_<name>` filenames, the `<office key>/attachments/<file>`\n * workspace-relative localPath the agent reads, and office materialization\n * before the first write. Download mechanics and failure policy stay with\n * the adapter — failures come back in `failed` for the caller to throw or\n * warn about, matching its platform's behavior.\n */\nexport async function saveIncomingAttachments(\n office: Office,\n items: readonly IncomingAttachment[],\n): Promise<SavedAttachments> {\n if (items.length === 0) return { saved: [], failed: [] };\n // Attachment downloads can be the office's first write; materialize (and\n // register) it before composing office-relative attachment paths.\n office.ensure();\n await mkdir(office.attachmentsDir, { recursive: true });\n\n // Results keep the caller's item order regardless of download completion\n // order — platform message logs list attachments as the platform sent them.\n const results = await Promise.all(\n items.map(async (item) => {\n const sanitized = item.name.replace(/[^a-zA-Z0-9._-]/g, \"_\");\n const filename = `${item.timestampMs ?? Date.now()}_${sanitized}`;\n try {\n await item.download(join(office.attachmentsDir, filename));\n return {\n saved: { original: item.name, localPath: `${office.key}/attachments/${filename}` },\n };\n } catch (error) {\n return { failed: { name: item.name, error } };\n }\n }),\n );\n return {\n saved: results.flatMap((result) => (result.saved ? [result.saved] : [])),\n failed: results.flatMap((result) => (result.failed ? [result.failed] : [])),\n };\n}\n\n/** Convenience for appending the bot's own outbound message. */\nexport function appendBotResponseLog(\n office: Office,\n text: string,\n ts: string,\n threadTs?: string,\n extraFields: Record<string, unknown> = {},\n): void {\n appendChannelLog(office, {\n date: new Date().toISOString(),\n ts,\n ...(threadTs ? { threadTs } : {}),\n user: \"bot\",\n text,\n attachments: [],\n isMessagingBot: true,\n ...extraFields,\n });\n}\n\n// ResolveStopTargetInput is defined in ./types.ts and re-exported from the top of this file.\n\n/**\n * Pick which session key a `/stop` should target without applying any\n * platform-specific fallback policy. Order:\n * 1. The provided sessionKey, if running.\n * 2. The bare conversationId, if running.\n */\nexport function resolveStopTarget(input: ResolveStopTargetInput): string | null {\n const { handler, address, sessionKey } = input;\n\n if (sessionKey && handler.isRunning(address, sessionKey)) return sessionKey;\n if (handler.isRunning(address, address.conversationId)) return address.conversationId;\n return null;\n}\n\n/**\n * Return the single running scoped session for this office, or null when there\n * are zero or multiple matches. Another platform's identically named\n * conversation is a different office and is never a stop target.\n */\nexport function resolveOnlyScopedStopTarget(\n handler: MessagingEventHandler,\n address: OfficeAddress,\n): string | null {\n const runningScopes = handler\n .getRunningSessions()\n .filter((session) => sameOffice(session.address, address))\n .map((session) => session.sessionKey)\n .filter((key) => key.startsWith(`${address.conversationId}:`));\n\n return runningScopes.length === 1 ? (runningScopes[0] ?? null) : null;\n}\n\n/**\n * Render tool-call args for human display. Drops `label` (already in the\n * heading) and folds `path` + `offset`/`limit` into a single `path:start-end`\n * line. Pure data normalization with no platform-specific markup.\n */\nexport function formatToolArgs(args: Record<string, unknown> | undefined): string {\n if (!args) return \"\";\n const lines: string[] = [];\n\n for (const [key, value] of Object.entries(args)) {\n if (key === \"label\" || key === \"offset\" || key === \"limit\") continue;\n\n if (key === \"path\" && typeof value === \"string\") {\n const offset = args.offset as number | undefined;\n const limit = args.limit as number | undefined;\n lines.push(\n offset !== undefined && limit !== undefined\n ? `${value}:${offset}-${offset + limit}`\n : value,\n );\n continue;\n }\n\n lines.push(typeof value === \"string\" ? value : JSON.stringify(value));\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Fetch `url` and write the response body to `destPath`, creating parent\n * directories as needed. Throws on non-2xx responses or write failures.\n */\nexport async function downloadUrlToFile(url: string, destPath: string): Promise<void> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n const buffer = await response.arrayBuffer();\n await mkdir(dirname(destPath), { recursive: true });\n await writeFile(destPath, Buffer.from(buffer));\n}\n\n/**\n * Slack-style short names (as the `react` tool and prompt use) to Unicode\n * emoji, for platforms whose reaction API takes a Unicode character rather\n * than a name (Discord, Telegram). Covers what the system prompt actually\n * recommends plus a few other common names; an unmapped name passes through\n * unchanged so an unsupported reaction fails visibly at the platform call\n * instead of silently.\n */\nconst SHORT_NAME_TO_UNICODE_EMOJI: Record<string, string> = {\n saluting_face: \"\\u{1FAE1}\",\n eyes: \"\\u{1F440}\",\n white_check_mark: \"\\u{2705}\",\n \"+1\": \"\\u{1F44D}\",\n thumbsup: \"\\u{1F44D}\",\n \"-1\": \"\\u{1F44E}\",\n thumbsdown: \"\\u{1F44E}\",\n heart: \"\\u{2764}\",\n tada: \"\\u{1F389}\",\n rocket: \"\\u{1F680}\",\n};\n\n/** Translate a Slack-style short name (colons optional) to Unicode; passes through anything else. */\nexport function shortNameToUnicodeEmoji(emoji: string): string {\n const name = emoji.replace(/^:|:$/g, \"\");\n return SHORT_NAME_TO_UNICODE_EMOJI[name] ?? emoji;\n}\n"]}
@@ -1,8 +1,9 @@
1
- import { type MessagingBot, type ConversationEvent, type MessagingEventHandler, type MessagingInfo, type PlatformHistoryMessage, type PlatformHistoryOptions, type PlatformUserInfo } from "../../adapter.js";
1
+ import { type MessagingBot, type ConversationEvent, type MessagingEventHandler, type MessagingInfo, type PlatformHistoryMessage, type PlatformHistoryOptions, type PlatformUserInfo } from "../index.js";
2
2
  import { type Workspace } from "../../office/index.js";
3
3
  import type { EventScheduler } from "../../events/scheduler.js";
4
4
  import type { SlackChannel, SlackUser } from "./types.js";
5
5
  import { type SuggestedPrompt } from "./assistant.js";
6
+ import type { SlackPersonaIdentity } from "./persona.js";
6
7
  /** Slices `text` into pieces that each fit one streaming call. */
7
8
  export declare function chunkStreamText(text: string, limit?: number): string[];
8
9
  /**
@@ -62,7 +63,7 @@ export declare class SlackMessagingBot implements MessagingBot {
62
63
  * links and notifies on raw user ids.
63
64
  */
64
65
  private resolveMentions;
65
- postMessage(channel: string, text: string, threadTs?: string): Promise<string>;
66
+ postMessage(channel: string, text: string, threadTs?: string, identity?: SlackPersonaIdentity): Promise<string>;
66
67
  addReaction(channel: string, messageTs: string, emoji: string): Promise<void>;
67
68
  postEphemeral(channel: string, user: string, text: string, threadTs?: string, blocks?: object[]): Promise<void>;
68
69
  postEphemeralBlocks(channel: string, user: string, text: string, blocks: object[], threadTs?: string): Promise<void>;
@@ -130,7 +131,7 @@ export declare class SlackMessagingBot implements MessagingBot {
130
131
  * to normalize here rather than in the handler.
131
132
  */
132
133
  private handleAgentContextChangedEvent;
133
- postInThread(channel: string, threadTs: string, text: string): Promise<string>;
134
+ postInThread(channel: string, threadTs: string, text: string, identity?: SlackPersonaIdentity): Promise<string>;
134
135
  postInThreadBlocks(channel: string, threadTs: string, text: string, blocks: object[]): Promise<string>;
135
136
  uploadFile(channel: string, filePath: string, title?: string, threadTs?: string): Promise<void>;
136
137
  logToFile(channel: string, entry: object): void;
@@ -184,6 +185,16 @@ export declare class SlackMessagingBot implements MessagingBot {
184
185
  private handleAppMention;
185
186
  private admitHumanMessage;
186
187
  private deliverTaskUpdate;
188
+ /**
189
+ * Ask Jev a single typed yes/no question about whether this unaddressed
190
+ * shared-channel message addresses mikan. Only called in `jev` auto-reply
191
+ * mode, and only awaited by the caller in that mode, so `on`/`off` stay
192
+ * synchronous (magic-word `stop` handling depends on that). Any failure
193
+ * (including a missing `OPENROUTER_API_KEY`) fails closed to "not
194
+ * addressed" so a misconfiguration cannot make the bot noisy in a shared
195
+ * channel.
196
+ */
197
+ private evaluateJevAddressed;
187
198
  private handleMessageEvent;
188
199
  private handleSlashCommand;
189
200
  private handleAppHomeOpened;
@@ -1 +1 @@
1
- {"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../../../src/adapters/slack/bot.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../../../src/adapters/slack/bot.ts"],"names":[],"mappings":"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"}
@@ -3,13 +3,14 @@ import { WebAPIRateLimitedError, WebClient } from "@slack/web-api";
3
3
  import { existsSync, readFileSync } from "node:fs";
4
4
  import { readFile, writeFile } from "node:fs/promises";
5
5
  import { basename, join } from "node:path";
6
- import { createConversationEvent, createConversationMessage, } from "../../adapter.js";
6
+ import { createConversationEvent, createConversationMessage, } from "../index.js";
7
7
  import { createOfficeAddress, listRegisteredOffices } from "../../office/index.js";
8
8
  import { COMMAND_MANIFEST } from "../commands/manifest.js";
9
- import { slackConversationAutoReplyEnabled, resolveConversationSettings } from "../../config.js";
9
+ import { slackConversationAutoReplyMode, resolveConversationSettings, } from "../../settings/index.js";
10
+ import { evaluateWithJev, JevNotConfiguredError } from "../../harness/index.js";
10
11
  import * as log from "../../log.js";
11
12
  import { isRecord, readTextFileIfExists } from "../../file-guards.js";
12
- import { PRODUCT_NAME, formatForceStopped } from "../../platform-messages.js";
13
+ import { PRODUCT_NAME, formatForceStopped } from "../messages.js";
13
14
  import { appendBotResponseLog, appendChannelLog, MessagingEventQueue, MessagingIntakeTracker, saveIncomingAttachments, withRetry, } from "../shared.js";
14
15
  import { matchMagicWord, processMessageIntake } from "../intake.js";
15
16
  import { readPlatformChannelKind, recordPlatformChannelKind, } from "../../office/projection.js";
@@ -318,11 +319,12 @@ export class SlackMessagingBot {
318
319
  resolveMentions(text) {
319
320
  return resolveSlackMentions(text, this.users.values());
320
321
  }
321
- async postMessage(channel, text, threadTs) {
322
+ async postMessage(channel, text, threadTs, identity) {
322
323
  return slackRetry(async () => {
323
324
  const payload = {
324
325
  channel,
325
326
  ...(threadTs !== undefined ? { thread_ts: threadTs } : {}),
327
+ ...(identity ? { username: identity.username, icon_emoji: identity.iconEmoji } : {}),
326
328
  ...renderSlackBlocks(this.resolveMentions(text)),
327
329
  };
328
330
  const result = await this.webClient.chat.postMessage(payload);
@@ -624,8 +626,10 @@ export class SlackMessagingBot {
624
626
  });
625
627
  }
626
628
  }
627
- async postInThread(channel, threadTs, text) {
628
- return this.postMessage(channel, text, threadTs);
629
+ async postInThread(channel, threadTs, text, identity) {
630
+ return identity
631
+ ? this.postMessage(channel, text, threadTs, identity)
632
+ : this.postMessage(channel, text, threadTs);
629
633
  }
630
634
  async postInThreadBlocks(channel, threadTs, text, blocks) {
631
635
  return this.postMessageBlocks(channel, text, blocks, threadTs);
@@ -1286,6 +1290,44 @@ export class SlackMessagingBot {
1286
1290
  }
1287
1291
  return false;
1288
1292
  }
1293
+ /**
1294
+ * Ask Jev a single typed yes/no question about whether this unaddressed
1295
+ * shared-channel message addresses mikan. Only called in `jev` auto-reply
1296
+ * mode, and only awaited by the caller in that mode, so `on`/`off` stay
1297
+ * synchronous (magic-word `stop` handling depends on that). Any failure
1298
+ * (including a missing `OPENROUTER_API_KEY`) fails closed to "not
1299
+ * addressed" so a misconfiguration cannot make the bot noisy in a shared
1300
+ * channel.
1301
+ */
1302
+ async evaluateJevAddressed(event) {
1303
+ if (!event.text.trim() || matchMagicWord(event.text) === "stop")
1304
+ return false;
1305
+ try {
1306
+ const result = await evaluateWithJev(event.text, {
1307
+ addressed: {
1308
+ type: "boolean",
1309
+ instructions: "Does this Slack channel message address, ask, or request the mikan AI assistant to do something, rather than being casual conversation between humans that needs no reply?",
1310
+ },
1311
+ });
1312
+ const probability = result.answers.addressed.probability;
1313
+ log.logInfo(`[${event.channel}] jev auto-reply: probability=${probability.toFixed(2)} addressed=${probability > 0.5} text="${event.text.slice(0, 80)}"`);
1314
+ return probability > 0.5;
1315
+ }
1316
+ catch (err) {
1317
+ if (err instanceof JevNotConfiguredError) {
1318
+ log.logWarning("Slack auto-reply jev mode requires OPENROUTER_API_KEY; treating message as unaddressed", String(err));
1319
+ return false;
1320
+ }
1321
+ reportUserFacingError(err, {
1322
+ domain: "chat_platform",
1323
+ surface: "slack_auto_reply_jev",
1324
+ operation: "evaluate",
1325
+ severity: "warning",
1326
+ context: { conversationId: event.conversationId },
1327
+ });
1328
+ return false;
1329
+ }
1330
+ }
1289
1331
  async handleMessageEvent({ event, ack, }) {
1290
1332
  const e = event;
1291
1333
  if (!this.admitHumanMessage(e, ack))
@@ -1349,7 +1391,14 @@ export class SlackMessagingBot {
1349
1391
  if (await this.deliverTaskUpdate(slackEvent, attachmentsPromise))
1350
1392
  return;
1351
1393
  }
1352
- const autoReply = !isDM && slackConversationAutoReplyEnabled(this.workspace.office(slackEvent.address));
1394
+ const autoReplyMode = isDM
1395
+ ? "off"
1396
+ : slackConversationAutoReplyMode(this.workspace.office(slackEvent.address));
1397
+ const autoReply = autoReplyMode === "on"
1398
+ ? true
1399
+ : autoReplyMode === "jev"
1400
+ ? await this.evaluateJevAddressed(slackEvent)
1401
+ : false;
1353
1402
  const intake = this.processSlackMessageIntake({
1354
1403
  event: slackEvent,
1355
1404
  attachmentsPromise,