slackhive 0.1.37 → 0.1.38
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +19 -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
package/CONTRIBUTING.md
ADDED
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
# Contributing to SlackHive
|
|
2
|
+
|
|
3
|
+
Thank you for your interest in contributing to SlackHive! This document covers everything you need to get started. For a general introduction to contributing on GitHub, see the [GitHub contributing guide](https://docs.github.com/en/get-started/exploring-projects-on-github/contributing-to-a-project).
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Table of Contents
|
|
8
|
+
|
|
9
|
+
- [Prerequisites](#prerequisites)
|
|
10
|
+
- [Local Development Setup](#local-development-setup)
|
|
11
|
+
- [Repository Structure](#repository-structure)
|
|
12
|
+
- [Branch Naming](#branch-naming)
|
|
13
|
+
- [Commit Style](#commit-style)
|
|
14
|
+
- [Pull Request Process](#pull-request-process)
|
|
15
|
+
- [Code Standards](#code-standards)
|
|
16
|
+
- [Reporting Bugs and Requesting Features](#reporting-bugs-and-requesting-features)
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Prerequisites
|
|
21
|
+
|
|
22
|
+
Before you begin, ensure the following tools are installed:
|
|
23
|
+
|
|
24
|
+
| Tool | Minimum Version | Notes |
|
|
25
|
+
|------|----------------|-------|
|
|
26
|
+
| [Docker](https://docs.docker.com/get-docker/) | 24+ | Required for running Postgres, Redis, and the full stack |
|
|
27
|
+
| [Docker Compose](https://docs.docker.com/compose/install/) | v2.20+ | Bundled with Docker Desktop |
|
|
28
|
+
| [Node.js](https://nodejs.org/) | 20+ | Used for running apps locally outside Docker |
|
|
29
|
+
| [git](https://git-scm.com/) | 2.38+ | |
|
|
30
|
+
|
|
31
|
+
> **Note:** Never run `npm`/`node` directly on your host machine for production-style testing — always use Docker or `docker compose` for infrastructure services (Postgres, Redis).
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Local Development Setup
|
|
36
|
+
|
|
37
|
+
### 1. Fork and clone the repository
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
# Fork via GitHub UI, then clone your fork
|
|
41
|
+
git clone https://github.com/<your-username>/slackhive.git
|
|
42
|
+
cd slackhive
|
|
43
|
+
|
|
44
|
+
# Add the upstream remote
|
|
45
|
+
git remote add upstream https://github.com/pelago-labs/slackhive.git
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### 2. Set up environment variables
|
|
49
|
+
|
|
50
|
+
Each app has its own `.env` file. Start from the provided examples:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
cp apps/web/.env.example apps/web/.env
|
|
54
|
+
cp apps/runner/.env.example apps/runner/.env
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Edit each `.env` with your Slack app credentials, Anthropic API key, and other required values. Refer to the `README.md` for a description of each variable.
|
|
58
|
+
|
|
59
|
+
### 3. Start infrastructure services
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
docker compose up postgres redis -d
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
This starts Postgres and Redis in the background. They will be available on their default ports.
|
|
66
|
+
|
|
67
|
+
### 4. Install dependencies
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
npm install
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
This installs dependencies for all workspaces (`apps/web`, `apps/runner`, `packages/shared`, `cli`) via npm workspaces.
|
|
74
|
+
|
|
75
|
+
### 5. Build the shared package
|
|
76
|
+
|
|
77
|
+
The shared package must be built before dependent apps can start:
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
npm run build --workspace=packages/shared
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### 6. Run database migrations
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
# Inside the web app
|
|
87
|
+
cd apps/web && npx prisma migrate dev
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### 7. Start the development servers
|
|
91
|
+
|
|
92
|
+
Open separate terminals for each app:
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
# Terminal 1 — Next.js web app
|
|
96
|
+
cd apps/web && npm run dev
|
|
97
|
+
|
|
98
|
+
# Terminal 2 — Node runner
|
|
99
|
+
cd apps/runner && npm run dev
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
The web app is available at [http://localhost:3000](http://localhost:3000) by default.
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## Repository Structure
|
|
107
|
+
|
|
108
|
+
```
|
|
109
|
+
slackhive/
|
|
110
|
+
├── apps/
|
|
111
|
+
│ ├── web/ # Next.js web application (dashboard, API routes)
|
|
112
|
+
│ └── runner/ # Node.js agent runner
|
|
113
|
+
├── packages/
|
|
114
|
+
│ └── shared/ # Shared TypeScript types and utilities
|
|
115
|
+
├── cli/ # SlackHive CLI tool
|
|
116
|
+
├── scripts/ # Development helper scripts
|
|
117
|
+
└── docker-compose.yml
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## Branch Naming
|
|
123
|
+
|
|
124
|
+
Use the following prefixes for all branches, branched from `main`:
|
|
125
|
+
|
|
126
|
+
| Prefix | Use for |
|
|
127
|
+
|--------|---------|
|
|
128
|
+
| `feat/` | New features (e.g., `feat/agent-memory-viewer`) |
|
|
129
|
+
| `fix/` | Bug fixes (e.g., `fix/slack-oauth-redirect`) |
|
|
130
|
+
| `chore/` | Maintenance, deps, tooling (e.g., `chore/update-prisma`) |
|
|
131
|
+
| `docs/` | Documentation only (e.g., `docs/setup-guide`) |
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## Commit Style
|
|
136
|
+
|
|
137
|
+
SlackHive uses [Conventional Commits](https://www.conventionalcommits.org/). Each commit message must follow this format:
|
|
138
|
+
|
|
139
|
+
```
|
|
140
|
+
<type>(<optional scope>): <short description>
|
|
141
|
+
|
|
142
|
+
[optional body]
|
|
143
|
+
|
|
144
|
+
[optional footer]
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
**Types:**
|
|
148
|
+
|
|
149
|
+
| Type | Description |
|
|
150
|
+
|------|-------------|
|
|
151
|
+
| `feat` | A new feature |
|
|
152
|
+
| `fix` | A bug fix |
|
|
153
|
+
| `chore` | Build process, tooling, or dependency updates |
|
|
154
|
+
| `docs` | Documentation changes only |
|
|
155
|
+
| `refactor` | Code change that is neither a fix nor a feature |
|
|
156
|
+
| `test` | Adding or updating tests |
|
|
157
|
+
| `perf` | Performance improvements |
|
|
158
|
+
| `ci` | CI configuration changes |
|
|
159
|
+
|
|
160
|
+
**Examples:**
|
|
161
|
+
|
|
162
|
+
```
|
|
163
|
+
feat(web): add per-agent write access control toggle
|
|
164
|
+
fix(runner): resolve race condition in job scheduler
|
|
165
|
+
chore: upgrade Prisma to 5.14
|
|
166
|
+
docs: add CONTRIBUTING guide
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
Keep the subject line under 72 characters and use the imperative mood ("add", not "added" or "adds").
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
## Pull Request Process
|
|
174
|
+
|
|
175
|
+
1. **Fork** the repository and create your branch from `main`.
|
|
176
|
+
2. **Implement** your changes following the code standards below.
|
|
177
|
+
3. **Test** your changes locally with `docker compose up postgres redis -d` and the dev servers running.
|
|
178
|
+
4. **Push** your branch to your fork.
|
|
179
|
+
5. **Open a PR** against the `main` branch of `pelago-labs/slackhive`.
|
|
180
|
+
6. Fill in the **PR template** completely, including screenshots for any UI changes.
|
|
181
|
+
7. Address any review feedback.
|
|
182
|
+
|
|
183
|
+
PRs should be focused — one logical change per PR. Large refactors should be discussed in a GitHub Discussion or Issue first.
|
|
184
|
+
|
|
185
|
+
**Merging:** Maintainers merge PRs using squash-and-merge to keep the commit history clean.
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
## Code Standards
|
|
190
|
+
|
|
191
|
+
- **TypeScript** — all code must be fully typed; avoid `any` unless strictly necessary.
|
|
192
|
+
- **Docstrings** — use [TSDoc](https://tsdoc.org/) / JSDoc-style comments for all exported functions, classes, and types (Google-style param/return descriptions).
|
|
193
|
+
- **Formatting** — the project uses ESLint and Prettier. Run `npm run lint` in the relevant workspace before submitting.
|
|
194
|
+
- **No secrets** — never commit API keys, tokens, or credentials. Use `.env` files (already `.gitignore`d).
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## Reporting Bugs and Requesting Features
|
|
199
|
+
|
|
200
|
+
- **Bugs:** Open a [bug report issue](https://github.com/pelago-labs/slackhive/issues/new?template=bug_report.yml).
|
|
201
|
+
- **Features:** Open a [feature request issue](https://github.com/pelago-labs/slackhive/issues/new?template=feature_request.yml).
|
|
202
|
+
- **Questions / discussions:** Use [GitHub Discussions](https://github.com/pelago-labs/slackhive/discussions).
|
|
203
|
+
|
|
204
|
+
Please do **not** use public issues to report security vulnerabilities. See [SECURITY.md](SECURITY.md) for the responsible disclosure process.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Pelago Labs
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -152,6 +152,7 @@ Every agent is a full **Claude Code** agent — with tools, memory, identity, an
|
|
|
152
152
|
| 🚦 **Channel Restrictions** | Lock agents to specific Slack channels. Bot auto-leaves uninvited channels with a notice. |
|
|
153
153
|
| 📊 **Live Logs** | SSE-streamed log output per agent — with level filters and search. |
|
|
154
154
|
| 🧠 **Memory Viewer** | Browse, inspect, and delete agent memories by type — feedback, user, project, reference. |
|
|
155
|
+
| 🌐 **Multi-Workspace** | Connect multiple Slack workspaces to a single SlackHive instance. Each workspace gets its own agents and configurations. |
|
|
155
156
|
|
|
156
157
|
---
|
|
157
158
|
|
|
@@ -199,6 +200,24 @@ ANTHROPIC_API_KEY=sk-ant-api03-...
|
|
|
199
200
|
Billed per token via the Anthropic API. Best for teams and production.
|
|
200
201
|
|
|
201
202
|
**Option B — Claude Pro or Max Subscription**
|
|
203
|
+
|
|
204
|
+
First, install Claude Code on your host machine:
|
|
205
|
+
|
|
206
|
+
> **Note:** Do not install via `npm` — the npm package is deprecated and incompatible with SlackHive.
|
|
207
|
+
|
|
208
|
+
MacOS/Linux (Recommended):
|
|
209
|
+
```bash
|
|
210
|
+
curl -fsSL https://claude.ai/install.sh | bash
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
Homebrew (macOS/Linux):
|
|
214
|
+
```bash
|
|
215
|
+
brew install --cask claude-code
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
For more installation options, uninstall steps, and troubleshooting, see the [setup documentation](https://docs.anthropic.com/en/docs/claude-code/setup).
|
|
219
|
+
|
|
220
|
+
Then log in:
|
|
202
221
|
```bash
|
|
203
222
|
claude login # run on host machine, saves credentials to ~/.claude/
|
|
204
223
|
```
|
package/SECURITY.md
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Security Policy
|
|
2
|
+
|
|
3
|
+
## Supported Versions
|
|
4
|
+
|
|
5
|
+
Only the latest release of SlackHive receives security fixes.
|
|
6
|
+
|
|
7
|
+
| Version | Supported |
|
|
8
|
+
|---------|-----------|
|
|
9
|
+
| 0.1.x (latest) | ✅ |
|
|
10
|
+
| < 0.1.x | ❌ |
|
|
11
|
+
|
|
12
|
+
## Reporting a Vulnerability
|
|
13
|
+
|
|
14
|
+
**Please do not report security vulnerabilities through public GitHub issues.**
|
|
15
|
+
|
|
16
|
+
Instead, use [GitHub's private security advisory feature](https://docs.github.com/en/code-security/security-advisories/guidance-on-reporting-and-writing/privately-reporting-a-security-vulnerability) to report vulnerabilities confidentially:
|
|
17
|
+
|
|
18
|
+
1. Go to the [Security tab](https://github.com/pelago-labs/slackhive/security/advisories/new) of this repository
|
|
19
|
+
2. Click **"Report a vulnerability"**
|
|
20
|
+
3. Fill in the details
|
|
21
|
+
|
|
22
|
+
Alternatively, email **conduct@slackhive.dev** with the subject line `[SECURITY] <brief description>`.
|
|
23
|
+
|
|
24
|
+
## Response Timeline
|
|
25
|
+
|
|
26
|
+
| Stage | Target |
|
|
27
|
+
|-------|--------|
|
|
28
|
+
| Acknowledgement | Within 48 hours |
|
|
29
|
+
| Initial assessment | Within 5 business days |
|
|
30
|
+
| Patch for critical issues | Within 14 days |
|
|
31
|
+
| Patch for moderate issues | Within 30 days |
|
|
32
|
+
|
|
33
|
+
## Scope
|
|
34
|
+
|
|
35
|
+
Issues we consider in-scope:
|
|
36
|
+
|
|
37
|
+
- Authentication bypass or session hijacking
|
|
38
|
+
- SQL injection or data exposure
|
|
39
|
+
- SSRF via MCP server configuration
|
|
40
|
+
- Privilege escalation between user roles
|
|
41
|
+
- Secrets leaked in logs or API responses
|
|
42
|
+
|
|
43
|
+
Out of scope:
|
|
44
|
+
|
|
45
|
+
- Vulnerabilities in third-party dependencies (report to upstream)
|
|
46
|
+
- Rate limiting / DoS on self-hosted instances
|
|
47
|
+
- Issues requiring physical access to the host
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
FROM node:20-alpine AS base
|
|
2
|
+
WORKDIR /app
|
|
3
|
+
RUN apk add --no-cache curl
|
|
4
|
+
|
|
5
|
+
# Install deps
|
|
6
|
+
FROM base AS deps
|
|
7
|
+
COPY package.json package-lock.json ./
|
|
8
|
+
COPY packages/shared/package.json ./packages/shared/
|
|
9
|
+
COPY apps/runner/package.json ./apps/runner/
|
|
10
|
+
RUN npm ci
|
|
11
|
+
|
|
12
|
+
# Build
|
|
13
|
+
FROM deps AS builder
|
|
14
|
+
COPY packages/shared ./packages/shared
|
|
15
|
+
COPY apps/runner ./apps/runner
|
|
16
|
+
RUN cd packages/shared && npx tsc --skipLibCheck || true
|
|
17
|
+
RUN cd apps/runner && npx tsc --skipLibCheck || true
|
|
18
|
+
|
|
19
|
+
# Runtime — lean image, no build tools
|
|
20
|
+
FROM node:20-alpine AS runner
|
|
21
|
+
ENV NODE_ENV=production
|
|
22
|
+
WORKDIR /app
|
|
23
|
+
# Install git, Python, pip and graphify for Bash-enabled agents
|
|
24
|
+
RUN apk add --no-cache bash git python3 py3-pip
|
|
25
|
+
COPY --from=builder /app/node_modules ./node_modules
|
|
26
|
+
# Create claude wrapper that uses the SDK's bundled CLI
|
|
27
|
+
RUN printf '#!/bin/sh\ncd /app/node_modules/@anthropic-ai/claude-agent-sdk && exec node cli.js "$@"\n' > /usr/local/bin/claude && \
|
|
28
|
+
chmod +x /usr/local/bin/claude
|
|
29
|
+
COPY --from=builder /app/packages/shared ./packages/shared
|
|
30
|
+
COPY --from=builder /app/apps/runner ./apps/runner
|
|
31
|
+
COPY --from=builder /app/package.json ./
|
|
32
|
+
|
|
33
|
+
CMD ["node", "apps/runner/dist/index.js"]
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview Unit tests for isChannelRestricted in slack-handler.ts.
|
|
4
|
+
*
|
|
5
|
+
* Pure function — no mocks needed.
|
|
6
|
+
*
|
|
7
|
+
* @module runner/__tests__/channel-restrictions.test
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
const vitest_1 = require("vitest");
|
|
11
|
+
const slack_handler_1 = require("../slack-handler");
|
|
12
|
+
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
13
|
+
function makeRestriction(allowedChannels) {
|
|
14
|
+
return {
|
|
15
|
+
id: 'r-001',
|
|
16
|
+
agentId: 'a-001',
|
|
17
|
+
allowedChannels,
|
|
18
|
+
updatedAt: new Date(),
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
// ─── isChannelRestricted ──────────────────────────────────────────────────────
|
|
22
|
+
(0, vitest_1.describe)('isChannelRestricted', () => {
|
|
23
|
+
(0, vitest_1.it)('returns false when restrictions is null', () => {
|
|
24
|
+
(0, vitest_1.expect)((0, slack_handler_1.isChannelRestricted)('C_ANY', null)).toBe(false);
|
|
25
|
+
});
|
|
26
|
+
(0, vitest_1.it)('returns false when allowedChannels is empty (unrestricted)', () => {
|
|
27
|
+
(0, vitest_1.expect)((0, slack_handler_1.isChannelRestricted)('C_ANY', makeRestriction([]))).toBe(false);
|
|
28
|
+
});
|
|
29
|
+
(0, vitest_1.it)('returns false when channel is in the allowedChannels list', () => {
|
|
30
|
+
const r = makeRestriction(['C_ALLOWED', 'C_OTHER']);
|
|
31
|
+
(0, vitest_1.expect)((0, slack_handler_1.isChannelRestricted)('C_ALLOWED', r)).toBe(false);
|
|
32
|
+
});
|
|
33
|
+
(0, vitest_1.it)('returns true when channel is NOT in the allowedChannels list', () => {
|
|
34
|
+
const r = makeRestriction(['C_ALLOWED']);
|
|
35
|
+
(0, vitest_1.expect)((0, slack_handler_1.isChannelRestricted)('C_BLOCKED', r)).toBe(true);
|
|
36
|
+
});
|
|
37
|
+
(0, vitest_1.it)('returns true for a DM channel not in the allowedChannels list', () => {
|
|
38
|
+
const r = makeRestriction(['C_ALLOWED']);
|
|
39
|
+
(0, vitest_1.expect)((0, slack_handler_1.isChannelRestricted)('D_DM_CHANNEL', r)).toBe(true);
|
|
40
|
+
});
|
|
41
|
+
(0, vitest_1.it)('returns false for a DM channel that is explicitly in the allowedChannels list', () => {
|
|
42
|
+
const r = makeRestriction(['D_DM_CHANNEL', 'C_ALLOWED']);
|
|
43
|
+
(0, vitest_1.expect)((0, slack_handler_1.isChannelRestricted)('D_DM_CHANNEL', r)).toBe(false);
|
|
44
|
+
});
|
|
45
|
+
(0, vitest_1.it)('is case-sensitive — does not match wrong case', () => {
|
|
46
|
+
const r = makeRestriction(['C_abc123']);
|
|
47
|
+
(0, vitest_1.expect)((0, slack_handler_1.isChannelRestricted)('C_ABC123', r)).toBe(true);
|
|
48
|
+
});
|
|
49
|
+
(0, vitest_1.it)('handles a single-channel allowlist correctly — allowed', () => {
|
|
50
|
+
const r = makeRestriction(['C_ONLY']);
|
|
51
|
+
(0, vitest_1.expect)((0, slack_handler_1.isChannelRestricted)('C_ONLY', r)).toBe(false);
|
|
52
|
+
});
|
|
53
|
+
(0, vitest_1.it)('handles a single-channel allowlist correctly — blocked', () => {
|
|
54
|
+
const r = makeRestriction(['C_ONLY']);
|
|
55
|
+
(0, vitest_1.expect)((0, slack_handler_1.isChannelRestricted)('C_OTHER', r)).toBe(true);
|
|
56
|
+
});
|
|
57
|
+
(0, vitest_1.it)('returns false when allowedChannels has many entries and channel matches one', () => {
|
|
58
|
+
const channels = ['C_1', 'C_2', 'C_3', 'C_4', 'C_5'];
|
|
59
|
+
const r = makeRestriction(channels);
|
|
60
|
+
(0, vitest_1.expect)((0, slack_handler_1.isChannelRestricted)('C_3', r)).toBe(false);
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
//# sourceMappingURL=channel-restrictions.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel-restrictions.test.js","sourceRoot":"","sources":["../../src/__tests__/channel-restrictions.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Unit tests for ClaudeHandler.resolveServerConfig and resolveEnvRefs.
|
|
3
|
+
*
|
|
4
|
+
* Tests cover:
|
|
5
|
+
* - envRefs resolution: subprocess env var is set from the env vars store value
|
|
6
|
+
* - envRefs missing key: warning logged, key omitted
|
|
7
|
+
* - Inline env + envRefs merged: both contribute to the resolved env object
|
|
8
|
+
* - envRefs stripped from the returned config (SDK doesn't understand it)
|
|
9
|
+
* - tsSource: source written to disk, config rewritten to use tsx
|
|
10
|
+
* - Plain stdio config without envRefs returned unchanged
|
|
11
|
+
*
|
|
12
|
+
* ClaudeHandler is instantiated with a minimal Agent and no MCP servers so the
|
|
13
|
+
* constructor side-effects (port hashing, McpProcessManager) are contained.
|
|
14
|
+
* The private methods are accessed via `(handler as any)` to avoid exposing them.
|
|
15
|
+
*
|
|
16
|
+
* No database, no Slack, no filesystem writes for the non-tsSource tests.
|
|
17
|
+
*
|
|
18
|
+
* @module runner/__tests__/claude-handler-resolve.test
|
|
19
|
+
*/
|
|
20
|
+
export {};
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview Unit tests for ClaudeHandler.resolveServerConfig and resolveEnvRefs.
|
|
4
|
+
*
|
|
5
|
+
* Tests cover:
|
|
6
|
+
* - envRefs resolution: subprocess env var is set from the env vars store value
|
|
7
|
+
* - envRefs missing key: warning logged, key omitted
|
|
8
|
+
* - Inline env + envRefs merged: both contribute to the resolved env object
|
|
9
|
+
* - envRefs stripped from the returned config (SDK doesn't understand it)
|
|
10
|
+
* - tsSource: source written to disk, config rewritten to use tsx
|
|
11
|
+
* - Plain stdio config without envRefs returned unchanged
|
|
12
|
+
*
|
|
13
|
+
* ClaudeHandler is instantiated with a minimal Agent and no MCP servers so the
|
|
14
|
+
* constructor side-effects (port hashing, McpProcessManager) are contained.
|
|
15
|
+
* The private methods are accessed via `(handler as any)` to avoid exposing them.
|
|
16
|
+
*
|
|
17
|
+
* No database, no Slack, no filesystem writes for the non-tsSource tests.
|
|
18
|
+
*
|
|
19
|
+
* @module runner/__tests__/claude-handler-resolve.test
|
|
20
|
+
*/
|
|
21
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
22
|
+
if (k2 === undefined) k2 = k;
|
|
23
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
24
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
25
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
26
|
+
}
|
|
27
|
+
Object.defineProperty(o, k2, desc);
|
|
28
|
+
}) : (function(o, m, k, k2) {
|
|
29
|
+
if (k2 === undefined) k2 = k;
|
|
30
|
+
o[k2] = m[k];
|
|
31
|
+
}));
|
|
32
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
33
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
34
|
+
}) : function(o, v) {
|
|
35
|
+
o["default"] = v;
|
|
36
|
+
});
|
|
37
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
38
|
+
var ownKeys = function(o) {
|
|
39
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
40
|
+
var ar = [];
|
|
41
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
42
|
+
return ar;
|
|
43
|
+
};
|
|
44
|
+
return ownKeys(o);
|
|
45
|
+
};
|
|
46
|
+
return function (mod) {
|
|
47
|
+
if (mod && mod.__esModule) return mod;
|
|
48
|
+
var result = {};
|
|
49
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
50
|
+
__setModuleDefault(result, mod);
|
|
51
|
+
return result;
|
|
52
|
+
};
|
|
53
|
+
})();
|
|
54
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
55
|
+
const fs = __importStar(require("fs"));
|
|
56
|
+
const path = __importStar(require("path"));
|
|
57
|
+
const os = __importStar(require("os"));
|
|
58
|
+
const vitest_1 = require("vitest");
|
|
59
|
+
const claude_handler_js_1 = require("../claude-handler.js");
|
|
60
|
+
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
61
|
+
function makeAgent(overrides = {}) {
|
|
62
|
+
return {
|
|
63
|
+
id: 'agent-1',
|
|
64
|
+
name: 'Test Agent',
|
|
65
|
+
slug: 'test-agent',
|
|
66
|
+
description: '',
|
|
67
|
+
slackBotToken: 'xoxb-test',
|
|
68
|
+
slackAppToken: 'xapp-test',
|
|
69
|
+
slackSigningSecret: 'secret',
|
|
70
|
+
model: 'claude-opus-4-6',
|
|
71
|
+
status: 'stopped',
|
|
72
|
+
enabled: true,
|
|
73
|
+
isBoss: false,
|
|
74
|
+
reportsTo: [],
|
|
75
|
+
claudeMd: '',
|
|
76
|
+
createdBy: 'system',
|
|
77
|
+
createdAt: new Date(),
|
|
78
|
+
updatedAt: new Date(),
|
|
79
|
+
...overrides,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
function makeHandler(envVarValues = {}, workDir = '/tmp/test-handler') {
|
|
83
|
+
return new claude_handler_js_1.ClaudeHandler(makeAgent(), [], null, workDir, envVarValues);
|
|
84
|
+
}
|
|
85
|
+
// ─── resolveServerConfig — envRefs ───────────────────────────────────────────
|
|
86
|
+
(0, vitest_1.describe)('resolveServerConfig — envRefs resolution', () => {
|
|
87
|
+
(0, vitest_1.it)('resolves an envRef to the store value', () => {
|
|
88
|
+
const handler = makeHandler({ REDSHIFT_DATABASE_URL: 'postgres://host/db' });
|
|
89
|
+
const config = {
|
|
90
|
+
command: 'node',
|
|
91
|
+
args: ['server.js'],
|
|
92
|
+
envRefs: { DATABASE_URL: 'REDSHIFT_DATABASE_URL' },
|
|
93
|
+
};
|
|
94
|
+
const result = handler.resolveServerConfig('my-mcp', config);
|
|
95
|
+
const env = result.env;
|
|
96
|
+
(0, vitest_1.expect)(env.DATABASE_URL).toBe('postgres://host/db');
|
|
97
|
+
});
|
|
98
|
+
(0, vitest_1.it)('strips envRefs from the resolved config', () => {
|
|
99
|
+
const handler = makeHandler({ MY_KEY: 'my-value' });
|
|
100
|
+
const config = { command: 'node', args: [], envRefs: { ENV_KEY: 'MY_KEY' } };
|
|
101
|
+
const result = handler.resolveServerConfig('srv', config);
|
|
102
|
+
(0, vitest_1.expect)(result.envRefs).toBeUndefined();
|
|
103
|
+
});
|
|
104
|
+
(0, vitest_1.it)('merges inline env with resolved envRefs', () => {
|
|
105
|
+
const handler = makeHandler({ STORE_KEY: 'store-value' });
|
|
106
|
+
const config = {
|
|
107
|
+
command: 'node',
|
|
108
|
+
args: [],
|
|
109
|
+
env: { INLINE_VAR: 'inline-value' },
|
|
110
|
+
envRefs: { REF_VAR: 'STORE_KEY' },
|
|
111
|
+
};
|
|
112
|
+
const result = handler.resolveServerConfig('srv', config);
|
|
113
|
+
const env = result.env;
|
|
114
|
+
(0, vitest_1.expect)(env.INLINE_VAR).toBe('inline-value');
|
|
115
|
+
(0, vitest_1.expect)(env.REF_VAR).toBe('store-value');
|
|
116
|
+
});
|
|
117
|
+
(0, vitest_1.it)('omits the key when the store entry does not exist', () => {
|
|
118
|
+
const handler = makeHandler({}); // empty store
|
|
119
|
+
const config = { command: 'node', args: [], envRefs: { MISSING: 'NOT_IN_STORE' } };
|
|
120
|
+
const result = handler.resolveServerConfig('srv', config);
|
|
121
|
+
const env = (result.env ?? {});
|
|
122
|
+
(0, vitest_1.expect)('MISSING' in env).toBe(false);
|
|
123
|
+
});
|
|
124
|
+
(0, vitest_1.it)('returns config unchanged when envRefs is absent', () => {
|
|
125
|
+
const handler = makeHandler({ KEY: 'val' });
|
|
126
|
+
const config = { command: 'node', args: ['s.js'], env: { LOCAL: 'x' } };
|
|
127
|
+
const result = handler.resolveServerConfig('srv', config);
|
|
128
|
+
(0, vitest_1.expect)(result).toEqual(config);
|
|
129
|
+
});
|
|
130
|
+
(0, vitest_1.it)('returns config unchanged when envRefs is an empty object', () => {
|
|
131
|
+
const handler = makeHandler({ KEY: 'val' });
|
|
132
|
+
const config = { command: 'node', args: [], envRefs: {} };
|
|
133
|
+
const result = handler.resolveServerConfig('srv', config);
|
|
134
|
+
(0, vitest_1.expect)(result).toEqual(config);
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
// ─── resolveServerConfig — tsSource ──────────────────────────────────────────
|
|
138
|
+
(0, vitest_1.describe)('resolveServerConfig — tsSource rewrites to tsx', () => {
|
|
139
|
+
let tmpDir;
|
|
140
|
+
(0, vitest_1.afterEach)(() => {
|
|
141
|
+
if (tmpDir && fs.existsSync(tmpDir)) {
|
|
142
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
(0, vitest_1.it)('writes tsSource to disk and sets command to tsx', () => {
|
|
146
|
+
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'claude-handler-test-'));
|
|
147
|
+
const handler = makeHandler({}, tmpDir);
|
|
148
|
+
const src = 'console.log("hello from ts mcp");';
|
|
149
|
+
const config = { command: 'ignored', args: [], tsSource: src };
|
|
150
|
+
const result = handler.resolveServerConfig('my-ts-mcp', config);
|
|
151
|
+
(0, vitest_1.expect)(result.command).toBe('/app/node_modules/.bin/tsx');
|
|
152
|
+
(0, vitest_1.expect)(Array.isArray(result.args)).toBe(true);
|
|
153
|
+
const scriptPath = result.args[0];
|
|
154
|
+
(0, vitest_1.expect)(scriptPath).toContain('my-ts-mcp.ts');
|
|
155
|
+
(0, vitest_1.expect)(fs.readFileSync(scriptPath, 'utf8')).toBe(src);
|
|
156
|
+
});
|
|
157
|
+
(0, vitest_1.it)('strips tsSource from the resolved config', () => {
|
|
158
|
+
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'claude-handler-test-'));
|
|
159
|
+
const handler = makeHandler({}, tmpDir);
|
|
160
|
+
const config = { command: 'ignored', args: [], tsSource: '// source' };
|
|
161
|
+
const result = handler.resolveServerConfig('srv', config);
|
|
162
|
+
(0, vitest_1.expect)(result.tsSource).toBeUndefined();
|
|
163
|
+
});
|
|
164
|
+
(0, vitest_1.it)('merges envRefs when tsSource is present', () => {
|
|
165
|
+
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'claude-handler-test-'));
|
|
166
|
+
const handler = makeHandler({ DB_URL: 'postgres://host/db' }, tmpDir);
|
|
167
|
+
const config = {
|
|
168
|
+
command: 'ignored',
|
|
169
|
+
args: [],
|
|
170
|
+
tsSource: '// source',
|
|
171
|
+
envRefs: { DATABASE_URL: 'DB_URL' },
|
|
172
|
+
};
|
|
173
|
+
const result = handler.resolveServerConfig('srv', config);
|
|
174
|
+
const env = result.env;
|
|
175
|
+
(0, vitest_1.expect)(env.DATABASE_URL).toBe('postgres://host/db');
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
//# sourceMappingURL=claude-handler-resolve.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-handler-resolve.test.js","sourceRoot":"","sources":["../../src/__tests__/claude-handler-resolve.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Unit tests for compile-claude-md helpers.
|
|
3
|
+
*
|
|
4
|
+
* Tests cover:
|
|
5
|
+
* - CLAUDE.md contains proactive /recall instruction
|
|
6
|
+
* - CLAUDE.md contains pattern-based memory-save guidance
|
|
7
|
+
* - CLAUDE.md does NOT contain the old "Only save when user explicitly guides" wording
|
|
8
|
+
* - materializeMemoryFiles writes MEMORY.md index + individual files
|
|
9
|
+
* - sanitizeFilename is not exported but indirectly tested via materializeMemoryFiles
|
|
10
|
+
*
|
|
11
|
+
* @module runner/__tests__/compile-claude-md.test
|
|
12
|
+
*/
|
|
13
|
+
export {};
|