slackhive 0.1.41 → 0.1.43

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 (534) hide show
  1. package/cli/dist/index.js +15786 -52
  2. package/package.json +9 -3
  3. package/.dockerignore +0 -14
  4. package/.env.example +0 -44
  5. package/.github/ISSUE_TEMPLATE/bug_report.yml +0 -65
  6. package/.github/ISSUE_TEMPLATE/config.yml +0 -5
  7. package/.github/ISSUE_TEMPLATE/feature_request.yml +0 -38
  8. package/.github/PULL_REQUEST_TEMPLATE.md +0 -27
  9. package/.github/dependabot.yml +0 -20
  10. package/.github/workflows/audit.yml +0 -149
  11. package/.github/workflows/ci.yml +0 -135
  12. package/CHANGELOG.md +0 -52
  13. package/CODE_OF_CONDUCT.md +0 -37
  14. package/CONTRIBUTING.md +0 -204
  15. package/SECURITY.md +0 -47
  16. package/apps/runner/Dockerfile +0 -33
  17. package/apps/runner/dist/__tests__/channel-restrictions.test.d.ts +0 -8
  18. package/apps/runner/dist/__tests__/channel-restrictions.test.js +0 -63
  19. package/apps/runner/dist/__tests__/channel-restrictions.test.js.map +0 -1
  20. package/apps/runner/dist/__tests__/claude-handler-resolve.test.d.ts +0 -20
  21. package/apps/runner/dist/__tests__/claude-handler-resolve.test.js +0 -178
  22. package/apps/runner/dist/__tests__/claude-handler-resolve.test.js.map +0 -1
  23. package/apps/runner/dist/__tests__/compile-claude-md.test.d.ts +0 -13
  24. package/apps/runner/dist/__tests__/compile-claude-md.test.js +0 -144
  25. package/apps/runner/dist/__tests__/compile-claude-md.test.js.map +0 -1
  26. package/apps/runner/dist/__tests__/memory-sync.test.d.ts +0 -11
  27. package/apps/runner/dist/__tests__/memory-sync.test.js +0 -56
  28. package/apps/runner/dist/__tests__/memory-sync.test.js.map +0 -1
  29. package/apps/runner/dist/__tests__/slack-file-support.test.d.ts +0 -9
  30. package/apps/runner/dist/__tests__/slack-file-support.test.js +0 -271
  31. package/apps/runner/dist/__tests__/slack-file-support.test.js.map +0 -1
  32. package/apps/runner/dist/__tests__/slack-formatting.test.d.ts +0 -12
  33. package/apps/runner/dist/__tests__/slack-formatting.test.js +0 -400
  34. package/apps/runner/dist/__tests__/slack-formatting.test.js.map +0 -1
  35. package/apps/runner/dist/__tests__/thread-context.test.d.ts +0 -12
  36. package/apps/runner/dist/__tests__/thread-context.test.js +0 -182
  37. package/apps/runner/dist/__tests__/thread-context.test.js.map +0 -1
  38. package/apps/runner/dist/agent-runner.d.ts +0 -118
  39. package/apps/runner/dist/agent-runner.js +0 -352
  40. package/apps/runner/dist/agent-runner.js.map +0 -1
  41. package/apps/runner/dist/claude-handler.d.ts +0 -122
  42. package/apps/runner/dist/claude-handler.js +0 -402
  43. package/apps/runner/dist/claude-handler.js.map +0 -1
  44. package/apps/runner/dist/compile-claude-md.d.ts +0 -59
  45. package/apps/runner/dist/compile-claude-md.js +0 -291
  46. package/apps/runner/dist/compile-claude-md.js.map +0 -1
  47. package/apps/runner/dist/correction-handler.d.ts +0 -46
  48. package/apps/runner/dist/correction-handler.js +0 -162
  49. package/apps/runner/dist/correction-handler.js.map +0 -1
  50. package/apps/runner/dist/correction-manager.d.ts +0 -53
  51. package/apps/runner/dist/correction-manager.js +0 -241
  52. package/apps/runner/dist/correction-manager.js.map +0 -1
  53. package/apps/runner/dist/db.d.ts +0 -193
  54. package/apps/runner/dist/db.js +0 -492
  55. package/apps/runner/dist/db.js.map +0 -1
  56. package/apps/runner/dist/index.d.ts +0 -9
  57. package/apps/runner/dist/index.js +0 -43
  58. package/apps/runner/dist/index.js.map +0 -1
  59. package/apps/runner/dist/job-scheduler.d.ts +0 -57
  60. package/apps/runner/dist/job-scheduler.js +0 -150
  61. package/apps/runner/dist/job-scheduler.js.map +0 -1
  62. package/apps/runner/dist/logger.d.ts +0 -32
  63. package/apps/runner/dist/logger.js +0 -52
  64. package/apps/runner/dist/logger.js.map +0 -1
  65. package/apps/runner/dist/mcp-process-manager.d.ts +0 -38
  66. package/apps/runner/dist/mcp-process-manager.js +0 -189
  67. package/apps/runner/dist/mcp-process-manager.js.map +0 -1
  68. package/apps/runner/dist/memory-mcp.d.ts +0 -14
  69. package/apps/runner/dist/memory-mcp.js +0 -88
  70. package/apps/runner/dist/memory-mcp.js.map +0 -1
  71. package/apps/runner/dist/memory-watcher.d.ts +0 -78
  72. package/apps/runner/dist/memory-watcher.js +0 -220
  73. package/apps/runner/dist/memory-watcher.js.map +0 -1
  74. package/apps/runner/dist/slack-handler.d.ts +0 -120
  75. package/apps/runner/dist/slack-handler.js +0 -843
  76. package/apps/runner/dist/slack-handler.js.map +0 -1
  77. package/apps/runner/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
  78. package/apps/runner/package.json +0 -42
  79. package/apps/runner/src/__tests__/channel-restrictions.test.ts +0 -75
  80. package/apps/runner/src/__tests__/claude-handler-resolve.test.ts +0 -160
  81. package/apps/runner/src/__tests__/compile-claude-md.test.ts +0 -139
  82. package/apps/runner/src/__tests__/memory-sync.test.ts +0 -59
  83. package/apps/runner/src/__tests__/slack-file-support.test.ts +0 -376
  84. package/apps/runner/src/__tests__/slack-formatting.test.ts +0 -495
  85. package/apps/runner/src/__tests__/thread-context.test.ts +0 -215
  86. package/apps/runner/src/agent-runner.ts +0 -397
  87. package/apps/runner/src/claude-handler.ts +0 -475
  88. package/apps/runner/src/compile-claude-md.ts +0 -283
  89. package/apps/runner/src/correction-handler.ts +0 -191
  90. package/apps/runner/src/correction-manager.ts +0 -285
  91. package/apps/runner/src/db.ts +0 -604
  92. package/apps/runner/src/index.ts +0 -46
  93. package/apps/runner/src/job-scheduler.ts +0 -165
  94. package/apps/runner/src/logger.ts +0 -49
  95. package/apps/runner/src/mcp-process-manager.ts +0 -195
  96. package/apps/runner/src/memory-mcp.ts +0 -85
  97. package/apps/runner/src/memory-watcher.ts +0 -215
  98. package/apps/runner/src/slack-handler.ts +0 -929
  99. package/apps/runner/tsconfig.json +0 -17
  100. package/apps/runner/vitest.config.mts +0 -17
  101. package/apps/web/.eslintrc.json +0 -3
  102. package/apps/web/.next/app-build-manifest.json +0 -323
  103. package/apps/web/.next/app-path-routes-manifest.json +0 -46
  104. package/apps/web/.next/build-manifest.json +0 -33
  105. package/apps/web/.next/cache/.previewinfo +0 -1
  106. package/apps/web/.next/cache/.rscinfo +0 -1
  107. package/apps/web/.next/cache/webpack/client-production/0.pack +0 -0
  108. package/apps/web/.next/cache/webpack/client-production/1.pack +0 -0
  109. package/apps/web/.next/cache/webpack/client-production/2.pack +0 -0
  110. package/apps/web/.next/cache/webpack/client-production/3.pack +0 -0
  111. package/apps/web/.next/cache/webpack/client-production/4.pack +0 -0
  112. package/apps/web/.next/cache/webpack/client-production/index.pack +0 -0
  113. package/apps/web/.next/cache/webpack/client-production/index.pack.old +0 -0
  114. package/apps/web/.next/cache/webpack/edge-server-production/0.pack +0 -0
  115. package/apps/web/.next/cache/webpack/edge-server-production/1.pack +0 -0
  116. package/apps/web/.next/cache/webpack/edge-server-production/index.pack +0 -0
  117. package/apps/web/.next/cache/webpack/edge-server-production/index.pack.old +0 -0
  118. package/apps/web/.next/cache/webpack/server-production/0.pack +0 -0
  119. package/apps/web/.next/cache/webpack/server-production/1.pack +0 -0
  120. package/apps/web/.next/cache/webpack/server-production/2.pack +0 -0
  121. package/apps/web/.next/cache/webpack/server-production/index.pack +0 -0
  122. package/apps/web/.next/cache/webpack/server-production/index.pack.old +0 -0
  123. package/apps/web/.next/diagnostics/build-diagnostics.json +0 -6
  124. package/apps/web/.next/diagnostics/framework.json +0 -1
  125. package/apps/web/.next/package.json +0 -1
  126. package/apps/web/.next/react-loadable-manifest.json +0 -1
  127. package/apps/web/.next/server/app/_not-found/page.js +0 -2
  128. package/apps/web/.next/server/app/_not-found/page.js.nft.json +0 -1
  129. package/apps/web/.next/server/app/_not-found/page_client-reference-manifest.js +0 -1
  130. package/apps/web/.next/server/app/agents/[slug]/page.js +0 -4
  131. package/apps/web/.next/server/app/agents/[slug]/page.js.nft.json +0 -1
  132. package/apps/web/.next/server/app/agents/[slug]/page_client-reference-manifest.js +0 -1
  133. package/apps/web/.next/server/app/agents/new/page.js +0 -2
  134. package/apps/web/.next/server/app/agents/new/page.js.nft.json +0 -1
  135. package/apps/web/.next/server/app/agents/new/page_client-reference-manifest.js +0 -1
  136. package/apps/web/.next/server/app/api/agents/[id]/access/route.js +0 -1
  137. package/apps/web/.next/server/app/api/agents/[id]/access/route.js.nft.json +0 -1
  138. package/apps/web/.next/server/app/api/agents/[id]/access/route_client-reference-manifest.js +0 -1
  139. package/apps/web/.next/server/app/api/agents/[id]/claude-md/route.js +0 -6
  140. package/apps/web/.next/server/app/api/agents/[id]/claude-md/route.js.nft.json +0 -1
  141. package/apps/web/.next/server/app/api/agents/[id]/claude-md/route_client-reference-manifest.js +0 -1
  142. package/apps/web/.next/server/app/api/agents/[id]/logs/route.js +0 -3
  143. package/apps/web/.next/server/app/api/agents/[id]/logs/route.js.nft.json +0 -1
  144. package/apps/web/.next/server/app/api/agents/[id]/logs/route_client-reference-manifest.js +0 -1
  145. package/apps/web/.next/server/app/api/agents/[id]/manifest/route.js +0 -1
  146. package/apps/web/.next/server/app/api/agents/[id]/manifest/route.js.nft.json +0 -1
  147. package/apps/web/.next/server/app/api/agents/[id]/manifest/route_client-reference-manifest.js +0 -1
  148. package/apps/web/.next/server/app/api/agents/[id]/mcps/route.js +0 -1
  149. package/apps/web/.next/server/app/api/agents/[id]/mcps/route.js.nft.json +0 -1
  150. package/apps/web/.next/server/app/api/agents/[id]/mcps/route_client-reference-manifest.js +0 -1
  151. package/apps/web/.next/server/app/api/agents/[id]/memories/[memId]/route.js +0 -1
  152. package/apps/web/.next/server/app/api/agents/[id]/memories/[memId]/route.js.nft.json +0 -1
  153. package/apps/web/.next/server/app/api/agents/[id]/memories/[memId]/route_client-reference-manifest.js +0 -1
  154. package/apps/web/.next/server/app/api/agents/[id]/memories/route.js +0 -1
  155. package/apps/web/.next/server/app/api/agents/[id]/memories/route.js.nft.json +0 -1
  156. package/apps/web/.next/server/app/api/agents/[id]/memories/route_client-reference-manifest.js +0 -1
  157. package/apps/web/.next/server/app/api/agents/[id]/permissions/route.js +0 -1
  158. package/apps/web/.next/server/app/api/agents/[id]/permissions/route.js.nft.json +0 -1
  159. package/apps/web/.next/server/app/api/agents/[id]/permissions/route_client-reference-manifest.js +0 -1
  160. package/apps/web/.next/server/app/api/agents/[id]/reload/route.js +0 -1
  161. package/apps/web/.next/server/app/api/agents/[id]/reload/route.js.nft.json +0 -1
  162. package/apps/web/.next/server/app/api/agents/[id]/reload/route_client-reference-manifest.js +0 -1
  163. package/apps/web/.next/server/app/api/agents/[id]/restrictions/route.js +0 -1
  164. package/apps/web/.next/server/app/api/agents/[id]/restrictions/route.js.nft.json +0 -1
  165. package/apps/web/.next/server/app/api/agents/[id]/restrictions/route_client-reference-manifest.js +0 -1
  166. package/apps/web/.next/server/app/api/agents/[id]/route.js +0 -33
  167. package/apps/web/.next/server/app/api/agents/[id]/route.js.nft.json +0 -1
  168. package/apps/web/.next/server/app/api/agents/[id]/route_client-reference-manifest.js +0 -1
  169. package/apps/web/.next/server/app/api/agents/[id]/skills/[skillId]/route.js +0 -1
  170. package/apps/web/.next/server/app/api/agents/[id]/skills/[skillId]/route.js.nft.json +0 -1
  171. package/apps/web/.next/server/app/api/agents/[id]/skills/[skillId]/route_client-reference-manifest.js +0 -1
  172. package/apps/web/.next/server/app/api/agents/[id]/skills/route.js +0 -1
  173. package/apps/web/.next/server/app/api/agents/[id]/skills/route.js.nft.json +0 -1
  174. package/apps/web/.next/server/app/api/agents/[id]/skills/route_client-reference-manifest.js +0 -1
  175. package/apps/web/.next/server/app/api/agents/[id]/slack-info/route.js +0 -1
  176. package/apps/web/.next/server/app/api/agents/[id]/slack-info/route.js.nft.json +0 -1
  177. package/apps/web/.next/server/app/api/agents/[id]/slack-info/route_client-reference-manifest.js +0 -1
  178. package/apps/web/.next/server/app/api/agents/[id]/snapshots/[sid]/restore/route.js +0 -1
  179. package/apps/web/.next/server/app/api/agents/[id]/snapshots/[sid]/restore/route.js.nft.json +0 -1
  180. package/apps/web/.next/server/app/api/agents/[id]/snapshots/[sid]/restore/route_client-reference-manifest.js +0 -1
  181. package/apps/web/.next/server/app/api/agents/[id]/snapshots/[sid]/route.js +0 -1
  182. package/apps/web/.next/server/app/api/agents/[id]/snapshots/[sid]/route.js.nft.json +0 -1
  183. package/apps/web/.next/server/app/api/agents/[id]/snapshots/[sid]/route_client-reference-manifest.js +0 -1
  184. package/apps/web/.next/server/app/api/agents/[id]/snapshots/route.js +0 -1
  185. package/apps/web/.next/server/app/api/agents/[id]/snapshots/route.js.nft.json +0 -1
  186. package/apps/web/.next/server/app/api/agents/[id]/snapshots/route_client-reference-manifest.js +0 -1
  187. package/apps/web/.next/server/app/api/agents/[id]/start/route.js +0 -1
  188. package/apps/web/.next/server/app/api/agents/[id]/start/route.js.nft.json +0 -1
  189. package/apps/web/.next/server/app/api/agents/[id]/start/route_client-reference-manifest.js +0 -1
  190. package/apps/web/.next/server/app/api/agents/[id]/stop/route.js +0 -1
  191. package/apps/web/.next/server/app/api/agents/[id]/stop/route.js.nft.json +0 -1
  192. package/apps/web/.next/server/app/api/agents/[id]/stop/route_client-reference-manifest.js +0 -1
  193. package/apps/web/.next/server/app/api/agents/route.js +0 -91
  194. package/apps/web/.next/server/app/api/agents/route.js.nft.json +0 -1
  195. package/apps/web/.next/server/app/api/agents/route_client-reference-manifest.js +0 -1
  196. package/apps/web/.next/server/app/api/auth/login/route.js +0 -1
  197. package/apps/web/.next/server/app/api/auth/login/route.js.nft.json +0 -1
  198. package/apps/web/.next/server/app/api/auth/login/route_client-reference-manifest.js +0 -1
  199. package/apps/web/.next/server/app/api/auth/logout/route.js +0 -1
  200. package/apps/web/.next/server/app/api/auth/logout/route.js.nft.json +0 -1
  201. package/apps/web/.next/server/app/api/auth/logout/route_client-reference-manifest.js +0 -1
  202. package/apps/web/.next/server/app/api/auth/me/route.js +0 -1
  203. package/apps/web/.next/server/app/api/auth/me/route.js.nft.json +0 -1
  204. package/apps/web/.next/server/app/api/auth/me/route_client-reference-manifest.js +0 -1
  205. package/apps/web/.next/server/app/api/auth/users/[id]/route.js +0 -1
  206. package/apps/web/.next/server/app/api/auth/users/[id]/route.js.nft.json +0 -1
  207. package/apps/web/.next/server/app/api/auth/users/[id]/route_client-reference-manifest.js +0 -1
  208. package/apps/web/.next/server/app/api/auth/users/route.js +0 -1
  209. package/apps/web/.next/server/app/api/auth/users/route.js.nft.json +0 -1
  210. package/apps/web/.next/server/app/api/auth/users/route_client-reference-manifest.js +0 -1
  211. package/apps/web/.next/server/app/api/env-vars/[key]/route.js +0 -1
  212. package/apps/web/.next/server/app/api/env-vars/[key]/route.js.nft.json +0 -1
  213. package/apps/web/.next/server/app/api/env-vars/[key]/route_client-reference-manifest.js +0 -1
  214. package/apps/web/.next/server/app/api/env-vars/route.js +0 -1
  215. package/apps/web/.next/server/app/api/env-vars/route.js.nft.json +0 -1
  216. package/apps/web/.next/server/app/api/env-vars/route_client-reference-manifest.js +0 -1
  217. package/apps/web/.next/server/app/api/jobs/[id]/route.js +0 -1
  218. package/apps/web/.next/server/app/api/jobs/[id]/route.js.nft.json +0 -1
  219. package/apps/web/.next/server/app/api/jobs/[id]/route_client-reference-manifest.js +0 -1
  220. package/apps/web/.next/server/app/api/jobs/[id]/runs/route.js +0 -1
  221. package/apps/web/.next/server/app/api/jobs/[id]/runs/route.js.nft.json +0 -1
  222. package/apps/web/.next/server/app/api/jobs/[id]/runs/route_client-reference-manifest.js +0 -1
  223. package/apps/web/.next/server/app/api/jobs/route.js +0 -1
  224. package/apps/web/.next/server/app/api/jobs/route.js.nft.json +0 -1
  225. package/apps/web/.next/server/app/api/jobs/route_client-reference-manifest.js +0 -1
  226. package/apps/web/.next/server/app/api/mcps/[id]/route.js +0 -1
  227. package/apps/web/.next/server/app/api/mcps/[id]/route.js.nft.json +0 -1
  228. package/apps/web/.next/server/app/api/mcps/[id]/route_client-reference-manifest.js +0 -1
  229. package/apps/web/.next/server/app/api/mcps/[id]/test/route.js +0 -1
  230. package/apps/web/.next/server/app/api/mcps/[id]/test/route.js.nft.json +0 -1
  231. package/apps/web/.next/server/app/api/mcps/[id]/test/route_client-reference-manifest.js +0 -1
  232. package/apps/web/.next/server/app/api/mcps/route.js +0 -1
  233. package/apps/web/.next/server/app/api/mcps/route.js.nft.json +0 -1
  234. package/apps/web/.next/server/app/api/mcps/route_client-reference-manifest.js +0 -1
  235. package/apps/web/.next/server/app/api/settings/route.js +0 -1
  236. package/apps/web/.next/server/app/api/settings/route.js.nft.json +0 -1
  237. package/apps/web/.next/server/app/api/settings/route_client-reference-manifest.js +0 -1
  238. package/apps/web/.next/server/app/icon.svg/route.js +0 -1
  239. package/apps/web/.next/server/app/icon.svg/route.js.nft.json +0 -1
  240. package/apps/web/.next/server/app/jobs/page.js +0 -2
  241. package/apps/web/.next/server/app/jobs/page.js.nft.json +0 -1
  242. package/apps/web/.next/server/app/jobs/page_client-reference-manifest.js +0 -1
  243. package/apps/web/.next/server/app/login/page.js +0 -2
  244. package/apps/web/.next/server/app/login/page.js.nft.json +0 -1
  245. package/apps/web/.next/server/app/login/page_client-reference-manifest.js +0 -1
  246. package/apps/web/.next/server/app/page.js +0 -2
  247. package/apps/web/.next/server/app/page.js.nft.json +0 -1
  248. package/apps/web/.next/server/app/page_client-reference-manifest.js +0 -1
  249. package/apps/web/.next/server/app/settings/env-vars/page.js +0 -2
  250. package/apps/web/.next/server/app/settings/env-vars/page.js.nft.json +0 -1
  251. package/apps/web/.next/server/app/settings/env-vars/page_client-reference-manifest.js +0 -1
  252. package/apps/web/.next/server/app/settings/mcps/page.js +0 -2
  253. package/apps/web/.next/server/app/settings/mcps/page.js.nft.json +0 -1
  254. package/apps/web/.next/server/app/settings/mcps/page_client-reference-manifest.js +0 -1
  255. package/apps/web/.next/server/app/settings/page.js +0 -2
  256. package/apps/web/.next/server/app/settings/page.js.nft.json +0 -1
  257. package/apps/web/.next/server/app/settings/page_client-reference-manifest.js +0 -1
  258. package/apps/web/.next/server/app-paths-manifest.json +0 -46
  259. package/apps/web/.next/server/chunks/1157.js +0 -9
  260. package/apps/web/.next/server/chunks/2287.js +0 -1
  261. package/apps/web/.next/server/chunks/3444.js +0 -1
  262. package/apps/web/.next/server/chunks/383.js +0 -6
  263. package/apps/web/.next/server/chunks/4012.js +0 -58
  264. package/apps/web/.next/server/chunks/6791.js +0 -1
  265. package/apps/web/.next/server/chunks/7171.js +0 -1
  266. package/apps/web/.next/server/chunks/8819.js +0 -22
  267. package/apps/web/.next/server/edge-runtime-webpack.js +0 -2
  268. package/apps/web/.next/server/edge-runtime-webpack.js.map +0 -1
  269. package/apps/web/.next/server/interception-route-rewrite-manifest.js +0 -1
  270. package/apps/web/.next/server/middleware-build-manifest.js +0 -1
  271. package/apps/web/.next/server/middleware-manifest.json +0 -32
  272. package/apps/web/.next/server/middleware-react-loadable-manifest.js +0 -1
  273. package/apps/web/.next/server/next-font-manifest.js +0 -1
  274. package/apps/web/.next/server/next-font-manifest.json +0 -1
  275. package/apps/web/.next/server/pages/_app.js +0 -1
  276. package/apps/web/.next/server/pages/_app.js.nft.json +0 -1
  277. package/apps/web/.next/server/pages/_document.js +0 -1
  278. package/apps/web/.next/server/pages/_document.js.nft.json +0 -1
  279. package/apps/web/.next/server/pages/_error.js +0 -19
  280. package/apps/web/.next/server/pages/_error.js.nft.json +0 -1
  281. package/apps/web/.next/server/pages-manifest.json +0 -5
  282. package/apps/web/.next/server/server-reference-manifest.js +0 -1
  283. package/apps/web/.next/server/server-reference-manifest.json +0 -1
  284. package/apps/web/.next/server/src/middleware.js +0 -14
  285. package/apps/web/.next/server/src/middleware.js.map +0 -1
  286. package/apps/web/.next/server/webpack-runtime.js +0 -1
  287. package/apps/web/.next/static/chunks/18-90b700ea37b686a2.js +0 -1
  288. package/apps/web/.next/static/chunks/87c73c54-24122e7b92478d00.js +0 -1
  289. package/apps/web/.next/static/chunks/9664-af80478aa73ba424.js +0 -1
  290. package/apps/web/.next/static/chunks/app/_not-found/page-b9cee17ed89ca24a.js +0 -1
  291. package/apps/web/.next/static/chunks/app/agents/[slug]/page-18369fc3fe1a9a7b.js +0 -1
  292. package/apps/web/.next/static/chunks/app/agents/new/page-bf11cf8901c7e2cd.js +0 -1
  293. package/apps/web/.next/static/chunks/app/api/agents/[id]/access/route-07f0f73ac9839899.js +0 -1
  294. package/apps/web/.next/static/chunks/app/api/agents/[id]/claude-md/route-07f0f73ac9839899.js +0 -1
  295. package/apps/web/.next/static/chunks/app/api/agents/[id]/logs/route-07f0f73ac9839899.js +0 -1
  296. package/apps/web/.next/static/chunks/app/api/agents/[id]/manifest/route-07f0f73ac9839899.js +0 -1
  297. package/apps/web/.next/static/chunks/app/api/agents/[id]/mcps/route-07f0f73ac9839899.js +0 -1
  298. package/apps/web/.next/static/chunks/app/api/agents/[id]/memories/[memId]/route-07f0f73ac9839899.js +0 -1
  299. package/apps/web/.next/static/chunks/app/api/agents/[id]/memories/route-07f0f73ac9839899.js +0 -1
  300. package/apps/web/.next/static/chunks/app/api/agents/[id]/permissions/route-07f0f73ac9839899.js +0 -1
  301. package/apps/web/.next/static/chunks/app/api/agents/[id]/reload/route-07f0f73ac9839899.js +0 -1
  302. package/apps/web/.next/static/chunks/app/api/agents/[id]/restrictions/route-07f0f73ac9839899.js +0 -1
  303. package/apps/web/.next/static/chunks/app/api/agents/[id]/route-07f0f73ac9839899.js +0 -1
  304. package/apps/web/.next/static/chunks/app/api/agents/[id]/skills/[skillId]/route-07f0f73ac9839899.js +0 -1
  305. package/apps/web/.next/static/chunks/app/api/agents/[id]/skills/route-07f0f73ac9839899.js +0 -1
  306. package/apps/web/.next/static/chunks/app/api/agents/[id]/slack-info/route-07f0f73ac9839899.js +0 -1
  307. package/apps/web/.next/static/chunks/app/api/agents/[id]/snapshots/[sid]/restore/route-07f0f73ac9839899.js +0 -1
  308. package/apps/web/.next/static/chunks/app/api/agents/[id]/snapshots/[sid]/route-07f0f73ac9839899.js +0 -1
  309. package/apps/web/.next/static/chunks/app/api/agents/[id]/snapshots/route-07f0f73ac9839899.js +0 -1
  310. package/apps/web/.next/static/chunks/app/api/agents/[id]/start/route-07f0f73ac9839899.js +0 -1
  311. package/apps/web/.next/static/chunks/app/api/agents/[id]/stop/route-07f0f73ac9839899.js +0 -1
  312. package/apps/web/.next/static/chunks/app/api/agents/route-07f0f73ac9839899.js +0 -1
  313. package/apps/web/.next/static/chunks/app/api/auth/login/route-07f0f73ac9839899.js +0 -1
  314. package/apps/web/.next/static/chunks/app/api/auth/logout/route-07f0f73ac9839899.js +0 -1
  315. package/apps/web/.next/static/chunks/app/api/auth/me/route-07f0f73ac9839899.js +0 -1
  316. package/apps/web/.next/static/chunks/app/api/auth/users/[id]/route-07f0f73ac9839899.js +0 -1
  317. package/apps/web/.next/static/chunks/app/api/auth/users/route-07f0f73ac9839899.js +0 -1
  318. package/apps/web/.next/static/chunks/app/api/env-vars/[key]/route-07f0f73ac9839899.js +0 -1
  319. package/apps/web/.next/static/chunks/app/api/env-vars/route-07f0f73ac9839899.js +0 -1
  320. package/apps/web/.next/static/chunks/app/api/jobs/[id]/route-07f0f73ac9839899.js +0 -1
  321. package/apps/web/.next/static/chunks/app/api/jobs/[id]/runs/route-07f0f73ac9839899.js +0 -1
  322. package/apps/web/.next/static/chunks/app/api/jobs/route-07f0f73ac9839899.js +0 -1
  323. package/apps/web/.next/static/chunks/app/api/mcps/[id]/route-07f0f73ac9839899.js +0 -1
  324. package/apps/web/.next/static/chunks/app/api/mcps/[id]/test/route-07f0f73ac9839899.js +0 -1
  325. package/apps/web/.next/static/chunks/app/api/mcps/route-07f0f73ac9839899.js +0 -1
  326. package/apps/web/.next/static/chunks/app/api/settings/route-07f0f73ac9839899.js +0 -1
  327. package/apps/web/.next/static/chunks/app/jobs/page-f5aa89a47c50efd8.js +0 -1
  328. package/apps/web/.next/static/chunks/app/layout-2079f4964aa7314e.js +0 -1
  329. package/apps/web/.next/static/chunks/app/login/layout-07f0f73ac9839899.js +0 -1
  330. package/apps/web/.next/static/chunks/app/login/page-aa259283dc38e8f9.js +0 -1
  331. package/apps/web/.next/static/chunks/app/page-e83437b608104dff.js +0 -1
  332. package/apps/web/.next/static/chunks/app/settings/env-vars/page-06479dbdfb78b76b.js +0 -1
  333. package/apps/web/.next/static/chunks/app/settings/mcps/page-75650686ed6490c7.js +0 -1
  334. package/apps/web/.next/static/chunks/app/settings/page-e1e62fc41ff6cddd.js +0 -1
  335. package/apps/web/.next/static/chunks/framework-811407f832a33072.js +0 -1
  336. package/apps/web/.next/static/chunks/main-3f1cddbdd67b1546.js +0 -1
  337. package/apps/web/.next/static/chunks/main-app-cebd8a6a5ccbf72d.js +0 -1
  338. package/apps/web/.next/static/chunks/pages/_app-50fa07b56b2d29ac.js +0 -1
  339. package/apps/web/.next/static/chunks/pages/_error-fed8688bdd23f211.js +0 -1
  340. package/apps/web/.next/static/chunks/polyfills-42372ed130431b0a.js +0 -1
  341. package/apps/web/.next/static/chunks/webpack-6c05566dba553c97.js +0 -1
  342. package/apps/web/.next/static/css/15371687405525e2.css +0 -5
  343. package/apps/web/.next/static/ikfNbLhuw7jntn35bz0lk/_buildManifest.js +0 -1
  344. package/apps/web/.next/static/ikfNbLhuw7jntn35bz0lk/_ssgManifest.js +0 -1
  345. package/apps/web/.next/trace +0 -5
  346. package/apps/web/.next/types/app/agents/[slug]/page.ts +0 -84
  347. package/apps/web/.next/types/app/agents/new/page.ts +0 -84
  348. package/apps/web/.next/types/app/api/agents/[id]/access/route.ts +0 -347
  349. package/apps/web/.next/types/app/api/agents/[id]/claude-md/route.ts +0 -347
  350. package/apps/web/.next/types/app/api/agents/[id]/logs/route.ts +0 -347
  351. package/apps/web/.next/types/app/api/agents/[id]/manifest/route.ts +0 -347
  352. package/apps/web/.next/types/app/api/agents/[id]/mcps/route.ts +0 -347
  353. package/apps/web/.next/types/app/api/agents/[id]/memories/[memId]/route.ts +0 -347
  354. package/apps/web/.next/types/app/api/agents/[id]/memories/route.ts +0 -347
  355. package/apps/web/.next/types/app/api/agents/[id]/permissions/route.ts +0 -347
  356. package/apps/web/.next/types/app/api/agents/[id]/reload/route.ts +0 -347
  357. package/apps/web/.next/types/app/api/agents/[id]/restrictions/route.ts +0 -347
  358. package/apps/web/.next/types/app/api/agents/[id]/route.ts +0 -347
  359. package/apps/web/.next/types/app/api/agents/[id]/skills/[skillId]/route.ts +0 -347
  360. package/apps/web/.next/types/app/api/agents/[id]/skills/route.ts +0 -347
  361. package/apps/web/.next/types/app/api/agents/[id]/slack-info/route.ts +0 -347
  362. package/apps/web/.next/types/app/api/agents/[id]/snapshots/[sid]/restore/route.ts +0 -347
  363. package/apps/web/.next/types/app/api/agents/[id]/snapshots/[sid]/route.ts +0 -347
  364. package/apps/web/.next/types/app/api/agents/[id]/snapshots/route.ts +0 -347
  365. package/apps/web/.next/types/app/api/agents/[id]/start/route.ts +0 -347
  366. package/apps/web/.next/types/app/api/agents/[id]/stop/route.ts +0 -347
  367. package/apps/web/.next/types/app/api/agents/route.ts +0 -347
  368. package/apps/web/.next/types/app/api/auth/login/route.ts +0 -347
  369. package/apps/web/.next/types/app/api/auth/logout/route.ts +0 -347
  370. package/apps/web/.next/types/app/api/auth/me/route.ts +0 -347
  371. package/apps/web/.next/types/app/api/auth/users/[id]/route.ts +0 -347
  372. package/apps/web/.next/types/app/api/auth/users/route.ts +0 -347
  373. package/apps/web/.next/types/app/api/env-vars/[key]/route.ts +0 -347
  374. package/apps/web/.next/types/app/api/env-vars/route.ts +0 -347
  375. package/apps/web/.next/types/app/api/jobs/[id]/route.ts +0 -347
  376. package/apps/web/.next/types/app/api/jobs/[id]/runs/route.ts +0 -347
  377. package/apps/web/.next/types/app/api/jobs/route.ts +0 -347
  378. package/apps/web/.next/types/app/api/mcps/[id]/route.ts +0 -347
  379. package/apps/web/.next/types/app/api/mcps/[id]/test/route.ts +0 -347
  380. package/apps/web/.next/types/app/api/mcps/route.ts +0 -347
  381. package/apps/web/.next/types/app/api/settings/route.ts +0 -347
  382. package/apps/web/.next/types/app/jobs/page.ts +0 -84
  383. package/apps/web/.next/types/app/login/layout.ts +0 -84
  384. package/apps/web/.next/types/app/login/page.ts +0 -84
  385. package/apps/web/.next/types/app/page.ts +0 -84
  386. package/apps/web/.next/types/app/settings/env-vars/page.ts +0 -84
  387. package/apps/web/.next/types/app/settings/mcps/page.ts +0 -84
  388. package/apps/web/.next/types/app/settings/page.ts +0 -84
  389. package/apps/web/.next/types/cache-life.d.ts +0 -141
  390. package/apps/web/.next/types/package.json +0 -1
  391. package/apps/web/.next/types/routes.d.ts +0 -114
  392. package/apps/web/.next/types/validator.ts +0 -448
  393. package/apps/web/Dockerfile +0 -37
  394. package/apps/web/next-env.d.ts +0 -6
  395. package/apps/web/next.config.js +0 -6
  396. package/apps/web/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
  397. package/apps/web/package.json +0 -48
  398. package/apps/web/postcss.config.js +0 -3
  399. package/apps/web/public/logo.svg +0 -17
  400. package/apps/web/src/app/agents/[slug]/page.tsx +0 -2235
  401. package/apps/web/src/app/agents/new/page.tsx +0 -1161
  402. package/apps/web/src/app/api/agents/[id]/access/route.ts +0 -76
  403. package/apps/web/src/app/api/agents/[id]/claude-md/route.ts +0 -111
  404. package/apps/web/src/app/api/agents/[id]/logs/route.ts +0 -84
  405. package/apps/web/src/app/api/agents/[id]/manifest/route.ts +0 -32
  406. package/apps/web/src/app/api/agents/[id]/mcps/route.ts +0 -73
  407. package/apps/web/src/app/api/agents/[id]/memories/[memId]/route.ts +0 -31
  408. package/apps/web/src/app/api/agents/[id]/memories/route.ts +0 -56
  409. package/apps/web/src/app/api/agents/[id]/permissions/route.ts +0 -74
  410. package/apps/web/src/app/api/agents/[id]/reload/route.ts +0 -33
  411. package/apps/web/src/app/api/agents/[id]/restrictions/route.ts +0 -85
  412. package/apps/web/src/app/api/agents/[id]/route.ts +0 -81
  413. package/apps/web/src/app/api/agents/[id]/skills/[skillId]/route.ts +0 -52
  414. package/apps/web/src/app/api/agents/[id]/skills/route.ts +0 -80
  415. package/apps/web/src/app/api/agents/[id]/slack-info/route.ts +0 -38
  416. package/apps/web/src/app/api/agents/[id]/snapshots/[sid]/restore/route.ts +0 -61
  417. package/apps/web/src/app/api/agents/[id]/snapshots/[sid]/route.ts +0 -53
  418. package/apps/web/src/app/api/agents/[id]/snapshots/route.ts +0 -84
  419. package/apps/web/src/app/api/agents/[id]/start/route.ts +0 -35
  420. package/apps/web/src/app/api/agents/[id]/stop/route.ts +0 -35
  421. package/apps/web/src/app/api/agents/route.ts +0 -99
  422. package/apps/web/src/app/api/auth/login/route.ts +0 -39
  423. package/apps/web/src/app/api/auth/logout/route.ts +0 -21
  424. package/apps/web/src/app/api/auth/me/route.ts +0 -24
  425. package/apps/web/src/app/api/auth/users/[id]/route.ts +0 -48
  426. package/apps/web/src/app/api/auth/users/route.ts +0 -63
  427. package/apps/web/src/app/api/env-vars/[key]/route.ts +0 -66
  428. package/apps/web/src/app/api/env-vars/route.ts +0 -59
  429. package/apps/web/src/app/api/jobs/[id]/route.ts +0 -51
  430. package/apps/web/src/app/api/jobs/[id]/runs/route.ts +0 -24
  431. package/apps/web/src/app/api/jobs/route.ts +0 -42
  432. package/apps/web/src/app/api/mcps/[id]/route.ts +0 -60
  433. package/apps/web/src/app/api/mcps/[id]/test/route.ts +0 -195
  434. package/apps/web/src/app/api/mcps/route.ts +0 -72
  435. package/apps/web/src/app/api/settings/route.ts +0 -42
  436. package/apps/web/src/app/globals.css +0 -124
  437. package/apps/web/src/app/icon.svg +0 -17
  438. package/apps/web/src/app/jobs/page.tsx +0 -543
  439. package/apps/web/src/app/layout-shell.tsx +0 -89
  440. package/apps/web/src/app/layout.tsx +0 -18
  441. package/apps/web/src/app/login/layout.tsx +0 -9
  442. package/apps/web/src/app/login/page.tsx +0 -150
  443. package/apps/web/src/app/page.tsx +0 -573
  444. package/apps/web/src/app/settings/env-vars/page.tsx +0 -216
  445. package/apps/web/src/app/settings/mcps/page.tsx +0 -763
  446. package/apps/web/src/app/settings/page.tsx +0 -528
  447. package/apps/web/src/app/sidebar.tsx +0 -345
  448. package/apps/web/src/lib/__tests__/api-guard.test.ts +0 -189
  449. package/apps/web/src/lib/__tests__/auth.test.ts +0 -262
  450. package/apps/web/src/lib/__tests__/boss-registry.test.ts +0 -323
  451. package/apps/web/src/lib/__tests__/compile.test.ts +0 -161
  452. package/apps/web/src/lib/__tests__/db-agent-hierarchy.test.ts +0 -136
  453. package/apps/web/src/lib/__tests__/db-env-vars.test.ts +0 -216
  454. package/apps/web/src/lib/__tests__/db-restrictions.test.ts +0 -117
  455. package/apps/web/src/lib/__tests__/db.integration.test.ts +0 -271
  456. package/apps/web/src/lib/__tests__/diff.test.ts +0 -102
  457. package/apps/web/src/lib/__tests__/mcp-mask.test.ts +0 -274
  458. package/apps/web/src/lib/__tests__/skill-templates.test.ts +0 -237
  459. package/apps/web/src/lib/__tests__/slack-manifest.test.ts +0 -105
  460. package/apps/web/src/lib/api-guard.ts +0 -68
  461. package/apps/web/src/lib/auth-context.tsx +0 -71
  462. package/apps/web/src/lib/auth.ts +0 -128
  463. package/apps/web/src/lib/boss-registry.ts +0 -90
  464. package/apps/web/src/lib/compile.ts +0 -51
  465. package/apps/web/src/lib/db.ts +0 -1196
  466. package/apps/web/src/lib/diff.ts +0 -43
  467. package/apps/web/src/lib/mcp-mask.ts +0 -91
  468. package/apps/web/src/lib/portal.tsx +0 -23
  469. package/apps/web/src/lib/skill-templates.ts +0 -148
  470. package/apps/web/src/lib/slack-manifest.ts +0 -85
  471. package/apps/web/src/middleware.ts +0 -68
  472. package/apps/web/tailwind.config.js +0 -6
  473. package/apps/web/tsconfig.json +0 -23
  474. package/apps/web/vitest.config.mts +0 -21
  475. package/cli/.claude/settings.local.json +0 -6
  476. package/cli/node_modules/.package-lock.json +0 -427
  477. package/cli/node_modules/commander/LICENSE +0 -22
  478. package/cli/node_modules/commander/Readme.md +0 -1157
  479. package/cli/node_modules/commander/esm.mjs +0 -16
  480. package/cli/node_modules/commander/index.js +0 -24
  481. package/cli/node_modules/commander/lib/argument.js +0 -149
  482. package/cli/node_modules/commander/lib/command.js +0 -2509
  483. package/cli/node_modules/commander/lib/error.js +0 -39
  484. package/cli/node_modules/commander/lib/help.js +0 -520
  485. package/cli/node_modules/commander/lib/option.js +0 -330
  486. package/cli/node_modules/commander/lib/suggestSimilar.js +0 -101
  487. package/cli/node_modules/commander/package-support.json +0 -16
  488. package/cli/node_modules/commander/package.json +0 -84
  489. package/cli/node_modules/commander/typings/esm.d.mts +0 -3
  490. package/cli/node_modules/commander/typings/index.d.ts +0 -969
  491. package/cli/package-lock.json +0 -449
  492. package/cli/package.json +0 -44
  493. package/cli/src/commands/init.ts +0 -514
  494. package/cli/src/commands/manage.ts +0 -115
  495. package/cli/src/index.ts +0 -63
  496. package/cli/tsconfig.json +0 -14
  497. package/docker-compose.yml +0 -122
  498. package/docs/agents/boss-agents.mdx +0 -108
  499. package/docs/agents/creating-agents.mdx +0 -132
  500. package/docs/agents/memory.mdx +0 -113
  501. package/docs/agents/tools.mdx +0 -103
  502. package/docs/configuration/env-vars.mdx +0 -166
  503. package/docs/configuration/mcp-servers.mdx +0 -203
  504. package/docs/configuration/slack-app.mdx +0 -175
  505. package/docs/docs.json +0 -79
  506. package/docs/favicon.svg +0 -17
  507. package/docs/features/history.mdx +0 -60
  508. package/docs/features/import-export.mdx +0 -77
  509. package/docs/features/logs.mdx +0 -131
  510. package/docs/features/multi-workspace.mdx +0 -90
  511. package/docs/features/scheduled-jobs.mdx +0 -231
  512. package/docs/features/users.mdx +0 -92
  513. package/docs/introduction.mdx +0 -160
  514. package/docs/logo/dark.svg +0 -17
  515. package/docs/logo/light.svg +0 -17
  516. package/docs/logo/wide-dark.svg +0 -12
  517. package/docs/logo/wide-light.svg +0 -12
  518. package/docs/quickstart.mdx +0 -270
  519. package/docs/self-hosting/docker.mdx +0 -151
  520. package/docs/self-hosting/production.mdx +0 -176
  521. package/packages/shared/dist/index.d.ts +0 -8
  522. package/packages/shared/dist/index.d.ts.map +0 -1
  523. package/packages/shared/dist/index.js +0 -24
  524. package/packages/shared/dist/index.js.map +0 -1
  525. package/packages/shared/dist/types.d.ts +0 -584
  526. package/packages/shared/dist/types.d.ts.map +0 -1
  527. package/packages/shared/dist/types.js +0 -39
  528. package/packages/shared/dist/types.js.map +0 -1
  529. package/packages/shared/package.json +0 -15
  530. package/packages/shared/src/db/schema.sql +0 -354
  531. package/packages/shared/src/index.ts +0 -8
  532. package/packages/shared/src/types.ts +0 -683
  533. package/packages/shared/tsconfig.json +0 -17
  534. package/scripts/dev.sh +0 -45
@@ -1,495 +0,0 @@
1
- /**
2
- * @fileoverview Unit tests for Slack formatting functions in slack-handler.ts.
3
- *
4
- * Covers: formatMessage, stripBotMention, splitTextForBlocks, isSeparatorLine,
5
- * extractFirstMarkdownTable, parseMarkdownTable, buildSlackTableBlock,
6
- * buildMessagePayloads, and formatToolStatus.
7
- *
8
- * No Slack API or database connection required — all pure functions.
9
- *
10
- * @module runner/__tests__/slack-formatting.test
11
- */
12
-
13
- import { describe, it, expect } from 'vitest';
14
- import {
15
- formatMessage,
16
- stripBotMention,
17
- splitTextForBlocks,
18
- isSeparatorLine,
19
- extractFirstMarkdownTable,
20
- parseMarkdownTable,
21
- buildSlackTableBlock,
22
- buildMessagePayloads,
23
- formatToolStatus,
24
- } from '../slack-handler';
25
-
26
- // ─── stripBotMention ──────────────────────────────────────────────────────────
27
-
28
- describe('stripBotMention', () => {
29
- it('removes <@BOT_ID> from the start of text', () => {
30
- expect(stripBotMention('<@U123> hello', 'U123')).toBe('hello');
31
- });
32
-
33
- it('removes multiple mentions', () => {
34
- expect(stripBotMention('<@U123> hey <@U123> there', 'U123')).toBe('hey there');
35
- });
36
-
37
- it('returns text unchanged when botUserId is undefined', () => {
38
- expect(stripBotMention('<@U123> hello', undefined)).toBe('<@U123> hello');
39
- });
40
-
41
- it('returns text unchanged when mention is not present', () => {
42
- expect(stripBotMention('just a message', 'U123')).toBe('just a message');
43
- });
44
-
45
- it('handles empty string', () => {
46
- expect(stripBotMention('', 'U123')).toBe('');
47
- });
48
- });
49
-
50
- // ─── formatMessage ────────────────────────────────────────────────────────────
51
-
52
- describe('formatMessage', () => {
53
- it('converts **bold** to *bold*', () => {
54
- expect(formatMessage('**hello world**', false)).toBe('*hello world*');
55
- });
56
-
57
- it('converts __italic__ to _italic_', () => {
58
- expect(formatMessage('__hello world__', false)).toBe('_hello world_');
59
- });
60
-
61
- it('converts heading to *bold*', () => {
62
- expect(formatMessage('## Section Title', false)).toBe('*Section Title*');
63
- });
64
-
65
- it('converts h1 heading', () => {
66
- expect(formatMessage('# Top Level', false)).toBe('*Top Level*');
67
- });
68
-
69
- it('converts h6 heading', () => {
70
- expect(formatMessage('###### Deep', false)).toBe('*Deep*');
71
- });
72
-
73
- it('removes HR lines (---)', () => {
74
- const result = formatMessage('above\n---\nbelow', false);
75
- expect(result).not.toContain('---');
76
- expect(result).toContain('above');
77
- expect(result).toContain('below');
78
- });
79
-
80
- it('removes HR lines (***)', () => {
81
- const result = formatMessage('above\n***\nbelow', false);
82
- expect(result).not.toContain('***');
83
- });
84
-
85
- it('preserves code blocks as-is', () => {
86
- const input = 'Look at this:\n```python\nprint("hello")\n```\nDone.';
87
- const result = formatMessage(input, false);
88
- expect(result).toContain('```\nprint("hello")\n```');
89
- });
90
-
91
- it('strips language hint from code block', () => {
92
- const result = formatMessage('```javascript\nconst x = 1;\n```', false);
93
- expect(result).toBe('```\nconst x = 1;\n```');
94
- });
95
-
96
- it('does not convert **bold** inside code blocks', () => {
97
- const result = formatMessage('```\n**not bold**\n```', false);
98
- expect(result).toContain('**not bold**');
99
- });
100
-
101
- it('handles text with no formatting', () => {
102
- expect(formatMessage('plain text', false)).toBe('plain text');
103
- });
104
-
105
- it('handles empty string', () => {
106
- expect(formatMessage('', false)).toBe('');
107
- });
108
-
109
- it('handles multiple bold spans in one line', () => {
110
- const result = formatMessage('**a** and **b**', false);
111
- expect(result).toBe('*a* and *b*');
112
- });
113
- });
114
-
115
- // ─── splitTextForBlocks ───────────────────────────────────────────────────────
116
-
117
- describe('splitTextForBlocks', () => {
118
- it('returns single chunk for text under 3000 chars', () => {
119
- const text = 'hello world';
120
- expect(splitTextForBlocks(text)).toEqual([text]);
121
- });
122
-
123
- it('splits text over 3000 chars into multiple chunks', () => {
124
- const text = 'a'.repeat(3500);
125
- const chunks = splitTextForBlocks(text);
126
- expect(chunks.length).toBeGreaterThan(1);
127
- expect(chunks.join('')).toBe(text);
128
- });
129
-
130
- it('splits at newline boundary when possible', () => {
131
- const line = 'x'.repeat(100);
132
- const text = Array(35).fill(line).join('\n'); // ~3535 chars with newlines
133
- const chunks = splitTextForBlocks(text);
134
- for (const chunk of chunks) {
135
- expect(chunk.length).toBeLessThanOrEqual(3000);
136
- }
137
- });
138
-
139
- it('handles exactly 3000 chars as single chunk', () => {
140
- const text = 'a'.repeat(3000);
141
- expect(splitTextForBlocks(text)).toEqual([text]);
142
- });
143
- });
144
-
145
- // ─── isSeparatorLine ─────────────────────────────────────────────────────────
146
-
147
- describe('isSeparatorLine', () => {
148
- it('returns true for standard separator | --- | --- |', () => {
149
- expect(isSeparatorLine('| --- | --- |')).toBe(true);
150
- });
151
-
152
- it('returns true for separator with alignment colons', () => {
153
- expect(isSeparatorLine('| :--- | ---: | :---: |')).toBe(true);
154
- });
155
-
156
- it('returns true for separator without pipes', () => {
157
- expect(isSeparatorLine('--- | --- | ---')).toBe(true);
158
- });
159
-
160
- it('returns false for a normal text row', () => {
161
- expect(isSeparatorLine('| Name | Value |')).toBe(false);
162
- });
163
-
164
- it('returns false for empty string', () => {
165
- expect(isSeparatorLine('')).toBe(false);
166
- });
167
-
168
- it('returns false for a line with only spaces', () => {
169
- expect(isSeparatorLine(' ')).toBe(false);
170
- });
171
- });
172
-
173
- // ─── extractFirstMarkdownTable ────────────────────────────────────────────────
174
-
175
- describe('extractFirstMarkdownTable', () => {
176
- const simpleTable = '| A | B |\n| --- | --- |\n| 1 | 2 |';
177
-
178
- it('returns null for text with no table', () => {
179
- expect(extractFirstMarkdownTable('just plain text')).toBeNull();
180
- });
181
-
182
- it('extracts a bare pipe table', () => {
183
- const result = extractFirstMarkdownTable(simpleTable);
184
- expect(result).not.toBeNull();
185
- expect(result!.tableLines.length).toBeGreaterThanOrEqual(3);
186
- });
187
-
188
- it('splits before/after text correctly', () => {
189
- const text = `intro text\n${simpleTable}\noutro text`;
190
- const result = extractFirstMarkdownTable(text);
191
- expect(result).not.toBeNull();
192
- expect(result!.before).toContain('intro text');
193
- expect(result!.after).toContain('outro text');
194
- });
195
-
196
- it('returns null for table without separator line', () => {
197
- const noSep = '| A | B |\n| 1 | 2 |\n| 3 | 4 |';
198
- expect(extractFirstMarkdownTable(noSep)).toBeNull();
199
- });
200
-
201
- it('extracts table from inside a code block', () => {
202
- const text = '```\n| A | B |\n| --- | --- |\n| 1 | 2 |\n```';
203
- const result = extractFirstMarkdownTable(text);
204
- expect(result).not.toBeNull();
205
- });
206
- });
207
-
208
- // ─── parseMarkdownTable ───────────────────────────────────────────────────────
209
-
210
- describe('parseMarkdownTable', () => {
211
- const lines = ['| Name | Value | Score |', '| --- | ---: | :---: |', '| Alice | 100 | A |', '| Bob | 200 | B |'];
212
-
213
- it('extracts headers correctly', () => {
214
- const { headers } = parseMarkdownTable(lines);
215
- expect(headers).toEqual(['Name', 'Value', 'Score']);
216
- });
217
-
218
- it('extracts rows correctly', () => {
219
- const { rows } = parseMarkdownTable(lines);
220
- expect(rows).toHaveLength(2);
221
- expect(rows[0]).toEqual(['Alice', '100', 'A']);
222
- expect(rows[1]).toEqual(['Bob', '200', 'B']);
223
- });
224
-
225
- it('detects right alignment from ---:', () => {
226
- const { alignments } = parseMarkdownTable(lines);
227
- expect(alignments[1]).toBe('right');
228
- });
229
-
230
- it('detects center alignment from :---:', () => {
231
- const { alignments } = parseMarkdownTable(lines);
232
- expect(alignments[2]).toBe('center');
233
- });
234
-
235
- it('defaults to left alignment', () => {
236
- const { alignments } = parseMarkdownTable(lines);
237
- expect(alignments[0]).toBe('left');
238
- });
239
-
240
- it('handles single-column table', () => {
241
- const single = ['| Name |', '| --- |', '| Alice |'];
242
- const { headers, rows } = parseMarkdownTable(single);
243
- expect(headers).toEqual(['Name']);
244
- expect(rows[0]).toEqual(['Alice']);
245
- });
246
- });
247
-
248
- // ─── buildSlackTableBlock ─────────────────────────────────────────────────────
249
-
250
- describe('buildSlackTableBlock', () => {
251
- const parsed = {
252
- headers: ['Name', 'Score'],
253
- rows: [['Alice', '100'], ['Bob', '200']],
254
- alignments: ['left', 'right'] as ('left' | 'right')[],
255
- };
256
-
257
- it('returns a block with type "table"', () => {
258
- const block = buildSlackTableBlock(parsed);
259
- expect(block.type).toBe('table');
260
- });
261
-
262
- it('includes header row as first row', () => {
263
- const block = buildSlackTableBlock(parsed);
264
- expect(block.rows[0][0].text).toBe('Name');
265
- expect(block.rows[0][1].text).toBe('Score');
266
- });
267
-
268
- it('includes data rows after header', () => {
269
- const block = buildSlackTableBlock(parsed);
270
- expect(block.rows[1][0].text).toBe('Alice');
271
- expect(block.rows[2][0].text).toBe('Bob');
272
- });
273
-
274
- it('sets column alignment settings', () => {
275
- const block = buildSlackTableBlock(parsed);
276
- expect(block.column_settings[0].align).toBe('left');
277
- expect(block.column_settings[1].align).toBe('right');
278
- });
279
-
280
- it('caps rows at 99 data rows', () => {
281
- const manyRows = Array.from({ length: 150 }, (_, i) => [`row${i}`, `${i}`]);
282
- const block = buildSlackTableBlock({ ...parsed, rows: manyRows });
283
- expect(block.rows.length).toBeLessThanOrEqual(100); // header + 99
284
- });
285
-
286
- it('fills missing cells with empty string', () => {
287
- const sparse = { headers: ['A', 'B', 'C'], rows: [['only-a']], alignments: ['left', 'left', 'left'] as ('left')[]} ;
288
- const block = buildSlackTableBlock(sparse);
289
- expect(block.rows[1][1].text).toBe('');
290
- expect(block.rows[1][2].text).toBe('');
291
- });
292
-
293
- it('caps columns at 20 and keeps rows and column_settings in sync', () => {
294
- const headers = Array.from({ length: 25 }, (_, i) => `H${i}`);
295
- const rows = [Array.from({ length: 25 }, (_, i) => `v${i}`)];
296
- const alignments = Array.from({ length: 25 }, () => 'left' as const);
297
- const block = buildSlackTableBlock({ headers, rows, alignments });
298
- expect(block.column_settings.length).toBe(20);
299
- expect(block.rows[0].length).toBe(20);
300
- expect(block.rows[1].length).toBe(20);
301
- });
302
-
303
- it('ensures row cell count matches column_settings count for normal tables', () => {
304
- const block = buildSlackTableBlock(parsed);
305
- expect(block.rows[0].length).toBe(block.column_settings.length);
306
- expect(block.rows[1].length).toBe(block.column_settings.length);
307
- });
308
- });
309
-
310
- // ─── buildMessagePayloads ─────────────────────────────────────────────────────
311
-
312
- describe('buildMessagePayloads', () => {
313
- it('returns text-only payload for plain text', () => {
314
- const payloads = buildMessagePayloads('Hello world', false);
315
- expect(payloads).toHaveLength(1);
316
- expect(payloads[0].text).toBeTruthy();
317
- expect(payloads[0].blocks).toBeUndefined();
318
- });
319
-
320
- it('returns blocks payload when text contains a table', () => {
321
- const text = 'Results:\n| A | B |\n| --- | --- |\n| 1 | 2 |\nDone.';
322
- const payloads = buildMessagePayloads(text, true);
323
- const tablePayload = payloads.find(p => p.blocks?.some((b: any) => b.type === 'table'));
324
- expect(tablePayload).toBeDefined();
325
- });
326
-
327
- it('includes before-text section block when text precedes table', () => {
328
- const text = 'Here are results:\n| A | B |\n| --- | --- |\n| 1 | 2 |';
329
- const payloads = buildMessagePayloads(text, true);
330
- const tablePayload = payloads.find(p => p.blocks?.some((b: any) => b.type === 'table'));
331
- const sections = tablePayload!.blocks!.filter((b: any) => b.type === 'section');
332
- expect(sections.some((s: any) => s.text.text.includes('Here are results'))).toBe(true);
333
- });
334
-
335
- it('splits multiple tables into separate payloads', () => {
336
- const text = 'Table 1:\n| A | B |\n| --- | --- |\n| 1 | 2 |\nTable 2:\n| C | D |\n| --- | --- |\n| 3 | 4 |';
337
- const payloads = buildMessagePayloads(text, true);
338
- const tablePayloads = payloads.filter(p => p.blocks?.some((b: any) => b.type === 'table'));
339
- expect(tablePayloads.length).toBe(2);
340
- });
341
-
342
- it('applies formatMessage to text field', () => {
343
- const payloads = buildMessagePayloads('**bold** text', false);
344
- expect(payloads[0].text).toContain('*bold*');
345
- });
346
- });
347
-
348
- // ─── formatToolStatus ─────────────────────────────────────────────────────────
349
-
350
- describe('formatToolStatus', () => {
351
- it('returns null for empty content array', () => {
352
- expect(formatToolStatus([])).toBeNull();
353
- });
354
-
355
- it('returns null when no tool_use block present', () => {
356
- expect(formatToolStatus([{ type: 'text', text: 'hello' }])).toBeNull();
357
- });
358
-
359
- it('returns *Working...* for unknown tool', () => {
360
- const content = [{ type: 'tool_use', name: 'unknown_tool', input: {} }];
361
- expect(formatToolStatus(content)).toBe('*Working...*');
362
- });
363
-
364
- it('formats known tool without special input as label...', () => {
365
- const content = [{ type: 'tool_use', name: 'mcp__redshift-mcp__describe_table', input: {} }];
366
- expect(formatToolStatus(content)).toBe('*Inspecting table structure...*');
367
- });
368
-
369
- it('formats redshift query tool with SQL block', () => {
370
- const content = [{ type: 'tool_use', name: 'mcp__redshift-mcp__query', input: { sql: 'SELECT * FROM orders' } }];
371
- const result = formatToolStatus(content);
372
- expect(result).toContain('Querying Redshift');
373
- expect(result).toContain('SELECT * FROM orders');
374
- expect(result).toContain('```sql');
375
- });
376
-
377
- it('truncates SQL at 500 chars', () => {
378
- const longSql = 'SELECT ' + 'x'.repeat(600);
379
- const content = [{ type: 'tool_use', name: 'mcp__redshift-mcp__query', input: { sql: longSql } }];
380
- const result = formatToolStatus(content)!;
381
- expect(result.length).toBeLessThan(longSql.length);
382
- });
383
-
384
- it('formats tool with query input', () => {
385
- const content = [{ type: 'tool_use', name: 'mcp__mcp-server-openmetadata-PRD__search_entities', input: { query: 'orders table' } }];
386
- const result = formatToolStatus(content);
387
- expect(result).toContain('Searching metadata catalog');
388
- expect(result).toContain('orders table');
389
- });
390
-
391
- it('formats tool with fqn input', () => {
392
- const content = [{ type: 'tool_use', name: 'mcp__mcp-server-openmetadata-PRD__get_table_by_name', input: { fqn: 'db.schema.orders' } }];
393
- const result = formatToolStatus(content);
394
- expect(result).toContain('db.schema.orders');
395
- });
396
-
397
- it('uses first tool_use block when multiple exist', () => {
398
- const content = [
399
- { type: 'tool_use', name: 'mcp__redshift-mcp__query', input: { sql: 'SELECT 1' } },
400
- { type: 'tool_use', name: 'unknown_tool', input: {} },
401
- ];
402
- const result = formatToolStatus(content)!;
403
- expect(result).toContain('Querying Redshift');
404
- });
405
- });
406
-
407
- // ─── Edge cases ───────────────────────────────────────────────────────────────
408
-
409
- describe('formatMessage — edge cases', () => {
410
- it('handles multiple code blocks in one message', () => {
411
- const input = '```js\nfoo()\n```\ntext\n```py\nbar()\n```';
412
- const result = formatMessage(input, false);
413
- expect(result).toContain('```\nfoo()\n```');
414
- expect(result).toContain('```\nbar()\n```');
415
- });
416
-
417
- it('does not strip dashes inside words (only HR lines)', () => {
418
- const result = formatMessage('some-word and another-word', false);
419
- expect(result).toContain('some-word');
420
- expect(result).toContain('another-word');
421
- });
422
-
423
- it('handles nested asterisks correctly', () => {
424
- const result = formatMessage('**bold** and *already slack*', false);
425
- expect(result).toBe('*bold* and *already slack*');
426
- });
427
- });
428
-
429
- describe('extractFirstMarkdownTable — edge cases', () => {
430
- it('returns null for text with only one table row', () => {
431
- expect(extractFirstMarkdownTable('| A | B |')).toBeNull();
432
- });
433
-
434
- it('picks the earliest table when multiple tables exist', () => {
435
- const text = '| A | B |\n| --- | --- |\n| 1 | 2 |\n\nsome text\n\n| C | D |\n| --- | --- |\n| 3 | 4 |';
436
- const result = extractFirstMarkdownTable(text);
437
- expect(result).not.toBeNull();
438
- expect(result!.tableLines[0]).toContain('A');
439
- });
440
- });
441
-
442
- describe('parseMarkdownTable — edge cases', () => {
443
- it('handles rows with fewer cells than headers (pads with empty)', () => {
444
- const lines = ['| A | B | C |', '| --- | --- | --- |', '| 1 |'];
445
- const { rows } = parseMarkdownTable(lines);
446
- expect(rows[0]).toHaveLength(1); // splitRow only produces what's there
447
- });
448
-
449
- it('handles table with no data rows (headers + separator only)', () => {
450
- const lines = ['| A | B |', '| --- | --- |'];
451
- const { rows } = parseMarkdownTable(lines);
452
- expect(rows).toHaveLength(0);
453
- });
454
- });
455
-
456
- describe('formatToolStatus — edge cases', () => {
457
- it('returns null when content has only text blocks', () => {
458
- const content = [{ type: 'text', text: 'thinking...' }];
459
- expect(formatToolStatus(content)).toBeNull();
460
- });
461
-
462
- it('formats tool with name input (fqn fallback to name)', () => {
463
- const content = [{ type: 'tool_use', name: 'mcp__mcp-server-openmetadata-PRD__get_table', input: { name: 'orders' } }];
464
- const result = formatToolStatus(content);
465
- expect(result).toContain('orders');
466
- });
467
-
468
- it('handles tool_use with no special input fields gracefully', () => {
469
- const content = [{ type: 'tool_use', name: 'mcp__mcp-server-openmetadata-PRD__list_tables', input: {} }];
470
- const result = formatToolStatus(content);
471
- expect(result).toContain('Listing tables');
472
- });
473
- });
474
-
475
- describe('buildMessagePayloads — edge cases', () => {
476
- it('returns plain text payload when table has no headers', () => {
477
- // A "table" with only separator row — invalid
478
- const text = 'some text\n| --- | --- |\nmore text';
479
- const payloads = buildMessagePayloads(text, false);
480
- // Should not crash, returns text payload
481
- expect(payloads[0].text).toBeTruthy();
482
- });
483
-
484
- it('handles empty string input', () => {
485
- const payloads = buildMessagePayloads('', false);
486
- expect(payloads[0].text).toBeDefined();
487
- });
488
-
489
- it('handles very long text without table', () => {
490
- const longText = 'word '.repeat(2000);
491
- const payloads = buildMessagePayloads(longText, false);
492
- expect(payloads[0].text).toBeTruthy();
493
- expect(payloads[0].blocks).toBeUndefined();
494
- });
495
- });