@useconductor/conductor 1.0.0
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/.claude-plugin/marketplace.json +33 -0
- package/.claude-plugin/plugin.json +23 -0
- package/.eslintrc.json +23 -0
- package/.gitattributes +6 -0
- package/.github/FUNDING.yml +15 -0
- package/.github/ISSUE_TEMPLATE/bug_report.yml +91 -0
- package/.github/ISSUE_TEMPLATE/config.yml +8 -0
- package/.github/ISSUE_TEMPLATE/feature_request.yml +63 -0
- package/.github/ISSUE_TEMPLATE/plugin_request.yml +71 -0
- package/.github/README.md +13 -0
- package/.github/workflows/README.md +22 -0
- package/.github/workflows/auto-release.yml +112 -0
- package/.github/workflows/ci.yml +49 -0
- package/.github/workflows/claude-code-review.yml +44 -0
- package/.github/workflows/claude.yml +36 -0
- package/.github/workflows/sync-install.yml +47 -0
- package/.mcp.json +9 -0
- package/.prettierrc.json +7 -0
- package/C.png +0 -0
- package/CHANGELOG.md +74 -0
- package/CLAUDE.md +118 -0
- package/CONTRIBUTING.md +231 -0
- package/LICENSE +201 -0
- package/README.md +179 -0
- package/SECURITY.md +47 -0
- package/commands/conductor-setup.md +11 -0
- package/commands/conductor-status.md +7 -0
- package/dist/ai/base.d.ts +44 -0
- package/dist/ai/base.d.ts.map +1 -0
- package/dist/ai/base.js +47 -0
- package/dist/ai/base.js.map +1 -0
- package/dist/ai/claude.d.ts +11 -0
- package/dist/ai/claude.d.ts.map +1 -0
- package/dist/ai/claude.js +149 -0
- package/dist/ai/claude.js.map +1 -0
- package/dist/ai/gemini.d.ts +15 -0
- package/dist/ai/gemini.d.ts.map +1 -0
- package/dist/ai/gemini.js +156 -0
- package/dist/ai/gemini.js.map +1 -0
- package/dist/ai/maestro.d.ts +22 -0
- package/dist/ai/maestro.d.ts.map +1 -0
- package/dist/ai/maestro.js +142 -0
- package/dist/ai/maestro.js.map +1 -0
- package/dist/ai/manager.d.ts +47 -0
- package/dist/ai/manager.d.ts.map +1 -0
- package/dist/ai/manager.js +450 -0
- package/dist/ai/manager.js.map +1 -0
- package/dist/ai/ollama.d.ts +16 -0
- package/dist/ai/ollama.d.ts.map +1 -0
- package/dist/ai/ollama.js +151 -0
- package/dist/ai/ollama.js.map +1 -0
- package/dist/ai/openai.d.ts +11 -0
- package/dist/ai/openai.d.ts.map +1 -0
- package/dist/ai/openai.js +132 -0
- package/dist/ai/openai.js.map +1 -0
- package/dist/ai/openrouter.d.ts +11 -0
- package/dist/ai/openrouter.d.ts.map +1 -0
- package/dist/ai/openrouter.js +139 -0
- package/dist/ai/openrouter.js.map +1 -0
- package/dist/bot/slack.d.ts +17 -0
- package/dist/bot/slack.d.ts.map +1 -0
- package/dist/bot/slack.js +144 -0
- package/dist/bot/slack.js.map +1 -0
- package/dist/bot/telegram.d.ts +19 -0
- package/dist/bot/telegram.d.ts.map +1 -0
- package/dist/bot/telegram.js +157 -0
- package/dist/bot/telegram.js.map +1 -0
- package/dist/cli/commands/ai.d.ts +4 -0
- package/dist/cli/commands/ai.d.ts.map +1 -0
- package/dist/cli/commands/ai.js +161 -0
- package/dist/cli/commands/ai.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +18 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +213 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/init.d.ts +15 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +281 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/install.d.ts +16 -0
- package/dist/cli/commands/install.d.ts.map +1 -0
- package/dist/cli/commands/install.js +750 -0
- package/dist/cli/commands/install.js.map +1 -0
- package/dist/cli/commands/lifecycle.d.ts +4 -0
- package/dist/cli/commands/lifecycle.d.ts.map +1 -0
- package/dist/cli/commands/lifecycle.js +84 -0
- package/dist/cli/commands/lifecycle.js.map +1 -0
- package/dist/cli/commands/marketplace.d.ts +13 -0
- package/dist/cli/commands/marketplace.d.ts.map +1 -0
- package/dist/cli/commands/marketplace.js +197 -0
- package/dist/cli/commands/marketplace.js.map +1 -0
- package/dist/cli/commands/mcp.d.ts +6 -0
- package/dist/cli/commands/mcp.d.ts.map +1 -0
- package/dist/cli/commands/mcp.js +83 -0
- package/dist/cli/commands/mcp.js.map +1 -0
- package/dist/cli/commands/onboard.d.ts +10 -0
- package/dist/cli/commands/onboard.d.ts.map +1 -0
- package/dist/cli/commands/onboard.js +207 -0
- package/dist/cli/commands/onboard.js.map +1 -0
- package/dist/cli/commands/plugin-create.d.ts +13 -0
- package/dist/cli/commands/plugin-create.d.ts.map +1 -0
- package/dist/cli/commands/plugin-create.js +122 -0
- package/dist/cli/commands/plugin-create.js.map +1 -0
- package/dist/cli/commands/plugins.d.ts +5 -0
- package/dist/cli/commands/plugins.d.ts.map +1 -0
- package/dist/cli/commands/plugins.js +30 -0
- package/dist/cli/commands/plugins.js.map +1 -0
- package/dist/cli/commands/release.d.ts +13 -0
- package/dist/cli/commands/release.d.ts.map +1 -0
- package/dist/cli/commands/release.js +243 -0
- package/dist/cli/commands/release.js.map +1 -0
- package/dist/cli/commands/telegram.d.ts +3 -0
- package/dist/cli/commands/telegram.d.ts.map +1 -0
- package/dist/cli/commands/telegram.js +20 -0
- package/dist/cli/commands/telegram.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +402 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config/oauth.d.ts +8 -0
- package/dist/config/oauth.d.ts.map +1 -0
- package/dist/config/oauth.js +13 -0
- package/dist/config/oauth.js.map +1 -0
- package/dist/core/audit.d.ts +91 -0
- package/dist/core/audit.d.ts.map +1 -0
- package/dist/core/audit.js +233 -0
- package/dist/core/audit.js.map +1 -0
- package/dist/core/circuit-breaker.d.ts +56 -0
- package/dist/core/circuit-breaker.d.ts.map +1 -0
- package/dist/core/circuit-breaker.js +107 -0
- package/dist/core/circuit-breaker.js.map +1 -0
- package/dist/core/conductor.d.ts +44 -0
- package/dist/core/conductor.d.ts.map +1 -0
- package/dist/core/conductor.js +200 -0
- package/dist/core/conductor.js.map +1 -0
- package/dist/core/config.d.ts +66 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +86 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/database.d.ts +59 -0
- package/dist/core/database.d.ts.map +1 -0
- package/dist/core/database.js +342 -0
- package/dist/core/database.js.map +1 -0
- package/dist/core/errors.d.ts +231 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +254 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/health.d.ts +72 -0
- package/dist/core/health.d.ts.map +1 -0
- package/dist/core/health.js +116 -0
- package/dist/core/health.js.map +1 -0
- package/dist/core/interfaces.d.ts +62 -0
- package/dist/core/interfaces.d.ts.map +1 -0
- package/dist/core/interfaces.js +8 -0
- package/dist/core/interfaces.js.map +1 -0
- package/dist/core/logger.d.ts +15 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +30 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/rbac.d.ts +132 -0
- package/dist/core/rbac.d.ts.map +1 -0
- package/dist/core/rbac.js +230 -0
- package/dist/core/rbac.js.map +1 -0
- package/dist/core/retry.d.ts +22 -0
- package/dist/core/retry.d.ts.map +1 -0
- package/dist/core/retry.js +41 -0
- package/dist/core/retry.js.map +1 -0
- package/dist/core/webhooks.d.ts +92 -0
- package/dist/core/webhooks.d.ts.map +1 -0
- package/dist/core/webhooks.js +176 -0
- package/dist/core/webhooks.js.map +1 -0
- package/dist/core/zero-config.d.ts +22 -0
- package/dist/core/zero-config.d.ts.map +1 -0
- package/dist/core/zero-config.js +59 -0
- package/dist/core/zero-config.js.map +1 -0
- package/dist/dashboard/cli.d.ts +6 -0
- package/dist/dashboard/cli.d.ts.map +1 -0
- package/dist/dashboard/cli.js +42 -0
- package/dist/dashboard/cli.js.map +1 -0
- package/dist/dashboard/index.html +3426 -0
- package/dist/dashboard/server.d.ts +7 -0
- package/dist/dashboard/server.d.ts.map +1 -0
- package/dist/dashboard/server.js +1427 -0
- package/dist/dashboard/server.js.map +1 -0
- package/dist/mcp/server.d.ts +27 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +380 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/misc.d.ts +15 -0
- package/dist/mcp/tools/misc.d.ts.map +1 -0
- package/dist/mcp/tools/misc.js +49 -0
- package/dist/mcp/tools/misc.js.map +1 -0
- package/dist/plugins/builtin/calculator.d.ts +11 -0
- package/dist/plugins/builtin/calculator.d.ts.map +1 -0
- package/dist/plugins/builtin/calculator.js +166 -0
- package/dist/plugins/builtin/calculator.js.map +1 -0
- package/dist/plugins/builtin/colors.d.ts +15 -0
- package/dist/plugins/builtin/colors.d.ts.map +1 -0
- package/dist/plugins/builtin/colors.js +193 -0
- package/dist/plugins/builtin/colors.js.map +1 -0
- package/dist/plugins/builtin/cron.d.ts +40 -0
- package/dist/plugins/builtin/cron.d.ts.map +1 -0
- package/dist/plugins/builtin/cron.js +578 -0
- package/dist/plugins/builtin/cron.js.map +1 -0
- package/dist/plugins/builtin/crypto.d.ts +11 -0
- package/dist/plugins/builtin/crypto.d.ts.map +1 -0
- package/dist/plugins/builtin/crypto.js +83 -0
- package/dist/plugins/builtin/crypto.js.map +1 -0
- package/dist/plugins/builtin/database.d.ts +29 -0
- package/dist/plugins/builtin/database.d.ts.map +1 -0
- package/dist/plugins/builtin/database.js +230 -0
- package/dist/plugins/builtin/database.js.map +1 -0
- package/dist/plugins/builtin/docker.d.ts +12 -0
- package/dist/plugins/builtin/docker.d.ts.map +1 -0
- package/dist/plugins/builtin/docker.js +436 -0
- package/dist/plugins/builtin/docker.js.map +1 -0
- package/dist/plugins/builtin/fun.d.ts +11 -0
- package/dist/plugins/builtin/fun.d.ts.map +1 -0
- package/dist/plugins/builtin/fun.js +114 -0
- package/dist/plugins/builtin/fun.js.map +1 -0
- package/dist/plugins/builtin/gcal.d.ts +38 -0
- package/dist/plugins/builtin/gcal.d.ts.map +1 -0
- package/dist/plugins/builtin/gcal.js +280 -0
- package/dist/plugins/builtin/gcal.js.map +1 -0
- package/dist/plugins/builtin/gdrive.d.ts +26 -0
- package/dist/plugins/builtin/gdrive.d.ts.map +1 -0
- package/dist/plugins/builtin/gdrive.js +295 -0
- package/dist/plugins/builtin/gdrive.js.map +1 -0
- package/dist/plugins/builtin/github-actions.d.ts +38 -0
- package/dist/plugins/builtin/github-actions.d.ts.map +1 -0
- package/dist/plugins/builtin/github-actions.js +629 -0
- package/dist/plugins/builtin/github-actions.js.map +1 -0
- package/dist/plugins/builtin/github.d.ts +26 -0
- package/dist/plugins/builtin/github.d.ts.map +1 -0
- package/dist/plugins/builtin/github.js +800 -0
- package/dist/plugins/builtin/github.js.map +1 -0
- package/dist/plugins/builtin/gmail.d.ts +50 -0
- package/dist/plugins/builtin/gmail.d.ts.map +1 -0
- package/dist/plugins/builtin/gmail.js +445 -0
- package/dist/plugins/builtin/gmail.js.map +1 -0
- package/dist/plugins/builtin/hash.d.ts +11 -0
- package/dist/plugins/builtin/hash.d.ts.map +1 -0
- package/dist/plugins/builtin/hash.js +95 -0
- package/dist/plugins/builtin/hash.js.map +1 -0
- package/dist/plugins/builtin/homekit.d.ts +53 -0
- package/dist/plugins/builtin/homekit.d.ts.map +1 -0
- package/dist/plugins/builtin/homekit.js +341 -0
- package/dist/plugins/builtin/homekit.js.map +1 -0
- package/dist/plugins/builtin/index.d.ts +4 -0
- package/dist/plugins/builtin/index.d.ts.map +1 -0
- package/dist/plugins/builtin/index.js +96 -0
- package/dist/plugins/builtin/index.js.map +1 -0
- package/dist/plugins/builtin/jira.d.ts +50 -0
- package/dist/plugins/builtin/jira.d.ts.map +1 -0
- package/dist/plugins/builtin/jira.js +353 -0
- package/dist/plugins/builtin/jira.js.map +1 -0
- package/dist/plugins/builtin/linear.d.ts +35 -0
- package/dist/plugins/builtin/linear.d.ts.map +1 -0
- package/dist/plugins/builtin/linear.js +397 -0
- package/dist/plugins/builtin/linear.js.map +1 -0
- package/dist/plugins/builtin/lumen.d.ts +21 -0
- package/dist/plugins/builtin/lumen.d.ts.map +1 -0
- package/dist/plugins/builtin/lumen.js +404 -0
- package/dist/plugins/builtin/lumen.js.map +1 -0
- package/dist/plugins/builtin/memory.d.ts +22 -0
- package/dist/plugins/builtin/memory.d.ts.map +1 -0
- package/dist/plugins/builtin/memory.js +184 -0
- package/dist/plugins/builtin/memory.js.map +1 -0
- package/dist/plugins/builtin/n8n.d.ts +60 -0
- package/dist/plugins/builtin/n8n.d.ts.map +1 -0
- package/dist/plugins/builtin/n8n.js +519 -0
- package/dist/plugins/builtin/n8n.js.map +1 -0
- package/dist/plugins/builtin/network.d.ts +11 -0
- package/dist/plugins/builtin/network.d.ts.map +1 -0
- package/dist/plugins/builtin/network.js +88 -0
- package/dist/plugins/builtin/network.js.map +1 -0
- package/dist/plugins/builtin/notes.d.ts +47 -0
- package/dist/plugins/builtin/notes.d.ts.map +1 -0
- package/dist/plugins/builtin/notes.js +641 -0
- package/dist/plugins/builtin/notes.js.map +1 -0
- package/dist/plugins/builtin/notion.d.ts +47 -0
- package/dist/plugins/builtin/notion.d.ts.map +1 -0
- package/dist/plugins/builtin/notion.js +317 -0
- package/dist/plugins/builtin/notion.js.map +1 -0
- package/dist/plugins/builtin/shell.d.ts +12 -0
- package/dist/plugins/builtin/shell.d.ts.map +1 -0
- package/dist/plugins/builtin/shell.js +310 -0
- package/dist/plugins/builtin/shell.js.map +1 -0
- package/dist/plugins/builtin/slack.d.ts +31 -0
- package/dist/plugins/builtin/slack.d.ts.map +1 -0
- package/dist/plugins/builtin/slack.js +295 -0
- package/dist/plugins/builtin/slack.js.map +1 -0
- package/dist/plugins/builtin/spotify.d.ts +55 -0
- package/dist/plugins/builtin/spotify.d.ts.map +1 -0
- package/dist/plugins/builtin/spotify.js +623 -0
- package/dist/plugins/builtin/spotify.js.map +1 -0
- package/dist/plugins/builtin/stripe.d.ts +35 -0
- package/dist/plugins/builtin/stripe.d.ts.map +1 -0
- package/dist/plugins/builtin/stripe.js +376 -0
- package/dist/plugins/builtin/stripe.js.map +1 -0
- package/dist/plugins/builtin/system.d.ts +11 -0
- package/dist/plugins/builtin/system.d.ts.map +1 -0
- package/dist/plugins/builtin/system.js +91 -0
- package/dist/plugins/builtin/system.js.map +1 -0
- package/dist/plugins/builtin/text-tools.d.ts +11 -0
- package/dist/plugins/builtin/text-tools.d.ts.map +1 -0
- package/dist/plugins/builtin/text-tools.js +146 -0
- package/dist/plugins/builtin/text-tools.js.map +1 -0
- package/dist/plugins/builtin/timezone.d.ts +13 -0
- package/dist/plugins/builtin/timezone.d.ts.map +1 -0
- package/dist/plugins/builtin/timezone.js +164 -0
- package/dist/plugins/builtin/timezone.js.map +1 -0
- package/dist/plugins/builtin/todoist.d.ts +49 -0
- package/dist/plugins/builtin/todoist.d.ts.map +1 -0
- package/dist/plugins/builtin/todoist.js +540 -0
- package/dist/plugins/builtin/todoist.js.map +1 -0
- package/dist/plugins/builtin/translate.d.ts +11 -0
- package/dist/plugins/builtin/translate.d.ts.map +1 -0
- package/dist/plugins/builtin/translate.js +42 -0
- package/dist/plugins/builtin/translate.js.map +1 -0
- package/dist/plugins/builtin/url-tools.d.ts +11 -0
- package/dist/plugins/builtin/url-tools.d.ts.map +1 -0
- package/dist/plugins/builtin/url-tools.js +70 -0
- package/dist/plugins/builtin/url-tools.js.map +1 -0
- package/dist/plugins/builtin/vercel.d.ts +55 -0
- package/dist/plugins/builtin/vercel.d.ts.map +1 -0
- package/dist/plugins/builtin/vercel.js +514 -0
- package/dist/plugins/builtin/vercel.js.map +1 -0
- package/dist/plugins/builtin/weather.d.ts +13 -0
- package/dist/plugins/builtin/weather.d.ts.map +1 -0
- package/dist/plugins/builtin/weather.js +103 -0
- package/dist/plugins/builtin/weather.js.map +1 -0
- package/dist/plugins/builtin/x.d.ts +54 -0
- package/dist/plugins/builtin/x.d.ts.map +1 -0
- package/dist/plugins/builtin/x.js +402 -0
- package/dist/plugins/builtin/x.js.map +1 -0
- package/dist/plugins/manager.d.ts +77 -0
- package/dist/plugins/manager.d.ts.map +1 -0
- package/dist/plugins/manager.js +141 -0
- package/dist/plugins/manager.js.map +1 -0
- package/dist/plugins/validation.d.ts +18 -0
- package/dist/plugins/validation.d.ts.map +1 -0
- package/dist/plugins/validation.js +81 -0
- package/dist/plugins/validation.js.map +1 -0
- package/dist/security/auth.d.ts +23 -0
- package/dist/security/auth.d.ts.map +1 -0
- package/dist/security/auth.js +56 -0
- package/dist/security/auth.js.map +1 -0
- package/dist/security/keychain.d.ts +60 -0
- package/dist/security/keychain.d.ts.map +1 -0
- package/dist/security/keychain.js +213 -0
- package/dist/security/keychain.js.map +1 -0
- package/dist/utils/google-auth.d.ts +21 -0
- package/dist/utils/google-auth.d.ts.map +1 -0
- package/dist/utils/google-auth.js +135 -0
- package/dist/utils/google-auth.js.map +1 -0
- package/dist/utils/retry.d.ts +5 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +34 -0
- package/dist/utils/retry.js.map +1 -0
- package/docs/README.md +13 -0
- package/docs/api.md +210 -0
- package/docs/getting-started.md +100 -0
- package/docs/plugins.md +306 -0
- package/docs-site/.vitepress/config.ts +59 -0
- package/docs-site/README.md +12 -0
- package/docs-site/index.md +30 -0
- package/eslint.config.js +29 -0
- package/install.ps1 +334 -0
- package/install.sh +1119 -0
- package/local-install.sh +304 -0
- package/package.json +90 -0
- package/packages/README.md +11 -0
- package/packages/plugin-sdk/README.md +12 -0
- package/packages/plugin-sdk/package.json +22 -0
- package/packages/plugin-sdk/src/README.md +11 -0
- package/packages/plugin-sdk/src/index.ts +191 -0
- package/sdks/README.md +26 -0
- package/sdks/csharp/ConductorClient.cs +65 -0
- package/sdks/csharp/README.md +11 -0
- package/sdks/go/README.md +11 -0
- package/sdks/go/conductor.go +257 -0
- package/sdks/java/ConductorClient.java +27 -0
- package/sdks/java/README.md +11 -0
- package/sdks/php/README.md +11 -0
- package/sdks/php/src/Client.php +72 -0
- package/sdks/python/README.md +12 -0
- package/sdks/python/conductor/__init__.py +227 -0
- package/sdks/python/pyproject.toml +30 -0
- package/sdks/ruby/README.md +11 -0
- package/sdks/ruby/lib/conductor.rb +46 -0
- package/sdks/rust/Cargo.toml +14 -0
- package/sdks/rust/README.md +11 -0
- package/sdks/swift/README.md +11 -0
- package/sdks/swift/Sources/Conductor/ConductorClient.swift +65 -0
- package/skills/conductor-mcp/SKILL.md +38 -0
- package/src/README.md +20 -0
- package/src/ai/README.md +18 -0
- package/src/ai/base.ts +93 -0
- package/src/ai/claude.ts +162 -0
- package/src/ai/gemini.ts +188 -0
- package/src/ai/maestro.ts +168 -0
- package/src/ai/manager.ts +537 -0
- package/src/ai/ollama.ts +186 -0
- package/src/ai/openai.ts +147 -0
- package/src/ai/openrouter.ts +152 -0
- package/src/bot/README.md +12 -0
- package/src/bot/slack.ts +164 -0
- package/src/bot/telegram.ts +185 -0
- package/src/cli/README.md +24 -0
- package/src/cli/commands/README.md +20 -0
- package/src/cli/commands/ai.ts +170 -0
- package/src/cli/commands/doctor.ts +221 -0
- package/src/cli/commands/init.ts +348 -0
- package/src/cli/commands/install.ts +792 -0
- package/src/cli/commands/lifecycle.ts +95 -0
- package/src/cli/commands/marketplace.ts +253 -0
- package/src/cli/commands/mcp.ts +92 -0
- package/src/cli/commands/onboard.ts +248 -0
- package/src/cli/commands/plugin-create.ts +130 -0
- package/src/cli/commands/plugins.ts +36 -0
- package/src/cli/commands/release.ts +251 -0
- package/src/cli/commands/telegram.ts +25 -0
- package/src/cli/index.ts +450 -0
- package/src/config/README.md +11 -0
- package/src/config/oauth.ts +26 -0
- package/src/core/README.md +22 -0
- package/src/core/audit.ts +291 -0
- package/src/core/circuit-breaker.ts +129 -0
- package/src/core/conductor.ts +240 -0
- package/src/core/config.ts +149 -0
- package/src/core/database.ts +411 -0
- package/src/core/errors.ts +275 -0
- package/src/core/health.ts +159 -0
- package/src/core/interfaces.ts +75 -0
- package/src/core/logger.ts +33 -0
- package/src/core/rbac.ts +321 -0
- package/src/core/retry.ts +61 -0
- package/src/core/webhooks.ts +234 -0
- package/src/core/zero-config.ts +72 -0
- package/src/dashboard/README.md +15 -0
- package/src/dashboard/cli.ts +48 -0
- package/src/dashboard/index.html +3426 -0
- package/src/dashboard/server.ts +1544 -0
- package/src/mcp/README.md +20 -0
- package/src/mcp/server.ts +475 -0
- package/src/mcp/tools/README.md +11 -0
- package/src/mcp/tools/misc.ts +61 -0
- package/src/plugins/README.md +28 -0
- package/src/plugins/builtin/README.md +23 -0
- package/src/plugins/builtin/calculator.ts +178 -0
- package/src/plugins/builtin/colors.ts +201 -0
- package/src/plugins/builtin/cron.ts +649 -0
- package/src/plugins/builtin/crypto.ts +85 -0
- package/src/plugins/builtin/database.ts +235 -0
- package/src/plugins/builtin/docker.ts +426 -0
- package/src/plugins/builtin/fun.ts +118 -0
- package/src/plugins/builtin/gcal.ts +305 -0
- package/src/plugins/builtin/gdrive.ts +326 -0
- package/src/plugins/builtin/github-actions.ts +666 -0
- package/src/plugins/builtin/github.ts +912 -0
- package/src/plugins/builtin/gmail.ts +492 -0
- package/src/plugins/builtin/hash.ts +98 -0
- package/src/plugins/builtin/homekit.ts +389 -0
- package/src/plugins/builtin/index.ts +116 -0
- package/src/plugins/builtin/jira.ts +380 -0
- package/src/plugins/builtin/linear.ts +448 -0
- package/src/plugins/builtin/lumen.ts +497 -0
- package/src/plugins/builtin/memory.ts +200 -0
- package/src/plugins/builtin/n8n.ts +565 -0
- package/src/plugins/builtin/network.ts +92 -0
- package/src/plugins/builtin/notes.ts +689 -0
- package/src/plugins/builtin/notion.ts +348 -0
- package/src/plugins/builtin/shell.ts +334 -0
- package/src/plugins/builtin/slack.ts +327 -0
- package/src/plugins/builtin/spotify.ts +665 -0
- package/src/plugins/builtin/stripe.ts +388 -0
- package/src/plugins/builtin/system.ts +93 -0
- package/src/plugins/builtin/text-tools.ts +150 -0
- package/src/plugins/builtin/timezone.ts +173 -0
- package/src/plugins/builtin/todoist.ts +625 -0
- package/src/plugins/builtin/translate.ts +47 -0
- package/src/plugins/builtin/url-tools.ts +73 -0
- package/src/plugins/builtin/vercel.ts +546 -0
- package/src/plugins/builtin/weather.ts +112 -0
- package/src/plugins/builtin/x.ts +440 -0
- package/src/plugins/manager.ts +213 -0
- package/src/plugins/validation.ts +94 -0
- package/src/security/README.md +12 -0
- package/src/security/auth.ts +72 -0
- package/src/security/keychain.ts +226 -0
- package/src/utils/README.md +12 -0
- package/src/utils/google-auth.ts +159 -0
- package/src/utils/retry.ts +41 -0
- package/test-all.mjs +1256 -0
- package/test.mjs +633 -0
- package/tests/README.md +19 -0
- package/tests/calculator.test.ts +54 -0
- package/tests/docker.test.ts +42 -0
- package/tests/load.test.ts +129 -0
- package/tests/mcp.test.ts +14 -0
- package/tests/shell.test.ts +42 -0
- package/tsconfig.json +21 -0
- package/vitest.config.ts +14 -0
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Conductor Python SDK
|
|
3
|
+
|
|
4
|
+
The official Python client for Conductor — the AI Tool Hub.
|
|
5
|
+
Connect to any Conductor MCP server and call 100+ tools programmatically.
|
|
6
|
+
|
|
7
|
+
Installation:
|
|
8
|
+
pip install conductor-python
|
|
9
|
+
|
|
10
|
+
Usage:
|
|
11
|
+
from conductor import Conductor
|
|
12
|
+
|
|
13
|
+
client = Conductor()
|
|
14
|
+
result = client.tools.call("shell_list_dir", {"path": "."})
|
|
15
|
+
print(result)
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
20
|
+
import json
|
|
21
|
+
import subprocess
|
|
22
|
+
import threading
|
|
23
|
+
from dataclasses import dataclass, field
|
|
24
|
+
from typing import Any, Optional
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
@dataclass
|
|
28
|
+
class ToolResult:
|
|
29
|
+
"""Result from a tool call."""
|
|
30
|
+
success: bool
|
|
31
|
+
data: Any
|
|
32
|
+
error: Optional[str] = None
|
|
33
|
+
latency_ms: Optional[int] = None
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
@dataclass
|
|
37
|
+
class HealthStatus:
|
|
38
|
+
"""Health check response."""
|
|
39
|
+
status: str
|
|
40
|
+
version: str
|
|
41
|
+
uptime: int
|
|
42
|
+
components: list[dict] = field(default_factory=list)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class ConductorError(Exception):
|
|
46
|
+
"""Base exception for Conductor errors."""
|
|
47
|
+
pass
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class CircuitOpenError(ConductorError):
|
|
51
|
+
"""Raised when a tool's circuit breaker is open."""
|
|
52
|
+
pass
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class Conductor:
|
|
56
|
+
"""
|
|
57
|
+
Conductor client.
|
|
58
|
+
|
|
59
|
+
Connects to a Conductor MCP server via stdio subprocess.
|
|
60
|
+
All tool calls are automatically retried on transient failures.
|
|
61
|
+
|
|
62
|
+
Args:
|
|
63
|
+
command: Path to the conductor binary (default: "conductor")
|
|
64
|
+
args: Additional arguments (default: ["mcp", "start"])
|
|
65
|
+
timeout: Default timeout in seconds (default: 60)
|
|
66
|
+
max_retries: Maximum retry attempts (default: 3)
|
|
67
|
+
|
|
68
|
+
Example:
|
|
69
|
+
>>> from conductor import Conductor
|
|
70
|
+
>>> client = Conductor()
|
|
71
|
+
>>> result = client.tools.call("shell_list_dir", {"path": "."})
|
|
72
|
+
>>> print(result.data)
|
|
73
|
+
"""
|
|
74
|
+
|
|
75
|
+
def __init__(
|
|
76
|
+
self,
|
|
77
|
+
command: str = "conductor",
|
|
78
|
+
args: list[str] | None = None,
|
|
79
|
+
timeout: int = 60,
|
|
80
|
+
max_retries: int = 3,
|
|
81
|
+
):
|
|
82
|
+
self._command = command
|
|
83
|
+
self._args = args or ["mcp", "start"]
|
|
84
|
+
self._timeout = timeout
|
|
85
|
+
self._max_retries = max_retries
|
|
86
|
+
self._process: Optional[subprocess.Popen] = None
|
|
87
|
+
self._request_id = 0
|
|
88
|
+
self._lock = threading.Lock()
|
|
89
|
+
|
|
90
|
+
@property
|
|
91
|
+
def tools(self) -> ToolClient:
|
|
92
|
+
"""Access the tool client."""
|
|
93
|
+
return ToolClient(self)
|
|
94
|
+
|
|
95
|
+
@property
|
|
96
|
+
def health(self) -> HealthClient:
|
|
97
|
+
"""Access the health client."""
|
|
98
|
+
return HealthClient(self)
|
|
99
|
+
|
|
100
|
+
def _ensure_process(self) -> subprocess.Popen:
|
|
101
|
+
"""Start the Conductor subprocess if not already running."""
|
|
102
|
+
if self._process is None or self._process.poll() is not None:
|
|
103
|
+
self._process = subprocess.Popen(
|
|
104
|
+
[self._command] + self._args,
|
|
105
|
+
stdin=subprocess.PIPE,
|
|
106
|
+
stdout=subprocess.PIPE,
|
|
107
|
+
stderr=subprocess.DEVNULL,
|
|
108
|
+
text=True,
|
|
109
|
+
)
|
|
110
|
+
return self._process
|
|
111
|
+
|
|
112
|
+
def _send_request(self, method: str, params: dict[str, Any] | None = None) -> Any:
|
|
113
|
+
"""Send a JSON-RPC request to the MCP server."""
|
|
114
|
+
import time
|
|
115
|
+
|
|
116
|
+
with self._lock:
|
|
117
|
+
self._request_id += 1
|
|
118
|
+
request_id = self._request_id
|
|
119
|
+
|
|
120
|
+
request = {
|
|
121
|
+
"jsonrpc": "2.0",
|
|
122
|
+
"id": request_id,
|
|
123
|
+
"method": method,
|
|
124
|
+
"params": params or {},
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
last_error: Optional[Exception] = None
|
|
128
|
+
|
|
129
|
+
for attempt in range(self._max_retries):
|
|
130
|
+
try:
|
|
131
|
+
process = self._ensure_process()
|
|
132
|
+
start = time.monotonic()
|
|
133
|
+
|
|
134
|
+
# Send request
|
|
135
|
+
process.stdin.write(json.dumps(request) + "\n") # type: ignore
|
|
136
|
+
process.stdin.flush() # type: ignore
|
|
137
|
+
|
|
138
|
+
# Read response
|
|
139
|
+
response_line = process.stdout.readline() # type: ignore
|
|
140
|
+
if not response_line:
|
|
141
|
+
raise ConductorError("Connection closed")
|
|
142
|
+
|
|
143
|
+
response = json.loads(response_line)
|
|
144
|
+
latency_ms = int((time.monotonic() - start) * 1000)
|
|
145
|
+
|
|
146
|
+
if "error" in response:
|
|
147
|
+
error_msg = response["error"].get("message", "Unknown error")
|
|
148
|
+
if "circuit" in error_msg.lower():
|
|
149
|
+
raise CircuitOpenError(error_msg)
|
|
150
|
+
raise ConductorError(error_msg)
|
|
151
|
+
|
|
152
|
+
return response.get("result"), latency_ms
|
|
153
|
+
|
|
154
|
+
except (BrokenPipeError, ConnectionResetError, OSError) as e:
|
|
155
|
+
last_error = e
|
|
156
|
+
self._process = None # Force restart on next call
|
|
157
|
+
time.sleep(min(2 ** attempt * 0.5, 5)) # Exponential backoff
|
|
158
|
+
continue
|
|
159
|
+
|
|
160
|
+
raise ConductorError(f"Failed after {self._max_retries} retries: {last_error}")
|
|
161
|
+
|
|
162
|
+
def close(self) -> None:
|
|
163
|
+
"""Close the connection to Conductor."""
|
|
164
|
+
if self._process and self._process.poll() is None:
|
|
165
|
+
self._process.terminate()
|
|
166
|
+
self._process.wait(timeout=5)
|
|
167
|
+
self._process = None
|
|
168
|
+
|
|
169
|
+
def __enter__(self) -> Conductor:
|
|
170
|
+
return self
|
|
171
|
+
|
|
172
|
+
def __exit__(self, *args: Any) -> None:
|
|
173
|
+
self.close()
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
class ToolClient:
|
|
177
|
+
"""Tool calling client."""
|
|
178
|
+
|
|
179
|
+
def __init__(self, conductor: Conductor):
|
|
180
|
+
self._conductor = conductor
|
|
181
|
+
|
|
182
|
+
def call(self, name: str, args: dict[str, Any] | None = None) -> ToolResult:
|
|
183
|
+
"""
|
|
184
|
+
Call a Conductor tool.
|
|
185
|
+
|
|
186
|
+
Args:
|
|
187
|
+
name: Tool name (e.g. "shell_list_dir", "github_repo")
|
|
188
|
+
args: Tool arguments
|
|
189
|
+
|
|
190
|
+
Returns:
|
|
191
|
+
ToolResult with success status and data
|
|
192
|
+
|
|
193
|
+
Example:
|
|
194
|
+
>>> result = client.tools.call("shell_list_dir", {"path": "."})
|
|
195
|
+
>>> if result.success:
|
|
196
|
+
... print(result.data)
|
|
197
|
+
"""
|
|
198
|
+
try:
|
|
199
|
+
data, latency_ms = self._conductor._send_request(
|
|
200
|
+
"tools/call",
|
|
201
|
+
{"name": name, "arguments": args or {}},
|
|
202
|
+
)
|
|
203
|
+
return ToolResult(success=True, data=data, latency_ms=latency_ms)
|
|
204
|
+
except ConductorError as e:
|
|
205
|
+
return ToolResult(success=False, data=None, error=str(e))
|
|
206
|
+
|
|
207
|
+
def list(self) -> list[dict[str, Any]]:
|
|
208
|
+
"""List all available tools."""
|
|
209
|
+
result, _ = self._conductor._send_request("tools/list")
|
|
210
|
+
return result.get("tools", [])
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
class HealthClient:
|
|
214
|
+
"""Health check client."""
|
|
215
|
+
|
|
216
|
+
def __init__(self, conductor: Conductor):
|
|
217
|
+
self._conductor = conductor
|
|
218
|
+
|
|
219
|
+
def check(self) -> HealthStatus:
|
|
220
|
+
"""Get health status."""
|
|
221
|
+
result, _ = self._conductor._send_request("conductor_health")
|
|
222
|
+
return HealthStatus(
|
|
223
|
+
status=result.get("status", "unknown"),
|
|
224
|
+
version=result.get("version", "unknown"),
|
|
225
|
+
uptime=result.get("uptime", 0),
|
|
226
|
+
components=result.get("components", []),
|
|
227
|
+
)
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=68.0", "wheel"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "conductor-python"
|
|
7
|
+
version = "1.0.0"
|
|
8
|
+
description = "Official Python SDK for Conductor — The AI Tool Hub"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
license = {text = "Apache-2.0"}
|
|
11
|
+
requires-python = ">=3.10"
|
|
12
|
+
authors = [
|
|
13
|
+
{name = "Conductor Team", email = "hello@conductor.dev"},
|
|
14
|
+
]
|
|
15
|
+
keywords = ["ai", "mcp", "tools", "automation", "agent"]
|
|
16
|
+
classifiers = [
|
|
17
|
+
"Development Status :: 4 - Beta",
|
|
18
|
+
"Intended Audience :: Developers",
|
|
19
|
+
"License :: OSI Approved :: Apache Software License",
|
|
20
|
+
"Programming Language :: Python :: 3",
|
|
21
|
+
"Programming Language :: Python :: 3.10",
|
|
22
|
+
"Programming Language :: Python :: 3.11",
|
|
23
|
+
"Programming Language :: Python :: 3.12",
|
|
24
|
+
"Typing :: Typed",
|
|
25
|
+
]
|
|
26
|
+
|
|
27
|
+
[project.urls]
|
|
28
|
+
Homepage = "https://github.com/conductor/conductor"
|
|
29
|
+
Documentation = "https://docs.conductor.dev"
|
|
30
|
+
Repository = "https://github.com/conductor/conductor"
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# sdks/ruby
|
|
2
|
+
|
|
3
|
+
Ruby SDK for Conductor. Provides a Ruby client for interacting with the Conductor MCP server.
|
|
4
|
+
|
|
5
|
+
## Contents
|
|
6
|
+
|
|
7
|
+
- `lib/` - Ruby gem source code
|
|
8
|
+
|
|
9
|
+
## Architecture
|
|
10
|
+
|
|
11
|
+
This SDK enables Ruby applications to communicate with Conductor via the MCP protocol. Install as a gem to use Conductor tools from Ruby scripts, Rails applications, or Rake tasks.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Conductor Ruby SDK — The AI Tool Hub
|
|
4
|
+
#
|
|
5
|
+
# gem install conductor-ruby
|
|
6
|
+
#
|
|
7
|
+
# require 'conductor'
|
|
8
|
+
#
|
|
9
|
+
# client = Conductor::Client.new
|
|
10
|
+
# result = client.tools.call('shell_list_dir', path: '.')
|
|
11
|
+
# puts result.data
|
|
12
|
+
|
|
13
|
+
module Conductor
|
|
14
|
+
class Error < StandardError; end
|
|
15
|
+
class CircuitOpenError < Error; end
|
|
16
|
+
|
|
17
|
+
class Client
|
|
18
|
+
def initialize(command: 'conductor', args: %w[mcp start], timeout: 60, max_retries: 3)
|
|
19
|
+
@command = command
|
|
20
|
+
@args = args
|
|
21
|
+
@timeout = timeout
|
|
22
|
+
@max_retries = max_retries
|
|
23
|
+
@mutex = Mutex.new
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def tools
|
|
27
|
+
@tools ||= ToolClient.new(self)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def close
|
|
31
|
+
# Kill subprocess if running
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
class ToolClient
|
|
36
|
+
def initialize(client)
|
|
37
|
+
@client = client
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def call(name, args = {})
|
|
41
|
+
# Send JSON-RPC request to conductor subprocess
|
|
42
|
+
# Implement retry with exponential backoff
|
|
43
|
+
raise NotImplementedError, 'TODO: Implement stdio MCP protocol'
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
[package]
|
|
2
|
+
name = "conductor-rs"
|
|
3
|
+
version = "1.0.0"
|
|
4
|
+
edition = "2021"
|
|
5
|
+
description = "Official Rust SDK for Conductor — The AI Tool Hub"
|
|
6
|
+
license = "Apache-2.0"
|
|
7
|
+
repository = "https://github.com/conductor/conductor"
|
|
8
|
+
keywords = ["ai", "mcp", "tools", "automation"]
|
|
9
|
+
|
|
10
|
+
[dependencies]
|
|
11
|
+
serde = { version = "1", features = ["derive"] }
|
|
12
|
+
serde_json = "1"
|
|
13
|
+
tokio = { version = "1", features = ["full"] }
|
|
14
|
+
thiserror = "1"
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# sdks/rust
|
|
2
|
+
|
|
3
|
+
Rust SDK for Conductor. Provides a Rust client for interacting with the Conductor MCP server.
|
|
4
|
+
|
|
5
|
+
## Contents
|
|
6
|
+
|
|
7
|
+
- `Cargo.toml` - Rust package manifest and dependencies
|
|
8
|
+
|
|
9
|
+
## Architecture
|
|
10
|
+
|
|
11
|
+
This SDK enables Rust applications to communicate with Conductor via the MCP protocol. Add as a Cargo dependency to use Conductor tools from Rust services and applications.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# sdks/swift
|
|
2
|
+
|
|
3
|
+
Swift SDK for Conductor. Provides a Swift client for interacting with the Conductor MCP server.
|
|
4
|
+
|
|
5
|
+
## Contents
|
|
6
|
+
|
|
7
|
+
- `Sources/` - Swift package source code
|
|
8
|
+
|
|
9
|
+
## Architecture
|
|
10
|
+
|
|
11
|
+
This SDK enables Swift applications to communicate with Conductor via the MCP protocol. Use as a Swift Package Manager dependency to invoke Conductor tools from macOS, iOS, or server-side Swift applications.
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import Foundation
|
|
2
|
+
|
|
3
|
+
/// Conductor Swift SDK — The AI Tool Hub
|
|
4
|
+
///
|
|
5
|
+
/// Swift Package Manager:
|
|
6
|
+
/// .package(url: "https://github.com/conductor/conductor", from: "1.0.0")
|
|
7
|
+
///
|
|
8
|
+
/// Usage:
|
|
9
|
+
/// let client = ConductorClient()
|
|
10
|
+
/// let result = try await client.tools.call("shell_list_dir", args: ["path": "."])
|
|
11
|
+
/// print(result.data)
|
|
12
|
+
|
|
13
|
+
public actor ConductorClient {
|
|
14
|
+
private let command: String
|
|
15
|
+
private let args: [String]
|
|
16
|
+
private let timeout: TimeInterval
|
|
17
|
+
private let maxRetries: Int
|
|
18
|
+
private var process: Process?
|
|
19
|
+
private var requestId: Int = 0
|
|
20
|
+
|
|
21
|
+
public init(
|
|
22
|
+
command: String = "conductor",
|
|
23
|
+
args: [String] = ["mcp", "start"],
|
|
24
|
+
timeout: TimeInterval = 60,
|
|
25
|
+
maxRetries: Int = 3
|
|
26
|
+
) {
|
|
27
|
+
self.command = command
|
|
28
|
+
self.args = args
|
|
29
|
+
self.timeout = timeout
|
|
30
|
+
self.maxRetries = maxRetries
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
public var tools: ToolClient {
|
|
34
|
+
ToolClient(client: self)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
public func close() {
|
|
38
|
+
process?.terminate()
|
|
39
|
+
process = nil
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
deinit {
|
|
43
|
+
process?.terminate()
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
public struct ToolClient {
|
|
48
|
+
private let client: ConductorClient
|
|
49
|
+
|
|
50
|
+
fileprivate init(client: ConductorClient) {
|
|
51
|
+
self.client = client
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
public func call(_ name: String, args: [String: Any]? = nil) async throws -> ToolResult {
|
|
55
|
+
// TODO: Implement stdio MCP protocol client
|
|
56
|
+
fatalError("Not implemented yet")
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
public struct ToolResult {
|
|
61
|
+
public let success: Bool
|
|
62
|
+
public let data: [String: Any]?
|
|
63
|
+
public let error: String?
|
|
64
|
+
public let latencyMs: Int?
|
|
65
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Conductor Integration Hub
|
|
2
|
+
|
|
3
|
+
Conductor connects Claude Code to 25+ external services through MCP tools.
|
|
4
|
+
|
|
5
|
+
## When to use Conductor tools
|
|
6
|
+
|
|
7
|
+
- **GitHub** — list repos, create issues, check PRs, trigger Actions, manage releases
|
|
8
|
+
- **Gmail** — read, send, search, organize emails
|
|
9
|
+
- **Google Calendar** — check schedules, create events, find free time
|
|
10
|
+
- **Google Drive** — search, read, upload files
|
|
11
|
+
- **Slack** — send messages, read channels
|
|
12
|
+
- **Notion** — create pages, query databases, update notes
|
|
13
|
+
- **Spotify** — control playback, search tracks, manage playlists
|
|
14
|
+
- **Vercel** — check deployments, view project status
|
|
15
|
+
- **HomeKit** — control smart home devices, check sensors
|
|
16
|
+
- **Weather** — get current conditions and forecasts
|
|
17
|
+
- **System** — check CPU, memory, disk usage
|
|
18
|
+
- **Network** — ping hosts, check connectivity
|
|
19
|
+
- **n8n** — trigger automation workflows
|
|
20
|
+
- **Calculator, Crypto, Hash, URL tools** — utility operations
|
|
21
|
+
|
|
22
|
+
## Setup
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
npm install && npm run build
|
|
26
|
+
conductor mcp setup
|
|
27
|
+
|
|
28
|
+
# Configure services
|
|
29
|
+
conductor google # Gmail, Calendar, Drive (OAuth)
|
|
30
|
+
conductor slack setup # Slack tokens
|
|
31
|
+
conductor plugins enable github
|
|
32
|
+
conductor plugins enable notion
|
|
33
|
+
conductor plugins enable spotify
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Tool naming
|
|
37
|
+
|
|
38
|
+
All tools are prefixed with `conductor_`. Use `conductor_status` to check which plugins are active before attempting service-specific operations.
|
package/src/README.md
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# src
|
|
2
|
+
|
|
3
|
+
Root source directory for the Conductor MCP server. Contains all application modules organized by concern.
|
|
4
|
+
|
|
5
|
+
## Contents
|
|
6
|
+
|
|
7
|
+
- `core/` - Central orchestration, config, database, and plugin management
|
|
8
|
+
- `mcp/` - Model Context Protocol server implementation
|
|
9
|
+
- `plugins/` - Plugin system with builtin and external plugin support
|
|
10
|
+
- `cli/` - Command-line interface built with Commander
|
|
11
|
+
- `dashboard/` - Web dashboard (Express + single-page app)
|
|
12
|
+
- `ai/` - Multi-provider AI manager (Claude, OpenAI, Gemini, Ollama)
|
|
13
|
+
- `bot/` - Telegram bot and Slack Bolt integrations
|
|
14
|
+
- `security/` - Authentication, keychain, and encryption utilities
|
|
15
|
+
- `config/` - OAuth and configuration helpers
|
|
16
|
+
- `utils/` - Shared utility functions
|
|
17
|
+
|
|
18
|
+
## Architecture
|
|
19
|
+
|
|
20
|
+
This is the top-level source tree. All modules are imported from here and compiled to `dist/` via `tsx`. The codebase uses ESM (`"type": "module"`) with `Node16` module resolution — all imports must use `.js` extensions even for `.ts` source files.
|
package/src/ai/README.md
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# src/ai
|
|
2
|
+
|
|
3
|
+
Multi-provider AI manager for Conductor. Supports Claude, OpenAI, Gemini, Ollama, and OpenRouter.
|
|
4
|
+
|
|
5
|
+
## Contents
|
|
6
|
+
|
|
7
|
+
- `manager.ts` - `AIManager` orchestrating multiple AI providers
|
|
8
|
+
- `base.ts` - Base provider interface and shared logic
|
|
9
|
+
- `claude.ts` - Anthropic Claude provider
|
|
10
|
+
- `openai.ts` - OpenAI provider
|
|
11
|
+
- `gemini.ts` - Google Gemini provider
|
|
12
|
+
- `ollama.ts` - Ollama (local) provider
|
|
13
|
+
- `openrouter.ts` - OpenRouter meta-provider
|
|
14
|
+
- `maestro.ts` - AI orchestration and routing logic
|
|
15
|
+
|
|
16
|
+
## Architecture
|
|
17
|
+
|
|
18
|
+
`AIManager` abstracts over multiple AI providers, allowing users to configure and switch between them. Each provider implements a common interface. The `maestro.ts` module handles intelligent routing and fallback between providers. Used by the MCP server for tool responses and by the bot for proactive reasoning.
|
package/src/ai/base.ts
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { PluginTool } from '../plugins/manager.js';
|
|
2
|
+
|
|
3
|
+
export interface AIToolCall {
|
|
4
|
+
id: string;
|
|
5
|
+
name: string;
|
|
6
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
7
|
+
arguments: Record<string, any>;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface AIMessage {
|
|
11
|
+
role: 'user' | 'assistant' | 'system' | 'tool';
|
|
12
|
+
content: string;
|
|
13
|
+
tool_calls?: AIToolCall[];
|
|
14
|
+
tool_call_id?: string;
|
|
15
|
+
name?: string; // Best practice for tool responses
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface AIResponse {
|
|
19
|
+
content: string;
|
|
20
|
+
model: string;
|
|
21
|
+
tokens_used?: number;
|
|
22
|
+
finish_reason?: string;
|
|
23
|
+
tool_calls?: AIToolCall[];
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface AIProviderConfig {
|
|
27
|
+
apiKey?: string;
|
|
28
|
+
endpoint?: string;
|
|
29
|
+
model?: string;
|
|
30
|
+
maxTokens?: number;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export abstract class AIProvider {
|
|
34
|
+
protected config: AIProviderConfig;
|
|
35
|
+
|
|
36
|
+
constructor(config: AIProviderConfig) {
|
|
37
|
+
this.config = config;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** Send a message and get a response. */
|
|
41
|
+
abstract complete(messages: AIMessage[], tools?: PluginTool[]): Promise<AIResponse>;
|
|
42
|
+
|
|
43
|
+
/** Stream a response (for real-time output). */
|
|
44
|
+
abstract stream(messages: AIMessage[], tools?: PluginTool[]): AsyncGenerator<string>;
|
|
45
|
+
|
|
46
|
+
/** Test if the provider is configured correctly. */
|
|
47
|
+
abstract test(): Promise<boolean>;
|
|
48
|
+
|
|
49
|
+
/** Get provider display name. */
|
|
50
|
+
abstract getName(): string;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Parse user intent from a natural-language message.
|
|
54
|
+
* Used by the Telegram bot to route commands to plugins.
|
|
55
|
+
*/
|
|
56
|
+
async parseIntent(userMessage: string): Promise<any> {
|
|
57
|
+
const systemPrompt = `You are a command parser for Conductor, an integration hub.
|
|
58
|
+
Parse user messages into structured intents.
|
|
59
|
+
|
|
60
|
+
Available intents:
|
|
61
|
+
- install_plugin: { plugin: string }
|
|
62
|
+
- list_plugins: {}
|
|
63
|
+
- enable_plugin: { plugin: string }
|
|
64
|
+
- disable_plugin: { plugin: string }
|
|
65
|
+
- execute_action: { plugin: string, action: string, params: object }
|
|
66
|
+
- get_status: {}
|
|
67
|
+
- help: {}
|
|
68
|
+
- chat: { message: string }
|
|
69
|
+
|
|
70
|
+
Examples:
|
|
71
|
+
"install github" → { "type": "install_plugin", "plugin": "github" }
|
|
72
|
+
"list my repos" → { "type": "execute_action", "plugin": "github", "action": "list_repos" }
|
|
73
|
+
"show status" → { "type": "get_status" }
|
|
74
|
+
"hello" → { "type": "chat", "message": "hello" }
|
|
75
|
+
|
|
76
|
+
Respond with JSON only. If unclear, use type "chat". Always use English for any string values.`;
|
|
77
|
+
|
|
78
|
+
const response = await this.complete([
|
|
79
|
+
{ role: 'system', content: systemPrompt },
|
|
80
|
+
{ role: 'user', content: userMessage },
|
|
81
|
+
]);
|
|
82
|
+
|
|
83
|
+
try {
|
|
84
|
+
const jsonMatch = response.content.match(/\{[\s\S]*\}/);
|
|
85
|
+
if (jsonMatch) {
|
|
86
|
+
return JSON.parse(jsonMatch[0]);
|
|
87
|
+
}
|
|
88
|
+
return { type: 'chat', message: userMessage };
|
|
89
|
+
} catch {
|
|
90
|
+
return { type: 'chat', message: userMessage };
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|