@agent-native/core 0.118.0 → 0.119.0

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 (480) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +32 -0
  3. package/corpus/core/docs/content/a2a-protocol.mdx +15 -0
  4. package/corpus/core/docs/content/template-chat.mdx +1 -1
  5. package/corpus/core/docs/content/template-plan.mdx +3 -3
  6. package/corpus/core/package.json +1 -1
  7. package/corpus/core/src/a2a/activity.ts +371 -0
  8. package/corpus/core/src/a2a/client.ts +35 -11
  9. package/corpus/core/src/a2a/index.ts +21 -0
  10. package/corpus/core/src/a2a/types.ts +8 -0
  11. package/corpus/core/src/agent/model-config.ts +19 -23
  12. package/corpus/core/src/agent/production-agent.ts +167 -100
  13. package/corpus/core/src/agent/types.ts +16 -1
  14. package/corpus/core/src/cli/index.ts +18 -10
  15. package/corpus/core/src/cli/multi-frontier-runs.ts +5 -3
  16. package/corpus/core/src/cli/templates-meta.ts +0 -12
  17. package/corpus/core/src/cli/workspace-dev.ts +1 -1
  18. package/corpus/core/src/client/AgentPanel.tsx +9 -1
  19. package/corpus/core/src/client/RunStuckBanner.tsx +39 -47
  20. package/corpus/core/src/client/chat/action-chat-ui-surface.tsx +32 -0
  21. package/corpus/core/src/client/chat/message-components.tsx +53 -8
  22. package/corpus/core/src/client/chat/tool-call-display.tsx +214 -44
  23. package/corpus/core/src/client/chat/widgets/InlineExtensionWidget.tsx +0 -1
  24. package/corpus/core/src/client/chat/widgets/builtin-tool-renderers.tsx +7 -3
  25. package/corpus/core/src/client/chat-model-groups.ts +67 -27
  26. package/corpus/core/src/client/conversation/AgentConversation.tsx +12 -1
  27. package/corpus/core/src/client/error-capture.ts +2 -6
  28. package/corpus/core/src/client/resources/McpConnectionSuggestion.tsx +20 -14
  29. package/corpus/core/src/client/resources/ResourcesPanel.tsx +5 -1
  30. package/corpus/core/src/client/resources/mcp-integration-catalog.ts +7 -17
  31. package/corpus/core/src/client/resources/mcp-integration-logos.ts +2 -2
  32. package/corpus/core/src/client/route-chunk-recovery.ts +5 -3
  33. package/corpus/core/src/client/session-replay.ts +3 -3
  34. package/corpus/core/src/client/settings/SettingsPanel.tsx +15 -6
  35. package/corpus/core/src/client/sharing/ShareButton.tsx +1 -27
  36. package/corpus/core/src/client/sharing/ShareDialog.tsx +0 -16
  37. package/corpus/core/src/client/sharing/useShareButtonController.ts +0 -7
  38. package/corpus/core/src/client/sharing/useShareDialogController.ts +0 -2
  39. package/corpus/core/src/client/sse-event-processor.ts +85 -1
  40. package/corpus/core/src/client/transcription/use-live-transcription.ts +64 -45
  41. package/corpus/core/src/deploy/build.ts +2 -1
  42. package/corpus/core/src/guards/db-tool-scoping.ts +1 -1
  43. package/corpus/core/src/integrations/adapters/slack.ts +84 -5
  44. package/corpus/core/src/integrations/index.ts +5 -1
  45. package/corpus/core/src/localization/default-messages.ts +7 -1
  46. package/corpus/core/src/mcp-client/oauth-routes.ts +45 -12
  47. package/corpus/core/src/scripts/agent-engines/list-agent-engines.ts +1 -18
  48. package/corpus/core/src/scripts/call-agent.ts +49 -6
  49. package/corpus/core/src/server/agent-chat-plugin.ts +50 -10
  50. package/corpus/core/src/server/realtime-voice.ts +4 -1
  51. package/corpus/core/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +16 -0
  52. package/corpus/core/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +7 -5
  53. package/corpus/core/src/terminal/cli-registry.ts +1 -1
  54. package/corpus/core/src/vite/client.ts +166 -1
  55. package/corpus/templates/analytics/app/hooks/use-dashboard-views.ts +13 -1
  56. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/ViewsMenu.tsx +10 -0
  57. package/corpus/templates/analytics/changelog/2026-07-22-show-a-useful-error-when-saving-a-dashboard-view-fails.md +6 -0
  58. package/corpus/templates/brain/app/routes/sources.tsx +181 -114
  59. package/corpus/templates/clips/AGENTS.md +8 -6
  60. package/corpus/templates/clips/actions/request-transcript.ts +90 -420
  61. package/corpus/templates/clips/actions/save-browser-transcript.ts +11 -28
  62. package/corpus/templates/clips/app/components/capture-install-options.tsx +5 -3
  63. package/corpus/templates/clips/app/components/player/transcript-panel.tsx +3 -136
  64. package/corpus/templates/clips/app/lib/capture-install-options.ts +15 -4
  65. package/corpus/templates/clips/app/routes/download.tsx +3 -2
  66. package/corpus/templates/clips/changelog/2026-07-22-fixed-an-intermittent-hydration-error-on-the-download-page.md +6 -0
  67. package/corpus/templates/clips/changelog/2026-07-22-fixed-transcript-generation-when-native-speech-capture-retur.md +6 -0
  68. package/corpus/templates/clips/changelog/2026-07-22-transcript-generation-now-retries-with-backup-speech-recogni.md +6 -0
  69. package/corpus/templates/clips/changelog/2026-07-23-fixed-recordings-failing-to-save-with-a-cancelled-or-cleanup.md +6 -0
  70. package/corpus/templates/clips/server/lib/public-agent-context.ts +2 -2
  71. package/corpus/templates/clips/server/plugins/db.ts +9 -1
  72. package/corpus/templates/clips/server/register-secrets.ts +7 -6
  73. package/corpus/templates/content/app/components/editor/SlashCommandMenu.tsx +16 -84
  74. package/corpus/templates/content/app/components/editor/VisualEditor.tsx +13 -7
  75. package/corpus/templates/content/app/components/editor/extensions/ImageBlock.tsx +2 -2
  76. package/corpus/templates/content/app/i18n-data.ts +10 -0
  77. package/corpus/templates/design/server/lib/fig-file-decoder.ts +1 -0
  78. package/corpus/templates/plan/app/entry.client.tsx +3 -0
  79. package/corpus/templates/plan/changelog/2026-07-22-recover-stale-pages-after-a-deployment-refresh-automatically.md +6 -0
  80. package/corpus/templates/slides/app/hooks/use-agent-generating.ts +10 -3
  81. package/corpus/templates/slides/app/pages/Index.tsx +1 -0
  82. package/corpus/templates/slides/changelog/2026-07-22-new-deck-prompts-now-open-in-their-own-visible-chat-thread.md +6 -0
  83. package/corpus/toolkit/CHANGELOG.md +9 -0
  84. package/corpus/toolkit/package.json +1 -1
  85. package/corpus/toolkit/src/composer/PromptComposer.tsx +5 -1
  86. package/corpus/toolkit/src/composer/RealtimeVoiceMode.tsx +119 -31
  87. package/corpus/toolkit/src/composer/useRealtimeVoiceMode.tsx +30 -0
  88. package/corpus/toolkit/src/conformance/runner.tsx +153 -1
  89. package/corpus/toolkit/src/editor/SharedRichEditor.tsx +13 -2
  90. package/corpus/toolkit/src/editor/SlashCommandMenu.tsx +20 -0
  91. package/corpus/toolkit/src/editor/index.ts +2 -0
  92. package/corpus/toolkit/src/styles.css +52 -23
  93. package/dist/a2a/activity.d.ts +50 -0
  94. package/dist/a2a/activity.d.ts.map +1 -0
  95. package/dist/a2a/activity.js +236 -0
  96. package/dist/a2a/activity.js.map +1 -0
  97. package/dist/a2a/client.d.ts +5 -1
  98. package/dist/a2a/client.d.ts.map +1 -1
  99. package/dist/a2a/client.js +18 -13
  100. package/dist/a2a/client.js.map +1 -1
  101. package/dist/a2a/index.d.ts +2 -1
  102. package/dist/a2a/index.d.ts.map +1 -1
  103. package/dist/a2a/index.js +1 -0
  104. package/dist/a2a/index.js.map +1 -1
  105. package/dist/a2a/types.d.ts +1 -0
  106. package/dist/a2a/types.d.ts.map +1 -1
  107. package/dist/a2a/types.js.map +1 -1
  108. package/dist/agent/engine/anthropic-engine.d.ts +1 -1
  109. package/dist/agent/engine/builder-engine.d.ts +2 -2
  110. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  111. package/dist/agent/model-config.d.ts +16 -16
  112. package/dist/agent/model-config.d.ts.map +1 -1
  113. package/dist/agent/model-config.js +19 -23
  114. package/dist/agent/model-config.js.map +1 -1
  115. package/dist/agent/production-agent.d.ts +26 -0
  116. package/dist/agent/production-agent.d.ts.map +1 -1
  117. package/dist/agent/production-agent.js +137 -80
  118. package/dist/agent/production-agent.js.map +1 -1
  119. package/dist/agent/types.d.ts +10 -0
  120. package/dist/agent/types.d.ts.map +1 -1
  121. package/dist/agent/types.js.map +1 -1
  122. package/dist/cli/index.js +18 -8
  123. package/dist/cli/index.js.map +1 -1
  124. package/dist/cli/multi-frontier-runs.js +3 -3
  125. package/dist/cli/multi-frontier-runs.js.map +1 -1
  126. package/dist/cli/templates-meta.d.ts.map +1 -1
  127. package/dist/cli/templates-meta.js +0 -12
  128. package/dist/cli/templates-meta.js.map +1 -1
  129. package/dist/cli/workspace-dev.js +1 -1
  130. package/dist/cli/workspace-dev.js.map +1 -1
  131. package/dist/client/AgentPanel.d.ts.map +1 -1
  132. package/dist/client/AgentPanel.js +4 -1
  133. package/dist/client/AgentPanel.js.map +1 -1
  134. package/dist/client/RunStuckBanner.d.ts +3 -5
  135. package/dist/client/RunStuckBanner.d.ts.map +1 -1
  136. package/dist/client/RunStuckBanner.js +17 -18
  137. package/dist/client/RunStuckBanner.js.map +1 -1
  138. package/dist/client/chat/action-chat-ui-surface.d.ts +8 -0
  139. package/dist/client/chat/action-chat-ui-surface.d.ts.map +1 -0
  140. package/dist/client/chat/action-chat-ui-surface.js +10 -0
  141. package/dist/client/chat/action-chat-ui-surface.js.map +1 -0
  142. package/dist/client/chat/message-components.d.ts +3 -0
  143. package/dist/client/chat/message-components.d.ts.map +1 -1
  144. package/dist/client/chat/message-components.js +40 -7
  145. package/dist/client/chat/message-components.js.map +1 -1
  146. package/dist/client/chat/tool-call-display.d.ts +3 -1
  147. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  148. package/dist/client/chat/tool-call-display.js +76 -23
  149. package/dist/client/chat/tool-call-display.js.map +1 -1
  150. package/dist/client/chat/widgets/InlineExtensionWidget.d.ts.map +1 -1
  151. package/dist/client/chat/widgets/InlineExtensionWidget.js +1 -1
  152. package/dist/client/chat/widgets/InlineExtensionWidget.js.map +1 -1
  153. package/dist/client/chat/widgets/builtin-tool-renderers.d.ts.map +1 -1
  154. package/dist/client/chat/widgets/builtin-tool-renderers.js +5 -3
  155. package/dist/client/chat/widgets/builtin-tool-renderers.js.map +1 -1
  156. package/dist/client/chat-model-groups.d.ts.map +1 -1
  157. package/dist/client/chat-model-groups.js +44 -21
  158. package/dist/client/chat-model-groups.js.map +1 -1
  159. package/dist/client/conversation/AgentConversation.d.ts.map +1 -1
  160. package/dist/client/conversation/AgentConversation.js +3 -2
  161. package/dist/client/conversation/AgentConversation.js.map +1 -1
  162. package/dist/client/error-capture.d.ts.map +1 -1
  163. package/dist/client/error-capture.js +2 -2
  164. package/dist/client/error-capture.js.map +1 -1
  165. package/dist/client/resources/McpConnectionSuggestion.d.ts +1 -0
  166. package/dist/client/resources/McpConnectionSuggestion.d.ts.map +1 -1
  167. package/dist/client/resources/McpConnectionSuggestion.js +9 -8
  168. package/dist/client/resources/McpConnectionSuggestion.js.map +1 -1
  169. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  170. package/dist/client/resources/ResourcesPanel.js +3 -1
  171. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  172. package/dist/client/resources/mcp-integration-catalog.d.ts +1 -0
  173. package/dist/client/resources/mcp-integration-catalog.d.ts.map +1 -1
  174. package/dist/client/resources/mcp-integration-catalog.js +4 -17
  175. package/dist/client/resources/mcp-integration-catalog.js.map +1 -1
  176. package/dist/client/resources/mcp-integration-logos.js +2 -2
  177. package/dist/client/resources/mcp-integration-logos.js.map +1 -1
  178. package/dist/client/route-chunk-recovery.d.ts.map +1 -1
  179. package/dist/client/route-chunk-recovery.js +5 -3
  180. package/dist/client/route-chunk-recovery.js.map +1 -1
  181. package/dist/client/session-replay.js +3 -3
  182. package/dist/client/session-replay.js.map +1 -1
  183. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  184. package/dist/client/settings/SettingsPanel.js +2 -2
  185. package/dist/client/settings/SettingsPanel.js.map +1 -1
  186. package/dist/client/sharing/ShareButton.d.ts +1 -1
  187. package/dist/client/sharing/ShareButton.d.ts.map +1 -1
  188. package/dist/client/sharing/ShareButton.js +3 -4
  189. package/dist/client/sharing/ShareButton.js.map +1 -1
  190. package/dist/client/sharing/ShareDialog.d.ts.map +1 -1
  191. package/dist/client/sharing/ShareDialog.js +1 -2
  192. package/dist/client/sharing/ShareDialog.js.map +1 -1
  193. package/dist/client/sharing/useShareButtonController.d.ts +0 -1
  194. package/dist/client/sharing/useShareButtonController.d.ts.map +1 -1
  195. package/dist/client/sharing/useShareButtonController.js +0 -6
  196. package/dist/client/sharing/useShareButtonController.js.map +1 -1
  197. package/dist/client/sharing/useShareDialogController.d.ts +0 -1
  198. package/dist/client/sharing/useShareDialogController.d.ts.map +1 -1
  199. package/dist/client/sharing/useShareDialogController.js +0 -1
  200. package/dist/client/sharing/useShareDialogController.js.map +1 -1
  201. package/dist/client/sse-event-processor.d.ts +12 -0
  202. package/dist/client/sse-event-processor.d.ts.map +1 -1
  203. package/dist/client/sse-event-processor.js +63 -1
  204. package/dist/client/sse-event-processor.js.map +1 -1
  205. package/dist/client/transcription/use-live-transcription.d.ts +3 -3
  206. package/dist/client/transcription/use-live-transcription.d.ts.map +1 -1
  207. package/dist/client/transcription/use-live-transcription.js +22 -11
  208. package/dist/client/transcription/use-live-transcription.js.map +1 -1
  209. package/dist/collab/awareness.d.ts +2 -2
  210. package/dist/collab/awareness.d.ts.map +1 -1
  211. package/dist/deploy/build.d.ts.map +1 -1
  212. package/dist/deploy/build.js +1 -1
  213. package/dist/deploy/build.js.map +1 -1
  214. package/dist/guards/db-tool-scoping.js +1 -1
  215. package/dist/guards/db-tool-scoping.js.map +1 -1
  216. package/dist/integrations/adapters/slack.d.ts +1 -0
  217. package/dist/integrations/adapters/slack.d.ts.map +1 -1
  218. package/dist/integrations/adapters/slack.js +61 -5
  219. package/dist/integrations/adapters/slack.js.map +1 -1
  220. package/dist/integrations/index.d.ts +1 -1
  221. package/dist/integrations/index.d.ts.map +1 -1
  222. package/dist/integrations/index.js +1 -1
  223. package/dist/integrations/index.js.map +1 -1
  224. package/dist/localization/default-messages.d.ts +6 -0
  225. package/dist/localization/default-messages.d.ts.map +1 -1
  226. package/dist/localization/default-messages.js +7 -1
  227. package/dist/localization/default-messages.js.map +1 -1
  228. package/dist/mcp-client/oauth-routes.d.ts +3 -0
  229. package/dist/mcp-client/oauth-routes.d.ts.map +1 -1
  230. package/dist/mcp-client/oauth-routes.js +41 -12
  231. package/dist/mcp-client/oauth-routes.js.map +1 -1
  232. package/dist/observability/routes.d.ts +3 -3
  233. package/dist/provider-api/actions/custom-provider-registration.d.ts +8 -8
  234. package/dist/provider-api/actions/provider-api.d.ts +11 -11
  235. package/dist/scripts/agent-engines/list-agent-engines.d.ts.map +1 -1
  236. package/dist/scripts/agent-engines/list-agent-engines.js +1 -18
  237. package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
  238. package/dist/scripts/call-agent.d.ts.map +1 -1
  239. package/dist/scripts/call-agent.js +49 -6
  240. package/dist/scripts/call-agent.js.map +1 -1
  241. package/dist/secrets/routes.d.ts +6 -6
  242. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  243. package/dist/server/agent-chat-plugin.js +38 -10
  244. package/dist/server/agent-chat-plugin.js.map +1 -1
  245. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  246. package/dist/server/realtime-voice.d.ts.map +1 -1
  247. package/dist/server/realtime-voice.js +1 -1
  248. package/dist/server/realtime-voice.js.map +1 -1
  249. package/dist/server/transcribe-voice.d.ts +1 -1
  250. package/dist/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +16 -0
  251. package/dist/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +7 -5
  252. package/dist/terminal/cli-registry.js +1 -1
  253. package/dist/terminal/cli-registry.js.map +1 -1
  254. package/dist/vite/client.d.ts +8 -1
  255. package/dist/vite/client.d.ts.map +1 -1
  256. package/dist/vite/client.js +113 -2
  257. package/dist/vite/client.js.map +1 -1
  258. package/docs/content/a2a-protocol.mdx +15 -0
  259. package/docs/content/template-chat.mdx +1 -1
  260. package/docs/content/template-plan.mdx +3 -3
  261. package/package.json +2 -2
  262. package/src/a2a/activity.ts +371 -0
  263. package/src/a2a/client.ts +35 -11
  264. package/src/a2a/index.ts +21 -0
  265. package/src/a2a/types.ts +8 -0
  266. package/src/agent/model-config.ts +19 -23
  267. package/src/agent/production-agent.ts +167 -100
  268. package/src/agent/types.ts +16 -1
  269. package/src/cli/index.ts +18 -10
  270. package/src/cli/multi-frontier-runs.ts +5 -3
  271. package/src/cli/templates-meta.ts +0 -12
  272. package/src/cli/workspace-dev.ts +1 -1
  273. package/src/client/AgentPanel.tsx +9 -1
  274. package/src/client/RunStuckBanner.tsx +39 -47
  275. package/src/client/chat/action-chat-ui-surface.tsx +32 -0
  276. package/src/client/chat/message-components.tsx +53 -8
  277. package/src/client/chat/tool-call-display.tsx +214 -44
  278. package/src/client/chat/widgets/InlineExtensionWidget.tsx +0 -1
  279. package/src/client/chat/widgets/builtin-tool-renderers.tsx +7 -3
  280. package/src/client/chat-model-groups.ts +67 -27
  281. package/src/client/conversation/AgentConversation.tsx +12 -1
  282. package/src/client/error-capture.ts +2 -6
  283. package/src/client/resources/McpConnectionSuggestion.tsx +20 -14
  284. package/src/client/resources/ResourcesPanel.tsx +5 -1
  285. package/src/client/resources/mcp-integration-catalog.ts +7 -17
  286. package/src/client/resources/mcp-integration-logos.ts +2 -2
  287. package/src/client/route-chunk-recovery.ts +5 -3
  288. package/src/client/session-replay.ts +3 -3
  289. package/src/client/settings/SettingsPanel.tsx +15 -6
  290. package/src/client/sharing/ShareButton.tsx +1 -27
  291. package/src/client/sharing/ShareDialog.tsx +0 -16
  292. package/src/client/sharing/useShareButtonController.ts +0 -7
  293. package/src/client/sharing/useShareDialogController.ts +0 -2
  294. package/src/client/sse-event-processor.ts +85 -1
  295. package/src/client/transcription/use-live-transcription.ts +64 -45
  296. package/src/deploy/build.ts +2 -1
  297. package/src/guards/db-tool-scoping.ts +1 -1
  298. package/src/integrations/adapters/slack.ts +84 -5
  299. package/src/integrations/index.ts +5 -1
  300. package/src/localization/default-messages.ts +7 -1
  301. package/src/mcp-client/oauth-routes.ts +45 -12
  302. package/src/scripts/agent-engines/list-agent-engines.ts +1 -18
  303. package/src/scripts/call-agent.ts +49 -6
  304. package/src/server/agent-chat-plugin.ts +50 -10
  305. package/src/server/realtime-voice.ts +4 -1
  306. package/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +16 -0
  307. package/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +7 -5
  308. package/src/terminal/cli-registry.ts +1 -1
  309. package/src/vite/client.ts +166 -1
  310. package/corpus/core/src/observability/hosted-model-experiment.ts +0 -118
  311. package/corpus/templates/crm/.agents/skills/agent-native-docs/SKILL.md +0 -115
  312. package/corpus/templates/crm/.agents/skills/agent-native-toolkit/SKILL.md +0 -177
  313. package/corpus/templates/crm/.agents/skills/crm/SKILL.md +0 -128
  314. package/corpus/templates/crm/.agents/skills/customizing-agent-native/SKILL.md +0 -220
  315. package/corpus/templates/crm/.agents/skills/feature-flags/SKILL.md +0 -169
  316. package/corpus/templates/crm/.agents/skills/upgrade-agent-native/SKILL.md +0 -100
  317. package/corpus/templates/crm/.env.example +0 -5
  318. package/corpus/templates/crm/AGENTS.md +0 -120
  319. package/corpus/templates/crm/CHANGELOG.md +0 -1
  320. package/corpus/templates/crm/DEVELOPING.md +0 -66
  321. package/corpus/templates/crm/README.md +0 -106
  322. package/corpus/templates/crm/_gitignore +0 -12
  323. package/corpus/templates/crm/actions/_crm-action-utils.ts +0 -87
  324. package/corpus/templates/crm/actions/_crm-dashboard.ts +0 -69
  325. package/corpus/templates/crm/actions/_crm-data-program-actions.ts +0 -15
  326. package/corpus/templates/crm/actions/_crm-signal-utils.ts +0 -79
  327. package/corpus/templates/crm/actions/apply-crm-proposals.ts +0 -203
  328. package/corpus/templates/crm/actions/attach-call-evidence.ts +0 -170
  329. package/corpus/templates/crm/actions/configure-crm-connection.ts +0 -126
  330. package/corpus/templates/crm/actions/configure-native-crm.ts +0 -44
  331. package/corpus/templates/crm/actions/create-crm-record.ts +0 -148
  332. package/corpus/templates/crm/actions/create-crm-signal-tracker.ts +0 -58
  333. package/corpus/templates/crm/actions/delete-staged-dataset.ts +0 -14
  334. package/corpus/templates/crm/actions/get-crm-automation-recipe.ts +0 -36
  335. package/corpus/templates/crm/actions/get-crm-dashboard-panel.ts +0 -35
  336. package/corpus/templates/crm/actions/get-crm-dashboard.ts +0 -14
  337. package/corpus/templates/crm/actions/get-crm-overview.ts +0 -13
  338. package/corpus/templates/crm/actions/get-crm-pipeline-data.ts +0 -61
  339. package/corpus/templates/crm/actions/get-crm-record.ts +0 -75
  340. package/corpus/templates/crm/actions/install-crm-pipeline-dashboard.ts +0 -81
  341. package/corpus/templates/crm/actions/list-crm-dashboard-revisions.ts +0 -15
  342. package/corpus/templates/crm/actions/list-crm-dashboards.ts +0 -15
  343. package/corpus/templates/crm/actions/list-crm-proposals.ts +0 -31
  344. package/corpus/templates/crm/actions/list-crm-records.ts +0 -79
  345. package/corpus/templates/crm/actions/list-crm-saved-views.ts +0 -15
  346. package/corpus/templates/crm/actions/list-crm-signal-hits.ts +0 -43
  347. package/corpus/templates/crm/actions/list-crm-signal-trackers.ts +0 -32
  348. package/corpus/templates/crm/actions/list-crm-tasks.ts +0 -22
  349. package/corpus/templates/crm/actions/list-staged-datasets.ts +0 -14
  350. package/corpus/templates/crm/actions/list-workspace-connections.ts +0 -47
  351. package/corpus/templates/crm/actions/manage-crm-signal-tracker.ts +0 -87
  352. package/corpus/templates/crm/actions/manage-crm-task.ts +0 -132
  353. package/corpus/templates/crm/actions/navigate.ts +0 -63
  354. package/corpus/templates/crm/actions/provider-api-catalog.ts +0 -22
  355. package/corpus/templates/crm/actions/provider-api-docs.ts +0 -54
  356. package/corpus/templates/crm/actions/provider-api-request.ts +0 -92
  357. package/corpus/templates/crm/actions/query-staged-dataset.ts +0 -44
  358. package/corpus/templates/crm/actions/record-crm-call-insight.ts +0 -160
  359. package/corpus/templates/crm/actions/record-crm-smart-signal.ts +0 -150
  360. package/corpus/templates/crm/actions/restore-crm-dashboard-revision.ts +0 -23
  361. package/corpus/templates/crm/actions/review-crm-signal.ts +0 -31
  362. package/corpus/templates/crm/actions/run-crm-saved-view-program.ts +0 -103
  363. package/corpus/templates/crm/actions/run-crm-signal-trackers.ts +0 -275
  364. package/corpus/templates/crm/actions/run.ts +0 -7
  365. package/corpus/templates/crm/actions/save-crm-dashboard.ts +0 -51
  366. package/corpus/templates/crm/actions/save-crm-saved-view.ts +0 -119
  367. package/corpus/templates/crm/actions/sync-crm.ts +0 -146
  368. package/corpus/templates/crm/actions/update-crm-record.ts +0 -510
  369. package/corpus/templates/crm/actions/view-screen.ts +0 -218
  370. package/corpus/templates/crm/agent-native.app-skill.json +0 -58
  371. package/corpus/templates/crm/app/components/crm/CreateCrmRecordDialog.tsx +0 -158
  372. package/corpus/templates/crm/app/components/crm/CrmDashboardPanel.tsx +0 -78
  373. package/corpus/templates/crm/app/components/crm/CrmSignalsPanel.tsx +0 -226
  374. package/corpus/templates/crm/app/components/crm/IntelligenceSettings.tsx +0 -414
  375. package/corpus/templates/crm/app/components/crm/RecordActions.tsx +0 -510
  376. package/corpus/templates/crm/app/components/crm/RecordGrid.tsx +0 -134
  377. package/corpus/templates/crm/app/components/crm/RecordWorkspace.tsx +0 -362
  378. package/corpus/templates/crm/app/components/crm/SavedViewDataProgram.tsx +0 -93
  379. package/corpus/templates/crm/app/components/crm/Surface.tsx +0 -97
  380. package/corpus/templates/crm/app/components/crm/WorkOverview.tsx +0 -180
  381. package/corpus/templates/crm/app/components/layout/CrmLayout.tsx +0 -112
  382. package/corpus/templates/crm/app/components/layout/CrmSidebar.tsx +0 -84
  383. package/corpus/templates/crm/app/components/ui/alert-dialog.tsx +0 -1
  384. package/corpus/templates/crm/app/components/ui/badge.tsx +0 -1
  385. package/corpus/templates/crm/app/components/ui/button.tsx +0 -1
  386. package/corpus/templates/crm/app/components/ui/card.tsx +0 -1
  387. package/corpus/templates/crm/app/components/ui/dialog.tsx +0 -1
  388. package/corpus/templates/crm/app/components/ui/input.tsx +0 -1
  389. package/corpus/templates/crm/app/components/ui/label.tsx +0 -1
  390. package/corpus/templates/crm/app/components/ui/select.tsx +0 -1
  391. package/corpus/templates/crm/app/components/ui/sheet.tsx +0 -1
  392. package/corpus/templates/crm/app/components/ui/skeleton.tsx +0 -1
  393. package/corpus/templates/crm/app/components/ui/switch.tsx +0 -1
  394. package/corpus/templates/crm/app/components/ui/table.tsx +0 -1
  395. package/corpus/templates/crm/app/components/ui/tabs.tsx +0 -1
  396. package/corpus/templates/crm/app/components/ui/textarea.tsx +0 -1
  397. package/corpus/templates/crm/app/components/ui/toolkit-provider.tsx +0 -17
  398. package/corpus/templates/crm/app/design-system.ts +0 -3
  399. package/corpus/templates/crm/app/entry.client.tsx +0 -16
  400. package/corpus/templates/crm/app/entry.server.tsx +0 -10
  401. package/corpus/templates/crm/app/global.css +0 -167
  402. package/corpus/templates/crm/app/hooks/use-navigation-state.ts +0 -60
  403. package/corpus/templates/crm/app/i18n/en-US.ts +0 -89
  404. package/corpus/templates/crm/app/i18n/index.ts +0 -34
  405. package/corpus/templates/crm/app/lib/dashboard.ts +0 -13
  406. package/corpus/templates/crm/app/lib/navigation.ts +0 -54
  407. package/corpus/templates/crm/app/lib/tab-id.ts +0 -1
  408. package/corpus/templates/crm/app/lib/types.ts +0 -172
  409. package/corpus/templates/crm/app/lib/utils.ts +0 -1
  410. package/corpus/templates/crm/app/root.tsx +0 -91
  411. package/corpus/templates/crm/app/routes/_index.tsx +0 -26
  412. package/corpus/templates/crm/app/routes/accounts.tsx +0 -41
  413. package/corpus/templates/crm/app/routes/agent.tsx +0 -5
  414. package/corpus/templates/crm/app/routes/ask.tsx +0 -53
  415. package/corpus/templates/crm/app/routes/dashboard.tsx +0 -118
  416. package/corpus/templates/crm/app/routes/opportunities.tsx +0 -41
  417. package/corpus/templates/crm/app/routes/people.tsx +0 -41
  418. package/corpus/templates/crm/app/routes/proposals.tsx +0 -266
  419. package/corpus/templates/crm/app/routes/records.$recordId.tsx +0 -35
  420. package/corpus/templates/crm/app/routes/settings.tsx +0 -63
  421. package/corpus/templates/crm/app/routes/setup.tsx +0 -308
  422. package/corpus/templates/crm/app/routes/tasks.tsx +0 -252
  423. package/corpus/templates/crm/app/routes/views.tsx +0 -333
  424. package/corpus/templates/crm/app/routes.ts +0 -17
  425. package/corpus/templates/crm/app/vite-env.d.ts +0 -6
  426. package/corpus/templates/crm/changelog/2026-07-21-agent-native-crm.md +0 -6
  427. package/corpus/templates/crm/changelog/2026-07-21-clips-call-evidence-review-recipe.md +0 -6
  428. package/corpus/templates/crm/changelog/2026-07-21-crm-can-now-find-and-review-evidence-grounded-call-signals-w.md +0 -6
  429. package/corpus/templates/crm/changelog/2026-07-21-crm-can-now-manage-keyword-and-smart-call-signal-trackers-fr.md +0 -6
  430. package/corpus/templates/crm/changelog/2026-07-21-delegated-local-crm-automation.md +0 -6
  431. package/corpus/templates/crm/changelog/2026-07-21-native-sql.md +0 -6
  432. package/corpus/templates/crm/changelog/2026-07-21-pipeline-dashboard.md +0 -6
  433. package/corpus/templates/crm/changelog/2026-07-21-pipeline-dashboards-now-install-correctly-from-the-crm-actio.md +0 -6
  434. package/corpus/templates/crm/changelog/2026-07-21-salesforce-connection.md +0 -6
  435. package/corpus/templates/crm/changelog/2026-07-22-crm-field-validation-now-explains-which-fields-cannot-be-edi.md +0 -6
  436. package/corpus/templates/crm/changelog/2026-07-22-fixed-hubspot-contact-syncs-missing-records-updated-after-th.md +0 -6
  437. package/corpus/templates/crm/changelog/2026-07-22-fixed-pipeline-dashboard-panels-so-their-opportunity-data-lo.md +0 -6
  438. package/corpus/templates/crm/changelog/2026-07-22-full-page-chat-keeps-the-active-conversation-when-moving-to-.md +0 -6
  439. package/corpus/templates/crm/components.json +0 -20
  440. package/corpus/templates/crm/docs/architecture/crm-contract.md +0 -180
  441. package/corpus/templates/crm/learnings.defaults.md +0 -5
  442. package/corpus/templates/crm/package.json +0 -59
  443. package/corpus/templates/crm/public/favicon.svg +0 -1
  444. package/corpus/templates/crm/public/icon-180.svg +0 -1
  445. package/corpus/templates/crm/public/manifest.json +0 -11
  446. package/corpus/templates/crm/react-router.config.ts +0 -7
  447. package/corpus/templates/crm/server/crm/adapter.ts +0 -32
  448. package/corpus/templates/crm/server/crm/crm-field-firewall.ts +0 -64
  449. package/corpus/templates/crm/server/crm/crm-mirror.ts +0 -711
  450. package/corpus/templates/crm/server/crm/hubspot-adapter.ts +0 -1146
  451. package/corpus/templates/crm/server/crm/native-adapter.ts +0 -1715
  452. package/corpus/templates/crm/server/crm/read-through.ts +0 -207
  453. package/corpus/templates/crm/server/crm/salesforce-adapter.ts +0 -1255
  454. package/corpus/templates/crm/server/db/crm-store.ts +0 -1170
  455. package/corpus/templates/crm/server/db/index.ts +0 -169
  456. package/corpus/templates/crm/server/db/schema.ts +0 -441
  457. package/corpus/templates/crm/server/lib/intelligence/default-detectors.ts +0 -65
  458. package/corpus/templates/crm/server/lib/intelligence/evidence.ts +0 -105
  459. package/corpus/templates/crm/server/lib/intelligence/keyword-detector.ts +0 -100
  460. package/corpus/templates/crm/server/lib/intelligence/smart-detector.ts +0 -144
  461. package/corpus/templates/crm/server/lib/intelligence/summary.ts +0 -141
  462. package/corpus/templates/crm/server/lib/provider-api.ts +0 -64
  463. package/corpus/templates/crm/server/middleware/auth.ts +0 -4
  464. package/corpus/templates/crm/server/plugins/agent-chat.ts +0 -68
  465. package/corpus/templates/crm/server/plugins/auth.ts +0 -14
  466. package/corpus/templates/crm/server/plugins/core-routes.ts +0 -17
  467. package/corpus/templates/crm/server/plugins/db.ts +0 -454
  468. package/corpus/templates/crm/server/routes/[...page].get.ts +0 -5
  469. package/corpus/templates/crm/shared/crm-automation-recipes.ts +0 -132
  470. package/corpus/templates/crm/shared/crm-contract.ts +0 -254
  471. package/corpus/templates/crm/shared/crm-sales-config.ts +0 -63
  472. package/corpus/templates/crm/ssr-entry.ts +0 -11
  473. package/corpus/templates/crm/tsconfig.json +0 -24
  474. package/corpus/templates/crm/vite.config.ts +0 -15
  475. package/corpus/templates/crm/vitest.config.ts +0 -5
  476. package/dist/observability/hosted-model-experiment.d.ts +0 -39
  477. package/dist/observability/hosted-model-experiment.d.ts.map +0 -1
  478. package/dist/observability/hosted-model-experiment.js +0 -90
  479. package/dist/observability/hosted-model-experiment.js.map +0 -1
  480. package/src/observability/hosted-model-experiment.ts +0 -118
@@ -1 +1 @@
1
- {"version":3,"file":"slack.js","sourceRoot":"","sources":["../../../src/integrations/adapters/slack.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAGzD,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,4BAA4B,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,EAAE,+BAA+B,EAAE,MAAM,4BAA4B,CAAC;AAC7E,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EACL,qCAAqC,EACrC,yCAAyC,EACzC,4BAA4B,EAC5B,6BAA6B,GAC9B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAczD,iCAAiC;AACjC,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAC9B,MAAM,6BAA6B,GAAG,IAAI,CAAC;AAC3C,MAAM,oBAAoB,GAAG,MAAM,CAAC;AACpC,4EAA4E;AAC5E,6EAA6E;AAC7E,mEAAmE;AACnE,MAAM,0BAA0B,GAAG,KAAK,CAAC;AACzC,MAAM,2BAA2B,GAAG,EAAE,CAAC;AACvC,MAAM,wBAAwB,GAAG,KAAK,CAAC;AACvC,MAAM,qCAAqC,GAAG,EAAE,CAAC;AACjD,MAAM,yBAAyB,GAAG,KAAK,CAAC;AACxC,MAAM,2BAA2B,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;AACpD,6EAA6E;AAC7E,6EAA6E;AAC7E,MAAM,oCAAoC,GAAG,EAAE,GAAG,KAAK,CAAC;AACxD,MAAM,gCAAgC,GAAG,KAAK,CAAC;AAQ/C,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAG/B,CAAC;AAEJ,0EAA0E;AAC1E,2EAA2E;AAC3E,8EAA8E;AAC9E,+EAA+E;AAC/E,MAAM,iCAAiC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;AAC/D,MAAM,qCAAqC,GAAG,KAAK,CAAC;AACpD,MAAM,sBAAsB,GAAG,IAAI,GAAG,EAAkB,CAAC;AAEzD,6EAA6E;AAC7E,SAAS,0BAA0B,CACjC,GAAW,EACX,KAAK,GAAG,iCAAiC;IAEzC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,SAAS,GAAG,sBAAsB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAClD,IAAI,SAAS,IAAI,SAAS,GAAG,GAAG;QAAE,OAAO,KAAK,CAAC;IAC/C,IAAI,SAAS;QAAE,sBAAsB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAClD,IAAI,sBAAsB,CAAC,IAAI,IAAI,qCAAqC,EAAE,CAAC;QACzE,MAAM,SAAS,GAAG,sBAAsB,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;QAC7D,IAAI,SAAS;YAAE,sBAAsB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC1D,CAAC;IACD,sBAAsB,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,GAAG,KAAK,CAAC,CAAC;IAC7C,OAAO,IAAI,CAAC;AACd,CAAC;AAWD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,YAAY,CAC1B,OAAO,GAAwB,EAAE;IAEjC,MAAM,eAAe,GAAG,KAAK,EAAE,QAAyB,EAAE,EAAE,CAC1D,CAAC,MAAM,OAAO,CAAC,eAAe,EAAE,CAAC,QAAQ,CAAC,CAAC;QAC3C,CAAC,MAAM,2BAA2B,CAAC,QAAQ,CAAC,CAAC;QAC7C,CAAC,MAAM,aAAa,CAAC,iBAAiB,CAAC,CAAC;QACxC,SAAS,CAAC;IAEZ,OAAO;QACL,QAAQ,EAAE,OAAO;QACjB,KAAK,EAAE,OAAO;QACd,YAAY,EAAE;YACZ,SAAS,EAAE,IAAI;YACf,iBAAiB,EAAE,IAAI;YACvB,aAAa,EAAE,IAAI;YACnB,iBAAiB,EAAE,IAAI;YACvB,uBAAuB,EAAE,KAAK;YAC9B,eAAe,EAAE,KAAK;YACtB,sBAAsB,EAAE,IAAI;YAC5B,eAAe,EAAE,IAAI;SACtB;QAED,kBAAkB;YAChB,OAAO;gBACL;oBACE,GAAG,EAAE,iBAAiB;oBACtB,KAAK,EAAE,iBAAiB;oBACxB,QAAQ,EAAE,KAAK;oBACf,QAAQ,EACN,iGAAiG;iBACpG;gBACD;oBACE,GAAG,EAAE,iBAAiB;oBACtB,KAAK,EAAE,uBAAuB;oBAC9B,QAAQ,EAAE,KAAK;oBACf,QAAQ,EACN,4DAA4D;iBAC/D;gBACD;oBACE,GAAG,EAAE,qBAAqB;oBAC1B,KAAK,EAAE,2BAA2B;oBAClC,QAAQ,EAAE,KAAK;oBACf,QAAQ,EACN,gEAAgE;iBACnE;gBACD;oBACE,GAAG,EAAE,sBAAsB;oBAC3B,KAAK,EAAE,sBAAsB;oBAC7B,QAAQ,EAAE,IAAI;oBACd,QAAQ,EACN,qFAAqF;iBACxF;aACF,CAAC;QACJ,CAAC;QAED,KAAK,CAAC,kBAAkB,CACtB,KAAc;YAEd,kEAAkE;YAClE,uEAAuE;YACvE,oEAAoE;YACpE,2DAA2D;YAC3D,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAC5C,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAChC,IAAI,MAAM,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;oBACvC,8DAA8D;oBAC9D,mEAAmE;oBACnE,8DAA8D;oBAC9D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;gBACvD,CAAC;YACH,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;YACV,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC5B,CAAC;QAED,KAAK,CAAC,aAAa,CAAC,KAAc;YAChC,MAAM,aAAa,GAAG,MAAM,aAAa,CAAC,sBAAsB,CAAC,CAAC;YAClE,IAAI,CAAC,aAAa;gBAAE,OAAO,KAAK,CAAC;YAEjC,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAC;YACxD,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,EAAE,2BAA2B,CAAC,CAAC;YAChE,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS;gBAAE,OAAO,KAAK,CAAC;YAE3C,2DAA2D;YAC3D,MAAM,EAAE,GAAG,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YACnC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,CAAC,GAAG,GAAG;gBAAE,OAAO,KAAK,CAAC;YAEzD,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAC5C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;YAC3C,MAAM,UAAU,GAAG,MAAM,SAAS,IAAI,IAAI,EAAE,CAAC;YAC7C,MAAM,iBAAiB,GACrB,KAAK;gBACL,MAAM;qBACH,UAAU,CAAC,QAAQ,EAAE,aAAa,CAAC;qBACnC,MAAM,CAAC,UAAU,CAAC;qBAClB,MAAM,CAAC,KAAK,CAAC,CAAC;YAEnB,yBAAyB;YACzB,IAAI,CAAC;gBACH,OAAO,MAAM,CAAC,eAAe,CAC3B,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EACtB,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAC/B,CAAC;YACJ,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QAED,KAAK,CAAC,oBAAoB,CACxB,KAAc;YAEd,MAAM,GAAG,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAC3C,IAAI,OAAY,CAAC;YACjB,IAAI,CAAC;gBACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAC;YACd,CAAC;YAED,kEAAkE;YAClE,sEAAsE;YACtE,qEAAqE;YACrE,mEAAmE;YACnE,oEAAoE;YACpE,oEAAoE;YACpE,mEAAmE;YACnE,iCAAiC;YACjC,MAAM,yBAAyB,CAAC,OAAO,CAAC,CAAC;YAEzC,4BAA4B;YAC5B,IAAI,OAAO,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;gBACtC,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC;gBACxB,IAAI,CAAC,CAAC;oBAAE,OAAO,IAAI,CAAC;gBAEpB,sBAAsB;gBACtB,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,KAAK,aAAa;oBAAE,OAAO,IAAI,CAAC;gBACzD,mCAAmC;gBACnC,IAAI,CAAC,CAAC,OAAO,KAAK,iBAAiB,IAAI,CAAC,CAAC,OAAO,KAAK,iBAAiB;oBACpE,OAAO,IAAI,CAAC;gBAEd,sEAAsE;gBACtE,qEAAqE;gBACrE,oEAAoE;gBACpE,qCAAqC;gBACrC,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;gBAC5B,IAAI,CAAC,IAAI;oBAAE,OAAO,IAAI,CAAC;gBAEvB,MAAM,MAAM,GACV,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;gBACpE,MAAM,QAAQ,GACZ,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ;oBACpC,CAAC,CAAC,OAAO,CAAC,UAAU;oBACpB,CAAC,CAAC,SAAS,CAAC;gBAChB,MAAM,YAAY,GAAG,0BAA0B,CAAC,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;gBACvE,MAAM,IAAI,GACR,OAAO,CAAC,CAAC,YAAY,KAAK,QAAQ;oBAChC,CAAC,CAAC,CAAC,CAAC,YAAY,KAAK,IAAI;oBACzB,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;gBACjE,MAAM,SAAS,GAAG,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC;gBAC3C,MAAM,aAAa,GAAG,CAAC,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC3D,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,aAAa;oBAAE,OAAO,IAAI,CAAC;gBAEvD,+EAA+E;gBAC/E,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC3D,IAAI,CAAC,SAAS;oBAAE,OAAO,IAAI,CAAC;gBAE5B,gEAAgE;gBAChE,MAAM,QAAQ,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,EAAE,CAAC;gBACrC,MAAM,gBAAgB,GAAG,GAAG,QAAQ,IAAI,MAAM,IAAI,CAAC,CAAC,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC1E,MAAM,eAAe,GAAoB;oBACvC,QAAQ,EAAE,OAAO;oBACjB,gBAAgB;oBAChB,IAAI,EAAE,SAAS;oBACf,UAAU,EAAE,CAAC,CAAC,IAAI;oBAClB,QAAQ,EAAE,CAAC,CAAC,IAAI;oBAChB,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc;oBACjE,gBAAgB,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;oBACzC,QAAQ,EAAE,MAAM;oBAChB,iEAAiE;oBACjE,gEAAgE;oBAChE,wDAAwD;oBACxD,UAAU,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE;oBACtD,eAAe,EAAE;wBACf,SAAS,EAAE,CAAC,CAAC,OAAO;wBACpB,WAAW,EAAE,CAAC,CAAC,YAAY;wBAC3B,QAAQ;wBACR,SAAS,EAAE,CAAC,CAAC,EAAE;wBACf,MAAM;wBACN,QAAQ;wBACR,YAAY,EACV,OAAO,OAAO,CAAC,aAAa,KAAK,QAAQ;4BACvC,CAAC,CAAC,OAAO,CAAC,aAAa;4BACvB,CAAC,CAAC,SAAS;wBACf,OAAO,EAAE,OAAO,CAAC,QAAQ;wBACzB,GAAG,CAAC,YAAY;4BACd,CAAC,CAAC;gCACE,YAAY,EAAE,YAAY,CAAC,QAAQ;gCACnC,sBAAsB,EAAE,YAAY,CAAC,SAAS;6BAC/C;4BACH,CAAC,CAAC,EAAE,CAAC;qBACR;oBACD,SAAS,EAAE,QAAQ;oBACnB,QAAQ,EAAE,CAAC,CAAC,EAAE;oBACd,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;iBAC/C,CAAC;gBAEF,IAAI,aAAa,EAAE,CAAC;oBAClB,oEAAoE;oBACpE,2DAA2D;oBAC3D,kEAAkE;oBAClE,mEAAmE;oBACnE,2DAA2D;oBAC3D,MAAM,qBAAqB,GAAG,OAAO,CAAC,oBAAoB;wBACxD,CAAC,CAAC,MAAM,OAAO,CAAC,oBAAoB,CAAC,eAAe,CAAC;wBACrD,CAAC,CAAC,OAAO,CAAC,cAAc;4BACtB,CAAC,CAAC,KAAK;4BACP,CAAC,CAAC,MAAM,+BAA+B,CAAC;gCACpC,QAAQ,EAAE,OAAO;gCACjB,gBAAgB;gCAChB,WAAW,EAAE,CAAC,CAAC,IAAI;6BACpB,CAAC,CAAC;oBACT,MAAM,MAAM,GAAG,OAAO,CAAC,cAAc;wBACnC,CAAC,CAAC,MAAM,OAAO,CAAC,cAAc,CAAC,eAAe,CAAC;wBAC/C,CAAC,CAAC,MAAM,oBAAoB,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;oBAC1D,IAAI,CAAC,MAAM,IAAI,CAAC,qBAAqB;wBAAE,OAAO,IAAI,CAAC;gBACrD,CAAC;gBAED,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,eAAe,CAAC,CAAC;gBACrD,MAAM,eAAe,GAAG,MAAM,2BAA2B,CACvD,CAAC,CAAC,OAAO,EACT,QAAQ,EACR,KAAK,CACN,CAAC;gBAEF,OAAO;oBACL,GAAG,eAAe;oBAClB,eAAe,EAAE;wBACf,GAAG,eAAe,CAAC,eAAe;wBAClC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBAChD;oBACD,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC3D,CAAC;YACJ,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QAED,0BAA0B,CAAC,QAAyB;YAClD,MAAM,SAAS,GAAG,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC;YACrD,MAAM,QAAQ,GAAG,QAAQ,CAAC,eAAe,CAAC,QAAQ,CAAC;YACnD,OAAO,OAAO,SAAS,KAAK,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ;gBAClE,CAAC,CAAC,CAAC,GAAG,SAAS,IAAI,QAAQ,EAAE,CAAC;gBAC9B,CAAC,CAAC,EAAE,CAAC;QACT,CAAC;QAED,KAAK,CAAC,yBAAyB,CAC7B,QAAyB;YAEzB,uEAAuE;YACvE,sEAAsE;YACtE,mEAAmE;YACnE,0CAA0C;YAC1C,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC;YAC9C,IAAI,CAAC,KAAK;gBAAE,OAAO,IAAI,CAAC;YAExB,MAAM,SAAS,GAAG,QAAQ,CAAC,eAAe,CAAC,SAAmB,CAAC;YAC/D,MAAM,QAAQ,GAAG,QAAQ,CAAC,eAAe,CAAC,QAAkB,CAAC;YAC7D,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ;gBAAE,OAAO,IAAI,CAAC;YAEzC,uDAAuD;YACvD,oEAAoE;YACpE,wEAAwE;YACxE,kCAAkC;YAClC,uBAAuB,CACrB,KAAK,EACL,SAAS,EACT,QAAQ,EACR,4BAA4B,CAC7B,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QAED,KAAK,CAAC,sBAAsB,CAC1B,QAAyB;YAEzB,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC;YAC9C,IAAI,CAAC,KAAK;gBAAE,OAAO,QAAQ,CAAC;YAC5B,OAAO,mBAAmB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC9C,CAAC;QAED,KAAK,CAAC,uBAAuB,CAC3B,QAAyB;YAEzB,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC;YAC9C,IAAI,CAAC,KAAK;gBAAE,OAAO,QAAQ,CAAC;YAC5B,OAAO,oBAAoB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC/C,CAAC;QAED,KAAK,CAAC,gBAAgB,CACpB,QAAyB;YAEzB,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC;YAC9C,IAAI,CAAC,KAAK;gBAAE,OAAO,IAAI,CAAC;YACxB,OAAO,qBAAqB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAChD,CAAC;QAED,KAAK,CAAC,iBAAiB,CACrB,QAAyB,EACzB,GAA2B;YAE3B,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAC;YAChD,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC;YAC9C,IAAI,CAAC,KAAK;gBAAE,OAAO,IAAI,CAAC;YACxB,OAAO,sBAAsB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC/D,CAAC;QAED,KAAK,CAAC,YAAY,CAChB,OAAwB,EACxB,OAAwB,EACxB,IAAkC;YAElC,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;YAC7C,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,IAAI,KAAK,CACb,mEAAmE,CACpE,CAAC;YACJ,CAAC;YAED,MAAM,SAAS,GAAG,OAAO,CAAC,eAAe,CAAC,SAAmB,CAAC;YAC9D,MAAM,QAAQ,GAAG,OAAO,CAAC,eAAe,CAAC,QAAkB,CAAC;YAC5D,MAAM,MAAM,GAAI,OAAO,CAAC,eAAuB,EAAE,MAEpC,CAAC;YACd,MAAM,cAAc,GAAG,IAAI,EAAE,cAAc,CAAC;YAE5C,wEAAwE;YACxE,qEAAqE;YACrE,wEAAwE;YACxE,MAAM,MAAM,GAAG,oBAAoB,CAAC,OAAO,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;YACpE,MAAM,iBAAiB,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;YACrE,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACtE,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,IAAI,QAAQ,EAAE,CAAC;oBACb,uBAAuB,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;gBAC1D,CAAC;gBACD,OAAO;YACT,CAAC;YACD,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,WAAW,GAAa,EAAE,CAAC;YAEjC,MAAM,WAAW,GACf,MAAM;gBACN,mBAAmB,CAAC,UAAU,EAAE;oBAC9B,iBAAiB,EAAG,OAAO,CAAC,eAAuB;wBACjD,EAAE,iBAAiB;iBACtB,CAAC,CAAC;YAEL,MAAM,QAAQ,GAA4B;gBACxC,OAAO,EAAE,SAAS;gBAClB,IAAI,EAAE,UAAU;gBAChB,MAAM,EAAE,WAAW;gBACnB,YAAY,EAAE,KAAK;gBACnB,YAAY,EAAE,KAAK;gBACnB,MAAM,EAAE,IAAI;aACb,CAAC;YAEF,IAAI,CAAC;gBACH,IAAI,cAAc,EAAE,CAAC;oBACnB,gDAAgD;oBAChD,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,mCAAmC,EAAE;wBACnE,MAAM,EAAE,MAAM;wBACd,OAAO,EAAE;4BACP,aAAa,EAAE,UAAU,KAAK,EAAE;4BAChC,cAAc,EAAE,kBAAkB;yBACnC;wBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,QAAQ,EAAE,EAAE,EAAE,cAAc,EAAE,CAAC;qBAC1D,CAAC,CAAC;oBACH,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAI7B,CAAC;oBACF,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;wBACb,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;wBACxD,2DAA2D;wBAC3D,MAAM,QAAQ,GAAG,MAAM,SAAS,CAC9B,KAAK,EACL,SAAS,EACT,QAAQ,EACR,QAAQ,CACT,CAAC;wBACF,IAAI,QAAQ;4BAAE,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAC3C,CAAC;yBAAM,CAAC;wBACN,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,cAAc,CAAC,CAAC;oBAC9C,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,MAAM,QAAQ,GAAG,MAAM,SAAS,CAC9B,KAAK,EACL,SAAS,EACT,QAAQ,EACR,QAAQ,CACT,CAAC;oBACF,IAAI,QAAQ;wBAAE,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC3C,CAAC;gBAED,8DAA8D;gBAC9D,sDAAsD;gBACtD,IAAI,QAAQ,EAAE,CAAC;oBACb,uBAAuB,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;gBAC1D,CAAC;gBAED,uEAAuE;gBACvE,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;oBAC/B,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE;wBAC3D,OAAO,EAAE,SAAS;wBAClB,IAAI,EAAE,KAAK;wBACX,YAAY,EAAE,KAAK;wBACnB,YAAY,EAAE,KAAK;wBACnB,MAAM,EAAE,IAAI;qBACb,CAAC,CAAC;oBACH,IAAI,QAAQ;wBAAE,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC3C,CAAC;gBACD,OAAO;oBACL,MAAM,EAAE,WAAW;oBACnB,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACnD,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,GAAG,CAAC,CAAC;gBACtD,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;QAED,KAAK,CAAC,gBAAgB,CACpB,QAAyB,EACzB,IAAY,EACZ,IAAmD;YAEnD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;gBAAE,OAAO;YACzB,MAAM,SAAS,GAAG,IAAI,EAAE,SAAS,CAAC;YAClC,IACE,SAAS;gBACT,CAAC,0BAA0B,CAAC,SAAS,EAAE,IAAI,EAAE,WAAW,CAAC,EACzD,CAAC;gBACD,OAAO;YACT,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC;gBAC9C,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,IAAI,SAAS;wBAAE,sBAAsB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;oBACxD,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;gBACtE,CAAC;gBACD,MAAM,SAAS,GAAG,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC;gBACrD,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,CAAC,SAAS,EAAE,CAAC;oBAChD,IAAI,SAAS;wBAAE,sBAAsB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;oBACxD,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;gBAChE,CAAC;gBACD,MAAM,QAAQ,GACZ,OAAO,QAAQ,CAAC,eAAe,CAAC,QAAQ,KAAK,QAAQ;oBACnD,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,QAAQ;oBACnC,CAAC,CAAC,SAAS,CAAC;gBAChB,MAAM,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE;oBAC1C,IAAI;oBACJ,YAAY,EAAE,KAAK;oBACnB,YAAY,EAAE,KAAK;oBACnB,MAAM,EAAE,IAAI;iBACb,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,uEAAuE;gBACvE,4EAA4E;gBAC5E,IAAI,SAAS;oBAAE,sBAAsB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBACxD,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;QAED,KAAK,CAAC,mBAAmB,CACvB,OAAwB,EACxB,MAAsB;YAEtB,MAAM,aAAa,GAAoB;gBACrC,QAAQ,EAAE,OAAO;gBACjB,gBAAgB,EAAE,GAAG,MAAM,CAAC,QAAQ,IAAI,SAAS,IAAI,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,EAAE;gBACvG,IAAI,EAAE,EAAE;gBACR,eAAe,EAAE;oBACf,SAAS,EAAE,MAAM,CAAC,WAAW;oBAC7B,QAAQ,EAAE,MAAM,CAAC,SAAS;oBAC1B,MAAM,EAAE,MAAM,CAAC,QAAQ;iBACxB;gBACD,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC;YACF,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,aAAa,CAAC,CAAC;YACnD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;gBACxD,OAAO;YACT,CAAC;YAED,MAAM,MAAM,GAAG,oBAAoB,CAAC,OAAO,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;YACpE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YAChC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,MAAM,IAAI,GAA4B;oBACpC,OAAO,EAAE,MAAM,CAAC,WAAW;oBAC3B,IAAI,EAAE,KAAK;iBACZ,CAAC;gBACF,IAAI,MAAM,CAAC,SAAS;oBAAE,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;gBAExD,IAAI,CAAC;oBACH,MAAM,GAAG,GAAG,MAAM,aAAa,CAC7B,wCAAwC,EACxC;wBACE,MAAM,EAAE,MAAM;wBACd,OAAO,EAAE;4BACP,aAAa,EAAE,UAAU,KAAK,EAAE;4BAChC,cAAc,EAAE,kBAAkB;yBACnC;wBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;qBAC3B,CACF,CAAC;oBACF,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAoC,CAAC;oBACnE,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;wBACb,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,yBAAyB,CAAC,CAAC;oBAC3D,CAAC;gBACH,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,CAAC,KAAK,CAAC,2CAA2C,EAAE,GAAG,CAAC,CAAC;oBAChE,MAAM,GAAG,CAAC;gBACZ,CAAC;YACH,CAAC;QACH,CAAC;QAED,mBAAmB,CACjB,IAAY,EACZ,IAAqC;YAErC,OAAO;gBACL,IAAI,EAAE,qBAAqB,CAAC,IAAI,CAAC;gBACjC,eAAe,EAAE,IAAI,EAAE,iBAAiB;oBACtC,CAAC,CAAC,EAAE,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,EAAE;oBAC/C,CAAC,CAAC,EAAE;aACP,CAAC;QACJ,CAAC;QAED,KAAK,CAAC,SAAS,CAAC,QAAiB;YAC/B,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,MAAM,aAAa,CAAC,iBAAiB,CAAC,CAAC,CAAC;YAC5D,MAAM,SAAS,GAAG,CAAC,CAAC,CAAC,MAAM,aAAa,CAAC,sBAAsB,CAAC,CAAC,CAAC;YAClE,MAAM,GAAG,GAAG,iBAAiB,EAAE,CAAC;YAChC,MAAM,oBAAoB,GAAG,GAAG,EAAE,SAAS;gBACzC,CAAC,CAAC,MAAM,4BAA4B,CAChC;oBACE,SAAS,EAAE,GAAG,CAAC,SAAS;oBACxB,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,IAAI;iBACzB,EACD,OAAO,CACR,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;gBACnB,CAAC,CAAC,EAAE,CAAC;YACP,MAAM,sBAAsB,GAAG,oBAAoB,CAAC,MAAM,CACxD,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,KAAK,WAAW,CACtD,CAAC;YACF,MAAM,UAAU,GACd,SAAS,IAAI,CAAC,QAAQ,IAAI,sBAAsB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAE/D,OAAO;gBACL,QAAQ,EAAE,OAAO;gBACjB,KAAK,EAAE,OAAO;gBACd,OAAO,EAAE,KAAK,EAAE,uBAAuB;gBACvC,UAAU;gBACV,OAAO,EAAE;oBACP,QAAQ;oBACR,SAAS;oBACT,wBAAwB,EAAE,sBAAsB,CAAC,MAAM;oBACvD,oBAAoB,EAAE,sBAAsB,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;wBAClE,EAAE,EAAE,YAAY,CAAC,EAAE;wBACnB,MAAM,EAAE,YAAY,CAAC,MAAM;wBAC3B,QAAQ,EAAE,YAAY,CAAC,QAAQ;wBAC/B,YAAY,EAAE,YAAY,CAAC,YAAY;wBACvC,MAAM,EAAE,YAAY,CAAC,MAAM;wBAC3B,MAAM,EAAE,YAAY,CAAC,MAAM;qBAC5B,CAAC,CAAC;iBACJ;gBACD,KAAK,EAAE,CAAC,UAAU;oBAChB,CAAC,CAAC,6EAA6E;oBAC/E,CAAC,CAAC,SAAS;aACd,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,iBAAiB,CAAC,IAAY;IACrC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,MAAM,MAAM,GAAG,GAAG;SACf,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC/B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;AACzB,CAAC;AAED,KAAK,UAAU,2BAA2B,CACxC,QAAyB;IAEzB,MAAM,MAAM,GACV,OAAO,QAAQ,CAAC,eAAe,CAAC,MAAM,KAAK,QAAQ;QACjD,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,MAAM;QACjC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;IACxB,MAAM,QAAQ,GACZ,OAAO,QAAQ,CAAC,eAAe,CAAC,QAAQ,KAAK,QAAQ;QACnD,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,QAAQ;QACnC,CAAC,CAAC,SAAS,CAAC;IAChB,MAAM,YAAY,GAChB,OAAO,QAAQ,CAAC,eAAe,CAAC,YAAY,KAAK,QAAQ;QACvD,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,YAAY;QACvC,CAAC,CAAC,SAAS,CAAC;IAChB,IAAI,CAAC,MAAM,IAAI,CAAC,YAAY;QAAE,OAAO,SAAS,CAAC;IAC/C,IAAI,CAAC;QACH,IAAI,YAAY,GAAG,QAAQ;YACzB,CAAC,CAAC,MAAM,qCAAqC,CACzC,OAAO,EACP,oBAAoB,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,CACzD;YACH,CAAC,CAAC,IAAI,CAAC;QACT,IAAI,CAAC,YAAY,IAAI,MAAM,EAAE,CAAC;YAC5B,YAAY,GAAG,MAAM,yCAAyC,CAC5D,OAAO,EACP,MAAM,CACP,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,YAAY,IAAI,YAAY,EAAE,CAAC;YAClC,YAAY,GAAG,MAAM,yCAAyC,CAC5D,OAAO,EACP,YAAY,CACb,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,GACP,YAAY,EAAE,eAAe;YAC7B,oBAAoB,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC3D,OAAO,CAAC,MAAM,6BAA6B,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC;IAC1E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,IAAI,uBAAuB,GAAG,KAAK,CAAC;AAEpC;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,KAAK,UAAU,yBAAyB,CAAC,OAAY;IACnD,MAAM,MAAM,GACV,OAAO,OAAO,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IACrE,MAAM,QAAQ,GACZ,OAAO,OAAO,EAAE,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;IAE3E,MAAM,cAAc,GAAG,iBAAiB,CAAC,wBAAwB,CAAC,CAAC;IACnE,MAAM,aAAa,GAAG,iBAAiB,CAAC,2BAA2B,CAAC,CAAC;IAErE,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;YAC1C,IAAI,OAAO,GAAG,KAAK,CAAC;YACpB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,oBAAoB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACvD,OAAO,GAAG,CAAC,CAAC,CAAC,MAAM,qCAAqC,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;YAC1E,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;YACV,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,WAAW,CAAC;oBAChB,UAAU,EAAE,GAAG;oBACf,aAAa,EAAE,kCAAkC;iBAClD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAC7B,uBAAuB,GAAG,IAAI,CAAC;YAC/B,OAAO,CAAC,IAAI,CACV,6HAA6H;gBAC3H,gHAAgH,CACnH,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,cAAc,EAAE,CAAC;QACnB,IAAI,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3C,MAAM,WAAW,CAAC;gBAChB,UAAU,EAAE,GAAG;gBACf,aAAa,EAAE,8BAA8B;aAC9C,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,IAAI,aAAa,EAAE,CAAC;QAClB,IAAI,CAAC,QAAQ,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9C,MAAM,WAAW,CAAC;gBAChB,UAAU,EAAE,GAAG;gBACf,aAAa,EAAE,8BAA8B;aAC9C,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,KAAK,UAAU,iBAAiB,CAAC,KAAc;IAC7C,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC;IACvC,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC;IAC9C,wEAAwE;IACxE,wEAAwE;IACxE,gDAAgD;IAChD,MAAM,GAAG,GAAG,CAAC,MAAM,WAAW,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7C,KAAK,CAAC,OAAO,CAAC,SAAS,GAAG,GAAG,CAAC;IAC9B,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;AAC/C,CAAC;AAED,SAAS,yBAAyB,CAAC,IAAY,EAAE,SAAiB;IAChE,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,KAAK,GAAG,SAAS,GAAG,SAAS;YAAE,MAAM;QACzC,KAAK,IAAI,SAAS,CAAC;QACnB,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,6EAA6E;AAC7E,SAAS,YAAY,CAAC,IAAY,EAAE,SAAiB;IACnD,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,SAAS;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,SAAS,GAAG,IAAI,CAAC;IACrB,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,IAAI,cAAc,CAAC,SAAS,CAAC,IAAI,SAAS,EAAE,CAAC;YAC3C,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACvB,MAAM;QACR,CAAC;QAED,MAAM,MAAM,GAAG,yBAAyB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAE/D,4BAA4B;QAC5B,IAAI,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;YAClB,0BAA0B;YAC1B,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACrC,CAAC;QACD,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;YAClB,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC;QAC3B,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC1C,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,SAAS,EAAE,CAAC;IACpD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,4EAA4E;AAC5E,SAAS,oBAAoB,CAAC,IAAY,EAAE,SAAiB;IAC3D,OAAO,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,MAAM,CACzC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CACnC,CAAC;AACJ,CAAC;AAED;;;;;4EAK4E;AAC5E,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAEjC;;;;;;;;GAQG;AACH,SAAS,qBAAqB,CAAC,IAAY;IACzC,MAAM,OAAO,GACX,IAAI,CAAC,MAAM,GAAG,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5E,OAAO,CACL,OAAO;SACJ,OAAO,CAAC,0BAA0B,EAAE,SAAS,CAAC;QAC/C,sEAAsE;QACtE,sEAAsE;SACrE,OAAO,CAAC,oCAAoC,EAAE,MAAM,CAAC;QACtD,oEAAoE;QACpE,gEAAgE;QAChE,sEAAsE;QACtE,iEAAiE;QACjE,gDAAgD;SAC/C,OAAO,CAAC,yBAAyB,EAAE,MAAM,CAAC,CAC9C,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAS,uBAAuB,CAC9B,KAAa,EACb,SAAiB,EACjB,QAAgB,EAChB,MAAc;IAEd,aAAa,CAAC,mDAAmD,EAAE;QACjE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,KAAK,EAAE;YAChC,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,UAAU,EAAE,SAAS;YACrB,SAAS,EAAE,QAAQ;YACnB,MAAM;SACP,CAAC;KACH,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AACrB,CAAC;AAED;;;;;GAKG;AACH,SAAS,mBAAmB,CAC1B,IAAY,EACZ,IAAoC;IAEpC,MAAM,aAAa,GAAG,YAAY,CAChC,IAAI,IAAI,iBAAiB,EACzB,6BAA6B,CAC9B,CAAC;IACF,MAAM,MAAM,GAAU,aAAa,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAClD,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE;KACtC,CAAC,CAAC,CAAC;IACJ,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,IAAI,EAAE;oBAC9D,GAAG,EAAE,IAAI,CAAC,iBAAiB;oBAC3B,SAAS,EAAE,sBAAsB;iBAClC;aACF;SACF,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,SAAS,CACtB,KAAa,EACb,SAAiB,EACjB,QAA4B,EAC5B,IAA6B;IAE7B,MAAM,SAAS,GACb,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAK,IAAI,CAAC,MAAoB,CAAC,MAAM,GAAG,CAAC,CAAC;IACtE,IACE,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ;QAC7B,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAC7B,CAAC,SAAS,EACV,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,OAAO,GAA4B;QACvC,GAAG,IAAI;QACP,OAAO,EAAE,SAAS;KACnB,CAAC;IACF,IAAI,QAAQ,IAAI,CAAC,OAAO,CAAC,SAAS;QAAE,OAAO,CAAC,SAAS,GAAG,QAAQ,CAAC;IACjE,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,wCAAwC,EAAE;QACxE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,KAAK,EAAE;YAChC,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;KAC9B,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAI7B,CAAC;IACF,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7D,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,yBAAyB,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,IAAI,CAAC,EAAE,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,GAAW,EACX,IAAiB,EACjB,SAAS,GAAG,oBAAoB;IAEhC,MAAM,UAAU,GACd,OAAO,eAAe,KAAK,WAAW,CAAC,CAAC,CAAC,IAAI,eAAe,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7E,MAAM,KAAK,GAAG,UAAU;QACtB,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC;QACjD,CAAC,CAAC,SAAS,CAAC;IACd,IAAI,CAAC;QACH,OAAO,MAAM,KAAK,CAAC,GAAG,EAAE;YACtB,GAAG,IAAI;YACP,MAAM,EAAE,UAAU,EAAE,MAAM,IAAI,IAAI,CAAC,MAAM;SAC1C,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,IAAI,KAAK;YAAE,YAAY,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,2BAA2B,CACxC,SAAkB,EAClB,QAAiB,EACjB,aAAsB;IAEtB,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAClE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,KAAK,GAAG,aAAa,IAAI,CAAC,MAAM,aAAa,CAAC,iBAAiB,CAAC,CAAC,CAAC;IACxE,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAE7B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,yCAAyC,CAAC,CAAC;QAC/D,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC3C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QAC7C,MAAM,GAAG,GAAG,MAAM,aAAa,CAC7B,GAAG,CAAC,QAAQ,EAAE,EACd,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE,EAAE,EACjD,0BAA0B,CAC3B,CAAC;QACF,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAG7B,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QAErE,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC1C,MAAM,WAAW,GACf,SAAS,CAAC,QAAQ,KAAK,WAAW;YAClC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAC5C,IAAI,SAAS,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,WAAW;YAAE,OAAO,SAAS,CAAC;QACtE,OAAO,SAAS,CAAC,QAAQ,EAAE,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,OAAO,OAAO,KAAK,KAAK,QAAQ;QAC9B,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,wBAAwB,CAAC;QAC1C,CAAC,CAAC,EAAE,CAAC;AACT,CAAC;AAED,SAAS,0BAA0B,CACjC,KAAc,EACd,WAAmB;IAKnB,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACrD,MAAM,WAAW,GAAI,KAAgC,CAAC,QAAQ,CAAC;IAC/D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7C,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;QAC3D,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,OAAO,EAAE,CAAC;QACrD,MAAM,MAAM,GAAG,MAAiC,CAAC;QACjD,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACxE,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,MAAM,GACV,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QAClE,IAAI,MAAM,IAAI,WAAW,KAAK,SAAS,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;YAClE,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO;YACL;gBACE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;gBAC/B,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;gBACjC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC9B;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAClC,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAC7B,CAAC,MAAM,EAAE,EAAE,CACT,MAAM,CAAC,IAAI,KAAK,yBAAyB;QACzC,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CACxC,EAAE,KAAK,CAAC;IACT,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AAC3D,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc;IACxC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACrD,MAAM,IAAI,GAAG,KAAgC,CAAC;IAC9C,IAAI,OAAO,IAAI,CAAC,EAAE,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC7C,OAAO;QACL,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,GAAG,CAAC,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,GAAG,CAAC,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzE,GAAG,CAAC,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,GAAG,CAAC,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ;YACpC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE;YAC/B,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,OAAO,IAAI,CAAC,oBAAoB,KAAK,QAAQ;YAC/C,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,oBAAoB,EAAE;YAC5C,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,SAAS,CACtB,KAAa,EACb,MAAc,EACd,MAA8B,EAC9B,SAAS,GAAG,KAAK;IAEjB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,yBAAyB,MAAM,EAAE,CAAC,CAAC;QACvD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAClD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACnC,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,aAAa,CAClC,GAAG,CAAC,QAAQ,EAAE,EACd,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE,EAAE,EACjD,SAAS,CACV,CAAC;QACF,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAwB,CAAC;QAC5D,OAAO,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB,CAAC,QAAyB;IACtD,MAAM,MAAM,GAAG,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC;IAC/C,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;IACnC,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;QAAE,OAAO,IAAI,CAAC;IAClE,OAAO,GAAG,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,IAAI,QAAQ,EAAE,CAAC;AACpF,CAAC;AAED,KAAK,UAAU,wBAAwB,CACrC,KAAa,EACb,QAAyB;IAEzB,MAAM,QAAQ,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IACjD,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3B,MAAM,MAAM,GAAG,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAChD,IAAI,MAAM,IAAI,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAC;IACpE,IAAI,MAAM;QAAE,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAEhD,MAAM,IAAI,GAAG,MAAM,SAAS,CAC1B,KAAK,EACL,YAAY,EACZ,EAAE,IAAI,EAAE,QAAQ,CAAC,QAAS,EAAE,EAC5B,yBAAyB,CAC1B,CAAC;IACF,MAAM,OAAO,GAAG,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC;IACpC,MAAM,QAAQ,GAA6B,IAAI,EAAE,IAAI;QACnD,CAAC,CAAC;YACE,KAAK,EACH,OAAO,OAAO,EAAE,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE;gBACxD,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE;gBACpC,CAAC,CAAC,IAAI;YACV,IAAI,EACF,OAAO,OAAO,EAAE,SAAS,KAAK,QAAQ,IAAI,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE;gBAChE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE;gBAC1B,CAAC,CAAC,OAAO,OAAO,EAAE,YAAY,KAAK,QAAQ;oBACvC,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE;oBAC7B,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE;oBAC7B,CAAC,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,KAAK,QAAQ;wBACrC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;wBAC5B,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;wBAC5B,CAAC,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;4BAC3D,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;4BACvB,CAAC,CAAC,IAAI;YAChB,+DAA+D;YAC/D,0DAA0D;YAC1D,UAAU,EACR,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,IAAI,CAAC,mBAAmB;gBACpD,CAAC,CAAC,UAAU;gBACZ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa;oBACvB,CAAC,CAAC,OAAO;oBACT,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ;wBAClB,CAAC,CAAC,OAAO;wBACT,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ;4BAClB,CAAC,CAAC,OAAO;4BACT,CAAC,CAAC,QAAQ;SACrB;QACH,CAAC,CAAC,IAAI,CAAC;IACT,IAAI,kBAAkB,CAAC,IAAI,IAAI,gCAAgC,EAAE,CAAC;QAChE,MAAM,SAAS,GAAG,kBAAkB,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;QACzD,IAAI,SAAS;YAAE,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACtD,CAAC;IACD,kBAAkB,CAAC,GAAG,CAAC,QAAQ,EAAE;QAC/B,QAAQ;QACR,SAAS,EACP,IAAI,CAAC,GAAG,EAAE;YACV,CAAC,QAAQ;gBACP,CAAC,CAAC,2BAA2B;gBAC7B,CAAC,CAAC,oCAAoC,CAAC;KAC5C,CAAC,CAAC;IACH,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,KAAa,EACb,QAAyB;IAEzB,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACjE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,yEAAyE;QACzE,yEAAyE;QACzE,sEAAsE;QACtE,iEAAiE;QACjE,IACE,QAAQ,CAAC,cAAc,KAAK,IAAI;YAChC,QAAQ,CAAC,WAAW,EAAE,IAAI,EAAE;YAC5B,QAAQ,CAAC,UAAU,EAAE,QAAQ,KAAK,IAAI,EACtC,CAAC;YACD,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,OAAO;YACL,GAAG,QAAQ;YACX,cAAc,EAAE,KAAK;YACrB,UAAU,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE;SACvD,CAAC;IACJ,CAAC;IACD,OAAO;QACL,GAAG,QAAQ;QACX,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,GAAG,CAAC,QAAQ,CAAC,KAAK;YAChB,CAAC,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE;YACvD,CAAC,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;QAC9B,UAAU,EAAE;YACV,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,QAAQ,EAAE,IAAI;SACf;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,KAAa,EACb,QAAyB;IAEzB,MAAM,SAAS,GAAG,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC;IACrD,MAAM,QAAQ,GAAG,QAAQ,CAAC,eAAe,CAAC,QAAQ,CAAC;IACnD,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;IACnC,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAClE,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACxE,SAAS,CAAC,KAAK,EAAE,uBAAuB,EAAE;YACxC,OAAO,EAAE,SAAS;YAClB,EAAE,EAAE,QAAQ;YACZ,KAAK,EAAE,MAAM,CAAC,2BAA2B,CAAC;SAC3C,CAAC;QACF,SAAS,CAAC,KAAK,EAAE,uBAAuB,EAAE;YACxC,OAAO,EAAE,SAAS;YAClB,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,SAAS,IAAI,QAAQ,CAAC;YAC9D,SAAS,EAAE,MAAM;YACjB,KAAK,EAAE,MAAM,CAAC,2BAA2B,CAAC;SAC3C,CAAC;QACF,SAAS,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;QACrD,SAAS,CAAC,KAAK,EAAE,oBAAoB,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;QAC9D,QAAQ,CAAC,CAAC,CAAC,wBAAwB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI;KAC5D,CAAC,CAAC;IAEH,2EAA2E;IAC3E,4EAA4E;IAC5E,2EAA2E;IAC3E,uBAAuB;IACvB,MAAM,sBAAsB,GAC1B,OAAO,QAAQ,CAAC,eAAe,CAAC,sBAAsB,KAAK,QAAQ;QACjE,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,sBAAsB;QACjD,CAAC,CAAC,IAAI,CAAC;IACX,MAAM,yBAAyB,GAC7B,sBAAsB,IAAI,sBAAsB,KAAK,SAAS;QAC5D,CAAC,CAAC,MAAM,SAAS,CAAC,KAAK,EAAE,oBAAoB,EAAE;YAC3C,OAAO,EAAE,sBAAsB;SAChC,CAAC;QACJ,CAAC,CAAC,IAAI,CAAC;IACX,MAAM,oBAAoB,GAAG,yBAAyB;QACpD,CAAC,CAAC,MAAM,SAAS,CAAC,KAAK,EAAE,uBAAuB,EAAE;YAC9C,OAAO,EAAE,sBAAuB;YAChC,KAAK,EAAE,GAAG;SACX,CAAC;QACJ,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,iBAAiB,GACrB,OAAO,yBAAyB,EAAE,OAAO,EAAE,IAAI,KAAK,QAAQ;QAC1D,CAAC,CAAC,yBAAyB,CAAC,OAAO,CAAC,IAAI;QACxC,CAAC,CAAC,IAAI,CAAC;IACX,MAAM,qBAAqB,GAAG,KAAK,CAAC,OAAO,CAAC,oBAAoB,EAAE,QAAQ,CAAC;QACzE,CAAC,CAAC,oBAAoB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAA4B,EAAE,EAAE,CAAC,CAAC;YACnE,GAAG,OAAO;YACV,IAAI,EAAE,wBAAwB,iBAAiB,CAAC,CAAC,CAAC,KAAK,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;SACrH,CAAC,CAAC;QACL,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,WAAW,GAAG;QAClB,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;YAC5B,CAAC,CAAC,IAAI,CAAC,KAAK;iBACP,GAAG,CAAC,CAAC,IAAyB,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC;iBAChD,MAAM,CAAC,OAAO,CAAC;YACpB,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,GAAG,qBAAqB;KACzB,CAAC;IACF,MAAM,cAAc,GAAG;QACrB,GAAG,IAAI,GAAG,CACR,WAAW,CAAC,GAAG,CAAC,CAAC,OAA4B,EAAE,KAAK,EAAE,EAAE,CAAC;YACvD,OAAO,OAAO,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,EAAE;YAChE,OAAO;SACR,CAAC,CACH,CAAC,MAAM,EAAE;KACX,CAAC,KAAK,CAAC,CAAC,2BAA2B,CAAC,CAAC;IAEtC,MAAM,QAAQ,GAAgC,cAAc,CAAC,MAAM;QACjE,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,OAA4B,EAAE,EAAE;YAClD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;gBACxC,CAAC,CAAC,OAAO,CAAC,KAAK;qBACV,GAAG,CAAC,kBAAkB,CAAC;qBACvB,MAAM,CACL,CACE,IAAqC,EACH,EAAE,CAAC,IAAI,KAAK,IAAI,CACrD;gBACL,CAAC,CAAC,SAAS,CAAC;YACd,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;gBAChD,CAAC,CAAC,OAAO,CAAC,SAAS;qBACd,MAAM,CACL,CAAC,QAAa,EAAE,EAAE,CAChB,OAAO,QAAQ,EAAE,IAAI,KAAK,QAAQ;oBAClC,OAAO,QAAQ,EAAE,KAAK,KAAK,QAAQ,CACtC;qBACA,GAAG,CAAC,CAAC,QAAa,EAAE,EAAE,CAAC,CAAC;oBACvB,IAAI,EAAE,QAAQ,CAAC,IAAI;oBACnB,KAAK,EAAE,QAAQ,CAAC,KAAK;iBACtB,CAAC,CAAC;gBACP,CAAC,CAAC,SAAS,CAAC;YACd,OAAO;gBACL,GAAG,CAAC,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ;oBAClC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE;oBAC5B,CAAC,CAAC,EAAE,CAAC;gBACP,IAAI,EAAE,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC;gBACpC,SAAS,EACP,OAAO,OAAO,CAAC,EAAE,KAAK,QAAQ;oBAC5B,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;oBAC3C,CAAC,CAAC,QAAQ,CAAC,SAAS;gBACxB,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3C,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACpC,CAAC;QACJ,CAAC,CAAC;QACJ,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,OAAO,GAAG,QAAQ,CAAC;IACzB,MAAM,SAAS,GAAG,YAAY,EAAE,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC;IAC7D,MAAM,gBAAgB,GAAG,YAAY,EAAE,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;IACvE,MAAM,MAAM,GAAG,YAAY,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACvD,MAAM,IAAI,GAAG,YAAY,EAAE,OAAO,EAAE,KAAK,KAAK,IAAI,CAAC;IACnD,MAAM,gBAAgB,GAAG,IAAI;QAC3B,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,MAAM;YACN,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,SAAS;gBACT,CAAC,CAAC,iBAAiB;gBACnB,CAAC,CAAC,SAAS,CAAC;IAElB,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IACzE,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,GAAG,CACrC,CAAC,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;SAC/C,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SACX,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;QACpB,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QACtE,OAAO,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC,CAAC,CACL,CAAC;IACF,MAAM,QAAQ,GAAG,IAAI,GAAG,CACtB,aAAa;SACV,MAAM,CAAC,CAAC,IAAI,EAAoC,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC;SACjE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAClC,CAAC;IACF,MAAM,gBAAgB,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAClD,GAAG,OAAO;QACV,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM;YACvB,CAAC,CAAC;gBACE,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;oBAClC,GAAG,IAAI;oBACP,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;iBACjC,CAAC,CAAC;aACJ;YACH,CAAC,CAAC,EAAE,CAAC;KACR,CAAC,CAAC,CAAC;IACJ,MAAM,aAAa,GAAG,gBAAgB,CAAC,OAAO,CAC5C,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CACjC,CAAC;IACF,OAAO;QACL,GAAG,QAAQ;QACX,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtD,GAAG,CAAC,OAAO,EAAE,KAAK;YAChB,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE;YACtD,CAAC,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;QAC9B,gBAAgB;QAChB,uEAAuE;QACvE,0EAA0E;QAC1E,6DAA6D;QAC7D,UAAU,EAAE,QAAQ;YAClB,CAAC,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;YACrD,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,IAAI;gBACtB,UAAU,EAAE,SAAS;gBACrB,QAAQ,EAAE,KAAK;aAChB,CAAC;QACN,eAAe,EAAE,gBAAgB;QACjC,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,eAAe,EAAE;YACf,GAAG,QAAQ,CAAC,eAAe;YAC3B,WAAW,EACT,OAAO,YAAY,EAAE,OAAO,EAAE,IAAI,KAAK,QAAQ;gBAC7C,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI;gBAC3B,CAAC,CAAC,SAAS;YACf,gBAAgB;YAChB,GAAG,CAAC,sBAAsB;gBACxB,CAAC,CAAC;oBACE,sBAAsB;oBACtB,GAAG,CAAC,iBAAiB;wBACnB,CAAC,CAAC,EAAE,wBAAwB,EAAE,iBAAiB,EAAE;wBACjD,CAAC,CAAC,EAAE,CAAC;iBACR;gBACH,CAAC,CAAC,EAAE,CAAC;SACR;KACF,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,MAAM,IAAI,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3D,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc;IACxC,OAAO,WAAW,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;AAC5C,CAAC;AAED,SAAS,oBAAoB,CAAC,cAAsB;IAClD,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,YAAY,GAAG,EAAE,CAAC;IAClC,OAAO,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,KAAK,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC;AACjE,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAa;IACxC,IAAI,KAAK,KAAK,WAAW;QAAE,OAAO,QAAQ,CAAC;IAC3C,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,wBAAwB,CAC/B,KAAc,EACd,KAAa,EACb,cAAsB,EACtB,MAAe;IAEf,MAAM,OAAO,GAAG,oBAAoB,CAAC,cAAc,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,GAAG,mBAAmB,CAAC,KAAK,CAAC,MAAM,OAAO,EAAE,CAAC;IAC9D,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEpD,IAAI,cAAc,IAAI,qCAAqC,EAAE,CAAC;QAC5D,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAC/C,OAAO,GAAG,QAAQ,GAAG,OAAO,0CAA0C,SAAS,+CAA+C,CAAC;IACjI,CAAC;IAED,OAAO,MAAM,CAAC,CAAC,CAAC,GAAG,QAAQ,MAAM,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;AACvD,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,KAAa,EACb,MAAc,EACd,IAA6B;IAE7B,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,yBAAyB,MAAM,EAAE,EAAE;QACtE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,KAAK,EAAE;YAChC,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAwB,CAAC;IAC5D,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,GAAG,MAAM,SAAS,CAAC,CAAC;IAChE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc;IACvC,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACnE,OAAO,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AACpE,CAAC;AAED,SAAS,eAAe,CAAC,KAA8B;IACrD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACxB,OAAO,IAAI,KAAK,aAAa;QAC3B,IAAI,KAAK,aAAa;QACtB,IAAI,KAAK,eAAe;QACxB,IAAI,KAAK,QAAQ;QACjB,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,KAAa,EACb,QAAyB;IAEzB,MAAM,OAAO,GAAG,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC;IACnD,MAAM,QAAQ,GAAG,QAAQ,CAAC,eAAe,CAAC,QAAQ,CAAC;IACnD,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE7E,IAAI,OAA4B,CAAC;IACjC,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,kBAAkB,EAAE;YACvD,OAAO;YACP,SAAS,EAAE,QAAQ;YACnB,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtE,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtE,iBAAiB,EAAE,MAAM;YACzB,aAAa,EAAE,gCAAgC;YAC/C,MAAM,EAAE;gBACN;oBACE,IAAI,EAAE,aAAa;oBACnB,KAAK,EAAE,+BAA+B;iBACvC;gBACD;oBACE,IAAI,EAAE,aAAa;oBACnB,EAAE,EAAE,sBAAsB;oBAC1B,KAAK,EAAE,oBAAoB;oBAC3B,MAAM,EAAE,aAAa;oBACrB,OAAO,EAAE,8CAA8C;iBACxD;aACF;SACF,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,uDAAuD,EAAE;YACpE,SAAS,EAAE,iBAAiB,CAAC,KAAK,CAAC;YACnC,eAAe,EAAE,QAAQ,CAAC,gBAAgB,KAAK,IAAI;YACnD,gBAAgB,EAAE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC5C,gBAAgB,EAAE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;SAC7C,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,EAAE,CAAC;IAC5B,IAAI,OAAO,QAAQ,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC9C,OAAO,sBAAsB,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,wBAAwB,CAAC,GAA2B;IAC3D,OAAO,CACL,GAAG,CAAC,IAAI,KAAK,cAAc,IAAI,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CACxE,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,sBAAsB,CACnC,KAAa,EACb,QAAyB,EACzB,QAAgB;IAEhB,MAAM,OAAO,GAAG,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC;IACnD,MAAM,QAAQ,GAAG,QAAQ,CAAC,eAAe,CAAC,QAAQ,CAAC;IACnD,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC7E,OAAO,sBAAsB,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,sBAAsB,CAC7B,KAAa,EACb,QAAyB,EACzB,OAAe,EACf,QAAgB,EAChB,QAAgB;IAEhB,MAAM,KAAK,GAAG,IAAI,GAAG,EAA6C,CAAC;IACnE,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC9C,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC/C,KAAK,CAAC,GAAG,CAAC,sBAAsB,EAAE;QAChC,KAAK,EAAE,oBAAoB;QAC3B,MAAM,EAAE,aAAa;KACtB,CAAC,CAAC;IACH,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,OAAO,GAAmC,IAAI,CAAC;IACnD,IAAI,YAAY,GAAyC,IAAI,CAAC;IAC9D,IAAI,gBAAgB,GAA6C,IAAI,CAAC;IACtE,IAAI,aAAa,GAAkB,IAAI,CAAC;IAExC,MAAM,MAAM,GAAG,KAAK,EAAE,KAA8B,EAAE,EAAE;QACtD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,KAAK,EAAE,KAA8B,EAAE,EAAE;YACrD,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,aAAa,CAAC,KAAK,EAAE,mBAAmB,EAAE;oBAC9C,OAAO;oBACP,EAAE,EAAE,QAAQ;oBACZ,aAAa,EAAE,mBAAmB;oBAClC,MAAM,EAAE,CAAC,KAAK,CAAC;iBAChB,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CACV,yDAAyD,EACzD;oBACE,SAAS,EAAE,eAAe,CAAC,KAAK,CAAC;oBACjC,SAAS,EAAE,iBAAiB,CAAC,KAAK,CAAC;iBACpC,CACF,CAAC;YACJ,CAAC;QACH,CAAC,CAAC;QACF,IAAI,GAAG,GAAG,WAAW,IAAI,GAAG,EAAE,CAAC;YAC7B,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;YACnB,OAAO;QACT,CAAC;QACD,OAAO,GAAG,KAAK,CAAC;QAChB,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,YAAY,GAAG,UAAU,CACvB,GAAG,EAAE;gBACH,MAAM,KAAK,GAAG,OAAO,CAAC;gBACtB,OAAO,GAAG,IAAI,CAAC;gBACf,YAAY,GAAG,IAAI,CAAC;gBACpB,IAAI,KAAK;oBAAE,KAAK,KAAK,CAAC,KAAK,CAAC,CAAC;YAC/B,CAAC,EACD,GAAG,GAAG,CAAC,GAAG,GAAG,WAAW,CAAC,CAC1B,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,CAAC,MAAc,EAAE,QAAiB,EAAE,EAAE,CACnD,GAAG,MAAM,IAAI,QAAQ,IAAI,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAEtD,OAAO;QACL,GAAG,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE;QACvC,KAAK,CAAC,OAAO,CAAC,KAAK;YACjB,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,MAAM,OAAO,GAAG,4BAA4B,EAAE,CAAC;gBAC/C,MAAM,UAAU,GAAG,iBAAiB,EAAE,EAAE,SAAS,CAAC;gBAClD,IACE,OAAO,EAAE,OAAO,EAAE,KAAK;oBACvB,UAAU;oBACV,QAAQ,CAAC,QAAQ;oBACjB,QAAQ,CAAC,QAAQ,EACjB,CAAC;oBACD,aAAa,GAAG,MAAM,wBAAwB,CAAC;wBAC7C,MAAM,EAAE,QAAQ;wBAChB,UAAU;wBACV,KAAK,EAAE,iBAAiB,EAAE,EAAE,KAAK,IAAI,IAAI;wBACzC,WAAW,EAAE,QAAQ,CAAC,QAAQ;wBAC9B,MAAM,EAAE,QAAQ,CAAC,QAAQ;wBACzB,QAAQ,EACN,OAAO,QAAQ,CAAC,eAAe,CAAC,QAAQ,KAAK,QAAQ;4BACnD,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,QAAQ;4BACnC,CAAC,CAAC,IAAI;wBACV,SAAS,EAAE,OAAO;wBAClB,SAAS,EAAE,QAAQ;wBACnB,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK;wBAC5B,QAAQ;qBACT,CAAC,CAAC;oBACH,MAAM,MAAM,CAAC;wBACX,IAAI,EAAE,QAAQ;wBACd,MAAM,EAAE;4BACN;gCACE,IAAI,EAAE,SAAS;gCACf,QAAQ,EAAE,wBAAwB,IAAI,CAAC,GAAG,EAAE,EAAE;gCAC9C,QAAQ,EAAE;oCACR;wCACE,IAAI,EAAE,QAAQ;wCACd,IAAI,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE;wCAC5C,KAAK,EAAE,QAAQ;wCACf,SAAS,EAAE,qBAAqB;wCAChC,KAAK,EAAE,aAAa;qCACrB;iCACF;6BACF;yBACF;qBACF,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;gBACvC,MAAM,OAAO,GAAG,4BAA4B,EAAE,CAAC;gBAC/C,MAAM,UAAU,GAAG,iBAAiB,EAAE,EAAE,SAAS,CAAC;gBAClD,IAAI,OAAO,IAAI,UAAU,IAAI,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;oBACpE,MAAM,MAAM,GAAG;wBACb,UAAU;wBACV,KAAK,EAAE,iBAAiB,EAAE,EAAE,KAAK,IAAI,IAAI;wBACzC,WAAW,EAAE,QAAQ,CAAC,QAAQ;wBAC9B,MAAM,EAAE,QAAQ,CAAC,QAAQ;wBACzB,QAAQ,EACN,OAAO,QAAQ,CAAC,eAAe,CAAC,QAAQ,KAAK,QAAQ;4BACnD,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,QAAQ;4BACnC,CAAC,CAAC,IAAI;wBACV,SAAS,EAAE,OAAO;wBAClB,SAAS,EAAE,QAAQ;wBACnB,KAAK,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,IAAI,IAAI;wBACrC,WAAW,EAAE,KAAK,CAAC,WAAW;wBAC9B,QAAQ;qBACT,CAAC;oBACF,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;wBACxC,wBAAwB,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;wBAC1D,wBAAwB,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;qBACxD,CAAC,CAAC;oBACH,gBAAgB,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;gBACvC,CAAC;gBACD,MAAM,MAAM,CAAC;oBACX,IAAI,EAAE,aAAa;oBACnB,EAAE,EAAE,uBAAuB;oBAC3B,KAAK,EAAE,WAAW,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;oBAC9C,MAAM,EAAE,SAAS;oBACjB,OAAO,EAAE,2BAA2B;iBACrC,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBACvC,MAAM,GAAG,GAAG,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC;gBACnC,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;gBACpC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBACzB,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACzC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;gBAChD,MAAM,MAAM,CAAC;oBACX,IAAI,EAAE,aAAa;oBACnB,EAAE;oBACF,KAAK;oBACL,MAAM,EAAE,aAAa;iBACtB,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBACtC,MAAM,GAAG,GAAG,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC;gBACnC,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;gBAC5D,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,KAAK,IAAI,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACjE,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE;oBACZ,KAAK;oBACL,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU;iBAC7C,CAAC,CAAC;gBACH,MAAM,MAAM,CAAC;oBACX,IAAI,EAAE,aAAa;oBACnB,EAAE;oBACF,KAAK;oBACL,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU;iBAC7C,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBACvC,MAAM,EAAE,GACN,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;gBAChE,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAClC,MAAM,MAAM,GACV,KAAK,CAAC,MAAM,KAAK,OAAO;oBACtB,CAAC,CAAC,aAAa;oBACf,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM;wBACvB,CAAC,CAAC,UAAU;wBACZ,CAAC,CAAC,OAAO,CAAC;gBAChB,MAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC9C,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;gBACjC,MAAM,MAAM,CAAC;oBACX,IAAI,EAAE,aAAa;oBACnB,EAAE;oBACF,KAAK;oBACL,MAAM;oBACN,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,OAAO;wBAC1B,CAAC,CAAC;4BACE,OAAO,EAAE,kBAAkB,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,iBAAiB;yBACxE;wBACH,CAAC,CAAC,EAAE,CAAC;iBACR,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,qBAAqB,EAAE,CAAC;gBAChD,qEAAqE;gBACrE,sEAAsE;gBACtE,gEAAgE;gBAChE,MAAM,EAAE,GACN,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;gBAChE,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAClC,MAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC9C,MAAM,OAAO,GAAG,wBAAwB,CACtC,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,MAAM,CACb,CAAC;gBACF,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;gBAChD,MAAM,MAAM,CAAC;oBACX,IAAI,EAAE,aAAa;oBACnB,EAAE;oBACF,KAAK;oBACL,MAAM,EAAE,aAAa;oBACrB,OAAO;iBACR,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBACrC,MAAM,MAAM,CAAC;oBACX,IAAI,EAAE,aAAa;oBACnB,EAAE,EAAE,sBAAsB;oBAC1B,KAAK,EAAE,oBAAoB;oBAC3B,MAAM,EAAE,aAAa;oBACrB,OAAO,EAAE,aAAa,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;iBACpD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,KAAK,CAAC,QAAQ,CAAC,OAAO;YACpB,IAAI,YAAY;gBAAE,YAAY,CAAC,YAAY,CAAC,CAAC;YAC7C,MAAM,WAAW,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC5D,IAAI,EAAE,aAAa;gBACnB,EAAE;gBACF,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM,EAAE,IAAI,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM;aACjE,CAAC,CAAC,CAAC;YACJ,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC;gBACjE,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,MAAM;gBAChC,CAAC,CAAC,EAAE,CAAC;YACP,MAAM,aAAa,GAAG,gBAAgB;gBACpC,CAAC,CAAC;oBACE;wBACE,IAAI,EAAE,SAAS;wBACf,QAAQ,EAAE,yBAAyB,IAAI,CAAC,GAAG,EAAE,EAAE;wBAC/C,QAAQ,EAAE;4BACR;gCACE,IAAI,EAAE,QAAQ;gCACd,IAAI,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE;gCAC7C,KAAK,EAAE,SAAS;gCAChB,SAAS,EAAE,sBAAsB;gCACjC,KAAK,EAAE,gBAAgB,CAAC,OAAO;6BAChC;4BACD;gCACE,IAAI,EAAE,QAAQ;gCACd,IAAI,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE;gCAC1C,KAAK,EAAE,QAAQ;gCACf,SAAS,EAAE,mBAAmB;gCAC9B,KAAK,EAAE,gBAAgB,CAAC,IAAI;6BAC7B;yBACF;qBACF;iBACF;gBACH,CAAC,CAAC,EAAE,CAAC;YACP,MAAM,aAAa,CAAC,KAAK,EAAE,iBAAiB,EAAE;gBAC5C,OAAO;gBACP,EAAE,EAAE,QAAQ;gBACZ,aAAa,EAAE,OAAO,CAAC,IAAI,IAAI,OAAO;gBACtC,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtD,GAAG,CAAC,aAAa,CAAC,MAAM,IAAI,aAAa,CAAC,MAAM;oBAC9C,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,aAAa,EAAE,GAAG,aAAa,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE;oBAC/D,CAAC,CAAC,EAAE,CAAC;aACR,CAAC,CAAC;YACH,uBAAuB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;YACtD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1D,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,OAAO;YAChB,IAAI,YAAY;gBAAE,YAAY,CAAC,YAAY,CAAC,CAAC;YAC7C,MAAM,aAAa,CAAC,KAAK,EAAE,iBAAiB,EAAE;gBAC5C,OAAO;gBACP,EAAE,EAAE,QAAQ;gBACZ,aAAa,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC;aAClD,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACnB,uBAAuB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;QACxD,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import type { H3Event } from \"h3\";\nimport { createError, getHeader, readRawBody } from \"h3\";\n\nimport type { EnvKeyConfig } from \"../../server/create-server.js\";\nimport { resolveSecret } from \"../../server/credential-provider.js\";\nimport { getRequestContext } from \"../../server/request-context.js\";\nimport { getIntegrationRequestContext } from \"../../server/request-context.js\";\nimport { consumeIntegrationAwaitingInput } from \"../awaiting-input-store.js\";\nimport { createIntegrationControl } from \"../controls-store.js\";\nimport {\n getActiveIntegrationInstallationByKey,\n getActiveIntegrationInstallationForTenant,\n listIntegrationInstallations,\n resolveIntegrationTokenBundle,\n} from \"../installations-store.js\";\nimport { hasActivePendingTask } from \"../pending-tasks-store.js\";\nimport { slackInstallationKey } from \"../slack-oauth.js\";\nimport type {\n PlatformAdapter,\n IncomingMessage,\n OutgoingMessage,\n IntegrationStatus,\n OutboundTarget,\n PlatformRunProgress,\n PlatformRunProgressRef,\n PlatformDeliveryReceipt,\n IntegrationContextMessage,\n IntegrationFileReference,\n} from \"../types.js\";\n\n/** Slack's max message length */\nconst SLACK_MAX_LENGTH = 4000;\nconst SLACK_SECTION_TEXT_MAX_LENGTH = 3000;\nconst SLACK_API_TIMEOUT_MS = 10_000;\n// Permalink lookup happens on Slack's acknowledgement path, so keep it well\n// inside Slack's three-second Events API deadline. Failure is non-fatal: the\n// normalized message still carries channel/thread ids for replies.\nconst SLACK_PERMALINK_TIMEOUT_MS = 1_000;\nconst SLACK_CONTEXT_MESSAGE_LIMIT = 15;\nconst SLACK_CONTEXT_TEXT_LIMIT = 2_000;\nconst SLACK_CALM_PROGRESS_THRESHOLD_SECONDS = 30;\nconst SLACK_IDENTITY_TIMEOUT_MS = 1_000;\nconst SLACK_IDENTITY_CACHE_TTL_MS = 10 * 60 * 1_000;\n// Failed users.info lookups only get a short negative TTL: a transient Slack\n// API blip must not fail-close a sender's identity (and DMs) for 10 minutes.\nconst SLACK_IDENTITY_NEGATIVE_CACHE_TTL_MS = 30 * 1_000;\nconst SLACK_IDENTITY_CACHE_MAX_ENTRIES = 1_000;\n\ninterface SlackUserIdentity {\n email: string | null;\n name: string | null;\n memberType: \"owner\" | \"admin\" | \"member\" | \"guest\" | \"external\" | \"unknown\";\n}\n\nconst slackIdentityCache = new Map<\n string,\n { identity: SlackUserIdentity | null; expiresAt: number }\n>();\n\n// Deduped system notices send at most once per key per TTL so senders are\n// informed without being spammed per message. Callers pick the window: the\n// anonymous-tier heads-up uses the default day-long TTL; decline replies pass\n// a short TTL so a persistent condition still reminds the sender occasionally.\nconst SLACK_SYSTEM_NOTICE_DEDUPE_TTL_MS = 24 * 60 * 60 * 1_000;\nconst SLACK_SYSTEM_NOTICE_CACHE_MAX_ENTRIES = 1_000;\nconst slackSystemNoticeCache = new Map<string, number>();\n\n/** Returns true when a deduped notice should send now, claiming the slot. */\nfunction claimSlackSystemNoticeSlot(\n key: string,\n ttlMs = SLACK_SYSTEM_NOTICE_DEDUPE_TTL_MS,\n): boolean {\n const now = Date.now();\n const expiresAt = slackSystemNoticeCache.get(key);\n if (expiresAt && expiresAt > now) return false;\n if (expiresAt) slackSystemNoticeCache.delete(key);\n if (slackSystemNoticeCache.size >= SLACK_SYSTEM_NOTICE_CACHE_MAX_ENTRIES) {\n const oldestKey = slackSystemNoticeCache.keys().next().value;\n if (oldestKey) slackSystemNoticeCache.delete(oldestKey);\n }\n slackSystemNoticeCache.set(key, now + ttlMs);\n return true;\n}\n\nexport interface SlackAdapterOptions {\n /** Resolve the bot token for the exact Slack installation. */\n resolveBotToken?: (incoming: IncomingMessage) => Promise<string | undefined>;\n /** Override active-thread detection for hosted adapters/tests. */\n isThreadActive?: (incoming: IncomingMessage) => Promise<boolean>;\n /** Override one-shot clarification-window consumption for tests. */\n consumeAwaitingInput?: (incoming: IncomingMessage) => Promise<boolean>;\n}\n\n/**\n * Create a Slack platform adapter.\n *\n * Required env vars:\n * - SLACK_BOT_TOKEN — Bot user OAuth token (xoxb-...)\n * - SLACK_SIGNING_SECRET — Used to verify webhook signatures\n *\n * Optional env vars:\n * - SLACK_ALLOWED_TEAM_IDS — Comma-separated list of Slack workspace\n * `team_id` values (e.g. \"T012ABCDEF,T034GHIJKL\") that this deployment\n * accepts events from. Required in production and strongly recommended\n * to prevent cross-workspace event injection (H1 in the webhook audit):\n * the global `SLACK_SIGNING_SECRET` is the same key for every workspace\n * the app is installed to, so without an allowlist any installed\n * workspace can drive the agent. When unset the adapter accepts events\n * from any workspace in development, but rejects events in production.\n * - SLACK_ALLOWED_API_APP_IDS — Comma-separated list of Slack app IDs\n * (`api_app_id`) to additionally pin events to. Useful when the same\n * signing secret rotation surfaces multiple app installs.\n */\nexport function slackAdapter(\n options: SlackAdapterOptions = {},\n): PlatformAdapter {\n const resolveBotToken = async (incoming: IncomingMessage) =>\n (await options.resolveBotToken?.(incoming)) ??\n (await resolveManagedSlackBotToken(incoming)) ??\n (await resolveSecret(\"SLACK_BOT_TOKEN\")) ??\n undefined;\n\n return {\n platform: \"slack\",\n label: \"Slack\",\n capabilities: {\n replyText: true,\n proactiveMessages: true,\n nativeThreads: true,\n contextualReplies: true,\n deferredWebhookResponse: false,\n interactionOnly: false,\n nativeContextHydration: true,\n liveRunProgress: true,\n },\n\n getRequiredEnvKeys(): EnvKeyConfig[] {\n return [\n {\n key: \"SLACK_BOT_TOKEN\",\n label: \"Slack Bot Token\",\n required: false,\n helpText:\n \"In your Slack app's left nav: OAuth & Permissions → Bot User OAuth Token (starts with `xoxb-`).\",\n },\n {\n key: \"SLACK_CLIENT_ID\",\n label: \"Slack OAuth Client ID\",\n required: false,\n helpText:\n \"Slack app Basic Information → App Credentials → Client ID.\",\n },\n {\n key: \"SLACK_CLIENT_SECRET\",\n label: \"Slack OAuth Client Secret\",\n required: false,\n helpText:\n \"Slack app Basic Information → App Credentials → Client Secret.\",\n },\n {\n key: \"SLACK_SIGNING_SECRET\",\n label: \"Slack Signing Secret\",\n required: true,\n helpText:\n \"In your Slack app's left nav: Basic Information → App Credentials → Signing Secret.\",\n },\n ];\n },\n\n async handleVerification(\n event: H3Event,\n ): Promise<{ handled: boolean; response?: unknown }> {\n // Slack sends url_verification when first setting up the webhook.\n // readRawBodyCached caches the raw bytes on event.context.__rawBody so\n // subsequent verifyWebhook + parseIncomingMessage calls re-use them\n // without re-stringifying a parsed body (M2 in the audit).\n const body = await readRawBodyCached(event);\n try {\n const parsed = JSON.parse(body);\n if (parsed.type === \"url_verification\") {\n // Slack's URL verifier expects the raw challenge value in the\n // response body. Returning JSON works for some clients but the app\n // settings verifier rejects it as not matching the challenge.\n return { handled: true, response: parsed.challenge };\n }\n } catch {}\n return { handled: false };\n },\n\n async verifyWebhook(event: H3Event): Promise<boolean> {\n const signingSecret = await resolveSecret(\"SLACK_SIGNING_SECRET\");\n if (!signingSecret) return false;\n\n const signature = getHeader(event, \"x-slack-signature\");\n const timestamp = getHeader(event, \"x-slack-request-timestamp\");\n if (!signature || !timestamp) return false;\n\n // Reject requests older than 5 minutes (replay protection)\n const ts = parseInt(timestamp, 10);\n if (Math.abs(Date.now() / 1000 - ts) > 300) return false;\n\n const body = await readRawBodyCached(event);\n const crypto = await import(\"node:crypto\");\n const basestring = `v0:${timestamp}:${body}`;\n const expectedSignature =\n \"v0=\" +\n crypto\n .createHmac(\"sha256\", signingSecret)\n .update(basestring)\n .digest(\"hex\");\n\n // Timing-safe comparison\n try {\n return crypto.timingSafeEqual(\n Buffer.from(signature),\n Buffer.from(expectedSignature),\n );\n } catch {\n return false;\n }\n },\n\n async parseIncomingMessage(\n event: H3Event,\n ): Promise<IncomingMessage | null> {\n const raw = await readRawBodyCached(event);\n let payload: any;\n try {\n payload = JSON.parse(raw);\n } catch {\n return null;\n }\n\n // H1 (webhook audit): cross-workspace event injection. The global\n // SLACK_SIGNING_SECRET is the same key for every workspace this Slack\n // app is installed to — without a per-tenant allowlist any installed\n // workspace can drive the agent. We enforce SLACK_ALLOWED_TEAM_IDS\n // here AFTER the signature has already been verified by the webhook\n // handler, so this is purely a tenant-isolation gate (not a forgery\n // defense). When unset in production we surface a one-time warning\n // recommending it be configured.\n await enforceWorkspaceAllowlist(payload);\n\n // Handle Events API wrapper\n if (payload.type === \"event_callback\") {\n const e = payload.event;\n if (!e) return null;\n\n // Ignore bot messages\n if (e.bot_id || e.subtype === \"bot_message\") return null;\n // Ignore message edits and deletes\n if (e.subtype === \"message_changed\" || e.subtype === \"message_deleted\")\n return null;\n\n // Handle DMs and explicit mentions. Ordinary channel replies are only\n // accepted while this exact workspace-qualified thread has queued or\n // executing work; broad message subscriptions must never invoke the\n // agent for general channel chatter.\n const text = e.text?.trim();\n if (!text) return null;\n\n const teamId =\n typeof payload.team_id === \"string\" ? payload.team_id : \"unknown\";\n const apiAppId =\n typeof payload.api_app_id === \"string\"\n ? payload.api_app_id\n : \"unknown\";\n const agentContext = normalizeSlackAgentContext(e.app_context, teamId);\n const isDm =\n typeof e.channel_type === \"string\"\n ? e.channel_type === \"im\"\n : typeof e.channel === \"string\" && e.channel.startsWith(\"D\");\n const isMention = e.type === \"app_mention\";\n const isThreadReply = !isDm && !isMention && !!e.thread_ts;\n if (!isDm && !isMention && !isThreadReply) return null;\n\n // Remove bot mention from text (e.g., \"<@U123> do something\" → \"do something\")\n const cleanText = text.replace(/<@[A-Z0-9]+>/g, \"\").trim();\n if (!cleanText) return null;\n\n // Thread ID: use thread_ts if in a thread, otherwise message ts\n const threadTs = e.thread_ts || e.ts;\n const externalThreadId = `${apiAppId}:${teamId}:${e.channel}:${threadTs}`;\n const partialIncoming: IncomingMessage = {\n platform: \"slack\",\n externalThreadId,\n text: cleanText,\n senderName: e.user,\n senderId: e.user,\n triggerKind: isDm ? \"dm\" : isMention ? \"mention\" : \"thread_reply\",\n conversationType: isDm ? \"dm\" : \"unknown\",\n tenantId: teamId,\n // The signed Slack envelope authenticates the workspace, not the\n // sender's membership tier. `users.info` hydration below is the\n // authority that may promote this to a verified member.\n actorTrust: { memberType: \"unknown\", verified: false },\n platformContext: {\n channelId: e.channel,\n channelType: e.channel_type,\n threadTs,\n messageTs: e.ts,\n teamId,\n apiAppId,\n enterpriseId:\n typeof payload.enterprise_id === \"string\"\n ? payload.enterprise_id\n : undefined,\n eventId: payload.event_id,\n ...(agentContext\n ? {\n agentContext: agentContext.entities,\n activeContextChannelId: agentContext.channelId,\n }\n : {}),\n },\n threadRef: threadTs,\n replyRef: e.ts,\n timestamp: Math.floor(parseFloat(e.ts) * 1000),\n };\n\n if (isThreadReply) {\n // An ordinary thread reply is narrowly admitted when either work is\n // still queued or the same Slack user is answering a fresh\n // integration-originated clarification. Consuming the latter is a\n // conditional SQL delete, so concurrent replies cannot both reopen\n // the agent and unrelated channel messages remain ignored.\n const answeredClarification = options.consumeAwaitingInput\n ? await options.consumeAwaitingInput(partialIncoming)\n : options.isThreadActive\n ? false\n : await consumeIntegrationAwaitingInput({\n platform: \"slack\",\n externalThreadId,\n requesterId: e.user,\n });\n const active = options.isThreadActive\n ? await options.isThreadActive(partialIncoming)\n : await hasActivePendingTask(\"slack\", externalThreadId);\n if (!active && !answeredClarification) return null;\n }\n\n const token = await resolveBotToken(partialIncoming);\n const threadPermalink = await resolveSlackThreadPermalink(\n e.channel,\n threadTs,\n token,\n );\n\n return {\n ...partialIncoming,\n platformContext: {\n ...partialIncoming.platformContext,\n ...(threadPermalink ? { threadPermalink } : {}),\n },\n ...(threadPermalink ? { sourceUrl: threadPermalink } : {}),\n };\n }\n\n return null;\n },\n\n getLegacyExternalThreadIds(incoming: IncomingMessage): string[] {\n const channelId = incoming.platformContext.channelId;\n const threadTs = incoming.platformContext.threadTs;\n return typeof channelId === \"string\" && typeof threadTs === \"string\"\n ? [`${channelId}:${threadTs}`]\n : [];\n },\n\n async postProcessingPlaceholder(\n incoming: IncomingMessage,\n ): Promise<{ placeholderRef: string } | null> {\n // No placeholder reply in the thread — Slack's native assistant status\n // bar and the task stream are the loading affordance. Keep the status\n // specific about intent instead of presenting the generic thinking\n // state while the native plan is opening.\n const token = await resolveBotToken(incoming);\n if (!token) return null;\n\n const channelId = incoming.platformContext.channelId as string;\n const threadTs = incoming.platformContext.threadTs as string;\n if (!channelId || !threadTs) return null;\n\n // Best-effort: flip the native Agent status bar in the\n // channel input area. Slack accepts chat:write for this method. The\n // canonical manifest separately requests assistant:write for Agent View\n // and app_context_changed events.\n setSlackAssistantStatus(\n token,\n channelId,\n threadTs,\n \"I’m looking into this now…\",\n );\n return null;\n },\n\n async hydrateIncomingMessage(\n incoming: IncomingMessage,\n ): Promise<IncomingMessage> {\n const token = await resolveBotToken(incoming);\n if (!token) return incoming;\n return hydrateSlackContext(token, incoming);\n },\n\n async hydrateIncomingIdentity(\n incoming: IncomingMessage,\n ): Promise<IncomingMessage> {\n const token = await resolveBotToken(incoming);\n if (!token) return incoming;\n return hydrateSlackIdentity(token, incoming);\n },\n\n async startRunProgress(\n incoming: IncomingMessage,\n ): Promise<PlatformRunProgress | null> {\n const token = await resolveBotToken(incoming);\n if (!token) return null;\n return startSlackRunProgress(token, incoming);\n },\n\n async resumeRunProgress(\n incoming: IncomingMessage,\n ref: PlatformRunProgressRef,\n ): Promise<PlatformRunProgress | null> {\n if (!isSlackStreamProgressRef(ref)) return null;\n const token = await resolveBotToken(incoming);\n if (!token) return null;\n return resumeSlackRunProgress(token, incoming, ref.streamTs);\n },\n\n async sendResponse(\n message: OutgoingMessage,\n context: IncomingMessage,\n opts?: { placeholderRef?: string },\n ): Promise<void | PlatformDeliveryReceipt> {\n const token = await resolveBotToken(context);\n if (!token) {\n throw new Error(\n \"[slack] Cannot deliver response: no Slack bot token is configured\",\n );\n }\n\n const channelId = context.platformContext.channelId as string;\n const threadTs = context.platformContext.threadTs as string;\n const blocks = (message.platformContext as any)?.blocks as\n | unknown[]\n | undefined;\n const placeholderRef = opts?.placeholderRef;\n\n // Block-rich path: split text into chunks but render the FIRST chunk as\n // blocks (so we keep the in-place edit + button) and any overflow as\n // plain follow-up posts. The vast majority of replies fit in one block.\n const chunks = splitNonEmptyMessage(message.text, SLACK_MAX_LENGTH);\n const hasProvidedBlocks = Array.isArray(blocks) && blocks.length > 0;\n const firstChunk = chunks[0] ?? (hasProvidedBlocks ? \"Response\" : \"\");\n if (!firstChunk) {\n if (threadTs) {\n setSlackAssistantStatus(token, channelId, threadTs, \"\");\n }\n return;\n }\n const restChunks = chunks.slice(1);\n const messageRefs: string[] = [];\n\n const finalBlocks =\n blocks ??\n buildResponseBlocks(firstChunk, {\n threadDeepLinkUrl: (message.platformContext as any)\n ?.threadDeepLinkUrl,\n });\n\n const baseBody: Record<string, unknown> = {\n channel: channelId,\n text: firstChunk,\n blocks: finalBlocks,\n unfurl_links: false,\n unfurl_media: false,\n mrkdwn: true,\n };\n\n try {\n if (placeholderRef) {\n // Replace the \"thinking…\" placeholder in place.\n const res = await slackApiFetch(\"https://slack.com/api/chat.update\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ ...baseBody, ts: placeholderRef }),\n });\n const data = (await res.json()) as {\n ok: boolean;\n error?: string;\n ts?: string;\n };\n if (!data.ok) {\n console.error(\"[slack] chat.update error:\", data.error);\n // Fall back to a fresh post so the user still sees a reply\n const postedTs = await postFresh(\n token,\n channelId,\n threadTs,\n baseBody,\n );\n if (postedTs) messageRefs.push(postedTs);\n } else {\n messageRefs.push(data.ts || placeholderRef);\n }\n } else {\n const postedTs = await postFresh(\n token,\n channelId,\n threadTs,\n baseBody,\n );\n if (postedTs) messageRefs.push(postedTs);\n }\n\n // Clear the AI-assistant \"is thinking…\" status now that we've\n // delivered the final answer. Empty status clears it.\n if (threadTs) {\n setSlackAssistantStatus(token, channelId, threadTs, \"\");\n }\n\n // Overflow chunks (rare) — post as plain follow-ups in the same thread\n for (const chunk of restChunks) {\n const postedTs = await postFresh(token, channelId, threadTs, {\n channel: channelId,\n text: chunk,\n unfurl_links: false,\n unfurl_media: false,\n mrkdwn: true,\n });\n if (postedTs) messageRefs.push(postedTs);\n }\n return {\n status: \"delivered\",\n ...(messageRefs.length > 0 ? { messageRefs } : {}),\n };\n } catch (err) {\n console.error(\"[slack] Failed to send message:\", err);\n throw err;\n }\n },\n\n async sendSystemNotice(\n incoming: IncomingMessage,\n text: string,\n opts?: { dedupeKey?: string; dedupeTtlMs?: number },\n ): Promise<void> {\n if (!text.trim()) return;\n const dedupeKey = opts?.dedupeKey;\n if (\n dedupeKey &&\n !claimSlackSystemNoticeSlot(dedupeKey, opts?.dedupeTtlMs)\n ) {\n return;\n }\n try {\n const token = await resolveBotToken(incoming);\n if (!token) {\n if (dedupeKey) slackSystemNoticeCache.delete(dedupeKey);\n throw new Error(\"Slack bot token not configured for system notice\");\n }\n const channelId = incoming.platformContext.channelId;\n if (typeof channelId !== \"string\" || !channelId) {\n if (dedupeKey) slackSystemNoticeCache.delete(dedupeKey);\n throw new Error(\"Slack channel id missing for system notice\");\n }\n const threadTs =\n typeof incoming.platformContext.threadTs === \"string\"\n ? incoming.platformContext.threadTs\n : undefined;\n await postFresh(token, channelId, threadTs, {\n text,\n unfurl_links: false,\n unfurl_media: false,\n mrkdwn: true,\n });\n } catch (error) {\n // A failed delivery did not inform the sender, so release the slot and\n // allow the next message to retry instead of suppressing notices for a day.\n if (dedupeKey) slackSystemNoticeCache.delete(dedupeKey);\n throw error;\n }\n },\n\n async sendMessageToTarget(\n message: OutgoingMessage,\n target: OutboundTarget,\n ): Promise<void> {\n const targetContext: IncomingMessage = {\n platform: \"slack\",\n externalThreadId: `${target.tenantId ?? \"unknown\"}:${target.destination}:${target.threadRef ?? \"root\"}`,\n text: \"\",\n platformContext: {\n channelId: target.destination,\n threadTs: target.threadRef,\n teamId: target.tenantId,\n },\n tenantId: target.tenantId,\n timestamp: Date.now(),\n };\n const token = await resolveBotToken(targetContext);\n if (!token) {\n console.error(\"[slack] SLACK_BOT_TOKEN not configured\");\n return;\n }\n\n const chunks = splitNonEmptyMessage(message.text, SLACK_MAX_LENGTH);\n if (chunks.length === 0) return;\n for (const chunk of chunks) {\n const body: Record<string, unknown> = {\n channel: target.destination,\n text: chunk,\n };\n if (target.threadRef) body.thread_ts = target.threadRef;\n\n try {\n const res = await slackApiFetch(\n \"https://slack.com/api/chat.postMessage\",\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n },\n );\n const data = (await res.json()) as { ok: boolean; error?: string };\n if (!data.ok) {\n throw new Error(data.error || \"chat.postMessage failed\");\n }\n } catch (err) {\n console.error(\"[slack] Failed to send proactive message:\", err);\n throw err;\n }\n }\n },\n\n formatAgentResponse(\n text: string,\n opts?: { threadDeepLinkUrl?: string },\n ): OutgoingMessage {\n return {\n text: markdownToSlackMrkdwn(text),\n platformContext: opts?.threadDeepLinkUrl\n ? { threadDeepLinkUrl: opts.threadDeepLinkUrl }\n : {},\n };\n },\n\n async getStatus(_baseUrl?: string): Promise<IntegrationStatus> {\n const hasToken = !!(await resolveSecret(\"SLACK_BOT_TOKEN\"));\n const hasSecret = !!(await resolveSecret(\"SLACK_SIGNING_SECRET\"));\n const ctx = getRequestContext();\n const managedInstallations = ctx?.userEmail\n ? await listIntegrationInstallations(\n {\n userEmail: ctx.userEmail,\n orgId: ctx.orgId ?? null,\n },\n \"slack\",\n ).catch(() => [])\n : [];\n const connectedInstallations = managedInstallations.filter(\n (installation) => installation.status === \"connected\",\n );\n const configured =\n hasSecret && (hasToken || connectedInstallations.length > 0);\n\n return {\n platform: \"slack\",\n label: \"Slack\",\n enabled: false, // overridden by plugin\n configured,\n details: {\n hasToken,\n hasSecret,\n managedInstallationCount: connectedInstallations.length,\n managedInstallations: connectedInstallations.map((installation) => ({\n id: installation.id,\n teamId: installation.teamId,\n teamName: installation.teamName,\n enterpriseId: installation.enterpriseId,\n health: installation.health,\n scopes: installation.scopes,\n })),\n },\n error: !configured\n ? \"Connect a Slack workspace with OAuth or save a bot token and signing secret\"\n : undefined,\n };\n },\n };\n}\n\n/**\n * Parse a comma-separated env var into a Set of trimmed, non-empty values.\n * Returns null when the env var is unset or empty (so callers can\n * distinguish \"no allowlist configured\" from \"empty allowlist\").\n */\nfunction parseAllowlistEnv(name: string): Set<string> | null {\n const raw = process.env[name];\n if (!raw) return null;\n const values = raw\n .split(\",\")\n .map((v) => v.trim())\n .filter((v) => v.length > 0);\n if (values.length === 0) return null;\n return new Set(values);\n}\n\nasync function resolveManagedSlackBotToken(\n incoming: IncomingMessage,\n): Promise<string | undefined> {\n const teamId =\n typeof incoming.platformContext.teamId === \"string\"\n ? incoming.platformContext.teamId\n : incoming.tenantId;\n const apiAppId =\n typeof incoming.platformContext.apiAppId === \"string\"\n ? incoming.platformContext.apiAppId\n : undefined;\n const enterpriseId =\n typeof incoming.platformContext.enterpriseId === \"string\"\n ? incoming.platformContext.enterpriseId\n : undefined;\n if (!teamId && !enterpriseId) return undefined;\n try {\n let installation = apiAppId\n ? await getActiveIntegrationInstallationByKey(\n \"slack\",\n slackInstallationKey({ teamId, enterpriseId, apiAppId }),\n )\n : null;\n if (!installation && teamId) {\n installation = await getActiveIntegrationInstallationForTenant(\n \"slack\",\n teamId,\n );\n }\n if (!installation && enterpriseId) {\n installation = await getActiveIntegrationInstallationForTenant(\n \"slack\",\n enterpriseId,\n );\n }\n const key =\n installation?.installationKey ??\n slackInstallationKey({ teamId, enterpriseId, apiAppId });\n return (await resolveIntegrationTokenBundle(\"slack\", key))?.accessToken;\n } catch {\n return undefined;\n }\n}\n\nlet _missingAllowlistWarned = false;\n\n/**\n * Enforce that an incoming Slack event comes from an allowlisted workspace.\n *\n * H1 in the webhook audit: the framework uses a SINGLE global\n * SLACK_SIGNING_SECRET for every workspace the Slack app is installed to,\n * so a valid signature alone doesn't prove the request belongs to the\n * tenant the deployment intends to serve. This helper layers a per-tenant\n * allowlist on top of signature verification.\n *\n * Behavior:\n * - If `SLACK_ALLOWED_TEAM_IDS` is set: reject any payload whose\n * `team_id` isn't in the list.\n * - If `SLACK_ALLOWED_API_APP_IDS` is set: also reject payloads whose\n * `api_app_id` isn't in the list (bot apps can be installed under the\n * same Slack app id across multiple workspaces — pinning both keeps\n * the surface tight when team_id allows multiple workspaces).\n * - If `SLACK_ALLOWED_TEAM_IDS` is unset/empty in production: reject the\n * event. Production must fail closed so any workspace with the shared\n * signing secret cannot drive the agent.\n * - If `SLACK_ALLOWED_TEAM_IDS` is unset/empty in dev / single-tenant: log a\n * one-time warning and accept (current local setup behavior).\n *\n * Throws an h3 401 error when an allowlisted-but-mismatched payload is\n * received, which the integrations plugin surfaces to the caller as\n * \"Unrecognized Slack workspace\" without enqueuing the event.\n */\nasync function enforceWorkspaceAllowlist(payload: any): Promise<void> {\n const teamId =\n typeof payload?.team_id === \"string\" ? payload.team_id : undefined;\n const apiAppId =\n typeof payload?.api_app_id === \"string\" ? payload.api_app_id : undefined;\n\n const allowedTeamIds = parseAllowlistEnv(\"SLACK_ALLOWED_TEAM_IDS\");\n const allowedAppIds = parseAllowlistEnv(\"SLACK_ALLOWED_API_APP_IDS\");\n\n if (!allowedTeamIds) {\n if (process.env.NODE_ENV === \"production\") {\n let managed = false;\n try {\n const key = slackInstallationKey({ teamId, apiAppId });\n managed = !!(await getActiveIntegrationInstallationByKey(\"slack\", key));\n } catch {}\n if (!managed) {\n throw createError({\n statusCode: 401,\n statusMessage: \"Slack workspace is not connected\",\n });\n }\n }\n if (!_missingAllowlistWarned) {\n _missingAllowlistWarned = true;\n console.warn(\n \"[slack] SLACK_ALLOWED_TEAM_IDS not set — accepting events from any workspace whose signature matches SLACK_SIGNING_SECRET. \" +\n \"Set SLACK_ALLOWED_TEAM_IDS to a comma-separated list of allowed team_id values before deploying to production.\",\n );\n }\n }\n\n if (allowedTeamIds) {\n if (!teamId || !allowedTeamIds.has(teamId)) {\n throw createError({\n statusCode: 401,\n statusMessage: \"Unrecognized Slack workspace\",\n });\n }\n }\n\n if (allowedAppIds) {\n if (!apiAppId || !allowedAppIds.has(apiAppId)) {\n throw createError({\n statusCode: 401,\n statusMessage: \"Unrecognized Slack workspace\",\n });\n }\n }\n}\n\n/**\n * Read the raw request body as a string and cache on the event context.\n *\n * This MUST read raw bytes from the request stream — never `JSON.stringify`\n * a parsed body, because Slack's HMAC is computed over the exact bytes Slack\n * sent. Re-stringifying a parsed object loses key ordering, whitespace, and\n * Unicode-escape choices, so the signature check would silently fail for\n * legitimate requests (M2 in the webhook security audit).\n *\n * h3 v2's body stream is consume-once, so we cache the raw string on the\n * event context after the first read. All call sites (handleVerification,\n * verifyWebhook, parseIncomingMessage) MUST go through this helper.\n */\nasync function readRawBodyCached(event: H3Event): Promise<string> {\n const cached = event.context.__rawBody;\n if (typeof cached === \"string\") return cached;\n // h3's readRawBody returns the bytes Slack actually sent, defaulting to\n // utf8-decoded. Returns undefined for empty bodies — we coerce to \"\" so\n // the HMAC check can proceed deterministically.\n const raw = (await readRawBody(event)) ?? \"\";\n event.context.__rawBody = raw;\n return raw;\n}\n\nfunction utf8ByteLength(text: string): number {\n return new TextEncoder().encode(text).length;\n}\n\nfunction prefixWithinUtf8ByteLimit(text: string, maxLength: number): string {\n let bytes = 0;\n let end = 0;\n for (const char of text) {\n const nextBytes = utf8ByteLength(char);\n if (bytes + nextBytes > maxLength) break;\n bytes += nextBytes;\n end += char.length;\n }\n return text.slice(0, end || 1);\n}\n\n/** Split a message into chunks that fit within the platform's byte limit. */\nfunction splitMessage(text: string, maxLength: number): string[] {\n if (utf8ByteLength(text) <= maxLength) return [text];\n const chunks: string[] = [];\n let remaining = text;\n while (remaining.length > 0) {\n if (utf8ByteLength(remaining) <= maxLength) {\n chunks.push(remaining);\n break;\n }\n\n const prefix = prefixWithinUtf8ByteLimit(remaining, maxLength);\n\n // Try to split at a newline\n let splitIdx = prefix.lastIndexOf(\"\\n\");\n if (splitIdx <= 0) {\n // Try to split at a space\n splitIdx = prefix.lastIndexOf(\" \");\n }\n if (splitIdx <= 0) {\n splitIdx = prefix.length;\n }\n chunks.push(remaining.slice(0, splitIdx));\n remaining = remaining.slice(splitIdx).trimStart();\n }\n return chunks;\n}\n\n/** Split a message and drop chunks Slack would render as blank messages. */\nfunction splitNonEmptyMessage(text: string, maxLength: number): string[] {\n return splitMessage(text, maxLength).filter(\n (chunk) => chunk.trim().length > 0,\n );\n}\n\n/** Hard cap on input length we feed to the regex-based mrkdwn converter.\n * L2 in the webhook audit: `\\*\\*(.+?)\\*\\*` with the `s` flag on a long\n * string of asterisks can exhibit super-linear backtracking. Slack\n * itself caps message bodies at 4000 chars (SLACK_MAX_LENGTH); we cap\n * the input here at 10x that as a defensive bound for any caller that\n * passes a longer rendering source through this helper before chunking. */\nconst MRKDWN_MAX_LENGTH = 40_000;\n\n/**\n * Convert standard markdown to Slack's mrkdwn dialect.\n * - `[text](url)` → `<url|text>`\n * - `**bold**` → `*bold*` (Slack uses single asterisks for bold)\n *\n * Inputs longer than MRKDWN_MAX_LENGTH are truncated before the regex\n * pass to bound worst-case backtracking on pathological input (L2 in the\n * webhook audit).\n */\nfunction markdownToSlackMrkdwn(text: string): string {\n const bounded =\n text.length > MRKDWN_MAX_LENGTH ? text.slice(0, MRKDWN_MAX_LENGTH) : text;\n return (\n bounded\n .replace(/\\[([^\\]]+)\\]\\(([^)]+)\\)/g, \"<$2|$1>\")\n // Do not wrap bare URLs in Slack bold markers. Slack's autolinker can\n // treat the trailing `*` as part of the URL, producing a broken link.\n .replace(/\\*\\*<?(https?:\\/\\/[^\\s>*]+)>?\\*\\*/g, \"<$1>\")\n // Bounded character class instead of `.+?` with the `s` flag — caps\n // each bold span at 5000 chars so an attacker can't construct a\n // pathological \"**\" sequence that exhibits super-linear backtracking.\n // Newlines are allowed because `[^*]` excludes only the asterisk\n // itself, so multi-line bold spans still match.\n .replace(/\\*\\*([^*]{1,5000})\\*\\*/g, \"*$1*\")\n );\n}\n\n/**\n * Optionally set Slack's native Agent status indicator (the small \"is\n * thinking…\" line under the message composer). The method uses chat:write;\n * Agent View itself is configured separately by the Slack app manifest.\n * Pure best-effort — failures never block the response.\n */\nfunction setSlackAssistantStatus(\n token: string,\n channelId: string,\n threadTs: string,\n status: string,\n): void {\n slackApiFetch(\"https://slack.com/api/assistant.threads.setStatus\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n channel_id: channelId,\n thread_ts: threadTs,\n status,\n }),\n }).catch(() => {});\n}\n\n/**\n * Block Kit payload for the final answer. We avoid auto-unfurl previews by\n * separating the deep-link out into a button instead of inlining it as a\n * `<url|text>` markdown link in the section body — that's what was producing\n * the giant \"Agent-Native Dispatch\" card in every thread reply.\n */\nfunction buildResponseBlocks(\n text: string,\n opts: { threadDeepLinkUrl?: string },\n): unknown[] {\n const sectionChunks = splitMessage(\n text || \"_(no response)_\",\n SLACK_SECTION_TEXT_MAX_LENGTH,\n );\n const blocks: any[] = sectionChunks.map((chunk) => ({\n type: \"section\",\n text: { type: \"mrkdwn\", text: chunk },\n }));\n if (opts.threadDeepLinkUrl) {\n blocks.push({\n type: \"actions\",\n elements: [\n {\n type: \"button\",\n text: { type: \"plain_text\", text: \"Open thread\", emoji: true },\n url: opts.threadDeepLinkUrl,\n action_id: \"open_dispatch_thread\",\n },\n ],\n });\n }\n return blocks;\n}\n\n/**\n * Post a fresh message to a thread. Used as the placeholder-fallback path\n * (e.g. when chat.update fails) and for follow-up overflow chunks.\n */\nasync function postFresh(\n token: string,\n channelId: string,\n threadTs: string | undefined,\n body: Record<string, unknown>,\n): Promise<string | undefined> {\n const hasBlocks =\n Array.isArray(body.blocks) && (body.blocks as unknown[]).length > 0;\n if (\n typeof body.text === \"string\" &&\n body.text.trim().length === 0 &&\n !hasBlocks\n ) {\n return undefined;\n }\n\n const payload: Record<string, unknown> = {\n ...body,\n channel: channelId,\n };\n if (threadTs && !payload.thread_ts) payload.thread_ts = threadTs;\n const res = await slackApiFetch(\"https://slack.com/api/chat.postMessage\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(payload),\n });\n const data = (await res.json()) as {\n ok: boolean;\n error?: string;\n ts?: string;\n };\n if (!data.ok) {\n console.error(\"[slack] chat.postMessage error:\", data.error);\n throw new Error(data.error || \"chat.postMessage failed\");\n }\n return data.ts;\n}\n\nasync function slackApiFetch(\n url: string,\n init: RequestInit,\n timeoutMs = SLACK_API_TIMEOUT_MS,\n): Promise<Response> {\n const controller =\n typeof AbortController !== \"undefined\" ? new AbortController() : undefined;\n const timer = controller\n ? setTimeout(() => controller.abort(), timeoutMs)\n : undefined;\n try {\n return await fetch(url, {\n ...init,\n signal: controller?.signal ?? init.signal,\n });\n } finally {\n if (timer) clearTimeout(timer);\n }\n}\n\nasync function resolveSlackThreadPermalink(\n channelId: unknown,\n threadTs: unknown,\n resolvedToken?: string,\n): Promise<string | undefined> {\n if (typeof channelId !== \"string\" || typeof threadTs !== \"string\") {\n return undefined;\n }\n const token = resolvedToken ?? (await resolveSecret(\"SLACK_BOT_TOKEN\"));\n if (!token) return undefined;\n\n try {\n const url = new URL(\"https://slack.com/api/chat.getPermalink\");\n url.searchParams.set(\"channel\", channelId);\n url.searchParams.set(\"message_ts\", threadTs);\n const res = await slackApiFetch(\n url.toString(),\n { headers: { Authorization: `Bearer ${token}` } },\n SLACK_PERMALINK_TIMEOUT_MS,\n );\n const data = (await res.json()) as {\n ok?: boolean;\n permalink?: unknown;\n };\n if (!data.ok || typeof data.permalink !== \"string\") return undefined;\n\n const permalink = new URL(data.permalink);\n const isSlackHost =\n permalink.hostname === \"slack.com\" ||\n permalink.hostname.endsWith(\".slack.com\");\n if (permalink.protocol !== \"https:\" || !isSlackHost) return undefined;\n return permalink.toString();\n } catch {\n return undefined;\n }\n}\n\nfunction boundedSlackText(value: unknown): string {\n return typeof value === \"string\"\n ? value.slice(0, SLACK_CONTEXT_TEXT_LIMIT)\n : \"\";\n}\n\nfunction normalizeSlackAgentContext(\n value: unknown,\n eventTeamId: string,\n): {\n entities: Array<{ type: string; value: string; teamId?: string }>;\n channelId?: string;\n} | null {\n if (!value || typeof value !== \"object\") return null;\n const rawEntities = (value as { entities?: unknown }).entities;\n if (!Array.isArray(rawEntities)) return null;\n const entities = rawEntities.slice(0, 10).flatMap((entity) => {\n if (!entity || typeof entity !== \"object\") return [];\n const record = entity as Record<string, unknown>;\n if (typeof record.type !== \"string\" || typeof record.value !== \"string\") {\n return [];\n }\n const teamId =\n typeof record.team_id === \"string\" ? record.team_id : undefined;\n if (teamId && eventTeamId !== \"unknown\" && teamId !== eventTeamId) {\n return [];\n }\n return [\n {\n type: record.type.slice(0, 100),\n value: record.value.slice(0, 200),\n ...(teamId ? { teamId } : {}),\n },\n ];\n });\n if (!entities.length) return null;\n const channelId = entities.find(\n (entity) =>\n entity.type === \"slack#/types/channel_id\" &&\n /^[CDG][A-Z0-9]+$/.test(entity.value),\n )?.value;\n return { entities, ...(channelId ? { channelId } : {}) };\n}\n\nfunction slackFileReference(value: unknown): IntegrationFileReference | null {\n if (!value || typeof value !== \"object\") return null;\n const file = value as Record<string, unknown>;\n if (typeof file.id !== \"string\") return null;\n return {\n id: file.id,\n ...(typeof file.name === \"string\" ? { name: file.name } : {}),\n ...(typeof file.mimetype === \"string\" ? { mimetype: file.mimetype } : {}),\n ...(typeof file.size === \"number\" ? { size: file.size } : {}),\n ...(typeof file.permalink === \"string\"\n ? { permalink: file.permalink }\n : {}),\n ...(typeof file.url_private_download === \"string\"\n ? { downloadUrl: file.url_private_download }\n : {}),\n };\n}\n\nasync function slackJson(\n token: string,\n method: string,\n params: Record<string, string>,\n timeoutMs = 2_000,\n): Promise<Record<string, any> | null> {\n try {\n const url = new URL(`https://slack.com/api/${method}`);\n for (const [key, value] of Object.entries(params)) {\n url.searchParams.set(key, value);\n }\n const response = await slackApiFetch(\n url.toString(),\n { headers: { Authorization: `Bearer ${token}` } },\n timeoutMs,\n );\n const body = (await response.json()) as Record<string, any>;\n return body.ok ? body : null;\n } catch {\n return null;\n }\n}\n\nfunction slackIdentityCacheKey(incoming: IncomingMessage): string | null {\n const teamId = incoming.platformContext.teamId;\n const senderId = incoming.senderId;\n if (typeof senderId !== \"string\" || !senderId.trim()) return null;\n return `${typeof teamId === \"string\" && teamId ? teamId : \"unknown\"}:${senderId}`;\n}\n\nasync function resolveSlackUserIdentity(\n token: string,\n incoming: IncomingMessage,\n): Promise<SlackUserIdentity | null> {\n const cacheKey = slackIdentityCacheKey(incoming);\n if (!cacheKey) return null;\n const cached = slackIdentityCache.get(cacheKey);\n if (cached && cached.expiresAt > Date.now()) return cached.identity;\n if (cached) slackIdentityCache.delete(cacheKey);\n\n const user = await slackJson(\n token,\n \"users.info\",\n { user: incoming.senderId! },\n SLACK_IDENTITY_TIMEOUT_MS,\n );\n const profile = user?.user?.profile;\n const identity: SlackUserIdentity | null = user?.user\n ? {\n email:\n typeof profile?.email === \"string\" && profile.email.trim()\n ? profile.email.trim().toLowerCase()\n : null,\n name:\n typeof profile?.real_name === \"string\" && profile.real_name.trim()\n ? profile.real_name.trim()\n : typeof profile?.display_name === \"string\" &&\n profile.display_name.trim()\n ? profile.display_name.trim()\n : typeof user.user.real_name === \"string\" &&\n user.user.real_name.trim()\n ? user.user.real_name.trim()\n : typeof user.user.name === \"string\" && user.user.name.trim()\n ? user.user.name.trim()\n : null,\n // is_stranger marks Slack Connect DM participants from another\n // workspace; they must map to \"external\", never \"member\".\n memberType:\n user.user.is_stranger || user.user.is_ultra_restricted\n ? \"external\"\n : user.user.is_restricted\n ? \"guest\"\n : user.user.is_owner\n ? \"owner\"\n : user.user.is_admin\n ? \"admin\"\n : \"member\",\n }\n : null;\n if (slackIdentityCache.size >= SLACK_IDENTITY_CACHE_MAX_ENTRIES) {\n const oldestKey = slackIdentityCache.keys().next().value;\n if (oldestKey) slackIdentityCache.delete(oldestKey);\n }\n slackIdentityCache.set(cacheKey, {\n identity,\n expiresAt:\n Date.now() +\n (identity\n ? SLACK_IDENTITY_CACHE_TTL_MS\n : SLACK_IDENTITY_NEGATIVE_CACHE_TTL_MS),\n });\n return identity;\n}\n\nasync function hydrateSlackIdentity(\n token: string,\n incoming: IncomingMessage,\n): Promise<IncomingMessage> {\n const identity = await resolveSlackUserIdentity(token, incoming);\n if (!identity) {\n // Context hydration can call users.info again after the webhook identity\n // pass. A transient failure on that second lookup is not evidence that a\n // previously verified sender became unverified; preserve the stronger\n // identity instead of replacing it with a negative-cache result.\n if (\n incoming.senderVerified === true &&\n incoming.senderEmail?.trim() &&\n incoming.actorTrust?.verified === true\n ) {\n return incoming;\n }\n return {\n ...incoming,\n senderVerified: false,\n actorTrust: { memberType: \"unknown\", verified: false },\n };\n }\n return {\n ...incoming,\n ...(identity.name ? { senderName: identity.name } : {}),\n ...(identity.email\n ? { senderEmail: identity.email, senderVerified: true }\n : { senderVerified: false }),\n actorTrust: {\n memberType: identity.memberType,\n verified: true,\n },\n };\n}\n\nasync function hydrateSlackContext(\n token: string,\n incoming: IncomingMessage,\n): Promise<IncomingMessage> {\n const channelId = incoming.platformContext.channelId;\n const threadTs = incoming.platformContext.threadTs;\n const senderId = incoming.senderId;\n if (typeof channelId !== \"string\" || typeof threadTs !== \"string\") {\n return incoming;\n }\n\n const [thread, history, pins, conversation, identity] = await Promise.all([\n slackJson(token, \"conversations.replies\", {\n channel: channelId,\n ts: threadTs,\n limit: String(SLACK_CONTEXT_MESSAGE_LIMIT),\n }),\n slackJson(token, \"conversations.history\", {\n channel: channelId,\n latest: String(incoming.platformContext.messageTs ?? threadTs),\n inclusive: \"true\",\n limit: String(SLACK_CONTEXT_MESSAGE_LIMIT),\n }),\n slackJson(token, \"pins.list\", { channel: channelId }),\n slackJson(token, \"conversations.info\", { channel: channelId }),\n senderId ? resolveSlackUserIdentity(token, incoming) : null,\n ]);\n\n // Agent View can attach the Slack surface the user is currently viewing to\n // a DM. Treat it only as a context hint: Slack requires us to prove the bot\n // can access the referenced channel with conversations.info before reading\n // any history from it.\n const activeContextChannelId =\n typeof incoming.platformContext.activeContextChannelId === \"string\"\n ? incoming.platformContext.activeContextChannelId\n : null;\n const activeContextConversation =\n activeContextChannelId && activeContextChannelId !== channelId\n ? await slackJson(token, \"conversations.info\", {\n channel: activeContextChannelId,\n })\n : null;\n const activeContextHistory = activeContextConversation\n ? await slackJson(token, \"conversations.history\", {\n channel: activeContextChannelId!,\n limit: \"5\",\n })\n : null;\n const activeContextName =\n typeof activeContextConversation?.channel?.name === \"string\"\n ? activeContextConversation.channel.name\n : null;\n const activeContextMessages = Array.isArray(activeContextHistory?.messages)\n ? activeContextHistory.messages.map((message: Record<string, any>) => ({\n ...message,\n text: `[Active Slack context${activeContextName ? ` #${activeContextName}` : \"\"}] ${boundedSlackText(message.text)}`,\n }))\n : [];\n\n const rawMessages = [\n ...(Array.isArray(history?.messages) ? history.messages : []),\n ...(Array.isArray(pins?.items)\n ? pins.items\n .map((item: Record<string, any>) => item.message)\n .filter(Boolean)\n : []),\n ...(Array.isArray(thread?.messages) ? thread.messages : []),\n ...activeContextMessages,\n ];\n const uniqueMessages = [\n ...new Map(\n rawMessages.map((message: Record<string, any>, index) => [\n typeof message.ts === \"string\" ? message.ts : `unknown:${index}`,\n message,\n ]),\n ).values(),\n ].slice(-SLACK_CONTEXT_MESSAGE_LIMIT);\n\n const messages: IntegrationContextMessage[] = uniqueMessages.length\n ? uniqueMessages.map((message: Record<string, any>) => {\n const files = Array.isArray(message.files)\n ? message.files\n .map(slackFileReference)\n .filter(\n (\n file: IntegrationFileReference | null,\n ): file is IntegrationFileReference => file !== null,\n )\n : undefined;\n const reactions = Array.isArray(message.reactions)\n ? message.reactions\n .filter(\n (reaction: any) =>\n typeof reaction?.name === \"string\" &&\n typeof reaction?.count === \"number\",\n )\n .map((reaction: any) => ({\n name: reaction.name,\n count: reaction.count,\n }))\n : undefined;\n return {\n ...(typeof message.user === \"string\"\n ? { senderId: message.user }\n : {}),\n text: boundedSlackText(message.text),\n timestamp:\n typeof message.ts === \"string\"\n ? Math.floor(parseFloat(message.ts) * 1000)\n : incoming.timestamp,\n ...(reactions?.length ? { reactions } : {}),\n ...(files?.length ? { files } : {}),\n };\n })\n : [];\n\n const profile = identity;\n const isPrivate = conversation?.channel?.is_private === true;\n const isExternalShared = conversation?.channel?.is_ext_shared === true;\n const isMpim = conversation?.channel?.is_mpim === true;\n const isIm = conversation?.channel?.is_im === true;\n const conversationType = isIm\n ? \"dm\"\n : isMpim\n ? \"group_dm\"\n : isPrivate\n ? \"private_channel\"\n : \"channel\";\n\n const attachedFiles = messages.flatMap((message) => message.files ?? []);\n const detailedFiles = await Promise.all(\n [...new Set(attachedFiles.map((file) => file.id))]\n .slice(0, 5)\n .map(async (fileId) => {\n const result = await slackJson(token, \"files.info\", { file: fileId });\n return slackFileReference(result?.file);\n }),\n );\n const fileById = new Map(\n detailedFiles\n .filter((file): file is IntegrationFileReference => file !== null)\n .map((file) => [file.id, file]),\n );\n const hydratedMessages = messages.map((message) => ({\n ...message,\n ...(message.files?.length\n ? {\n files: message.files.map((file) => ({\n ...file,\n ...(fileById.get(file.id) ?? {}),\n })),\n }\n : {}),\n }));\n const hydratedFiles = hydratedMessages.flatMap(\n (message) => message.files ?? [],\n );\n return {\n ...incoming,\n ...(profile?.name ? { senderName: profile.name } : {}),\n ...(profile?.email\n ? { senderEmail: profile.email, senderVerified: true }\n : { senderVerified: false }),\n conversationType,\n // Conversation hydration must not promote a caller when users.info was\n // unavailable. Preserve the result of the earlier identity-only hydration\n // unless this request independently resolved the Slack user.\n actorTrust: identity\n ? { memberType: identity.memberType, verified: true }\n : (incoming.actorTrust ?? {\n memberType: \"unknown\",\n verified: false,\n }),\n contextMessages: hydratedMessages,\n ...(hydratedFiles.length ? { files: hydratedFiles.slice(0, 20) } : {}),\n platformContext: {\n ...incoming.platformContext,\n channelName:\n typeof conversation?.channel?.name === \"string\"\n ? conversation.channel.name\n : undefined,\n isExternalShared,\n ...(activeContextChannelId\n ? {\n activeContextChannelId,\n ...(activeContextName\n ? { activeContextChannelName: activeContextName }\n : {}),\n }\n : {}),\n },\n };\n}\n\nfunction shortTaskTitle(value: unknown): string {\n const text = typeof value === \"string\" ? value : \"Working\";\n return text.replace(/[-_]/g, \" \").slice(0, 200);\n}\n\nfunction delegatedTaskTitle(agent: unknown): string {\n return `Contact ${shortTaskTitle(agent)}`;\n}\n\nfunction formatElapsedSeconds(elapsedSeconds: number): string {\n const totalSeconds = Math.max(0, Math.round(elapsedSeconds));\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n return minutes > 0 ? `${minutes}m ${seconds}s` : `${seconds}s`;\n}\n\nfunction formatProgressState(state: string): string {\n if (state === \"submitted\") return \"Queued\";\n if (state === \"working\") return \"Working\";\n return shortTaskTitle(state);\n}\n\nfunction delegatedProgressDetails(\n agent: unknown,\n state: string,\n elapsedSeconds: number,\n detail?: string,\n): string {\n const elapsed = formatElapsedSeconds(elapsedSeconds);\n const progress = `${formatProgressState(state)} · ${elapsed}`;\n const update = detail ? shortTaskTitle(detail) : \"\";\n\n if (elapsedSeconds >= SLACK_CALM_PROGRESS_THRESHOLD_SECONDS) {\n const agentName = shortTaskTitle(agent);\n const context = update ? ` — ${update}.` : \".\";\n return `${progress}${context} This is taking longer than usual, but ${agentName} is still working. I’ll post the result here.`;\n }\n\n return update ? `${progress} — ${update}` : progress;\n}\n\nasync function postSlackJson(\n token: string,\n method: string,\n body: Record<string, unknown>,\n): Promise<Record<string, any>> {\n const response = await slackApiFetch(`https://slack.com/api/${method}`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n });\n const data = (await response.json()) as Record<string, any>;\n if (!data.ok) throw new Error(data.error || `${method} failed`);\n return data;\n}\n\nfunction streamFailureCode(error: unknown): string {\n const message = error instanceof Error ? error.message.trim() : \"\";\n return /^[a-z0-9_:-]{1,80}$/i.test(message) ? message : \"unknown\";\n}\n\nfunction streamChunkType(chunk: Record<string, unknown>): string {\n const type = chunk.type;\n return type === \"task_update\" ||\n type === \"plan_update\" ||\n type === \"markdown_text\" ||\n type === \"blocks\"\n ? type\n : \"unknown\";\n}\n\nasync function startSlackRunProgress(\n token: string,\n incoming: IncomingMessage,\n): Promise<PlatformRunProgress | null> {\n const channel = incoming.platformContext.channelId;\n const threadTs = incoming.platformContext.threadTs;\n if (typeof channel !== \"string\" || typeof threadTs !== \"string\") return null;\n\n let started: Record<string, any>;\n try {\n started = await postSlackJson(token, \"chat.startStream\", {\n channel,\n thread_ts: threadTs,\n ...(incoming.tenantId ? { recipient_team_id: incoming.tenantId } : {}),\n ...(incoming.senderId ? { recipient_user_id: incoming.senderId } : {}),\n task_display_mode: \"plan\",\n markdown_text: \"I’m looking into this for you.\",\n chunks: [\n {\n type: \"plan_update\",\n title: \"I’m looking into this for you\",\n },\n {\n type: \"task_update\",\n id: \"agent-native:context\",\n title: \"Review the request\",\n status: \"in_progress\",\n details: \"Finding the information needed for an answer\",\n },\n ],\n });\n } catch (error) {\n console.warn(\"[slack] chat.startStream failed; using standard reply\", {\n errorCode: streamFailureCode(error),\n isDirectMessage: incoming.conversationType === \"dm\",\n hasRecipientTeam: Boolean(incoming.tenantId),\n hasRecipientUser: Boolean(incoming.senderId),\n });\n return null;\n }\n\n const streamTs = started.ts;\n if (typeof streamTs !== \"string\") return null;\n return createSlackRunProgress(token, incoming, channel, threadTs, streamTs);\n}\n\nfunction isSlackStreamProgressRef(ref: PlatformRunProgressRef): boolean {\n return (\n ref.kind === \"slack-stream\" && /^\\d{1,20}\\.\\d{1,9}$/.test(ref.streamTs)\n );\n}\n\nasync function resumeSlackRunProgress(\n token: string,\n incoming: IncomingMessage,\n streamTs: string,\n): Promise<PlatformRunProgress | null> {\n const channel = incoming.platformContext.channelId;\n const threadTs = incoming.platformContext.threadTs;\n if (typeof channel !== \"string\" || typeof threadTs !== \"string\") return null;\n return createSlackRunProgress(token, incoming, channel, threadTs, streamTs);\n}\n\nfunction createSlackRunProgress(\n token: string,\n incoming: IncomingMessage,\n channel: string,\n threadTs: string,\n streamTs: string,\n): PlatformRunProgress {\n const tasks = new Map<string, { title: string; status: string }>();\n const toolTaskIds = new Map<string, string>();\n const agentTaskIds = new Map<string, string>();\n tasks.set(\"agent-native:context\", {\n title: \"Review the request\",\n status: \"in_progress\",\n });\n let sequence = 0;\n let lastWriteAt = 0;\n let pending: Record<string, unknown> | null = null;\n let pendingTimer: ReturnType<typeof setTimeout> | null = null;\n let approvalControls: { approve: string; deny: string } | null = null;\n let cancelControl: string | null = null;\n\n const append = async (chunk: Record<string, unknown>) => {\n const now = Date.now();\n const write = async (value: Record<string, unknown>) => {\n lastWriteAt = Date.now();\n try {\n await postSlackJson(token, \"chat.appendStream\", {\n channel,\n ts: streamTs,\n markdown_text: \"Progress updated.\",\n chunks: [value],\n });\n } catch (error) {\n console.warn(\n \"[slack] chat.appendStream failed; progress may be stale\",\n {\n chunkType: streamChunkType(value),\n errorCode: streamFailureCode(error),\n },\n );\n }\n };\n if (now - lastWriteAt >= 900) {\n await write(chunk);\n return;\n }\n pending = chunk;\n if (!pendingTimer) {\n pendingTimer = setTimeout(\n () => {\n const value = pending;\n pending = null;\n pendingTimer = null;\n if (value) void write(value);\n },\n 900 - (now - lastWriteAt),\n );\n }\n };\n\n const taskId = (prefix: string, explicit?: string) =>\n `${prefix}:${explicit || ++sequence}`.slice(0, 240);\n\n return {\n ref: { kind: \"slack-stream\", streamTs },\n async onEvent(event) {\n if (!cancelControl) {\n const context = getIntegrationRequestContext();\n const ownerEmail = getRequestContext()?.userEmail;\n if (\n context?.lineage?.runId &&\n ownerEmail &&\n incoming.senderId &&\n incoming.tenantId\n ) {\n cancelControl = await createIntegrationControl({\n action: \"cancel\",\n ownerEmail,\n orgId: getRequestContext()?.orgId ?? null,\n requesterId: incoming.senderId,\n teamId: incoming.tenantId,\n apiAppId:\n typeof incoming.platformContext.apiAppId === \"string\"\n ? incoming.platformContext.apiAppId\n : null,\n channelId: channel,\n messageTs: streamTs,\n runId: context.lineage.runId,\n incoming,\n });\n await append({\n type: \"blocks\",\n blocks: [\n {\n type: \"actions\",\n block_id: `agent-native-running-${Date.now()}`,\n elements: [\n {\n type: \"button\",\n text: { type: \"plain_text\", text: \"Cancel\" },\n style: \"danger\",\n action_id: \"agent_native_cancel\",\n value: cancelControl,\n },\n ],\n },\n ],\n });\n }\n }\n if (event.type === \"approval_required\") {\n const context = getIntegrationRequestContext();\n const ownerEmail = getRequestContext()?.userEmail;\n if (context && ownerEmail && incoming.senderId && incoming.tenantId) {\n const common = {\n ownerEmail,\n orgId: getRequestContext()?.orgId ?? null,\n requesterId: incoming.senderId,\n teamId: incoming.tenantId,\n apiAppId:\n typeof incoming.platformContext.apiAppId === \"string\"\n ? incoming.platformContext.apiAppId\n : null,\n channelId: channel,\n messageTs: streamTs,\n runId: context.lineage?.runId ?? null,\n approvalKey: event.approvalKey,\n incoming,\n };\n const [approve, deny] = await Promise.all([\n createIntegrationControl({ ...common, action: \"approve\" }),\n createIntegrationControl({ ...common, action: \"deny\" }),\n ]);\n approvalControls = { approve, deny };\n }\n await append({\n type: \"task_update\",\n id: \"agent-native:approval\",\n title: `Approve ${shortTaskTitle(event.tool)}`,\n status: \"pending\",\n details: \"Waiting for the requester\",\n });\n } else if (event.type === \"tool_start\") {\n const key = event.id || event.tool;\n const id = taskId(\"tool\", event.id);\n toolTaskIds.set(key, id);\n const title = shortTaskTitle(event.tool);\n tasks.set(id, { title, status: \"in_progress\" });\n await append({\n type: \"task_update\",\n id,\n title,\n status: \"in_progress\",\n });\n } else if (event.type === \"tool_done\") {\n const key = event.id || event.tool;\n const id = toolTaskIds.get(key) ?? taskId(\"tool\", event.id);\n const title = tasks.get(id)?.title ?? shortTaskTitle(event.tool);\n tasks.set(id, {\n title,\n status: event.isError ? \"error\" : \"complete\",\n });\n await append({\n type: \"task_update\",\n id,\n title,\n status: event.isError ? \"error\" : \"complete\",\n });\n } else if (event.type === \"agent_call\") {\n const id =\n agentTaskIds.get(event.agent) ?? taskId(\"agent\", event.agent);\n agentTaskIds.set(event.agent, id);\n const status =\n event.status === \"start\"\n ? \"in_progress\"\n : event.status === \"done\"\n ? \"complete\"\n : \"error\";\n const title = delegatedTaskTitle(event.agent);\n tasks.set(id, { title, status });\n await append({\n type: \"task_update\",\n id,\n title,\n status,\n ...(event.status === \"start\"\n ? {\n details: `I’m contacting ${shortTaskTitle(event.agent)} for an answer.`,\n }\n : {}),\n });\n } else if (event.type === \"agent_call_progress\") {\n // A2A calls can stay healthy for minutes. Keep the same native Slack\n // task card alive with each real downstream poll rather than creating\n // a new card per tick or leaving the user with a stale spinner.\n const id =\n agentTaskIds.get(event.agent) ?? taskId(\"agent\", event.agent);\n agentTaskIds.set(event.agent, id);\n const title = delegatedTaskTitle(event.agent);\n const details = delegatedProgressDetails(\n event.agent,\n event.state,\n event.elapsedSeconds,\n event.detail,\n );\n tasks.set(id, { title, status: \"in_progress\" });\n await append({\n type: \"task_update\",\n id,\n title,\n status: \"in_progress\",\n details,\n });\n } else if (event.type === \"activity\") {\n await append({\n type: \"task_update\",\n id: \"agent-native:context\",\n title: \"Review the request\",\n status: \"in_progress\",\n details: `Working · ${shortTaskTitle(event.label)}`,\n });\n }\n },\n async complete(message) {\n if (pendingTimer) clearTimeout(pendingTimer);\n const finalChunks = [...tasks.entries()].map(([id, task]) => ({\n type: \"task_update\",\n id,\n title: task.title,\n status: task.status === \"in_progress\" ? \"complete\" : task.status,\n }));\n const messageBlocks = Array.isArray(message.platformContext.blocks)\n ? message.platformContext.blocks\n : [];\n const controlBlocks = approvalControls\n ? [\n {\n type: \"actions\",\n block_id: `agent-native-approval-${Date.now()}`,\n elements: [\n {\n type: \"button\",\n text: { type: \"plain_text\", text: \"Approve\" },\n style: \"primary\",\n action_id: \"agent_native_approve\",\n value: approvalControls.approve,\n },\n {\n type: \"button\",\n text: { type: \"plain_text\", text: \"Deny\" },\n style: \"danger\",\n action_id: \"agent_native_deny\",\n value: approvalControls.deny,\n },\n ],\n },\n ]\n : [];\n await postSlackJson(token, \"chat.stopStream\", {\n channel,\n ts: streamTs,\n markdown_text: message.text || \"Done.\",\n ...(finalChunks.length ? { chunks: finalChunks } : {}),\n ...(messageBlocks.length || controlBlocks.length\n ? { blocks: [...messageBlocks, ...controlBlocks].slice(0, 50) }\n : {}),\n });\n setSlackAssistantStatus(token, channel, threadTs, \"\");\n return { status: \"delivered\", messageRefs: [streamTs] };\n },\n async fail(message) {\n if (pendingTimer) clearTimeout(pendingTimer);\n await postSlackJson(token, \"chat.stopStream\", {\n channel,\n ts: streamTs,\n markdown_text: message.slice(0, SLACK_MAX_LENGTH),\n }).catch(() => {});\n setSlackAssistantStatus(token, channel, threadTs, \"\");\n },\n };\n}\n"]}
1
+ {"version":3,"file":"slack.js","sourceRoot":"","sources":["../../../src/integrations/adapters/slack.ts"],"names":[],"mappings":"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","sourcesContent":["import type { H3Event } from \"h3\";\nimport { createError, getHeader, readRawBody } from \"h3\";\n\nimport type { EnvKeyConfig } from \"../../server/create-server.js\";\nimport { resolveSecret } from \"../../server/credential-provider.js\";\nimport { getRequestContext } from \"../../server/request-context.js\";\nimport { getIntegrationRequestContext } from \"../../server/request-context.js\";\nimport { consumeIntegrationAwaitingInput } from \"../awaiting-input-store.js\";\nimport { createIntegrationControl } from \"../controls-store.js\";\nimport {\n getActiveIntegrationInstallationByKey,\n getActiveIntegrationInstallationForTenant,\n listIntegrationInstallations,\n resolveIntegrationTokenBundle,\n} from \"../installations-store.js\";\nimport { hasActivePendingTask } from \"../pending-tasks-store.js\";\nimport { slackInstallationKey } from \"../slack-oauth.js\";\nimport type {\n PlatformAdapter,\n IncomingMessage,\n OutgoingMessage,\n IntegrationStatus,\n OutboundTarget,\n PlatformRunProgress,\n PlatformRunProgressRef,\n PlatformDeliveryReceipt,\n IntegrationContextMessage,\n IntegrationFileReference,\n} from \"../types.js\";\n\n/** Slack's max message length */\nconst SLACK_MAX_LENGTH = 4000;\nconst SLACK_SECTION_TEXT_MAX_LENGTH = 3000;\nconst SLACK_API_TIMEOUT_MS = 10_000;\n// Permalink lookup happens on Slack's acknowledgement path, so keep it well\n// inside Slack's three-second Events API deadline. Failure is non-fatal: the\n// normalized message still carries channel/thread ids for replies.\nconst SLACK_PERMALINK_TIMEOUT_MS = 1_000;\nconst SLACK_CONTEXT_MESSAGE_LIMIT = 15;\nconst SLACK_CONTEXT_TEXT_LIMIT = 2_000;\nconst SLACK_CALM_PROGRESS_THRESHOLD_SECONDS = 30;\nconst SLACK_IDENTITY_TIMEOUT_MS = 1_000;\nconst SLACK_IDENTITY_CACHE_TTL_MS = 10 * 60 * 1_000;\n// Failed users.info lookups only get a short negative TTL: a transient Slack\n// API blip must not fail-close a sender's identity (and DMs) for 10 minutes.\nconst SLACK_IDENTITY_NEGATIVE_CACHE_TTL_MS = 30 * 1_000;\nconst SLACK_IDENTITY_CACHE_MAX_ENTRIES = 1_000;\nconst SLACK_TOKEN_IDENTITY_CACHE_TTL_MS = 10 * 60 * 1_000;\nconst SLACK_TOKEN_IDENTITY_NEGATIVE_CACHE_TTL_MS = 30 * 1_000;\n\ntype SlackTokenIdentity = {\n teamId: string | null;\n appId: string | null;\n valid: boolean;\n expiresAt: number;\n};\n\nconst slackTokenIdentityCache = new Map<string, SlackTokenIdentity>();\n\ninterface SlackUserIdentity {\n email: string | null;\n name: string | null;\n memberType: \"owner\" | \"admin\" | \"member\" | \"guest\" | \"external\" | \"unknown\";\n}\n\nconst slackIdentityCache = new Map<\n string,\n { identity: SlackUserIdentity | null; expiresAt: number }\n>();\n\n// Deduped system notices send at most once per key per TTL so senders are\n// informed without being spammed per message. Callers pick the window: the\n// anonymous-tier heads-up uses the default day-long TTL; decline replies pass\n// a short TTL so a persistent condition still reminds the sender occasionally.\nconst SLACK_SYSTEM_NOTICE_DEDUPE_TTL_MS = 24 * 60 * 60 * 1_000;\nconst SLACK_SYSTEM_NOTICE_CACHE_MAX_ENTRIES = 1_000;\nconst slackSystemNoticeCache = new Map<string, number>();\n\n/** Returns true when a deduped notice should send now, claiming the slot. */\nfunction claimSlackSystemNoticeSlot(\n key: string,\n ttlMs = SLACK_SYSTEM_NOTICE_DEDUPE_TTL_MS,\n): boolean {\n const now = Date.now();\n const expiresAt = slackSystemNoticeCache.get(key);\n if (expiresAt && expiresAt > now) return false;\n if (expiresAt) slackSystemNoticeCache.delete(key);\n if (slackSystemNoticeCache.size >= SLACK_SYSTEM_NOTICE_CACHE_MAX_ENTRIES) {\n const oldestKey = slackSystemNoticeCache.keys().next().value;\n if (oldestKey) slackSystemNoticeCache.delete(oldestKey);\n }\n slackSystemNoticeCache.set(key, now + ttlMs);\n return true;\n}\n\nexport interface SlackAdapterOptions {\n /** Resolve the bot token for the exact Slack installation. */\n resolveBotToken?: (incoming: IncomingMessage) => Promise<string | undefined>;\n /** Override active-thread detection for hosted adapters/tests. */\n isThreadActive?: (incoming: IncomingMessage) => Promise<boolean>;\n /** Override one-shot clarification-window consumption for tests. */\n consumeAwaitingInput?: (incoming: IncomingMessage) => Promise<boolean>;\n}\n\n/**\n * Create a Slack platform adapter.\n *\n * Required env vars:\n * - SLACK_BOT_TOKEN — Bot user OAuth token (xoxb-...)\n * - SLACK_SIGNING_SECRET — Used to verify webhook signatures\n *\n * Optional env vars:\n * - SLACK_ALLOWED_TEAM_IDS — Comma-separated list of Slack workspace\n * `team_id` values (e.g. \"T012ABCDEF,T034GHIJKL\") that this deployment\n * accepts events from. Required in production and strongly recommended\n * to prevent cross-workspace event injection (H1 in the webhook audit):\n * the global `SLACK_SIGNING_SECRET` is the same key for every workspace\n * the app is installed to, so without an allowlist any installed\n * workspace can drive the agent. When unset the adapter accepts events\n * from any workspace in development, but rejects events in production.\n * - SLACK_ALLOWED_API_APP_IDS — Comma-separated list of Slack app IDs\n * (`api_app_id`) to additionally pin events to. Useful when the same\n * signing secret rotation surfaces multiple app installs.\n */\nexport function slackAdapter(\n options: SlackAdapterOptions = {},\n): PlatformAdapter {\n const resolveBotToken = async (incoming: IncomingMessage) =>\n (await options.resolveBotToken?.(incoming)) ??\n (await resolveSlackBotTokenForIncoming(incoming)) ??\n undefined;\n\n return {\n platform: \"slack\",\n label: \"Slack\",\n capabilities: {\n replyText: true,\n proactiveMessages: true,\n nativeThreads: true,\n contextualReplies: true,\n deferredWebhookResponse: false,\n interactionOnly: false,\n nativeContextHydration: true,\n liveRunProgress: true,\n },\n\n getRequiredEnvKeys(): EnvKeyConfig[] {\n return [\n {\n key: \"SLACK_BOT_TOKEN\",\n label: \"Slack Bot Token\",\n required: false,\n helpText:\n \"In your Slack app's left nav: OAuth & Permissions → Bot User OAuth Token (starts with `xoxb-`).\",\n },\n {\n key: \"SLACK_CLIENT_ID\",\n label: \"Slack OAuth Client ID\",\n required: false,\n helpText:\n \"Slack app Basic Information → App Credentials → Client ID.\",\n },\n {\n key: \"SLACK_CLIENT_SECRET\",\n label: \"Slack OAuth Client Secret\",\n required: false,\n helpText:\n \"Slack app Basic Information → App Credentials → Client Secret.\",\n },\n {\n key: \"SLACK_SIGNING_SECRET\",\n label: \"Slack Signing Secret\",\n required: true,\n helpText:\n \"In your Slack app's left nav: Basic Information → App Credentials → Signing Secret.\",\n },\n ];\n },\n\n async handleVerification(\n event: H3Event,\n ): Promise<{ handled: boolean; response?: unknown }> {\n // Slack sends url_verification when first setting up the webhook.\n // readRawBodyCached caches the raw bytes on event.context.__rawBody so\n // subsequent verifyWebhook + parseIncomingMessage calls re-use them\n // without re-stringifying a parsed body (M2 in the audit).\n const body = await readRawBodyCached(event);\n try {\n const parsed = JSON.parse(body);\n if (parsed.type === \"url_verification\") {\n // Slack's URL verifier expects the raw challenge value in the\n // response body. Returning JSON works for some clients but the app\n // settings verifier rejects it as not matching the challenge.\n return { handled: true, response: parsed.challenge };\n }\n } catch {}\n return { handled: false };\n },\n\n async verifyWebhook(event: H3Event): Promise<boolean> {\n const signingSecret = await resolveSecret(\"SLACK_SIGNING_SECRET\");\n if (!signingSecret) return false;\n\n const signature = getHeader(event, \"x-slack-signature\");\n const timestamp = getHeader(event, \"x-slack-request-timestamp\");\n if (!signature || !timestamp) return false;\n\n // Reject requests older than 5 minutes (replay protection)\n const ts = parseInt(timestamp, 10);\n if (Math.abs(Date.now() / 1000 - ts) > 300) return false;\n\n const body = await readRawBodyCached(event);\n const crypto = await import(\"node:crypto\");\n const basestring = `v0:${timestamp}:${body}`;\n const expectedSignature =\n \"v0=\" +\n crypto\n .createHmac(\"sha256\", signingSecret)\n .update(basestring)\n .digest(\"hex\");\n\n // Timing-safe comparison\n try {\n return crypto.timingSafeEqual(\n Buffer.from(signature),\n Buffer.from(expectedSignature),\n );\n } catch {\n return false;\n }\n },\n\n async parseIncomingMessage(\n event: H3Event,\n ): Promise<IncomingMessage | null> {\n const raw = await readRawBodyCached(event);\n let payload: any;\n try {\n payload = JSON.parse(raw);\n } catch {\n return null;\n }\n\n // H1 (webhook audit): cross-workspace event injection. The global\n // SLACK_SIGNING_SECRET is the same key for every workspace this Slack\n // app is installed to — without a per-tenant allowlist any installed\n // workspace can drive the agent. We enforce SLACK_ALLOWED_TEAM_IDS\n // here AFTER the signature has already been verified by the webhook\n // handler, so this is purely a tenant-isolation gate (not a forgery\n // defense). When unset in production we surface a one-time warning\n // recommending it be configured.\n await enforceWorkspaceAllowlist(payload);\n\n // Handle Events API wrapper\n if (payload.type === \"event_callback\") {\n const e = payload.event;\n if (!e) return null;\n\n // Ignore bot messages\n if (e.bot_id || e.subtype === \"bot_message\") return null;\n // Ignore message edits and deletes\n if (e.subtype === \"message_changed\" || e.subtype === \"message_deleted\")\n return null;\n\n // Handle DMs and explicit mentions. Ordinary channel replies are only\n // accepted while this exact workspace-qualified thread has queued or\n // executing work; broad message subscriptions must never invoke the\n // agent for general channel chatter.\n const text = e.text?.trim();\n if (!text) return null;\n\n const teamId =\n typeof payload.team_id === \"string\" ? payload.team_id : \"unknown\";\n const apiAppId =\n typeof payload.api_app_id === \"string\"\n ? payload.api_app_id\n : \"unknown\";\n const agentContext = normalizeSlackAgentContext(e.app_context, teamId);\n const isDm =\n typeof e.channel_type === \"string\"\n ? e.channel_type === \"im\"\n : typeof e.channel === \"string\" && e.channel.startsWith(\"D\");\n const isMention = e.type === \"app_mention\";\n const isThreadReply = !isDm && !isMention && !!e.thread_ts;\n if (!isDm && !isMention && !isThreadReply) return null;\n\n // Remove bot mention from text (e.g., \"<@U123> do something\" → \"do something\")\n const cleanText = text.replace(/<@[A-Z0-9]+>/g, \"\").trim();\n if (!cleanText) return null;\n\n // Thread ID: use thread_ts if in a thread, otherwise message ts\n const threadTs = e.thread_ts || e.ts;\n const externalThreadId = `${apiAppId}:${teamId}:${e.channel}:${threadTs}`;\n const partialIncoming: IncomingMessage = {\n platform: \"slack\",\n externalThreadId,\n text: cleanText,\n senderName: e.user,\n senderId: e.user,\n triggerKind: isDm ? \"dm\" : isMention ? \"mention\" : \"thread_reply\",\n conversationType: isDm ? \"dm\" : \"unknown\",\n tenantId: teamId,\n // The signed Slack envelope authenticates the workspace, not the\n // sender's membership tier. `users.info` hydration below is the\n // authority that may promote this to a verified member.\n actorTrust: { memberType: \"unknown\", verified: false },\n platformContext: {\n channelId: e.channel,\n channelType: e.channel_type,\n threadTs,\n messageTs: e.ts,\n teamId,\n apiAppId,\n enterpriseId:\n typeof payload.enterprise_id === \"string\"\n ? payload.enterprise_id\n : undefined,\n eventId: payload.event_id,\n ...(agentContext\n ? {\n agentContext: agentContext.entities,\n activeContextChannelId: agentContext.channelId,\n }\n : {}),\n },\n threadRef: threadTs,\n replyRef: e.ts,\n timestamp: Math.floor(parseFloat(e.ts) * 1000),\n };\n\n if (isThreadReply) {\n // An ordinary thread reply is narrowly admitted when either work is\n // still queued or the same Slack user is answering a fresh\n // integration-originated clarification. Consuming the latter is a\n // conditional SQL delete, so concurrent replies cannot both reopen\n // the agent and unrelated channel messages remain ignored.\n const answeredClarification = options.consumeAwaitingInput\n ? await options.consumeAwaitingInput(partialIncoming)\n : options.isThreadActive\n ? false\n : await consumeIntegrationAwaitingInput({\n platform: \"slack\",\n externalThreadId,\n requesterId: e.user,\n });\n const active = options.isThreadActive\n ? await options.isThreadActive(partialIncoming)\n : await hasActivePendingTask(\"slack\", externalThreadId);\n if (!active && !answeredClarification) return null;\n }\n\n const token = await resolveBotToken(partialIncoming);\n const threadPermalink = await resolveSlackThreadPermalink(\n e.channel,\n threadTs,\n token,\n );\n\n return {\n ...partialIncoming,\n platformContext: {\n ...partialIncoming.platformContext,\n ...(threadPermalink ? { threadPermalink } : {}),\n },\n ...(threadPermalink ? { sourceUrl: threadPermalink } : {}),\n };\n }\n\n return null;\n },\n\n getLegacyExternalThreadIds(incoming: IncomingMessage): string[] {\n const channelId = incoming.platformContext.channelId;\n const threadTs = incoming.platformContext.threadTs;\n return typeof channelId === \"string\" && typeof threadTs === \"string\"\n ? [`${channelId}:${threadTs}`]\n : [];\n },\n\n async postProcessingPlaceholder(\n incoming: IncomingMessage,\n ): Promise<{ placeholderRef: string } | null> {\n // No placeholder reply in the thread — Slack's native assistant status\n // bar and the task stream are the loading affordance. Keep the status\n // specific about intent instead of presenting the generic thinking\n // state while the native plan is opening.\n const token = await resolveBotToken(incoming);\n if (!token) return null;\n\n const channelId = incoming.platformContext.channelId as string;\n const threadTs = incoming.platformContext.threadTs as string;\n if (!channelId || !threadTs) return null;\n\n // Best-effort: flip the native Agent status bar in the\n // channel input area. Slack accepts chat:write for this method. The\n // canonical manifest separately requests assistant:write for Agent View\n // and app_context_changed events.\n setSlackAssistantStatus(\n token,\n channelId,\n threadTs,\n \"I’m looking into this now…\",\n );\n return null;\n },\n\n async hydrateIncomingMessage(\n incoming: IncomingMessage,\n ): Promise<IncomingMessage> {\n const token = await resolveBotToken(incoming);\n if (!token) return incoming;\n return hydrateSlackContext(token, incoming);\n },\n\n async hydrateIncomingIdentity(\n incoming: IncomingMessage,\n ): Promise<IncomingMessage> {\n const token = await resolveBotToken(incoming);\n if (!token) return incoming;\n return hydrateSlackIdentity(token, incoming);\n },\n\n async startRunProgress(\n incoming: IncomingMessage,\n ): Promise<PlatformRunProgress | null> {\n const token = await resolveBotToken(incoming);\n if (!token) return null;\n return startSlackRunProgress(token, incoming);\n },\n\n async resumeRunProgress(\n incoming: IncomingMessage,\n ref: PlatformRunProgressRef,\n ): Promise<PlatformRunProgress | null> {\n if (!isSlackStreamProgressRef(ref)) return null;\n const token = await resolveBotToken(incoming);\n if (!token) return null;\n return resumeSlackRunProgress(token, incoming, ref.streamTs);\n },\n\n async sendResponse(\n message: OutgoingMessage,\n context: IncomingMessage,\n opts?: { placeholderRef?: string },\n ): Promise<void | PlatformDeliveryReceipt> {\n const token = await resolveBotToken(context);\n if (!token) {\n throw new Error(\n \"[slack] Cannot deliver response: no Slack bot token is configured\",\n );\n }\n\n const channelId = context.platformContext.channelId as string;\n const threadTs = context.platformContext.threadTs as string;\n const blocks = (message.platformContext as any)?.blocks as\n | unknown[]\n | undefined;\n const placeholderRef = opts?.placeholderRef;\n\n // Block-rich path: split text into chunks but render the FIRST chunk as\n // blocks (so we keep the in-place edit + button) and any overflow as\n // plain follow-up posts. The vast majority of replies fit in one block.\n const chunks = splitNonEmptyMessage(message.text, SLACK_MAX_LENGTH);\n const hasProvidedBlocks = Array.isArray(blocks) && blocks.length > 0;\n const firstChunk = chunks[0] ?? (hasProvidedBlocks ? \"Response\" : \"\");\n if (!firstChunk) {\n if (threadTs) {\n setSlackAssistantStatus(token, channelId, threadTs, \"\");\n }\n return;\n }\n const restChunks = chunks.slice(1);\n const messageRefs: string[] = [];\n\n const finalBlocks =\n blocks ??\n buildResponseBlocks(firstChunk, {\n threadDeepLinkUrl: (message.platformContext as any)\n ?.threadDeepLinkUrl,\n });\n\n const baseBody: Record<string, unknown> = {\n channel: channelId,\n text: firstChunk,\n blocks: finalBlocks,\n unfurl_links: false,\n unfurl_media: false,\n mrkdwn: true,\n };\n\n try {\n if (placeholderRef) {\n // Replace the \"thinking…\" placeholder in place.\n const res = await slackApiFetch(\"https://slack.com/api/chat.update\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ ...baseBody, ts: placeholderRef }),\n });\n const data = (await res.json()) as {\n ok: boolean;\n error?: string;\n ts?: string;\n };\n if (!data.ok) {\n console.error(\"[slack] chat.update error:\", data.error);\n // Fall back to a fresh post so the user still sees a reply\n const postedTs = await postFresh(\n token,\n channelId,\n threadTs,\n baseBody,\n );\n if (postedTs) messageRefs.push(postedTs);\n } else {\n messageRefs.push(data.ts || placeholderRef);\n }\n } else {\n const postedTs = await postFresh(\n token,\n channelId,\n threadTs,\n baseBody,\n );\n if (postedTs) messageRefs.push(postedTs);\n }\n\n // Clear the AI-assistant \"is thinking…\" status now that we've\n // delivered the final answer. Empty status clears it.\n if (threadTs) {\n setSlackAssistantStatus(token, channelId, threadTs, \"\");\n }\n\n // Overflow chunks (rare) — post as plain follow-ups in the same thread\n for (const chunk of restChunks) {\n const postedTs = await postFresh(token, channelId, threadTs, {\n channel: channelId,\n text: chunk,\n unfurl_links: false,\n unfurl_media: false,\n mrkdwn: true,\n });\n if (postedTs) messageRefs.push(postedTs);\n }\n return {\n status: \"delivered\",\n ...(messageRefs.length > 0 ? { messageRefs } : {}),\n };\n } catch (err) {\n console.error(\"[slack] Failed to send message:\", err);\n throw err;\n }\n },\n\n async sendSystemNotice(\n incoming: IncomingMessage,\n text: string,\n opts?: { dedupeKey?: string; dedupeTtlMs?: number },\n ): Promise<void> {\n if (!text.trim()) return;\n const dedupeKey = opts?.dedupeKey;\n if (\n dedupeKey &&\n !claimSlackSystemNoticeSlot(dedupeKey, opts?.dedupeTtlMs)\n ) {\n return;\n }\n try {\n const token = await resolveBotToken(incoming);\n if (!token) {\n if (dedupeKey) slackSystemNoticeCache.delete(dedupeKey);\n throw new Error(\"Slack bot token not configured for system notice\");\n }\n const channelId = incoming.platformContext.channelId;\n if (typeof channelId !== \"string\" || !channelId) {\n if (dedupeKey) slackSystemNoticeCache.delete(dedupeKey);\n throw new Error(\"Slack channel id missing for system notice\");\n }\n const threadTs =\n typeof incoming.platformContext.threadTs === \"string\"\n ? incoming.platformContext.threadTs\n : undefined;\n await postFresh(token, channelId, threadTs, {\n text,\n unfurl_links: false,\n unfurl_media: false,\n mrkdwn: true,\n });\n } catch (error) {\n // A failed delivery did not inform the sender, so release the slot and\n // allow the next message to retry instead of suppressing notices for a day.\n if (dedupeKey) slackSystemNoticeCache.delete(dedupeKey);\n throw error;\n }\n },\n\n async sendMessageToTarget(\n message: OutgoingMessage,\n target: OutboundTarget,\n ): Promise<void> {\n const targetContext: IncomingMessage = {\n platform: \"slack\",\n externalThreadId: `${target.tenantId ?? \"unknown\"}:${target.destination}:${target.threadRef ?? \"root\"}`,\n text: \"\",\n platformContext: {\n channelId: target.destination,\n threadTs: target.threadRef,\n teamId: target.tenantId,\n },\n tenantId: target.tenantId,\n timestamp: Date.now(),\n };\n const token = await resolveBotToken(targetContext);\n if (!token) {\n console.error(\"[slack] SLACK_BOT_TOKEN not configured\");\n return;\n }\n\n const chunks = splitNonEmptyMessage(message.text, SLACK_MAX_LENGTH);\n if (chunks.length === 0) return;\n for (const chunk of chunks) {\n const body: Record<string, unknown> = {\n channel: target.destination,\n text: chunk,\n };\n if (target.threadRef) body.thread_ts = target.threadRef;\n\n try {\n const res = await slackApiFetch(\n \"https://slack.com/api/chat.postMessage\",\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n },\n );\n const data = (await res.json()) as { ok: boolean; error?: string };\n if (!data.ok) {\n throw new Error(data.error || \"chat.postMessage failed\");\n }\n } catch (err) {\n console.error(\"[slack] Failed to send proactive message:\", err);\n throw err;\n }\n }\n },\n\n formatAgentResponse(\n text: string,\n opts?: { threadDeepLinkUrl?: string },\n ): OutgoingMessage {\n return {\n text: markdownToSlackMrkdwn(text),\n platformContext: opts?.threadDeepLinkUrl\n ? { threadDeepLinkUrl: opts.threadDeepLinkUrl }\n : {},\n };\n },\n\n async getStatus(_baseUrl?: string): Promise<IntegrationStatus> {\n const hasToken = !!(await resolveSecret(\"SLACK_BOT_TOKEN\"));\n const hasSecret = !!(await resolveSecret(\"SLACK_SIGNING_SECRET\"));\n const ctx = getRequestContext();\n const managedInstallations = ctx?.userEmail\n ? await listIntegrationInstallations(\n {\n userEmail: ctx.userEmail,\n orgId: ctx.orgId ?? null,\n },\n \"slack\",\n ).catch(() => [])\n : [];\n const connectedInstallations = managedInstallations.filter(\n (installation) => installation.status === \"connected\",\n );\n const configured =\n hasSecret && (hasToken || connectedInstallations.length > 0);\n\n return {\n platform: \"slack\",\n label: \"Slack\",\n enabled: false, // overridden by plugin\n configured,\n details: {\n hasToken,\n hasSecret,\n managedInstallationCount: connectedInstallations.length,\n managedInstallations: connectedInstallations.map((installation) => ({\n id: installation.id,\n teamId: installation.teamId,\n teamName: installation.teamName,\n enterpriseId: installation.enterpriseId,\n health: installation.health,\n scopes: installation.scopes,\n })),\n },\n error: !configured\n ? \"Connect a Slack workspace with OAuth or save a bot token and signing secret\"\n : undefined,\n };\n },\n };\n}\n\n/**\n * Parse a comma-separated env var into a Set of trimmed, non-empty values.\n * Returns null when the env var is unset or empty (so callers can\n * distinguish \"no allowlist configured\" from \"empty allowlist\").\n */\nfunction parseAllowlistEnv(name: string): Set<string> | null {\n const raw = process.env[name];\n if (!raw) return null;\n const values = raw\n .split(\",\")\n .map((v) => v.trim())\n .filter((v) => v.length > 0);\n if (values.length === 0) return null;\n return new Set(values);\n}\n\nexport async function resolveSlackBotTokenForIncoming(\n incoming: IncomingMessage,\n): Promise<string | undefined> {\n const managedToken = await resolveManagedSlackBotToken(incoming);\n if (managedToken) return managedToken;\n\n const legacyToken = await resolveSecret(\"SLACK_BOT_TOKEN\");\n if (!legacyToken) return undefined;\n return (await isSlackTokenForIncoming(legacyToken, incoming))\n ? legacyToken\n : undefined;\n}\n\nasync function resolveManagedSlackBotToken(\n incoming: IncomingMessage,\n): Promise<string | undefined> {\n const teamId =\n typeof incoming.platformContext.teamId === \"string\"\n ? incoming.platformContext.teamId\n : incoming.tenantId;\n const apiAppId =\n typeof incoming.platformContext.apiAppId === \"string\"\n ? incoming.platformContext.apiAppId\n : undefined;\n const enterpriseId =\n typeof incoming.platformContext.enterpriseId === \"string\"\n ? incoming.platformContext.enterpriseId\n : undefined;\n if (!teamId && !enterpriseId) return undefined;\n try {\n let installation = apiAppId\n ? await getActiveIntegrationInstallationByKey(\n \"slack\",\n slackInstallationKey({ teamId, enterpriseId, apiAppId }),\n )\n : null;\n if (!installation && !apiAppId && teamId) {\n installation = await getActiveIntegrationInstallationForTenant(\n \"slack\",\n teamId,\n );\n }\n if (!installation && !apiAppId && enterpriseId) {\n installation = await getActiveIntegrationInstallationForTenant(\n \"slack\",\n enterpriseId,\n );\n }\n const key =\n installation?.installationKey ??\n slackInstallationKey({ teamId, enterpriseId, apiAppId });\n return (await resolveIntegrationTokenBundle(\"slack\", key))?.accessToken;\n } catch {\n return undefined;\n }\n}\n\nasync function isSlackTokenForIncoming(\n token: string,\n incoming: IncomingMessage,\n): Promise<boolean> {\n const teamId = slackIdentityValue(incoming.platformContext.teamId);\n const apiAppId = slackIdentityValue(incoming.platformContext.apiAppId);\n if (!teamId && !apiAppId) return true;\n\n const cached = slackTokenIdentityCache.get(token);\n if (cached && cached.expiresAt > Date.now()) {\n return (\n cached.valid &&\n (!teamId || cached.teamId === teamId) &&\n (!apiAppId || cached.appId === apiAppId)\n );\n }\n\n const auth = await slackJson(token, \"auth.test\", {});\n const authTeamId = slackIdentityValue(auth?.team_id);\n const botId = slackIdentityValue(auth?.bot_id);\n let appId: string | null = null;\n let valid = !!auth;\n\n if (valid && apiAppId) {\n const bot = botId\n ? await slackJson(token, \"bots.info\", { bot: botId })\n : null;\n appId = slackIdentityValue(bot?.bot?.app_id);\n valid = !!appId;\n }\n\n const identity: SlackTokenIdentity = {\n teamId: authTeamId,\n appId,\n valid,\n expiresAt:\n Date.now() +\n (valid\n ? SLACK_TOKEN_IDENTITY_CACHE_TTL_MS\n : SLACK_TOKEN_IDENTITY_NEGATIVE_CACHE_TTL_MS),\n };\n slackTokenIdentityCache.set(token, identity);\n\n return (\n valid &&\n (!teamId || identity.teamId === teamId) &&\n (!apiAppId || identity.appId === apiAppId)\n );\n}\n\nfunction slackIdentityValue(value: unknown): string | null {\n if (typeof value !== \"string\") return null;\n const normalized = value.trim();\n return normalized && normalized !== \"unknown\" ? normalized : null;\n}\n\nlet _missingAllowlistWarned = false;\n\n/**\n * Enforce that an incoming Slack event comes from an allowlisted workspace.\n *\n * H1 in the webhook audit: the framework uses a SINGLE global\n * SLACK_SIGNING_SECRET for every workspace the Slack app is installed to,\n * so a valid signature alone doesn't prove the request belongs to the\n * tenant the deployment intends to serve. This helper layers a per-tenant\n * allowlist on top of signature verification.\n *\n * Behavior:\n * - If `SLACK_ALLOWED_TEAM_IDS` is set: reject any payload whose\n * `team_id` isn't in the list.\n * - If `SLACK_ALLOWED_API_APP_IDS` is set: also reject payloads whose\n * `api_app_id` isn't in the list (bot apps can be installed under the\n * same Slack app id across multiple workspaces — pinning both keeps\n * the surface tight when team_id allows multiple workspaces).\n * - If `SLACK_ALLOWED_TEAM_IDS` is unset/empty in production: reject the\n * event. Production must fail closed so any workspace with the shared\n * signing secret cannot drive the agent.\n * - If `SLACK_ALLOWED_TEAM_IDS` is unset/empty in dev / single-tenant: log a\n * one-time warning and accept (current local setup behavior).\n *\n * Throws an h3 401 error when an allowlisted-but-mismatched payload is\n * received, which the integrations plugin surfaces to the caller as\n * \"Unrecognized Slack workspace\" without enqueuing the event.\n */\nasync function enforceWorkspaceAllowlist(payload: any): Promise<void> {\n const teamId =\n typeof payload?.team_id === \"string\" ? payload.team_id : undefined;\n const apiAppId =\n typeof payload?.api_app_id === \"string\" ? payload.api_app_id : undefined;\n\n const allowedTeamIds = parseAllowlistEnv(\"SLACK_ALLOWED_TEAM_IDS\");\n const allowedAppIds = parseAllowlistEnv(\"SLACK_ALLOWED_API_APP_IDS\");\n\n if (!allowedTeamIds) {\n if (process.env.NODE_ENV === \"production\") {\n let managed = false;\n try {\n const key = slackInstallationKey({ teamId, apiAppId });\n managed = !!(await getActiveIntegrationInstallationByKey(\"slack\", key));\n } catch {}\n if (!managed) {\n throw createError({\n statusCode: 401,\n statusMessage: \"Slack workspace is not connected\",\n });\n }\n }\n if (!_missingAllowlistWarned) {\n _missingAllowlistWarned = true;\n console.warn(\n \"[slack] SLACK_ALLOWED_TEAM_IDS not set — accepting events from any workspace whose signature matches SLACK_SIGNING_SECRET. \" +\n \"Set SLACK_ALLOWED_TEAM_IDS to a comma-separated list of allowed team_id values before deploying to production.\",\n );\n }\n }\n\n if (allowedTeamIds) {\n if (!teamId || !allowedTeamIds.has(teamId)) {\n throw createError({\n statusCode: 401,\n statusMessage: \"Unrecognized Slack workspace\",\n });\n }\n }\n\n if (allowedAppIds) {\n if (!apiAppId || !allowedAppIds.has(apiAppId)) {\n throw createError({\n statusCode: 401,\n statusMessage: \"Unrecognized Slack workspace\",\n });\n }\n }\n}\n\n/**\n * Read the raw request body as a string and cache on the event context.\n *\n * This MUST read raw bytes from the request stream — never `JSON.stringify`\n * a parsed body, because Slack's HMAC is computed over the exact bytes Slack\n * sent. Re-stringifying a parsed object loses key ordering, whitespace, and\n * Unicode-escape choices, so the signature check would silently fail for\n * legitimate requests (M2 in the webhook security audit).\n *\n * h3 v2's body stream is consume-once, so we cache the raw string on the\n * event context after the first read. All call sites (handleVerification,\n * verifyWebhook, parseIncomingMessage) MUST go through this helper.\n */\nasync function readRawBodyCached(event: H3Event): Promise<string> {\n const cached = event.context.__rawBody;\n if (typeof cached === \"string\") return cached;\n // h3's readRawBody returns the bytes Slack actually sent, defaulting to\n // utf8-decoded. Returns undefined for empty bodies — we coerce to \"\" so\n // the HMAC check can proceed deterministically.\n const raw = (await readRawBody(event)) ?? \"\";\n event.context.__rawBody = raw;\n return raw;\n}\n\nfunction utf8ByteLength(text: string): number {\n return new TextEncoder().encode(text).length;\n}\n\nfunction prefixWithinUtf8ByteLimit(text: string, maxLength: number): string {\n let bytes = 0;\n let end = 0;\n for (const char of text) {\n const nextBytes = utf8ByteLength(char);\n if (bytes + nextBytes > maxLength) break;\n bytes += nextBytes;\n end += char.length;\n }\n return text.slice(0, end || 1);\n}\n\n/** Split a message into chunks that fit within the platform's byte limit. */\nfunction splitMessage(text: string, maxLength: number): string[] {\n if (utf8ByteLength(text) <= maxLength) return [text];\n const chunks: string[] = [];\n let remaining = text;\n while (remaining.length > 0) {\n if (utf8ByteLength(remaining) <= maxLength) {\n chunks.push(remaining);\n break;\n }\n\n const prefix = prefixWithinUtf8ByteLimit(remaining, maxLength);\n\n // Try to split at a newline\n let splitIdx = prefix.lastIndexOf(\"\\n\");\n if (splitIdx <= 0) {\n // Try to split at a space\n splitIdx = prefix.lastIndexOf(\" \");\n }\n if (splitIdx <= 0) {\n splitIdx = prefix.length;\n }\n chunks.push(remaining.slice(0, splitIdx));\n remaining = remaining.slice(splitIdx).trimStart();\n }\n return chunks;\n}\n\n/** Split a message and drop chunks Slack would render as blank messages. */\nfunction splitNonEmptyMessage(text: string, maxLength: number): string[] {\n return splitMessage(text, maxLength).filter(\n (chunk) => chunk.trim().length > 0,\n );\n}\n\n/** Hard cap on input length we feed to the regex-based mrkdwn converter.\n * L2 in the webhook audit: `\\*\\*(.+?)\\*\\*` with the `s` flag on a long\n * string of asterisks can exhibit super-linear backtracking. Slack\n * itself caps message bodies at 4000 chars (SLACK_MAX_LENGTH); we cap\n * the input here at 10x that as a defensive bound for any caller that\n * passes a longer rendering source through this helper before chunking. */\nconst MRKDWN_MAX_LENGTH = 40_000;\n\n/**\n * Convert standard markdown to Slack's mrkdwn dialect.\n * - `[text](url)` → `<url|text>`\n * - `**bold**` → `*bold*` (Slack uses single asterisks for bold)\n *\n * Inputs longer than MRKDWN_MAX_LENGTH are truncated before the regex\n * pass to bound worst-case backtracking on pathological input (L2 in the\n * webhook audit).\n */\nfunction markdownToSlackMrkdwn(text: string): string {\n const bounded =\n text.length > MRKDWN_MAX_LENGTH ? text.slice(0, MRKDWN_MAX_LENGTH) : text;\n return (\n bounded\n .replace(/\\[([^\\]]+)\\]\\(([^)]+)\\)/g, \"<$2|$1>\")\n // Do not wrap bare URLs in Slack bold markers. Slack's autolinker can\n // treat the trailing `*` as part of the URL, producing a broken link.\n .replace(/\\*\\*<?(https?:\\/\\/[^\\s>*]+)>?\\*\\*/g, \"<$1>\")\n // Bounded character class instead of `.+?` with the `s` flag — caps\n // each bold span at 5000 chars so an attacker can't construct a\n // pathological \"**\" sequence that exhibits super-linear backtracking.\n // Newlines are allowed because `[^*]` excludes only the asterisk\n // itself, so multi-line bold spans still match.\n .replace(/\\*\\*([^*]{1,5000})\\*\\*/g, \"*$1*\")\n );\n}\n\n/**\n * Optionally set Slack's native Agent status indicator (the small \"is\n * thinking…\" line under the message composer). The method uses chat:write;\n * Agent View itself is configured separately by the Slack app manifest.\n * Pure best-effort — failures never block the response.\n */\nfunction setSlackAssistantStatus(\n token: string,\n channelId: string,\n threadTs: string,\n status: string,\n): void {\n slackApiFetch(\"https://slack.com/api/assistant.threads.setStatus\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n channel_id: channelId,\n thread_ts: threadTs,\n status,\n }),\n }).catch(() => {});\n}\n\n/**\n * Block Kit payload for the final answer. We avoid auto-unfurl previews by\n * separating the deep-link out into a button instead of inlining it as a\n * `<url|text>` markdown link in the section body — that's what was producing\n * the giant \"Agent-Native Dispatch\" card in every thread reply.\n */\nfunction buildResponseBlocks(\n text: string,\n opts: { threadDeepLinkUrl?: string },\n): unknown[] {\n const sectionChunks = splitMessage(\n text || \"_(no response)_\",\n SLACK_SECTION_TEXT_MAX_LENGTH,\n );\n const blocks: any[] = sectionChunks.map((chunk) => ({\n type: \"section\",\n text: { type: \"mrkdwn\", text: chunk },\n }));\n if (opts.threadDeepLinkUrl) {\n blocks.push({\n type: \"actions\",\n elements: [\n {\n type: \"button\",\n text: { type: \"plain_text\", text: \"Open thread\", emoji: true },\n url: opts.threadDeepLinkUrl,\n action_id: \"open_dispatch_thread\",\n },\n ],\n });\n }\n return blocks;\n}\n\n/**\n * Post a fresh message to a thread. Used as the placeholder-fallback path\n * (e.g. when chat.update fails) and for follow-up overflow chunks.\n */\nasync function postFresh(\n token: string,\n channelId: string,\n threadTs: string | undefined,\n body: Record<string, unknown>,\n): Promise<string | undefined> {\n const hasBlocks =\n Array.isArray(body.blocks) && (body.blocks as unknown[]).length > 0;\n if (\n typeof body.text === \"string\" &&\n body.text.trim().length === 0 &&\n !hasBlocks\n ) {\n return undefined;\n }\n\n const payload: Record<string, unknown> = {\n ...body,\n channel: channelId,\n };\n if (threadTs && !payload.thread_ts) payload.thread_ts = threadTs;\n const res = await slackApiFetch(\"https://slack.com/api/chat.postMessage\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(payload),\n });\n const data = (await res.json()) as {\n ok: boolean;\n error?: string;\n ts?: string;\n };\n if (!data.ok) {\n console.error(\"[slack] chat.postMessage error:\", data.error);\n throw new Error(data.error || \"chat.postMessage failed\");\n }\n return data.ts;\n}\n\nasync function slackApiFetch(\n url: string,\n init: RequestInit,\n timeoutMs = SLACK_API_TIMEOUT_MS,\n): Promise<Response> {\n const controller =\n typeof AbortController !== \"undefined\" ? new AbortController() : undefined;\n const timer = controller\n ? setTimeout(() => controller.abort(), timeoutMs)\n : undefined;\n try {\n return await fetch(url, {\n ...init,\n signal: controller?.signal ?? init.signal,\n });\n } finally {\n if (timer) clearTimeout(timer);\n }\n}\n\nasync function resolveSlackThreadPermalink(\n channelId: unknown,\n threadTs: unknown,\n resolvedToken?: string,\n): Promise<string | undefined> {\n if (typeof channelId !== \"string\" || typeof threadTs !== \"string\") {\n return undefined;\n }\n const token = resolvedToken;\n if (!token) return undefined;\n\n try {\n const url = new URL(\"https://slack.com/api/chat.getPermalink\");\n url.searchParams.set(\"channel\", channelId);\n url.searchParams.set(\"message_ts\", threadTs);\n const res = await slackApiFetch(\n url.toString(),\n { headers: { Authorization: `Bearer ${token}` } },\n SLACK_PERMALINK_TIMEOUT_MS,\n );\n const data = (await res.json()) as {\n ok?: boolean;\n permalink?: unknown;\n };\n if (!data.ok || typeof data.permalink !== \"string\") return undefined;\n\n const permalink = new URL(data.permalink);\n const isSlackHost =\n permalink.hostname === \"slack.com\" ||\n permalink.hostname.endsWith(\".slack.com\");\n if (permalink.protocol !== \"https:\" || !isSlackHost) return undefined;\n return permalink.toString();\n } catch {\n return undefined;\n }\n}\n\nfunction boundedSlackText(value: unknown): string {\n return typeof value === \"string\"\n ? value.slice(0, SLACK_CONTEXT_TEXT_LIMIT)\n : \"\";\n}\n\nfunction normalizeSlackAgentContext(\n value: unknown,\n eventTeamId: string,\n): {\n entities: Array<{ type: string; value: string; teamId?: string }>;\n channelId?: string;\n} | null {\n if (!value || typeof value !== \"object\") return null;\n const rawEntities = (value as { entities?: unknown }).entities;\n if (!Array.isArray(rawEntities)) return null;\n const entities = rawEntities.slice(0, 10).flatMap((entity) => {\n if (!entity || typeof entity !== \"object\") return [];\n const record = entity as Record<string, unknown>;\n if (typeof record.type !== \"string\" || typeof record.value !== \"string\") {\n return [];\n }\n const teamId =\n typeof record.team_id === \"string\" ? record.team_id : undefined;\n if (teamId && eventTeamId !== \"unknown\" && teamId !== eventTeamId) {\n return [];\n }\n return [\n {\n type: record.type.slice(0, 100),\n value: record.value.slice(0, 200),\n ...(teamId ? { teamId } : {}),\n },\n ];\n });\n if (!entities.length) return null;\n const channelId = entities.find(\n (entity) =>\n entity.type === \"slack#/types/channel_id\" &&\n /^[CDG][A-Z0-9]+$/.test(entity.value),\n )?.value;\n return { entities, ...(channelId ? { channelId } : {}) };\n}\n\nfunction slackFileReference(value: unknown): IntegrationFileReference | null {\n if (!value || typeof value !== \"object\") return null;\n const file = value as Record<string, unknown>;\n if (typeof file.id !== \"string\") return null;\n return {\n id: file.id,\n ...(typeof file.name === \"string\" ? { name: file.name } : {}),\n ...(typeof file.mimetype === \"string\" ? { mimetype: file.mimetype } : {}),\n ...(typeof file.size === \"number\" ? { size: file.size } : {}),\n ...(typeof file.permalink === \"string\"\n ? { permalink: file.permalink }\n : {}),\n ...(typeof file.url_private_download === \"string\"\n ? { downloadUrl: file.url_private_download }\n : {}),\n };\n}\n\nasync function slackJson(\n token: string,\n method: string,\n params: Record<string, string>,\n timeoutMs = 2_000,\n): Promise<Record<string, any> | null> {\n try {\n const url = new URL(`https://slack.com/api/${method}`);\n for (const [key, value] of Object.entries(params)) {\n url.searchParams.set(key, value);\n }\n const response = await slackApiFetch(\n url.toString(),\n { headers: { Authorization: `Bearer ${token}` } },\n timeoutMs,\n );\n const body = (await response.json()) as Record<string, any>;\n return body.ok ? body : null;\n } catch {\n return null;\n }\n}\n\nfunction slackIdentityCacheKey(incoming: IncomingMessage): string | null {\n const teamId = incoming.platformContext.teamId;\n const senderId = incoming.senderId;\n if (typeof senderId !== \"string\" || !senderId.trim()) return null;\n return `${typeof teamId === \"string\" && teamId ? teamId : \"unknown\"}:${senderId}`;\n}\n\nasync function resolveSlackUserIdentity(\n token: string,\n incoming: IncomingMessage,\n): Promise<SlackUserIdentity | null> {\n const cacheKey = slackIdentityCacheKey(incoming);\n if (!cacheKey) return null;\n const cached = slackIdentityCache.get(cacheKey);\n if (cached && cached.expiresAt > Date.now()) return cached.identity;\n if (cached) slackIdentityCache.delete(cacheKey);\n\n const user = await slackJson(\n token,\n \"users.info\",\n { user: incoming.senderId! },\n SLACK_IDENTITY_TIMEOUT_MS,\n );\n const profile = user?.user?.profile;\n const identity: SlackUserIdentity | null = user?.user\n ? {\n email:\n typeof profile?.email === \"string\" && profile.email.trim()\n ? profile.email.trim().toLowerCase()\n : null,\n name:\n typeof profile?.real_name === \"string\" && profile.real_name.trim()\n ? profile.real_name.trim()\n : typeof profile?.display_name === \"string\" &&\n profile.display_name.trim()\n ? profile.display_name.trim()\n : typeof user.user.real_name === \"string\" &&\n user.user.real_name.trim()\n ? user.user.real_name.trim()\n : typeof user.user.name === \"string\" && user.user.name.trim()\n ? user.user.name.trim()\n : null,\n // is_stranger marks Slack Connect DM participants from another\n // workspace; they must map to \"external\", never \"member\".\n memberType:\n user.user.is_stranger || user.user.is_ultra_restricted\n ? \"external\"\n : user.user.is_restricted\n ? \"guest\"\n : user.user.is_owner\n ? \"owner\"\n : user.user.is_admin\n ? \"admin\"\n : \"member\",\n }\n : null;\n if (slackIdentityCache.size >= SLACK_IDENTITY_CACHE_MAX_ENTRIES) {\n const oldestKey = slackIdentityCache.keys().next().value;\n if (oldestKey) slackIdentityCache.delete(oldestKey);\n }\n slackIdentityCache.set(cacheKey, {\n identity,\n expiresAt:\n Date.now() +\n (identity\n ? SLACK_IDENTITY_CACHE_TTL_MS\n : SLACK_IDENTITY_NEGATIVE_CACHE_TTL_MS),\n });\n return identity;\n}\n\nasync function hydrateSlackIdentity(\n token: string,\n incoming: IncomingMessage,\n): Promise<IncomingMessage> {\n const identity = await resolveSlackUserIdentity(token, incoming);\n if (!identity) {\n // Context hydration can call users.info again after the webhook identity\n // pass. A transient failure on that second lookup is not evidence that a\n // previously verified sender became unverified; preserve the stronger\n // identity instead of replacing it with a negative-cache result.\n if (\n incoming.senderVerified === true &&\n incoming.senderEmail?.trim() &&\n incoming.actorTrust?.verified === true\n ) {\n return incoming;\n }\n return {\n ...incoming,\n senderVerified: false,\n actorTrust: { memberType: \"unknown\", verified: false },\n };\n }\n return {\n ...incoming,\n ...(identity.name ? { senderName: identity.name } : {}),\n ...(identity.email\n ? { senderEmail: identity.email, senderVerified: true }\n : { senderVerified: false }),\n actorTrust: {\n memberType: identity.memberType,\n verified: true,\n },\n };\n}\n\nasync function hydrateSlackContext(\n token: string,\n incoming: IncomingMessage,\n): Promise<IncomingMessage> {\n const channelId = incoming.platformContext.channelId;\n const threadTs = incoming.platformContext.threadTs;\n const senderId = incoming.senderId;\n if (typeof channelId !== \"string\" || typeof threadTs !== \"string\") {\n return incoming;\n }\n\n const [thread, history, pins, conversation, identity] = await Promise.all([\n slackJson(token, \"conversations.replies\", {\n channel: channelId,\n ts: threadTs,\n limit: String(SLACK_CONTEXT_MESSAGE_LIMIT),\n }),\n slackJson(token, \"conversations.history\", {\n channel: channelId,\n latest: String(incoming.platformContext.messageTs ?? threadTs),\n inclusive: \"true\",\n limit: String(SLACK_CONTEXT_MESSAGE_LIMIT),\n }),\n slackJson(token, \"pins.list\", { channel: channelId }),\n slackJson(token, \"conversations.info\", { channel: channelId }),\n senderId ? resolveSlackUserIdentity(token, incoming) : null,\n ]);\n\n // Agent View can attach the Slack surface the user is currently viewing to\n // a DM. Treat it only as a context hint: Slack requires us to prove the bot\n // can access the referenced channel with conversations.info before reading\n // any history from it.\n const activeContextChannelId =\n typeof incoming.platformContext.activeContextChannelId === \"string\"\n ? incoming.platformContext.activeContextChannelId\n : null;\n const activeContextConversation =\n activeContextChannelId && activeContextChannelId !== channelId\n ? await slackJson(token, \"conversations.info\", {\n channel: activeContextChannelId,\n })\n : null;\n const activeContextHistory = activeContextConversation\n ? await slackJson(token, \"conversations.history\", {\n channel: activeContextChannelId!,\n limit: \"5\",\n })\n : null;\n const activeContextName =\n typeof activeContextConversation?.channel?.name === \"string\"\n ? activeContextConversation.channel.name\n : null;\n const activeContextMessages = Array.isArray(activeContextHistory?.messages)\n ? activeContextHistory.messages.map((message: Record<string, any>) => ({\n ...message,\n text: `[Active Slack context${activeContextName ? ` #${activeContextName}` : \"\"}] ${boundedSlackText(message.text)}`,\n }))\n : [];\n\n const rawMessages = [\n ...(Array.isArray(history?.messages) ? history.messages : []),\n ...(Array.isArray(pins?.items)\n ? pins.items\n .map((item: Record<string, any>) => item.message)\n .filter(Boolean)\n : []),\n ...(Array.isArray(thread?.messages) ? thread.messages : []),\n ...activeContextMessages,\n ];\n const uniqueMessages = [\n ...new Map(\n rawMessages.map((message: Record<string, any>, index) => [\n typeof message.ts === \"string\" ? message.ts : `unknown:${index}`,\n message,\n ]),\n ).values(),\n ].slice(-SLACK_CONTEXT_MESSAGE_LIMIT);\n\n const messages: IntegrationContextMessage[] = uniqueMessages.length\n ? uniqueMessages.map((message: Record<string, any>) => {\n const files = Array.isArray(message.files)\n ? message.files\n .map(slackFileReference)\n .filter(\n (\n file: IntegrationFileReference | null,\n ): file is IntegrationFileReference => file !== null,\n )\n : undefined;\n const reactions = Array.isArray(message.reactions)\n ? message.reactions\n .filter(\n (reaction: any) =>\n typeof reaction?.name === \"string\" &&\n typeof reaction?.count === \"number\",\n )\n .map((reaction: any) => ({\n name: reaction.name,\n count: reaction.count,\n }))\n : undefined;\n return {\n ...(typeof message.user === \"string\"\n ? { senderId: message.user }\n : {}),\n text: boundedSlackText(message.text),\n timestamp:\n typeof message.ts === \"string\"\n ? Math.floor(parseFloat(message.ts) * 1000)\n : incoming.timestamp,\n ...(reactions?.length ? { reactions } : {}),\n ...(files?.length ? { files } : {}),\n };\n })\n : [];\n\n const profile = identity;\n const isPrivate = conversation?.channel?.is_private === true;\n const isExternalShared = conversation?.channel?.is_ext_shared === true;\n const isMpim = conversation?.channel?.is_mpim === true;\n const isIm = conversation?.channel?.is_im === true;\n const conversationType = isIm\n ? \"dm\"\n : isMpim\n ? \"group_dm\"\n : isPrivate\n ? \"private_channel\"\n : \"channel\";\n\n const attachedFiles = messages.flatMap((message) => message.files ?? []);\n const detailedFiles = await Promise.all(\n [...new Set(attachedFiles.map((file) => file.id))]\n .slice(0, 5)\n .map(async (fileId) => {\n const result = await slackJson(token, \"files.info\", { file: fileId });\n return slackFileReference(result?.file);\n }),\n );\n const fileById = new Map(\n detailedFiles\n .filter((file): file is IntegrationFileReference => file !== null)\n .map((file) => [file.id, file]),\n );\n const hydratedMessages = messages.map((message) => ({\n ...message,\n ...(message.files?.length\n ? {\n files: message.files.map((file) => ({\n ...file,\n ...(fileById.get(file.id) ?? {}),\n })),\n }\n : {}),\n }));\n const hydratedFiles = hydratedMessages.flatMap(\n (message) => message.files ?? [],\n );\n return {\n ...incoming,\n ...(profile?.name ? { senderName: profile.name } : {}),\n ...(profile?.email\n ? { senderEmail: profile.email, senderVerified: true }\n : { senderVerified: false }),\n conversationType,\n // Conversation hydration must not promote a caller when users.info was\n // unavailable. Preserve the result of the earlier identity-only hydration\n // unless this request independently resolved the Slack user.\n actorTrust: identity\n ? { memberType: identity.memberType, verified: true }\n : (incoming.actorTrust ?? {\n memberType: \"unknown\",\n verified: false,\n }),\n contextMessages: hydratedMessages,\n ...(hydratedFiles.length ? { files: hydratedFiles.slice(0, 20) } : {}),\n platformContext: {\n ...incoming.platformContext,\n channelName:\n typeof conversation?.channel?.name === \"string\"\n ? conversation.channel.name\n : undefined,\n isExternalShared,\n ...(activeContextChannelId\n ? {\n activeContextChannelId,\n ...(activeContextName\n ? { activeContextChannelName: activeContextName }\n : {}),\n }\n : {}),\n },\n };\n}\n\nfunction shortTaskTitle(value: unknown): string {\n const text = typeof value === \"string\" ? value : \"Working\";\n return text.replace(/[-_]/g, \" \").slice(0, 200);\n}\n\nfunction delegatedTaskTitle(agent: unknown): string {\n return `Contact ${shortTaskTitle(agent)}`;\n}\n\nfunction formatElapsedSeconds(elapsedSeconds: number): string {\n const totalSeconds = Math.max(0, Math.round(elapsedSeconds));\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n return minutes > 0 ? `${minutes}m ${seconds}s` : `${seconds}s`;\n}\n\nfunction formatProgressState(state: string): string {\n if (state === \"submitted\") return \"Queued\";\n if (state === \"working\") return \"Working\";\n return shortTaskTitle(state);\n}\n\nfunction delegatedProgressDetails(\n agent: unknown,\n state: string,\n elapsedSeconds: number,\n detail?: string,\n): string {\n const elapsed = formatElapsedSeconds(elapsedSeconds);\n const progress = `${formatProgressState(state)} · ${elapsed}`;\n const update = detail ? shortTaskTitle(detail) : \"\";\n\n if (elapsedSeconds >= SLACK_CALM_PROGRESS_THRESHOLD_SECONDS) {\n const agentName = shortTaskTitle(agent);\n const context = update ? ` — ${update}.` : \".\";\n return `${progress}${context} This is taking longer than usual, but ${agentName} is still working. I’ll post the result here.`;\n }\n\n return update ? `${progress} — ${update}` : progress;\n}\n\nasync function postSlackJson(\n token: string,\n method: string,\n body: Record<string, unknown>,\n): Promise<Record<string, any>> {\n const response = await slackApiFetch(`https://slack.com/api/${method}`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n });\n const data = (await response.json()) as Record<string, any>;\n if (!data.ok) throw new Error(data.error || `${method} failed`);\n return data;\n}\n\nfunction streamFailureCode(error: unknown): string {\n const message = error instanceof Error ? error.message.trim() : \"\";\n return /^[a-z0-9_:-]{1,80}$/i.test(message) ? message : \"unknown\";\n}\n\nfunction streamChunkType(chunk: Record<string, unknown>): string {\n const type = chunk.type;\n return type === \"task_update\" ||\n type === \"plan_update\" ||\n type === \"markdown_text\" ||\n type === \"blocks\"\n ? type\n : \"unknown\";\n}\n\nasync function startSlackRunProgress(\n token: string,\n incoming: IncomingMessage,\n): Promise<PlatformRunProgress | null> {\n const channel = incoming.platformContext.channelId;\n const threadTs = incoming.platformContext.threadTs;\n if (typeof channel !== \"string\" || typeof threadTs !== \"string\") return null;\n\n let started: Record<string, any>;\n try {\n started = await postSlackJson(token, \"chat.startStream\", {\n channel,\n thread_ts: threadTs,\n ...(incoming.tenantId ? { recipient_team_id: incoming.tenantId } : {}),\n ...(incoming.senderId ? { recipient_user_id: incoming.senderId } : {}),\n task_display_mode: \"plan\",\n markdown_text: \"I’m looking into this for you.\",\n chunks: [\n {\n type: \"plan_update\",\n title: \"I’m looking into this for you\",\n },\n {\n type: \"task_update\",\n id: \"agent-native:context\",\n title: \"Review the request\",\n status: \"in_progress\",\n details: \"Finding the information needed for an answer\",\n },\n ],\n });\n } catch (error) {\n console.warn(\"[slack] chat.startStream failed; using standard reply\", {\n errorCode: streamFailureCode(error),\n isDirectMessage: incoming.conversationType === \"dm\",\n hasRecipientTeam: Boolean(incoming.tenantId),\n hasRecipientUser: Boolean(incoming.senderId),\n });\n return null;\n }\n\n const streamTs = started.ts;\n if (typeof streamTs !== \"string\") return null;\n return createSlackRunProgress(token, incoming, channel, threadTs, streamTs);\n}\n\nfunction isSlackStreamProgressRef(ref: PlatformRunProgressRef): boolean {\n return (\n ref.kind === \"slack-stream\" && /^\\d{1,20}\\.\\d{1,9}$/.test(ref.streamTs)\n );\n}\n\nasync function resumeSlackRunProgress(\n token: string,\n incoming: IncomingMessage,\n streamTs: string,\n): Promise<PlatformRunProgress | null> {\n const channel = incoming.platformContext.channelId;\n const threadTs = incoming.platformContext.threadTs;\n if (typeof channel !== \"string\" || typeof threadTs !== \"string\") return null;\n return createSlackRunProgress(token, incoming, channel, threadTs, streamTs);\n}\n\nfunction createSlackRunProgress(\n token: string,\n incoming: IncomingMessage,\n channel: string,\n threadTs: string,\n streamTs: string,\n): PlatformRunProgress {\n const tasks = new Map<string, { title: string; status: string }>();\n const toolTaskIds = new Map<string, string>();\n const agentTaskIds = new Map<string, string>();\n tasks.set(\"agent-native:context\", {\n title: \"Review the request\",\n status: \"in_progress\",\n });\n let sequence = 0;\n let lastWriteAt = 0;\n let pending: Record<string, unknown> | null = null;\n let pendingTimer: ReturnType<typeof setTimeout> | null = null;\n let approvalControls: { approve: string; deny: string } | null = null;\n let cancelControl: string | null = null;\n\n const append = async (chunk: Record<string, unknown>) => {\n const now = Date.now();\n const write = async (value: Record<string, unknown>) => {\n lastWriteAt = Date.now();\n try {\n await postSlackJson(token, \"chat.appendStream\", {\n channel,\n ts: streamTs,\n markdown_text: \"Progress updated.\",\n chunks: [value],\n });\n } catch (error) {\n console.warn(\n \"[slack] chat.appendStream failed; progress may be stale\",\n {\n chunkType: streamChunkType(value),\n errorCode: streamFailureCode(error),\n },\n );\n }\n };\n if (now - lastWriteAt >= 900) {\n await write(chunk);\n return;\n }\n pending = chunk;\n if (!pendingTimer) {\n pendingTimer = setTimeout(\n () => {\n const value = pending;\n pending = null;\n pendingTimer = null;\n if (value) void write(value);\n },\n 900 - (now - lastWriteAt),\n );\n }\n };\n\n const taskId = (prefix: string, explicit?: string) =>\n `${prefix}:${explicit || ++sequence}`.slice(0, 240);\n\n return {\n ref: { kind: \"slack-stream\", streamTs },\n async onEvent(event) {\n if (!cancelControl) {\n const context = getIntegrationRequestContext();\n const ownerEmail = getRequestContext()?.userEmail;\n if (\n context?.lineage?.runId &&\n ownerEmail &&\n incoming.senderId &&\n incoming.tenantId\n ) {\n cancelControl = await createIntegrationControl({\n action: \"cancel\",\n ownerEmail,\n orgId: getRequestContext()?.orgId ?? null,\n requesterId: incoming.senderId,\n teamId: incoming.tenantId,\n apiAppId:\n typeof incoming.platformContext.apiAppId === \"string\"\n ? incoming.platformContext.apiAppId\n : null,\n channelId: channel,\n messageTs: streamTs,\n runId: context.lineage.runId,\n incoming,\n });\n await append({\n type: \"blocks\",\n blocks: [\n {\n type: \"actions\",\n block_id: `agent-native-running-${Date.now()}`,\n elements: [\n {\n type: \"button\",\n text: { type: \"plain_text\", text: \"Cancel\" },\n style: \"danger\",\n action_id: \"agent_native_cancel\",\n value: cancelControl,\n },\n ],\n },\n ],\n });\n }\n }\n if (event.type === \"approval_required\") {\n const context = getIntegrationRequestContext();\n const ownerEmail = getRequestContext()?.userEmail;\n if (context && ownerEmail && incoming.senderId && incoming.tenantId) {\n const common = {\n ownerEmail,\n orgId: getRequestContext()?.orgId ?? null,\n requesterId: incoming.senderId,\n teamId: incoming.tenantId,\n apiAppId:\n typeof incoming.platformContext.apiAppId === \"string\"\n ? incoming.platformContext.apiAppId\n : null,\n channelId: channel,\n messageTs: streamTs,\n runId: context.lineage?.runId ?? null,\n approvalKey: event.approvalKey,\n incoming,\n };\n const [approve, deny] = await Promise.all([\n createIntegrationControl({ ...common, action: \"approve\" }),\n createIntegrationControl({ ...common, action: \"deny\" }),\n ]);\n approvalControls = { approve, deny };\n }\n await append({\n type: \"task_update\",\n id: \"agent-native:approval\",\n title: `Approve ${shortTaskTitle(event.tool)}`,\n status: \"pending\",\n details: \"Waiting for the requester\",\n });\n } else if (event.type === \"tool_start\") {\n const key = event.id || event.tool;\n const id = taskId(\"tool\", event.id);\n toolTaskIds.set(key, id);\n const title = shortTaskTitle(event.tool);\n tasks.set(id, { title, status: \"in_progress\" });\n await append({\n type: \"task_update\",\n id,\n title,\n status: \"in_progress\",\n });\n } else if (event.type === \"tool_done\") {\n const key = event.id || event.tool;\n const id = toolTaskIds.get(key) ?? taskId(\"tool\", event.id);\n const title = tasks.get(id)?.title ?? shortTaskTitle(event.tool);\n tasks.set(id, {\n title,\n status: event.isError ? \"error\" : \"complete\",\n });\n await append({\n type: \"task_update\",\n id,\n title,\n status: event.isError ? \"error\" : \"complete\",\n });\n } else if (event.type === \"agent_call\") {\n const id =\n agentTaskIds.get(event.agent) ?? taskId(\"agent\", event.agent);\n agentTaskIds.set(event.agent, id);\n const status =\n event.status === \"start\"\n ? \"in_progress\"\n : event.status === \"done\"\n ? \"complete\"\n : \"error\";\n const title = delegatedTaskTitle(event.agent);\n tasks.set(id, { title, status });\n await append({\n type: \"task_update\",\n id,\n title,\n status,\n ...(event.status === \"start\"\n ? {\n details: `I’m contacting ${shortTaskTitle(event.agent)} for an answer.`,\n }\n : {}),\n });\n } else if (event.type === \"agent_call_progress\") {\n // A2A calls can stay healthy for minutes. Keep the same native Slack\n // task card alive with each real downstream poll rather than creating\n // a new card per tick or leaving the user with a stale spinner.\n const id =\n agentTaskIds.get(event.agent) ?? taskId(\"agent\", event.agent);\n agentTaskIds.set(event.agent, id);\n const title = delegatedTaskTitle(event.agent);\n const details = delegatedProgressDetails(\n event.agent,\n event.state,\n event.elapsedSeconds,\n event.detail,\n );\n tasks.set(id, { title, status: \"in_progress\" });\n await append({\n type: \"task_update\",\n id,\n title,\n status: \"in_progress\",\n details,\n });\n } else if (event.type === \"activity\") {\n await append({\n type: \"task_update\",\n id: \"agent-native:context\",\n title: \"Review the request\",\n status: \"in_progress\",\n details: `Working · ${shortTaskTitle(event.label)}`,\n });\n }\n },\n async complete(message) {\n if (pendingTimer) clearTimeout(pendingTimer);\n const finalChunks = [...tasks.entries()].map(([id, task]) => ({\n type: \"task_update\",\n id,\n title: task.title,\n status: task.status === \"in_progress\" ? \"complete\" : task.status,\n }));\n const messageBlocks = Array.isArray(message.platformContext.blocks)\n ? message.platformContext.blocks\n : [];\n const controlBlocks = approvalControls\n ? [\n {\n type: \"actions\",\n block_id: `agent-native-approval-${Date.now()}`,\n elements: [\n {\n type: \"button\",\n text: { type: \"plain_text\", text: \"Approve\" },\n style: \"primary\",\n action_id: \"agent_native_approve\",\n value: approvalControls.approve,\n },\n {\n type: \"button\",\n text: { type: \"plain_text\", text: \"Deny\" },\n style: \"danger\",\n action_id: \"agent_native_deny\",\n value: approvalControls.deny,\n },\n ],\n },\n ]\n : [];\n await postSlackJson(token, \"chat.stopStream\", {\n channel,\n ts: streamTs,\n markdown_text: message.text || \"Done.\",\n ...(finalChunks.length ? { chunks: finalChunks } : {}),\n ...(messageBlocks.length || controlBlocks.length\n ? { blocks: [...messageBlocks, ...controlBlocks].slice(0, 50) }\n : {}),\n });\n setSlackAssistantStatus(token, channel, threadTs, \"\");\n return { status: \"delivered\", messageRefs: [streamTs] };\n },\n async fail(message) {\n if (pendingTimer) clearTimeout(pendingTimer);\n await postSlackJson(token, \"chat.stopStream\", {\n channel,\n ts: streamTs,\n markdown_text: message.slice(0, SLACK_MAX_LENGTH),\n }).catch(() => {});\n setSlackAssistantStatus(token, channel, threadTs, \"\");\n },\n };\n}\n"]}