slackhive 0.1.37 → 0.1.38

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 (542) hide show
  1. package/.dockerignore +14 -0
  2. package/.env.example +44 -0
  3. package/.github/ISSUE_TEMPLATE/bug_report.yml +65 -0
  4. package/.github/ISSUE_TEMPLATE/config.yml +5 -0
  5. package/.github/ISSUE_TEMPLATE/feature_request.yml +38 -0
  6. package/.github/PULL_REQUEST_TEMPLATE.md +27 -0
  7. package/.github/dependabot.yml +20 -0
  8. package/.github/workflows/audit.yml +149 -0
  9. package/.github/workflows/ci.yml +135 -0
  10. package/CHANGELOG.md +52 -0
  11. package/CODE_OF_CONDUCT.md +37 -0
  12. package/CONTRIBUTING.md +204 -0
  13. package/LICENSE +21 -0
  14. package/README.md +19 -0
  15. package/SECURITY.md +47 -0
  16. package/apps/runner/Dockerfile +33 -0
  17. package/apps/runner/dist/__tests__/channel-restrictions.test.d.ts +8 -0
  18. package/apps/runner/dist/__tests__/channel-restrictions.test.js +63 -0
  19. package/apps/runner/dist/__tests__/channel-restrictions.test.js.map +1 -0
  20. package/apps/runner/dist/__tests__/claude-handler-resolve.test.d.ts +20 -0
  21. package/apps/runner/dist/__tests__/claude-handler-resolve.test.js +178 -0
  22. package/apps/runner/dist/__tests__/claude-handler-resolve.test.js.map +1 -0
  23. package/apps/runner/dist/__tests__/compile-claude-md.test.d.ts +13 -0
  24. package/apps/runner/dist/__tests__/compile-claude-md.test.js +144 -0
  25. package/apps/runner/dist/__tests__/compile-claude-md.test.js.map +1 -0
  26. package/apps/runner/dist/__tests__/memory-sync.test.d.ts +11 -0
  27. package/apps/runner/dist/__tests__/memory-sync.test.js +56 -0
  28. package/apps/runner/dist/__tests__/memory-sync.test.js.map +1 -0
  29. package/apps/runner/dist/__tests__/slack-file-support.test.d.ts +9 -0
  30. package/apps/runner/dist/__tests__/slack-file-support.test.js +271 -0
  31. package/apps/runner/dist/__tests__/slack-file-support.test.js.map +1 -0
  32. package/apps/runner/dist/__tests__/slack-formatting.test.d.ts +12 -0
  33. package/apps/runner/dist/__tests__/slack-formatting.test.js +400 -0
  34. package/apps/runner/dist/__tests__/slack-formatting.test.js.map +1 -0
  35. package/apps/runner/dist/__tests__/thread-context.test.d.ts +12 -0
  36. package/apps/runner/dist/__tests__/thread-context.test.js +182 -0
  37. package/apps/runner/dist/__tests__/thread-context.test.js.map +1 -0
  38. package/apps/runner/dist/agent-runner.d.ts +118 -0
  39. package/apps/runner/dist/agent-runner.js +352 -0
  40. package/apps/runner/dist/agent-runner.js.map +1 -0
  41. package/apps/runner/dist/claude-handler.d.ts +122 -0
  42. package/apps/runner/dist/claude-handler.js +402 -0
  43. package/apps/runner/dist/claude-handler.js.map +1 -0
  44. package/apps/runner/dist/compile-claude-md.d.ts +59 -0
  45. package/apps/runner/dist/compile-claude-md.js +291 -0
  46. package/apps/runner/dist/compile-claude-md.js.map +1 -0
  47. package/apps/runner/dist/correction-handler.d.ts +46 -0
  48. package/apps/runner/dist/correction-handler.js +162 -0
  49. package/apps/runner/dist/correction-handler.js.map +1 -0
  50. package/apps/runner/dist/correction-manager.d.ts +53 -0
  51. package/apps/runner/dist/correction-manager.js +241 -0
  52. package/apps/runner/dist/correction-manager.js.map +1 -0
  53. package/apps/runner/dist/db.d.ts +193 -0
  54. package/apps/runner/dist/db.js +492 -0
  55. package/apps/runner/dist/db.js.map +1 -0
  56. package/apps/runner/dist/index.d.ts +9 -0
  57. package/apps/runner/dist/index.js +43 -0
  58. package/apps/runner/dist/index.js.map +1 -0
  59. package/apps/runner/dist/job-scheduler.d.ts +57 -0
  60. package/apps/runner/dist/job-scheduler.js +150 -0
  61. package/apps/runner/dist/job-scheduler.js.map +1 -0
  62. package/apps/runner/dist/logger.d.ts +32 -0
  63. package/apps/runner/dist/logger.js +52 -0
  64. package/apps/runner/dist/logger.js.map +1 -0
  65. package/apps/runner/dist/mcp-process-manager.d.ts +38 -0
  66. package/apps/runner/dist/mcp-process-manager.js +189 -0
  67. package/apps/runner/dist/mcp-process-manager.js.map +1 -0
  68. package/apps/runner/dist/memory-mcp.d.ts +14 -0
  69. package/apps/runner/dist/memory-mcp.js +88 -0
  70. package/apps/runner/dist/memory-mcp.js.map +1 -0
  71. package/apps/runner/dist/memory-watcher.d.ts +78 -0
  72. package/apps/runner/dist/memory-watcher.js +220 -0
  73. package/apps/runner/dist/memory-watcher.js.map +1 -0
  74. package/apps/runner/dist/slack-handler.d.ts +120 -0
  75. package/apps/runner/dist/slack-handler.js +843 -0
  76. package/apps/runner/dist/slack-handler.js.map +1 -0
  77. package/apps/runner/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
  78. package/apps/runner/package.json +42 -0
  79. package/apps/runner/src/__tests__/channel-restrictions.test.ts +75 -0
  80. package/apps/runner/src/__tests__/claude-handler-resolve.test.ts +160 -0
  81. package/apps/runner/src/__tests__/compile-claude-md.test.ts +139 -0
  82. package/apps/runner/src/__tests__/memory-sync.test.ts +59 -0
  83. package/apps/runner/src/__tests__/slack-file-support.test.ts +376 -0
  84. package/apps/runner/src/__tests__/slack-formatting.test.ts +495 -0
  85. package/apps/runner/src/__tests__/thread-context.test.ts +215 -0
  86. package/apps/runner/src/agent-runner.ts +397 -0
  87. package/apps/runner/src/claude-handler.ts +475 -0
  88. package/apps/runner/src/compile-claude-md.ts +283 -0
  89. package/apps/runner/src/correction-handler.ts +191 -0
  90. package/apps/runner/src/correction-manager.ts +285 -0
  91. package/apps/runner/src/db.ts +604 -0
  92. package/apps/runner/src/index.ts +46 -0
  93. package/apps/runner/src/job-scheduler.ts +165 -0
  94. package/apps/runner/src/logger.ts +49 -0
  95. package/apps/runner/src/mcp-process-manager.ts +195 -0
  96. package/apps/runner/src/memory-mcp.ts +85 -0
  97. package/apps/runner/src/memory-watcher.ts +215 -0
  98. package/apps/runner/src/slack-handler.ts +929 -0
  99. package/apps/runner/tsconfig.json +17 -0
  100. package/apps/runner/vitest.config.mts +17 -0
  101. package/apps/web/.eslintrc.json +3 -0
  102. package/apps/web/.next/app-build-manifest.json +323 -0
  103. package/apps/web/.next/app-path-routes-manifest.json +46 -0
  104. package/apps/web/.next/build-manifest.json +33 -0
  105. package/apps/web/.next/cache/.previewinfo +1 -0
  106. package/apps/web/.next/cache/.rscinfo +1 -0
  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 +6 -0
  124. package/apps/web/.next/diagnostics/framework.json +1 -0
  125. package/apps/web/.next/package.json +1 -0
  126. package/apps/web/.next/react-loadable-manifest.json +1 -0
  127. package/apps/web/.next/server/app/_not-found/page.js +2 -0
  128. package/apps/web/.next/server/app/_not-found/page.js.nft.json +1 -0
  129. package/apps/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -0
  130. package/apps/web/.next/server/app/agents/[slug]/page.js +4 -0
  131. package/apps/web/.next/server/app/agents/[slug]/page.js.nft.json +1 -0
  132. package/apps/web/.next/server/app/agents/[slug]/page_client-reference-manifest.js +1 -0
  133. package/apps/web/.next/server/app/agents/new/page.js +2 -0
  134. package/apps/web/.next/server/app/agents/new/page.js.nft.json +1 -0
  135. package/apps/web/.next/server/app/agents/new/page_client-reference-manifest.js +1 -0
  136. package/apps/web/.next/server/app/api/agents/[id]/access/route.js +1 -0
  137. package/apps/web/.next/server/app/api/agents/[id]/access/route.js.nft.json +1 -0
  138. package/apps/web/.next/server/app/api/agents/[id]/access/route_client-reference-manifest.js +1 -0
  139. package/apps/web/.next/server/app/api/agents/[id]/claude-md/route.js +6 -0
  140. package/apps/web/.next/server/app/api/agents/[id]/claude-md/route.js.nft.json +1 -0
  141. package/apps/web/.next/server/app/api/agents/[id]/claude-md/route_client-reference-manifest.js +1 -0
  142. package/apps/web/.next/server/app/api/agents/[id]/logs/route.js +3 -0
  143. package/apps/web/.next/server/app/api/agents/[id]/logs/route.js.nft.json +1 -0
  144. package/apps/web/.next/server/app/api/agents/[id]/logs/route_client-reference-manifest.js +1 -0
  145. package/apps/web/.next/server/app/api/agents/[id]/manifest/route.js +1 -0
  146. package/apps/web/.next/server/app/api/agents/[id]/manifest/route.js.nft.json +1 -0
  147. package/apps/web/.next/server/app/api/agents/[id]/manifest/route_client-reference-manifest.js +1 -0
  148. package/apps/web/.next/server/app/api/agents/[id]/mcps/route.js +1 -0
  149. package/apps/web/.next/server/app/api/agents/[id]/mcps/route.js.nft.json +1 -0
  150. package/apps/web/.next/server/app/api/agents/[id]/mcps/route_client-reference-manifest.js +1 -0
  151. package/apps/web/.next/server/app/api/agents/[id]/memories/[memId]/route.js +1 -0
  152. package/apps/web/.next/server/app/api/agents/[id]/memories/[memId]/route.js.nft.json +1 -0
  153. package/apps/web/.next/server/app/api/agents/[id]/memories/[memId]/route_client-reference-manifest.js +1 -0
  154. package/apps/web/.next/server/app/api/agents/[id]/memories/route.js +1 -0
  155. package/apps/web/.next/server/app/api/agents/[id]/memories/route.js.nft.json +1 -0
  156. package/apps/web/.next/server/app/api/agents/[id]/memories/route_client-reference-manifest.js +1 -0
  157. package/apps/web/.next/server/app/api/agents/[id]/permissions/route.js +1 -0
  158. package/apps/web/.next/server/app/api/agents/[id]/permissions/route.js.nft.json +1 -0
  159. package/apps/web/.next/server/app/api/agents/[id]/permissions/route_client-reference-manifest.js +1 -0
  160. package/apps/web/.next/server/app/api/agents/[id]/reload/route.js +1 -0
  161. package/apps/web/.next/server/app/api/agents/[id]/reload/route.js.nft.json +1 -0
  162. package/apps/web/.next/server/app/api/agents/[id]/reload/route_client-reference-manifest.js +1 -0
  163. package/apps/web/.next/server/app/api/agents/[id]/restrictions/route.js +1 -0
  164. package/apps/web/.next/server/app/api/agents/[id]/restrictions/route.js.nft.json +1 -0
  165. package/apps/web/.next/server/app/api/agents/[id]/restrictions/route_client-reference-manifest.js +1 -0
  166. package/apps/web/.next/server/app/api/agents/[id]/route.js +33 -0
  167. package/apps/web/.next/server/app/api/agents/[id]/route.js.nft.json +1 -0
  168. package/apps/web/.next/server/app/api/agents/[id]/route_client-reference-manifest.js +1 -0
  169. package/apps/web/.next/server/app/api/agents/[id]/skills/[skillId]/route.js +1 -0
  170. package/apps/web/.next/server/app/api/agents/[id]/skills/[skillId]/route.js.nft.json +1 -0
  171. package/apps/web/.next/server/app/api/agents/[id]/skills/[skillId]/route_client-reference-manifest.js +1 -0
  172. package/apps/web/.next/server/app/api/agents/[id]/skills/route.js +1 -0
  173. package/apps/web/.next/server/app/api/agents/[id]/skills/route.js.nft.json +1 -0
  174. package/apps/web/.next/server/app/api/agents/[id]/skills/route_client-reference-manifest.js +1 -0
  175. package/apps/web/.next/server/app/api/agents/[id]/slack-info/route.js +1 -0
  176. package/apps/web/.next/server/app/api/agents/[id]/slack-info/route.js.nft.json +1 -0
  177. package/apps/web/.next/server/app/api/agents/[id]/slack-info/route_client-reference-manifest.js +1 -0
  178. package/apps/web/.next/server/app/api/agents/[id]/snapshots/[sid]/restore/route.js +1 -0
  179. package/apps/web/.next/server/app/api/agents/[id]/snapshots/[sid]/restore/route.js.nft.json +1 -0
  180. package/apps/web/.next/server/app/api/agents/[id]/snapshots/[sid]/restore/route_client-reference-manifest.js +1 -0
  181. package/apps/web/.next/server/app/api/agents/[id]/snapshots/[sid]/route.js +1 -0
  182. package/apps/web/.next/server/app/api/agents/[id]/snapshots/[sid]/route.js.nft.json +1 -0
  183. package/apps/web/.next/server/app/api/agents/[id]/snapshots/[sid]/route_client-reference-manifest.js +1 -0
  184. package/apps/web/.next/server/app/api/agents/[id]/snapshots/route.js +1 -0
  185. package/apps/web/.next/server/app/api/agents/[id]/snapshots/route.js.nft.json +1 -0
  186. package/apps/web/.next/server/app/api/agents/[id]/snapshots/route_client-reference-manifest.js +1 -0
  187. package/apps/web/.next/server/app/api/agents/[id]/start/route.js +1 -0
  188. package/apps/web/.next/server/app/api/agents/[id]/start/route.js.nft.json +1 -0
  189. package/apps/web/.next/server/app/api/agents/[id]/start/route_client-reference-manifest.js +1 -0
  190. package/apps/web/.next/server/app/api/agents/[id]/stop/route.js +1 -0
  191. package/apps/web/.next/server/app/api/agents/[id]/stop/route.js.nft.json +1 -0
  192. package/apps/web/.next/server/app/api/agents/[id]/stop/route_client-reference-manifest.js +1 -0
  193. package/apps/web/.next/server/app/api/agents/route.js +91 -0
  194. package/apps/web/.next/server/app/api/agents/route.js.nft.json +1 -0
  195. package/apps/web/.next/server/app/api/agents/route_client-reference-manifest.js +1 -0
  196. package/apps/web/.next/server/app/api/auth/login/route.js +1 -0
  197. package/apps/web/.next/server/app/api/auth/login/route.js.nft.json +1 -0
  198. package/apps/web/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -0
  199. package/apps/web/.next/server/app/api/auth/logout/route.js +1 -0
  200. package/apps/web/.next/server/app/api/auth/logout/route.js.nft.json +1 -0
  201. package/apps/web/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -0
  202. package/apps/web/.next/server/app/api/auth/me/route.js +1 -0
  203. package/apps/web/.next/server/app/api/auth/me/route.js.nft.json +1 -0
  204. package/apps/web/.next/server/app/api/auth/me/route_client-reference-manifest.js +1 -0
  205. package/apps/web/.next/server/app/api/auth/users/[id]/route.js +1 -0
  206. package/apps/web/.next/server/app/api/auth/users/[id]/route.js.nft.json +1 -0
  207. package/apps/web/.next/server/app/api/auth/users/[id]/route_client-reference-manifest.js +1 -0
  208. package/apps/web/.next/server/app/api/auth/users/route.js +1 -0
  209. package/apps/web/.next/server/app/api/auth/users/route.js.nft.json +1 -0
  210. package/apps/web/.next/server/app/api/auth/users/route_client-reference-manifest.js +1 -0
  211. package/apps/web/.next/server/app/api/env-vars/[key]/route.js +1 -0
  212. package/apps/web/.next/server/app/api/env-vars/[key]/route.js.nft.json +1 -0
  213. package/apps/web/.next/server/app/api/env-vars/[key]/route_client-reference-manifest.js +1 -0
  214. package/apps/web/.next/server/app/api/env-vars/route.js +1 -0
  215. package/apps/web/.next/server/app/api/env-vars/route.js.nft.json +1 -0
  216. package/apps/web/.next/server/app/api/env-vars/route_client-reference-manifest.js +1 -0
  217. package/apps/web/.next/server/app/api/jobs/[id]/route.js +1 -0
  218. package/apps/web/.next/server/app/api/jobs/[id]/route.js.nft.json +1 -0
  219. package/apps/web/.next/server/app/api/jobs/[id]/route_client-reference-manifest.js +1 -0
  220. package/apps/web/.next/server/app/api/jobs/[id]/runs/route.js +1 -0
  221. package/apps/web/.next/server/app/api/jobs/[id]/runs/route.js.nft.json +1 -0
  222. package/apps/web/.next/server/app/api/jobs/[id]/runs/route_client-reference-manifest.js +1 -0
  223. package/apps/web/.next/server/app/api/jobs/route.js +1 -0
  224. package/apps/web/.next/server/app/api/jobs/route.js.nft.json +1 -0
  225. package/apps/web/.next/server/app/api/jobs/route_client-reference-manifest.js +1 -0
  226. package/apps/web/.next/server/app/api/mcps/[id]/route.js +1 -0
  227. package/apps/web/.next/server/app/api/mcps/[id]/route.js.nft.json +1 -0
  228. package/apps/web/.next/server/app/api/mcps/[id]/route_client-reference-manifest.js +1 -0
  229. package/apps/web/.next/server/app/api/mcps/[id]/test/route.js +1 -0
  230. package/apps/web/.next/server/app/api/mcps/[id]/test/route.js.nft.json +1 -0
  231. package/apps/web/.next/server/app/api/mcps/[id]/test/route_client-reference-manifest.js +1 -0
  232. package/apps/web/.next/server/app/api/mcps/route.js +1 -0
  233. package/apps/web/.next/server/app/api/mcps/route.js.nft.json +1 -0
  234. package/apps/web/.next/server/app/api/mcps/route_client-reference-manifest.js +1 -0
  235. package/apps/web/.next/server/app/api/settings/route.js +1 -0
  236. package/apps/web/.next/server/app/api/settings/route.js.nft.json +1 -0
  237. package/apps/web/.next/server/app/api/settings/route_client-reference-manifest.js +1 -0
  238. package/apps/web/.next/server/app/icon.svg/route.js +1 -0
  239. package/apps/web/.next/server/app/icon.svg/route.js.nft.json +1 -0
  240. package/apps/web/.next/server/app/jobs/page.js +2 -0
  241. package/apps/web/.next/server/app/jobs/page.js.nft.json +1 -0
  242. package/apps/web/.next/server/app/jobs/page_client-reference-manifest.js +1 -0
  243. package/apps/web/.next/server/app/login/page.js +2 -0
  244. package/apps/web/.next/server/app/login/page.js.nft.json +1 -0
  245. package/apps/web/.next/server/app/login/page_client-reference-manifest.js +1 -0
  246. package/apps/web/.next/server/app/page.js +2 -0
  247. package/apps/web/.next/server/app/page.js.nft.json +1 -0
  248. package/apps/web/.next/server/app/page_client-reference-manifest.js +1 -0
  249. package/apps/web/.next/server/app/settings/env-vars/page.js +2 -0
  250. package/apps/web/.next/server/app/settings/env-vars/page.js.nft.json +1 -0
  251. package/apps/web/.next/server/app/settings/env-vars/page_client-reference-manifest.js +1 -0
  252. package/apps/web/.next/server/app/settings/mcps/page.js +2 -0
  253. package/apps/web/.next/server/app/settings/mcps/page.js.nft.json +1 -0
  254. package/apps/web/.next/server/app/settings/mcps/page_client-reference-manifest.js +1 -0
  255. package/apps/web/.next/server/app/settings/page.js +2 -0
  256. package/apps/web/.next/server/app/settings/page.js.nft.json +1 -0
  257. package/apps/web/.next/server/app/settings/page_client-reference-manifest.js +1 -0
  258. package/apps/web/.next/server/app-paths-manifest.json +46 -0
  259. package/apps/web/.next/server/chunks/1157.js +9 -0
  260. package/apps/web/.next/server/chunks/2287.js +1 -0
  261. package/apps/web/.next/server/chunks/3444.js +1 -0
  262. package/apps/web/.next/server/chunks/383.js +6 -0
  263. package/apps/web/.next/server/chunks/4012.js +58 -0
  264. package/apps/web/.next/server/chunks/6791.js +1 -0
  265. package/apps/web/.next/server/chunks/7171.js +1 -0
  266. package/apps/web/.next/server/chunks/8819.js +22 -0
  267. package/apps/web/.next/server/edge-runtime-webpack.js +2 -0
  268. package/apps/web/.next/server/edge-runtime-webpack.js.map +1 -0
  269. package/apps/web/.next/server/interception-route-rewrite-manifest.js +1 -0
  270. package/apps/web/.next/server/middleware-build-manifest.js +1 -0
  271. package/apps/web/.next/server/middleware-manifest.json +32 -0
  272. package/apps/web/.next/server/middleware-react-loadable-manifest.js +1 -0
  273. package/apps/web/.next/server/next-font-manifest.js +1 -0
  274. package/apps/web/.next/server/next-font-manifest.json +1 -0
  275. package/apps/web/.next/server/pages/_app.js +1 -0
  276. package/apps/web/.next/server/pages/_app.js.nft.json +1 -0
  277. package/apps/web/.next/server/pages/_document.js +1 -0
  278. package/apps/web/.next/server/pages/_document.js.nft.json +1 -0
  279. package/apps/web/.next/server/pages/_error.js +19 -0
  280. package/apps/web/.next/server/pages/_error.js.nft.json +1 -0
  281. package/apps/web/.next/server/pages-manifest.json +5 -0
  282. package/apps/web/.next/server/server-reference-manifest.js +1 -0
  283. package/apps/web/.next/server/server-reference-manifest.json +1 -0
  284. package/apps/web/.next/server/src/middleware.js +14 -0
  285. package/apps/web/.next/server/src/middleware.js.map +1 -0
  286. package/apps/web/.next/server/webpack-runtime.js +1 -0
  287. package/apps/web/.next/static/chunks/18-90b700ea37b686a2.js +1 -0
  288. package/apps/web/.next/static/chunks/87c73c54-24122e7b92478d00.js +1 -0
  289. package/apps/web/.next/static/chunks/9664-af80478aa73ba424.js +1 -0
  290. package/apps/web/.next/static/chunks/app/_not-found/page-b9cee17ed89ca24a.js +1 -0
  291. package/apps/web/.next/static/chunks/app/agents/[slug]/page-18369fc3fe1a9a7b.js +1 -0
  292. package/apps/web/.next/static/chunks/app/agents/new/page-bf11cf8901c7e2cd.js +1 -0
  293. package/apps/web/.next/static/chunks/app/api/agents/[id]/access/route-07f0f73ac9839899.js +1 -0
  294. package/apps/web/.next/static/chunks/app/api/agents/[id]/claude-md/route-07f0f73ac9839899.js +1 -0
  295. package/apps/web/.next/static/chunks/app/api/agents/[id]/logs/route-07f0f73ac9839899.js +1 -0
  296. package/apps/web/.next/static/chunks/app/api/agents/[id]/manifest/route-07f0f73ac9839899.js +1 -0
  297. package/apps/web/.next/static/chunks/app/api/agents/[id]/mcps/route-07f0f73ac9839899.js +1 -0
  298. package/apps/web/.next/static/chunks/app/api/agents/[id]/memories/[memId]/route-07f0f73ac9839899.js +1 -0
  299. package/apps/web/.next/static/chunks/app/api/agents/[id]/memories/route-07f0f73ac9839899.js +1 -0
  300. package/apps/web/.next/static/chunks/app/api/agents/[id]/permissions/route-07f0f73ac9839899.js +1 -0
  301. package/apps/web/.next/static/chunks/app/api/agents/[id]/reload/route-07f0f73ac9839899.js +1 -0
  302. package/apps/web/.next/static/chunks/app/api/agents/[id]/restrictions/route-07f0f73ac9839899.js +1 -0
  303. package/apps/web/.next/static/chunks/app/api/agents/[id]/route-07f0f73ac9839899.js +1 -0
  304. package/apps/web/.next/static/chunks/app/api/agents/[id]/skills/[skillId]/route-07f0f73ac9839899.js +1 -0
  305. package/apps/web/.next/static/chunks/app/api/agents/[id]/skills/route-07f0f73ac9839899.js +1 -0
  306. package/apps/web/.next/static/chunks/app/api/agents/[id]/slack-info/route-07f0f73ac9839899.js +1 -0
  307. package/apps/web/.next/static/chunks/app/api/agents/[id]/snapshots/[sid]/restore/route-07f0f73ac9839899.js +1 -0
  308. package/apps/web/.next/static/chunks/app/api/agents/[id]/snapshots/[sid]/route-07f0f73ac9839899.js +1 -0
  309. package/apps/web/.next/static/chunks/app/api/agents/[id]/snapshots/route-07f0f73ac9839899.js +1 -0
  310. package/apps/web/.next/static/chunks/app/api/agents/[id]/start/route-07f0f73ac9839899.js +1 -0
  311. package/apps/web/.next/static/chunks/app/api/agents/[id]/stop/route-07f0f73ac9839899.js +1 -0
  312. package/apps/web/.next/static/chunks/app/api/agents/route-07f0f73ac9839899.js +1 -0
  313. package/apps/web/.next/static/chunks/app/api/auth/login/route-07f0f73ac9839899.js +1 -0
  314. package/apps/web/.next/static/chunks/app/api/auth/logout/route-07f0f73ac9839899.js +1 -0
  315. package/apps/web/.next/static/chunks/app/api/auth/me/route-07f0f73ac9839899.js +1 -0
  316. package/apps/web/.next/static/chunks/app/api/auth/users/[id]/route-07f0f73ac9839899.js +1 -0
  317. package/apps/web/.next/static/chunks/app/api/auth/users/route-07f0f73ac9839899.js +1 -0
  318. package/apps/web/.next/static/chunks/app/api/env-vars/[key]/route-07f0f73ac9839899.js +1 -0
  319. package/apps/web/.next/static/chunks/app/api/env-vars/route-07f0f73ac9839899.js +1 -0
  320. package/apps/web/.next/static/chunks/app/api/jobs/[id]/route-07f0f73ac9839899.js +1 -0
  321. package/apps/web/.next/static/chunks/app/api/jobs/[id]/runs/route-07f0f73ac9839899.js +1 -0
  322. package/apps/web/.next/static/chunks/app/api/jobs/route-07f0f73ac9839899.js +1 -0
  323. package/apps/web/.next/static/chunks/app/api/mcps/[id]/route-07f0f73ac9839899.js +1 -0
  324. package/apps/web/.next/static/chunks/app/api/mcps/[id]/test/route-07f0f73ac9839899.js +1 -0
  325. package/apps/web/.next/static/chunks/app/api/mcps/route-07f0f73ac9839899.js +1 -0
  326. package/apps/web/.next/static/chunks/app/api/settings/route-07f0f73ac9839899.js +1 -0
  327. package/apps/web/.next/static/chunks/app/jobs/page-f5aa89a47c50efd8.js +1 -0
  328. package/apps/web/.next/static/chunks/app/layout-2079f4964aa7314e.js +1 -0
  329. package/apps/web/.next/static/chunks/app/login/layout-07f0f73ac9839899.js +1 -0
  330. package/apps/web/.next/static/chunks/app/login/page-aa259283dc38e8f9.js +1 -0
  331. package/apps/web/.next/static/chunks/app/page-e83437b608104dff.js +1 -0
  332. package/apps/web/.next/static/chunks/app/settings/env-vars/page-06479dbdfb78b76b.js +1 -0
  333. package/apps/web/.next/static/chunks/app/settings/mcps/page-75650686ed6490c7.js +1 -0
  334. package/apps/web/.next/static/chunks/app/settings/page-e1e62fc41ff6cddd.js +1 -0
  335. package/apps/web/.next/static/chunks/framework-811407f832a33072.js +1 -0
  336. package/apps/web/.next/static/chunks/main-3f1cddbdd67b1546.js +1 -0
  337. package/apps/web/.next/static/chunks/main-app-cebd8a6a5ccbf72d.js +1 -0
  338. package/apps/web/.next/static/chunks/pages/_app-50fa07b56b2d29ac.js +1 -0
  339. package/apps/web/.next/static/chunks/pages/_error-fed8688bdd23f211.js +1 -0
  340. package/apps/web/.next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
  341. package/apps/web/.next/static/chunks/webpack-6c05566dba553c97.js +1 -0
  342. package/apps/web/.next/static/css/15371687405525e2.css +5 -0
  343. package/apps/web/.next/static/ikfNbLhuw7jntn35bz0lk/_buildManifest.js +1 -0
  344. package/apps/web/.next/static/ikfNbLhuw7jntn35bz0lk/_ssgManifest.js +1 -0
  345. package/apps/web/.next/trace +5 -0
  346. package/apps/web/.next/types/app/agents/[slug]/page.ts +84 -0
  347. package/apps/web/.next/types/app/agents/new/page.ts +84 -0
  348. package/apps/web/.next/types/app/api/agents/[id]/access/route.ts +347 -0
  349. package/apps/web/.next/types/app/api/agents/[id]/claude-md/route.ts +347 -0
  350. package/apps/web/.next/types/app/api/agents/[id]/logs/route.ts +347 -0
  351. package/apps/web/.next/types/app/api/agents/[id]/manifest/route.ts +347 -0
  352. package/apps/web/.next/types/app/api/agents/[id]/mcps/route.ts +347 -0
  353. package/apps/web/.next/types/app/api/agents/[id]/memories/[memId]/route.ts +347 -0
  354. package/apps/web/.next/types/app/api/agents/[id]/memories/route.ts +347 -0
  355. package/apps/web/.next/types/app/api/agents/[id]/permissions/route.ts +347 -0
  356. package/apps/web/.next/types/app/api/agents/[id]/reload/route.ts +347 -0
  357. package/apps/web/.next/types/app/api/agents/[id]/restrictions/route.ts +347 -0
  358. package/apps/web/.next/types/app/api/agents/[id]/route.ts +347 -0
  359. package/apps/web/.next/types/app/api/agents/[id]/skills/[skillId]/route.ts +347 -0
  360. package/apps/web/.next/types/app/api/agents/[id]/skills/route.ts +347 -0
  361. package/apps/web/.next/types/app/api/agents/[id]/slack-info/route.ts +347 -0
  362. package/apps/web/.next/types/app/api/agents/[id]/snapshots/[sid]/restore/route.ts +347 -0
  363. package/apps/web/.next/types/app/api/agents/[id]/snapshots/[sid]/route.ts +347 -0
  364. package/apps/web/.next/types/app/api/agents/[id]/snapshots/route.ts +347 -0
  365. package/apps/web/.next/types/app/api/agents/[id]/start/route.ts +347 -0
  366. package/apps/web/.next/types/app/api/agents/[id]/stop/route.ts +347 -0
  367. package/apps/web/.next/types/app/api/agents/route.ts +347 -0
  368. package/apps/web/.next/types/app/api/auth/login/route.ts +347 -0
  369. package/apps/web/.next/types/app/api/auth/logout/route.ts +347 -0
  370. package/apps/web/.next/types/app/api/auth/me/route.ts +347 -0
  371. package/apps/web/.next/types/app/api/auth/users/[id]/route.ts +347 -0
  372. package/apps/web/.next/types/app/api/auth/users/route.ts +347 -0
  373. package/apps/web/.next/types/app/api/env-vars/[key]/route.ts +347 -0
  374. package/apps/web/.next/types/app/api/env-vars/route.ts +347 -0
  375. package/apps/web/.next/types/app/api/jobs/[id]/route.ts +347 -0
  376. package/apps/web/.next/types/app/api/jobs/[id]/runs/route.ts +347 -0
  377. package/apps/web/.next/types/app/api/jobs/route.ts +347 -0
  378. package/apps/web/.next/types/app/api/mcps/[id]/route.ts +347 -0
  379. package/apps/web/.next/types/app/api/mcps/[id]/test/route.ts +347 -0
  380. package/apps/web/.next/types/app/api/mcps/route.ts +347 -0
  381. package/apps/web/.next/types/app/api/settings/route.ts +347 -0
  382. package/apps/web/.next/types/app/jobs/page.ts +84 -0
  383. package/apps/web/.next/types/app/login/layout.ts +84 -0
  384. package/apps/web/.next/types/app/login/page.ts +84 -0
  385. package/apps/web/.next/types/app/page.ts +84 -0
  386. package/apps/web/.next/types/app/settings/env-vars/page.ts +84 -0
  387. package/apps/web/.next/types/app/settings/mcps/page.ts +84 -0
  388. package/apps/web/.next/types/app/settings/page.ts +84 -0
  389. package/apps/web/.next/types/cache-life.d.ts +141 -0
  390. package/apps/web/.next/types/package.json +1 -0
  391. package/apps/web/.next/types/routes.d.ts +114 -0
  392. package/apps/web/.next/types/validator.ts +448 -0
  393. package/apps/web/Dockerfile +37 -0
  394. package/apps/web/next-env.d.ts +6 -0
  395. package/apps/web/next.config.js +6 -0
  396. package/apps/web/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
  397. package/apps/web/package.json +48 -0
  398. package/apps/web/postcss.config.js +3 -0
  399. package/apps/web/public/logo.svg +17 -0
  400. package/apps/web/src/app/agents/[slug]/page.tsx +2235 -0
  401. package/apps/web/src/app/agents/new/page.tsx +1161 -0
  402. package/apps/web/src/app/api/agents/[id]/access/route.ts +76 -0
  403. package/apps/web/src/app/api/agents/[id]/claude-md/route.ts +111 -0
  404. package/apps/web/src/app/api/agents/[id]/logs/route.ts +84 -0
  405. package/apps/web/src/app/api/agents/[id]/manifest/route.ts +32 -0
  406. package/apps/web/src/app/api/agents/[id]/mcps/route.ts +73 -0
  407. package/apps/web/src/app/api/agents/[id]/memories/[memId]/route.ts +31 -0
  408. package/apps/web/src/app/api/agents/[id]/memories/route.ts +56 -0
  409. package/apps/web/src/app/api/agents/[id]/permissions/route.ts +74 -0
  410. package/apps/web/src/app/api/agents/[id]/reload/route.ts +33 -0
  411. package/apps/web/src/app/api/agents/[id]/restrictions/route.ts +85 -0
  412. package/apps/web/src/app/api/agents/[id]/route.ts +81 -0
  413. package/apps/web/src/app/api/agents/[id]/skills/[skillId]/route.ts +52 -0
  414. package/apps/web/src/app/api/agents/[id]/skills/route.ts +80 -0
  415. package/apps/web/src/app/api/agents/[id]/slack-info/route.ts +38 -0
  416. package/apps/web/src/app/api/agents/[id]/snapshots/[sid]/restore/route.ts +61 -0
  417. package/apps/web/src/app/api/agents/[id]/snapshots/[sid]/route.ts +53 -0
  418. package/apps/web/src/app/api/agents/[id]/snapshots/route.ts +84 -0
  419. package/apps/web/src/app/api/agents/[id]/start/route.ts +35 -0
  420. package/apps/web/src/app/api/agents/[id]/stop/route.ts +35 -0
  421. package/apps/web/src/app/api/agents/route.ts +99 -0
  422. package/apps/web/src/app/api/auth/login/route.ts +39 -0
  423. package/apps/web/src/app/api/auth/logout/route.ts +21 -0
  424. package/apps/web/src/app/api/auth/me/route.ts +24 -0
  425. package/apps/web/src/app/api/auth/users/[id]/route.ts +48 -0
  426. package/apps/web/src/app/api/auth/users/route.ts +63 -0
  427. package/apps/web/src/app/api/env-vars/[key]/route.ts +66 -0
  428. package/apps/web/src/app/api/env-vars/route.ts +59 -0
  429. package/apps/web/src/app/api/jobs/[id]/route.ts +51 -0
  430. package/apps/web/src/app/api/jobs/[id]/runs/route.ts +24 -0
  431. package/apps/web/src/app/api/jobs/route.ts +42 -0
  432. package/apps/web/src/app/api/mcps/[id]/route.ts +60 -0
  433. package/apps/web/src/app/api/mcps/[id]/test/route.ts +195 -0
  434. package/apps/web/src/app/api/mcps/route.ts +72 -0
  435. package/apps/web/src/app/api/settings/route.ts +42 -0
  436. package/apps/web/src/app/globals.css +124 -0
  437. package/apps/web/src/app/icon.svg +17 -0
  438. package/apps/web/src/app/jobs/page.tsx +543 -0
  439. package/apps/web/src/app/layout-shell.tsx +89 -0
  440. package/apps/web/src/app/layout.tsx +18 -0
  441. package/apps/web/src/app/login/layout.tsx +9 -0
  442. package/apps/web/src/app/login/page.tsx +150 -0
  443. package/apps/web/src/app/page.tsx +573 -0
  444. package/apps/web/src/app/settings/env-vars/page.tsx +216 -0
  445. package/apps/web/src/app/settings/mcps/page.tsx +763 -0
  446. package/apps/web/src/app/settings/page.tsx +528 -0
  447. package/apps/web/src/app/sidebar.tsx +345 -0
  448. package/apps/web/src/lib/__tests__/api-guard.test.ts +189 -0
  449. package/apps/web/src/lib/__tests__/auth.test.ts +262 -0
  450. package/apps/web/src/lib/__tests__/boss-registry.test.ts +323 -0
  451. package/apps/web/src/lib/__tests__/compile.test.ts +161 -0
  452. package/apps/web/src/lib/__tests__/db-agent-hierarchy.test.ts +136 -0
  453. package/apps/web/src/lib/__tests__/db-env-vars.test.ts +216 -0
  454. package/apps/web/src/lib/__tests__/db-restrictions.test.ts +117 -0
  455. package/apps/web/src/lib/__tests__/db.integration.test.ts +271 -0
  456. package/apps/web/src/lib/__tests__/diff.test.ts +102 -0
  457. package/apps/web/src/lib/__tests__/mcp-mask.test.ts +274 -0
  458. package/apps/web/src/lib/__tests__/skill-templates.test.ts +237 -0
  459. package/apps/web/src/lib/__tests__/slack-manifest.test.ts +105 -0
  460. package/apps/web/src/lib/api-guard.ts +68 -0
  461. package/apps/web/src/lib/auth-context.tsx +71 -0
  462. package/apps/web/src/lib/auth.ts +128 -0
  463. package/apps/web/src/lib/boss-registry.ts +90 -0
  464. package/apps/web/src/lib/compile.ts +51 -0
  465. package/apps/web/src/lib/db.ts +1196 -0
  466. package/apps/web/src/lib/diff.ts +43 -0
  467. package/apps/web/src/lib/mcp-mask.ts +91 -0
  468. package/apps/web/src/lib/portal.tsx +23 -0
  469. package/apps/web/src/lib/skill-templates.ts +148 -0
  470. package/apps/web/src/lib/slack-manifest.ts +85 -0
  471. package/apps/web/src/middleware.ts +68 -0
  472. package/apps/web/tailwind.config.js +6 -0
  473. package/apps/web/tsconfig.json +23 -0
  474. package/apps/web/vitest.config.mts +21 -0
  475. package/cli/.claude/settings.local.json +6 -0
  476. package/cli/README.md +281 -0
  477. package/cli/node_modules/.package-lock.json +427 -0
  478. package/cli/node_modules/commander/LICENSE +22 -0
  479. package/cli/node_modules/commander/Readme.md +1157 -0
  480. package/cli/node_modules/commander/esm.mjs +16 -0
  481. package/cli/node_modules/commander/index.js +24 -0
  482. package/cli/node_modules/commander/lib/argument.js +149 -0
  483. package/cli/node_modules/commander/lib/command.js +2509 -0
  484. package/cli/node_modules/commander/lib/error.js +39 -0
  485. package/cli/node_modules/commander/lib/help.js +520 -0
  486. package/cli/node_modules/commander/lib/option.js +330 -0
  487. package/cli/node_modules/commander/lib/suggestSimilar.js +101 -0
  488. package/cli/node_modules/commander/package-support.json +16 -0
  489. package/cli/node_modules/commander/package.json +84 -0
  490. package/cli/node_modules/commander/typings/esm.d.mts +3 -0
  491. package/cli/node_modules/commander/typings/index.d.ts +969 -0
  492. package/cli/package-lock.json +449 -0
  493. package/cli/package.json +44 -0
  494. package/cli/src/commands/init.ts +514 -0
  495. package/cli/src/commands/manage.ts +115 -0
  496. package/cli/src/index.ts +63 -0
  497. package/cli/tsconfig.json +14 -0
  498. package/docker-compose.yml +122 -0
  499. package/docs/agents/boss-agents.mdx +108 -0
  500. package/docs/agents/creating-agents.mdx +132 -0
  501. package/docs/agents/memory.mdx +113 -0
  502. package/docs/agents/tools.mdx +103 -0
  503. package/docs/configuration/env-vars.mdx +166 -0
  504. package/docs/configuration/mcp-servers.mdx +203 -0
  505. package/docs/configuration/slack-app.mdx +175 -0
  506. package/docs/docs.json +79 -0
  507. package/docs/favicon.svg +17 -0
  508. package/docs/features/history.mdx +60 -0
  509. package/docs/features/import-export.mdx +77 -0
  510. package/docs/features/logs.mdx +131 -0
  511. package/docs/features/multi-workspace.mdx +90 -0
  512. package/docs/features/scheduled-jobs.mdx +231 -0
  513. package/docs/features/users.mdx +92 -0
  514. package/docs/introduction.mdx +160 -0
  515. package/docs/logo/dark.svg +17 -0
  516. package/docs/logo/light.svg +17 -0
  517. package/docs/logo/wide-dark.svg +12 -0
  518. package/docs/logo/wide-light.svg +12 -0
  519. package/docs/quickstart.mdx +270 -0
  520. package/docs/self-hosting/docker.mdx +151 -0
  521. package/docs/self-hosting/production.mdx +176 -0
  522. package/package.json +19 -36
  523. package/packages/shared/dist/index.d.ts +8 -0
  524. package/packages/shared/dist/index.d.ts.map +1 -0
  525. package/packages/shared/dist/index.js +24 -0
  526. package/packages/shared/dist/index.js.map +1 -0
  527. package/packages/shared/dist/types.d.ts +584 -0
  528. package/packages/shared/dist/types.d.ts.map +1 -0
  529. package/packages/shared/dist/types.js +39 -0
  530. package/packages/shared/dist/types.js.map +1 -0
  531. package/packages/shared/package.json +15 -0
  532. package/packages/shared/src/db/schema.sql +354 -0
  533. package/packages/shared/src/index.ts +8 -0
  534. package/packages/shared/src/types.ts +683 -0
  535. package/packages/shared/tsconfig.json +17 -0
  536. package/scripts/dev.sh +45 -0
  537. /package/{dist → cli/dist}/commands/init.d.ts +0 -0
  538. /package/{dist → cli/dist}/commands/init.js +0 -0
  539. /package/{dist → cli/dist}/commands/manage.d.ts +0 -0
  540. /package/{dist → cli/dist}/commands/manage.js +0 -0
  541. /package/{dist → cli/dist}/index.d.ts +0 -0
  542. /package/{dist → cli/dist}/index.js +0 -0
@@ -0,0 +1,204 @@
1
+ # Contributing to SlackHive
2
+
3
+ Thank you for your interest in contributing to SlackHive! This document covers everything you need to get started. For a general introduction to contributing on GitHub, see the [GitHub contributing guide](https://docs.github.com/en/get-started/exploring-projects-on-github/contributing-to-a-project).
4
+
5
+ ---
6
+
7
+ ## Table of Contents
8
+
9
+ - [Prerequisites](#prerequisites)
10
+ - [Local Development Setup](#local-development-setup)
11
+ - [Repository Structure](#repository-structure)
12
+ - [Branch Naming](#branch-naming)
13
+ - [Commit Style](#commit-style)
14
+ - [Pull Request Process](#pull-request-process)
15
+ - [Code Standards](#code-standards)
16
+ - [Reporting Bugs and Requesting Features](#reporting-bugs-and-requesting-features)
17
+
18
+ ---
19
+
20
+ ## Prerequisites
21
+
22
+ Before you begin, ensure the following tools are installed:
23
+
24
+ | Tool | Minimum Version | Notes |
25
+ |------|----------------|-------|
26
+ | [Docker](https://docs.docker.com/get-docker/) | 24+ | Required for running Postgres, Redis, and the full stack |
27
+ | [Docker Compose](https://docs.docker.com/compose/install/) | v2.20+ | Bundled with Docker Desktop |
28
+ | [Node.js](https://nodejs.org/) | 20+ | Used for running apps locally outside Docker |
29
+ | [git](https://git-scm.com/) | 2.38+ | |
30
+
31
+ > **Note:** Never run `npm`/`node` directly on your host machine for production-style testing — always use Docker or `docker compose` for infrastructure services (Postgres, Redis).
32
+
33
+ ---
34
+
35
+ ## Local Development Setup
36
+
37
+ ### 1. Fork and clone the repository
38
+
39
+ ```bash
40
+ # Fork via GitHub UI, then clone your fork
41
+ git clone https://github.com/<your-username>/slackhive.git
42
+ cd slackhive
43
+
44
+ # Add the upstream remote
45
+ git remote add upstream https://github.com/pelago-labs/slackhive.git
46
+ ```
47
+
48
+ ### 2. Set up environment variables
49
+
50
+ Each app has its own `.env` file. Start from the provided examples:
51
+
52
+ ```bash
53
+ cp apps/web/.env.example apps/web/.env
54
+ cp apps/runner/.env.example apps/runner/.env
55
+ ```
56
+
57
+ Edit each `.env` with your Slack app credentials, Anthropic API key, and other required values. Refer to the `README.md` for a description of each variable.
58
+
59
+ ### 3. Start infrastructure services
60
+
61
+ ```bash
62
+ docker compose up postgres redis -d
63
+ ```
64
+
65
+ This starts Postgres and Redis in the background. They will be available on their default ports.
66
+
67
+ ### 4. Install dependencies
68
+
69
+ ```bash
70
+ npm install
71
+ ```
72
+
73
+ This installs dependencies for all workspaces (`apps/web`, `apps/runner`, `packages/shared`, `cli`) via npm workspaces.
74
+
75
+ ### 5. Build the shared package
76
+
77
+ The shared package must be built before dependent apps can start:
78
+
79
+ ```bash
80
+ npm run build --workspace=packages/shared
81
+ ```
82
+
83
+ ### 6. Run database migrations
84
+
85
+ ```bash
86
+ # Inside the web app
87
+ cd apps/web && npx prisma migrate dev
88
+ ```
89
+
90
+ ### 7. Start the development servers
91
+
92
+ Open separate terminals for each app:
93
+
94
+ ```bash
95
+ # Terminal 1 — Next.js web app
96
+ cd apps/web && npm run dev
97
+
98
+ # Terminal 2 — Node runner
99
+ cd apps/runner && npm run dev
100
+ ```
101
+
102
+ The web app is available at [http://localhost:3000](http://localhost:3000) by default.
103
+
104
+ ---
105
+
106
+ ## Repository Structure
107
+
108
+ ```
109
+ slackhive/
110
+ ├── apps/
111
+ │ ├── web/ # Next.js web application (dashboard, API routes)
112
+ │ └── runner/ # Node.js agent runner
113
+ ├── packages/
114
+ │ └── shared/ # Shared TypeScript types and utilities
115
+ ├── cli/ # SlackHive CLI tool
116
+ ├── scripts/ # Development helper scripts
117
+ └── docker-compose.yml
118
+ ```
119
+
120
+ ---
121
+
122
+ ## Branch Naming
123
+
124
+ Use the following prefixes for all branches, branched from `main`:
125
+
126
+ | Prefix | Use for |
127
+ |--------|---------|
128
+ | `feat/` | New features (e.g., `feat/agent-memory-viewer`) |
129
+ | `fix/` | Bug fixes (e.g., `fix/slack-oauth-redirect`) |
130
+ | `chore/` | Maintenance, deps, tooling (e.g., `chore/update-prisma`) |
131
+ | `docs/` | Documentation only (e.g., `docs/setup-guide`) |
132
+
133
+ ---
134
+
135
+ ## Commit Style
136
+
137
+ SlackHive uses [Conventional Commits](https://www.conventionalcommits.org/). Each commit message must follow this format:
138
+
139
+ ```
140
+ <type>(<optional scope>): <short description>
141
+
142
+ [optional body]
143
+
144
+ [optional footer]
145
+ ```
146
+
147
+ **Types:**
148
+
149
+ | Type | Description |
150
+ |------|-------------|
151
+ | `feat` | A new feature |
152
+ | `fix` | A bug fix |
153
+ | `chore` | Build process, tooling, or dependency updates |
154
+ | `docs` | Documentation changes only |
155
+ | `refactor` | Code change that is neither a fix nor a feature |
156
+ | `test` | Adding or updating tests |
157
+ | `perf` | Performance improvements |
158
+ | `ci` | CI configuration changes |
159
+
160
+ **Examples:**
161
+
162
+ ```
163
+ feat(web): add per-agent write access control toggle
164
+ fix(runner): resolve race condition in job scheduler
165
+ chore: upgrade Prisma to 5.14
166
+ docs: add CONTRIBUTING guide
167
+ ```
168
+
169
+ Keep the subject line under 72 characters and use the imperative mood ("add", not "added" or "adds").
170
+
171
+ ---
172
+
173
+ ## Pull Request Process
174
+
175
+ 1. **Fork** the repository and create your branch from `main`.
176
+ 2. **Implement** your changes following the code standards below.
177
+ 3. **Test** your changes locally with `docker compose up postgres redis -d` and the dev servers running.
178
+ 4. **Push** your branch to your fork.
179
+ 5. **Open a PR** against the `main` branch of `pelago-labs/slackhive`.
180
+ 6. Fill in the **PR template** completely, including screenshots for any UI changes.
181
+ 7. Address any review feedback.
182
+
183
+ PRs should be focused — one logical change per PR. Large refactors should be discussed in a GitHub Discussion or Issue first.
184
+
185
+ **Merging:** Maintainers merge PRs using squash-and-merge to keep the commit history clean.
186
+
187
+ ---
188
+
189
+ ## Code Standards
190
+
191
+ - **TypeScript** — all code must be fully typed; avoid `any` unless strictly necessary.
192
+ - **Docstrings** — use [TSDoc](https://tsdoc.org/) / JSDoc-style comments for all exported functions, classes, and types (Google-style param/return descriptions).
193
+ - **Formatting** — the project uses ESLint and Prettier. Run `npm run lint` in the relevant workspace before submitting.
194
+ - **No secrets** — never commit API keys, tokens, or credentials. Use `.env` files (already `.gitignore`d).
195
+
196
+ ---
197
+
198
+ ## Reporting Bugs and Requesting Features
199
+
200
+ - **Bugs:** Open a [bug report issue](https://github.com/pelago-labs/slackhive/issues/new?template=bug_report.yml).
201
+ - **Features:** Open a [feature request issue](https://github.com/pelago-labs/slackhive/issues/new?template=feature_request.yml).
202
+ - **Questions / discussions:** Use [GitHub Discussions](https://github.com/pelago-labs/slackhive/discussions).
203
+
204
+ Please do **not** use public issues to report security vulnerabilities. See [SECURITY.md](SECURITY.md) for the responsible disclosure process.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Pelago Labs
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -152,6 +152,7 @@ Every agent is a full **Claude Code** agent — with tools, memory, identity, an
152
152
  | 🚦 **Channel Restrictions** | Lock agents to specific Slack channels. Bot auto-leaves uninvited channels with a notice. |
153
153
  | 📊 **Live Logs** | SSE-streamed log output per agent — with level filters and search. |
154
154
  | 🧠 **Memory Viewer** | Browse, inspect, and delete agent memories by type — feedback, user, project, reference. |
155
+ | 🌐 **Multi-Workspace** | Connect multiple Slack workspaces to a single SlackHive instance. Each workspace gets its own agents and configurations. |
155
156
 
156
157
  ---
157
158
 
@@ -199,6 +200,24 @@ ANTHROPIC_API_KEY=sk-ant-api03-...
199
200
  Billed per token via the Anthropic API. Best for teams and production.
200
201
 
201
202
  **Option B — Claude Pro or Max Subscription**
203
+
204
+ First, install Claude Code on your host machine:
205
+
206
+ > **Note:** Do not install via `npm` — the npm package is deprecated and incompatible with SlackHive.
207
+
208
+ MacOS/Linux (Recommended):
209
+ ```bash
210
+ curl -fsSL https://claude.ai/install.sh | bash
211
+ ```
212
+
213
+ Homebrew (macOS/Linux):
214
+ ```bash
215
+ brew install --cask claude-code
216
+ ```
217
+
218
+ For more installation options, uninstall steps, and troubleshooting, see the [setup documentation](https://docs.anthropic.com/en/docs/claude-code/setup).
219
+
220
+ Then log in:
202
221
  ```bash
203
222
  claude login # run on host machine, saves credentials to ~/.claude/
204
223
  ```
package/SECURITY.md ADDED
@@ -0,0 +1,47 @@
1
+ # Security Policy
2
+
3
+ ## Supported Versions
4
+
5
+ Only the latest release of SlackHive receives security fixes.
6
+
7
+ | Version | Supported |
8
+ |---------|-----------|
9
+ | 0.1.x (latest) | ✅ |
10
+ | < 0.1.x | ❌ |
11
+
12
+ ## Reporting a Vulnerability
13
+
14
+ **Please do not report security vulnerabilities through public GitHub issues.**
15
+
16
+ Instead, use [GitHub's private security advisory feature](https://docs.github.com/en/code-security/security-advisories/guidance-on-reporting-and-writing/privately-reporting-a-security-vulnerability) to report vulnerabilities confidentially:
17
+
18
+ 1. Go to the [Security tab](https://github.com/pelago-labs/slackhive/security/advisories/new) of this repository
19
+ 2. Click **"Report a vulnerability"**
20
+ 3. Fill in the details
21
+
22
+ Alternatively, email **conduct@slackhive.dev** with the subject line `[SECURITY] <brief description>`.
23
+
24
+ ## Response Timeline
25
+
26
+ | Stage | Target |
27
+ |-------|--------|
28
+ | Acknowledgement | Within 48 hours |
29
+ | Initial assessment | Within 5 business days |
30
+ | Patch for critical issues | Within 14 days |
31
+ | Patch for moderate issues | Within 30 days |
32
+
33
+ ## Scope
34
+
35
+ Issues we consider in-scope:
36
+
37
+ - Authentication bypass or session hijacking
38
+ - SQL injection or data exposure
39
+ - SSRF via MCP server configuration
40
+ - Privilege escalation between user roles
41
+ - Secrets leaked in logs or API responses
42
+
43
+ Out of scope:
44
+
45
+ - Vulnerabilities in third-party dependencies (report to upstream)
46
+ - Rate limiting / DoS on self-hosted instances
47
+ - Issues requiring physical access to the host
@@ -0,0 +1,33 @@
1
+ FROM node:20-alpine AS base
2
+ WORKDIR /app
3
+ RUN apk add --no-cache curl
4
+
5
+ # Install deps
6
+ FROM base AS deps
7
+ COPY package.json package-lock.json ./
8
+ COPY packages/shared/package.json ./packages/shared/
9
+ COPY apps/runner/package.json ./apps/runner/
10
+ RUN npm ci
11
+
12
+ # Build
13
+ FROM deps AS builder
14
+ COPY packages/shared ./packages/shared
15
+ COPY apps/runner ./apps/runner
16
+ RUN cd packages/shared && npx tsc --skipLibCheck || true
17
+ RUN cd apps/runner && npx tsc --skipLibCheck || true
18
+
19
+ # Runtime — lean image, no build tools
20
+ FROM node:20-alpine AS runner
21
+ ENV NODE_ENV=production
22
+ WORKDIR /app
23
+ # Install git, Python, pip and graphify for Bash-enabled agents
24
+ RUN apk add --no-cache bash git python3 py3-pip
25
+ COPY --from=builder /app/node_modules ./node_modules
26
+ # Create claude wrapper that uses the SDK's bundled CLI
27
+ RUN printf '#!/bin/sh\ncd /app/node_modules/@anthropic-ai/claude-agent-sdk && exec node cli.js "$@"\n' > /usr/local/bin/claude && \
28
+ chmod +x /usr/local/bin/claude
29
+ COPY --from=builder /app/packages/shared ./packages/shared
30
+ COPY --from=builder /app/apps/runner ./apps/runner
31
+ COPY --from=builder /app/package.json ./
32
+
33
+ CMD ["node", "apps/runner/dist/index.js"]
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @fileoverview Unit tests for isChannelRestricted in slack-handler.ts.
3
+ *
4
+ * Pure function — no mocks needed.
5
+ *
6
+ * @module runner/__tests__/channel-restrictions.test
7
+ */
8
+ export {};
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ /**
3
+ * @fileoverview Unit tests for isChannelRestricted in slack-handler.ts.
4
+ *
5
+ * Pure function — no mocks needed.
6
+ *
7
+ * @module runner/__tests__/channel-restrictions.test
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ const vitest_1 = require("vitest");
11
+ const slack_handler_1 = require("../slack-handler");
12
+ // ─── Helpers ──────────────────────────────────────────────────────────────────
13
+ function makeRestriction(allowedChannels) {
14
+ return {
15
+ id: 'r-001',
16
+ agentId: 'a-001',
17
+ allowedChannels,
18
+ updatedAt: new Date(),
19
+ };
20
+ }
21
+ // ─── isChannelRestricted ──────────────────────────────────────────────────────
22
+ (0, vitest_1.describe)('isChannelRestricted', () => {
23
+ (0, vitest_1.it)('returns false when restrictions is null', () => {
24
+ (0, vitest_1.expect)((0, slack_handler_1.isChannelRestricted)('C_ANY', null)).toBe(false);
25
+ });
26
+ (0, vitest_1.it)('returns false when allowedChannels is empty (unrestricted)', () => {
27
+ (0, vitest_1.expect)((0, slack_handler_1.isChannelRestricted)('C_ANY', makeRestriction([]))).toBe(false);
28
+ });
29
+ (0, vitest_1.it)('returns false when channel is in the allowedChannels list', () => {
30
+ const r = makeRestriction(['C_ALLOWED', 'C_OTHER']);
31
+ (0, vitest_1.expect)((0, slack_handler_1.isChannelRestricted)('C_ALLOWED', r)).toBe(false);
32
+ });
33
+ (0, vitest_1.it)('returns true when channel is NOT in the allowedChannels list', () => {
34
+ const r = makeRestriction(['C_ALLOWED']);
35
+ (0, vitest_1.expect)((0, slack_handler_1.isChannelRestricted)('C_BLOCKED', r)).toBe(true);
36
+ });
37
+ (0, vitest_1.it)('returns true for a DM channel not in the allowedChannels list', () => {
38
+ const r = makeRestriction(['C_ALLOWED']);
39
+ (0, vitest_1.expect)((0, slack_handler_1.isChannelRestricted)('D_DM_CHANNEL', r)).toBe(true);
40
+ });
41
+ (0, vitest_1.it)('returns false for a DM channel that is explicitly in the allowedChannels list', () => {
42
+ const r = makeRestriction(['D_DM_CHANNEL', 'C_ALLOWED']);
43
+ (0, vitest_1.expect)((0, slack_handler_1.isChannelRestricted)('D_DM_CHANNEL', r)).toBe(false);
44
+ });
45
+ (0, vitest_1.it)('is case-sensitive — does not match wrong case', () => {
46
+ const r = makeRestriction(['C_abc123']);
47
+ (0, vitest_1.expect)((0, slack_handler_1.isChannelRestricted)('C_ABC123', r)).toBe(true);
48
+ });
49
+ (0, vitest_1.it)('handles a single-channel allowlist correctly — allowed', () => {
50
+ const r = makeRestriction(['C_ONLY']);
51
+ (0, vitest_1.expect)((0, slack_handler_1.isChannelRestricted)('C_ONLY', r)).toBe(false);
52
+ });
53
+ (0, vitest_1.it)('handles a single-channel allowlist correctly — blocked', () => {
54
+ const r = makeRestriction(['C_ONLY']);
55
+ (0, vitest_1.expect)((0, slack_handler_1.isChannelRestricted)('C_OTHER', r)).toBe(true);
56
+ });
57
+ (0, vitest_1.it)('returns false when allowedChannels has many entries and channel matches one', () => {
58
+ const channels = ['C_1', 'C_2', 'C_3', 'C_4', 'C_5'];
59
+ const r = makeRestriction(channels);
60
+ (0, vitest_1.expect)((0, slack_handler_1.isChannelRestricted)('C_3', r)).toBe(false);
61
+ });
62
+ });
63
+ //# sourceMappingURL=channel-restrictions.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel-restrictions.test.js","sourceRoot":"","sources":["../../src/__tests__/channel-restrictions.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * @fileoverview Unit tests for ClaudeHandler.resolveServerConfig and resolveEnvRefs.
3
+ *
4
+ * Tests cover:
5
+ * - envRefs resolution: subprocess env var is set from the env vars store value
6
+ * - envRefs missing key: warning logged, key omitted
7
+ * - Inline env + envRefs merged: both contribute to the resolved env object
8
+ * - envRefs stripped from the returned config (SDK doesn't understand it)
9
+ * - tsSource: source written to disk, config rewritten to use tsx
10
+ * - Plain stdio config without envRefs returned unchanged
11
+ *
12
+ * ClaudeHandler is instantiated with a minimal Agent and no MCP servers so the
13
+ * constructor side-effects (port hashing, McpProcessManager) are contained.
14
+ * The private methods are accessed via `(handler as any)` to avoid exposing them.
15
+ *
16
+ * No database, no Slack, no filesystem writes for the non-tsSource tests.
17
+ *
18
+ * @module runner/__tests__/claude-handler-resolve.test
19
+ */
20
+ export {};
@@ -0,0 +1,178 @@
1
+ "use strict";
2
+ /**
3
+ * @fileoverview Unit tests for ClaudeHandler.resolveServerConfig and resolveEnvRefs.
4
+ *
5
+ * Tests cover:
6
+ * - envRefs resolution: subprocess env var is set from the env vars store value
7
+ * - envRefs missing key: warning logged, key omitted
8
+ * - Inline env + envRefs merged: both contribute to the resolved env object
9
+ * - envRefs stripped from the returned config (SDK doesn't understand it)
10
+ * - tsSource: source written to disk, config rewritten to use tsx
11
+ * - Plain stdio config without envRefs returned unchanged
12
+ *
13
+ * ClaudeHandler is instantiated with a minimal Agent and no MCP servers so the
14
+ * constructor side-effects (port hashing, McpProcessManager) are contained.
15
+ * The private methods are accessed via `(handler as any)` to avoid exposing them.
16
+ *
17
+ * No database, no Slack, no filesystem writes for the non-tsSource tests.
18
+ *
19
+ * @module runner/__tests__/claude-handler-resolve.test
20
+ */
21
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
22
+ if (k2 === undefined) k2 = k;
23
+ var desc = Object.getOwnPropertyDescriptor(m, k);
24
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
25
+ desc = { enumerable: true, get: function() { return m[k]; } };
26
+ }
27
+ Object.defineProperty(o, k2, desc);
28
+ }) : (function(o, m, k, k2) {
29
+ if (k2 === undefined) k2 = k;
30
+ o[k2] = m[k];
31
+ }));
32
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
33
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
34
+ }) : function(o, v) {
35
+ o["default"] = v;
36
+ });
37
+ var __importStar = (this && this.__importStar) || (function () {
38
+ var ownKeys = function(o) {
39
+ ownKeys = Object.getOwnPropertyNames || function (o) {
40
+ var ar = [];
41
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
42
+ return ar;
43
+ };
44
+ return ownKeys(o);
45
+ };
46
+ return function (mod) {
47
+ if (mod && mod.__esModule) return mod;
48
+ var result = {};
49
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
50
+ __setModuleDefault(result, mod);
51
+ return result;
52
+ };
53
+ })();
54
+ Object.defineProperty(exports, "__esModule", { value: true });
55
+ const fs = __importStar(require("fs"));
56
+ const path = __importStar(require("path"));
57
+ const os = __importStar(require("os"));
58
+ const vitest_1 = require("vitest");
59
+ const claude_handler_js_1 = require("../claude-handler.js");
60
+ // ─── Helpers ─────────────────────────────────────────────────────────────────
61
+ function makeAgent(overrides = {}) {
62
+ return {
63
+ id: 'agent-1',
64
+ name: 'Test Agent',
65
+ slug: 'test-agent',
66
+ description: '',
67
+ slackBotToken: 'xoxb-test',
68
+ slackAppToken: 'xapp-test',
69
+ slackSigningSecret: 'secret',
70
+ model: 'claude-opus-4-6',
71
+ status: 'stopped',
72
+ enabled: true,
73
+ isBoss: false,
74
+ reportsTo: [],
75
+ claudeMd: '',
76
+ createdBy: 'system',
77
+ createdAt: new Date(),
78
+ updatedAt: new Date(),
79
+ ...overrides,
80
+ };
81
+ }
82
+ function makeHandler(envVarValues = {}, workDir = '/tmp/test-handler') {
83
+ return new claude_handler_js_1.ClaudeHandler(makeAgent(), [], null, workDir, envVarValues);
84
+ }
85
+ // ─── resolveServerConfig — envRefs ───────────────────────────────────────────
86
+ (0, vitest_1.describe)('resolveServerConfig — envRefs resolution', () => {
87
+ (0, vitest_1.it)('resolves an envRef to the store value', () => {
88
+ const handler = makeHandler({ REDSHIFT_DATABASE_URL: 'postgres://host/db' });
89
+ const config = {
90
+ command: 'node',
91
+ args: ['server.js'],
92
+ envRefs: { DATABASE_URL: 'REDSHIFT_DATABASE_URL' },
93
+ };
94
+ const result = handler.resolveServerConfig('my-mcp', config);
95
+ const env = result.env;
96
+ (0, vitest_1.expect)(env.DATABASE_URL).toBe('postgres://host/db');
97
+ });
98
+ (0, vitest_1.it)('strips envRefs from the resolved config', () => {
99
+ const handler = makeHandler({ MY_KEY: 'my-value' });
100
+ const config = { command: 'node', args: [], envRefs: { ENV_KEY: 'MY_KEY' } };
101
+ const result = handler.resolveServerConfig('srv', config);
102
+ (0, vitest_1.expect)(result.envRefs).toBeUndefined();
103
+ });
104
+ (0, vitest_1.it)('merges inline env with resolved envRefs', () => {
105
+ const handler = makeHandler({ STORE_KEY: 'store-value' });
106
+ const config = {
107
+ command: 'node',
108
+ args: [],
109
+ env: { INLINE_VAR: 'inline-value' },
110
+ envRefs: { REF_VAR: 'STORE_KEY' },
111
+ };
112
+ const result = handler.resolveServerConfig('srv', config);
113
+ const env = result.env;
114
+ (0, vitest_1.expect)(env.INLINE_VAR).toBe('inline-value');
115
+ (0, vitest_1.expect)(env.REF_VAR).toBe('store-value');
116
+ });
117
+ (0, vitest_1.it)('omits the key when the store entry does not exist', () => {
118
+ const handler = makeHandler({}); // empty store
119
+ const config = { command: 'node', args: [], envRefs: { MISSING: 'NOT_IN_STORE' } };
120
+ const result = handler.resolveServerConfig('srv', config);
121
+ const env = (result.env ?? {});
122
+ (0, vitest_1.expect)('MISSING' in env).toBe(false);
123
+ });
124
+ (0, vitest_1.it)('returns config unchanged when envRefs is absent', () => {
125
+ const handler = makeHandler({ KEY: 'val' });
126
+ const config = { command: 'node', args: ['s.js'], env: { LOCAL: 'x' } };
127
+ const result = handler.resolveServerConfig('srv', config);
128
+ (0, vitest_1.expect)(result).toEqual(config);
129
+ });
130
+ (0, vitest_1.it)('returns config unchanged when envRefs is an empty object', () => {
131
+ const handler = makeHandler({ KEY: 'val' });
132
+ const config = { command: 'node', args: [], envRefs: {} };
133
+ const result = handler.resolveServerConfig('srv', config);
134
+ (0, vitest_1.expect)(result).toEqual(config);
135
+ });
136
+ });
137
+ // ─── resolveServerConfig — tsSource ──────────────────────────────────────────
138
+ (0, vitest_1.describe)('resolveServerConfig — tsSource rewrites to tsx', () => {
139
+ let tmpDir;
140
+ (0, vitest_1.afterEach)(() => {
141
+ if (tmpDir && fs.existsSync(tmpDir)) {
142
+ fs.rmSync(tmpDir, { recursive: true, force: true });
143
+ }
144
+ });
145
+ (0, vitest_1.it)('writes tsSource to disk and sets command to tsx', () => {
146
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'claude-handler-test-'));
147
+ const handler = makeHandler({}, tmpDir);
148
+ const src = 'console.log("hello from ts mcp");';
149
+ const config = { command: 'ignored', args: [], tsSource: src };
150
+ const result = handler.resolveServerConfig('my-ts-mcp', config);
151
+ (0, vitest_1.expect)(result.command).toBe('/app/node_modules/.bin/tsx');
152
+ (0, vitest_1.expect)(Array.isArray(result.args)).toBe(true);
153
+ const scriptPath = result.args[0];
154
+ (0, vitest_1.expect)(scriptPath).toContain('my-ts-mcp.ts');
155
+ (0, vitest_1.expect)(fs.readFileSync(scriptPath, 'utf8')).toBe(src);
156
+ });
157
+ (0, vitest_1.it)('strips tsSource from the resolved config', () => {
158
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'claude-handler-test-'));
159
+ const handler = makeHandler({}, tmpDir);
160
+ const config = { command: 'ignored', args: [], tsSource: '// source' };
161
+ const result = handler.resolveServerConfig('srv', config);
162
+ (0, vitest_1.expect)(result.tsSource).toBeUndefined();
163
+ });
164
+ (0, vitest_1.it)('merges envRefs when tsSource is present', () => {
165
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'claude-handler-test-'));
166
+ const handler = makeHandler({ DB_URL: 'postgres://host/db' }, tmpDir);
167
+ const config = {
168
+ command: 'ignored',
169
+ args: [],
170
+ tsSource: '// source',
171
+ envRefs: { DATABASE_URL: 'DB_URL' },
172
+ };
173
+ const result = handler.resolveServerConfig('srv', config);
174
+ const env = result.env;
175
+ (0, vitest_1.expect)(env.DATABASE_URL).toBe('postgres://host/db');
176
+ });
177
+ });
178
+ //# sourceMappingURL=claude-handler-resolve.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-handler-resolve.test.js","sourceRoot":"","sources":["../../src/__tests__/claude-handler-resolve.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * @fileoverview Unit tests for compile-claude-md helpers.
3
+ *
4
+ * Tests cover:
5
+ * - CLAUDE.md contains proactive /recall instruction
6
+ * - CLAUDE.md contains pattern-based memory-save guidance
7
+ * - CLAUDE.md does NOT contain the old "Only save when user explicitly guides" wording
8
+ * - materializeMemoryFiles writes MEMORY.md index + individual files
9
+ * - sanitizeFilename is not exported but indirectly tested via materializeMemoryFiles
10
+ *
11
+ * @module runner/__tests__/compile-claude-md.test
12
+ */
13
+ export {};