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,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2020",
|
|
4
|
+
"module": "commonjs",
|
|
5
|
+
"lib": ["ES2020"],
|
|
6
|
+
"outDir": "dist",
|
|
7
|
+
"rootDir": "src",
|
|
8
|
+
"strict": true,
|
|
9
|
+
"esModuleInterop": true,
|
|
10
|
+
"skipLibCheck": true,
|
|
11
|
+
"declaration": true
|
|
12
|
+
},
|
|
13
|
+
"include": ["src"]
|
|
14
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
# =============================================================================
|
|
2
|
+
# SlackHive — Docker Compose
|
|
3
|
+
#
|
|
4
|
+
# Services:
|
|
5
|
+
# postgres — Primary database (port 5432)
|
|
6
|
+
# redis — Pub/sub for agent hot-reload events (port 6379)
|
|
7
|
+
# web — Next.js management UI (port 3000)
|
|
8
|
+
# runner — Agent runner service (manages all Slack bots)
|
|
9
|
+
# =============================================================================
|
|
10
|
+
|
|
11
|
+
services:
|
|
12
|
+
# ---------------------------------------------------------------------------
|
|
13
|
+
# postgres — Primary datastore
|
|
14
|
+
# Schema is auto-applied on first start from schema.sql.
|
|
15
|
+
# ---------------------------------------------------------------------------
|
|
16
|
+
postgres:
|
|
17
|
+
image: postgres:16-alpine
|
|
18
|
+
restart: unless-stopped
|
|
19
|
+
environment:
|
|
20
|
+
POSTGRES_DB: ${POSTGRES_DB:-agentteam}
|
|
21
|
+
POSTGRES_USER: ${POSTGRES_USER:-agentteam}
|
|
22
|
+
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-agentteam}
|
|
23
|
+
volumes:
|
|
24
|
+
- pgdata:/var/lib/postgresql/data
|
|
25
|
+
- ./packages/shared/src/db/schema.sql:/docker-entrypoint-initdb.d/01-schema.sql:ro
|
|
26
|
+
healthcheck:
|
|
27
|
+
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-agentteam} -d ${POSTGRES_DB:-agentteam}"]
|
|
28
|
+
interval: 5s
|
|
29
|
+
timeout: 5s
|
|
30
|
+
retries: 10
|
|
31
|
+
|
|
32
|
+
# ---------------------------------------------------------------------------
|
|
33
|
+
# redis — Lightweight pub/sub broker
|
|
34
|
+
# Used for agent reload signals from web → runner.
|
|
35
|
+
# ---------------------------------------------------------------------------
|
|
36
|
+
redis:
|
|
37
|
+
image: redis:7-alpine
|
|
38
|
+
restart: unless-stopped
|
|
39
|
+
command: sh -c "redis-server --requirepass $$REDIS_PASSWORD"
|
|
40
|
+
environment:
|
|
41
|
+
REDIS_PASSWORD: ${REDIS_PASSWORD}
|
|
42
|
+
healthcheck:
|
|
43
|
+
test: ["CMD-SHELL", "redis-cli -a $$REDIS_PASSWORD ping"]
|
|
44
|
+
interval: 5s
|
|
45
|
+
timeout: 3s
|
|
46
|
+
retries: 5
|
|
47
|
+
|
|
48
|
+
# ---------------------------------------------------------------------------
|
|
49
|
+
# web — Next.js 15 management UI
|
|
50
|
+
# Provides agent onboarding wizard, skill editor, MCP catalog,
|
|
51
|
+
# memory viewer, live logs, and start/stop controls.
|
|
52
|
+
# ---------------------------------------------------------------------------
|
|
53
|
+
web:
|
|
54
|
+
build:
|
|
55
|
+
context: .
|
|
56
|
+
dockerfile: apps/web/Dockerfile
|
|
57
|
+
args:
|
|
58
|
+
AUTH_SECRET: ${AUTH_SECRET:-change-this-secret-in-production}
|
|
59
|
+
ADMIN_PASSWORD: ${ADMIN_PASSWORD:-changeme}
|
|
60
|
+
restart: unless-stopped
|
|
61
|
+
ports:
|
|
62
|
+
- "3001:3000"
|
|
63
|
+
environment:
|
|
64
|
+
DATABASE_URL: postgresql://${POSTGRES_USER:-agentteam}:${POSTGRES_PASSWORD:-agentteam}@postgres:5432/${POSTGRES_DB:-agentteam}
|
|
65
|
+
REDIS_URL: redis://:${REDIS_PASSWORD}@redis:6379
|
|
66
|
+
NODE_ENV: ${NODE_ENV:-production}
|
|
67
|
+
ADMIN_USERNAME: ${ADMIN_USERNAME:-admin}
|
|
68
|
+
ADMIN_PASSWORD: ${ADMIN_PASSWORD:-changeme}
|
|
69
|
+
AUTH_SECRET: ${AUTH_SECRET:-change-this-secret-in-production}
|
|
70
|
+
env_file:
|
|
71
|
+
- .env
|
|
72
|
+
depends_on:
|
|
73
|
+
postgres:
|
|
74
|
+
condition: service_healthy
|
|
75
|
+
redis:
|
|
76
|
+
condition: service_healthy
|
|
77
|
+
volumes:
|
|
78
|
+
# Docker socket so the logs API can tail runner container logs
|
|
79
|
+
- /var/run/docker.sock:/var/run/docker.sock:ro
|
|
80
|
+
|
|
81
|
+
# ---------------------------------------------------------------------------
|
|
82
|
+
# runner — Agent runner service
|
|
83
|
+
# Loads all active agents from Postgres at startup, then manages one
|
|
84
|
+
# @slack/bolt App instance per agent. Listens on Redis for reload events.
|
|
85
|
+
#
|
|
86
|
+
# /tmp/agents is mounted to allow the runner to write ephemeral CLAUDE.md
|
|
87
|
+
# files for the Claude Code SDK, and to watch for memory file writes.
|
|
88
|
+
# ---------------------------------------------------------------------------
|
|
89
|
+
runner:
|
|
90
|
+
build:
|
|
91
|
+
context: .
|
|
92
|
+
dockerfile: apps/runner/Dockerfile
|
|
93
|
+
restart: unless-stopped
|
|
94
|
+
environment:
|
|
95
|
+
DATABASE_URL: postgresql://${POSTGRES_USER:-agentteam}:${POSTGRES_PASSWORD:-agentteam}@postgres:5432/${POSTGRES_DB:-agentteam}
|
|
96
|
+
REDIS_URL: redis://:${REDIS_PASSWORD}@redis:6379
|
|
97
|
+
NODE_ENV: ${NODE_ENV:-production}
|
|
98
|
+
env_file:
|
|
99
|
+
- .env
|
|
100
|
+
depends_on:
|
|
101
|
+
postgres:
|
|
102
|
+
condition: service_healthy
|
|
103
|
+
redis:
|
|
104
|
+
condition: service_healthy
|
|
105
|
+
volumes:
|
|
106
|
+
# Ephemeral per-agent working directories (CLAUDE.md + memory watch)
|
|
107
|
+
- /tmp/agents:/tmp/agents
|
|
108
|
+
# Mount host Claude config (read-only for credentials safety)
|
|
109
|
+
- ${HOME}/.claude:/root/.claude:ro
|
|
110
|
+
# Writable overlays for SDK runtime state (session-env, shell-snapshots)
|
|
111
|
+
- claude-session-env:/root/.claude/session-env
|
|
112
|
+
- claude-shell-snapshots:/root/.claude/shell-snapshots
|
|
113
|
+
# Mount host home so MCP server paths resolve inside container
|
|
114
|
+
- ${HOME}:${HOME}:ro
|
|
115
|
+
|
|
116
|
+
volumes:
|
|
117
|
+
pgdata:
|
|
118
|
+
driver: local
|
|
119
|
+
claude-session-env:
|
|
120
|
+
driver: local
|
|
121
|
+
claude-shell-snapshots:
|
|
122
|
+
driver: local
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Boss Agents"
|
|
3
|
+
description: "Set up orchestrating Boss agents that delegate tasks to specialist teams."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## What is a Boss agent?
|
|
7
|
+
|
|
8
|
+
A Boss agent is a special type of SlackHive agent whose sole job is to receive high-level requests and delegate them to the right specialist agents. The Boss never does the specialist work itself — it orchestrates.
|
|
9
|
+
|
|
10
|
+
```
|
|
11
|
+
User: @boss help me analyze last week's bookings
|
|
12
|
+
Boss: I'll get @data-bot on this 👇
|
|
13
|
+
@data-bot — user wants booking analysis for last week.
|
|
14
|
+
When you're done, please tag @boss so I can confirm.
|
|
15
|
+
DataBot: [reads full thread, runs Redshift query via MCP]
|
|
16
|
+
Bookings were up 12% to 4,320...
|
|
17
|
+
Boss: Thanks @data-bot! Here's the summary: bookings increased 12%...
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
The Boss reads the message, looks up its team registry, and delegates to the right specialist by @mentioning them in the same Slack thread. The specialist receives the full thread as context — nothing is lost in the handoff.
|
|
21
|
+
|
|
22
|
+
## Creating a Boss agent
|
|
23
|
+
|
|
24
|
+
During agent creation (Step 1 — Name & Role), toggle **This agent is a Boss**.
|
|
25
|
+
|
|
26
|
+
When the Boss toggle is enabled:
|
|
27
|
+
- The Tools step (Step 4) is skipped — Boss agents don't need MCP servers or skills
|
|
28
|
+
- `CLAUDE.md` is auto-generated from the team registry instead of using a custom identity file
|
|
29
|
+
- The Boss agent connects to Slack like any other agent and receives @mentions normally
|
|
30
|
+
|
|
31
|
+
## The team registry
|
|
32
|
+
|
|
33
|
+
Each Boss gets a `CLAUDE.md` compiled from its team registry. The registry is a Markdown document injected into the Boss's identity that lists every specialist reporting to it.
|
|
34
|
+
|
|
35
|
+
Example registry section:
|
|
36
|
+
|
|
37
|
+
```markdown
|
|
38
|
+
## Your Team
|
|
39
|
+
|
|
40
|
+
- **DataBot** (<@U12345678>) — Data warehouse NLQ, Redshift queries, business metrics
|
|
41
|
+
- **Writer** (<@U87654321>) — Content generation, Slack summaries, announcements
|
|
42
|
+
- **Engineer** (<@U11112222>) — Code review, debugging, GitHub PR summaries
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
The registry also includes explicit delegation rules:
|
|
46
|
+
|
|
47
|
+
```markdown
|
|
48
|
+
## Delegation Rules
|
|
49
|
+
- ALWAYS delegate — do not attempt to perform specialist work yourself
|
|
50
|
+
- Use the thread so specialists have full context
|
|
51
|
+
- If unsure who to delegate to, ask the user for clarification
|
|
52
|
+
- Always instruct the specialist to @mention you when they are done
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
**The registry auto-regenerates** whenever any agent is created, updated, or deleted. You never need to maintain it manually.
|
|
56
|
+
|
|
57
|
+
## Setting reportsTo
|
|
58
|
+
|
|
59
|
+
To add a specialist to a Boss's team, set the **Reports To** field on the specialist agent:
|
|
60
|
+
|
|
61
|
+
1. Open the specialist agent's **Overview** tab
|
|
62
|
+
2. Select one or more Boss agents in the **Reports To** dropdown
|
|
63
|
+
3. Save — the Boss's registry regenerates automatically within seconds
|
|
64
|
+
|
|
65
|
+
A specialist can report to multiple bosses. It will appear in each selected boss's team registry. This supports multi-domain setups where the same specialist (e.g. an "Engineer" agent) is available to multiple boss agents (e.g. "Product Boss" and "Infra Boss").
|
|
66
|
+
|
|
67
|
+
## Multiple Boss agents
|
|
68
|
+
|
|
69
|
+
You can create as many Boss agents as needed. Common patterns:
|
|
70
|
+
|
|
71
|
+
| Pattern | Example |
|
|
72
|
+
|---------|---------|
|
|
73
|
+
| **Single Boss** | One orchestrator for the entire team |
|
|
74
|
+
| **Domain Bosses** | Separate Boss per team (eng-boss, data-boss, content-boss) |
|
|
75
|
+
| **Hierarchical** | A meta-boss delegates to domain bosses, which delegate to specialists |
|
|
76
|
+
|
|
77
|
+
Each Boss only sees the specialists that explicitly report to it.
|
|
78
|
+
|
|
79
|
+
## Delegation flow in detail
|
|
80
|
+
|
|
81
|
+
When the Boss receives a message:
|
|
82
|
+
|
|
83
|
+
1. Boss reads the user's request
|
|
84
|
+
2. Checks the team registry to identify the right specialist
|
|
85
|
+
3. @mentions the specialist in the **same thread** with a clear task description
|
|
86
|
+
4. Instructs the specialist to tag the Boss when done
|
|
87
|
+
5. Specialist picks up the full thread context and completes the task
|
|
88
|
+
6. Specialist tags the Boss to signal completion
|
|
89
|
+
7. Boss reviews the result, confirms for the user, and decides if another specialist is needed or the task is done
|
|
90
|
+
|
|
91
|
+
The key design: everything happens **in the Slack thread**. Every participant can see the full conversation history — no context loss when multiple agents collaborate.
|
|
92
|
+
|
|
93
|
+
## CLAUDE.md for Boss agents
|
|
94
|
+
|
|
95
|
+
The Boss's `CLAUDE.md` is fully auto-generated and managed by SlackHive. You cannot manually edit it through the CLAUDE.md editor (the editor is read-only for Boss agents).
|
|
96
|
+
|
|
97
|
+
The generated content includes:
|
|
98
|
+
- The Boss's name and orchestrator role description
|
|
99
|
+
- Your Role section with delegation rules
|
|
100
|
+
- The full team roster with Slack user IDs and descriptions
|
|
101
|
+
- Delegation format instructions (exact phrasing to use)
|
|
102
|
+
- Instructions for what to do after a specialist responds
|
|
103
|
+
|
|
104
|
+
## Scheduled jobs
|
|
105
|
+
|
|
106
|
+
Boss agents work great with scheduled jobs — set up a daily cross-team digest, a weekly summary, or an alert that fires when something needs escalation across multiple specialists.
|
|
107
|
+
|
|
108
|
+
→ See [Scheduled Jobs](/features/scheduled-jobs) for the full setup guide.
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Creating Agents"
|
|
3
|
+
description: "Create a Claude agent and deploy it to Slack using the 5-step wizard."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Click **New Agent** in the sidebar to open the creation wizard. Creating an agent takes about 5 minutes if you have your Slack credentials ready.
|
|
7
|
+
|
|
8
|
+
## Step 1: Name & Role
|
|
9
|
+
|
|
10
|
+
| Field | Description |
|
|
11
|
+
|-------|-------------|
|
|
12
|
+
| **Name** | Display name shown in the UI and Slack (e.g. "Ava Engineer") |
|
|
13
|
+
| **Slug** | URL-safe identifier auto-generated from the name (e.g. `ava-engineer`). Used internally and as the agent's workspace directory name. |
|
|
14
|
+
| **Description** | What this agent does. Shown in Boss agent team registries so the Boss knows who to delegate to. |
|
|
15
|
+
| **Persona** | Free-form personality and behavioral instructions. Compiled into `CLAUDE.md` as the agent's identity section. |
|
|
16
|
+
| **Model** | The Claude model this agent uses. |
|
|
17
|
+
|
|
18
|
+
### Model selection
|
|
19
|
+
|
|
20
|
+
| Model | Best for |
|
|
21
|
+
|-------|---------|
|
|
22
|
+
| `claude-opus-4-6` | Complex reasoning, Boss agents, multi-step planning |
|
|
23
|
+
| `claude-sonnet-4-6` | Balanced capability and speed — good default for most agents |
|
|
24
|
+
| `claude-haiku-4-5-20251001` | Fast, lightweight tasks and high-volume operations |
|
|
25
|
+
|
|
26
|
+
### Boss vs specialist
|
|
27
|
+
|
|
28
|
+
Toggle **This agent is a Boss** if this agent should orchestrate a team:
|
|
29
|
+
|
|
30
|
+
- Boss agents skip the Tools step (they delegate rather than use tools directly)
|
|
31
|
+
- Boss `CLAUDE.md` is auto-generated from the team registry — it lists all specialists that report to this boss and includes explicit delegation rules
|
|
32
|
+
- The registry regenerates automatically whenever any agent is added, updated, or deleted
|
|
33
|
+
|
|
34
|
+
For specialist agents, use **Reports To** to select which Boss agent(s) they report to. A specialist can report to multiple bosses and will appear in each selected boss's registry.
|
|
35
|
+
|
|
36
|
+
## Step 2: Slack App
|
|
37
|
+
|
|
38
|
+
SlackHive generates a Slack app manifest tailored for your agent. The manifest pre-configures:
|
|
39
|
+
- All required OAuth scopes
|
|
40
|
+
- Socket Mode enabled
|
|
41
|
+
- Bot display name matching your agent's name
|
|
42
|
+
|
|
43
|
+
**To create the Slack app:**
|
|
44
|
+
1. Click **Generate Manifest** in the wizard
|
|
45
|
+
2. Open [api.slack.com/apps](https://api.slack.com/apps) in a new tab
|
|
46
|
+
3. Click **Create New App** → **From a manifest**
|
|
47
|
+
4. Select your workspace, paste the manifest, click **Create**
|
|
48
|
+
5. Go to **OAuth & Permissions** → **Install to Workspace** → **Allow**
|
|
49
|
+
|
|
50
|
+
See [Slack App Setup](/configuration/slack-app) for a detailed walkthrough.
|
|
51
|
+
|
|
52
|
+
## Step 3: Credentials
|
|
53
|
+
|
|
54
|
+
Paste the three values from your Slack app settings:
|
|
55
|
+
|
|
56
|
+
| Field | Where to find it |
|
|
57
|
+
|-------|-----------------|
|
|
58
|
+
| **Bot Token** (`xoxb-...`) | OAuth & Permissions → Bot User OAuth Token |
|
|
59
|
+
| **App Token** (`xapp-...`) | Basic Information → App-Level Tokens (create with `connections:write` scope) |
|
|
60
|
+
| **Signing Secret** | Basic Information → App Credentials |
|
|
61
|
+
|
|
62
|
+
After saving, SlackHive verifies the Slack connection. If it fails, confirm that Socket Mode is enabled on your app.
|
|
63
|
+
|
|
64
|
+
## Step 4: Tools
|
|
65
|
+
|
|
66
|
+
<Note>This step is skipped for Boss agents.</Note>
|
|
67
|
+
|
|
68
|
+
### Skill template
|
|
69
|
+
|
|
70
|
+
Select a starting template for the agent's skill set:
|
|
71
|
+
|
|
72
|
+
| Template | Description |
|
|
73
|
+
|----------|-------------|
|
|
74
|
+
| **Blank** | No starter skills — clean slate |
|
|
75
|
+
| **Data Analyst** | SQL query patterns, data summarization, charting guidance |
|
|
76
|
+
| **Writer** | Content drafting, editing, tone adjustment |
|
|
77
|
+
| **Developer** | Code review, debugging, PR summaries, architecture commands |
|
|
78
|
+
|
|
79
|
+
Skills are Markdown files compiled as Claude Code slash commands. They can be edited or replaced at any time from the agent's **Skills** tab.
|
|
80
|
+
|
|
81
|
+
### MCP servers
|
|
82
|
+
|
|
83
|
+
Assign MCP servers from the platform catalog to give this agent access to external tools. Each assigned server's tools become available as `mcp__{serverName}__{toolName}`.
|
|
84
|
+
|
|
85
|
+
Servers can be added or removed later from the agent's **Tools** tab.
|
|
86
|
+
|
|
87
|
+
## Step 5: Review
|
|
88
|
+
|
|
89
|
+
Review the summary:
|
|
90
|
+
- Agent name, slug, model, persona
|
|
91
|
+
- Boss/specialist configuration
|
|
92
|
+
- Slack app connection status
|
|
93
|
+
- Assigned skills and MCP servers
|
|
94
|
+
|
|
95
|
+
Click **Create Agent** to finalize. The runner picks up the new agent within seconds via Redis pub/sub.
|
|
96
|
+
|
|
97
|
+
## After creation
|
|
98
|
+
|
|
99
|
+
1. The agent appears in the dashboard with **Active** status
|
|
100
|
+
2. Invite the bot to a Slack channel: `/invite @your-agent-name`
|
|
101
|
+
3. @mention it to start a conversation
|
|
102
|
+
|
|
103
|
+
<Tip>
|
|
104
|
+
Test your agent by opening a Slack DM with it. DMs don't require a channel invite.
|
|
105
|
+
</Tip>
|
|
106
|
+
|
|
107
|
+
## Editing an agent
|
|
108
|
+
|
|
109
|
+
All fields are editable after creation from the agent's detail page tabs:
|
|
110
|
+
|
|
111
|
+
| Tab | What you can edit |
|
|
112
|
+
|-----|------------------|
|
|
113
|
+
| **Overview** | Name, description, persona, model, Slack credentials, channel restrictions |
|
|
114
|
+
| **CLAUDE.md** | The agent's main instruction/identity file directly |
|
|
115
|
+
| **Skills** | Skill files (slash commands), add/edit/delete |
|
|
116
|
+
| **Tools** | MCP server assignments, tool permissions (allowlist/denylist) |
|
|
117
|
+
| **Memory** | Browse, inspect, and delete agent memories |
|
|
118
|
+
| **History** | Version control — browse snapshots, view diffs, restore |
|
|
119
|
+
|
|
120
|
+
Every save to skills, CLAUDE.md, tools, or permissions is auto-snapshotted. Changes are live-reloaded by the runner within seconds.
|
|
121
|
+
|
|
122
|
+
## Channel restrictions
|
|
123
|
+
|
|
124
|
+
By default, an agent responds in any channel it's invited to. To restrict to specific channels:
|
|
125
|
+
|
|
126
|
+
1. Go to the agent's **Overview** tab
|
|
127
|
+
2. Scroll to **Allowed Channels**
|
|
128
|
+
3. Enter one or more Slack channel IDs (e.g. `C12345678`)
|
|
129
|
+
|
|
130
|
+
When a channel list is set, the agent silently ignores messages from other channels. If the bot is invited to a non-allowed channel, it posts a notice and immediately leaves.
|
|
131
|
+
|
|
132
|
+
Find a channel ID in Slack by right-clicking the channel name → **Copy link** — the ID is the `C...` segment at the end of the URL.
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Agent Memory"
|
|
3
|
+
description: "How agents learn from conversations and recall knowledge on demand."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## How memory works
|
|
7
|
+
|
|
8
|
+
Agents learn over time by writing structured memory files during conversations. SlackHive persists these to Postgres and materializes them back to disk on the next startup — so every agent picks up exactly where it left off.
|
|
9
|
+
|
|
10
|
+
```
|
|
11
|
+
Agent writes memory/{type}_{name}.md
|
|
12
|
+
└─► MemoryWatcher detects change (fs.watch, 200ms debounce)
|
|
13
|
+
└─► Parses YAML frontmatter (name, type)
|
|
14
|
+
└─► Upserts into memories table (Postgres)
|
|
15
|
+
|
|
16
|
+
On next agent start:
|
|
17
|
+
DB memories ──► materializeMemoryFiles ──► /tmp/agents/{slug}/memory/
|
|
18
|
+
└─► Agent uses /recall to read them
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Recalling memories
|
|
22
|
+
|
|
23
|
+
Agents use the built-in `/recall` skill to load relevant memories on demand. This keeps the context window clean — memories are only loaded when they're relevant, not stuffed into every conversation.
|
|
24
|
+
|
|
25
|
+
**The agent runs `/recall` automatically** at the start of each conversation and when the topic shifts. It reads `memory/MEMORY.md` for the index, then loads specific files that match.
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
/recall database preferences
|
|
29
|
+
└─► Reads memory/MEMORY.md (index)
|
|
30
|
+
└─► Reads memory/feedback_avoid_mocking.md
|
|
31
|
+
└─► Applies the knowledge to the current response
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
You can also trigger it manually in Slack:
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
/recall Kai's preferences
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## When agents save memories
|
|
41
|
+
|
|
42
|
+
Agents are instructed to save memories when they learn something worth keeping:
|
|
43
|
+
|
|
44
|
+
- **User explicitly corrects or guides** — "don't do X", "always do Y"
|
|
45
|
+
- **Recurring pattern detected** — same question asked repeatedly, same mistake made, same preference shown multiple times
|
|
46
|
+
- **User role or working style** — who someone is, what tools they use, how they like to communicate
|
|
47
|
+
- **Project decisions or constraints** — goals, deadlines, architectural choices that affect future work
|
|
48
|
+
|
|
49
|
+
Memories are saved using the Write tool to create a file in `memory/`. The agent must actually write the file — not just say it saved.
|
|
50
|
+
|
|
51
|
+
## Memory file format
|
|
52
|
+
|
|
53
|
+
```markdown
|
|
54
|
+
---
|
|
55
|
+
name: kai_team_lead
|
|
56
|
+
description: Kai is the data team lead, prefers concise answers
|
|
57
|
+
type: user
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
Kai is the lead of the data team. They prefer concise, direct answers
|
|
61
|
+
without lengthy preamble. They use BigQuery, not Redshift.
|
|
62
|
+
They prefer SQL examples over written explanations.
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
| Field | Required | Description |
|
|
66
|
+
|-------|----------|-------------|
|
|
67
|
+
| `name` | Yes | Snake_case identifier — used as the unique key per agent |
|
|
68
|
+
| `type` | Yes | One of `user`, `feedback`, `project`, `reference` |
|
|
69
|
+
| `description` | No | One-line summary shown in the Memory tab |
|
|
70
|
+
|
|
71
|
+
## Memory types
|
|
72
|
+
|
|
73
|
+
| Type | Purpose | Example |
|
|
74
|
+
|------|---------|---------|
|
|
75
|
+
| `feedback` | Behavioral corrections and validated approaches | "Don't mock the database in integration tests" |
|
|
76
|
+
| `user` | Information about people the agent works with | "Kai is the data team lead, prefers concise answers" |
|
|
77
|
+
| `project` | Ongoing work context, goals, decisions, deadlines | "Merge freeze starts March 5 for mobile release" |
|
|
78
|
+
| `reference` | Pointers to external systems and resources | "Pipeline bugs tracked in Linear project INGEST" |
|
|
79
|
+
|
|
80
|
+
## Memory storage layout
|
|
81
|
+
|
|
82
|
+
Each agent has two memory locations:
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
/tmp/agents/{slug}/
|
|
86
|
+
memory/ ← read-only, materialized from DB on startup
|
|
87
|
+
MEMORY.md ← index file listing all memories
|
|
88
|
+
user_kai_team_lead.md
|
|
89
|
+
feedback_avoid_mocking.md
|
|
90
|
+
project_mobile_release.md
|
|
91
|
+
|
|
92
|
+
sessions/{userId}-{channelId}-{threadTs}/
|
|
93
|
+
memory/ ← where agent writes new memories during conversations
|
|
94
|
+
feedback_new_learning.md
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
The root `memory/` directory is read-only — written once at startup from the database. New memories are written to the session's `memory/` directory, picked up by `MemoryWatcher`, and persisted to Postgres. On the next restart, they appear in the root directory.
|
|
98
|
+
|
|
99
|
+
## Viewing and managing memories
|
|
100
|
+
|
|
101
|
+
Open any agent's detail page and click the **Memory** tab. You can:
|
|
102
|
+
|
|
103
|
+
- View the full content of each memory
|
|
104
|
+
- See the memory type and description
|
|
105
|
+
- Delete a memory (removes it from the database and it won't appear on next reload)
|
|
106
|
+
|
|
107
|
+
## Updating a memory
|
|
108
|
+
|
|
109
|
+
When an agent learns something that supersedes an existing memory, it overwrites the file with the same `name`. The database uses `(agent_id, name)` as the unique key — so updating never creates a duplicate.
|
|
110
|
+
|
|
111
|
+
## Memory does not expire
|
|
112
|
+
|
|
113
|
+
Memories persist until you explicitly delete them. There is no TTL. Agents accumulate knowledge over time and build a richer understanding of their users and projects with every conversation.
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Tools & Permissions"
|
|
3
|
+
description: "Control which tools agents can use: built-in Claude tools, MCP server tools, and the permissions system."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## Available tools
|
|
7
|
+
|
|
8
|
+
SlackHive agents can use three categories of tools:
|
|
9
|
+
|
|
10
|
+
### Always-allowed tools
|
|
11
|
+
|
|
12
|
+
Two tools are always available to every agent regardless of permissions settings:
|
|
13
|
+
|
|
14
|
+
| Tool | Purpose |
|
|
15
|
+
|------|---------|
|
|
16
|
+
| `Read` | Read files from the agent's working directory. Used to read project context, CLAUDE.md, and reference files. |
|
|
17
|
+
| `Write` | Write files to the agent's working directory. **Required for the memory system** — agents must be able to write `memory/*.md` files. |
|
|
18
|
+
|
|
19
|
+
These tools cannot be removed via the permissions UI. They are hardcoded in the runner as `alwaysAllowed = ['Read', 'Write']`.
|
|
20
|
+
|
|
21
|
+
### MCP server tools
|
|
22
|
+
|
|
23
|
+
Tools provided by assigned MCP servers. Each tool is prefixed with `mcp__{serverName}__`:
|
|
24
|
+
|
|
25
|
+
- `mcp__redshift__query` — a `query` tool from a server named `redshift`
|
|
26
|
+
- `mcp__github__create_issue` — a `create_issue` tool from a server named `github`
|
|
27
|
+
- `mcp__filesystem__read_file` — a `read_file` tool from a server named `filesystem`
|
|
28
|
+
|
|
29
|
+
All tools from all assigned MCP servers are automatically allowed when a server is assigned to an agent. To restrict specific tools, use the denylist.
|
|
30
|
+
|
|
31
|
+
### Additional Claude tools
|
|
32
|
+
|
|
33
|
+
The Claude Code provides built-in tools beyond `Read` and `Write`. These can be added to the agent's allowlist:
|
|
34
|
+
|
|
35
|
+
| Tool | Description |
|
|
36
|
+
|------|-------------|
|
|
37
|
+
| `Bash` | Execute shell commands |
|
|
38
|
+
| `Edit` | Make targeted edits to files |
|
|
39
|
+
| `MultiEdit` | Make multiple edits to a file at once |
|
|
40
|
+
| `Glob` | Find files by pattern |
|
|
41
|
+
| `Grep` | Search file contents |
|
|
42
|
+
| `LS` | List directory contents |
|
|
43
|
+
| `WebFetch` | Fetch content from a URL |
|
|
44
|
+
| `WebSearch` | Search the web |
|
|
45
|
+
| `TodoRead` | Read the agent's task list |
|
|
46
|
+
| `TodoWrite` | Update the agent's task list |
|
|
47
|
+
|
|
48
|
+
## Configuring permissions
|
|
49
|
+
|
|
50
|
+
Agent tool permissions are managed from the **Tools** tab on the agent's detail page.
|
|
51
|
+
|
|
52
|
+
### Allowlist
|
|
53
|
+
|
|
54
|
+
Tools in the allowlist are available to the agent. The effective tool set is:
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
effective = (alwaysAllowed + allowlist + mcpToolPrefixes) - denylist
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
To add a tool, type its name (e.g. `Bash`, `WebFetch`) or paste an MCP tool prefix (e.g. `mcp__redshift`) to allow all tools from that server.
|
|
61
|
+
|
|
62
|
+
### Denylist
|
|
63
|
+
|
|
64
|
+
Tools in the denylist are blocked even if they appear in the allowlist. Use this to selectively exclude tools from an MCP server you've otherwise allowed.
|
|
65
|
+
|
|
66
|
+
For example, to allow a GitHub MCP server but block the `delete_branch` tool:
|
|
67
|
+
- Allowlist: `mcp__github` (allows all GitHub tools)
|
|
68
|
+
- Denylist: `mcp__github__delete_branch` (blocks this specific tool)
|
|
69
|
+
|
|
70
|
+
### Default behavior
|
|
71
|
+
|
|
72
|
+
When no permissions are configured for an agent:
|
|
73
|
+
- `Read` and `Write` are always available
|
|
74
|
+
- All tools from assigned MCP servers are available
|
|
75
|
+
- No additional Claude Code tools are available
|
|
76
|
+
|
|
77
|
+
## Permission mode
|
|
78
|
+
|
|
79
|
+
All SlackHive agents run with `permissionMode: 'acceptEdits'`. This means:
|
|
80
|
+
- File edits and tool use are automatically approved without prompting
|
|
81
|
+
- Claude does not need to ask for confirmation before running tools
|
|
82
|
+
- The only control is through the allowlist/denylist
|
|
83
|
+
|
|
84
|
+
This is appropriate for the Slack context where agents are expected to act autonomously.
|
|
85
|
+
|
|
86
|
+
## MCP server tool prefixes
|
|
87
|
+
|
|
88
|
+
When you assign an MCP server to an agent, its tool prefix (`mcp__{serverName}`) is automatically added to the allowlist. Removing the server from the agent removes the prefix from the allowlist.
|
|
89
|
+
|
|
90
|
+
If you want to assign an MCP server but only allow specific tools from it:
|
|
91
|
+
1. Assign the server (adds `mcp__{serverName}` prefix)
|
|
92
|
+
2. Add the specific tools you want to the allowlist directly (e.g. `mcp__redshift__query`)
|
|
93
|
+
3. Add `mcp__{serverName}` to the denylist to remove the broad prefix
|
|
94
|
+
|
|
95
|
+
Or equivalently, don't assign the server via the UI but manually add the specific tool names to the allowlist.
|
|
96
|
+
|
|
97
|
+
## Best practices
|
|
98
|
+
|
|
99
|
+
- **Keep allowlists minimal**: Only add tools the agent actually needs for its role
|
|
100
|
+
- **Boss agents need no tools**: Boss agents should not have MCP servers or extra tools — they delegate rather than act
|
|
101
|
+
- **Use `Bash` carefully**: Shell access is powerful; only add it to agents where it's necessary
|
|
102
|
+
- **Use denylist for destructive tools**: If an MCP server has delete/destroy tools you don't want the agent to use, add them to the denylist
|
|
103
|
+
- **`Write` is required for memory**: Never add `Write` to the denylist — it breaks the memory system
|