@letta-ai/letta-code 0.30.7 → 0.30.9

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 (286) hide show
  1. package/dist/agent-presets.js.map +1 -1
  2. package/dist/app-server-client.cjs +12 -2
  3. package/dist/app-server-client.cjs.map +4 -4
  4. package/dist/app-server-client.js +12 -2
  5. package/dist/app-server-client.js.map +4 -4
  6. package/dist/channels-public.js +210 -39
  7. package/dist/channels-public.js.map +7 -4
  8. package/dist/channels-slack.js +1 -1
  9. package/dist/channels-slack.js.map +3 -3
  10. package/dist/gateway-core.js +67 -43
  11. package/dist/gateway-core.js.map +3 -3
  12. package/dist/mcp-client.js +2 -2
  13. package/dist/mcp-client.js.map +1 -1
  14. package/dist/types/agent/approval-execution.d.ts +0 -2
  15. package/dist/types/agent/approval-execution.d.ts.map +1 -1
  16. package/dist/types/agent/message.d.ts.map +1 -1
  17. package/dist/types/agent/subagents/manager.d.ts.map +1 -1
  18. package/dist/types/agent/subagents/subagent-launcher.d.ts +0 -5
  19. package/dist/types/agent/subagents/subagent-launcher.d.ts.map +1 -1
  20. package/dist/types/app-server-client.d.ts +4 -1
  21. package/dist/types/app-server-client.d.ts.map +1 -1
  22. package/dist/types/backend/local/local-store.d.ts.map +1 -1
  23. package/dist/types/channels/gateway-core.d.ts +14 -4
  24. package/dist/types/channels/gateway-core.d.ts.map +1 -1
  25. package/dist/types/channels/processor.d.ts.map +1 -1
  26. package/dist/types/channels/slack/presentation.d.ts.map +1 -1
  27. package/dist/types/cli/helpers/accumulator.d.ts +1 -0
  28. package/dist/types/cli/helpers/accumulator.d.ts.map +1 -1
  29. package/dist/types/cli/helpers/stream-resume.d.ts +33 -0
  30. package/dist/types/cli/helpers/stream-resume.d.ts.map +1 -0
  31. package/dist/types/cli/helpers/stream-terminal-eof-guard.d.ts +14 -0
  32. package/dist/types/cli/helpers/stream-terminal-eof-guard.d.ts.map +1 -0
  33. package/dist/types/cli/helpers/stream.d.ts +4 -23
  34. package/dist/types/cli/helpers/stream.d.ts.map +1 -1
  35. package/dist/types/constants.d.ts +1 -1
  36. package/dist/types/constants.d.ts.map +1 -1
  37. package/dist/types/gateway-core.d.ts +1 -1
  38. package/dist/types/gateway-core.d.ts.map +1 -1
  39. package/dist/types/mods/mod-engine.d.ts +3 -7
  40. package/dist/types/mods/mod-engine.d.ts.map +1 -1
  41. package/dist/types/runtime-context.d.ts +0 -9
  42. package/dist/types/runtime-context.d.ts.map +1 -1
  43. package/dist/types/telemetry/error-reporting.d.ts +7 -0
  44. package/dist/types/telemetry/error-reporting.d.ts.map +1 -1
  45. package/dist/types/telemetry/index.d.ts +10 -0
  46. package/dist/types/telemetry/index.d.ts.map +1 -1
  47. package/dist/types/tools/impl/shell-runner.d.ts.map +1 -1
  48. package/dist/types/tools/manager.d.ts +4 -11
  49. package/dist/types/tools/manager.d.ts.map +1 -1
  50. package/dist/types/tools/tool-definitions.d.ts +0 -1
  51. package/dist/types/tools/tool-definitions.d.ts.map +1 -1
  52. package/dist/types/tools/toolset.d.ts +1 -5
  53. package/dist/types/tools/toolset.d.ts.map +1 -1
  54. package/dist/types/types/app-server-info.d.ts +1 -0
  55. package/dist/types/types/app-server-info.d.ts.map +1 -1
  56. package/dist/types/types/external-tool-protocol.d.ts +61 -0
  57. package/dist/types/types/external-tool-protocol.d.ts.map +1 -0
  58. package/dist/types/types/protocol_v2.d.ts +15 -64
  59. package/dist/types/types/protocol_v2.d.ts.map +1 -1
  60. package/dist/types/types/runtime-scope.d.ts +18 -0
  61. package/dist/types/types/runtime-scope.d.ts.map +1 -0
  62. package/dist/types/utils/secrets.d.ts.map +1 -1
  63. package/letta.js +105851 -105454
  64. package/package.json +1 -1
  65. package/scripts/dev.cjs +1 -2
  66. package/scripts/source-file-size-baseline.json +12 -12
  67. package/scripts/test-home-preload.ts +66 -0
  68. package/skills/creating-mods/references/ui.md +11 -1
  69. package/dist/types/channels/access-control.d.ts +0 -104
  70. package/dist/types/channels/access-control.d.ts.map +0 -1
  71. package/dist/types/channels/accounts.d.ts +0 -17
  72. package/dist/types/channels/accounts.d.ts.map +0 -1
  73. package/dist/types/channels/commands.d.ts +0 -98
  74. package/dist/types/channels/commands.d.ts.map +0 -1
  75. package/dist/types/channels/config.d.ts +0 -18
  76. package/dist/types/channels/config.d.ts.map +0 -1
  77. package/dist/types/channels/credential-store.d.ts +0 -21
  78. package/dist/types/channels/credential-store.d.ts.map +0 -1
  79. package/dist/types/channels/custom/adapter.d.ts +0 -3
  80. package/dist/types/channels/custom/adapter.d.ts.map +0 -1
  81. package/dist/types/channels/custom/plugin.d.ts +0 -10
  82. package/dist/types/channels/custom/plugin.d.ts.map +0 -1
  83. package/dist/types/channels/discord/account-display.d.ts +0 -2
  84. package/dist/types/channels/discord/account-display.d.ts.map +0 -1
  85. package/dist/types/channels/discord/adapter.d.ts +0 -3
  86. package/dist/types/channels/discord/adapter.d.ts.map +0 -1
  87. package/dist/types/channels/discord/bot-policy.d.ts +0 -19
  88. package/dist/types/channels/discord/bot-policy.d.ts.map +0 -1
  89. package/dist/types/channels/discord/channel-gating.d.ts +0 -41
  90. package/dist/types/channels/discord/channel-gating.d.ts.map +0 -1
  91. package/dist/types/channels/discord/error-reply.d.ts +0 -24
  92. package/dist/types/channels/discord/error-reply.d.ts.map +0 -1
  93. package/dist/types/channels/discord/internal-types.d.ts +0 -101
  94. package/dist/types/channels/discord/internal-types.d.ts.map +0 -1
  95. package/dist/types/channels/discord/media.d.ts +0 -47
  96. package/dist/types/channels/discord/media.d.ts.map +0 -1
  97. package/dist/types/channels/discord/message-actions.d.ts +0 -3
  98. package/dist/types/channels/discord/message-actions.d.ts.map +0 -1
  99. package/dist/types/channels/discord/plugin.d.ts +0 -3
  100. package/dist/types/channels/discord/plugin.d.ts.map +0 -1
  101. package/dist/types/channels/discord/runtime.d.ts +0 -28
  102. package/dist/types/channels/discord/runtime.d.ts.map +0 -1
  103. package/dist/types/channels/discord/setup.d.ts +0 -2
  104. package/dist/types/channels/discord/setup.d.ts.map +0 -1
  105. package/dist/types/channels/discord/utils.d.ts +0 -47
  106. package/dist/types/channels/discord/utils.d.ts.map +0 -1
  107. package/dist/types/channels/feedback.d.ts +0 -26
  108. package/dist/types/channels/feedback.d.ts.map +0 -1
  109. package/dist/types/channels/inbound-debounce.d.ts +0 -50
  110. package/dist/types/channels/inbound-debounce.d.ts.map +0 -1
  111. package/dist/types/channels/interactive.d.ts +0 -13
  112. package/dist/types/channels/interactive.d.ts.map +0 -1
  113. package/dist/types/channels/lifecycle-error-report.d.ts +0 -19
  114. package/dist/types/channels/lifecycle-error-report.d.ts.map +0 -1
  115. package/dist/types/channels/message-tool.d.ts +0 -15
  116. package/dist/types/channels/message-tool.d.ts.map +0 -1
  117. package/dist/types/channels/pairing.d.ts +0 -53
  118. package/dist/types/channels/pairing.d.ts.map +0 -1
  119. package/dist/types/channels/pending-control-requests.d.ts +0 -12
  120. package/dist/types/channels/pending-control-requests.d.ts.map +0 -1
  121. package/dist/types/channels/plugin-registry.d.ts +0 -9
  122. package/dist/types/channels/plugin-registry.d.ts.map +0 -1
  123. package/dist/types/channels/registry-commands.d.ts +0 -52
  124. package/dist/types/channels/registry-commands.d.ts.map +0 -1
  125. package/dist/types/channels/registry-controls.d.ts +0 -33
  126. package/dist/types/channels/registry-controls.d.ts.map +0 -1
  127. package/dist/types/channels/registry-events.d.ts +0 -27
  128. package/dist/types/channels/registry-events.d.ts.map +0 -1
  129. package/dist/types/channels/registry-handlers.d.ts +0 -46
  130. package/dist/types/channels/registry-handlers.d.ts.map +0 -1
  131. package/dist/types/channels/registry-inbound.d.ts +0 -19
  132. package/dist/types/channels/registry-inbound.d.ts.map +0 -1
  133. package/dist/types/channels/registry-presentation.d.ts +0 -20
  134. package/dist/types/channels/registry-presentation.d.ts.map +0 -1
  135. package/dist/types/channels/registry-routes.d.ts +0 -33
  136. package/dist/types/channels/registry-routes.d.ts.map +0 -1
  137. package/dist/types/channels/registry.d.ts +0 -130
  138. package/dist/types/channels/registry.d.ts.map +0 -1
  139. package/dist/types/channels/restore-scope.d.ts +0 -8
  140. package/dist/types/channels/restore-scope.d.ts.map +0 -1
  141. package/dist/types/channels/routing.d.ts +0 -74
  142. package/dist/types/channels/routing.d.ts.map +0 -1
  143. package/dist/types/channels/runtime-deps.d.ts +0 -25
  144. package/dist/types/channels/runtime-deps.d.ts.map +0 -1
  145. package/dist/types/channels/schema-config.d.ts +0 -33
  146. package/dist/types/channels/schema-config.d.ts.map +0 -1
  147. package/dist/types/channels/signal/account-conflicts.d.ts +0 -14
  148. package/dist/types/channels/signal/account-conflicts.d.ts.map +0 -1
  149. package/dist/types/channels/signal/adapter.d.ts +0 -40
  150. package/dist/types/channels/signal/adapter.d.ts.map +0 -1
  151. package/dist/types/channels/signal/client.d.ts +0 -51
  152. package/dist/types/channels/signal/client.d.ts.map +0 -1
  153. package/dist/types/channels/signal/inbound.d.ts +0 -25
  154. package/dist/types/channels/signal/inbound.d.ts.map +0 -1
  155. package/dist/types/channels/signal/internal-types.d.ts +0 -82
  156. package/dist/types/channels/signal/internal-types.d.ts.map +0 -1
  157. package/dist/types/channels/signal/media.d.ts +0 -35
  158. package/dist/types/channels/signal/media.d.ts.map +0 -1
  159. package/dist/types/channels/signal/message-actions.d.ts +0 -3
  160. package/dist/types/channels/signal/message-actions.d.ts.map +0 -1
  161. package/dist/types/channels/signal/plugin.d.ts +0 -3
  162. package/dist/types/channels/signal/plugin.d.ts.map +0 -1
  163. package/dist/types/channels/signal/runtime.d.ts +0 -14
  164. package/dist/types/channels/signal/runtime.d.ts.map +0 -1
  165. package/dist/types/channels/signal/setup-runtime.d.ts +0 -35
  166. package/dist/types/channels/signal/setup-runtime.d.ts.map +0 -1
  167. package/dist/types/channels/signal/setup.d.ts +0 -5
  168. package/dist/types/channels/signal/setup.d.ts.map +0 -1
  169. package/dist/types/channels/signal/target.d.ts +0 -21
  170. package/dist/types/channels/signal/target.d.ts.map +0 -1
  171. package/dist/types/channels/slack/account-display.d.ts +0 -2
  172. package/dist/types/channels/slack/account-display.d.ts.map +0 -1
  173. package/dist/types/channels/slack/adapter.d.ts +0 -12
  174. package/dist/types/channels/slack/adapter.d.ts.map +0 -1
  175. package/dist/types/channels/slack/agent-thread-tracker.d.ts +0 -13
  176. package/dist/types/channels/slack/agent-thread-tracker.d.ts.map +0 -1
  177. package/dist/types/channels/slack/approval-controller.d.ts +0 -14
  178. package/dist/types/channels/slack/approval-controller.d.ts.map +0 -1
  179. package/dist/types/channels/slack/attachment-download.d.ts +0 -20
  180. package/dist/types/channels/slack/attachment-download.d.ts.map +0 -1
  181. package/dist/types/channels/slack/attachment-stream.d.ts +0 -23
  182. package/dist/types/channels/slack/attachment-stream.d.ts.map +0 -1
  183. package/dist/types/channels/slack/attachment-task.d.ts +0 -37
  184. package/dist/types/channels/slack/attachment-task.d.ts.map +0 -1
  185. package/dist/types/channels/slack/attachment-types.d.ts +0 -27
  186. package/dist/types/channels/slack/attachment-types.d.ts.map +0 -1
  187. package/dist/types/channels/slack/bot-policy.d.ts +0 -25
  188. package/dist/types/channels/slack/bot-policy.d.ts.map +0 -1
  189. package/dist/types/channels/slack/file-upload.d.ts +0 -6
  190. package/dist/types/channels/slack/file-upload.d.ts.map +0 -1
  191. package/dist/types/channels/slack/inbound-debounce.d.ts +0 -16
  192. package/dist/types/channels/slack/inbound-debounce.d.ts.map +0 -1
  193. package/dist/types/channels/slack/ingress-controller.d.ts +0 -21
  194. package/dist/types/channels/slack/ingress-controller.d.ts.map +0 -1
  195. package/dist/types/channels/slack/media.d.ts +0 -63
  196. package/dist/types/channels/slack/media.d.ts.map +0 -1
  197. package/dist/types/channels/slack/message-actions.d.ts +0 -2
  198. package/dist/types/channels/slack/message-actions.d.ts.map +0 -1
  199. package/dist/types/channels/slack/model-picker-blocks.d.ts +0 -9
  200. package/dist/types/channels/slack/model-picker-blocks.d.ts.map +0 -1
  201. package/dist/types/channels/slack/plugin.d.ts +0 -3
  202. package/dist/types/channels/slack/plugin.d.ts.map +0 -1
  203. package/dist/types/channels/slack/proactive-accounts.d.ts +0 -15
  204. package/dist/types/channels/slack/proactive-accounts.d.ts.map +0 -1
  205. package/dist/types/channels/slack/runtime.d.ts +0 -6
  206. package/dist/types/channels/slack/runtime.d.ts.map +0 -1
  207. package/dist/types/channels/slack/setup.d.ts +0 -2
  208. package/dist/types/channels/slack/setup.d.ts.map +0 -1
  209. package/dist/types/channels/slack/target-resolution.d.ts +0 -52
  210. package/dist/types/channels/slack/target-resolution.d.ts.map +0 -1
  211. package/dist/types/channels/slack/thread-context.d.ts +0 -15
  212. package/dist/types/channels/slack/thread-context.d.ts.map +0 -1
  213. package/dist/types/channels/slack/web-api-client.d.ts +0 -2
  214. package/dist/types/channels/slack/web-api-client.d.ts.map +0 -1
  215. package/dist/types/channels/targets.d.ts +0 -17
  216. package/dist/types/channels/targets.d.ts.map +0 -1
  217. package/dist/types/channels/telegram/account-display.d.ts +0 -9
  218. package/dist/types/channels/telegram/account-display.d.ts.map +0 -1
  219. package/dist/types/channels/telegram/adapter.d.ts +0 -12
  220. package/dist/types/channels/telegram/adapter.d.ts.map +0 -1
  221. package/dist/types/channels/telegram/debounce.d.ts +0 -22
  222. package/dist/types/channels/telegram/debounce.d.ts.map +0 -1
  223. package/dist/types/channels/telegram/internal-types.d.ts +0 -98
  224. package/dist/types/channels/telegram/internal-types.d.ts.map +0 -1
  225. package/dist/types/channels/telegram/media.d.ts +0 -115
  226. package/dist/types/channels/telegram/media.d.ts.map +0 -1
  227. package/dist/types/channels/telegram/message-actions.d.ts +0 -3
  228. package/dist/types/channels/telegram/message-actions.d.ts.map +0 -1
  229. package/dist/types/channels/telegram/plugin.d.ts +0 -3
  230. package/dist/types/channels/telegram/plugin.d.ts.map +0 -1
  231. package/dist/types/channels/telegram/runtime.d.ts +0 -6
  232. package/dist/types/channels/telegram/runtime.d.ts.map +0 -1
  233. package/dist/types/channels/telegram/setup.d.ts +0 -14
  234. package/dist/types/channels/telegram/setup.d.ts.map +0 -1
  235. package/dist/types/channels/telegram/startup-helpers.d.ts +0 -10
  236. package/dist/types/channels/telegram/startup-helpers.d.ts.map +0 -1
  237. package/dist/types/channels/telegram/typing-controller.d.ts +0 -11
  238. package/dist/types/channels/telegram/typing-controller.d.ts.map +0 -1
  239. package/dist/types/channels/telegram/utils.d.ts +0 -43
  240. package/dist/types/channels/telegram/utils.d.ts.map +0 -1
  241. package/dist/types/channels/transcription/index.d.ts +0 -20
  242. package/dist/types/channels/transcription/index.d.ts.map +0 -1
  243. package/dist/types/channels/whatsapp/adapter-helpers.d.ts +0 -21
  244. package/dist/types/channels/whatsapp/adapter-helpers.d.ts.map +0 -1
  245. package/dist/types/channels/whatsapp/adapter-types.d.ts +0 -44
  246. package/dist/types/channels/whatsapp/adapter-types.d.ts.map +0 -1
  247. package/dist/types/channels/whatsapp/adapter.d.ts +0 -18
  248. package/dist/types/channels/whatsapp/adapter.d.ts.map +0 -1
  249. package/dist/types/channels/whatsapp/attachment-policy.d.ts +0 -22
  250. package/dist/types/channels/whatsapp/attachment-policy.d.ts.map +0 -1
  251. package/dist/types/channels/whatsapp/dedupe-claims.d.ts +0 -8
  252. package/dist/types/channels/whatsapp/dedupe-claims.d.ts.map +0 -1
  253. package/dist/types/channels/whatsapp/identity.d.ts +0 -29
  254. package/dist/types/channels/whatsapp/identity.d.ts.map +0 -1
  255. package/dist/types/channels/whatsapp/inbound-debounce.d.ts +0 -28
  256. package/dist/types/channels/whatsapp/inbound-debounce.d.ts.map +0 -1
  257. package/dist/types/channels/whatsapp/jid.d.ts +0 -40
  258. package/dist/types/channels/whatsapp/jid.d.ts.map +0 -1
  259. package/dist/types/channels/whatsapp/lid-store.d.ts +0 -45
  260. package/dist/types/channels/whatsapp/lid-store.d.ts.map +0 -1
  261. package/dist/types/channels/whatsapp/media.d.ts +0 -26
  262. package/dist/types/channels/whatsapp/media.d.ts.map +0 -1
  263. package/dist/types/channels/whatsapp/message-actions.d.ts +0 -3
  264. package/dist/types/channels/whatsapp/message-actions.d.ts.map +0 -1
  265. package/dist/types/channels/whatsapp/message-store.d.ts +0 -13
  266. package/dist/types/channels/whatsapp/message-store.d.ts.map +0 -1
  267. package/dist/types/channels/whatsapp/plugin.d.ts +0 -3
  268. package/dist/types/channels/whatsapp/plugin.d.ts.map +0 -1
  269. package/dist/types/channels/whatsapp/reactions.d.ts +0 -33
  270. package/dist/types/channels/whatsapp/reactions.d.ts.map +0 -1
  271. package/dist/types/channels/whatsapp/reconnect-scheduler.d.ts +0 -16
  272. package/dist/types/channels/whatsapp/reconnect-scheduler.d.ts.map +0 -1
  273. package/dist/types/channels/whatsapp/runtime.d.ts +0 -25
  274. package/dist/types/channels/whatsapp/runtime.d.ts.map +0 -1
  275. package/dist/types/channels/whatsapp/session.d.ts +0 -56
  276. package/dist/types/channels/whatsapp/session.d.ts.map +0 -1
  277. package/dist/types/channels/whatsapp/setup.d.ts +0 -2
  278. package/dist/types/channels/whatsapp/setup.d.ts.map +0 -1
  279. package/dist/types/channels/whatsapp/state.d.ts +0 -18
  280. package/dist/types/channels/whatsapp/state.d.ts.map +0 -1
  281. package/dist/types/channels/whatsapp/typing-controller.d.ts +0 -28
  282. package/dist/types/channels/whatsapp/typing-controller.d.ts.map +0 -1
  283. package/dist/types/tools/impl/message-channel.d.ts +0 -10
  284. package/dist/types/tools/impl/message-channel.d.ts.map +0 -1
  285. package/dist/types/updater/auto-update.d.ts +0 -48
  286. package/dist/types/updater/auto-update.d.ts.map +0 -1
@@ -10,11 +10,11 @@
10
10
  "export type AgentBackendMode = \"local\" | \"api\";\n\nexport function isLocalAgentId(agentId: string): boolean {\n return agentId.startsWith(\"agent-local-\");\n}\n\nexport function isCloudAgentId(agentId: string): boolean {\n return !isLocalAgentId(agentId);\n}\n\nexport function isAgentIdCompatibleWithBackend(\n agentId: string,\n backendMode: AgentBackendMode,\n): boolean {\n return backendMode === \"local\"\n ? isLocalAgentId(agentId)\n : isCloudAgentId(agentId);\n}\n",
11
11
  "import {\n buildConversationBusyErrorBody,\n CONVERSATION_BUSY_TITLE,\n isConversationBusyErrorText,\n} from \"@/utils/conversation-busy-error\";\n\nconst RAW_LOOP_ERROR_PATTERN = /^Unexpected stop reason:\\s*error$/i;\nconst APP_CHAT_URL_PATTERN = /https:\\/\\/app\\.letta\\.com\\/chat\\/\\S+/i;\nconst ESCAPE_CHARACTER = String.fromCharCode(27);\nconst OSC8_PREFIX = `${ESCAPE_CHARACTER}]8;;`;\nconst OSC8_TERMINATOR = `${ESCAPE_CHARACTER}\\\\`;\n\nconst APPROVAL_PENDING_ERROR_PATTERNS = [\n /waiting for approval/i,\n /pending request before continuing/i,\n /approve or deny the pending request/i,\n];\n\nconst DATABASE_LOCK_TIMEOUT_PATTERN =\n /\\bcancel(?:l)?ing statement due to lock timeout\\b/i;\nconst POSTGRES_LOCK_NOT_AVAILABLE_CODE_PATTERN = /\\b55P03\\b/i;\nconst POSTGRES_LOCK_NOT_AVAILABLE_SQLSTATE_PATTERN =\n /\\b(?:sqlstate|pgcode)\\s*[:=]?\\s*[\"']?55P03\\b/i;\nconst POSTGRES_LOCK_NOT_AVAILABLE_CONTEXT_PATTERN =\n /\\b(?:postgres(?:ql)?|psycopg|sqlalchemy|lock[_ -]?not[_ -]?available|lock timeout)\\b/i;\n\nconst RUN_ID_PATTERNS = [\n /\"run_id\"\\s*:\\s*\"([^\"\\\\]+)\"/i,\n /\\brun[_\\s-]?id\\b[\"']?\\s*[:=]\\s*[\"']?([A-Za-z0-9_-]+)/i,\n /\\(run:\\s*([A-Za-z0-9_-]+)\\)/i,\n];\n\nexport type ChannelLifecycleErrorKind =\n | \"approval_pending\"\n | \"conversation_busy\"\n | \"database_lock_timeout\"\n | \"generic\";\n\nexport interface ChannelLifecycleErrorDisplayOptions {\n automaticRetry?: boolean;\n runId?: string | null;\n}\n\nexport interface ChannelLifecycleErrorDisplay {\n kind: ChannelLifecycleErrorKind;\n title: string;\n body: string;\n runId?: string;\n}\n\nexport interface ChannelLifecycleErrorFormatOptions\n extends ChannelLifecycleErrorDisplayOptions {\n codeBlock?: boolean;\n maxLength?: number;\n}\n\nexport const CHANNEL_LIFECYCLE_FALLBACK_ERROR_MESSAGE =\n \"Something went wrong while processing that message. Please try again.\";\n\nexport const CHANNEL_LIFECYCLE_APPROVAL_PENDING_MESSAGE =\n \"The agent is still waiting on a tool approval from an earlier turn. Please approve or deny that pending request, then send your message again.\";\n\nexport const CHANNEL_LIFECYCLE_TRANSIENT_ERROR_MESSAGE =\n \"A temporary error interrupted this turn. Please try again.\";\n\nexport const CHANNEL_LIFECYCLE_CONVERSATION_BUSY_TITLE =\n CONVERSATION_BUSY_TITLE;\n\nfunction stripTrailingRunIdPunctuation(runId: string): string {\n return runId.replace(/[)\"'.,;]+$/g, \"\");\n}\n\nexport function extractChannelLifecycleRunId(\n errorText: string | null | undefined,\n): string | undefined {\n if (!errorText) return undefined;\n for (const pattern of RUN_ID_PATTERNS) {\n const match = errorText.match(pattern);\n const runId = match?.[1]?.trim();\n if (runId) {\n return stripTrailingRunIdPunctuation(runId);\n }\n }\n return undefined;\n}\n\nfunction stripOsc8TerminalLinks(errorText: string): string {\n let output = \"\";\n let cursor = 0;\n\n while (cursor < errorText.length) {\n const linkStart = errorText.indexOf(OSC8_PREFIX, cursor);\n if (linkStart === -1) {\n output += errorText.slice(cursor);\n break;\n }\n\n const labelStart = errorText.indexOf(\n OSC8_TERMINATOR,\n linkStart + OSC8_PREFIX.length,\n );\n if (labelStart === -1) {\n output += errorText.slice(cursor);\n break;\n }\n\n const closeStart = errorText.indexOf(\n OSC8_PREFIX,\n labelStart + OSC8_TERMINATOR.length,\n );\n if (closeStart === -1) {\n output += errorText.slice(cursor);\n break;\n }\n\n const closeEnd = errorText.indexOf(\n OSC8_TERMINATOR,\n closeStart + OSC8_PREFIX.length,\n );\n if (closeEnd === -1) {\n output += errorText.slice(cursor);\n break;\n }\n\n output += errorText.slice(cursor, linkStart);\n output += errorText.slice(labelStart + OSC8_TERMINATOR.length, closeStart);\n cursor = closeEnd + OSC8_TERMINATOR.length;\n }\n\n return output;\n}\n\nexport function sanitizeChannelLifecycleErrorText(\n errorText: string | null | undefined,\n): string {\n if (!errorText) return \"\";\n\n const withoutTerminalLinks = stripOsc8TerminalLinks(errorText);\n\n return withoutTerminalLinks\n .split(\"\\n\")\n .filter((line) => {\n const trimmed = line.trim();\n if (/^View agent:/i.test(trimmed)) return false;\n if (APP_CHAT_URL_PATTERN.test(trimmed)) return false;\n return true;\n })\n .join(\"\\n\")\n .replace(/[ \\t]+\\n/g, \"\\n\")\n .trim();\n}\n\nfunction truncateLifecycleMessage(text: string, maxLength: number): string {\n if (text.length <= maxLength) return text;\n return `${text.slice(0, Math.max(0, maxLength - 1)).trimEnd()}…`;\n}\n\nfunction isDatabaseLockErrorText(errorText: string): boolean {\n return (\n DATABASE_LOCK_TIMEOUT_PATTERN.test(errorText) ||\n POSTGRES_LOCK_NOT_AVAILABLE_SQLSTATE_PATTERN.test(errorText) ||\n (POSTGRES_LOCK_NOT_AVAILABLE_CODE_PATTERN.test(errorText) &&\n POSTGRES_LOCK_NOT_AVAILABLE_CONTEXT_PATTERN.test(errorText))\n );\n}\n\nexport function getChannelLifecycleErrorDisplay(\n errorText: string | null | undefined,\n options: ChannelLifecycleErrorDisplayOptions = {},\n): ChannelLifecycleErrorDisplay {\n const normalized = sanitizeChannelLifecycleErrorText(errorText);\n const optionsRunId = options.runId?.trim();\n const runId = optionsRunId || extractChannelLifecycleRunId(errorText);\n\n if (!normalized || RAW_LOOP_ERROR_PATTERN.test(normalized)) {\n return {\n kind: \"generic\",\n title: \"Turn failed\",\n body: CHANNEL_LIFECYCLE_FALLBACK_ERROR_MESSAGE,\n runId,\n };\n }\n\n if (isDatabaseLockErrorText(normalized)) {\n return {\n kind: \"database_lock_timeout\",\n title: \"Turn failed\",\n body: CHANNEL_LIFECYCLE_TRANSIENT_ERROR_MESSAGE,\n runId,\n };\n }\n\n if (isConversationBusyErrorText(normalized)) {\n return {\n kind: \"conversation_busy\",\n title: CHANNEL_LIFECYCLE_CONVERSATION_BUSY_TITLE,\n body: buildConversationBusyErrorBody(options.automaticRetry ?? false),\n runId,\n };\n }\n\n if (\n APPROVAL_PENDING_ERROR_PATTERNS.some((pattern) => pattern.test(normalized))\n ) {\n return {\n kind: \"approval_pending\",\n title: \"Turn failed\",\n body: CHANNEL_LIFECYCLE_APPROVAL_PENDING_MESSAGE,\n runId,\n };\n }\n\n return {\n kind: \"generic\",\n title: \"Turn failed\",\n body: normalized,\n runId,\n };\n}\n\nexport function normalizeChannelLifecycleErrorMessage(\n errorText: string | null | undefined,\n options: ChannelLifecycleErrorDisplayOptions = {},\n): string {\n return getChannelLifecycleErrorDisplay(errorText, options).body;\n}\n\nexport function formatChannelLifecycleErrorMessage(\n errorText: string | null | undefined,\n options: ChannelLifecycleErrorFormatOptions = {},\n): string {\n const display = getChannelLifecycleErrorDisplay(errorText, options);\n const maxLength = options.maxLength ?? Number.POSITIVE_INFINITY;\n const body = truncateLifecycleMessage(display.body, maxLength);\n\n if (display.kind === \"conversation_busy\") {\n const lines = [display.title, body];\n if (display.runId) {\n lines.push(\"\", `Run ID: ${display.runId}`);\n }\n return lines.join(\"\\n\");\n }\n\n if (display.kind === \"database_lock_timeout\") {\n const lines = [`${display.title}:`, body];\n if (display.runId) {\n lines.push(\"\", `Run ID: ${display.runId}`);\n }\n return lines.join(\"\\n\");\n }\n\n if (options.codeBlock) {\n const escaped = body.replace(/```/g, \"``\\u200b`\");\n const lines = [`${display.title}:`, \"```\", escaped, \"```\"];\n if (display.runId) {\n lines.push(\"\", `Run ID: ${display.runId}`);\n }\n return lines.join(\"\\n\");\n }\n\n const lines = [`${display.title}:`, body];\n if (display.runId) {\n lines.push(\"\", `Run ID: ${display.runId}`);\n }\n return lines.join(\"\\n\");\n}\n",
12
12
  "import type { ChannelTurnSource } from \"@/channels/types\";\nimport type {\n SlackAppConstructor,\n SlackBlock,\n SlackBoltModule,\n} from \"./internal-types\";\n\ntype Constructor = abstract new (...args: never[]) => unknown;\n\nfunction isConstructorFunction<T extends Constructor>(\n value: unknown,\n): value is T {\n return typeof value === \"function\";\n}\n\nfunction resolveSlackAppModule(value: unknown): SlackAppConstructor | null {\n if (!value || typeof value !== \"object\") {\n return null;\n }\n const app = Reflect.get(value, \"App\");\n return isConstructorFunction<SlackAppConstructor>(app) ? app : null;\n}\n\nexport function resolveSlackAppConstructor(\n mod: SlackBoltModule,\n): SlackAppConstructor {\n const defaultExport =\n mod && typeof mod === \"object\" ? Reflect.get(mod, \"default\") : undefined;\n const nestedDefault =\n defaultExport && typeof defaultExport === \"object\"\n ? Reflect.get(defaultExport, \"default\")\n : undefined;\n const App =\n resolveSlackAppModule(mod) ??\n resolveSlackAppModule(defaultExport) ??\n resolveSlackAppModule(nestedDefault) ??\n (isConstructorFunction<SlackAppConstructor>(defaultExport)\n ? defaultExport\n : null);\n\n if (!App) {\n throw new Error(\n 'Installed Slack runtime did not export constructor \"App\".',\n );\n }\n return App;\n}\n\nexport function isNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.length > 0;\n}\n\nexport function firstNonEmptyString(...values: unknown[]): string | undefined {\n return values.find(isNonEmptyString);\n}\n\nexport function asRecord(value: unknown): Record<string, unknown> | null {\n return value && typeof value === \"object\"\n ? (value as Record<string, unknown>)\n : null;\n}\n\nexport function resolveSlackSenderTeamId(value: unknown): string | undefined {\n const record = asRecord(value);\n return record\n ? firstNonEmptyString(record.user_team, record.team_id, record.team)\n : undefined;\n}\n\nexport function normalizeSlackText(text: string): string {\n return text.replace(/^(?:\\s*<@[A-Z0-9]+>\\s*)+/, \"\").trim();\n}\n\nconst IGNORED_SLACK_MESSAGE_SUBTYPES = new Set([\n \"assistant_app_thread\",\n \"channel_archive\",\n \"channel_convert_to_private\",\n \"channel_convert_to_public\",\n \"channel_join\",\n \"channel_leave\",\n \"channel_name\",\n \"channel_posting_permissions\",\n \"channel_purpose\",\n \"channel_topic\",\n \"channel_unarchive\",\n \"document_mention\",\n \"ekm_access_denied\",\n \"file_comment\",\n \"group_archive\",\n \"group_join\",\n \"group_leave\",\n \"group_name\",\n \"group_purpose\",\n \"group_topic\",\n \"group_unarchive\",\n \"pinned_item\",\n \"reminder_add\",\n \"unpinned_item\",\n]);\n\nconst WRAPPER_SLACK_MESSAGE_SUBTYPES = new Set([\n \"message_changed\",\n \"message_deleted\",\n \"message_replied\",\n]);\n\nexport type SlackProcessableInboundMessage = Record<string, unknown> & {\n user?: string;\n bot_id?: string;\n ts: string;\n};\n\nexport function isProcessableSlackInboundMessage(\n rawMessage: Record<string, unknown>,\n): rawMessage is SlackProcessableInboundMessage {\n if (\n (!isNonEmptyString(rawMessage.user) &&\n !isNonEmptyString(rawMessage.bot_id)) ||\n !isNonEmptyString(rawMessage.ts) ||\n rawMessage.hidden === true\n ) {\n return false;\n }\n const subtype = isNonEmptyString(rawMessage.subtype)\n ? rawMessage.subtype\n : null;\n if (!subtype) {\n return true;\n }\n if (IGNORED_SLACK_MESSAGE_SUBTYPES.has(subtype)) {\n return false;\n }\n return !(\n WRAPPER_SLACK_MESSAGE_SUBTYPES.has(subtype) &&\n asRecord(rawMessage.message) !== null\n );\n}\n\nexport function slackTimestampToMillis(timestamp: string): number {\n return Math.round(Number.parseFloat(timestamp) * 1000);\n}\n\nexport function resolveSlackChatType(chatId: string): \"direct\" | \"channel\" {\n return chatId.startsWith(\"D\") ? \"direct\" : \"channel\";\n}\n\nexport function resolveSlackOutboundThreadTs(params: {\n chatId: string;\n threadId?: string | null;\n replyToMessageId?: string | null;\n}): string | undefined {\n if (resolveSlackChatType(params.chatId) === \"direct\") {\n return firstNonEmptyString(params.threadId);\n }\n return firstNonEmptyString(params.threadId, params.replyToMessageId);\n}\n\nexport function asSlackBlocks(\n blocks: unknown[] | undefined,\n): SlackBlock[] | undefined {\n return Array.isArray(blocks) ? (blocks as SlackBlock[]) : undefined;\n}\n\nexport function getSlackActionRecord(\n action: unknown,\n body: unknown,\n): Record<string, unknown> | null {\n const directAction = asRecord(action);\n if (directAction) {\n return directAction;\n }\n const actions = asRecord(body)?.actions;\n return Array.isArray(actions) ? asRecord(actions[0]) : null;\n}\n\nexport function resolveSlackSelectedModel(\n action: unknown,\n body: unknown,\n): string | null {\n const actionRecord = getSlackActionRecord(action, body);\n const selectedOption = asRecord(actionRecord?.selected_option);\n return (\n firstNonEmptyString(selectedOption?.value, actionRecord?.value) ?? null\n );\n}\n\nexport function resolveSlackActionChannelId(body: unknown): string | null {\n const bodyRecord = asRecord(body);\n const channel = asRecord(bodyRecord?.channel);\n const container = asRecord(bodyRecord?.container);\n return firstNonEmptyString(channel?.id, container?.channel_id) ?? null;\n}\n\nexport function resolveSlackActionThreadId(body: unknown): string | null {\n const bodyRecord = asRecord(body);\n const container = asRecord(bodyRecord?.container);\n const message = asRecord(bodyRecord?.message);\n return firstNonEmptyString(container?.thread_ts, message?.thread_ts) ?? null;\n}\n\nexport function resolveSlackActionMessageId(body: unknown): string | undefined {\n const bodyRecord = asRecord(body);\n const container = asRecord(bodyRecord?.container);\n const message = asRecord(bodyRecord?.message);\n return firstNonEmptyString(container?.message_ts, message?.ts);\n}\n\nexport function resolveSlackActionUser(body: unknown): {\n id: string | null;\n name?: string;\n teamId?: string;\n} {\n const user = asRecord(asRecord(body)?.user);\n return {\n id: firstNonEmptyString(user?.id) ?? null,\n name: firstNonEmptyString(user?.name, user?.username, user?.id),\n teamId: firstNonEmptyString(user?.team_id),\n };\n}\n\nexport function resolveSlackSourceThreadTs(\n source: ChannelTurnSource,\n): string | undefined {\n if (\n source.chatType === \"direct\" ||\n resolveSlackChatType(source.chatId) === \"direct\"\n ) {\n return firstNonEmptyString(source.threadId);\n }\n return firstNonEmptyString(source.threadId, source.messageId);\n}\n\nexport function resolveSlackProgressThreadTs(\n source: ChannelTurnSource,\n): string | undefined {\n if (\n source.chatType === \"direct\" ||\n resolveSlackChatType(source.chatId) === \"direct\"\n ) {\n return firstNonEmptyString(source.threadId, source.messageId);\n }\n return resolveSlackSourceThreadTs(source);\n}\n\nexport function normalizeSlackReactionName(value: string): string {\n return value.trim().replace(/^:+|:+$/g, \"\");\n}\n\nexport function resolveSlackUserDisplayName(\n userInfo: unknown,\n): string | undefined {\n const user = asRecord(asRecord(userInfo)?.user);\n const profile = asRecord(user?.profile);\n return firstNonEmptyString(\n profile?.display_name,\n profile?.real_name,\n user?.name,\n );\n}\n\nexport function hasSlackMention(text: string, userId: string | null): boolean {\n return (\n isNonEmptyString(text) &&\n isNonEmptyString(userId) &&\n (text.includes(`<@${userId}>`) || text.includes(`<@${userId}|`))\n );\n}\n\nexport function isSlackFlatChannelThreadOpener(\n source: ChannelTurnSource,\n): boolean {\n return (\n source.chatType === \"channel\" &&\n isNonEmptyString(source.messageId) &&\n (!isNonEmptyString(source.threadId) || source.threadId === source.messageId)\n );\n}\n",
13
- "import { isLocalAgentId } from \"@/agent/agent-id\";\nimport { normalizeChannelLifecycleErrorMessage } from \"@/channels/lifecycle-error\";\nimport { truncateChannelProgressText } from \"@/channels/progress-formatting\";\nimport type { ChannelControlRequestEvent } from \"@/channels/types\";\nimport type { SlackApprovalActionPayload, SlackBlock } from \"./internal-types\";\n\nexport {\n formatSlackToolNameForDisplay,\n resolveSlackConcreteActivity,\n SLACK_ASSISTANT_STARTUP_STATUS,\n SLACK_ASSISTANT_WORKING_STATUS,\n sanitizeSlackStatusText,\n} from \"./progress\";\n\nimport {\n formatSlackToolNameForDisplay,\n sanitizeSlackStatusText,\n} from \"./progress\";\nimport { isNonEmptyString } from \"./utils\";\nexport const SLACK_APPROVAL_ACTION_ID = \"letta_channel_approval\";\n\nconst SLACK_MARKDOWN_BLOCK_TEXT_MAX = 12_000;\nconst SLACK_LIFECYCLE_ERROR_TEXT_MAX = 3_000;\n\nfunction buildSlackChatUrl(\n agentId: string,\n conversationId: string,\n): string | undefined {\n if (isLocalAgentId(agentId)) {\n return undefined;\n }\n const base = `https://chat.letta.com/chat/${agentId}`;\n return conversationId && conversationId !== \"default\"\n ? `${base}?conversation=${conversationId}`\n : base;\n}\n\nexport function buildSlackChatFootnote(identity: {\n agentId: string;\n conversationId: string;\n}): string {\n const chatUrl = buildSlackChatUrl(identity.agentId, identity.conversationId);\n return chatUrl ? `<${chatUrl}|View on web>` : \"\";\n}\n\nexport function buildSlackReplyBlocksWithFootnote(\n text: string,\n footnote: string,\n): SlackBlock[] | undefined {\n const chunks: string[] = [];\n let remaining = text;\n while (remaining.length > 0) {\n if (remaining.length <= SLACK_MARKDOWN_BLOCK_TEXT_MAX) {\n chunks.push(remaining);\n break;\n }\n let cut = remaining.lastIndexOf(\"\\n\", SLACK_MARKDOWN_BLOCK_TEXT_MAX);\n if (cut <= 0) {\n cut = remaining.lastIndexOf(\" \", SLACK_MARKDOWN_BLOCK_TEXT_MAX);\n }\n if (cut <= 0) {\n cut = SLACK_MARKDOWN_BLOCK_TEXT_MAX;\n }\n chunks.push(remaining.slice(0, cut));\n remaining = remaining.slice(cut);\n }\n const markdownChunks = chunks.filter((chunk) => chunk.trim().length > 0);\n if (markdownChunks.length === 0 || markdownChunks.length > 49) {\n return undefined;\n }\n const blocks: SlackBlock[] = markdownChunks.map((chunk) => ({\n type: \"markdown\",\n text: chunk,\n }));\n blocks.push({\n type: \"context\",\n elements: [{ type: \"mrkdwn\", text: footnote }],\n });\n return blocks;\n}\n\nexport function formatSlackControlRequestBlocks(\n event: ChannelControlRequestEvent,\n): SlackBlock[] | undefined {\n if (event.kind !== \"generic_tool_approval\") {\n return undefined;\n }\n const toolName =\n sanitizeSlackStatusText(\n formatSlackToolNameForDisplay(event.toolName),\n 80,\n ) || \"tool\";\n return [\n {\n type: \"section\",\n text: {\n type: \"mrkdwn\",\n text: `*Approval needed*\\nRun \\`${toolName}\\`?`,\n },\n },\n {\n type: \"actions\",\n elements: [\n {\n type: \"button\",\n action_id: SLACK_APPROVAL_ACTION_ID,\n text: { type: \"plain_text\", text: \"Approve\", emoji: true },\n style: \"primary\",\n value: JSON.stringify({\n requestId: event.requestId,\n decision: \"allow\",\n } satisfies SlackApprovalActionPayload),\n },\n {\n type: \"button\",\n action_id: SLACK_APPROVAL_ACTION_ID,\n text: { type: \"plain_text\", text: \"Deny\", emoji: true },\n style: \"danger\",\n value: JSON.stringify({\n requestId: event.requestId,\n decision: \"deny\",\n } satisfies SlackApprovalActionPayload),\n },\n ],\n },\n ];\n}\n\nexport function parseSlackApprovalActionPayload(\n value: unknown,\n): { requestId: string; decision: \"allow\" | \"deny\" } | null {\n if (!isNonEmptyString(value)) {\n return null;\n }\n try {\n const parsed = JSON.parse(value) as SlackApprovalActionPayload;\n if (\n !isNonEmptyString(parsed.requestId) ||\n (parsed.decision !== \"allow\" && parsed.decision !== \"deny\")\n ) {\n return null;\n }\n return { requestId: parsed.requestId, decision: parsed.decision };\n } catch {\n return null;\n }\n}\n\nexport function buildSlackApprovalDecisionBlocks(text: string): SlackBlock[] {\n return [\n {\n type: \"section\",\n text: { type: \"mrkdwn\", text },\n },\n ];\n}\n\nexport function shouldPostSlackTerminalError(stopReason: string): boolean {\n return ![\"end_turn\", \"cancelled\", \"requires_approval\", \"tool_rule\"].includes(\n stopReason,\n );\n}\n\nexport function formatSlackLifecycleErrorMessage(errorText: string): string {\n return truncateChannelProgressText(\n normalizeChannelLifecycleErrorMessage(errorText),\n SLACK_LIFECYCLE_ERROR_TEXT_MAX,\n \"...\",\n );\n}\n",
13
+ "import { isLocalAgentId } from \"@/agent/agent-id\";\nimport { formatChannelLifecycleErrorMessage } from \"@/channels/lifecycle-error\";\nimport type { ChannelControlRequestEvent } from \"@/channels/types\";\nimport type { SlackApprovalActionPayload, SlackBlock } from \"./internal-types\";\n\nexport {\n formatSlackToolNameForDisplay,\n resolveSlackConcreteActivity,\n SLACK_ASSISTANT_STARTUP_STATUS,\n SLACK_ASSISTANT_WORKING_STATUS,\n sanitizeSlackStatusText,\n} from \"./progress\";\n\nimport {\n formatSlackToolNameForDisplay,\n sanitizeSlackStatusText,\n} from \"./progress\";\nimport { isNonEmptyString } from \"./utils\";\nexport const SLACK_APPROVAL_ACTION_ID = \"letta_channel_approval\";\n\nconst SLACK_MARKDOWN_BLOCK_TEXT_MAX = 12_000;\nconst SLACK_LIFECYCLE_ERROR_TEXT_MAX = 3_000;\n\nfunction buildSlackChatUrl(\n agentId: string,\n conversationId: string,\n): string | undefined {\n if (isLocalAgentId(agentId)) {\n return undefined;\n }\n const base = `https://chat.letta.com/chat/${agentId}`;\n return conversationId && conversationId !== \"default\"\n ? `${base}?conversation=${conversationId}`\n : base;\n}\n\nexport function buildSlackChatFootnote(identity: {\n agentId: string;\n conversationId: string;\n}): string {\n const chatUrl = buildSlackChatUrl(identity.agentId, identity.conversationId);\n return chatUrl ? `<${chatUrl}|View on web>` : \"\";\n}\n\nexport function buildSlackReplyBlocksWithFootnote(\n text: string,\n footnote: string,\n): SlackBlock[] | undefined {\n const chunks: string[] = [];\n let remaining = text;\n while (remaining.length > 0) {\n if (remaining.length <= SLACK_MARKDOWN_BLOCK_TEXT_MAX) {\n chunks.push(remaining);\n break;\n }\n let cut = remaining.lastIndexOf(\"\\n\", SLACK_MARKDOWN_BLOCK_TEXT_MAX);\n if (cut <= 0) {\n cut = remaining.lastIndexOf(\" \", SLACK_MARKDOWN_BLOCK_TEXT_MAX);\n }\n if (cut <= 0) {\n cut = SLACK_MARKDOWN_BLOCK_TEXT_MAX;\n }\n chunks.push(remaining.slice(0, cut));\n remaining = remaining.slice(cut);\n }\n const markdownChunks = chunks.filter((chunk) => chunk.trim().length > 0);\n if (markdownChunks.length === 0 || markdownChunks.length > 49) {\n return undefined;\n }\n const blocks: SlackBlock[] = markdownChunks.map((chunk) => ({\n type: \"markdown\",\n text: chunk,\n }));\n blocks.push({\n type: \"context\",\n elements: [{ type: \"mrkdwn\", text: footnote }],\n });\n return blocks;\n}\n\nexport function formatSlackControlRequestBlocks(\n event: ChannelControlRequestEvent,\n): SlackBlock[] | undefined {\n if (event.kind !== \"generic_tool_approval\") {\n return undefined;\n }\n const toolName =\n sanitizeSlackStatusText(\n formatSlackToolNameForDisplay(event.toolName),\n 80,\n ) || \"tool\";\n return [\n {\n type: \"section\",\n text: {\n type: \"mrkdwn\",\n text: `*Approval needed*\\nRun \\`${toolName}\\`?`,\n },\n },\n {\n type: \"actions\",\n elements: [\n {\n type: \"button\",\n action_id: SLACK_APPROVAL_ACTION_ID,\n text: { type: \"plain_text\", text: \"Approve\", emoji: true },\n style: \"primary\",\n value: JSON.stringify({\n requestId: event.requestId,\n decision: \"allow\",\n } satisfies SlackApprovalActionPayload),\n },\n {\n type: \"button\",\n action_id: SLACK_APPROVAL_ACTION_ID,\n text: { type: \"plain_text\", text: \"Deny\", emoji: true },\n style: \"danger\",\n value: JSON.stringify({\n requestId: event.requestId,\n decision: \"deny\",\n } satisfies SlackApprovalActionPayload),\n },\n ],\n },\n ];\n}\n\nexport function parseSlackApprovalActionPayload(\n value: unknown,\n): { requestId: string; decision: \"allow\" | \"deny\" } | null {\n if (!isNonEmptyString(value)) {\n return null;\n }\n try {\n const parsed = JSON.parse(value) as SlackApprovalActionPayload;\n if (\n !isNonEmptyString(parsed.requestId) ||\n (parsed.decision !== \"allow\" && parsed.decision !== \"deny\")\n ) {\n return null;\n }\n return { requestId: parsed.requestId, decision: parsed.decision };\n } catch {\n return null;\n }\n}\n\nexport function buildSlackApprovalDecisionBlocks(text: string): SlackBlock[] {\n return [\n {\n type: \"section\",\n text: { type: \"mrkdwn\", text },\n },\n ];\n}\n\nexport function shouldPostSlackTerminalError(stopReason: string): boolean {\n return ![\"end_turn\", \"cancelled\", \"requires_approval\", \"tool_rule\"].includes(\n stopReason,\n );\n}\n\nexport function formatSlackLifecycleErrorMessage(errorText: string): string {\n return formatChannelLifecycleErrorMessage(errorText, {\n codeBlock: true,\n maxLength: SLACK_LIFECYCLE_ERROR_TEXT_MAX,\n });\n}\n",
14
14
  "import type { OutboundChannelMessage } from \"@/channels/types\";\nimport {\n buildSlackChatFootnote,\n buildSlackReplyBlocksWithFootnote,\n} from \"./presentation\";\nimport {\n normalizeSlackReactionName,\n resolveSlackOutboundThreadTs,\n} from \"./public-utils\";\n\nexport interface SlackSenderPostMessageParams {\n channel: string;\n text: string;\n threadTs?: string;\n blocks?: unknown[];\n}\n\nexport interface SlackSenderPostMessageResult {\n messageId: string;\n}\n\nexport interface SlackSenderMessageResult {\n messageId: string;\n}\n\nexport interface SlackSenderReactionParams {\n channel: string;\n timestamp: string;\n name: string;\n}\n\nexport interface SlackSenderClient {\n postMessage(\n params: SlackSenderPostMessageParams,\n ): Promise<SlackSenderPostMessageResult>;\n addReaction?(params: SlackSenderReactionParams): Promise<void>;\n removeReaction?(params: SlackSenderReactionParams): Promise<void>;\n}\n\nexport interface SlackChannelSender {\n sendMessage(\n message: OutboundChannelMessage,\n ): Promise<SlackSenderMessageResult>;\n sendDirectReply(params: SlackDirectReplyParams): Promise<void>;\n}\n\nexport interface SlackDirectReplyParams {\n chatId: string;\n text: string;\n replyToMessageId?: string;\n threadId?: string | null;\n blocks?: unknown[];\n}\n\nexport interface CreateSlackChannelSenderParams {\n client: SlackSenderClient;\n}\n\nasync function sendSlackReaction(\n client: SlackSenderClient,\n message: OutboundChannelMessage,\n): Promise<SlackSenderMessageResult> {\n const targetMessageId = message.targetMessageId ?? message.replyToMessageId;\n if (!targetMessageId) {\n throw new Error(\n \"Slack reactions require message_id (or reply_to_message_id) to identify the target message.\",\n );\n }\n const name = normalizeSlackReactionName(message.reaction ?? \"\");\n if (!name) {\n throw new Error(\"Slack reaction emoji cannot be empty.\");\n }\n const params: SlackSenderReactionParams = {\n channel: message.chatId,\n timestamp: targetMessageId,\n name,\n };\n if (message.removeReaction) {\n if (!client.removeReaction) {\n throw new Error(\n \"Slack sender client does not support removing reactions.\",\n );\n }\n await client.removeReaction(params);\n } else {\n if (!client.addReaction) {\n throw new Error(\"Slack sender client does not support adding reactions.\");\n }\n await client.addReaction(params);\n }\n return { messageId: targetMessageId };\n}\n\nfunction buildSlackOutboundBlocks(\n message: OutboundChannelMessage,\n): unknown[] | undefined {\n if (!message.agentId || !message.conversationId) {\n return undefined;\n }\n\n const footnote = buildSlackChatFootnote({\n agentId: message.agentId,\n conversationId: message.conversationId,\n });\n if (!footnote) {\n return undefined;\n }\n\n return buildSlackReplyBlocksWithFootnote(message.text, footnote);\n}\n\nexport function createSlackChannelSender(\n params: CreateSlackChannelSenderParams,\n): SlackChannelSender {\n const { client } = params;\n return {\n async sendMessage(\n message: OutboundChannelMessage,\n ): Promise<SlackSenderMessageResult> {\n if (message.reaction) {\n return await sendSlackReaction(client, message);\n }\n const threadTs = resolveSlackOutboundThreadTs({\n chatId: message.chatId,\n threadId: message.threadId,\n replyToMessageId: message.replyToMessageId,\n });\n const blocks = buildSlackOutboundBlocks(message);\n return await client.postMessage({\n channel: message.chatId,\n text: message.text,\n ...(blocks ? { blocks } : {}),\n ...(threadTs ? { threadTs } : {}),\n });\n },\n\n async sendDirectReply(params: SlackDirectReplyParams): Promise<void> {\n const threadTs = resolveSlackOutboundThreadTs({\n chatId: params.chatId,\n threadId: params.threadId,\n replyToMessageId: params.replyToMessageId,\n });\n await client.postMessage({\n channel: params.chatId,\n text: params.text,\n ...(params.blocks ? { blocks: params.blocks } : {}),\n ...(threadTs ? { threadTs } : {}),\n });\n },\n };\n}\n",
15
15
  "import type {\n ChannelTurnSource,\n OutboundChannelMessage,\n} from \"@/channels/types\";\nimport {\n firstNonEmptyString,\n isNonEmptyString,\n resolveSlackChatType,\n resolveSlackProgressThreadTs,\n resolveSlackSourceThreadTs,\n} from \"./public-utils\";\n\nconst SLACK_ASSISTANT_STATUS_KEEPALIVE_MS = 90_000;\n\nexport interface SlackStatusWriteClient {\n assistant?: {\n threads?: {\n setStatus?: (args: {\n channel_id: string;\n thread_ts: string;\n status: string;\n loading_messages?: string[];\n }) => Promise<unknown>;\n };\n };\n}\n\nexport type AgentConvSlackState = {\n isThinkingActive: boolean;\n thinkingText: string;\n typingFooterText: string;\n};\n\nexport type SlackStatusController = {\n getUniqueSources: (sources: ChannelTurnSource[]) => ChannelTurnSource[];\n getLifecycleErrorReplyKey: (source: ChannelTurnSource) => string | null;\n activate: (\n source: ChannelTurnSource,\n footerText: string,\n loadingText: string,\n ) => Promise<void>;\n deactivate: (source: ChannelTurnSource) => Promise<void>;\n clearStale: (source: ChannelTurnSource) => Promise<void>;\n markAutoCleared: (source: ChannelTurnSource) => void;\n markAutoClearedForMessage: (\n msg: Pick<\n OutboundChannelMessage,\n \"agentId\" | \"conversationId\" | \"chatId\" | \"threadId\" | \"replyToMessageId\"\n >,\n ) => void;\n activeSources: () => ChannelTurnSource[];\n clear: () => void;\n};\n\nexport function createSlackStatusController(params: {\n ensureApp: () => Promise<unknown>;\n ensureWriteClient: () => Promise<SlackStatusWriteClient>;\n resolveKnownThreadRoot: (messageId: string) => string;\n}): SlackStatusController {\n const stateByConversation = new Map<string, AgentConvSlackState>();\n const sourceByConversation = new Map<string, ChannelTurnSource>();\n const signatureByConversation = new Map<string, string>();\n const writePromiseByConversation = new Map<string, Promise<void>>();\n const keepaliveByConversation = new Map<\n string,\n ReturnType<typeof setTimeout>\n >();\n const clearedStaleReplyKeys = new Set<string>();\n\n function getConversationKey(source: ChannelTurnSource): string | null {\n return source.channel === \"slack\" &&\n isNonEmptyString(source.agentId) &&\n isNonEmptyString(source.conversationId)\n ? `${source.agentId}:${source.conversationId}`\n : null;\n }\n\n function getLifecycleReplyKey(source: ChannelTurnSource): string | null {\n if (source.channel !== \"slack\" || !isNonEmptyString(source.chatId)) {\n return null;\n }\n const replyToMessageId = resolveSlackProgressThreadTs(source);\n return isNonEmptyString(replyToMessageId)\n ? `${source.chatId}:${replyToMessageId}`\n : null;\n }\n\n function getLifecycleErrorReplyKey(source: ChannelTurnSource): string | null {\n if (source.channel !== \"slack\" || !isNonEmptyString(source.chatId)) {\n return null;\n }\n if (\n source.chatType === \"direct\" ||\n resolveSlackChatType(source.chatId) === \"direct\"\n ) {\n const replyToMessageId = resolveSlackSourceThreadTs(source);\n return isNonEmptyString(replyToMessageId)\n ? `${source.chatId}:${replyToMessageId}`\n : `${source.chatId}:direct`;\n }\n return getLifecycleReplyKey(source);\n }\n\n function getUniqueSources(sources: ChannelTurnSource[]): ChannelTurnSource[] {\n const seen = new Set<string>();\n const unique: ChannelTurnSource[] = [];\n for (const source of sources) {\n const key = getConversationKey(source);\n if (!key || seen.has(key) || !getLifecycleReplyKey(source)) continue;\n seen.add(key);\n unique.push(source);\n }\n return unique;\n }\n\n function clearKeepalive(key: string): void {\n const timer = keepaliveByConversation.get(key);\n if (timer) {\n clearTimeout(timer);\n keepaliveByConversation.delete(key);\n }\n }\n\n async function writeStatus(\n source: ChannelTurnSource,\n footerText: string,\n loadingText: string,\n options: { force?: boolean } = {},\n ): Promise<boolean> {\n const stateKey = getConversationKey(source);\n const replyKey = getLifecycleReplyKey(source);\n const threadTs = resolveSlackProgressThreadTs(source);\n if (!stateKey || !replyKey || !threadTs) return false;\n\n const signature = `${footerText}\\n${loadingText}`;\n if (!options.force && signatureByConversation.get(stateKey) === signature) {\n return true;\n }\n\n await params.ensureApp();\n const slackClient = await params.ensureWriteClient();\n const setStatus = slackClient.assistant?.threads?.setStatus;\n if (!setStatus) return false;\n\n signatureByConversation.set(stateKey, signature);\n const previous =\n writePromiseByConversation.get(stateKey) ?? Promise.resolve();\n const operation = previous.then(async () => {\n try {\n await setStatus.call(slackClient.assistant?.threads, {\n channel_id: source.chatId,\n thread_ts: threadTs,\n status: footerText,\n ...(footerText ? { loading_messages: [loadingText] } : {}),\n });\n if (footerText) clearedStaleReplyKeys.delete(replyKey);\n else clearedStaleReplyKeys.add(replyKey);\n return true;\n } catch (error) {\n if (signatureByConversation.get(stateKey) === signature) {\n signatureByConversation.delete(stateKey);\n }\n console.warn(\n \"[Slack] Failed to update assistant thread status:\",\n error instanceof Error ? error.message : error,\n );\n return false;\n }\n });\n const settled = operation.then(() => undefined);\n writePromiseByConversation.set(stateKey, settled);\n void settled.then(() => {\n if (writePromiseByConversation.get(stateKey) === settled) {\n writePromiseByConversation.delete(stateKey);\n }\n });\n return operation;\n }\n\n function scheduleKeepalive(key: string): void {\n clearKeepalive(key);\n const timer = setTimeout(() => {\n keepaliveByConversation.delete(key);\n void (async () => {\n const state = stateByConversation.get(key);\n const source = sourceByConversation.get(key);\n if (!state?.isThinkingActive || !source) return;\n await writeStatus(source, state.typingFooterText, state.thinkingText, {\n force: true,\n });\n if (state.isThinkingActive) scheduleKeepalive(key);\n })();\n }, SLACK_ASSISTANT_STATUS_KEEPALIVE_MS);\n timer.unref?.();\n keepaliveByConversation.set(key, timer);\n }\n\n async function activate(\n source: ChannelTurnSource,\n footerText: string,\n loadingText: string,\n ): Promise<void> {\n const key = getConversationKey(source);\n if (!key || !getLifecycleReplyKey(source)) return;\n const state = stateByConversation.get(key) ?? {\n isThinkingActive: false,\n thinkingText: \"\",\n typingFooterText: \"\",\n };\n if (\n state.isThinkingActive &&\n state.thinkingText === loadingText &&\n state.typingFooterText === footerText\n ) {\n sourceByConversation.set(key, source);\n return;\n }\n state.isThinkingActive = true;\n state.thinkingText = loadingText;\n state.typingFooterText = footerText;\n stateByConversation.set(key, state);\n sourceByConversation.set(key, source);\n const sent = await writeStatus(source, footerText, loadingText);\n if (sent && state.isThinkingActive) scheduleKeepalive(key);\n else if (!sent) state.isThinkingActive = false;\n }\n\n function markAutoClearedByKey(key: string): void {\n clearKeepalive(key);\n const state = stateByConversation.get(key);\n if (state) state.isThinkingActive = false;\n signatureByConversation.delete(key);\n sourceByConversation.delete(key);\n }\n\n async function deactivate(source: ChannelTurnSource): Promise<void> {\n const key = getConversationKey(source);\n if (!key) return;\n clearKeepalive(key);\n const state = stateByConversation.get(key);\n if (state) state.isThinkingActive = false;\n signatureByConversation.delete(key);\n sourceByConversation.delete(key);\n await writeStatus(source, \"\", \"\", { force: true });\n signatureByConversation.delete(key);\n stateByConversation.delete(key);\n }\n\n async function clearStale(source: ChannelTurnSource): Promise<void> {\n const key = getConversationKey(source);\n const replyKey = getLifecycleReplyKey(source);\n if (\n !key ||\n !replyKey ||\n stateByConversation.get(key)?.isThinkingActive ||\n clearedStaleReplyKeys.has(replyKey)\n ) {\n return;\n }\n await writeStatus(source, \"\", \"\", { force: true });\n signatureByConversation.delete(key);\n }\n\n return {\n getUniqueSources,\n getLifecycleErrorReplyKey,\n activate,\n deactivate,\n clearStale,\n markAutoCleared(source): void {\n const key = getConversationKey(source);\n if (key) markAutoClearedByKey(key);\n },\n markAutoClearedForMessage(msg): void {\n if (\n isNonEmptyString(msg.agentId) &&\n isNonEmptyString(msg.conversationId)\n ) {\n markAutoClearedByKey(`${msg.agentId}:${msg.conversationId}`);\n return;\n }\n const anchor = firstNonEmptyString(msg.threadId, msg.replyToMessageId);\n if (!anchor) return;\n const root = params.resolveKnownThreadRoot(anchor);\n for (const [key, source] of sourceByConversation) {\n if (\n source.chatId === msg.chatId &&\n resolveSlackProgressThreadTs(source) === root\n ) {\n markAutoClearedByKey(key);\n }\n }\n },\n activeSources: () => Array.from(sourceByConversation.values()),\n clear(): void {\n for (const timer of keepaliveByConversation.values()) clearTimeout(timer);\n stateByConversation.clear();\n sourceByConversation.clear();\n signatureByConversation.clear();\n writePromiseByConversation.clear();\n keepaliveByConversation.clear();\n clearedStaleReplyKeys.clear();\n },\n };\n}\n"
16
16
  ],
17
- "mappings": "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",
18
- "debugId": "078E345BB4A2D99664756E2164756E21",
17
+ "mappings": "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",
18
+ "debugId": "F29FA1C9AF0A589064756E2164756E21",
19
19
  "names": []
20
20
  }
@@ -795,7 +795,6 @@ function createChannelTurnProgressBuilder(options = {}) {
795
795
  }
796
796
 
797
797
  // src/channels/gateway-core.ts
798
- var CHANNEL_GATEWAY_TOOL_SCOPE_ID = "channel-gateway";
799
798
  var MAX_ACCEPTED_CLIENT_MESSAGE_IDS = 2048;
800
799
  function runtimeKey(runtime) {
801
800
  return `${runtime.agent_id}:${runtime.conversation_id}`;
@@ -814,6 +813,9 @@ function uniqueSources(sources) {
814
813
  byKey.set(sourceKey(source), source);
815
814
  return [...byKey.values()];
816
815
  }
816
+ function channelTagsForSources(sources) {
817
+ return [...new Set(sources.map((source) => `channel:${source.channel}`))];
818
+ }
817
819
  function stopReasonFromDelta(message) {
818
820
  const delta = message.delta;
819
821
  return delta.message_type === "stop_reason" && "stop_reason" in delta && typeof delta.stop_reason === "string" ? delta.stop_reason : null;
@@ -830,23 +832,19 @@ function lifecycleOutcome(stopReason) {
830
832
  }
831
833
  return "error";
832
834
  }
833
- function errorFromDelta(message) {
834
- const delta = message.delta;
835
- if (delta.message_type !== "loop_error")
836
- return;
837
- return delta.message;
838
- }
839
835
 
840
836
  class ChannelGateway {
841
837
  client;
842
838
  hooks;
843
839
  states = new Map;
844
840
  disposers = [];
841
+ registrationQueue = Promise.resolve();
845
842
  constructor(client, hooks) {
846
843
  this.client = client;
847
844
  this.hooks = hooks;
848
845
  this.disposers.push(client.onMessage((message) => this.handleMessage(message)), client.onExternalToolCall((request) => {
849
- const sources = request.runtime ? this.states.get(runtimeKey(request.runtime))?.active?.sources ?? [] : [];
846
+ const state = request.runtime ? this.states.get(runtimeKey(request.runtime)) : undefined;
847
+ const sources = state?.active?.sources ?? state?.routedSources ?? [];
850
848
  return hooks.executeExternalTool(request, sources);
851
849
  }));
852
850
  }
@@ -877,7 +875,13 @@ class ChannelGateway {
877
875
  disposition: "submitting"
878
876
  });
879
877
  try {
880
- await this.ensureRuntimeRegistration(state, delivery);
878
+ await this.enqueueRegistration(async () => {
879
+ state.routedSources = uniqueSources([
880
+ ...state.routedSources,
881
+ ...delivery.sources
882
+ ]);
883
+ await this.performRuntimeRegistration(state, delivery);
884
+ });
881
885
  const response = await this.client.submitInput({
882
886
  runtime: delivery.runtime,
883
887
  payload: {
@@ -889,7 +893,6 @@ class ChannelGateway {
889
893
  client_message_id: delivery.clientMessageId
890
894
  }
891
895
  ],
892
- external_tool_scope_ids: [CHANNEL_GATEWAY_TOOL_SCOPE_ID],
893
896
  image_failure_mode: "drop"
894
897
  }
895
898
  });
@@ -949,12 +952,15 @@ class ChannelGateway {
949
952
  }
950
953
  async registerRuntime(runtime, sources = [], defaultPermissionMode) {
951
954
  const state = this.getState(runtime);
952
- await this.ensureRuntimeRegistration(state, {
953
- runtime,
954
- content: "",
955
- sources,
956
- clientMessageId: "recovered",
957
- ...defaultPermissionMode ? { defaultPermissionMode } : {}
955
+ await this.enqueueRegistration(async () => {
956
+ this.setRoutedSources(runtime, sources);
957
+ await this.performRuntimeRegistration(state, {
958
+ runtime,
959
+ content: "",
960
+ sources,
961
+ clientMessageId: "recovered",
962
+ ...defaultPermissionMode ? { defaultPermissionMode } : {}
963
+ });
958
964
  });
959
965
  }
960
966
  async submitApprovalResponse(runtime, response) {
@@ -964,6 +970,27 @@ class ChannelGateway {
964
970
  });
965
971
  return result.accepted;
966
972
  }
973
+ setRoutedSources(runtime, sources) {
974
+ this.getState(runtime).routedSources = uniqueSources(sources);
975
+ }
976
+ getKnownRuntimes() {
977
+ return [...this.states.values()].map((state) => state.runtime);
978
+ }
979
+ updateRoutedRuntimeTools(updates, routedSources) {
980
+ return this.enqueueRegistration(async () => {
981
+ if (updates.length > 0) {
982
+ const response = await this.client.runtimeExternalToolsUpdate({
983
+ updates
984
+ });
985
+ if (!response.success) {
986
+ throw new Error(response.error ?? "Failed to update routed runtime tools");
987
+ }
988
+ }
989
+ for (const update of routedSources) {
990
+ this.setRoutedSources(update.runtime, update.sources);
991
+ }
992
+ });
993
+ }
967
994
  getModelStatus(runtime) {
968
995
  return this.states.get(runtimeKey(runtime))?.modelStatus ?? null;
969
996
  }
@@ -985,6 +1012,7 @@ class ChannelGateway {
985
1012
  active: null,
986
1013
  registrationSignature: null,
987
1014
  registration: null,
1015
+ routedSources: [],
988
1016
  replayedControlRequestIds: new Set,
989
1017
  submissionQueue: Promise.resolve(),
990
1018
  hookQueue: null,
@@ -1018,11 +1046,22 @@ class ChannelGateway {
1018
1046
  });
1019
1047
  return pending;
1020
1048
  }
1021
- async ensureRuntimeRegistration(state, delivery) {
1049
+ enqueueRegistration(task) {
1050
+ const result = this.registrationQueue.then(task, task);
1051
+ this.registrationQueue = result.then(() => {
1052
+ return;
1053
+ }, () => {
1054
+ return;
1055
+ });
1056
+ return result;
1057
+ }
1058
+ async performRuntimeRegistration(state, delivery) {
1022
1059
  const tool = await this.hooks.buildExternalTool(delivery.runtime, delivery.sources);
1060
+ const conversationTags = channelTagsForSources(delivery.sources);
1023
1061
  const signature = JSON.stringify({
1024
1062
  mode: delivery.defaultPermissionMode ?? null,
1025
- tool
1063
+ tool,
1064
+ conversationTags
1026
1065
  });
1027
1066
  if (state.registrationSignature === signature && state.registration) {
1028
1067
  return state.registration;
@@ -1030,17 +1069,14 @@ class ChannelGateway {
1030
1069
  const registration = this.client.runtimeStart({
1031
1070
  agent_id: delivery.runtime.agent_id,
1032
1071
  conversation_id: delivery.runtime.conversation_id,
1072
+ ...conversationTags.length > 0 ? { conversation_source_tags: conversationTags } : {},
1033
1073
  ...delivery.defaultPermissionMode ? { mode: delivery.defaultPermissionMode } : {},
1034
1074
  recover_approvals: true,
1035
1075
  force_device_status: false,
1036
1076
  wait_for_replay: true,
1077
+ preserve_skill_sources: true,
1037
1078
  client_info: { name: "channel-gateway", title: "Channel Gateway" },
1038
- external_tools: [
1039
- {
1040
- scope_id: CHANNEL_GATEWAY_TOOL_SCOPE_ID,
1041
- tools: [tool]
1042
- }
1043
- ]
1079
+ external_tools: tool ? [{ tools: [tool] }] : []
1044
1080
  }).then((response) => {
1045
1081
  if (!response.success) {
1046
1082
  throw new Error(response.error ?? "Failed to register channel runtime");
@@ -1129,6 +1165,8 @@ class ChannelGateway {
1129
1165
  this.enqueueHook(state, () => this.hooks.onLifecycle(processingEvent));
1130
1166
  }
1131
1167
  handleStreamDelta(message) {
1168
+ if (message.subagent_id)
1169
+ return;
1132
1170
  const state = this.getState(message.runtime);
1133
1171
  const active = state.active;
1134
1172
  if (!active)
@@ -1136,9 +1174,6 @@ class ChannelGateway {
1136
1174
  const runId = runIdFromDelta(message);
1137
1175
  if (runId)
1138
1176
  active.runId = runId;
1139
- const deltaError = errorFromDelta(message);
1140
- if (deltaError)
1141
- active.error = deltaError;
1142
1177
  for (const update of active.progress.buildUpdates(message.delta)) {
1143
1178
  this.enqueueHook(state, () => this.hooks.onProgress({
1144
1179
  type: "progress",
@@ -1149,24 +1184,14 @@ class ChannelGateway {
1149
1184
  }
1150
1185
  active.richDraft?.handleDelta(message.delta);
1151
1186
  const stopReason = stopReasonFromDelta(message);
1152
- if (!stopReason)
1153
- return;
1154
- if (stopReason === "requires_approval") {
1187
+ if (stopReason === "requires_approval" || stopReason === "end_turn") {
1155
1188
  active.richDraft?.flushPending();
1156
- return;
1157
1189
  }
1158
- if (stopReason === "end_turn")
1159
- active.richDraft?.flushPending();
1160
- this.handleTurnFinished(message.runtime, {
1161
- stopReason,
1162
- runId: active.runId,
1163
- error: errorFromDelta(message)
1164
- });
1165
1190
  }
1166
1191
  handleTurnFinished(runtime, terminal) {
1167
1192
  const state = this.getState(runtime);
1168
1193
  const active = state.active;
1169
- if (!active || terminal.stopReason === "requires_approval")
1194
+ if (!active)
1170
1195
  return;
1171
1196
  state.active = null;
1172
1197
  active.richDraft?.dispose();
@@ -1177,7 +1202,7 @@ class ChannelGateway {
1177
1202
  outcome: lifecycleOutcome(terminal.stopReason),
1178
1203
  stopReason: terminal.stopReason,
1179
1204
  ...terminal.runId ?? active.runId ? { runId: terminal.runId ?? active.runId } : {},
1180
- ...terminal.error ?? active.error ? { error: terminal.error ?? active.error } : {}
1205
+ ...terminal.error ? { error: terminal.error } : {}
1181
1206
  }));
1182
1207
  }
1183
1208
  handleControlRequest(message) {
@@ -2183,8 +2208,7 @@ function buildMessageChannelExternalToolDefinition(options) {
2183
2208
  export {
2184
2209
  executeMessageChannel,
2185
2210
  buildMessageChannelExternalToolDefinition,
2186
- ChannelGateway,
2187
- CHANNEL_GATEWAY_TOOL_SCOPE_ID
2211
+ ChannelGateway
2188
2212
  };
2189
2213
 
2190
- //# debugId=3477006DB55C244E64756E2164756E21
2214
+ //# debugId=CF539D37E789E01964756E2164756E21