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,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview LCS-based line diff utility.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from the agent detail page so it can be imported in Node
|
|
5
|
+
* test environments without pulling in React/Next.js dependencies.
|
|
6
|
+
*
|
|
7
|
+
* @module web/lib/diff
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/** A single line in a diff result, annotated with its change type. */
|
|
11
|
+
export type DiffLine = { type: 'same' | 'add' | 'remove'; line: string };
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Computes a line-level diff between two text strings using the
|
|
15
|
+
* Longest Common Subsequence algorithm.
|
|
16
|
+
*
|
|
17
|
+
* @param {string} oldText - The original text.
|
|
18
|
+
* @param {string} newText - The updated text.
|
|
19
|
+
* @returns {DiffLine[]} Ordered diff entries annotated as same/add/remove.
|
|
20
|
+
*/
|
|
21
|
+
export function lineDiff(oldText: string, newText: string): DiffLine[] {
|
|
22
|
+
const a = oldText.split('\n');
|
|
23
|
+
const b = newText.split('\n');
|
|
24
|
+
const m = a.length, n = b.length;
|
|
25
|
+
// Build LCS table
|
|
26
|
+
const dp: number[][] = Array.from({ length: m + 1 }, () => new Array(n + 1).fill(0));
|
|
27
|
+
for (let i = 1; i <= m; i++)
|
|
28
|
+
for (let j = 1; j <= n; j++)
|
|
29
|
+
dp[i][j] = a[i - 1] === b[j - 1] ? dp[i - 1][j - 1] + 1 : Math.max(dp[i - 1][j], dp[i][j - 1]);
|
|
30
|
+
// Trace back
|
|
31
|
+
const result: DiffLine[] = [];
|
|
32
|
+
let i = m, j = n;
|
|
33
|
+
while (i > 0 || j > 0) {
|
|
34
|
+
if (i > 0 && j > 0 && a[i - 1] === b[j - 1]) {
|
|
35
|
+
result.unshift({ type: 'same', line: a[i - 1] }); i--; j--;
|
|
36
|
+
} else if (j > 0 && (i === 0 || dp[i][j - 1] >= dp[i - 1][j])) {
|
|
37
|
+
result.unshift({ type: 'add', line: b[j - 1] }); j--;
|
|
38
|
+
} else {
|
|
39
|
+
result.unshift({ type: 'remove', line: a[i - 1] }); i--;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return result;
|
|
43
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview MCP server config masking utilities.
|
|
3
|
+
*
|
|
4
|
+
* Sensitive values in MCP configs (env vars for stdio, headers for sse/http)
|
|
5
|
+
* must never be returned to the client in plaintext. This module provides
|
|
6
|
+
* masking for API GET responses and merge logic for PATCH requests so that
|
|
7
|
+
* a client sending back "********" placeholders does not overwrite real values.
|
|
8
|
+
*
|
|
9
|
+
* @module web/lib/mcp-mask
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import type { McpServer, McpServerConfig } from '@slackhive/shared';
|
|
13
|
+
|
|
14
|
+
const MASK = '********';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Returns a copy of the MCP config with all secret values replaced by MASK.
|
|
18
|
+
* - stdio: masks each value in `config.env`
|
|
19
|
+
* - sse/http: masks each value in `config.headers`
|
|
20
|
+
*
|
|
21
|
+
* @param {McpServerConfig} config - Raw config from DB.
|
|
22
|
+
* @returns {McpServerConfig} Masked config safe for API responses.
|
|
23
|
+
*/
|
|
24
|
+
export function maskMcpConfig(config: McpServerConfig): McpServerConfig {
|
|
25
|
+
const c = config as unknown as Record<string, unknown>;
|
|
26
|
+
if (c.env && typeof c.env === 'object') {
|
|
27
|
+
const masked: Record<string, string> = {};
|
|
28
|
+
for (const key of Object.keys(c.env as Record<string, string>)) {
|
|
29
|
+
masked[key] = MASK;
|
|
30
|
+
}
|
|
31
|
+
// envRefs and tsSource are not secrets — pass through unchanged
|
|
32
|
+
return { ...c, env: masked } as McpServerConfig;
|
|
33
|
+
}
|
|
34
|
+
if (c.headers && typeof c.headers === 'object') {
|
|
35
|
+
const masked: Record<string, string> = {};
|
|
36
|
+
for (const key of Object.keys(c.headers as Record<string, string>)) {
|
|
37
|
+
masked[key] = MASK;
|
|
38
|
+
}
|
|
39
|
+
return { ...c, headers: masked } as McpServerConfig;
|
|
40
|
+
}
|
|
41
|
+
return config;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Returns a copy of the MCP server with its config secrets masked.
|
|
46
|
+
*
|
|
47
|
+
* @param {McpServer} server - Full server record from DB.
|
|
48
|
+
* @returns {McpServer} Server safe for API responses.
|
|
49
|
+
*/
|
|
50
|
+
export function maskMcpServer(server: McpServer): McpServer {
|
|
51
|
+
return { ...server, config: maskMcpConfig(server.config) };
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Merges an incoming (possibly masked) config from a PATCH request with the
|
|
56
|
+
* existing config stored in the DB. Any value equal to MASK is replaced with
|
|
57
|
+
* the corresponding existing value, preserving secrets the client never saw.
|
|
58
|
+
*
|
|
59
|
+
* @param {McpServerConfig} existing - Current config from DB (unmasked).
|
|
60
|
+
* @param {McpServerConfig} incoming - Config from PATCH body (may contain MASK values).
|
|
61
|
+
* @returns {McpServerConfig} Merged config safe to write back to DB.
|
|
62
|
+
*/
|
|
63
|
+
export function mergeMcpConfig(existing: McpServerConfig, incoming: McpServerConfig): McpServerConfig {
|
|
64
|
+
const e = existing as unknown as Record<string, unknown>;
|
|
65
|
+
const i = incoming as unknown as Record<string, unknown>;
|
|
66
|
+
|
|
67
|
+
if (i.env && typeof i.env === 'object' && e.env && typeof e.env === 'object') {
|
|
68
|
+
const merged: Record<string, string> = { ...(e.env as Record<string, string>) };
|
|
69
|
+
for (const [key, val] of Object.entries(i.env as Record<string, string>)) {
|
|
70
|
+
merged[key] = val === MASK ? (merged[key] ?? val) : val;
|
|
71
|
+
}
|
|
72
|
+
// Remove keys not present in incoming (user deleted them)
|
|
73
|
+
for (const key of Object.keys(merged)) {
|
|
74
|
+
if (!(key in (i.env as Record<string, string>))) delete merged[key];
|
|
75
|
+
}
|
|
76
|
+
return { ...i, env: merged } as McpServerConfig;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if (i.headers && typeof i.headers === 'object' && e.headers && typeof e.headers === 'object') {
|
|
80
|
+
const merged: Record<string, string> = { ...(e.headers as Record<string, string>) };
|
|
81
|
+
for (const [key, val] of Object.entries(i.headers as Record<string, string>)) {
|
|
82
|
+
merged[key] = val === MASK ? (merged[key] ?? val) : val;
|
|
83
|
+
}
|
|
84
|
+
for (const key of Object.keys(merged)) {
|
|
85
|
+
if (!(key in (i.headers as Record<string, string>))) delete merged[key];
|
|
86
|
+
}
|
|
87
|
+
return { ...i, headers: merged } as McpServerConfig;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return incoming;
|
|
91
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview React portal — renders children into document.body.
|
|
5
|
+
* Ensures modals escape any parent overflow/transform constraints.
|
|
6
|
+
*
|
|
7
|
+
* @module web/lib/portal
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { useEffect, useState } from 'react';
|
|
11
|
+
import { createPortal } from 'react-dom';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Renders children into document.body via a React portal.
|
|
15
|
+
*
|
|
16
|
+
* @param {{ children: React.ReactNode }} props
|
|
17
|
+
*/
|
|
18
|
+
export function Portal({ children }: { children: React.ReactNode }) {
|
|
19
|
+
const [mounted, setMounted] = useState(false);
|
|
20
|
+
useEffect(() => { setMounted(true); }, []);
|
|
21
|
+
if (!mounted) return null;
|
|
22
|
+
return createPortal(children, document.body);
|
|
23
|
+
}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Built-in skill templates for bootstrapping new agents.
|
|
3
|
+
*
|
|
4
|
+
* When creating a new agent, users choose a template that provides starter
|
|
5
|
+
* skill files. These are seeded into the `skills` table and compiled into
|
|
6
|
+
* the agent's initial CLAUDE.md.
|
|
7
|
+
*
|
|
8
|
+
* Templates:
|
|
9
|
+
* - `blank` — Minimal identity skill only
|
|
10
|
+
* - `data-analyst` — SQL/data analysis (based on NLQ bot patterns)
|
|
11
|
+
* - `writer` — Content generation and summarization
|
|
12
|
+
* - `developer` — Code review and development assistance
|
|
13
|
+
*
|
|
14
|
+
* @module web/lib/skill-templates
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import type { Agent, SkillTemplate } from '@slackhive/shared';
|
|
18
|
+
|
|
19
|
+
/** A skill file definition for seeding. */
|
|
20
|
+
interface SkillSeed {
|
|
21
|
+
category: string;
|
|
22
|
+
filename: string;
|
|
23
|
+
content: string;
|
|
24
|
+
sortOrder: number;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Map of template name → function that generates initial skill seeds.
|
|
29
|
+
* Each function receives the newly created agent for name/persona interpolation.
|
|
30
|
+
*/
|
|
31
|
+
export const SKILL_TEMPLATES: Record<SkillTemplate, (agent: Agent) => SkillSeed[]> = {
|
|
32
|
+
|
|
33
|
+
blank: (agent) => [
|
|
34
|
+
{
|
|
35
|
+
category: '00-core',
|
|
36
|
+
filename: 'identity.md',
|
|
37
|
+
sortOrder: 0,
|
|
38
|
+
content: `# ${agent.name}
|
|
39
|
+
|
|
40
|
+
${agent.persona ?? `You are ${agent.name}, a helpful AI assistant.`}
|
|
41
|
+
|
|
42
|
+
${agent.description ? `## What you do\n\n${agent.description}` : ''}
|
|
43
|
+
`,
|
|
44
|
+
},
|
|
45
|
+
],
|
|
46
|
+
|
|
47
|
+
'data-analyst': (agent) => [
|
|
48
|
+
{
|
|
49
|
+
category: '00-core',
|
|
50
|
+
filename: 'identity.md',
|
|
51
|
+
sortOrder: 0,
|
|
52
|
+
content: `# ${agent.name}
|
|
53
|
+
|
|
54
|
+
${agent.persona ?? `You are ${agent.name}, a data analyst AI agent.`}
|
|
55
|
+
|
|
56
|
+
Users ask business questions in plain English. You investigate the data,
|
|
57
|
+
run queries when needed, and deliver clear, concise insights.
|
|
58
|
+
`,
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
category: '00-core',
|
|
62
|
+
filename: 'workflow.md',
|
|
63
|
+
sortOrder: 1,
|
|
64
|
+
content: `# Workflow
|
|
65
|
+
|
|
66
|
+
1. **Understand** the question — identify metrics, dimensions, and time range
|
|
67
|
+
2. **Discover** schema if needed — describe tables, find columns
|
|
68
|
+
3. **Plan** the query — identify joins, aggregations, filters
|
|
69
|
+
4. **Execute** — run the query and validate results
|
|
70
|
+
5. **Respond** — present findings clearly with numbers from actual query results
|
|
71
|
+
|
|
72
|
+
## Rules
|
|
73
|
+
- Always run queries before stating numbers — never guess
|
|
74
|
+
- Validate JOIN fan-out before returning aggregations
|
|
75
|
+
- If a query returns no results, investigate why before concluding
|
|
76
|
+
`,
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
category: '00-core',
|
|
80
|
+
filename: 'response-format.md',
|
|
81
|
+
sortOrder: 2,
|
|
82
|
+
content: `# Response Format
|
|
83
|
+
|
|
84
|
+
- Lead with the answer, then supporting data
|
|
85
|
+
- Use Slack formatting: *bold* for metrics, \`code\` for table/column names
|
|
86
|
+
- Format numbers: 1,234 (comma-separated), percentages with 1 decimal
|
|
87
|
+
- Use tables for comparisons (pipe-delimited Markdown)
|
|
88
|
+
- Keep responses concise — no filler phrases
|
|
89
|
+
`,
|
|
90
|
+
},
|
|
91
|
+
],
|
|
92
|
+
|
|
93
|
+
writer: (agent) => [
|
|
94
|
+
{
|
|
95
|
+
category: '00-core',
|
|
96
|
+
filename: 'identity.md',
|
|
97
|
+
sortOrder: 0,
|
|
98
|
+
content: `# ${agent.name}
|
|
99
|
+
|
|
100
|
+
${agent.persona ?? `You are ${agent.name}, a content writing and summarization AI agent.`}
|
|
101
|
+
|
|
102
|
+
You help teams generate clear, well-structured written content: summaries,
|
|
103
|
+
announcements, reports, Slack messages, and documentation.
|
|
104
|
+
`,
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
category: '00-core',
|
|
108
|
+
filename: 'style-guide.md',
|
|
109
|
+
sortOrder: 1,
|
|
110
|
+
content: `# Writing Style Guide
|
|
111
|
+
|
|
112
|
+
- Be clear and concise — cut unnecessary words
|
|
113
|
+
- Active voice over passive voice
|
|
114
|
+
- Use bullet points for lists of 3+ items
|
|
115
|
+
- Match the tone to the audience (technical vs. executive)
|
|
116
|
+
- For Slack: use *bold* for key points, avoid walls of text
|
|
117
|
+
`,
|
|
118
|
+
},
|
|
119
|
+
],
|
|
120
|
+
|
|
121
|
+
developer: (agent) => [
|
|
122
|
+
{
|
|
123
|
+
category: '00-core',
|
|
124
|
+
filename: 'identity.md',
|
|
125
|
+
sortOrder: 0,
|
|
126
|
+
content: `# ${agent.name}
|
|
127
|
+
|
|
128
|
+
${agent.persona ?? `You are ${agent.name}, a software development AI agent.`}
|
|
129
|
+
|
|
130
|
+
You help with code review, debugging, architecture decisions, and
|
|
131
|
+
implementation guidance. You prioritize correctness, security, and readability.
|
|
132
|
+
`,
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
category: '00-core',
|
|
136
|
+
filename: 'code-standards.md',
|
|
137
|
+
sortOrder: 1,
|
|
138
|
+
content: `# Code Standards
|
|
139
|
+
|
|
140
|
+
- Prefer simple, explicit code over clever abstractions
|
|
141
|
+
- Always consider security implications (injection, XSS, auth)
|
|
142
|
+
- Write tests for non-trivial logic
|
|
143
|
+
- Follow the existing patterns in the codebase
|
|
144
|
+
- Explain why, not just what
|
|
145
|
+
`,
|
|
146
|
+
},
|
|
147
|
+
],
|
|
148
|
+
};
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Slack app manifest generator for the agent onboarding wizard.
|
|
3
|
+
*
|
|
4
|
+
* Generates a Slack app manifest JSON that users can paste directly into
|
|
5
|
+
* api.slack.com/apps to create a new Slack app with the correct permissions
|
|
6
|
+
* and configuration for a Claude Code agent.
|
|
7
|
+
*
|
|
8
|
+
* @module web/lib/slack-manifest
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type { SlackAppManifest } from '@slackhive/shared';
|
|
12
|
+
import { DEFAULT_SLACK_BOT_SCOPES, BOSS_ADDITIONAL_SCOPES } from '@slackhive/shared';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Generates a complete Slack app manifest for an agent.
|
|
16
|
+
*
|
|
17
|
+
* The manifest is pre-configured with:
|
|
18
|
+
* - The agent's display name and description
|
|
19
|
+
* - All required OAuth bot scopes
|
|
20
|
+
* - Socket Mode enabled (required for the Bolt App)
|
|
21
|
+
* - Subscriptions to app_mention, message.im, and member_joined_channel events
|
|
22
|
+
*
|
|
23
|
+
* @param {object} opts - Manifest generation options.
|
|
24
|
+
* @param {string} opts.name - Agent display name.
|
|
25
|
+
* @param {string} [opts.description] - Short description of the agent.
|
|
26
|
+
* @param {boolean} [opts.isBoss] - Whether this is the boss agent (adds extra scopes).
|
|
27
|
+
* @returns {SlackAppManifest} Complete Slack app manifest object.
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* const manifest = generateSlackManifest({ name: 'GILFOYLE', description: 'Data analyst' });
|
|
31
|
+
* // Copy JSON to api.slack.com/apps → Create from Manifest
|
|
32
|
+
*/
|
|
33
|
+
export function generateSlackManifest(opts: {
|
|
34
|
+
name: string;
|
|
35
|
+
description?: string;
|
|
36
|
+
isBoss?: boolean;
|
|
37
|
+
}): SlackAppManifest {
|
|
38
|
+
const scopes = opts.isBoss
|
|
39
|
+
? [...DEFAULT_SLACK_BOT_SCOPES, ...BOSS_ADDITIONAL_SCOPES]
|
|
40
|
+
: [...DEFAULT_SLACK_BOT_SCOPES];
|
|
41
|
+
|
|
42
|
+
// Deduplicate scopes
|
|
43
|
+
const uniqueScopes = [...new Set(scopes)];
|
|
44
|
+
|
|
45
|
+
return {
|
|
46
|
+
display_information: {
|
|
47
|
+
name: opts.name,
|
|
48
|
+
description: opts.description ?? `${opts.name} — Claude Code AI agent`,
|
|
49
|
+
background_color: '#1a1a1a',
|
|
50
|
+
},
|
|
51
|
+
features: {
|
|
52
|
+
bot_user: {
|
|
53
|
+
display_name: opts.name,
|
|
54
|
+
always_online: true,
|
|
55
|
+
},
|
|
56
|
+
app_home: {
|
|
57
|
+
home_tab_enabled: false,
|
|
58
|
+
messages_tab_enabled: true,
|
|
59
|
+
messages_tab_read_only_enabled: false,
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
oauth_config: {
|
|
63
|
+
scopes: {
|
|
64
|
+
bot: uniqueScopes,
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
settings: {
|
|
68
|
+
event_subscriptions: {
|
|
69
|
+
bot_events: [
|
|
70
|
+
'app_mention',
|
|
71
|
+
'message.channels',
|
|
72
|
+
'message.groups',
|
|
73
|
+
'message.im',
|
|
74
|
+
'member_joined_channel',
|
|
75
|
+
],
|
|
76
|
+
},
|
|
77
|
+
interactivity: {
|
|
78
|
+
is_enabled: false,
|
|
79
|
+
},
|
|
80
|
+
socket_mode_enabled: true,
|
|
81
|
+
token_rotation_enabled: false,
|
|
82
|
+
org_deploy_enabled: false,
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Next.js middleware — protects all routes with auth.
|
|
3
|
+
*
|
|
4
|
+
* Redirects unauthenticated users to /login.
|
|
5
|
+
* Skips: /login, /api/auth/*, static assets.
|
|
6
|
+
*
|
|
7
|
+
* Uses crypto.subtle (Edge Runtime compatible) for HMAC verification.
|
|
8
|
+
*
|
|
9
|
+
* @module web/middleware
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { NextResponse } from 'next/server';
|
|
13
|
+
import type { NextRequest } from 'next/server';
|
|
14
|
+
|
|
15
|
+
if (process.env.NODE_ENV === 'production' && !process.env.CI && !process.env.AUTH_SECRET) {
|
|
16
|
+
throw new Error('AUTH_SECRET must be set in production. See .env.example.');
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const AUTH_SECRET = process.env.AUTH_SECRET || 'change-this-secret-in-production';
|
|
20
|
+
const COOKIE_NAME = 'auth_session';
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Verifies HMAC signature using Edge-compatible crypto.subtle.
|
|
24
|
+
*
|
|
25
|
+
* @param {string} data - The base64url-encoded payload.
|
|
26
|
+
* @param {string} sig - The base64url-encoded signature.
|
|
27
|
+
* @returns {Promise<boolean>} True if valid.
|
|
28
|
+
*/
|
|
29
|
+
async function verifyHmac(data: string, sig: string): Promise<boolean> {
|
|
30
|
+
const enc = new TextEncoder();
|
|
31
|
+
const key = await crypto.subtle.importKey(
|
|
32
|
+
'raw', enc.encode(AUTH_SECRET), { name: 'HMAC', hash: 'SHA-256' }, false, ['sign']
|
|
33
|
+
);
|
|
34
|
+
const signature = await crypto.subtle.sign('HMAC', key, enc.encode(data));
|
|
35
|
+
const expected = btoa(String.fromCharCode(...new Uint8Array(signature)))
|
|
36
|
+
.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
|
|
37
|
+
return sig === expected;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Middleware function — checks auth cookie on every non-public route.
|
|
42
|
+
*
|
|
43
|
+
* @param {NextRequest} req - Incoming request.
|
|
44
|
+
* @returns {Promise<NextResponse>} Response or redirect.
|
|
45
|
+
*/
|
|
46
|
+
export async function middleware(req: NextRequest): Promise<NextResponse> {
|
|
47
|
+
const cookie = req.cookies.get(COOKIE_NAME)?.value;
|
|
48
|
+
|
|
49
|
+
if (!cookie) {
|
|
50
|
+
return NextResponse.redirect(new URL('/login', req.url));
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const parts = cookie.split('.');
|
|
54
|
+
if (parts.length !== 2) {
|
|
55
|
+
return NextResponse.redirect(new URL('/login', req.url));
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const valid = await verifyHmac(parts[0], parts[1]);
|
|
59
|
+
if (!valid) {
|
|
60
|
+
return NextResponse.redirect(new URL('/login', req.url));
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return NextResponse.next();
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export const config = {
|
|
67
|
+
matcher: ['/((?!login|api/auth|_next/static|_next/image|favicon\\.ico|logo\\.svg).*)'],
|
|
68
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2022",
|
|
4
|
+
"lib": ["dom", "dom.iterable", "esnext"],
|
|
5
|
+
"allowJs": true,
|
|
6
|
+
"skipLibCheck": true,
|
|
7
|
+
"strict": true,
|
|
8
|
+
"noEmit": true,
|
|
9
|
+
"esModuleInterop": true,
|
|
10
|
+
"module": "esnext",
|
|
11
|
+
"moduleResolution": "bundler",
|
|
12
|
+
"resolveJsonModule": true,
|
|
13
|
+
"isolatedModules": true,
|
|
14
|
+
"jsx": "preserve",
|
|
15
|
+
"incremental": true,
|
|
16
|
+
"plugins": [{ "name": "next" }],
|
|
17
|
+
"paths": {
|
|
18
|
+
"@/*": ["./src/*"]
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
|
|
22
|
+
"exclude": ["node_modules"]
|
|
23
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { defineConfig } from 'vitest/config';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
|
|
4
|
+
export default defineConfig({
|
|
5
|
+
test: {
|
|
6
|
+
environment: 'node',
|
|
7
|
+
globals: true,
|
|
8
|
+
coverage: {
|
|
9
|
+
provider: 'v8',
|
|
10
|
+
reporter: ['text', 'lcov'],
|
|
11
|
+
include: ['src/lib/**', 'src/app/agents/**'],
|
|
12
|
+
exclude: ['src/app/agents/[slug]/page.tsx'], // UI component — tested separately
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
resolve: {
|
|
16
|
+
alias: {
|
|
17
|
+
'@': path.resolve(__dirname, './src'),
|
|
18
|
+
'@slackhive/shared': path.resolve(__dirname, '../../packages/shared/src'),
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
});
|