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 @@
|
|
|
1
|
+
{"version":3,"file":"thread-context.test.js","sourceRoot":"","sources":["../../src/__tests__/thread-context.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Agent runner — manages the lifecycle of all Slack bot instances.
|
|
3
|
+
*
|
|
4
|
+
* The AgentRunner is the top-level orchestrator for the runner service.
|
|
5
|
+
* On startup it loads all active agents from the database, starts a Slack
|
|
6
|
+
* Bolt App for each one, and listens on Redis for reload signals from the
|
|
7
|
+
* web UI.
|
|
8
|
+
*
|
|
9
|
+
* Each agent gets:
|
|
10
|
+
* - Its own Bolt App instance (separate Slack socket connection)
|
|
11
|
+
* - Its own ClaudeHandler (session manager, MCP wiring, tool permissions)
|
|
12
|
+
* - Its own MemoryWatcher (syncs learned memories to the database)
|
|
13
|
+
* - A compiled CLAUDE.md in /tmp/agents/{slug}/ (skills + memories)
|
|
14
|
+
*
|
|
15
|
+
* Hot reload flow:
|
|
16
|
+
* 1. User edits skills/MCPs/permissions in the web UI
|
|
17
|
+
* 2. Web API publishes `{ type: 'reload', agentId }` to Redis channel
|
|
18
|
+
* 3. AgentRunner receives the event, stops the agent, recompiles, restarts
|
|
19
|
+
*
|
|
20
|
+
* @module runner/agent-runner
|
|
21
|
+
*/
|
|
22
|
+
import { App } from '@slack/bolt';
|
|
23
|
+
/**
|
|
24
|
+
* Manages the lifecycle of all Claude Code Slack bot instances.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* const runner = new AgentRunner();
|
|
28
|
+
* await runner.start();
|
|
29
|
+
* // Ctrl+C triggers graceful shutdown
|
|
30
|
+
*/
|
|
31
|
+
export declare class AgentRunner {
|
|
32
|
+
/** Map of agent ID → running agent resources. */
|
|
33
|
+
private runningAgents;
|
|
34
|
+
/** Scheduled job executor. */
|
|
35
|
+
private jobScheduler;
|
|
36
|
+
/** Redis subscriber client for hot-reload events. */
|
|
37
|
+
private redisSubscriber;
|
|
38
|
+
constructor();
|
|
39
|
+
/**
|
|
40
|
+
* Returns any running agent by ID, or undefined if not running.
|
|
41
|
+
*/
|
|
42
|
+
getRunningAgent(agentId: string): {
|
|
43
|
+
app: App;
|
|
44
|
+
claudeHandler: import('./claude-handler').ClaudeHandler;
|
|
45
|
+
} | undefined;
|
|
46
|
+
/**
|
|
47
|
+
* Starts the runner:
|
|
48
|
+
* 1. Connects to Redis for hot-reload events
|
|
49
|
+
* 2. Loads and starts all active agents from the database
|
|
50
|
+
* 3. Registers graceful shutdown handlers
|
|
51
|
+
*
|
|
52
|
+
* @returns {Promise<void>}
|
|
53
|
+
* @throws {Error} If Redis connection fails.
|
|
54
|
+
*/
|
|
55
|
+
start(): Promise<void>;
|
|
56
|
+
/**
|
|
57
|
+
* Gracefully stops all running agents and disconnects from Redis.
|
|
58
|
+
*
|
|
59
|
+
* @returns {Promise<void>}
|
|
60
|
+
*/
|
|
61
|
+
stop(): Promise<void>;
|
|
62
|
+
/**
|
|
63
|
+
* Loads all agents from the database and starts each one.
|
|
64
|
+
*
|
|
65
|
+
* @returns {Promise<void>}
|
|
66
|
+
*/
|
|
67
|
+
private loadAllAgents;
|
|
68
|
+
/**
|
|
69
|
+
* Starts a single agent:
|
|
70
|
+
* 1. Loads its MCP servers and permissions from the database
|
|
71
|
+
* 2. Compiles CLAUDE.md from skills + memories
|
|
72
|
+
* 3. Materializes memory files to disk
|
|
73
|
+
* 4. Creates Bolt App + ClaudeHandler + MemoryWatcher
|
|
74
|
+
* 5. Registers Slack event handlers
|
|
75
|
+
* 6. Starts the Bolt App (opens Socket Mode connection)
|
|
76
|
+
*
|
|
77
|
+
* @param {Agent} agent - The agent to start.
|
|
78
|
+
* @returns {Promise<void>}
|
|
79
|
+
* @throws {Error} If Slack App fails to start.
|
|
80
|
+
*/
|
|
81
|
+
private startAgent;
|
|
82
|
+
/**
|
|
83
|
+
* Stops a running agent and cleans up all its resources.
|
|
84
|
+
*
|
|
85
|
+
* @param {string} agentId - UUID of the agent to stop.
|
|
86
|
+
* @returns {Promise<void>}
|
|
87
|
+
*/
|
|
88
|
+
private stopAgent;
|
|
89
|
+
/**
|
|
90
|
+
* Reloads an agent: stops it, re-fetches its config, recompiles, and restarts.
|
|
91
|
+
* Called when the web UI publishes a reload event.
|
|
92
|
+
*
|
|
93
|
+
* @param {string} agentId - UUID of the agent to reload.
|
|
94
|
+
* @returns {Promise<void>}
|
|
95
|
+
*/
|
|
96
|
+
private reloadAgent;
|
|
97
|
+
/**
|
|
98
|
+
* Connects to Redis and subscribes to agent lifecycle events.
|
|
99
|
+
*
|
|
100
|
+
* @returns {Promise<void>}
|
|
101
|
+
* @throws {Error} If REDIS_URL is not set or connection fails.
|
|
102
|
+
*/
|
|
103
|
+
private connectRedis;
|
|
104
|
+
/**
|
|
105
|
+
* Handles an agent lifecycle event received from Redis.
|
|
106
|
+
*
|
|
107
|
+
* @param {string} rawMessage - JSON-encoded AgentEvent.
|
|
108
|
+
* @returns {void}
|
|
109
|
+
*/
|
|
110
|
+
private handleAgentEvent;
|
|
111
|
+
/**
|
|
112
|
+
* Registers SIGTERM and SIGINT handlers for graceful shutdown.
|
|
113
|
+
* Ensures all agents are cleanly stopped before the process exits.
|
|
114
|
+
*
|
|
115
|
+
* @returns {void}
|
|
116
|
+
*/
|
|
117
|
+
private registerShutdownHandlers;
|
|
118
|
+
}
|
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview Agent runner — manages the lifecycle of all Slack bot instances.
|
|
4
|
+
*
|
|
5
|
+
* The AgentRunner is the top-level orchestrator for the runner service.
|
|
6
|
+
* On startup it loads all active agents from the database, starts a Slack
|
|
7
|
+
* Bolt App for each one, and listens on Redis for reload signals from the
|
|
8
|
+
* web UI.
|
|
9
|
+
*
|
|
10
|
+
* Each agent gets:
|
|
11
|
+
* - Its own Bolt App instance (separate Slack socket connection)
|
|
12
|
+
* - Its own ClaudeHandler (session manager, MCP wiring, tool permissions)
|
|
13
|
+
* - Its own MemoryWatcher (syncs learned memories to the database)
|
|
14
|
+
* - A compiled CLAUDE.md in /tmp/agents/{slug}/ (skills + memories)
|
|
15
|
+
*
|
|
16
|
+
* Hot reload flow:
|
|
17
|
+
* 1. User edits skills/MCPs/permissions in the web UI
|
|
18
|
+
* 2. Web API publishes `{ type: 'reload', agentId }` to Redis channel
|
|
19
|
+
* 3. AgentRunner receives the event, stops the agent, recompiles, restarts
|
|
20
|
+
*
|
|
21
|
+
* @module runner/agent-runner
|
|
22
|
+
*/
|
|
23
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
24
|
+
if (k2 === undefined) k2 = k;
|
|
25
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
26
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
27
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
28
|
+
}
|
|
29
|
+
Object.defineProperty(o, k2, desc);
|
|
30
|
+
}) : (function(o, m, k, k2) {
|
|
31
|
+
if (k2 === undefined) k2 = k;
|
|
32
|
+
o[k2] = m[k];
|
|
33
|
+
}));
|
|
34
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
35
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
36
|
+
}) : function(o, v) {
|
|
37
|
+
o["default"] = v;
|
|
38
|
+
});
|
|
39
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
40
|
+
var ownKeys = function(o) {
|
|
41
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
42
|
+
var ar = [];
|
|
43
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
44
|
+
return ar;
|
|
45
|
+
};
|
|
46
|
+
return ownKeys(o);
|
|
47
|
+
};
|
|
48
|
+
return function (mod) {
|
|
49
|
+
if (mod && mod.__esModule) return mod;
|
|
50
|
+
var result = {};
|
|
51
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
52
|
+
__setModuleDefault(result, mod);
|
|
53
|
+
return result;
|
|
54
|
+
};
|
|
55
|
+
})();
|
|
56
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
57
|
+
exports.AgentRunner = void 0;
|
|
58
|
+
const bolt_1 = require("@slack/bolt");
|
|
59
|
+
const redis_1 = require("redis");
|
|
60
|
+
const shared_1 = require("@slackhive/shared");
|
|
61
|
+
const job_scheduler_1 = require("./job-scheduler");
|
|
62
|
+
const db_1 = require("./db");
|
|
63
|
+
const compile_claude_md_1 = require("./compile-claude-md");
|
|
64
|
+
const claude_handler_1 = require("./claude-handler");
|
|
65
|
+
const memory_watcher_1 = require("./memory-watcher");
|
|
66
|
+
const slack_handler_1 = require("./slack-handler");
|
|
67
|
+
const logger_1 = require("./logger");
|
|
68
|
+
/**
|
|
69
|
+
* Manages the lifecycle of all Claude Code Slack bot instances.
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* const runner = new AgentRunner();
|
|
73
|
+
* await runner.start();
|
|
74
|
+
* // Ctrl+C triggers graceful shutdown
|
|
75
|
+
*/
|
|
76
|
+
class AgentRunner {
|
|
77
|
+
/** Map of agent ID → running agent resources. */
|
|
78
|
+
runningAgents = new Map();
|
|
79
|
+
/** Scheduled job executor. */
|
|
80
|
+
jobScheduler;
|
|
81
|
+
/** Redis subscriber client for hot-reload events. */
|
|
82
|
+
redisSubscriber = null;
|
|
83
|
+
constructor() {
|
|
84
|
+
this.jobScheduler = new job_scheduler_1.JobScheduler((agentId) => this.getRunningAgent(agentId));
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Returns any running agent by ID, or undefined if not running.
|
|
88
|
+
*/
|
|
89
|
+
getRunningAgent(agentId) {
|
|
90
|
+
const ra = this.runningAgents.get(agentId);
|
|
91
|
+
return ra ? { app: ra.app, claudeHandler: ra.claudeHandler } : undefined;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Starts the runner:
|
|
95
|
+
* 1. Connects to Redis for hot-reload events
|
|
96
|
+
* 2. Loads and starts all active agents from the database
|
|
97
|
+
* 3. Registers graceful shutdown handlers
|
|
98
|
+
*
|
|
99
|
+
* @returns {Promise<void>}
|
|
100
|
+
* @throws {Error} If Redis connection fails.
|
|
101
|
+
*/
|
|
102
|
+
async start() {
|
|
103
|
+
logger_1.logger.info('AgentRunner starting...');
|
|
104
|
+
await this.connectRedis();
|
|
105
|
+
await this.loadAllAgents();
|
|
106
|
+
await this.jobScheduler.start();
|
|
107
|
+
this.registerShutdownHandlers();
|
|
108
|
+
logger_1.logger.info('AgentRunner started', { agents: this.runningAgents.size });
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Gracefully stops all running agents and disconnects from Redis.
|
|
112
|
+
*
|
|
113
|
+
* @returns {Promise<void>}
|
|
114
|
+
*/
|
|
115
|
+
async stop() {
|
|
116
|
+
logger_1.logger.info('AgentRunner stopping...');
|
|
117
|
+
// Stop job scheduler
|
|
118
|
+
await this.jobScheduler.stop();
|
|
119
|
+
// Stop all agents concurrently
|
|
120
|
+
const stopPromises = Array.from(this.runningAgents.keys()).map((id) => this.stopAgent(id).catch((err) => logger_1.logger.warn('Error stopping agent during shutdown', { agentId: id, error: err.message })));
|
|
121
|
+
await Promise.all(stopPromises);
|
|
122
|
+
if (this.redisSubscriber) {
|
|
123
|
+
await this.redisSubscriber.unsubscribe();
|
|
124
|
+
await this.redisSubscriber.disconnect();
|
|
125
|
+
this.redisSubscriber = null;
|
|
126
|
+
}
|
|
127
|
+
logger_1.logger.info('AgentRunner stopped');
|
|
128
|
+
}
|
|
129
|
+
// ===========================================================================
|
|
130
|
+
// Agent lifecycle
|
|
131
|
+
// ===========================================================================
|
|
132
|
+
/**
|
|
133
|
+
* Loads all agents from the database and starts each one.
|
|
134
|
+
*
|
|
135
|
+
* @returns {Promise<void>}
|
|
136
|
+
*/
|
|
137
|
+
async loadAllAgents() {
|
|
138
|
+
const agents = await (0, db_1.getAllAgents)();
|
|
139
|
+
logger_1.logger.info('Loading agents from database', { count: agents.length });
|
|
140
|
+
// Start agents sequentially to avoid overwhelming Slack's rate limits.
|
|
141
|
+
// Skip agents that are stopped or have placeholder/missing tokens.
|
|
142
|
+
for (const agent of agents) {
|
|
143
|
+
if (agent.enabled === false) {
|
|
144
|
+
logger_1.logger.info('Skipping disabled agent', { agent: agent.slug });
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
if (!agent.slackBotToken.startsWith('xoxb-') ||
|
|
148
|
+
!agent.slackAppToken.startsWith('xapp-') ||
|
|
149
|
+
agent.slackBotToken.includes('placeholder') ||
|
|
150
|
+
agent.slackAppToken.includes('placeholder')) {
|
|
151
|
+
logger_1.logger.warn('Skipping agent with invalid/placeholder tokens', { agent: agent.slug });
|
|
152
|
+
await (0, db_1.updateAgentStatus)(agent.id, 'stopped');
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
try {
|
|
156
|
+
await this.startAgent(agent);
|
|
157
|
+
}
|
|
158
|
+
catch (err) {
|
|
159
|
+
logger_1.logger.error('Failed to start agent', { agent: agent.slug, error: err.message });
|
|
160
|
+
await (0, db_1.updateAgentStatus)(agent.id, 'error');
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Starts a single agent:
|
|
166
|
+
* 1. Loads its MCP servers and permissions from the database
|
|
167
|
+
* 2. Compiles CLAUDE.md from skills + memories
|
|
168
|
+
* 3. Materializes memory files to disk
|
|
169
|
+
* 4. Creates Bolt App + ClaudeHandler + MemoryWatcher
|
|
170
|
+
* 5. Registers Slack event handlers
|
|
171
|
+
* 6. Starts the Bolt App (opens Socket Mode connection)
|
|
172
|
+
*
|
|
173
|
+
* @param {Agent} agent - The agent to start.
|
|
174
|
+
* @returns {Promise<void>}
|
|
175
|
+
* @throws {Error} If Slack App fails to start.
|
|
176
|
+
*/
|
|
177
|
+
async startAgent(agent) {
|
|
178
|
+
if (this.runningAgents.has(agent.id)) {
|
|
179
|
+
logger_1.logger.warn('Agent already running, skipping start', { agent: agent.slug });
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
logger_1.logger.info('Starting agent', { agent: agent.slug });
|
|
183
|
+
// Load configuration from DB
|
|
184
|
+
const [mcpServers, permissions, restrictions, memories, envVarValues] = await Promise.all([
|
|
185
|
+
(0, db_1.getAgentMcpServers)(agent.id),
|
|
186
|
+
(0, db_1.getAgentPermissions)(agent.id),
|
|
187
|
+
(0, db_1.getAgentRestrictions)(agent.id),
|
|
188
|
+
(0, db_1.getAgentMemories)(agent.id),
|
|
189
|
+
(0, db_1.getAllEnvVarValues)(),
|
|
190
|
+
]);
|
|
191
|
+
// Compile CLAUDE.md (identity + skills → temp workspace)
|
|
192
|
+
const workDir = await (0, compile_claude_md_1.compileClaudeMd)(agent);
|
|
193
|
+
// Materialize memory files so the /recall skill can read them
|
|
194
|
+
(0, compile_claude_md_1.materializeMemoryFiles)(agent, memories);
|
|
195
|
+
// Create Claude Code SDK handler
|
|
196
|
+
const claudeHandler = new claude_handler_1.ClaudeHandler(agent, mcpServers, permissions, workDir, envVarValues);
|
|
197
|
+
claudeHandler.initialize();
|
|
198
|
+
// Create memory watcher (persists SDK memory writes back to DB)
|
|
199
|
+
const memoryWatcher = new memory_watcher_1.MemoryWatcher(agent);
|
|
200
|
+
memoryWatcher.start();
|
|
201
|
+
// Create Slack Bolt App in Socket Mode
|
|
202
|
+
const app = new bolt_1.App({
|
|
203
|
+
token: agent.slackBotToken,
|
|
204
|
+
appToken: agent.slackAppToken,
|
|
205
|
+
signingSecret: agent.slackSigningSecret,
|
|
206
|
+
socketMode: true,
|
|
207
|
+
logLevel: process.env.LOG_LEVEL === 'debug' ? bolt_1.LogLevel.DEBUG : bolt_1.LogLevel.WARN,
|
|
208
|
+
});
|
|
209
|
+
// Register all Slack event listeners
|
|
210
|
+
(0, slack_handler_1.registerSlackHandlers)(app, agent, claudeHandler, restrictions);
|
|
211
|
+
// Start the Bolt App
|
|
212
|
+
await app.start();
|
|
213
|
+
// Fetch and store the bot's Slack user ID for @mention construction
|
|
214
|
+
try {
|
|
215
|
+
const authResult = await app.client.auth.test({ token: agent.slackBotToken });
|
|
216
|
+
if (authResult.user_id && authResult.user_id !== agent.slackBotUserId) {
|
|
217
|
+
await (0, db_1.updateAgentStatus)(agent.id, 'running'); // Will also trigger updateAgentSlackUserId below
|
|
218
|
+
const { updateAgentSlackUserId } = await Promise.resolve().then(() => __importStar(require('./db')));
|
|
219
|
+
await updateAgentSlackUserId(agent.id, authResult.user_id);
|
|
220
|
+
agent.slackBotUserId = authResult.user_id;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
catch (err) {
|
|
224
|
+
logger_1.logger.warn('Failed to fetch bot user ID', { agent: agent.slug, error: err });
|
|
225
|
+
}
|
|
226
|
+
this.runningAgents.set(agent.id, { agent, app, claudeHandler, memoryWatcher });
|
|
227
|
+
await (0, db_1.updateAgentStatus)(agent.id, 'running');
|
|
228
|
+
logger_1.logger.info('Agent started', {
|
|
229
|
+
agent: agent.slug,
|
|
230
|
+
mcpServers: mcpServers.map((m) => m.name),
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Stops a running agent and cleans up all its resources.
|
|
235
|
+
*
|
|
236
|
+
* @param {string} agentId - UUID of the agent to stop.
|
|
237
|
+
* @returns {Promise<void>}
|
|
238
|
+
*/
|
|
239
|
+
async stopAgent(agentId) {
|
|
240
|
+
const running = this.runningAgents.get(agentId);
|
|
241
|
+
if (!running)
|
|
242
|
+
return;
|
|
243
|
+
const { agent, app, claudeHandler, memoryWatcher } = running;
|
|
244
|
+
logger_1.logger.info('Stopping agent', { agent: agent.slug });
|
|
245
|
+
memoryWatcher.stop();
|
|
246
|
+
claudeHandler.destroy();
|
|
247
|
+
try {
|
|
248
|
+
await app.stop();
|
|
249
|
+
}
|
|
250
|
+
catch (err) {
|
|
251
|
+
logger_1.logger.warn('Error stopping Bolt App', { agent: agent.slug, error: err });
|
|
252
|
+
}
|
|
253
|
+
this.runningAgents.delete(agentId);
|
|
254
|
+
await (0, db_1.updateAgentStatus)(agentId, 'stopped');
|
|
255
|
+
logger_1.logger.info('Agent stopped', { agent: agent.slug });
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Reloads an agent: stops it, re-fetches its config, recompiles, and restarts.
|
|
259
|
+
* Called when the web UI publishes a reload event.
|
|
260
|
+
*
|
|
261
|
+
* @param {string} agentId - UUID of the agent to reload.
|
|
262
|
+
* @returns {Promise<void>}
|
|
263
|
+
*/
|
|
264
|
+
async reloadAgent(agentId) {
|
|
265
|
+
logger_1.logger.info('Reloading agent', { agentId });
|
|
266
|
+
await this.stopAgent(agentId);
|
|
267
|
+
const agent = await (0, db_1.getAgentById)(agentId);
|
|
268
|
+
if (!agent) {
|
|
269
|
+
logger_1.logger.warn('Agent not found after reload event', { agentId });
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
await this.startAgent(agent);
|
|
273
|
+
}
|
|
274
|
+
// ===========================================================================
|
|
275
|
+
// Redis pub/sub
|
|
276
|
+
// ===========================================================================
|
|
277
|
+
/**
|
|
278
|
+
* Connects to Redis and subscribes to agent lifecycle events.
|
|
279
|
+
*
|
|
280
|
+
* @returns {Promise<void>}
|
|
281
|
+
* @throws {Error} If REDIS_URL is not set or connection fails.
|
|
282
|
+
*/
|
|
283
|
+
async connectRedis() {
|
|
284
|
+
const redisUrl = process.env.REDIS_URL;
|
|
285
|
+
if (!redisUrl) {
|
|
286
|
+
logger_1.logger.warn('REDIS_URL not set — hot reload disabled');
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
this.redisSubscriber = (0, redis_1.createClient)({ url: redisUrl });
|
|
290
|
+
this.redisSubscriber.on('error', (err) => {
|
|
291
|
+
logger_1.logger.warn('Redis subscriber error', { error: err.message });
|
|
292
|
+
});
|
|
293
|
+
await this.redisSubscriber.connect();
|
|
294
|
+
await this.redisSubscriber.subscribe(shared_1.AGENT_EVENTS_CHANNEL, (message) => {
|
|
295
|
+
this.handleAgentEvent(message);
|
|
296
|
+
});
|
|
297
|
+
logger_1.logger.info('Redis subscriber connected', { channel: shared_1.AGENT_EVENTS_CHANNEL });
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Handles an agent lifecycle event received from Redis.
|
|
301
|
+
*
|
|
302
|
+
* @param {string} rawMessage - JSON-encoded AgentEvent.
|
|
303
|
+
* @returns {void}
|
|
304
|
+
*/
|
|
305
|
+
handleAgentEvent(rawMessage) {
|
|
306
|
+
let event;
|
|
307
|
+
try {
|
|
308
|
+
event = JSON.parse(rawMessage);
|
|
309
|
+
}
|
|
310
|
+
catch {
|
|
311
|
+
logger_1.logger.warn('Received malformed agent event', { rawMessage });
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
logger_1.logger.info('Received agent event', { event });
|
|
315
|
+
switch (event.type) {
|
|
316
|
+
case 'reload':
|
|
317
|
+
this.reloadAgent(event.agentId).catch((err) => logger_1.logger.error('Failed to reload agent', { agentId: event.agentId, error: err.message }));
|
|
318
|
+
break;
|
|
319
|
+
case 'start':
|
|
320
|
+
(0, db_1.getAgentById)(event.agentId)
|
|
321
|
+
.then((agent) => agent && this.startAgent(agent))
|
|
322
|
+
.catch((err) => logger_1.logger.error('Failed to start agent', { agentId: event.agentId, error: err.message }));
|
|
323
|
+
break;
|
|
324
|
+
case 'stop':
|
|
325
|
+
this.stopAgent(event.agentId).catch((err) => logger_1.logger.error('Failed to stop agent', { agentId: event.agentId, error: err.message }));
|
|
326
|
+
break;
|
|
327
|
+
case 'reload-jobs':
|
|
328
|
+
this.jobScheduler.reload().catch((err) => logger_1.logger.error('Failed to reload jobs', { error: err.message }));
|
|
329
|
+
break;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
// ===========================================================================
|
|
333
|
+
// Graceful shutdown
|
|
334
|
+
// ===========================================================================
|
|
335
|
+
/**
|
|
336
|
+
* Registers SIGTERM and SIGINT handlers for graceful shutdown.
|
|
337
|
+
* Ensures all agents are cleanly stopped before the process exits.
|
|
338
|
+
*
|
|
339
|
+
* @returns {void}
|
|
340
|
+
*/
|
|
341
|
+
registerShutdownHandlers() {
|
|
342
|
+
const shutdown = async (signal) => {
|
|
343
|
+
logger_1.logger.info(`Received ${signal}, shutting down gracefully...`);
|
|
344
|
+
await this.stop();
|
|
345
|
+
process.exit(0);
|
|
346
|
+
};
|
|
347
|
+
process.on('SIGTERM', () => shutdown('SIGTERM'));
|
|
348
|
+
process.on('SIGINT', () => shutdown('SIGINT'));
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
exports.AgentRunner = AgentRunner;
|
|
352
|
+
//# sourceMappingURL=agent-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-runner.js","sourceRoot":"","sources":["../src/agent-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Claude Code SDK session manager for a single agent.
|
|
3
|
+
*
|
|
4
|
+
* Each agent has ONE ClaudeHandler shared across all Slack conversations.
|
|
5
|
+
* Each Slack thread gets its own isolated working directory so Claude's
|
|
6
|
+
* memory files (written to .claude/memory/ inside cwd) are per-thread.
|
|
7
|
+
*
|
|
8
|
+
* Directory layout:
|
|
9
|
+
* /tmp/agents/{slug}/ ← agent root (CLAUDE.md lives here)
|
|
10
|
+
* /tmp/agents/{slug}/sessions/{key}/ ← per-thread cwd
|
|
11
|
+
* CLAUDE.md ← copy of agent CLAUDE.md (skills)
|
|
12
|
+
* .claude/memory/ ← per-thread memory files
|
|
13
|
+
*
|
|
14
|
+
* @module runner/claude-handler
|
|
15
|
+
*/
|
|
16
|
+
import { type SDKMessage } from '@anthropic-ai/claude-agent-sdk';
|
|
17
|
+
import type { ContentBlockParam } from '@anthropic-ai/sdk/resources';
|
|
18
|
+
import type { Agent, McpServer, Permission } from '@slackhive/shared';
|
|
19
|
+
export declare class ClaudeHandler {
|
|
20
|
+
private readonly agent;
|
|
21
|
+
private readonly mcpServers;
|
|
22
|
+
private readonly permissions;
|
|
23
|
+
private readonly workDir;
|
|
24
|
+
private readonly sessionsDir;
|
|
25
|
+
private readonly log;
|
|
26
|
+
private readonly envVarValues;
|
|
27
|
+
private readonly mcpManager;
|
|
28
|
+
/** In-memory cache: sessionKey → Claude session ID */
|
|
29
|
+
private sessionCache;
|
|
30
|
+
private cleanupTimer;
|
|
31
|
+
/**
|
|
32
|
+
* @param {Agent} agent - The agent configuration record.
|
|
33
|
+
* @param {McpServer[]} mcpServers - MCP servers assigned to this agent.
|
|
34
|
+
* @param {Permission | null} permissions - Tool allow/deny lists, or null for defaults.
|
|
35
|
+
* @param {string} workDir - Root working directory for this agent (e.g. `/tmp/agents/{slug}`).
|
|
36
|
+
* @param {Record<string, string>} envVarValues - Platform env vars for resolving MCP envRefs.
|
|
37
|
+
*/
|
|
38
|
+
constructor(agent: Agent, mcpServers: McpServer[], permissions: Permission | null, workDir: string, envVarValues?: Record<string, string>);
|
|
39
|
+
/**
|
|
40
|
+
* Sets up the sessions directory and starts the periodic stale-session cleanup timer.
|
|
41
|
+
* Must be called once before any `streamQuery` calls.
|
|
42
|
+
*
|
|
43
|
+
* @returns {void}
|
|
44
|
+
*/
|
|
45
|
+
initialize(): void;
|
|
46
|
+
private startMcpProxies;
|
|
47
|
+
/**
|
|
48
|
+
* Stops the cleanup timer and clears the in-memory session cache.
|
|
49
|
+
* Called when the agent is stopped or reloaded.
|
|
50
|
+
*
|
|
51
|
+
* @returns {void}
|
|
52
|
+
*/
|
|
53
|
+
destroy(): void;
|
|
54
|
+
/**
|
|
55
|
+
* Derives a deterministic session key from Slack identifiers.
|
|
56
|
+
* The key is used as both a DB lookup key and a working-directory name.
|
|
57
|
+
*
|
|
58
|
+
* @param {string} userId - Slack user ID (e.g. `U12345678`).
|
|
59
|
+
* @param {string} channelId - Slack channel or DM ID.
|
|
60
|
+
* @param {string} [threadTs] - Thread timestamp; omit for top-level DMs.
|
|
61
|
+
* @returns {string} Composite key: `{userId}-{channelId}-{threadTs|'direct'}`.
|
|
62
|
+
*/
|
|
63
|
+
getSessionKey(userId: string, channelId: string, threadTs?: string): string;
|
|
64
|
+
/**
|
|
65
|
+
* Returns the isolated working directory for a session.
|
|
66
|
+
* Creates it on first access and copies CLAUDE.md from the agent root.
|
|
67
|
+
*/
|
|
68
|
+
private getSessionWorkDir;
|
|
69
|
+
/**
|
|
70
|
+
* Streams a Claude Code SDK query for the given session and yields raw SDK messages.
|
|
71
|
+
*
|
|
72
|
+
* Session resumption: If a Claude session ID exists for this `sessionKey` (in-memory
|
|
73
|
+
* cache or persisted in DB), the query resumes that conversation. On a stale-session
|
|
74
|
+
* error the handler transparently retries once as a fresh session.
|
|
75
|
+
*
|
|
76
|
+
* Callers should check `abortController.signal.aborted` between yields and break early
|
|
77
|
+
* if the user has sent a new message (the Slack handler cancels in-flight requests this way).
|
|
78
|
+
*
|
|
79
|
+
* @param {string} prompt - The user message to send to Claude.
|
|
80
|
+
* @param {string} sessionKey - Session key from {@link getSessionKey}.
|
|
81
|
+
* @param {AbortController} [abortController] - Optional controller to cancel the stream.
|
|
82
|
+
* @yields {SDKMessage} Raw messages from the Claude Code SDK.
|
|
83
|
+
* @throws {Error} On unrecoverable SDK errors (re-thrown after logging).
|
|
84
|
+
*/
|
|
85
|
+
streamQuery(prompt: string | ContentBlockParam[], sessionKey: string, abortController?: AbortController): AsyncGenerator<SDKMessage, void, unknown>;
|
|
86
|
+
/**
|
|
87
|
+
* Resolves a raw MCP server config from the DB into one ready for the SDK:
|
|
88
|
+
* - Merges envRefs (references to platform env vars) into the env object
|
|
89
|
+
* - For inline TypeScript MCPs (tsSource): writes the source to disk and
|
|
90
|
+
* rewrites config to use `tsx <scriptPath>`
|
|
91
|
+
*
|
|
92
|
+
* @param {string} serverName - MCP server name, used for the script filename.
|
|
93
|
+
* @param {McpServerConfig} config - Raw config from the DB.
|
|
94
|
+
* @returns {McpServerConfig} Resolved config safe to pass to the SDK.
|
|
95
|
+
*/
|
|
96
|
+
private resolveServerConfig;
|
|
97
|
+
/**
|
|
98
|
+
* Merges inline env with resolved envRefs into a single env object.
|
|
99
|
+
*/
|
|
100
|
+
private resolveEnvRefs;
|
|
101
|
+
/**
|
|
102
|
+
* Builds the options object passed to the Claude Code SDK `query()` call.
|
|
103
|
+
*
|
|
104
|
+
* Merges agent permissions (allowed/denied tools) with MCP server prefixes
|
|
105
|
+
* so that only explicitly permitted tools are available to the agent.
|
|
106
|
+
* Default allowed tool is `['Read']` when no permissions are configured.
|
|
107
|
+
*
|
|
108
|
+
* @param {string} sessionWorkDir - Per-session working directory path.
|
|
109
|
+
* @param {string | undefined} claudeSessionId - Existing session ID to resume, or undefined for a new session.
|
|
110
|
+
* @param {AbortController} [abortController] - Optional abort controller injected into SDK options.
|
|
111
|
+
* @returns {Record<string, unknown>} Options object for `query({ prompt, options })`.
|
|
112
|
+
*/
|
|
113
|
+
private buildSdkOptions;
|
|
114
|
+
/**
|
|
115
|
+
* Deletes sessions inactive longer than SESSION_MAX_AGE_MS from the DB
|
|
116
|
+
* and clears the in-memory cache so stale IDs are not accidentally reused.
|
|
117
|
+
* Runs on an interval set in {@link initialize}; failures are logged and swallowed.
|
|
118
|
+
*
|
|
119
|
+
* @returns {Promise<void>}
|
|
120
|
+
*/
|
|
121
|
+
private runSessionCleanup;
|
|
122
|
+
}
|