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,150 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview Job scheduler — executes scheduled jobs via node-cron.
|
|
4
|
+
*
|
|
5
|
+
* On each cron trigger:
|
|
6
|
+
* 1. Finds the boss agent from the runningAgents map
|
|
7
|
+
* 2. Sends the job's prompt to the boss via claudeHandler.streamQuery()
|
|
8
|
+
* 3. Posts the result to the target Slack channel or DM
|
|
9
|
+
* 4. Records the run in the job_runs table
|
|
10
|
+
*
|
|
11
|
+
* @module runner/job-scheduler
|
|
12
|
+
*/
|
|
13
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.JobScheduler = void 0;
|
|
18
|
+
const node_cron_1 = __importDefault(require("node-cron"));
|
|
19
|
+
const db_1 = require("./db");
|
|
20
|
+
const logger_1 = require("./logger");
|
|
21
|
+
/**
|
|
22
|
+
* Manages cron-scheduled jobs that are executed by any running agent.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```ts
|
|
26
|
+
* const scheduler = new JobScheduler((id) => agentRunner.getRunningAgent(id));
|
|
27
|
+
* await scheduler.start();
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
class JobScheduler {
|
|
31
|
+
getAgent;
|
|
32
|
+
tasks = new Map();
|
|
33
|
+
running = new Set();
|
|
34
|
+
/**
|
|
35
|
+
* @param {(agentId: string) => RunningAgent | undefined} getAgent - Returns a running agent by ID.
|
|
36
|
+
*/
|
|
37
|
+
constructor(getAgent) {
|
|
38
|
+
this.getAgent = getAgent;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Loads all enabled jobs from DB and schedules them.
|
|
42
|
+
*/
|
|
43
|
+
async start() {
|
|
44
|
+
await this.reload();
|
|
45
|
+
logger_1.logger.info('Job scheduler started');
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Destroys all cron tasks.
|
|
49
|
+
*/
|
|
50
|
+
async stop() {
|
|
51
|
+
for (const [id, task] of this.tasks) {
|
|
52
|
+
task.stop();
|
|
53
|
+
logger_1.logger.info('Job unscheduled', { jobId: id });
|
|
54
|
+
}
|
|
55
|
+
this.tasks.clear();
|
|
56
|
+
logger_1.logger.info('Job scheduler stopped');
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Reloads all jobs from DB — destroys old tasks, creates new ones.
|
|
60
|
+
*/
|
|
61
|
+
async reload() {
|
|
62
|
+
// Stop all existing tasks
|
|
63
|
+
for (const task of this.tasks.values()) {
|
|
64
|
+
task.stop();
|
|
65
|
+
}
|
|
66
|
+
this.tasks.clear();
|
|
67
|
+
// Load enabled jobs
|
|
68
|
+
const jobs = await (0, db_1.getAllEnabledJobs)();
|
|
69
|
+
for (const job of jobs) {
|
|
70
|
+
if (!node_cron_1.default.validate(job.cronSchedule)) {
|
|
71
|
+
logger_1.logger.warn('Invalid cron expression, skipping', { jobId: job.id, cron: job.cronSchedule });
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
this.scheduleJob(job);
|
|
75
|
+
}
|
|
76
|
+
logger_1.logger.info('Jobs reloaded', { count: jobs.length, scheduled: this.tasks.size });
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Schedules a single job.
|
|
80
|
+
*/
|
|
81
|
+
scheduleJob(job) {
|
|
82
|
+
const task = node_cron_1.default.schedule(job.cronSchedule, () => {
|
|
83
|
+
this.executeJob(job).catch(err => logger_1.logger.error('Job execution failed', { jobId: job.id, error: err.message }));
|
|
84
|
+
});
|
|
85
|
+
this.tasks.set(job.id, task);
|
|
86
|
+
logger_1.logger.info('Job scheduled', { jobId: job.id, name: job.name, cron: job.cronSchedule });
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Executes a single job — sends prompt to boss, posts result.
|
|
90
|
+
*/
|
|
91
|
+
async executeJob(job) {
|
|
92
|
+
// Prevent overlapping runs of the same job
|
|
93
|
+
if (this.running.has(job.id)) {
|
|
94
|
+
logger_1.logger.warn('Skipping overlapping job run', { jobId: job.id });
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
this.running.add(job.id);
|
|
98
|
+
// Skip silently if agent is not running — avoids noisy error runs
|
|
99
|
+
const agent = this.getAgent(job.agentId);
|
|
100
|
+
if (!agent) {
|
|
101
|
+
logger_1.logger.warn('Skipping job — agent not running', { jobId: job.id, agentId: job.agentId });
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
const runId = await (0, db_1.insertJobRun)(job.id);
|
|
105
|
+
logger_1.logger.info('Job run started', { jobId: job.id, runId, name: job.name });
|
|
106
|
+
try {
|
|
107
|
+
// Fresh session key per run (no resume)
|
|
108
|
+
const sessionKey = `job-${job.id}-${Date.now()}`;
|
|
109
|
+
// Stream query to agent
|
|
110
|
+
let output = '';
|
|
111
|
+
for await (const msg of agent.claudeHandler.streamQuery(job.prompt, sessionKey)) {
|
|
112
|
+
const m = msg;
|
|
113
|
+
if (m.type === 'result' && m.subtype === 'success') {
|
|
114
|
+
output = m.result ?? '';
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
if (!output) {
|
|
118
|
+
output = '_Job completed with no output._';
|
|
119
|
+
}
|
|
120
|
+
// Post to target
|
|
121
|
+
if (job.targetType === 'dm') {
|
|
122
|
+
const dm = await agent.app.client.conversations.open({ users: job.targetId });
|
|
123
|
+
if (dm.channel?.id) {
|
|
124
|
+
await agent.app.client.chat.postMessage({
|
|
125
|
+
channel: dm.channel.id,
|
|
126
|
+
text: output,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
await agent.app.client.chat.postMessage({
|
|
132
|
+
channel: job.targetId,
|
|
133
|
+
text: output,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
await (0, db_1.updateJobRun)(runId, 'success', output.slice(0, 2000));
|
|
137
|
+
logger_1.logger.info('Job run succeeded', { jobId: job.id, runId });
|
|
138
|
+
}
|
|
139
|
+
catch (err) {
|
|
140
|
+
const errMsg = err.message;
|
|
141
|
+
await (0, db_1.updateJobRun)(runId, 'error', null, errMsg);
|
|
142
|
+
logger_1.logger.error('Job run failed', { jobId: job.id, runId, error: errMsg });
|
|
143
|
+
}
|
|
144
|
+
finally {
|
|
145
|
+
this.running.delete(job.id);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
exports.JobScheduler = JobScheduler;
|
|
150
|
+
//# sourceMappingURL=job-scheduler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"job-scheduler.js","sourceRoot":"","sources":["../src/job-scheduler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Structured logger for the runner service.
|
|
3
|
+
*
|
|
4
|
+
* Wraps Winston to provide consistent JSON-structured logs with
|
|
5
|
+
* support for an optional agent context field. All log entries
|
|
6
|
+
* include a timestamp and log level.
|
|
7
|
+
*
|
|
8
|
+
* @module runner/logger
|
|
9
|
+
*/
|
|
10
|
+
import winston from 'winston';
|
|
11
|
+
/**
|
|
12
|
+
* The shared logger instance for the runner service.
|
|
13
|
+
* Use this for all logging throughout the runner.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* logger.info('Agent started', { agent: 'gilfoyle' });
|
|
17
|
+
* logger.error('Failed to compile CLAUDE.md', { agent: 'boss', error: err.message });
|
|
18
|
+
*/
|
|
19
|
+
export declare const logger: winston.Logger;
|
|
20
|
+
/**
|
|
21
|
+
* Creates a child logger with a fixed `agent` context field.
|
|
22
|
+
* All log entries from the child will include `{ agent: slug }`.
|
|
23
|
+
*
|
|
24
|
+
* @param {string} slug - Agent slug to attach to all log entries.
|
|
25
|
+
* @returns {winston.Logger} Child logger with agent context.
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* const log = agentLogger('gilfoyle');
|
|
29
|
+
* log.info('Session started', { sessionKey: 'U123-C456-...' });
|
|
30
|
+
* // → { level: 'info', message: 'Session started', agent: 'gilfoyle', sessionKey: '...' }
|
|
31
|
+
*/
|
|
32
|
+
export declare function agentLogger(slug: string): winston.Logger;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview Structured logger for the runner service.
|
|
4
|
+
*
|
|
5
|
+
* Wraps Winston to provide consistent JSON-structured logs with
|
|
6
|
+
* support for an optional agent context field. All log entries
|
|
7
|
+
* include a timestamp and log level.
|
|
8
|
+
*
|
|
9
|
+
* @module runner/logger
|
|
10
|
+
*/
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.logger = void 0;
|
|
16
|
+
exports.agentLogger = agentLogger;
|
|
17
|
+
const winston_1 = __importDefault(require("winston"));
|
|
18
|
+
const { combine, timestamp, json, colorize, simple } = winston_1.default.format;
|
|
19
|
+
const isDev = process.env.NODE_ENV !== 'production';
|
|
20
|
+
/**
|
|
21
|
+
* The shared logger instance for the runner service.
|
|
22
|
+
* Use this for all logging throughout the runner.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* logger.info('Agent started', { agent: 'gilfoyle' });
|
|
26
|
+
* logger.error('Failed to compile CLAUDE.md', { agent: 'boss', error: err.message });
|
|
27
|
+
*/
|
|
28
|
+
exports.logger = winston_1.default.createLogger({
|
|
29
|
+
level: process.env.LOG_LEVEL ?? (isDev ? 'debug' : 'info'),
|
|
30
|
+
format: isDev
|
|
31
|
+
? combine(timestamp(), colorize(), simple())
|
|
32
|
+
: combine(timestamp(), json()),
|
|
33
|
+
transports: [
|
|
34
|
+
new winston_1.default.transports.Console(),
|
|
35
|
+
],
|
|
36
|
+
});
|
|
37
|
+
/**
|
|
38
|
+
* Creates a child logger with a fixed `agent` context field.
|
|
39
|
+
* All log entries from the child will include `{ agent: slug }`.
|
|
40
|
+
*
|
|
41
|
+
* @param {string} slug - Agent slug to attach to all log entries.
|
|
42
|
+
* @returns {winston.Logger} Child logger with agent context.
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* const log = agentLogger('gilfoyle');
|
|
46
|
+
* log.info('Session started', { sessionKey: 'U123-C456-...' });
|
|
47
|
+
* // → { level: 'info', message: 'Session started', agent: 'gilfoyle', sessionKey: '...' }
|
|
48
|
+
*/
|
|
49
|
+
function agentLogger(slug) {
|
|
50
|
+
return exports.logger.child({ agent: slug });
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;;;;AAsCH,kCAEC;AAtCD,sDAA8B;AAE9B,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,iBAAO,CAAC,MAAM,CAAC;AAEtE,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC;AAEpD;;;;;;;GAOG;AACU,QAAA,MAAM,GAAG,iBAAO,CAAC,YAAY,CAAC;IACzC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;IAC1D,MAAM,EAAE,KAAK;QACX,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC;QAC5C,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,CAAC;IAChC,UAAU,EAAE;QACV,IAAI,iBAAO,CAAC,UAAU,CAAC,OAAO,EAAE;KACjC;CACF,CAAC,CAAC;AAEH;;;;;;;;;;;GAWG;AACH,SAAgB,WAAW,CAAC,IAAY;IACtC,OAAO,cAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Persistent MCP server manager.
|
|
3
|
+
*
|
|
4
|
+
* Keeps stdio MCP servers alive as long-running processes for the duration of
|
|
5
|
+
* an agent's lifetime, rather than spawning fresh processes per query. Each
|
|
6
|
+
* stdio MCP is proxied as a local SSE endpoint so the Claude Agent SDK can
|
|
7
|
+
* connect to it via HTTP instead of spawning a new process every turn.
|
|
8
|
+
*
|
|
9
|
+
* Architecture:
|
|
10
|
+
* stdio MCP process ←→ Client (MCP SDK) ←→ ProxyServer ←→ SSE HTTP server
|
|
11
|
+
* ↑
|
|
12
|
+
* Claude Agent SDK connects here
|
|
13
|
+
*
|
|
14
|
+
* @module runner/mcp-process-manager
|
|
15
|
+
*/
|
|
16
|
+
import type { McpStdioConfig } from '@slackhive/shared';
|
|
17
|
+
/**
|
|
18
|
+
* Manages persistent MCP server processes for a single agent.
|
|
19
|
+
* Call `startAll()` when the agent starts, `stopAll()` when it stops.
|
|
20
|
+
*/
|
|
21
|
+
export declare class McpProcessManager {
|
|
22
|
+
private readonly proxies;
|
|
23
|
+
private nextPort;
|
|
24
|
+
private readonly log;
|
|
25
|
+
private readonly workDir;
|
|
26
|
+
constructor(agentSlug: string, workDir: string, basePort: number);
|
|
27
|
+
/**
|
|
28
|
+
* Starts a persistent stdio MCP process and exposes it as an SSE proxy.
|
|
29
|
+
* Returns the SSE URL to pass to the Claude Agent SDK.
|
|
30
|
+
*/
|
|
31
|
+
startServer(name: string, config: McpStdioConfig, envVarValues?: Record<string, string>): Promise<string>;
|
|
32
|
+
/** Returns the SSE URL for a running proxy, or undefined if not started. */
|
|
33
|
+
getUrl(name: string): string | undefined;
|
|
34
|
+
/** Stops and cleans up a single MCP proxy. */
|
|
35
|
+
stopServer(name: string): Promise<void>;
|
|
36
|
+
/** Stops all running MCP proxies. */
|
|
37
|
+
stopAll(): Promise<void>;
|
|
38
|
+
}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview Persistent MCP server manager.
|
|
4
|
+
*
|
|
5
|
+
* Keeps stdio MCP servers alive as long-running processes for the duration of
|
|
6
|
+
* an agent's lifetime, rather than spawning fresh processes per query. Each
|
|
7
|
+
* stdio MCP is proxied as a local SSE endpoint so the Claude Agent SDK can
|
|
8
|
+
* connect to it via HTTP instead of spawning a new process every turn.
|
|
9
|
+
*
|
|
10
|
+
* Architecture:
|
|
11
|
+
* stdio MCP process ←→ Client (MCP SDK) ←→ ProxyServer ←→ SSE HTTP server
|
|
12
|
+
* ↑
|
|
13
|
+
* Claude Agent SDK connects here
|
|
14
|
+
*
|
|
15
|
+
* @module runner/mcp-process-manager
|
|
16
|
+
*/
|
|
17
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
18
|
+
if (k2 === undefined) k2 = k;
|
|
19
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
20
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
21
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
22
|
+
}
|
|
23
|
+
Object.defineProperty(o, k2, desc);
|
|
24
|
+
}) : (function(o, m, k, k2) {
|
|
25
|
+
if (k2 === undefined) k2 = k;
|
|
26
|
+
o[k2] = m[k];
|
|
27
|
+
}));
|
|
28
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
29
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
30
|
+
}) : function(o, v) {
|
|
31
|
+
o["default"] = v;
|
|
32
|
+
});
|
|
33
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
34
|
+
var ownKeys = function(o) {
|
|
35
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
36
|
+
var ar = [];
|
|
37
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
38
|
+
return ar;
|
|
39
|
+
};
|
|
40
|
+
return ownKeys(o);
|
|
41
|
+
};
|
|
42
|
+
return function (mod) {
|
|
43
|
+
if (mod && mod.__esModule) return mod;
|
|
44
|
+
var result = {};
|
|
45
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
46
|
+
__setModuleDefault(result, mod);
|
|
47
|
+
return result;
|
|
48
|
+
};
|
|
49
|
+
})();
|
|
50
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
51
|
+
exports.McpProcessManager = void 0;
|
|
52
|
+
const fs = __importStar(require("fs"));
|
|
53
|
+
const path = __importStar(require("path"));
|
|
54
|
+
const http = __importStar(require("http"));
|
|
55
|
+
const index_js_1 = require("@modelcontextprotocol/sdk/client/index.js");
|
|
56
|
+
const stdio_js_1 = require("@modelcontextprotocol/sdk/client/stdio.js");
|
|
57
|
+
const index_js_2 = require("@modelcontextprotocol/sdk/server/index.js");
|
|
58
|
+
const sse_js_1 = require("@modelcontextprotocol/sdk/server/sse.js");
|
|
59
|
+
const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
|
|
60
|
+
const logger_js_1 = require("./logger.js");
|
|
61
|
+
/**
|
|
62
|
+
* Manages persistent MCP server processes for a single agent.
|
|
63
|
+
* Call `startAll()` when the agent starts, `stopAll()` when it stops.
|
|
64
|
+
*/
|
|
65
|
+
class McpProcessManager {
|
|
66
|
+
proxies = new Map();
|
|
67
|
+
nextPort;
|
|
68
|
+
log;
|
|
69
|
+
workDir;
|
|
70
|
+
constructor(agentSlug, workDir, basePort) {
|
|
71
|
+
this.log = (0, logger_js_1.agentLogger)(agentSlug);
|
|
72
|
+
this.workDir = workDir;
|
|
73
|
+
this.nextPort = basePort;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Starts a persistent stdio MCP process and exposes it as an SSE proxy.
|
|
77
|
+
* Returns the SSE URL to pass to the Claude Agent SDK.
|
|
78
|
+
*/
|
|
79
|
+
async startServer(name, config, envVarValues = {}) {
|
|
80
|
+
// Stop any existing proxy for this server
|
|
81
|
+
await this.stopServer(name);
|
|
82
|
+
// Build resolved environment
|
|
83
|
+
const env = {
|
|
84
|
+
...process.env,
|
|
85
|
+
...(config.env ?? {}),
|
|
86
|
+
};
|
|
87
|
+
for (const [subKey, storeKey] of Object.entries((config.envRefs ?? {}))) {
|
|
88
|
+
if (envVarValues[storeKey] !== undefined)
|
|
89
|
+
env[subKey] = envVarValues[storeKey];
|
|
90
|
+
}
|
|
91
|
+
// For inline TypeScript source, write to disk first
|
|
92
|
+
let command = config.command;
|
|
93
|
+
let args = config.args ?? [];
|
|
94
|
+
if (config.tsSource) {
|
|
95
|
+
const scriptDir = path.join(this.workDir, '.mcp-scripts');
|
|
96
|
+
const scriptPath = path.join(scriptDir, `${name}.ts`);
|
|
97
|
+
fs.mkdirSync(scriptDir, { recursive: true });
|
|
98
|
+
fs.writeFileSync(scriptPath, config.tsSource, 'utf8');
|
|
99
|
+
command = '/app/node_modules/.bin/tsx';
|
|
100
|
+
args = [scriptPath];
|
|
101
|
+
env.NODE_PATH = '/app/node_modules';
|
|
102
|
+
}
|
|
103
|
+
// Connect to the stdio MCP process
|
|
104
|
+
const transport = new stdio_js_1.StdioClientTransport({ command, args, env });
|
|
105
|
+
const client = new index_js_1.Client({ name: 'slackhive-proxy', version: '1.0.0' }, { capabilities: {} });
|
|
106
|
+
try {
|
|
107
|
+
await client.connect(transport);
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
this.log.error('Failed to connect to MCP server', { server: name, error: err.message });
|
|
111
|
+
throw err;
|
|
112
|
+
}
|
|
113
|
+
this.log.info('MCP server connected', { server: name, command });
|
|
114
|
+
const caps = client.getServerCapabilities() ?? {};
|
|
115
|
+
// Build a proxy MCP Server that forwards calls to the client
|
|
116
|
+
const proxyServer = new index_js_2.Server({ name, version: '1.0.0' }, { capabilities: caps });
|
|
117
|
+
if (caps.tools) {
|
|
118
|
+
proxyServer.setRequestHandler(types_js_1.ListToolsRequestSchema, () => client.listTools());
|
|
119
|
+
proxyServer.setRequestHandler(types_js_1.CallToolRequestSchema, (req) => client.callTool({ name: req.params.name, arguments: req.params.arguments ?? {} }));
|
|
120
|
+
}
|
|
121
|
+
if (caps.resources) {
|
|
122
|
+
proxyServer.setRequestHandler(types_js_1.ListResourcesRequestSchema, () => client.listResources());
|
|
123
|
+
proxyServer.setRequestHandler(types_js_1.ReadResourceRequestSchema, (req) => client.readResource({ uri: req.params.uri }));
|
|
124
|
+
}
|
|
125
|
+
if (caps.prompts) {
|
|
126
|
+
proxyServer.setRequestHandler(types_js_1.ListPromptsRequestSchema, () => client.listPrompts());
|
|
127
|
+
proxyServer.setRequestHandler(types_js_1.GetPromptRequestSchema, (req) => client.getPrompt({ name: req.params.name, arguments: req.params.arguments }));
|
|
128
|
+
}
|
|
129
|
+
// Serve the proxy over SSE on a local port
|
|
130
|
+
const port = this.nextPort++;
|
|
131
|
+
const sseTransports = new Map();
|
|
132
|
+
const httpServer = http.createServer(async (req, res) => {
|
|
133
|
+
try {
|
|
134
|
+
if (req.method === 'GET' && req.url === '/sse') {
|
|
135
|
+
const sseTransport = new sse_js_1.SSEServerTransport('/message', res);
|
|
136
|
+
sseTransports.set(sseTransport.sessionId, sseTransport);
|
|
137
|
+
res.on('close', () => sseTransports.delete(sseTransport.sessionId));
|
|
138
|
+
await proxyServer.connect(sseTransport);
|
|
139
|
+
}
|
|
140
|
+
else if (req.method === 'POST' && req.url?.startsWith('/message')) {
|
|
141
|
+
const sessionId = new URL(req.url, `http://127.0.0.1:${port}`).searchParams.get('sessionId') ?? '';
|
|
142
|
+
const sseTransport = sseTransports.get(sessionId);
|
|
143
|
+
if (sseTransport) {
|
|
144
|
+
await sseTransport.handlePostMessage(req, res);
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
res.writeHead(404).end('Session not found');
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
res.writeHead(404).end();
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
catch (err) {
|
|
155
|
+
this.log.error('MCP proxy HTTP error', { server: name, error: err.message });
|
|
156
|
+
if (!res.headersSent)
|
|
157
|
+
res.writeHead(500).end();
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
await new Promise((resolve, reject) => {
|
|
161
|
+
httpServer.once('error', reject);
|
|
162
|
+
httpServer.listen(port, '127.0.0.1', resolve);
|
|
163
|
+
});
|
|
164
|
+
const url = `http://127.0.0.1:${port}/sse`;
|
|
165
|
+
this.proxies.set(name, { client, httpServer, port, url });
|
|
166
|
+
this.log.info('MCP proxy listening', { server: name, url });
|
|
167
|
+
return url;
|
|
168
|
+
}
|
|
169
|
+
/** Returns the SSE URL for a running proxy, or undefined if not started. */
|
|
170
|
+
getUrl(name) {
|
|
171
|
+
return this.proxies.get(name)?.url;
|
|
172
|
+
}
|
|
173
|
+
/** Stops and cleans up a single MCP proxy. */
|
|
174
|
+
async stopServer(name) {
|
|
175
|
+
const proxy = this.proxies.get(name);
|
|
176
|
+
if (!proxy)
|
|
177
|
+
return;
|
|
178
|
+
this.proxies.delete(name);
|
|
179
|
+
await proxy.client.close().catch(() => { });
|
|
180
|
+
await new Promise((resolve) => proxy.httpServer.close(() => resolve()));
|
|
181
|
+
this.log.info('MCP proxy stopped', { server: name });
|
|
182
|
+
}
|
|
183
|
+
/** Stops all running MCP proxies. */
|
|
184
|
+
async stopAll() {
|
|
185
|
+
await Promise.all([...this.proxies.keys()].map((name) => this.stopServer(name)));
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
exports.McpProcessManager = McpProcessManager;
|
|
189
|
+
//# sourceMappingURL=mcp-process-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-process-manager.js","sourceRoot":"","sources":["../src/mcp-process-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Built-in memory MCP server source code.
|
|
3
|
+
*
|
|
4
|
+
* This TypeScript source is injected as an inline stdio MCP for every agent.
|
|
5
|
+
* It exposes three tools — list_memories, search_memories, get_memory — that
|
|
6
|
+
* query the agent's memory rows directly from Postgres.
|
|
7
|
+
*
|
|
8
|
+
* The script runs via `tsx` inside the runner container and receives:
|
|
9
|
+
* DATABASE_URL — Postgres connection string
|
|
10
|
+
* MEMORY_AGENT_ID — the agent's UUID (injected by ClaudeHandler)
|
|
11
|
+
*
|
|
12
|
+
* @module runner/memory-mcp
|
|
13
|
+
*/
|
|
14
|
+
export declare const MEMORY_MCP_SOURCE = "\nimport { Pool } from \"pg\";\nimport { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { CallToolRequestSchema, ListToolsRequestSchema } from \"@modelcontextprotocol/sdk/types.js\";\n\nconst pool = new Pool({ connectionString: process.env.DATABASE_URL });\nconst AGENT_ID = process.env.MEMORY_AGENT_ID;\n\nconst server = new Server({ name: \"memory\", version: \"1.0.0\" }, { capabilities: { tools: {} } });\n\nserver.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [\n {\n name: \"list_memories\",\n description: \"List all memories for this agent. Returns names and a short preview. Optionally filter by type.\",\n inputSchema: { type: \"object\", properties: { type: { type: \"string\", enum: [\"user\", \"feedback\", \"project\", \"reference\"], description: \"Filter by memory type (optional)\" } } },\n },\n {\n name: \"search_memories\",\n description: \"Search memories by keyword across name and content. Use to find relevant past context.\",\n inputSchema: { type: \"object\", properties: { query: { type: \"string\" } }, required: [\"query\"] },\n },\n {\n name: \"get_memory\",\n description: \"Get the full content of a specific memory by name.\",\n inputSchema: { type: \"object\", properties: { name: { type: \"string\" } }, required: [\"name\"] },\n },\n ],\n}));\n\nfunction text(t) { return { content: [{ type: \"text\", text: t }] }; }\nfunction err(e) { return { content: [{ type: \"text\", text: String(e) }], isError: true }; }\n\nserver.setRequestHandler(CallToolRequestSchema, async (req) => {\n const { name, arguments: args } = req.params;\n const a = args ?? {};\n try {\n if (name === \"list_memories\") {\n const q = a.type\n ? \"SELECT type, name, LEFT(content, 300) as preview FROM memories WHERE agent_id = $1 AND type = $2 ORDER BY type, name\"\n : \"SELECT type, name, LEFT(content, 300) as preview FROM memories WHERE agent_id = $1 ORDER BY type, name\";\n const params = a.type ? [AGENT_ID, a.type] : [AGENT_ID];\n const r = await pool.query(q, params);\n if (r.rows.length === 0) return text(\"No memories found.\");\n return text(r.rows.map(row => \"[\" + row.type + \"] \" + row.name + \"\\n\" + row.preview.split(\"\\n\").slice(0, 3).join(\"\\n\")).join(\"\\n\\n\"));\n }\n if (name === \"search_memories\") {\n const r = await pool.query(\n \"SELECT type, name, content FROM memories WHERE agent_id = $1 AND (name ILIKE $2 OR content ILIKE $2) ORDER BY type, name\",\n [AGENT_ID, \"%\" + a.query + \"%\"]\n );\n if (r.rows.length === 0) return text(\"No memories found matching \\\"\" + a.query + \"\\\".\");\n return text(r.rows.map(row => \"[\" + row.type + \"] \" + row.name + \"\\n\\n\" + row.content).join(\"\\n\\n---\\n\\n\"));\n }\n if (name === \"get_memory\") {\n const r = await pool.query(\"SELECT type, name, content FROM memories WHERE agent_id = $1 AND name = $2\", [AGENT_ID, a.name]);\n if (r.rows.length === 0) return text(\"Memory \\\"\" + a.name + \"\\\" not found.\");\n const row = r.rows[0];\n return text(\"[\" + row.type + \"] \" + row.name + \"\\n\\n\" + row.content);\n }\n return err(\"Unknown tool: \" + name);\n } catch (e) { return err(e); }\n});\n\nasync function main() {\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\nmain().catch(console.error);\n";
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview Built-in memory MCP server source code.
|
|
4
|
+
*
|
|
5
|
+
* This TypeScript source is injected as an inline stdio MCP for every agent.
|
|
6
|
+
* It exposes three tools — list_memories, search_memories, get_memory — that
|
|
7
|
+
* query the agent's memory rows directly from Postgres.
|
|
8
|
+
*
|
|
9
|
+
* The script runs via `tsx` inside the runner container and receives:
|
|
10
|
+
* DATABASE_URL — Postgres connection string
|
|
11
|
+
* MEMORY_AGENT_ID — the agent's UUID (injected by ClaudeHandler)
|
|
12
|
+
*
|
|
13
|
+
* @module runner/memory-mcp
|
|
14
|
+
*/
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.MEMORY_MCP_SOURCE = void 0;
|
|
17
|
+
exports.MEMORY_MCP_SOURCE = `
|
|
18
|
+
import { Pool } from "pg";
|
|
19
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
20
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
21
|
+
import { CallToolRequestSchema, ListToolsRequestSchema } from "@modelcontextprotocol/sdk/types.js";
|
|
22
|
+
|
|
23
|
+
const pool = new Pool({ connectionString: process.env.DATABASE_URL });
|
|
24
|
+
const AGENT_ID = process.env.MEMORY_AGENT_ID;
|
|
25
|
+
|
|
26
|
+
const server = new Server({ name: "memory", version: "1.0.0" }, { capabilities: { tools: {} } });
|
|
27
|
+
|
|
28
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
29
|
+
tools: [
|
|
30
|
+
{
|
|
31
|
+
name: "list_memories",
|
|
32
|
+
description: "List all memories for this agent. Returns names and a short preview. Optionally filter by type.",
|
|
33
|
+
inputSchema: { type: "object", properties: { type: { type: "string", enum: ["user", "feedback", "project", "reference"], description: "Filter by memory type (optional)" } } },
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
name: "search_memories",
|
|
37
|
+
description: "Search memories by keyword across name and content. Use to find relevant past context.",
|
|
38
|
+
inputSchema: { type: "object", properties: { query: { type: "string" } }, required: ["query"] },
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
name: "get_memory",
|
|
42
|
+
description: "Get the full content of a specific memory by name.",
|
|
43
|
+
inputSchema: { type: "object", properties: { name: { type: "string" } }, required: ["name"] },
|
|
44
|
+
},
|
|
45
|
+
],
|
|
46
|
+
}));
|
|
47
|
+
|
|
48
|
+
function text(t) { return { content: [{ type: "text", text: t }] }; }
|
|
49
|
+
function err(e) { return { content: [{ type: "text", text: String(e) }], isError: true }; }
|
|
50
|
+
|
|
51
|
+
server.setRequestHandler(CallToolRequestSchema, async (req) => {
|
|
52
|
+
const { name, arguments: args } = req.params;
|
|
53
|
+
const a = args ?? {};
|
|
54
|
+
try {
|
|
55
|
+
if (name === "list_memories") {
|
|
56
|
+
const q = a.type
|
|
57
|
+
? "SELECT type, name, LEFT(content, 300) as preview FROM memories WHERE agent_id = $1 AND type = $2 ORDER BY type, name"
|
|
58
|
+
: "SELECT type, name, LEFT(content, 300) as preview FROM memories WHERE agent_id = $1 ORDER BY type, name";
|
|
59
|
+
const params = a.type ? [AGENT_ID, a.type] : [AGENT_ID];
|
|
60
|
+
const r = await pool.query(q, params);
|
|
61
|
+
if (r.rows.length === 0) return text("No memories found.");
|
|
62
|
+
return text(r.rows.map(row => "[" + row.type + "] " + row.name + "\\n" + row.preview.split("\\n").slice(0, 3).join("\\n")).join("\\n\\n"));
|
|
63
|
+
}
|
|
64
|
+
if (name === "search_memories") {
|
|
65
|
+
const r = await pool.query(
|
|
66
|
+
"SELECT type, name, content FROM memories WHERE agent_id = $1 AND (name ILIKE $2 OR content ILIKE $2) ORDER BY type, name",
|
|
67
|
+
[AGENT_ID, "%" + a.query + "%"]
|
|
68
|
+
);
|
|
69
|
+
if (r.rows.length === 0) return text("No memories found matching \\"" + a.query + "\\".");
|
|
70
|
+
return text(r.rows.map(row => "[" + row.type + "] " + row.name + "\\n\\n" + row.content).join("\\n\\n---\\n\\n"));
|
|
71
|
+
}
|
|
72
|
+
if (name === "get_memory") {
|
|
73
|
+
const r = await pool.query("SELECT type, name, content FROM memories WHERE agent_id = $1 AND name = $2", [AGENT_ID, a.name]);
|
|
74
|
+
if (r.rows.length === 0) return text("Memory \\"" + a.name + "\\" not found.");
|
|
75
|
+
const row = r.rows[0];
|
|
76
|
+
return text("[" + row.type + "] " + row.name + "\\n\\n" + row.content);
|
|
77
|
+
}
|
|
78
|
+
return err("Unknown tool: " + name);
|
|
79
|
+
} catch (e) { return err(e); }
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
async function main() {
|
|
83
|
+
const transport = new StdioServerTransport();
|
|
84
|
+
await server.connect(transport);
|
|
85
|
+
}
|
|
86
|
+
main().catch(console.error);
|
|
87
|
+
`;
|
|
88
|
+
//# sourceMappingURL=memory-mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-mcp.js","sourceRoot":"","sources":["../src/memory-mcp.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;;AAEU,QAAA,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsEhC,CAAC"}
|