slackhive 0.1.37 → 0.1.39

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 +20 -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,60 @@
1
+ ---
2
+ title: "Version History"
3
+ description: "Auto-snapshot every change to an agent's configuration, browse diffs, and restore any previous version."
4
+ ---
5
+
6
+ ## Overview
7
+
8
+ Every time you save changes to an agent — skills, CLAUDE.md, tool permissions, or MCP assignments — SlackHive automatically creates a snapshot of the agent's full state. The **History** tab on each agent's detail page lets you browse these snapshots, view line-level diffs, and restore any previous version.
9
+
10
+ This gives you a safety net for experimentation: try a new persona, restructure skills, or tighten permissions, and roll back immediately if something breaks.
11
+
12
+ ## What gets snapshotted
13
+
14
+ Each snapshot captures the full agent state at the time of save:
15
+
16
+ - `CLAUDE.md` content
17
+ - All skill files (content and metadata)
18
+ - Tool permissions (allowlist and denylist)
19
+ - Assigned MCP servers
20
+
21
+ Slack credentials, agent name, slug, and description are not included in snapshots (they are managed separately as live fields).
22
+
23
+ ## Viewing history
24
+
25
+ 1. Open an agent from the dashboard
26
+ 2. Click the **History** tab
27
+
28
+ You'll see a chronological list of snapshots with timestamps. Click any snapshot to expand it.
29
+
30
+ ## Reading a diff
31
+
32
+ Each snapshot shows a line-level diff against the previous version. Lines are color-coded:
33
+
34
+ - **Green** (additions) — lines added in this snapshot
35
+ - **Red** (deletions) — lines removed compared to the previous snapshot
36
+ - Unchanged lines are shown for context
37
+
38
+ ## Restoring a version
39
+
40
+ To restore an agent to a previous state:
41
+
42
+ 1. Open the snapshot you want to restore
43
+ 2. Click **Restore this version**
44
+ 3. Confirm the restore
45
+
46
+ The runner hot-reloads the agent within seconds of the restore. The restored state becomes the current agent configuration and is itself snapshotted as a new entry in the history (so the restore is reversible).
47
+
48
+ ## Snapshot retention
49
+
50
+ SlackHive keeps up to **10 snapshots per agent**. When a new snapshot would exceed the cap, the oldest snapshot is automatically deleted.
51
+
52
+ If you need to preserve a specific version permanently, export the agent configuration (copy the CLAUDE.md and skill content) before it ages out of the snapshot cap.
53
+
54
+ ## Conversation history
55
+
56
+ In addition to configuration history, each Slack thread maintains its own conversation context. Each Slack thread (identified by `userId + channelId + threadTs`) maps to a persistent Claude Code session.
57
+
58
+ Session context survives runner restarts: the Claude session ID is stored in Postgres and reloaded when the runner starts. When an agent receives a message in an existing thread, it resumes the same Claude session — maintaining full conversation context including tool results, intermediate outputs, and prior exchanges.
59
+
60
+ Sessions expire after **30 minutes of inactivity**. The runner runs a cleanup job every 10 minutes that removes stale sessions from both the in-memory cache and the database. After expiry, the next message in that thread starts a fresh session (though the agent still has all memories from previous conversations).
@@ -0,0 +1,77 @@
1
+ ---
2
+ title: "Import & Export"
3
+ description: "Export an agent's configuration as a JSON file and import it into any other agent."
4
+ ---
5
+
6
+ ## What gets exported
7
+
8
+ The export captures the full agent configuration:
9
+
10
+ - **CLAUDE.md** — identity, instructions, and behavior rules
11
+ - **Skills** — all Markdown skill files (slash commands)
12
+
13
+ Slack credentials, memories, and scheduled jobs are **not** included in the export. This keeps exports portable — you can import a config into any agent without overwriting live credentials or accumulated memory.
14
+
15
+ ---
16
+
17
+ ## Exporting an agent
18
+
19
+ 1. Open the agent in the dashboard
20
+ 2. Click the **Download** icon in the top-right of the agent page
21
+ 3. A JSON file named `{agent-slug}-export.json` downloads immediately
22
+
23
+ The file looks like:
24
+
25
+ ```json
26
+ {
27
+ "claudeMd": "# DataBot\n\nYou are a data analyst...",
28
+ "skills": [
29
+ { "name": "sql-rules", "content": "## SQL Rules\n..." }
30
+ ],
31
+ "exportedAt": "2026-04-09T10:00:00.000Z"
32
+ }
33
+ ```
34
+
35
+ ---
36
+
37
+ ## Importing a config
38
+
39
+ Import applies an exported config to an **existing** agent — it overwrites that agent's CLAUDE.md and upserts its skills.
40
+
41
+ 1. Open the target agent in the dashboard
42
+ 2. Click the **Upload** icon in the top-right
43
+ 3. Select the `.json` export file
44
+ 4. A confirmation modal shows what will be applied:
45
+ - The new CLAUDE.md content
46
+ - How many skills will be upserted
47
+ - When the config was exported
48
+ 5. Click **Apply Import** to confirm
49
+
50
+ <Note>
51
+ Import **overwrites** the agent's current CLAUDE.md. Skills are upserted — existing skills with the same name are updated, new ones are added, and skills not in the import are left untouched.
52
+ </Note>
53
+
54
+ ---
55
+
56
+ ## Common use cases
57
+
58
+ | Use case | How |
59
+ |----------|-----|
60
+ | **Clone an agent** | Export agent A → create agent B → import into B |
61
+ | **Promote staging → prod** | Export from a test agent, import into the live one |
62
+ | **Backup before a big edit** | Export before making large changes to CLAUDE.md |
63
+ | **Share agent templates** | Export and send the JSON to a teammate to import |
64
+ | **Roll back instructions** | Use [Version History](/features/history) for full snapshots, or re-import an old export |
65
+
66
+ ---
67
+
68
+ ## Next steps
69
+
70
+ <CardGroup cols={2}>
71
+ <Card title="Version History" icon="clock-rotate-left" href="/features/history">
72
+ Auto-snapshots on every save — browse diffs and restore any version.
73
+ </Card>
74
+ <Card title="Creating Agents" icon="robot" href="/agents/creating-agents">
75
+ Set up a new agent to import a config into.
76
+ </Card>
77
+ </CardGroup>
@@ -0,0 +1,131 @@
1
+ ---
2
+ title: "Live Logs"
3
+ description: "Real-time log streaming for debugging agents and monitoring activity."
4
+ ---
5
+
6
+ ## Overview
7
+
8
+ The **Live Logs** feature streams Docker container log output directly to your browser using server-sent events (SSE). Each agent's logs are available from its detail page.
9
+
10
+ Logs capture everything the runner produces for a given agent: startup events, incoming Slack messages, Claude SDK calls, MCP tool invocations, memory writes, and errors.
11
+
12
+ ## Accessing logs
13
+
14
+ 1. Open an agent from the dashboard
15
+ 2. Click the **Logs** tab on the agent detail page
16
+
17
+ Logs begin streaming immediately. New log lines appear in real time as the agent processes messages.
18
+
19
+ ## Log levels
20
+
21
+ SlackHive uses structured logging (Winston) with four levels:
22
+
23
+ | Level | Color | When it appears |
24
+ |-------|-------|----------------|
25
+ | `error` | Red | Unrecoverable failures: Slack auth errors, Claude SDK exceptions, DB connection failures |
26
+ | `warn` | Yellow | Recoverable issues: stale session retries, MCP server startup failures, malformed memory files |
27
+ | `info` | Default | Normal operation: agent started, message received, memory synced, session created |
28
+ | `debug` | Dimmed | Verbose detail: SDK options, session directory paths, MCP server config |
29
+
30
+ Use the **level filter** in the log viewer to show only the levels you care about. In production, `info` and above is usually sufficient. Enable `debug` when diagnosing unexpected behavior.
31
+
32
+ ## Log search
33
+
34
+ The log viewer includes a search bar. Type any string to filter log lines to those containing that text. Useful for finding:
35
+ - Log lines for a specific user ID (`U012AB3CD`)
36
+ - Log lines for a specific session (`session_key`)
37
+ - All memory sync events (`memory synced`)
38
+ - All MCP-related activity (`mcp__`)
39
+
40
+ ## What you'll see in logs
41
+
42
+ ### Agent startup
43
+
44
+ ```
45
+ [info] Agent started { mcpServers: ['redshift', 'filesystem'] }
46
+ [info] Memory watcher started { memoryDir: '/tmp/agents/data-bot/memory' }
47
+ [debug] MCP servers configured { servers: ['redshift'] }
48
+ ```
49
+
50
+ ### Incoming message
51
+
52
+ ```
53
+ [info] Streaming query { sessionKey: 'U012-C456-1234.5678', resume: 'new', cwd: '...' }
54
+ [debug] Session work dir created { sessionKey: '...', sessionDir: '...' }
55
+ [debug] Session created { sessionKey: '...', sessionId: 'sess_...' }
56
+ ```
57
+
58
+ ### Memory write
59
+
60
+ ```
61
+ [info] Memory synced to DB { filePath: '...', name: 'kai_preferences', type: 'user' }
62
+ [info] Memory synced from session { file: 'user_kai_preferences.md', name: 'kai_preferences', type: 'user' }
63
+ ```
64
+
65
+ ### MCP tool use
66
+
67
+ MCP tool invocations appear in the Claude SDK output stream and are rendered in the Slack response as tool-use labels. In logs, you'll see the MCP proxy management:
68
+
69
+ ```
70
+ [info] MCP proxy started { server: 'redshift', port: 14050 }
71
+ ```
72
+
73
+ ### Session cleanup
74
+
75
+ ```
76
+ [info] Cleaned up stale sessions { count: 2 }
77
+ ```
78
+
79
+ ### Errors
80
+
81
+ ```
82
+ [error] Claude query failed { sessionKey: '...', error: 'No conversation found' }
83
+ [warn] Stale session, retrying as new { sessionKey: '...', staleSessionId: 'sess_...' }
84
+ [error] MCP proxy start failed { server: 'broken-mcp', error: 'Command not found' }
85
+ ```
86
+
87
+ ## Debugging common issues
88
+
89
+ ### Agent not responding in Slack
90
+
91
+ Check for:
92
+ - `[error]` lines mentioning Slack token or connection errors
93
+ - `[warn]` lines about missing or invalid credentials
94
+ - Whether the agent shows **Active** status in the dashboard
95
+
96
+ ### MCP tools not working
97
+
98
+ Check for:
99
+ - `[error] MCP proxy start failed` — the server binary is not found or not executable
100
+ - `[warn] MCP envRef not found` — the referenced env var key doesn't exist in the encrypted store
101
+ - `[warn] Memory dir watcher error` — filesystem permission issues
102
+
103
+ ### Memory not persisting
104
+
105
+ Check for:
106
+ - `[warn] Could not parse memory file` — the agent wrote a memory file with invalid frontmatter
107
+ - Absence of `[info] Memory synced to DB` lines — the watcher may not have detected the file
108
+
109
+ ### Stale session errors
110
+
111
+ Stale sessions occur when a Claude session ID stored in the database no longer corresponds to an active SDK session (e.g. after a runner restart). SlackHive retries automatically as a new session. You'll see:
112
+
113
+ ```
114
+ [warn] Stale session, retrying as new
115
+ ```
116
+
117
+ This is normal after restarts and resolves itself automatically.
118
+
119
+ ## Tailing logs from the CLI
120
+
121
+ For shell access to runner logs, use the CLI:
122
+
123
+ ```bash
124
+ slackhive logs
125
+ ```
126
+
127
+ This tails the Docker container logs for the runner service. Add `--no-follow` to print without following:
128
+
129
+ ```bash
130
+ docker compose logs runner --tail 100
131
+ ```
@@ -0,0 +1,90 @@
1
+ ---
2
+ title: "Multi-Workspace"
3
+ description: "Connect agents across multiple Slack workspaces — all managed from a single SlackHive instance."
4
+ ---
5
+
6
+ ## One platform, many workspaces
7
+
8
+ SlackHive lets you deploy agents into multiple Slack workspaces from a single installation. Each agent carries its own Slack credentials, so agents in different workspaces run completely independently — while you manage everything from one dashboard.
9
+
10
+ Common setups:
11
+
12
+ | Setup | Example |
13
+ |-------|---------|
14
+ | **Single workspace** | All agents live in `company.slack.com` |
15
+ | **Multi-team** | Engineering agents in one workspace, support agents in another |
16
+ | **Client workspaces** | Agency deploying agents into each client's Slack |
17
+ | **Staging + production** | Same agent config, separate workspaces for testing |
18
+
19
+ ---
20
+
21
+ ## How it works
22
+
23
+ Each agent stores its own Slack credentials:
24
+
25
+ - `slack_bot_token` — the bot's OAuth token (`xoxb-...`)
26
+ - `slack_app_token` — for Socket Mode (`xapp-...`)
27
+ - `slack_signing_secret` — to verify incoming events
28
+
29
+ When the runner starts, it creates a separate Slack Bolt connection for each agent using that agent's credentials. Agents in different workspaces don't share connections or interfere with each other.
30
+
31
+ ---
32
+
33
+ ## Setting up agents across workspaces
34
+
35
+ Each workspace needs its own Slack app. For each workspace:
36
+
37
+ <Steps>
38
+ <Step title="Create a Slack app for that workspace">
39
+ During agent creation, the onboarding wizard generates a manifest. Install that manifest into the target workspace — **not** your main workspace.
40
+
41
+ → See [Slack App Setup](/configuration/slack-app) for the full manifest install steps.
42
+ </Step>
43
+ <Step title="Collect the credentials">
44
+ From the installed app, copy:
45
+ - **Bot Token** (`xoxb-...`) — from OAuth & Permissions
46
+ - **App Token** (`xapp-...`) — from Basic Information → App-Level Tokens
47
+ - **Signing Secret** — from Basic Information
48
+
49
+ These are workspace-specific. An app installed in workspace A cannot connect to workspace B.
50
+ </Step>
51
+ <Step title="Create the agent in SlackHive">
52
+ Paste the credentials into the agent wizard. The runner will connect to that workspace automatically on the next start (or within seconds if already running).
53
+ </Step>
54
+ </Steps>
55
+
56
+ Repeat for each workspace. You can have any number of agents per workspace.
57
+
58
+ ---
59
+
60
+ ## User management across workspaces
61
+
62
+ Users and roles in SlackHive are platform-wide — there's no per-workspace access control.
63
+
64
+ | What's shared | What's isolated |
65
+ |---------------|-----------------|
66
+ | User accounts and roles | Agent Slack connections |
67
+ | Admin dashboard | Agent memories |
68
+ | Platform settings | Agent skills and tools |
69
+ | | Slack thread sessions |
70
+
71
+ An admin can see and manage agents in all workspaces from the same dashboard. Use [per-agent write access grants](/features/users#per-agent-write-access-for-editors) if you need to restrict editors to specific workspaces' agents.
72
+
73
+ ---
74
+
75
+ ## Boss agents across workspaces
76
+
77
+ A Boss and all its specialists **must be in the same Slack workspace**. Boss delegates by @mentioning specialists in the same thread — this only works when they share a workspace. If you need Boss orchestration in multiple workspaces, create a separate Boss and specialist set for each workspace.
78
+
79
+ ---
80
+
81
+ ## Next steps
82
+
83
+ <CardGroup cols={2}>
84
+ <Card title="Slack App Setup" icon="slack" href="/configuration/slack-app">
85
+ How to create and install a Slack app for each workspace.
86
+ </Card>
87
+ <Card title="Creating Agents" icon="robot" href="/agents/creating-agents">
88
+ Walk through the full agent creation wizard.
89
+ </Card>
90
+ </CardGroup>
@@ -0,0 +1,231 @@
1
+ ---
2
+ title: "Scheduled Jobs"
3
+ description: "Trigger any agent on a schedule — get proactive alerts, reports, and monitoring delivered to Slack automatically."
4
+ ---
5
+
6
+ ## Your agents don't just wait to be asked
7
+
8
+ Most AI tools are reactive — you ask, they answer. Scheduled Jobs make your agents **proactive**. Set a schedule, point it at any agent, and it fires automatically — running queries, checking metrics, scanning for anomalies, and posting results directly to a Slack channel or DM.
9
+
10
+ No dashboards to check. No reports to pull. The insight comes to you.
11
+
12
+ ---
13
+
14
+ ## What you can build
15
+
16
+ <CardGroup cols={2}>
17
+ <Card title="GMV & Revenue Alerts" icon="chart-line">
18
+ If GMV drops more than 10% hour-over-hour, DM the CEO immediately with a breakdown by channel and cohort.
19
+ </Card>
20
+ <Card title="Fraud Monitoring" icon="shield-halved">
21
+ Run a fraud check every hour. If anomalies are detected, post a summary to `#fraud-alerts` with transaction IDs and risk scores.
22
+ </Card>
23
+ <Card title="Daily Business Digest" icon="newspaper">
24
+ Every morning at 8 AM, post yesterday's key metrics — bookings, revenue, churn, NPS — to `#analytics`.
25
+ </Card>
26
+ <Card title="Weekly Engineering Report" icon="code">
27
+ Every Monday, summarize last week's PRs, incidents, and deploy count. Post to `#engineering`.
28
+ </Card>
29
+ <Card title="Inventory Alerts" icon="boxes-stacked">
30
+ Check stock levels every 4 hours. DM the ops lead if any SKU drops below threshold.
31
+ </Card>
32
+ <Card title="Support Queue Health" icon="headset">
33
+ Every 30 minutes during business hours, check ticket queue depth. Alert `#support-ops` if SLA is at risk.
34
+ </Card>
35
+ </CardGroup>
36
+
37
+ ---
38
+
39
+ ## How it works
40
+
41
+ <Steps>
42
+ <Step title="You set up a job">
43
+ Pick an agent, write a prompt, set a schedule (cron), and choose where results go — a Slack channel or a direct message.
44
+ </Step>
45
+ <Step title="The schedule fires">
46
+ At the configured time, SlackHive sends your prompt to the agent — exactly like a Slack message, but automated.
47
+ </Step>
48
+ <Step title="The agent runs">
49
+ The agent executes fully — it can run queries, call APIs, check metrics, compare against thresholds, and reason about the results.
50
+ </Step>
51
+ <Step title="Results posted to Slack">
52
+ The response is posted to the channel or DM you configured. If nothing notable happened, the agent can say so. If something needs attention, it flags it.
53
+ </Step>
54
+ </Steps>
55
+
56
+ ---
57
+
58
+ ## Any agent, any schedule
59
+
60
+ Jobs are not limited to boss agents. Assign a job to any agent:
61
+
62
+ | Agent | Job example |
63
+ |-------|------------|
64
+ | `@data-analyst` | Run revenue query every morning, post to `#finance` |
65
+ | `@devops` | Check error rates every 15 min, DM on-call if spiking |
66
+ | `@fraud-bot` | Hourly transaction anomaly scan, post to `#fraud-alerts` |
67
+ | `@support-agent` | Check ticket backlog every 30 min, alert if queue > 50 |
68
+ | `@boss` | Daily summary across all teams, post to `#general` |
69
+
70
+ ---
71
+
72
+ ## Creating a job
73
+
74
+ Go to **Jobs** in the sidebar → **New Job**.
75
+
76
+ <Steps>
77
+ <Step title="Name the job">
78
+ Give it a clear name — e.g. `Daily Revenue Digest` or `Hourly Fraud Check`.
79
+ </Step>
80
+ <Step title="Choose an agent">
81
+ Select which agent should run this job. Pick the specialist best suited for the task.
82
+ </Step>
83
+ <Step title="Write the prompt">
84
+ Write exactly what you'd say to the agent in Slack. Be specific about what to check, what thresholds matter, and what to include in the response.
85
+
86
+ ```
87
+ Check GMV for the last hour vs the same hour yesterday.
88
+ If it's down more than 10%, flag it as urgent and include
89
+ a breakdown by acquisition channel. Otherwise just post
90
+ a one-line summary.
91
+ ```
92
+ </Step>
93
+ <Step title="Set the schedule">
94
+ Use a cron expression or pick a preset:
95
+
96
+ | Preset | Cron |
97
+ |--------|------|
98
+ | Every hour | `0 * * * *` |
99
+ | Every 15 minutes | `*/15 * * * *` |
100
+ | Daily at 8 AM | `0 8 * * *` |
101
+ | Weekdays at 9 AM | `0 9 * * 1-5` |
102
+ | Weekly on Monday | `0 9 * * 1` |
103
+
104
+ <Tip>The UI shows cron expressions in plain English so you can verify the schedule before saving.</Tip>
105
+ </Step>
106
+ <Step title="Set the target — Channel or DM">
107
+ Choose where the agent posts its results.
108
+
109
+ <Tabs>
110
+ <Tab title="Post to a Channel">
111
+ Post results publicly to any Slack channel — `#analytics`, `#fraud-alerts`, `#engineering`, etc.
112
+
113
+ **How to get the channel ID:**
114
+ 1. Open Slack and right-click the channel name in the sidebar
115
+ 2. Click **Copy link**
116
+ 3. The link looks like: `https://app.slack.com/client/T.../C08ABCD1234`
117
+ 4. The channel ID is the part starting with `C` — e.g. `C08ABCD1234`
118
+
119
+ Paste it into the **Target** field and select **Channel**.
120
+
121
+ <Note>Make sure the agent's Slack bot has been invited to the channel first. If not, invite it with `/invite @agent-name`.</Note>
122
+ </Tab>
123
+ <Tab title="Send a DM">
124
+ Send results as a direct message to any individual — CEO, on-call engineer, finance lead, or yourself.
125
+
126
+ **How to get the user ID:**
127
+ 1. In Slack, click on the person's name or profile picture
128
+ 2. Click **View full profile**
129
+ 3. Click the **⋯ More** button (three dots)
130
+ 4. Click **Copy member ID**
131
+ 5. It looks like: `U012AB3CD45`
132
+
133
+ Paste it into the **Target** field and select **DM**.
134
+
135
+ The message arrives as a direct message from the agent's Slack bot — clean and personal.
136
+ </Tab>
137
+ </Tabs>
138
+ </Step>
139
+ </Steps>
140
+
141
+ ---
142
+
143
+ ## Channel vs DM — when to use which
144
+
145
+ | Use case | Channel | DM |
146
+ |----------|---------|-----|
147
+ | Team-wide reports (daily digest, weekly summary) | ✅ | |
148
+ | Public monitoring dashboards (`#fraud-alerts`, `#ops`) | ✅ | |
149
+ | Personal alerts (CEO wants GMV drop notification) | | ✅ |
150
+ | On-call paging (engineer gets error spike alert) | | ✅ |
151
+ | Sensitive metrics (revenue, churn — exec-only) | | ✅ |
152
+ | Cross-team awareness (PM, data, eng all need to know) | ✅ | |
153
+
154
+ <Tip>You can create multiple jobs for the same agent — one that posts to a channel for team visibility, and another that DMs the team lead for immediate personal attention.</Tip>
155
+
156
+ ---
157
+
158
+ ## Writing effective job prompts
159
+
160
+ The prompt is the most important part. A few principles:
161
+
162
+ **Be specific about what to check**
163
+ ```
164
+ ❌ Check the data
165
+ ✅ Query bookings for the last 24 hours and compare to the 7-day average
166
+ ```
167
+
168
+ **Define what "notable" means**
169
+ ```
170
+ ❌ Let me know if anything is wrong
171
+ ✅ Flag if conversion rate drops below 3% or if any single channel
172
+ drops more than 20% week-over-week
173
+ ```
174
+
175
+ **Tell it what to do in each case**
176
+ ```
177
+ ✅ If everything looks normal, post a one-line summary.
178
+ If something needs attention, include the specific numbers,
179
+ what changed, and your best hypothesis for why.
180
+ ```
181
+
182
+ **Give it context it might need**
183
+ ```
184
+ ✅ Note: Tuesday is always lower due to our weekly maintenance window.
185
+ Don't flag Tuesday dips unless they exceed 30%.
186
+ ```
187
+
188
+ ---
189
+
190
+ ## Monitoring job runs
191
+
192
+ Every job run is logged — status, output, duration, and timestamp — visible in **Jobs → [job name] → Run History**.
193
+
194
+ | Status | Meaning |
195
+ |--------|---------|
196
+ | ✅ Success | Agent ran and posted to Slack |
197
+ | ❌ Error | Agent not running, Claude error, or Slack API failure |
198
+ | ⏭ Skipped | Agent was offline when the job fired |
199
+
200
+ <Note>
201
+ If a job fails, the error is logged in run history. Common causes: the agent's Slack app token expired, the agent wasn't running, or the MCP server the agent needed was down.
202
+ </Note>
203
+
204
+ ---
205
+
206
+ ## Example: GMV drop alert
207
+
208
+ Here's a complete setup for a GMV monitoring job:
209
+
210
+ | Field | Value |
211
+ |-------|-------|
212
+ | **Name** | Hourly GMV Alert |
213
+ | **Agent** | `@data-analyst` |
214
+ | **Schedule** | `0 * * * *` (every hour) |
215
+ | **Target** | DM → CEO's Slack user ID |
216
+ | **Prompt** | Compare GMV for the last hour vs the same hour last week. If it's down more than 15%, send an urgent alert with a breakdown by channel, device type, and acquisition source. If it's within normal range, send a single line: "GMV on track — $X this hour vs $Y last week." |
217
+
218
+ The CEO gets a DM every hour. 99% of the time it's one line. When something breaks, they know immediately — with the breakdown already in their pocket.
219
+
220
+ ---
221
+
222
+ ## Next steps
223
+
224
+ <CardGroup cols={2}>
225
+ <Card title="Creating Agents" icon="robot" href="/agents/creating-agents">
226
+ Build the specialist agents that power your jobs.
227
+ </Card>
228
+ <Card title="MCP Servers" icon="plug" href="/configuration/mcp-servers">
229
+ Connect agents to your data sources so jobs can query real data.
230
+ </Card>
231
+ </CardGroup>
@@ -0,0 +1,92 @@
1
+ ---
2
+ title: "User Management"
3
+ description: "Create users, assign roles, and control per-agent write access."
4
+ ---
5
+
6
+ ## Authentication overview
7
+
8
+ SlackHive uses a simple built-in auth system — no external provider required.
9
+
10
+ - **Superadmin** is configured via environment variables (`ADMIN_USERNAME` / `ADMIN_PASSWORD`) — never stored in the database
11
+ - **Sessions** use HMAC-signed cookies. The signing key is `AUTH_SECRET` in your `.env`
12
+ - All routes are protected — unauthenticated requests redirect to `/login`
13
+
14
+ ## Roles
15
+
16
+ SlackHive has four roles with escalating permissions:
17
+
18
+ | Role | View agents | Edit agents | Manage jobs | Settings | Manage users |
19
+ |------|-------------|-------------|-------------|----------|-------------|
20
+ | **Superadmin** | All | All | Yes | Yes | Yes |
21
+ | **Admin** | All | All | Yes | Yes | Yes |
22
+ | **Editor** | All | Own + granted | Yes | Yes | No |
23
+ | **Viewer** | All | No | No | No | No |
24
+
25
+ ### Superadmin
26
+
27
+ Configured via `ADMIN_USERNAME` and `ADMIN_PASSWORD` in `.env`. This account is never stored in the database — it exists only in environment configuration. The superadmin has all permissions and cannot be deleted or demoted.
28
+
29
+ ### Admin
30
+
31
+ Full access equivalent to superadmin, but stored in the database and manageable via the Users page. Admins can create other users, change roles, and grant per-agent write access to editors.
32
+
33
+ ### Editor
34
+
35
+ Read access to all agents by default. Write access on:
36
+ - Agents they created themselves
37
+ - Any agents an admin has explicitly granted them access to
38
+
39
+ Editors can create and manage scheduled jobs. They cannot manage users or change platform settings.
40
+
41
+ ### Viewer
42
+
43
+ Read-only access to everything. Can see all agents, memories, and history, but cannot make changes.
44
+
45
+ ## Creating users
46
+
47
+ Only superadmins and admins can create users.
48
+
49
+ 1. Go to **Settings → Users** in the sidebar
50
+ 2. Click **Add User**
51
+ 3. Enter a username and password
52
+ 4. Select a role
53
+ 5. Click **Create**
54
+
55
+ Users can log in immediately at the `/login` page.
56
+
57
+ ## Changing a user's role
58
+
59
+ 1. Go to **Settings → Users**
60
+ 2. Find the user in the list
61
+ 3. Use the role dropdown to select a new role
62
+ 4. Changes take effect on the user's next page load (their active session remains valid)
63
+
64
+ ## Per-agent write access for editors
65
+
66
+ Admins can grant editors write access to specific agents beyond what they created themselves:
67
+
68
+ 1. Go to **Settings → Users**
69
+ 2. Click a user with the **Editor** role
70
+ 3. Under **Agent Access**, you'll see a checklist of all agents
71
+ 4. Check the agents this editor should have full write access to
72
+ 5. Save
73
+
74
+ Checked agents grant the editor full edit rights: skills, CLAUDE.md, tool permissions, MCP assignments, and history restore.
75
+
76
+ ## Permissions enforcement
77
+
78
+ All permissions are enforced **server-side** in API route guards — not just hidden in the UI. A viewer who manually calls an API endpoint to edit an agent will receive a 403 response.
79
+
80
+ The permission model:
81
+ - Read operations require any authenticated session
82
+ - Write operations on an agent require: admin, superadmin, or (editor + agent ownership/grant)
83
+ - Settings mutations require: admin or superadmin
84
+ - User management requires: admin or superadmin
85
+
86
+ ## Session behavior
87
+
88
+ Sessions use HMAC-signed cookies with no expiry by default (persistent sessions). Sessions are invalidated when:
89
+ - The user logs out explicitly
90
+ - `AUTH_SECRET` is rotated in `.env` (invalidates all sessions immediately)
91
+
92
+ There is no session table — sessions are stateless HMAC tokens, which means there's no way to invalidate individual sessions without rotating the `AUTH_SECRET`.