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.
- package/.dockerignore +14 -0
- package/.env.example +44 -0
- package/.github/ISSUE_TEMPLATE/bug_report.yml +65 -0
- package/.github/ISSUE_TEMPLATE/config.yml +5 -0
- package/.github/ISSUE_TEMPLATE/feature_request.yml +38 -0
- package/.github/PULL_REQUEST_TEMPLATE.md +27 -0
- package/.github/dependabot.yml +20 -0
- package/.github/workflows/audit.yml +149 -0
- package/.github/workflows/ci.yml +135 -0
- package/CHANGELOG.md +52 -0
- package/CODE_OF_CONDUCT.md +37 -0
- package/CONTRIBUTING.md +204 -0
- package/LICENSE +21 -0
- package/README.md +19 -0
- package/SECURITY.md +47 -0
- package/apps/runner/Dockerfile +33 -0
- package/apps/runner/dist/__tests__/channel-restrictions.test.d.ts +8 -0
- package/apps/runner/dist/__tests__/channel-restrictions.test.js +63 -0
- package/apps/runner/dist/__tests__/channel-restrictions.test.js.map +1 -0
- package/apps/runner/dist/__tests__/claude-handler-resolve.test.d.ts +20 -0
- package/apps/runner/dist/__tests__/claude-handler-resolve.test.js +178 -0
- package/apps/runner/dist/__tests__/claude-handler-resolve.test.js.map +1 -0
- package/apps/runner/dist/__tests__/compile-claude-md.test.d.ts +13 -0
- package/apps/runner/dist/__tests__/compile-claude-md.test.js +144 -0
- package/apps/runner/dist/__tests__/compile-claude-md.test.js.map +1 -0
- package/apps/runner/dist/__tests__/memory-sync.test.d.ts +11 -0
- package/apps/runner/dist/__tests__/memory-sync.test.js +56 -0
- package/apps/runner/dist/__tests__/memory-sync.test.js.map +1 -0
- package/apps/runner/dist/__tests__/slack-file-support.test.d.ts +9 -0
- package/apps/runner/dist/__tests__/slack-file-support.test.js +271 -0
- package/apps/runner/dist/__tests__/slack-file-support.test.js.map +1 -0
- package/apps/runner/dist/__tests__/slack-formatting.test.d.ts +12 -0
- package/apps/runner/dist/__tests__/slack-formatting.test.js +400 -0
- package/apps/runner/dist/__tests__/slack-formatting.test.js.map +1 -0
- package/apps/runner/dist/__tests__/thread-context.test.d.ts +12 -0
- package/apps/runner/dist/__tests__/thread-context.test.js +182 -0
- package/apps/runner/dist/__tests__/thread-context.test.js.map +1 -0
- package/apps/runner/dist/agent-runner.d.ts +118 -0
- package/apps/runner/dist/agent-runner.js +352 -0
- package/apps/runner/dist/agent-runner.js.map +1 -0
- package/apps/runner/dist/claude-handler.d.ts +122 -0
- package/apps/runner/dist/claude-handler.js +402 -0
- package/apps/runner/dist/claude-handler.js.map +1 -0
- package/apps/runner/dist/compile-claude-md.d.ts +59 -0
- package/apps/runner/dist/compile-claude-md.js +291 -0
- package/apps/runner/dist/compile-claude-md.js.map +1 -0
- package/apps/runner/dist/correction-handler.d.ts +46 -0
- package/apps/runner/dist/correction-handler.js +162 -0
- package/apps/runner/dist/correction-handler.js.map +1 -0
- package/apps/runner/dist/correction-manager.d.ts +53 -0
- package/apps/runner/dist/correction-manager.js +241 -0
- package/apps/runner/dist/correction-manager.js.map +1 -0
- package/apps/runner/dist/db.d.ts +193 -0
- package/apps/runner/dist/db.js +492 -0
- package/apps/runner/dist/db.js.map +1 -0
- package/apps/runner/dist/index.d.ts +9 -0
- package/apps/runner/dist/index.js +43 -0
- package/apps/runner/dist/index.js.map +1 -0
- package/apps/runner/dist/job-scheduler.d.ts +57 -0
- package/apps/runner/dist/job-scheduler.js +150 -0
- package/apps/runner/dist/job-scheduler.js.map +1 -0
- package/apps/runner/dist/logger.d.ts +32 -0
- package/apps/runner/dist/logger.js +52 -0
- package/apps/runner/dist/logger.js.map +1 -0
- package/apps/runner/dist/mcp-process-manager.d.ts +38 -0
- package/apps/runner/dist/mcp-process-manager.js +189 -0
- package/apps/runner/dist/mcp-process-manager.js.map +1 -0
- package/apps/runner/dist/memory-mcp.d.ts +14 -0
- package/apps/runner/dist/memory-mcp.js +88 -0
- package/apps/runner/dist/memory-mcp.js.map +1 -0
- package/apps/runner/dist/memory-watcher.d.ts +78 -0
- package/apps/runner/dist/memory-watcher.js +220 -0
- package/apps/runner/dist/memory-watcher.js.map +1 -0
- package/apps/runner/dist/slack-handler.d.ts +120 -0
- package/apps/runner/dist/slack-handler.js +843 -0
- package/apps/runner/dist/slack-handler.js.map +1 -0
- package/apps/runner/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
- package/apps/runner/package.json +42 -0
- package/apps/runner/src/__tests__/channel-restrictions.test.ts +75 -0
- package/apps/runner/src/__tests__/claude-handler-resolve.test.ts +160 -0
- package/apps/runner/src/__tests__/compile-claude-md.test.ts +139 -0
- package/apps/runner/src/__tests__/memory-sync.test.ts +59 -0
- package/apps/runner/src/__tests__/slack-file-support.test.ts +376 -0
- package/apps/runner/src/__tests__/slack-formatting.test.ts +495 -0
- package/apps/runner/src/__tests__/thread-context.test.ts +215 -0
- package/apps/runner/src/agent-runner.ts +397 -0
- package/apps/runner/src/claude-handler.ts +475 -0
- package/apps/runner/src/compile-claude-md.ts +283 -0
- package/apps/runner/src/correction-handler.ts +191 -0
- package/apps/runner/src/correction-manager.ts +285 -0
- package/apps/runner/src/db.ts +604 -0
- package/apps/runner/src/index.ts +46 -0
- package/apps/runner/src/job-scheduler.ts +165 -0
- package/apps/runner/src/logger.ts +49 -0
- package/apps/runner/src/mcp-process-manager.ts +195 -0
- package/apps/runner/src/memory-mcp.ts +85 -0
- package/apps/runner/src/memory-watcher.ts +215 -0
- package/apps/runner/src/slack-handler.ts +929 -0
- package/apps/runner/tsconfig.json +17 -0
- package/apps/runner/vitest.config.mts +17 -0
- package/apps/web/.eslintrc.json +3 -0
- package/apps/web/.next/app-build-manifest.json +323 -0
- package/apps/web/.next/app-path-routes-manifest.json +46 -0
- package/apps/web/.next/build-manifest.json +33 -0
- package/apps/web/.next/cache/.previewinfo +1 -0
- package/apps/web/.next/cache/.rscinfo +1 -0
- package/apps/web/.next/cache/webpack/client-production/0.pack +0 -0
- package/apps/web/.next/cache/webpack/client-production/1.pack +0 -0
- package/apps/web/.next/cache/webpack/client-production/2.pack +0 -0
- package/apps/web/.next/cache/webpack/client-production/3.pack +0 -0
- package/apps/web/.next/cache/webpack/client-production/4.pack +0 -0
- package/apps/web/.next/cache/webpack/client-production/index.pack +0 -0
- package/apps/web/.next/cache/webpack/client-production/index.pack.old +0 -0
- package/apps/web/.next/cache/webpack/edge-server-production/0.pack +0 -0
- package/apps/web/.next/cache/webpack/edge-server-production/1.pack +0 -0
- package/apps/web/.next/cache/webpack/edge-server-production/index.pack +0 -0
- package/apps/web/.next/cache/webpack/edge-server-production/index.pack.old +0 -0
- package/apps/web/.next/cache/webpack/server-production/0.pack +0 -0
- package/apps/web/.next/cache/webpack/server-production/1.pack +0 -0
- package/apps/web/.next/cache/webpack/server-production/2.pack +0 -0
- package/apps/web/.next/cache/webpack/server-production/index.pack +0 -0
- package/apps/web/.next/cache/webpack/server-production/index.pack.old +0 -0
- package/apps/web/.next/diagnostics/build-diagnostics.json +6 -0
- package/apps/web/.next/diagnostics/framework.json +1 -0
- package/apps/web/.next/package.json +1 -0
- package/apps/web/.next/react-loadable-manifest.json +1 -0
- package/apps/web/.next/server/app/_not-found/page.js +2 -0
- package/apps/web/.next/server/app/_not-found/page.js.nft.json +1 -0
- package/apps/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -0
- package/apps/web/.next/server/app/agents/[slug]/page.js +4 -0
- package/apps/web/.next/server/app/agents/[slug]/page.js.nft.json +1 -0
- package/apps/web/.next/server/app/agents/[slug]/page_client-reference-manifest.js +1 -0
- package/apps/web/.next/server/app/agents/new/page.js +2 -0
- package/apps/web/.next/server/app/agents/new/page.js.nft.json +1 -0
- package/apps/web/.next/server/app/agents/new/page_client-reference-manifest.js +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/access/route.js +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/access/route.js.nft.json +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/access/route_client-reference-manifest.js +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/claude-md/route.js +6 -0
- package/apps/web/.next/server/app/api/agents/[id]/claude-md/route.js.nft.json +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/claude-md/route_client-reference-manifest.js +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/logs/route.js +3 -0
- package/apps/web/.next/server/app/api/agents/[id]/logs/route.js.nft.json +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/logs/route_client-reference-manifest.js +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/manifest/route.js +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/manifest/route.js.nft.json +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/manifest/route_client-reference-manifest.js +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/mcps/route.js +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/mcps/route.js.nft.json +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/mcps/route_client-reference-manifest.js +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/memories/[memId]/route.js +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/memories/[memId]/route.js.nft.json +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/memories/[memId]/route_client-reference-manifest.js +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/memories/route.js +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/memories/route.js.nft.json +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/memories/route_client-reference-manifest.js +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/permissions/route.js +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/permissions/route.js.nft.json +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/permissions/route_client-reference-manifest.js +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/reload/route.js +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/reload/route.js.nft.json +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/reload/route_client-reference-manifest.js +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/restrictions/route.js +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/restrictions/route.js.nft.json +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/restrictions/route_client-reference-manifest.js +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/route.js +33 -0
- package/apps/web/.next/server/app/api/agents/[id]/route.js.nft.json +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/route_client-reference-manifest.js +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/skills/[skillId]/route.js +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/skills/[skillId]/route.js.nft.json +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/skills/[skillId]/route_client-reference-manifest.js +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/skills/route.js +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/skills/route.js.nft.json +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/skills/route_client-reference-manifest.js +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/slack-info/route.js +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/slack-info/route.js.nft.json +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/slack-info/route_client-reference-manifest.js +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/snapshots/[sid]/restore/route.js +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/snapshots/[sid]/restore/route.js.nft.json +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/snapshots/[sid]/restore/route_client-reference-manifest.js +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/snapshots/[sid]/route.js +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/snapshots/[sid]/route.js.nft.json +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/snapshots/[sid]/route_client-reference-manifest.js +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/snapshots/route.js +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/snapshots/route.js.nft.json +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/snapshots/route_client-reference-manifest.js +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/start/route.js +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/start/route.js.nft.json +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/start/route_client-reference-manifest.js +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/stop/route.js +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/stop/route.js.nft.json +1 -0
- package/apps/web/.next/server/app/api/agents/[id]/stop/route_client-reference-manifest.js +1 -0
- package/apps/web/.next/server/app/api/agents/route.js +91 -0
- package/apps/web/.next/server/app/api/agents/route.js.nft.json +1 -0
- package/apps/web/.next/server/app/api/agents/route_client-reference-manifest.js +1 -0
- package/apps/web/.next/server/app/api/auth/login/route.js +1 -0
- package/apps/web/.next/server/app/api/auth/login/route.js.nft.json +1 -0
- package/apps/web/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -0
- package/apps/web/.next/server/app/api/auth/logout/route.js +1 -0
- package/apps/web/.next/server/app/api/auth/logout/route.js.nft.json +1 -0
- package/apps/web/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -0
- package/apps/web/.next/server/app/api/auth/me/route.js +1 -0
- package/apps/web/.next/server/app/api/auth/me/route.js.nft.json +1 -0
- package/apps/web/.next/server/app/api/auth/me/route_client-reference-manifest.js +1 -0
- package/apps/web/.next/server/app/api/auth/users/[id]/route.js +1 -0
- package/apps/web/.next/server/app/api/auth/users/[id]/route.js.nft.json +1 -0
- package/apps/web/.next/server/app/api/auth/users/[id]/route_client-reference-manifest.js +1 -0
- package/apps/web/.next/server/app/api/auth/users/route.js +1 -0
- package/apps/web/.next/server/app/api/auth/users/route.js.nft.json +1 -0
- package/apps/web/.next/server/app/api/auth/users/route_client-reference-manifest.js +1 -0
- package/apps/web/.next/server/app/api/env-vars/[key]/route.js +1 -0
- package/apps/web/.next/server/app/api/env-vars/[key]/route.js.nft.json +1 -0
- package/apps/web/.next/server/app/api/env-vars/[key]/route_client-reference-manifest.js +1 -0
- package/apps/web/.next/server/app/api/env-vars/route.js +1 -0
- package/apps/web/.next/server/app/api/env-vars/route.js.nft.json +1 -0
- package/apps/web/.next/server/app/api/env-vars/route_client-reference-manifest.js +1 -0
- package/apps/web/.next/server/app/api/jobs/[id]/route.js +1 -0
- package/apps/web/.next/server/app/api/jobs/[id]/route.js.nft.json +1 -0
- package/apps/web/.next/server/app/api/jobs/[id]/route_client-reference-manifest.js +1 -0
- package/apps/web/.next/server/app/api/jobs/[id]/runs/route.js +1 -0
- package/apps/web/.next/server/app/api/jobs/[id]/runs/route.js.nft.json +1 -0
- package/apps/web/.next/server/app/api/jobs/[id]/runs/route_client-reference-manifest.js +1 -0
- package/apps/web/.next/server/app/api/jobs/route.js +1 -0
- package/apps/web/.next/server/app/api/jobs/route.js.nft.json +1 -0
- package/apps/web/.next/server/app/api/jobs/route_client-reference-manifest.js +1 -0
- package/apps/web/.next/server/app/api/mcps/[id]/route.js +1 -0
- package/apps/web/.next/server/app/api/mcps/[id]/route.js.nft.json +1 -0
- package/apps/web/.next/server/app/api/mcps/[id]/route_client-reference-manifest.js +1 -0
- package/apps/web/.next/server/app/api/mcps/[id]/test/route.js +1 -0
- package/apps/web/.next/server/app/api/mcps/[id]/test/route.js.nft.json +1 -0
- package/apps/web/.next/server/app/api/mcps/[id]/test/route_client-reference-manifest.js +1 -0
- package/apps/web/.next/server/app/api/mcps/route.js +1 -0
- package/apps/web/.next/server/app/api/mcps/route.js.nft.json +1 -0
- package/apps/web/.next/server/app/api/mcps/route_client-reference-manifest.js +1 -0
- package/apps/web/.next/server/app/api/settings/route.js +1 -0
- package/apps/web/.next/server/app/api/settings/route.js.nft.json +1 -0
- package/apps/web/.next/server/app/api/settings/route_client-reference-manifest.js +1 -0
- package/apps/web/.next/server/app/icon.svg/route.js +1 -0
- package/apps/web/.next/server/app/icon.svg/route.js.nft.json +1 -0
- package/apps/web/.next/server/app/jobs/page.js +2 -0
- package/apps/web/.next/server/app/jobs/page.js.nft.json +1 -0
- package/apps/web/.next/server/app/jobs/page_client-reference-manifest.js +1 -0
- package/apps/web/.next/server/app/login/page.js +2 -0
- package/apps/web/.next/server/app/login/page.js.nft.json +1 -0
- package/apps/web/.next/server/app/login/page_client-reference-manifest.js +1 -0
- package/apps/web/.next/server/app/page.js +2 -0
- package/apps/web/.next/server/app/page.js.nft.json +1 -0
- package/apps/web/.next/server/app/page_client-reference-manifest.js +1 -0
- package/apps/web/.next/server/app/settings/env-vars/page.js +2 -0
- package/apps/web/.next/server/app/settings/env-vars/page.js.nft.json +1 -0
- package/apps/web/.next/server/app/settings/env-vars/page_client-reference-manifest.js +1 -0
- package/apps/web/.next/server/app/settings/mcps/page.js +2 -0
- package/apps/web/.next/server/app/settings/mcps/page.js.nft.json +1 -0
- package/apps/web/.next/server/app/settings/mcps/page_client-reference-manifest.js +1 -0
- package/apps/web/.next/server/app/settings/page.js +2 -0
- package/apps/web/.next/server/app/settings/page.js.nft.json +1 -0
- package/apps/web/.next/server/app/settings/page_client-reference-manifest.js +1 -0
- package/apps/web/.next/server/app-paths-manifest.json +46 -0
- package/apps/web/.next/server/chunks/1157.js +9 -0
- package/apps/web/.next/server/chunks/2287.js +1 -0
- package/apps/web/.next/server/chunks/3444.js +1 -0
- package/apps/web/.next/server/chunks/383.js +6 -0
- package/apps/web/.next/server/chunks/4012.js +58 -0
- package/apps/web/.next/server/chunks/6791.js +1 -0
- package/apps/web/.next/server/chunks/7171.js +1 -0
- package/apps/web/.next/server/chunks/8819.js +22 -0
- package/apps/web/.next/server/edge-runtime-webpack.js +2 -0
- package/apps/web/.next/server/edge-runtime-webpack.js.map +1 -0
- package/apps/web/.next/server/interception-route-rewrite-manifest.js +1 -0
- package/apps/web/.next/server/middleware-build-manifest.js +1 -0
- package/apps/web/.next/server/middleware-manifest.json +32 -0
- package/apps/web/.next/server/middleware-react-loadable-manifest.js +1 -0
- package/apps/web/.next/server/next-font-manifest.js +1 -0
- package/apps/web/.next/server/next-font-manifest.json +1 -0
- package/apps/web/.next/server/pages/_app.js +1 -0
- package/apps/web/.next/server/pages/_app.js.nft.json +1 -0
- package/apps/web/.next/server/pages/_document.js +1 -0
- package/apps/web/.next/server/pages/_document.js.nft.json +1 -0
- package/apps/web/.next/server/pages/_error.js +19 -0
- package/apps/web/.next/server/pages/_error.js.nft.json +1 -0
- package/apps/web/.next/server/pages-manifest.json +5 -0
- package/apps/web/.next/server/server-reference-manifest.js +1 -0
- package/apps/web/.next/server/server-reference-manifest.json +1 -0
- package/apps/web/.next/server/src/middleware.js +14 -0
- package/apps/web/.next/server/src/middleware.js.map +1 -0
- package/apps/web/.next/server/webpack-runtime.js +1 -0
- package/apps/web/.next/static/chunks/18-90b700ea37b686a2.js +1 -0
- package/apps/web/.next/static/chunks/87c73c54-24122e7b92478d00.js +1 -0
- package/apps/web/.next/static/chunks/9664-af80478aa73ba424.js +1 -0
- package/apps/web/.next/static/chunks/app/_not-found/page-b9cee17ed89ca24a.js +1 -0
- package/apps/web/.next/static/chunks/app/agents/[slug]/page-18369fc3fe1a9a7b.js +1 -0
- package/apps/web/.next/static/chunks/app/agents/new/page-bf11cf8901c7e2cd.js +1 -0
- package/apps/web/.next/static/chunks/app/api/agents/[id]/access/route-07f0f73ac9839899.js +1 -0
- package/apps/web/.next/static/chunks/app/api/agents/[id]/claude-md/route-07f0f73ac9839899.js +1 -0
- package/apps/web/.next/static/chunks/app/api/agents/[id]/logs/route-07f0f73ac9839899.js +1 -0
- package/apps/web/.next/static/chunks/app/api/agents/[id]/manifest/route-07f0f73ac9839899.js +1 -0
- package/apps/web/.next/static/chunks/app/api/agents/[id]/mcps/route-07f0f73ac9839899.js +1 -0
- package/apps/web/.next/static/chunks/app/api/agents/[id]/memories/[memId]/route-07f0f73ac9839899.js +1 -0
- package/apps/web/.next/static/chunks/app/api/agents/[id]/memories/route-07f0f73ac9839899.js +1 -0
- package/apps/web/.next/static/chunks/app/api/agents/[id]/permissions/route-07f0f73ac9839899.js +1 -0
- package/apps/web/.next/static/chunks/app/api/agents/[id]/reload/route-07f0f73ac9839899.js +1 -0
- package/apps/web/.next/static/chunks/app/api/agents/[id]/restrictions/route-07f0f73ac9839899.js +1 -0
- package/apps/web/.next/static/chunks/app/api/agents/[id]/route-07f0f73ac9839899.js +1 -0
- package/apps/web/.next/static/chunks/app/api/agents/[id]/skills/[skillId]/route-07f0f73ac9839899.js +1 -0
- package/apps/web/.next/static/chunks/app/api/agents/[id]/skills/route-07f0f73ac9839899.js +1 -0
- package/apps/web/.next/static/chunks/app/api/agents/[id]/slack-info/route-07f0f73ac9839899.js +1 -0
- package/apps/web/.next/static/chunks/app/api/agents/[id]/snapshots/[sid]/restore/route-07f0f73ac9839899.js +1 -0
- package/apps/web/.next/static/chunks/app/api/agents/[id]/snapshots/[sid]/route-07f0f73ac9839899.js +1 -0
- package/apps/web/.next/static/chunks/app/api/agents/[id]/snapshots/route-07f0f73ac9839899.js +1 -0
- package/apps/web/.next/static/chunks/app/api/agents/[id]/start/route-07f0f73ac9839899.js +1 -0
- package/apps/web/.next/static/chunks/app/api/agents/[id]/stop/route-07f0f73ac9839899.js +1 -0
- package/apps/web/.next/static/chunks/app/api/agents/route-07f0f73ac9839899.js +1 -0
- package/apps/web/.next/static/chunks/app/api/auth/login/route-07f0f73ac9839899.js +1 -0
- package/apps/web/.next/static/chunks/app/api/auth/logout/route-07f0f73ac9839899.js +1 -0
- package/apps/web/.next/static/chunks/app/api/auth/me/route-07f0f73ac9839899.js +1 -0
- package/apps/web/.next/static/chunks/app/api/auth/users/[id]/route-07f0f73ac9839899.js +1 -0
- package/apps/web/.next/static/chunks/app/api/auth/users/route-07f0f73ac9839899.js +1 -0
- package/apps/web/.next/static/chunks/app/api/env-vars/[key]/route-07f0f73ac9839899.js +1 -0
- package/apps/web/.next/static/chunks/app/api/env-vars/route-07f0f73ac9839899.js +1 -0
- package/apps/web/.next/static/chunks/app/api/jobs/[id]/route-07f0f73ac9839899.js +1 -0
- package/apps/web/.next/static/chunks/app/api/jobs/[id]/runs/route-07f0f73ac9839899.js +1 -0
- package/apps/web/.next/static/chunks/app/api/jobs/route-07f0f73ac9839899.js +1 -0
- package/apps/web/.next/static/chunks/app/api/mcps/[id]/route-07f0f73ac9839899.js +1 -0
- package/apps/web/.next/static/chunks/app/api/mcps/[id]/test/route-07f0f73ac9839899.js +1 -0
- package/apps/web/.next/static/chunks/app/api/mcps/route-07f0f73ac9839899.js +1 -0
- package/apps/web/.next/static/chunks/app/api/settings/route-07f0f73ac9839899.js +1 -0
- package/apps/web/.next/static/chunks/app/jobs/page-f5aa89a47c50efd8.js +1 -0
- package/apps/web/.next/static/chunks/app/layout-2079f4964aa7314e.js +1 -0
- package/apps/web/.next/static/chunks/app/login/layout-07f0f73ac9839899.js +1 -0
- package/apps/web/.next/static/chunks/app/login/page-aa259283dc38e8f9.js +1 -0
- package/apps/web/.next/static/chunks/app/page-e83437b608104dff.js +1 -0
- package/apps/web/.next/static/chunks/app/settings/env-vars/page-06479dbdfb78b76b.js +1 -0
- package/apps/web/.next/static/chunks/app/settings/mcps/page-75650686ed6490c7.js +1 -0
- package/apps/web/.next/static/chunks/app/settings/page-e1e62fc41ff6cddd.js +1 -0
- package/apps/web/.next/static/chunks/framework-811407f832a33072.js +1 -0
- package/apps/web/.next/static/chunks/main-3f1cddbdd67b1546.js +1 -0
- package/apps/web/.next/static/chunks/main-app-cebd8a6a5ccbf72d.js +1 -0
- package/apps/web/.next/static/chunks/pages/_app-50fa07b56b2d29ac.js +1 -0
- package/apps/web/.next/static/chunks/pages/_error-fed8688bdd23f211.js +1 -0
- package/apps/web/.next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- package/apps/web/.next/static/chunks/webpack-6c05566dba553c97.js +1 -0
- package/apps/web/.next/static/css/15371687405525e2.css +5 -0
- package/apps/web/.next/static/ikfNbLhuw7jntn35bz0lk/_buildManifest.js +1 -0
- package/apps/web/.next/static/ikfNbLhuw7jntn35bz0lk/_ssgManifest.js +1 -0
- package/apps/web/.next/trace +5 -0
- package/apps/web/.next/types/app/agents/[slug]/page.ts +84 -0
- package/apps/web/.next/types/app/agents/new/page.ts +84 -0
- package/apps/web/.next/types/app/api/agents/[id]/access/route.ts +347 -0
- package/apps/web/.next/types/app/api/agents/[id]/claude-md/route.ts +347 -0
- package/apps/web/.next/types/app/api/agents/[id]/logs/route.ts +347 -0
- package/apps/web/.next/types/app/api/agents/[id]/manifest/route.ts +347 -0
- package/apps/web/.next/types/app/api/agents/[id]/mcps/route.ts +347 -0
- package/apps/web/.next/types/app/api/agents/[id]/memories/[memId]/route.ts +347 -0
- package/apps/web/.next/types/app/api/agents/[id]/memories/route.ts +347 -0
- package/apps/web/.next/types/app/api/agents/[id]/permissions/route.ts +347 -0
- package/apps/web/.next/types/app/api/agents/[id]/reload/route.ts +347 -0
- package/apps/web/.next/types/app/api/agents/[id]/restrictions/route.ts +347 -0
- package/apps/web/.next/types/app/api/agents/[id]/route.ts +347 -0
- package/apps/web/.next/types/app/api/agents/[id]/skills/[skillId]/route.ts +347 -0
- package/apps/web/.next/types/app/api/agents/[id]/skills/route.ts +347 -0
- package/apps/web/.next/types/app/api/agents/[id]/slack-info/route.ts +347 -0
- package/apps/web/.next/types/app/api/agents/[id]/snapshots/[sid]/restore/route.ts +347 -0
- package/apps/web/.next/types/app/api/agents/[id]/snapshots/[sid]/route.ts +347 -0
- package/apps/web/.next/types/app/api/agents/[id]/snapshots/route.ts +347 -0
- package/apps/web/.next/types/app/api/agents/[id]/start/route.ts +347 -0
- package/apps/web/.next/types/app/api/agents/[id]/stop/route.ts +347 -0
- package/apps/web/.next/types/app/api/agents/route.ts +347 -0
- package/apps/web/.next/types/app/api/auth/login/route.ts +347 -0
- package/apps/web/.next/types/app/api/auth/logout/route.ts +347 -0
- package/apps/web/.next/types/app/api/auth/me/route.ts +347 -0
- package/apps/web/.next/types/app/api/auth/users/[id]/route.ts +347 -0
- package/apps/web/.next/types/app/api/auth/users/route.ts +347 -0
- package/apps/web/.next/types/app/api/env-vars/[key]/route.ts +347 -0
- package/apps/web/.next/types/app/api/env-vars/route.ts +347 -0
- package/apps/web/.next/types/app/api/jobs/[id]/route.ts +347 -0
- package/apps/web/.next/types/app/api/jobs/[id]/runs/route.ts +347 -0
- package/apps/web/.next/types/app/api/jobs/route.ts +347 -0
- package/apps/web/.next/types/app/api/mcps/[id]/route.ts +347 -0
- package/apps/web/.next/types/app/api/mcps/[id]/test/route.ts +347 -0
- package/apps/web/.next/types/app/api/mcps/route.ts +347 -0
- package/apps/web/.next/types/app/api/settings/route.ts +347 -0
- package/apps/web/.next/types/app/jobs/page.ts +84 -0
- package/apps/web/.next/types/app/login/layout.ts +84 -0
- package/apps/web/.next/types/app/login/page.ts +84 -0
- package/apps/web/.next/types/app/page.ts +84 -0
- package/apps/web/.next/types/app/settings/env-vars/page.ts +84 -0
- package/apps/web/.next/types/app/settings/mcps/page.ts +84 -0
- package/apps/web/.next/types/app/settings/page.ts +84 -0
- package/apps/web/.next/types/cache-life.d.ts +141 -0
- package/apps/web/.next/types/package.json +1 -0
- package/apps/web/.next/types/routes.d.ts +114 -0
- package/apps/web/.next/types/validator.ts +448 -0
- package/apps/web/Dockerfile +37 -0
- package/apps/web/next-env.d.ts +6 -0
- package/apps/web/next.config.js +6 -0
- package/apps/web/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
- package/apps/web/package.json +48 -0
- package/apps/web/postcss.config.js +3 -0
- package/apps/web/public/logo.svg +17 -0
- package/apps/web/src/app/agents/[slug]/page.tsx +2235 -0
- package/apps/web/src/app/agents/new/page.tsx +1161 -0
- package/apps/web/src/app/api/agents/[id]/access/route.ts +76 -0
- package/apps/web/src/app/api/agents/[id]/claude-md/route.ts +111 -0
- package/apps/web/src/app/api/agents/[id]/logs/route.ts +84 -0
- package/apps/web/src/app/api/agents/[id]/manifest/route.ts +32 -0
- package/apps/web/src/app/api/agents/[id]/mcps/route.ts +73 -0
- package/apps/web/src/app/api/agents/[id]/memories/[memId]/route.ts +31 -0
- package/apps/web/src/app/api/agents/[id]/memories/route.ts +56 -0
- package/apps/web/src/app/api/agents/[id]/permissions/route.ts +74 -0
- package/apps/web/src/app/api/agents/[id]/reload/route.ts +33 -0
- package/apps/web/src/app/api/agents/[id]/restrictions/route.ts +85 -0
- package/apps/web/src/app/api/agents/[id]/route.ts +81 -0
- package/apps/web/src/app/api/agents/[id]/skills/[skillId]/route.ts +52 -0
- package/apps/web/src/app/api/agents/[id]/skills/route.ts +80 -0
- package/apps/web/src/app/api/agents/[id]/slack-info/route.ts +38 -0
- package/apps/web/src/app/api/agents/[id]/snapshots/[sid]/restore/route.ts +61 -0
- package/apps/web/src/app/api/agents/[id]/snapshots/[sid]/route.ts +53 -0
- package/apps/web/src/app/api/agents/[id]/snapshots/route.ts +84 -0
- package/apps/web/src/app/api/agents/[id]/start/route.ts +35 -0
- package/apps/web/src/app/api/agents/[id]/stop/route.ts +35 -0
- package/apps/web/src/app/api/agents/route.ts +99 -0
- package/apps/web/src/app/api/auth/login/route.ts +39 -0
- package/apps/web/src/app/api/auth/logout/route.ts +21 -0
- package/apps/web/src/app/api/auth/me/route.ts +24 -0
- package/apps/web/src/app/api/auth/users/[id]/route.ts +48 -0
- package/apps/web/src/app/api/auth/users/route.ts +63 -0
- package/apps/web/src/app/api/env-vars/[key]/route.ts +66 -0
- package/apps/web/src/app/api/env-vars/route.ts +59 -0
- package/apps/web/src/app/api/jobs/[id]/route.ts +51 -0
- package/apps/web/src/app/api/jobs/[id]/runs/route.ts +24 -0
- package/apps/web/src/app/api/jobs/route.ts +42 -0
- package/apps/web/src/app/api/mcps/[id]/route.ts +60 -0
- package/apps/web/src/app/api/mcps/[id]/test/route.ts +195 -0
- package/apps/web/src/app/api/mcps/route.ts +72 -0
- package/apps/web/src/app/api/settings/route.ts +42 -0
- package/apps/web/src/app/globals.css +124 -0
- package/apps/web/src/app/icon.svg +17 -0
- package/apps/web/src/app/jobs/page.tsx +543 -0
- package/apps/web/src/app/layout-shell.tsx +89 -0
- package/apps/web/src/app/layout.tsx +18 -0
- package/apps/web/src/app/login/layout.tsx +9 -0
- package/apps/web/src/app/login/page.tsx +150 -0
- package/apps/web/src/app/page.tsx +573 -0
- package/apps/web/src/app/settings/env-vars/page.tsx +216 -0
- package/apps/web/src/app/settings/mcps/page.tsx +763 -0
- package/apps/web/src/app/settings/page.tsx +528 -0
- package/apps/web/src/app/sidebar.tsx +345 -0
- package/apps/web/src/lib/__tests__/api-guard.test.ts +189 -0
- package/apps/web/src/lib/__tests__/auth.test.ts +262 -0
- package/apps/web/src/lib/__tests__/boss-registry.test.ts +323 -0
- package/apps/web/src/lib/__tests__/compile.test.ts +161 -0
- package/apps/web/src/lib/__tests__/db-agent-hierarchy.test.ts +136 -0
- package/apps/web/src/lib/__tests__/db-env-vars.test.ts +216 -0
- package/apps/web/src/lib/__tests__/db-restrictions.test.ts +117 -0
- package/apps/web/src/lib/__tests__/db.integration.test.ts +271 -0
- package/apps/web/src/lib/__tests__/diff.test.ts +102 -0
- package/apps/web/src/lib/__tests__/mcp-mask.test.ts +274 -0
- package/apps/web/src/lib/__tests__/skill-templates.test.ts +237 -0
- package/apps/web/src/lib/__tests__/slack-manifest.test.ts +105 -0
- package/apps/web/src/lib/api-guard.ts +68 -0
- package/apps/web/src/lib/auth-context.tsx +71 -0
- package/apps/web/src/lib/auth.ts +128 -0
- package/apps/web/src/lib/boss-registry.ts +90 -0
- package/apps/web/src/lib/compile.ts +51 -0
- package/apps/web/src/lib/db.ts +1196 -0
- package/apps/web/src/lib/diff.ts +43 -0
- package/apps/web/src/lib/mcp-mask.ts +91 -0
- package/apps/web/src/lib/portal.tsx +23 -0
- package/apps/web/src/lib/skill-templates.ts +148 -0
- package/apps/web/src/lib/slack-manifest.ts +85 -0
- package/apps/web/src/middleware.ts +68 -0
- package/apps/web/tailwind.config.js +6 -0
- package/apps/web/tsconfig.json +23 -0
- package/apps/web/vitest.config.mts +21 -0
- package/cli/.claude/settings.local.json +6 -0
- package/cli/README.md +281 -0
- package/cli/node_modules/.package-lock.json +427 -0
- package/cli/node_modules/commander/LICENSE +22 -0
- package/cli/node_modules/commander/Readme.md +1157 -0
- package/cli/node_modules/commander/esm.mjs +16 -0
- package/cli/node_modules/commander/index.js +24 -0
- package/cli/node_modules/commander/lib/argument.js +149 -0
- package/cli/node_modules/commander/lib/command.js +2509 -0
- package/cli/node_modules/commander/lib/error.js +39 -0
- package/cli/node_modules/commander/lib/help.js +520 -0
- package/cli/node_modules/commander/lib/option.js +330 -0
- package/cli/node_modules/commander/lib/suggestSimilar.js +101 -0
- package/cli/node_modules/commander/package-support.json +16 -0
- package/cli/node_modules/commander/package.json +84 -0
- package/cli/node_modules/commander/typings/esm.d.mts +3 -0
- package/cli/node_modules/commander/typings/index.d.ts +969 -0
- package/cli/package-lock.json +449 -0
- package/cli/package.json +44 -0
- package/cli/src/commands/init.ts +514 -0
- package/cli/src/commands/manage.ts +115 -0
- package/cli/src/index.ts +63 -0
- package/cli/tsconfig.json +14 -0
- package/docker-compose.yml +122 -0
- package/docs/agents/boss-agents.mdx +108 -0
- package/docs/agents/creating-agents.mdx +132 -0
- package/docs/agents/memory.mdx +113 -0
- package/docs/agents/tools.mdx +103 -0
- package/docs/configuration/env-vars.mdx +166 -0
- package/docs/configuration/mcp-servers.mdx +203 -0
- package/docs/configuration/slack-app.mdx +175 -0
- package/docs/docs.json +79 -0
- package/docs/favicon.svg +17 -0
- package/docs/features/history.mdx +60 -0
- package/docs/features/import-export.mdx +77 -0
- package/docs/features/logs.mdx +131 -0
- package/docs/features/multi-workspace.mdx +90 -0
- package/docs/features/scheduled-jobs.mdx +231 -0
- package/docs/features/users.mdx +92 -0
- package/docs/introduction.mdx +160 -0
- package/docs/logo/dark.svg +17 -0
- package/docs/logo/light.svg +17 -0
- package/docs/logo/wide-dark.svg +12 -0
- package/docs/logo/wide-light.svg +12 -0
- package/docs/quickstart.mdx +270 -0
- package/docs/self-hosting/docker.mdx +151 -0
- package/docs/self-hosting/production.mdx +176 -0
- package/package.json +20 -36
- package/packages/shared/dist/index.d.ts +8 -0
- package/packages/shared/dist/index.d.ts.map +1 -0
- package/packages/shared/dist/index.js +24 -0
- package/packages/shared/dist/index.js.map +1 -0
- package/packages/shared/dist/types.d.ts +584 -0
- package/packages/shared/dist/types.d.ts.map +1 -0
- package/packages/shared/dist/types.js +39 -0
- package/packages/shared/dist/types.js.map +1 -0
- package/packages/shared/package.json +15 -0
- package/packages/shared/src/db/schema.sql +354 -0
- package/packages/shared/src/index.ts +8 -0
- package/packages/shared/src/types.ts +683 -0
- package/packages/shared/tsconfig.json +17 -0
- package/scripts/dev.sh +45 -0
- /package/{dist → cli/dist}/commands/init.d.ts +0 -0
- /package/{dist → cli/dist}/commands/init.js +0 -0
- /package/{dist → cli/dist}/commands/manage.d.ts +0 -0
- /package/{dist → cli/dist}/commands/manage.js +0 -0
- /package/{dist → cli/dist}/index.d.ts +0 -0
- /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`.
|