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,237 +0,0 @@
1
- /**
2
- * @fileoverview Unit tests for skill-templates.ts — SKILL_TEMPLATES.
3
- *
4
- * Verifies each template generates the correct skill files with expected
5
- * content, structure, and agent name/persona interpolation.
6
- *
7
- * No database or network required.
8
- *
9
- * @module web/lib/__tests__/skill-templates.test
10
- */
11
-
12
- import { describe, it, expect } from 'vitest';
13
- import { SKILL_TEMPLATES } from '@/lib/skill-templates';
14
- import type { Agent } from '@slackhive/shared';
15
-
16
- // ─── Helpers ─────────────────────────────────────────────────────────────────
17
-
18
- function makeAgent(overrides: Partial<Agent> = {}): Agent {
19
- return {
20
- id: 'agent-1',
21
- slug: 'test-bot',
22
- name: 'TestBot',
23
- persona: undefined,
24
- description: undefined,
25
- slackBotToken: 'xoxb-fake',
26
- slackAppToken: 'xapp-fake',
27
- slackSigningSecret: 'secret',
28
- slackBotUserId: undefined,
29
- model: 'claude-opus-4-5',
30
- status: 'stopped',
31
- enabled: true,
32
- isBoss: false,
33
- reportsTo: [],
34
- claudeMd: '',
35
- createdBy: 'system',
36
- createdAt: new Date(),
37
- updatedAt: new Date(),
38
- ...overrides,
39
- };
40
- }
41
-
42
- // ─── Common assertions ────────────────────────────────────────────────────────
43
-
44
- function expectValidSkills(skills: ReturnType<typeof SKILL_TEMPLATES['blank']>) {
45
- expect(skills.length).toBeGreaterThan(0);
46
- for (const skill of skills) {
47
- expect(skill.category).toBeTruthy();
48
- expect(skill.filename).toMatch(/\.md$/);
49
- expect(skill.content.trim()).toBeTruthy();
50
- expect(typeof skill.sortOrder).toBe('number');
51
- }
52
- }
53
-
54
- function expectUniqueSortOrders(skills: ReturnType<typeof SKILL_TEMPLATES['blank']>) {
55
- const orders = skills.map(s => s.sortOrder);
56
- expect(new Set(orders).size).toBe(orders.length);
57
- }
58
-
59
- // ─── blank template ───────────────────────────────────────────────────────────
60
-
61
- describe('SKILL_TEMPLATES.blank', () => {
62
- it('returns exactly one skill file', () => {
63
- const skills = SKILL_TEMPLATES.blank(makeAgent());
64
- expect(skills).toHaveLength(1);
65
- });
66
-
67
- it('interpolates agent name into the skill heading', () => {
68
- const skills = SKILL_TEMPLATES.blank(makeAgent({ name: 'MyBot' }));
69
- expect(skills[0].content).toContain('# MyBot');
70
- });
71
-
72
- it('uses agent persona when provided', () => {
73
- const skills = SKILL_TEMPLATES.blank(makeAgent({ persona: 'A grumpy assistant.' }));
74
- expect(skills[0].content).toContain('A grumpy assistant.');
75
- });
76
-
77
- it('generates default persona when persona is undefined', () => {
78
- const skills = SKILL_TEMPLATES.blank(makeAgent({ name: 'MyBot', persona: undefined }));
79
- expect(skills[0].content).toContain('You are MyBot');
80
- });
81
-
82
- it('includes description when provided', () => {
83
- const skills = SKILL_TEMPLATES.blank(makeAgent({ description: 'Handles billing queries.' }));
84
- expect(skills[0].content).toContain('Handles billing queries.');
85
- });
86
-
87
- it('omits description section when description is undefined', () => {
88
- const skills = SKILL_TEMPLATES.blank(makeAgent({ description: undefined }));
89
- expect(skills[0].content).not.toContain('## What you do');
90
- });
91
-
92
- it('produces a valid skill structure', () => {
93
- expectValidSkills(SKILL_TEMPLATES.blank(makeAgent()));
94
- });
95
- });
96
-
97
- // ─── data-analyst template ────────────────────────────────────────────────────
98
-
99
- describe('SKILL_TEMPLATES.data-analyst', () => {
100
- it('returns 3 skill files', () => {
101
- expect(SKILL_TEMPLATES['data-analyst'](makeAgent())).toHaveLength(3);
102
- });
103
-
104
- it('interpolates agent name in identity skill', () => {
105
- const skills = SKILL_TEMPLATES['data-analyst'](makeAgent({ name: 'DataBot' }));
106
- const identity = skills.find(s => s.filename === 'identity.md')!;
107
- expect(identity.content).toContain('# DataBot');
108
- });
109
-
110
- it('uses agent persona when provided', () => {
111
- const skills = SKILL_TEMPLATES['data-analyst'](makeAgent({ persona: 'Expert SQL analyst.' }));
112
- const identity = skills.find(s => s.filename === 'identity.md')!;
113
- expect(identity.content).toContain('Expert SQL analyst.');
114
- });
115
-
116
- it('includes workflow.md with query execution steps', () => {
117
- const skills = SKILL_TEMPLATES['data-analyst'](makeAgent());
118
- const workflow = skills.find(s => s.filename === 'workflow.md')!;
119
- expect(workflow).toBeDefined();
120
- expect(workflow.content).toContain('Understand');
121
- expect(workflow.content).toContain('Execute');
122
- });
123
-
124
- it('includes response-format.md', () => {
125
- const skills = SKILL_TEMPLATES['data-analyst'](makeAgent());
126
- expect(skills.find(s => s.filename === 'response-format.md')).toBeDefined();
127
- });
128
-
129
- it('skills are in ascending sortOrder', () => {
130
- const skills = SKILL_TEMPLATES['data-analyst'](makeAgent());
131
- const orders = skills.map(s => s.sortOrder);
132
- expect(orders).toEqual([...orders].sort((a, b) => a - b));
133
- });
134
-
135
- it('has unique sort orders', () => {
136
- expectUniqueSortOrders(SKILL_TEMPLATES['data-analyst'](makeAgent()));
137
- });
138
-
139
- it('produces valid skill structures', () => {
140
- expectValidSkills(SKILL_TEMPLATES['data-analyst'](makeAgent()));
141
- });
142
- });
143
-
144
- // ─── writer template ──────────────────────────────────────────────────────────
145
-
146
- describe('SKILL_TEMPLATES.writer', () => {
147
- it('returns 2 skill files', () => {
148
- expect(SKILL_TEMPLATES.writer(makeAgent())).toHaveLength(2);
149
- });
150
-
151
- it('interpolates agent name in identity skill', () => {
152
- const skills = SKILL_TEMPLATES.writer(makeAgent({ name: 'WriterBot' }));
153
- const identity = skills.find(s => s.filename === 'identity.md')!;
154
- expect(identity.content).toContain('# WriterBot');
155
- });
156
-
157
- it('includes style-guide.md with writing guidelines', () => {
158
- const skills = SKILL_TEMPLATES.writer(makeAgent());
159
- const guide = skills.find(s => s.filename === 'style-guide.md')!;
160
- expect(guide).toBeDefined();
161
- expect(guide.content).toContain('Active voice');
162
- });
163
-
164
- it('has unique sort orders', () => {
165
- expectUniqueSortOrders(SKILL_TEMPLATES.writer(makeAgent()));
166
- });
167
-
168
- it('produces valid skill structures', () => {
169
- expectValidSkills(SKILL_TEMPLATES.writer(makeAgent()));
170
- });
171
- });
172
-
173
- // ─── developer template ───────────────────────────────────────────────────────
174
-
175
- describe('SKILL_TEMPLATES.developer', () => {
176
- it('returns 2 skill files', () => {
177
- expect(SKILL_TEMPLATES.developer(makeAgent())).toHaveLength(2);
178
- });
179
-
180
- it('interpolates agent name in identity skill', () => {
181
- const skills = SKILL_TEMPLATES.developer(makeAgent({ name: 'DevBot' }));
182
- const identity = skills.find(s => s.filename === 'identity.md')!;
183
- expect(identity.content).toContain('# DevBot');
184
- });
185
-
186
- it('includes code-standards.md with security mention', () => {
187
- const skills = SKILL_TEMPLATES.developer(makeAgent());
188
- const standards = skills.find(s => s.filename === 'code-standards.md')!;
189
- expect(standards).toBeDefined();
190
- expect(standards.content).toContain('security');
191
- });
192
-
193
- it('has unique sort orders', () => {
194
- expectUniqueSortOrders(SKILL_TEMPLATES.developer(makeAgent()));
195
- });
196
-
197
- it('produces valid skill structures', () => {
198
- expectValidSkills(SKILL_TEMPLATES.developer(makeAgent()));
199
- });
200
- });
201
-
202
- // ─── All templates ────────────────────────────────────────────────────────────
203
-
204
- describe('SKILL_TEMPLATES (all)', () => {
205
- const templateNames = ['blank', 'data-analyst', 'writer', 'developer'] as const;
206
-
207
- it('all templates are defined', () => {
208
- for (const name of templateNames) {
209
- expect(SKILL_TEMPLATES[name]).toBeTypeOf('function');
210
- }
211
- });
212
-
213
- it('all templates produce skills in 00-core category', () => {
214
- const agent = makeAgent();
215
- for (const name of templateNames) {
216
- const skills = SKILL_TEMPLATES[name](agent);
217
- expect(skills.every(s => s.category === '00-core')).toBe(true);
218
- }
219
- });
220
-
221
- it('all templates include an identity.md file', () => {
222
- const agent = makeAgent();
223
- for (const name of templateNames) {
224
- const skills = SKILL_TEMPLATES[name](agent);
225
- expect(skills.find(s => s.filename === 'identity.md')).toBeDefined();
226
- }
227
- });
228
-
229
- it('all identity.md files start with the agent name as heading', () => {
230
- const agent = makeAgent({ name: 'SpecialAgent' });
231
- for (const name of templateNames) {
232
- const skills = SKILL_TEMPLATES[name](agent);
233
- const identity = skills.find(s => s.filename === 'identity.md')!;
234
- expect(identity.content).toContain('# SpecialAgent');
235
- }
236
- });
237
- });
@@ -1,105 +0,0 @@
1
- /**
2
- * @fileoverview Unit tests for slack-manifest.ts — generateSlackManifest.
3
- *
4
- * Verifies manifest structure, scope assignment, deduplication, and defaults
5
- * for both regular and boss agents.
6
- *
7
- * No database or network required.
8
- *
9
- * @module web/lib/__tests__/slack-manifest.test
10
- */
11
-
12
- import { describe, it, expect } from 'vitest';
13
- import { generateSlackManifest } from '@/lib/slack-manifest';
14
- import { DEFAULT_SLACK_BOT_SCOPES, BOSS_ADDITIONAL_SCOPES } from '@slackhive/shared';
15
-
16
- // ─── generateSlackManifest ────────────────────────────────────────────────────
17
-
18
- describe('generateSlackManifest', () => {
19
- it('sets display name from opts.name', () => {
20
- const m = generateSlackManifest({ name: 'DataBot' });
21
- expect(m.display_information.name).toBe('DataBot');
22
- expect(m.features.bot_user.display_name).toBe('DataBot');
23
- });
24
-
25
- it('uses provided description in display_information', () => {
26
- const m = generateSlackManifest({ name: 'Bot', description: 'My custom description' });
27
- expect(m.display_information.description).toBe('My custom description');
28
- });
29
-
30
- it('generates default description from name when description is omitted', () => {
31
- const m = generateSlackManifest({ name: 'DataBot' });
32
- expect(m.display_information.description).toBe('DataBot — Claude Code AI agent');
33
- });
34
-
35
- it('includes all DEFAULT_SLACK_BOT_SCOPES for a non-boss agent', () => {
36
- const m = generateSlackManifest({ name: 'Bot', isBoss: false });
37
- for (const scope of DEFAULT_SLACK_BOT_SCOPES) {
38
- expect(m.oauth_config.scopes.bot).toContain(scope);
39
- }
40
- });
41
-
42
- it('includes boss scopes in addition to default scopes for boss agent', () => {
43
- const m = generateSlackManifest({ name: 'Boss', isBoss: true });
44
- const allExpected = [...new Set([...DEFAULT_SLACK_BOT_SCOPES, ...BOSS_ADDITIONAL_SCOPES])];
45
- for (const scope of allExpected) {
46
- expect(m.oauth_config.scopes.bot).toContain(scope);
47
- }
48
- });
49
-
50
- it('does not include boss scopes for non-boss agent', () => {
51
- const bossOnlyScopes = BOSS_ADDITIONAL_SCOPES.filter(s => !DEFAULT_SLACK_BOT_SCOPES.includes(s));
52
- const m = generateSlackManifest({ name: 'Bot', isBoss: false });
53
- for (const scope of bossOnlyScopes) {
54
- expect(m.oauth_config.scopes.bot).not.toContain(scope);
55
- }
56
- });
57
-
58
- it('deduplicates scopes — no scope appears twice', () => {
59
- const m = generateSlackManifest({ name: 'Boss', isBoss: true });
60
- const scopes = m.oauth_config.scopes.bot;
61
- const unique = [...new Set(scopes)];
62
- expect(scopes.length).toBe(unique.length);
63
- });
64
-
65
- it('enables socket_mode', () => {
66
- const m = generateSlackManifest({ name: 'Bot' });
67
- expect(m.settings.socket_mode_enabled).toBe(true);
68
- });
69
-
70
- it('subscribes to all required bot events', () => {
71
- const m = generateSlackManifest({ name: 'Bot' });
72
- const events = m.settings.event_subscriptions.bot_events;
73
- expect(events).toContain('app_mention');
74
- expect(events).toContain('message.im');
75
- expect(events).toContain('message.channels');
76
- expect(events).toContain('message.groups');
77
- expect(events).toContain('member_joined_channel');
78
- });
79
-
80
- it('sets bot always_online to true', () => {
81
- const m = generateSlackManifest({ name: 'Bot' });
82
- expect(m.features.bot_user.always_online).toBe(true);
83
- });
84
-
85
- it('disables interactivity', () => {
86
- const m = generateSlackManifest({ name: 'Bot' });
87
- expect(m.settings.interactivity.is_enabled).toBe(false);
88
- });
89
-
90
- it('disables token rotation', () => {
91
- const m = generateSlackManifest({ name: 'Bot' });
92
- expect(m.settings.token_rotation_enabled).toBe(false);
93
- });
94
-
95
- it('treats isBoss=undefined the same as isBoss=false (no extra scopes)', () => {
96
- const withFalse = generateSlackManifest({ name: 'Bot', isBoss: false });
97
- const withUndefined = generateSlackManifest({ name: 'Bot' });
98
- expect(withFalse.oauth_config.scopes.bot).toEqual(withUndefined.oauth_config.scopes.bot);
99
- });
100
-
101
- it('sets background_color to #1a1a1a', () => {
102
- const m = generateSlackManifest({ name: 'Bot' });
103
- expect(m.display_information.background_color).toBe('#1a1a1a');
104
- });
105
- });
@@ -1,68 +0,0 @@
1
- /**
2
- * @fileoverview API route guards — role-based access control for mutations.
3
- *
4
- * guardEditor: allows editor, admin, superadmin (blocks viewer)
5
- * guardAdmin: allows admin, superadmin only (blocks viewer + editor)
6
- *
7
- * @module web/lib/api-guard
8
- */
9
-
10
- import { NextResponse } from 'next/server';
11
- import { getSessionFromRequest, type Role } from './auth';
12
- import { userCanWriteAgent } from './db';
13
-
14
- const ROLE_LEVEL: Record<Role, number> = { viewer: 0, editor: 1, admin: 2, superadmin: 3 };
15
-
16
- /**
17
- * Returns 403 if the user lacks editor role or above.
18
- * Allows: editor, admin, superadmin. Blocks: viewer.
19
- *
20
- * @param {Request} req - Incoming request.
21
- * @returns {NextResponse | null} 403 response or null if authorized.
22
- */
23
- export function guardAdmin(req: Request): NextResponse | null {
24
- const session = getSessionFromRequest(req);
25
- if (!session) {
26
- return NextResponse.json({ error: 'Not authenticated' }, { status: 401 });
27
- }
28
- if ((ROLE_LEVEL[session.role] ?? -1) < ROLE_LEVEL.editor) {
29
- return NextResponse.json({ error: 'Insufficient permissions' }, { status: 403 });
30
- }
31
- return null;
32
- }
33
-
34
- /**
35
- * Returns 403 if the user cannot write to the specified agent.
36
- * Admins/superadmins always pass. Editors pass only if they created the agent
37
- * or have been explicitly granted write access.
38
- *
39
- * @param {Request} req - Incoming request.
40
- * @param {string} agentId - Agent UUID to check write access for.
41
- * @returns {Promise<NextResponse | null>} 403 response or null if authorized.
42
- */
43
- export async function guardAgentWrite(req: Request, agentId: string): Promise<NextResponse | null> {
44
- const session = getSessionFromRequest(req);
45
- if (!session) return NextResponse.json({ error: 'Not authenticated' }, { status: 401 });
46
- const allowed = await userCanWriteAgent(agentId, session.username, session.role);
47
- if (!allowed) return NextResponse.json({ error: 'Insufficient permissions' }, { status: 403 });
48
- return null;
49
- }
50
-
51
- /**
52
- * Returns 403 if the user lacks admin role or above.
53
- * Allows: admin, superadmin. Blocks: viewer, editor.
54
- * Use this for user management endpoints only.
55
- *
56
- * @param {Request} req - Incoming request.
57
- * @returns {NextResponse | null} 403 response or null if authorized.
58
- */
59
- export function guardUserAdmin(req: Request): NextResponse | null {
60
- const session = getSessionFromRequest(req);
61
- if (!session) {
62
- return NextResponse.json({ error: 'Not authenticated' }, { status: 401 });
63
- }
64
- if ((ROLE_LEVEL[session.role] ?? -1) < ROLE_LEVEL.admin) {
65
- return NextResponse.json({ error: 'Insufficient permissions' }, { status: 403 });
66
- }
67
- return null;
68
- }
@@ -1,71 +0,0 @@
1
- 'use client';
2
-
3
- /**
4
- * @fileoverview Client-side auth context — provides role info to components.
5
- *
6
- * Roles: superadmin > admin > editor > viewer
7
- * - canEdit: editor, admin, superadmin (can create/edit agents, jobs, settings)
8
- * - canManageUsers: admin, superadmin only (can create/delete users)
9
- *
10
- * @module web/lib/auth-context
11
- */
12
-
13
- import { createContext, useContext, useEffect, useState } from 'react';
14
-
15
- interface AuthState {
16
- username: string;
17
- role: 'superadmin' | 'admin' | 'editor' | 'viewer' | null;
18
- loading: boolean;
19
- /** Can create/edit/delete agents, jobs, settings, MCPs. */
20
- canEdit: boolean;
21
- /** Can create/delete users (admin + superadmin only). */
22
- canManageUsers: boolean;
23
- logout: () => Promise<void>;
24
- }
25
-
26
- const AuthContext = createContext<AuthState>({
27
- username: '', role: null, loading: true, canEdit: false, canManageUsers: false, logout: async () => {},
28
- });
29
-
30
- /**
31
- * Provides auth state to the component tree.
32
- *
33
- * @param {{ children: React.ReactNode }} props
34
- * @returns {JSX.Element}
35
- */
36
- export function AuthProvider({ children }: { children: React.ReactNode }) {
37
- const [username, setUsername] = useState('');
38
- const [role, setRole] = useState<AuthState['role']>(null);
39
- const [loading, setLoading] = useState(true);
40
-
41
- useEffect(() => {
42
- fetch('/api/auth/me')
43
- .then(r => { if (!r.ok) throw new Error(); return r.json(); })
44
- .then(data => { setUsername(data.username); setRole(data.role); })
45
- .catch(() => {})
46
- .finally(() => setLoading(false));
47
- }, []);
48
-
49
- const canEdit = role === 'superadmin' || role === 'admin' || role === 'editor';
50
- const canManageUsers = role === 'superadmin' || role === 'admin';
51
-
52
- const logout = async () => {
53
- await fetch('/api/auth/logout', { method: 'POST' });
54
- window.location.href = '/login';
55
- };
56
-
57
- return (
58
- <AuthContext.Provider value={{ username, role, loading, canEdit, canManageUsers, logout }}>
59
- {children}
60
- </AuthContext.Provider>
61
- );
62
- }
63
-
64
- /**
65
- * Hook to access the current auth state.
66
- *
67
- * @returns {AuthState} Current auth state.
68
- */
69
- export function useAuth(): AuthState {
70
- return useContext(AuthContext);
71
- }
@@ -1,128 +0,0 @@
1
- /**
2
- * @fileoverview Authentication utilities — cookie signing, user verification, role checks.
3
- *
4
- * Superadmin is checked against env vars (ADMIN_USERNAME/ADMIN_PASSWORD).
5
- * DB users are checked with bcrypt. Sessions are HMAC-signed cookies.
6
- *
7
- * @module web/lib/auth
8
- */
9
-
10
- import * as crypto from 'crypto';
11
- import bcrypt from 'bcryptjs';
12
- import { getUserByUsername } from './db';
13
-
14
- if (process.env.NODE_ENV === 'production' && !process.env.CI && (!process.env.AUTH_SECRET || !process.env.ADMIN_PASSWORD)) {
15
- throw new Error('AUTH_SECRET and ADMIN_PASSWORD must be set in production. See .env.example.');
16
- }
17
-
18
- const AUTH_SECRET = process.env.AUTH_SECRET || 'change-this-secret-in-production';
19
- const ADMIN_USERNAME = process.env.ADMIN_USERNAME || 'admin';
20
- const ADMIN_PASSWORD = process.env.ADMIN_PASSWORD || 'changeme';
21
- const COOKIE_NAME = 'auth_session';
22
-
23
- export type Role = 'superadmin' | 'admin' | 'editor' | 'viewer';
24
-
25
- export interface SessionPayload {
26
- username: string;
27
- role: Role;
28
- }
29
-
30
- /**
31
- * Signs a session payload into an HMAC cookie value.
32
- *
33
- * @param {SessionPayload} payload - The session data to sign.
34
- * @returns {string} Signed cookie value (base64payload.base64sig).
35
- */
36
- export function signSession(payload: SessionPayload): string {
37
- const data = Buffer.from(JSON.stringify(payload)).toString('base64url');
38
- const sig = crypto.createHmac('sha256', AUTH_SECRET).update(data).digest('base64url');
39
- return `${data}.${sig}`;
40
- }
41
-
42
- /**
43
- * Verifies an HMAC-signed session cookie and returns the payload.
44
- *
45
- * @param {string} cookie - The signed cookie value.
46
- * @returns {SessionPayload | null} Decoded payload or null if invalid.
47
- */
48
- export function verifySession(cookie: string): SessionPayload | null {
49
- const parts = cookie.split('.');
50
- if (parts.length !== 2) return null;
51
- const [data, sig] = parts;
52
- const expected = crypto.createHmac('sha256', AUTH_SECRET).update(data).digest('base64url');
53
- if (sig !== expected) return null;
54
- try {
55
- return JSON.parse(Buffer.from(data, 'base64url').toString()) as SessionPayload;
56
- } catch {
57
- return null;
58
- }
59
- }
60
-
61
- /**
62
- * Authenticates a user by username and password.
63
- * Checks superadmin env vars first, then DB users.
64
- *
65
- * @param {string} username - The username to authenticate.
66
- * @param {string} password - The plaintext password.
67
- * @returns {Promise<SessionPayload | null>} Session payload or null if auth fails.
68
- */
69
- export async function authenticateUser(username: string, password: string): Promise<SessionPayload | null> {
70
- // Check superadmin
71
- if (username === ADMIN_USERNAME && password === ADMIN_PASSWORD) {
72
- return { username, role: 'superadmin' };
73
- }
74
-
75
- // Check DB users
76
- const user = await getUserByUsername(username);
77
- if (!user) return null;
78
-
79
- const valid = await bcrypt.compare(password, user.passwordHash);
80
- if (!valid) return null;
81
-
82
- return { username: user.username, role: user.role as Role };
83
- }
84
-
85
- /**
86
- * Hashes a plaintext password with bcrypt.
87
- *
88
- * @param {string} password - Plaintext password.
89
- * @returns {Promise<string>} Bcrypt hash.
90
- */
91
- export async function hashPassword(password: string): Promise<string> {
92
- return bcrypt.hash(password, 10);
93
- }
94
-
95
- /**
96
- * Extracts session from a Request's cookies.
97
- *
98
- * @param {Request} req - Incoming request.
99
- * @returns {SessionPayload | null} Session payload or null.
100
- */
101
- export function getSessionFromRequest(req: Request): SessionPayload | null {
102
- const cookieHeader = req.headers.get('cookie') || '';
103
- const match = cookieHeader.match(new RegExp(`${COOKIE_NAME}=([^;]+)`));
104
- if (!match) return null;
105
- return verifySession(decodeURIComponent(match[1]));
106
- }
107
-
108
- /**
109
- * Requires at least the given role. Returns the session or throws.
110
- *
111
- * @param {Request} req - Incoming request.
112
- * @param {'viewer' | 'admin'} minRole - Minimum required role.
113
- * @returns {SessionPayload} Verified session.
114
- * @throws {Error} If not authenticated or insufficient role.
115
- */
116
- export function requireRole(req: Request, minRole: 'viewer' | 'editor' | 'admin'): SessionPayload {
117
- const session = getSessionFromRequest(req);
118
- if (!session) throw new Error('Not authenticated');
119
-
120
- const roleLevel: Record<Role, number> = { viewer: 0, editor: 1, admin: 2, superadmin: 3 };
121
- if ((roleLevel[session.role] ?? -1) < (roleLevel[minRole] ?? 0)) {
122
- throw new Error('Insufficient permissions');
123
- }
124
- return session;
125
- }
126
-
127
- /** The cookie name used for auth sessions. */
128
- export { COOKIE_NAME };