@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
package/local-install.sh
ADDED
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# ============================================================
|
|
3
|
+
# Conductor Local Install Script — by TheAlxLabs
|
|
4
|
+
# ============================================================
|
|
5
|
+
# Use this if you have modified the code and want to install
|
|
6
|
+
# your local version globally.
|
|
7
|
+
#
|
|
8
|
+
# bash local-install.sh
|
|
9
|
+
# ============================================================
|
|
10
|
+
set -euo pipefail
|
|
11
|
+
IFS=$'\n\t'
|
|
12
|
+
|
|
13
|
+
# ── Terminal colours ──────────────────────────────────────────
|
|
14
|
+
if [[ -t 1 ]] && command -v tput &>/dev/null; then
|
|
15
|
+
RED=$(tput setaf 1) GREEN=$(tput setaf 2) YELLOW=$(tput setaf 3)
|
|
16
|
+
BLUE=$(tput setaf 4) CYAN=$(tput setaf 6) BOLD=$(tput bold)
|
|
17
|
+
DIM=$(tput dim 2>/dev/null || printf '') ITALIC=''
|
|
18
|
+
RESET=$(tput sgr0)
|
|
19
|
+
else
|
|
20
|
+
RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m'
|
|
21
|
+
BLUE='\033[0;34m' CYAN='\033[0;36m' BOLD='\033[1m'
|
|
22
|
+
DIM='\033[2m' ITALIC='\033[3m' RESET='\033[0m'
|
|
23
|
+
fi
|
|
24
|
+
|
|
25
|
+
info() { echo -e " ${BLUE}▶${RESET} $*"; }
|
|
26
|
+
success() { echo -e " ${GREEN}✓${RESET} $*"; }
|
|
27
|
+
warn() { echo -e " ${YELLOW}⚠${RESET} $*" >&2; }
|
|
28
|
+
fail() { echo -e "\n ${RED}✗ FATAL:${RESET} $*\n" >&2; exit 1; }
|
|
29
|
+
hint() { echo -e " ${DIM}${ITALIC}$*${RESET}"; }
|
|
30
|
+
|
|
31
|
+
step() {
|
|
32
|
+
echo ""
|
|
33
|
+
echo -e " ${BOLD}${CYAN}┌──────────────────────────────────────────────${RESET}"
|
|
34
|
+
echo -e " ${BOLD}${CYAN}│ $*${RESET}"
|
|
35
|
+
echo -e " ${BOLD}${CYAN}└──────────────────────────────────────────────${RESET}"
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
# ── Cleanup ───────────────────────────────────────────────────
|
|
39
|
+
_TMPFILES=()
|
|
40
|
+
cleanup() {
|
|
41
|
+
for f in "${_TMPFILES[@]:-}"; do
|
|
42
|
+
if [[ -f "$f" ]]; then
|
|
43
|
+
dd if=/dev/zero of="$f" bs=1 count="$(wc -c < "$f")" 2>/dev/null || true
|
|
44
|
+
rm -f "$f" 2>/dev/null || true
|
|
45
|
+
fi
|
|
46
|
+
done
|
|
47
|
+
}
|
|
48
|
+
trap cleanup EXIT
|
|
49
|
+
|
|
50
|
+
# ── Prompt helpers ────────────────────────────────────────────
|
|
51
|
+
prompt_yn() {
|
|
52
|
+
local prompt="$1" varname="$2" default="${3:-y}"
|
|
53
|
+
local hint_str="Y/n"; [[ "$default" == "n" ]] && hint_str="y/N"
|
|
54
|
+
printf " ${CYAN}?${RESET} ${BOLD}%s${RESET} ${DIM}[%s]${RESET}: " "$prompt" "$hint_str" >/dev/tty
|
|
55
|
+
local _val; IFS= read -r _val </dev/tty || _val=""
|
|
56
|
+
_val="${_val:-$default}"
|
|
57
|
+
if [[ "$_val" =~ ^[Yy] ]]; then printf -v "$varname" '%s' "true"
|
|
58
|
+
else printf -v "$varname" '%s' "false"; fi
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
prompt_input() {
|
|
62
|
+
local prompt="$1" varname="$2" default="${3:-}"
|
|
63
|
+
if [[ -n "$default" ]]; then
|
|
64
|
+
printf " ${CYAN}?${RESET} ${BOLD}%s${RESET} ${DIM}[%s]${RESET}: " "$prompt" "$default" >/dev/tty
|
|
65
|
+
else
|
|
66
|
+
printf " ${CYAN}?${RESET} ${BOLD}%s${RESET}: " "$prompt" >/dev/tty
|
|
67
|
+
fi
|
|
68
|
+
local _val; IFS= read -r _val </dev/tty || _val=""
|
|
69
|
+
printf -v "$varname" '%s' "${_val:-$default}"
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
prompt_secret() {
|
|
73
|
+
local prompt="$1" varname="$2"
|
|
74
|
+
printf " ${CYAN}?${RESET} ${BOLD}%s${RESET}: " "$prompt" >/dev/tty
|
|
75
|
+
local _sec; IFS= read -rs _sec </dev/tty || _sec=""
|
|
76
|
+
echo "" >/dev/tty
|
|
77
|
+
printf -v "$varname" '%s' "$_sec"
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
# ── Config helpers ────────────────────────────────────────────
|
|
81
|
+
CONFIG_DIR="$HOME/.conductor"
|
|
82
|
+
CONFIG_FILE="$CONFIG_DIR/config.json"
|
|
83
|
+
|
|
84
|
+
ensure_dirs() {
|
|
85
|
+
mkdir -p "$CONFIG_DIR"/{keychain,plugins,logs}
|
|
86
|
+
chmod 700 "$CONFIG_DIR/keychain"
|
|
87
|
+
chmod 700 "$CONFIG_DIR"
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
update_config() {
|
|
91
|
+
local json_str="$1"
|
|
92
|
+
local tmp_file; tmp_file=$(mktemp "${CONFIG_FILE}.XXXXXX")
|
|
93
|
+
_TMPFILES+=("$tmp_file")
|
|
94
|
+
python3 -c "
|
|
95
|
+
import json, sys, os
|
|
96
|
+
config_path, tmp_path, new_json = sys.argv[1], sys.argv[2], sys.argv[3]
|
|
97
|
+
existing = {}
|
|
98
|
+
if os.path.exists(config_path):
|
|
99
|
+
try:
|
|
100
|
+
with open(config_path) as f: existing = json.load(f)
|
|
101
|
+
except Exception: pass
|
|
102
|
+
def merge(a, b):
|
|
103
|
+
for k, v in b.items():
|
|
104
|
+
if k in a and isinstance(a[k], dict) and isinstance(v, dict): merge(a[k], v)
|
|
105
|
+
else: a[k] = v
|
|
106
|
+
return a
|
|
107
|
+
with open(tmp_path, 'w') as f:
|
|
108
|
+
json.dump(merge(existing, json.loads(new_json)), f, indent=2)
|
|
109
|
+
f.flush(); os.fsync(f.fileno())
|
|
110
|
+
os.replace(tmp_path, config_path)
|
|
111
|
+
" "$CONFIG_FILE" "$tmp_file" "$json_str"
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
# Pipes value via stdin — never exposed in process list (ps aux fix)
|
|
115
|
+
save_cred_val() {
|
|
116
|
+
local service="$1" key="$2" value="$3"
|
|
117
|
+
printf '%s' "$value" | node - "$CONFIG_DIR" "$service" "$key" << 'JSEOF'
|
|
118
|
+
const crypto=require('crypto'),fs=require('fs'),path=require('path'),os=require('os'),{execSync}=require('child_process');
|
|
119
|
+
const [,,configDir,service,key]=process.argv;
|
|
120
|
+
let val='';
|
|
121
|
+
try{val=fs.readFileSync('/dev/stdin','utf8').trim();}catch{process.exit(1);}
|
|
122
|
+
const kd=path.join(configDir,'keychain'); fs.mkdirSync(kd,{recursive:true,mode:0o700});
|
|
123
|
+
function ms(){
|
|
124
|
+
for(const s of['/etc/machine-id','/var/lib/dbus/machine-id'])try{const d=fs.readFileSync(s,'utf8').trim();if(d)return d}catch{}
|
|
125
|
+
if(process.platform==='darwin')try{const o=execSync("ioreg -rd1 -c IOPlatformExpertDevice|awk '/IOPlatformUUID/{print $NF}'",{encoding:'utf8',stdio:['pipe','pipe','pipe']}).trim().replace(/"/g,'');if(o)return o}catch{}
|
|
126
|
+
const f=path.join(kd,'machine_secret');
|
|
127
|
+
try{const d=fs.readFileSync(f,'utf8').trim();if(d)return d}catch{}
|
|
128
|
+
try{const s=crypto.randomUUID();fs.writeFileSync(f,s,{mode:0o600});return s}catch{}
|
|
129
|
+
throw new Error('Cannot derive machine ID for keychain encryption');
|
|
130
|
+
}
|
|
131
|
+
const salt=crypto.createHash('sha256').update('conductor:keychain:v1').digest();
|
|
132
|
+
const mk=crypto.scryptSync(ms(),salt,32,{N:16384,r:8,p:1});
|
|
133
|
+
const iv=crypto.randomBytes(12),c=crypto.createCipheriv('aes-256-gcm',mk,iv);
|
|
134
|
+
let e=c.update(val,'utf8','hex'); e+=c.final('hex');
|
|
135
|
+
const t=c.getAuthTag().toString('hex');
|
|
136
|
+
const out=['v2',iv.toString('hex'),t,e].join(':');
|
|
137
|
+
const fp=path.join(kd,`${service}.${key}.enc`); const tmp=fp+'.tmp';
|
|
138
|
+
fs.writeFileSync(tmp,out,{mode:0o600}); fs.renameSync(tmp,fp);
|
|
139
|
+
JSEOF
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
add_plugin() {
|
|
143
|
+
python3 -c "
|
|
144
|
+
import json, sys, os
|
|
145
|
+
p, pl = sys.argv[1], sys.argv[2]
|
|
146
|
+
c = {}
|
|
147
|
+
if os.path.exists(p):
|
|
148
|
+
try:
|
|
149
|
+
with open(p) as f: c = json.load(f)
|
|
150
|
+
except Exception: pass
|
|
151
|
+
for k in ['installed','enabled']:
|
|
152
|
+
lst = c.get('plugins',{}).get(k,[])
|
|
153
|
+
if pl not in lst: lst.append(pl)
|
|
154
|
+
c.setdefault('plugins',{})[k] = lst
|
|
155
|
+
with open(p,'w') as f: json.dump(c, f, indent=2)
|
|
156
|
+
" "$CONFIG_FILE" "$1"
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
# ── Header ────────────────────────────────────────────────────
|
|
160
|
+
clear 2>/dev/null || true
|
|
161
|
+
echo -e " ${BOLD}${CYAN}Conductor Local Installer${RESET}"
|
|
162
|
+
echo -e " ${DIM}Installing from: $(pwd)${RESET}"
|
|
163
|
+
echo ""
|
|
164
|
+
|
|
165
|
+
# ── Step 1: Preflight ─────────────────────────────────────────
|
|
166
|
+
step "01 / Preflight Check"
|
|
167
|
+
|
|
168
|
+
[[ -f "package.json" ]] || fail "No package.json found. Run this script in the conductor source directory."
|
|
169
|
+
|
|
170
|
+
command -v node &>/dev/null || fail "Node.js not found. Install v18+ from https://nodejs.org"
|
|
171
|
+
NODE_RAW=$(node --version 2>/dev/null || echo "v0")
|
|
172
|
+
NODE_VER="${NODE_RAW#v}"; NODE_MAJOR="${NODE_VER%%.*}"
|
|
173
|
+
[[ -z "$NODE_MAJOR" ]] && fail "Could not determine Node.js version from: $NODE_RAW"
|
|
174
|
+
[[ "$NODE_MAJOR" =~ ^[0-9]+$ ]] && (( NODE_MAJOR >= 18 )) || \
|
|
175
|
+
fail "Node.js v18+ required (found $NODE_RAW). Upgrade at https://nodejs.org"
|
|
176
|
+
success "Node.js $NODE_RAW"
|
|
177
|
+
|
|
178
|
+
command -v npm &>/dev/null || fail "npm not found. Reinstall Node.js from https://nodejs.org"
|
|
179
|
+
success "npm $(npm --version)"
|
|
180
|
+
|
|
181
|
+
ensure_dirs
|
|
182
|
+
success "Config dirs ready ($CONFIG_DIR)"
|
|
183
|
+
|
|
184
|
+
# ── Step 2: Build ─────────────────────────────────────────────
|
|
185
|
+
step "02 / Build from Source"
|
|
186
|
+
|
|
187
|
+
info "Installing dependencies..."
|
|
188
|
+
npm install || fail "npm install failed"
|
|
189
|
+
|
|
190
|
+
info "Building project..."
|
|
191
|
+
npm run build || fail "Build failed"
|
|
192
|
+
|
|
193
|
+
chmod +x "dist/cli/index.js" 2>/dev/null || true
|
|
194
|
+
success "Build complete"
|
|
195
|
+
|
|
196
|
+
# ── Step 3: Link ──────────────────────────────────────────────
|
|
197
|
+
step "03 / Global Install"
|
|
198
|
+
|
|
199
|
+
info "Linking globally..."
|
|
200
|
+
if npm link --silent 2>/dev/null || sudo npm link --silent 2>/dev/null; then
|
|
201
|
+
success "Linked globally via 'npm link'"
|
|
202
|
+
else
|
|
203
|
+
warn "npm link failed. Attempting global install..."
|
|
204
|
+
if npm install -g . 2>/dev/null || sudo npm install -g . 2>/dev/null; then
|
|
205
|
+
success "Installed globally via 'npm install -g .'"
|
|
206
|
+
else
|
|
207
|
+
LOCAL_BIN="$HOME/.local/bin"
|
|
208
|
+
mkdir -p "$LOCAL_BIN"
|
|
209
|
+
printf '#!/usr/bin/env bash\nexec node "%s/dist/cli/index.js" "$@"\n' "$(pwd)" > "$LOCAL_BIN/conductor"
|
|
210
|
+
chmod +x "$LOCAL_BIN/conductor"
|
|
211
|
+
export PATH="$LOCAL_BIN:$PATH"
|
|
212
|
+
success "Installed to ~/.local/bin/conductor"
|
|
213
|
+
hint "Add to PATH permanently: export PATH=\"\$HOME/.local/bin:\$PATH\""
|
|
214
|
+
fi
|
|
215
|
+
fi
|
|
216
|
+
|
|
217
|
+
# ── Step 4: Configuration ─────────────────────────────────────
|
|
218
|
+
step "04 / Configuration"
|
|
219
|
+
|
|
220
|
+
echo ""
|
|
221
|
+
echo -e " ${CYAN}1${RESET} ${BOLD}Claude${RESET} ${DIM}· console.anthropic.com/settings/keys${RESET}
|
|
222
|
+
${CYAN}2${RESET} ${BOLD}OpenAI${RESET} ${DIM}· platform.openai.com/api-keys${RESET}
|
|
223
|
+
${CYAN}3${RESET} ${BOLD}Gemini${RESET} ${DIM}· aistudio.google.com/apikey${RESET}
|
|
224
|
+
${CYAN}4${RESET} ${BOLD}OpenRouter${RESET} ${DIM}· openrouter.ai/keys${RESET}
|
|
225
|
+
${CYAN}5${RESET} ${BOLD}Ollama${RESET} ${DIM}· local, no key needed${RESET}
|
|
226
|
+
${CYAN}6${RESET} ${BOLD}Skip${RESET}
|
|
227
|
+
"
|
|
228
|
+
prompt_input "Choose AI Provider" AI_CHOICE "6"
|
|
229
|
+
|
|
230
|
+
case "$AI_CHOICE" in
|
|
231
|
+
1)
|
|
232
|
+
prompt_secret "Anthropic API key" API_KEY
|
|
233
|
+
if [[ -n "$API_KEY" ]]; then
|
|
234
|
+
save_cred_val "anthropic" "api_key" "$API_KEY"
|
|
235
|
+
update_config '{"ai":{"provider":"claude"}}'
|
|
236
|
+
success "Claude configured"
|
|
237
|
+
else warn "Skipped"; fi ;;
|
|
238
|
+
2)
|
|
239
|
+
prompt_secret "OpenAI API key" API_KEY
|
|
240
|
+
if [[ -n "$API_KEY" ]]; then
|
|
241
|
+
save_cred_val "openai" "api_key" "$API_KEY"
|
|
242
|
+
update_config '{"ai":{"provider":"openai"}}'
|
|
243
|
+
success "OpenAI configured"
|
|
244
|
+
else warn "Skipped"; fi ;;
|
|
245
|
+
3)
|
|
246
|
+
prompt_secret "Gemini API key" API_KEY
|
|
247
|
+
if [[ -n "$API_KEY" ]]; then
|
|
248
|
+
save_cred_val "gemini" "api_key" "$API_KEY"
|
|
249
|
+
update_config '{"ai":{"provider":"gemini"}}'
|
|
250
|
+
success "Gemini configured"
|
|
251
|
+
else warn "Skipped"; fi ;;
|
|
252
|
+
4)
|
|
253
|
+
prompt_secret "OpenRouter API key" API_KEY
|
|
254
|
+
if [[ -n "$API_KEY" ]]; then
|
|
255
|
+
save_cred_val "openrouter" "api_key" "$API_KEY"
|
|
256
|
+
update_config '{"ai":{"provider":"openrouter"}}'
|
|
257
|
+
success "OpenRouter configured"
|
|
258
|
+
else warn "Skipped"; fi ;;
|
|
259
|
+
5)
|
|
260
|
+
prompt_input "Ollama model" OLLAMA_MODEL "llama3.2"
|
|
261
|
+
OLLAMA_JSON=$(python3 -c "import json,sys; print(json.dumps(sys.argv[1]))" "$OLLAMA_MODEL")
|
|
262
|
+
update_config "{\"ai\":{\"provider\":\"ollama\",\"model\":${OLLAMA_JSON}}}"
|
|
263
|
+
success "Ollama configured ($OLLAMA_MODEL)"
|
|
264
|
+
hint "Make sure Ollama is running: ollama serve" ;;
|
|
265
|
+
*)
|
|
266
|
+
warn "Skipped — run later: conductor ai setup" ;;
|
|
267
|
+
esac
|
|
268
|
+
|
|
269
|
+
# ── Step 5: Bots ──────────────────────────────────────────────
|
|
270
|
+
step "05 / Bot Setup ${DIM}optional${RESET}"
|
|
271
|
+
|
|
272
|
+
prompt_yn "Set up Telegram bot?" SETUP_TG "n"
|
|
273
|
+
if [[ "$SETUP_TG" == "true" ]]; then
|
|
274
|
+
prompt_secret "Telegram Bot Token" TG_TOKEN
|
|
275
|
+
if [[ -n "$TG_TOKEN" ]]; then
|
|
276
|
+
save_cred_val "telegram" "bot_token" "$TG_TOKEN"
|
|
277
|
+
update_config '{"telegram":{"enabled":true}}'
|
|
278
|
+
success "Telegram configured"
|
|
279
|
+
hint "Start with: conductor telegram start"
|
|
280
|
+
fi
|
|
281
|
+
fi
|
|
282
|
+
|
|
283
|
+
prompt_yn "Set up Slack bot?" SETUP_SLACK "n"
|
|
284
|
+
if [[ "$SETUP_SLACK" == "true" ]]; then
|
|
285
|
+
prompt_secret "Slack Bot OAuth Token (xoxb-)" SLACK_BOT_TOKEN
|
|
286
|
+
prompt_secret "Slack App-Level Token (xapp-)" SLACK_APP_TOKEN
|
|
287
|
+
if [[ -n "$SLACK_BOT_TOKEN" && -n "$SLACK_APP_TOKEN" ]]; then
|
|
288
|
+
save_cred_val "slack" "bot_token" "$SLACK_BOT_TOKEN"
|
|
289
|
+
save_cred_val "slack" "app_token" "$SLACK_APP_TOKEN"
|
|
290
|
+
update_config '{"plugins":{"slack":{"enabled":true}}}'
|
|
291
|
+
success "Slack configured"
|
|
292
|
+
hint "Start with: conductor slack start"
|
|
293
|
+
fi
|
|
294
|
+
fi
|
|
295
|
+
|
|
296
|
+
# ── Done ──────────────────────────────────────────────────────
|
|
297
|
+
echo ""
|
|
298
|
+
echo -e " ${GREEN}${BOLD}✓ Local installation complete!${RESET}"
|
|
299
|
+
echo ""
|
|
300
|
+
echo -e " ${CYAN}conductor status${RESET} — check your setup"
|
|
301
|
+
echo -e " ${CYAN}conductor auth google${RESET} — connect Gmail/Calendar/Drive"
|
|
302
|
+
echo -e " ${CYAN}conductor dashboard${RESET} — open web dashboard"
|
|
303
|
+
echo -e " ${CYAN}conductor ai test${RESET} — test AI provider"
|
|
304
|
+
echo ""
|
package/package.json
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@useconductor/conductor",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "The AI Tool Hub — One MCP server. 100+ tools. Every AI agent.",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"conductor": "./dist/cli/index.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"build": "tsc",
|
|
11
|
+
"postbuild": "chmod +x dist/cli/index.js && cp src/dashboard/index.html dist/dashboard/index.html",
|
|
12
|
+
"dev": "tsx watch src/cli/index.ts",
|
|
13
|
+
"start": "node dist/cli/index.js",
|
|
14
|
+
"test": "vitest run",
|
|
15
|
+
"test:watch": "vitest",
|
|
16
|
+
"test:coverage": "vitest run --coverage",
|
|
17
|
+
"lint": "eslint src/ --ext .ts",
|
|
18
|
+
"lint:fix": "eslint src/ --ext .ts --fix",
|
|
19
|
+
"format": "prettier --write \"src/**/*.ts\"",
|
|
20
|
+
"format:check": "prettier --check \"src/**/*.ts\"",
|
|
21
|
+
"typecheck": "tsc --noEmit",
|
|
22
|
+
"prepublishOnly": "npm run build"
|
|
23
|
+
},
|
|
24
|
+
"publishConfig": {
|
|
25
|
+
"access": "public",
|
|
26
|
+
"registry": "https://registry.npmjs.org/"
|
|
27
|
+
},
|
|
28
|
+
"engines": {
|
|
29
|
+
"node": ">=18.0.0"
|
|
30
|
+
},
|
|
31
|
+
"keywords": [
|
|
32
|
+
"mcp",
|
|
33
|
+
"model-context-protocol",
|
|
34
|
+
"ai",
|
|
35
|
+
"ai-tools",
|
|
36
|
+
"tool-hub",
|
|
37
|
+
"claude",
|
|
38
|
+
"cursor",
|
|
39
|
+
"cline",
|
|
40
|
+
"automation",
|
|
41
|
+
"plugin-hub"
|
|
42
|
+
],
|
|
43
|
+
"author": "Alexander Wondwossen",
|
|
44
|
+
"license": "Apache-2.0",
|
|
45
|
+
"type": "module",
|
|
46
|
+
"dependencies": {
|
|
47
|
+
"@anthropic-ai/sdk": "^0.74.0",
|
|
48
|
+
"@google/generative-ai": "^0.24.1",
|
|
49
|
+
"@modelcontextprotocol/sdk": "^1.26.0",
|
|
50
|
+
"@octokit/rest": "^22.0.1",
|
|
51
|
+
"@slack/bolt": "^4.6.0",
|
|
52
|
+
"chalk": "^5.6.2",
|
|
53
|
+
"commander": "^14.0.3",
|
|
54
|
+
"dotenv": "^17.3.1",
|
|
55
|
+
"express": "^5.2.1",
|
|
56
|
+
"express-rate-limit": "^8.3.2",
|
|
57
|
+
"glob": "^13.0.6",
|
|
58
|
+
"googleapis": "^171.4.0",
|
|
59
|
+
"inquirer": "^13.2.5",
|
|
60
|
+
"mathjs": "^15.1.1",
|
|
61
|
+
"open": "^11.0.0",
|
|
62
|
+
"openai": "^6.22.0",
|
|
63
|
+
"ora": "^9.3.0",
|
|
64
|
+
"pino": "^10.3.1",
|
|
65
|
+
"pino-pretty": "^13.1.3",
|
|
66
|
+
"redis": "^5.11.0",
|
|
67
|
+
"spotify-web-api-node": "^5.0.2",
|
|
68
|
+
"sql.js": "^1.14.0",
|
|
69
|
+
"systeminformation": "^5.31.0",
|
|
70
|
+
"telegraf": "^4.16.3",
|
|
71
|
+
"zod": "^4.3.6"
|
|
72
|
+
},
|
|
73
|
+
"devDependencies": {
|
|
74
|
+
"@types/express": "^5.0.6",
|
|
75
|
+
"@types/inquirer": "^9.0.9",
|
|
76
|
+
"@types/node": "^25.2.3",
|
|
77
|
+
"@types/spotify-web-api-node": "^5.0.11",
|
|
78
|
+
"@types/sql.js": "^1.4.9",
|
|
79
|
+
"@typescript-eslint/eslint-plugin": "^8.58.0",
|
|
80
|
+
"@typescript-eslint/parser": "^8.58.0",
|
|
81
|
+
"@vitest/coverage-v8": "^4.1.2",
|
|
82
|
+
"eslint": "^10.1.0",
|
|
83
|
+
"eslint-config-prettier": "^10.1.8",
|
|
84
|
+
"prettier": "^3.8.1",
|
|
85
|
+
"tsx": "^4.21.0",
|
|
86
|
+
"typescript": "^5.9.3",
|
|
87
|
+
"vitepress": "^1.6.4",
|
|
88
|
+
"vitest": "^4.1.2"
|
|
89
|
+
}
|
|
90
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# packages
|
|
2
|
+
|
|
3
|
+
Published packages for the Conductor ecosystem.
|
|
4
|
+
|
|
5
|
+
## Contents
|
|
6
|
+
|
|
7
|
+
- `plugin-sdk/` - TypeScript SDK for building Conductor plugins
|
|
8
|
+
|
|
9
|
+
## Architecture
|
|
10
|
+
|
|
11
|
+
This directory contains npm-published packages that extend Conductor. The `plugin-sdk` is the primary package, enabling developers to build plugins with proper typing and tooling. Additional packages may be added here for language bindings, integrations, or shared libraries.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# packages/plugin-sdk
|
|
2
|
+
|
|
3
|
+
TypeScript SDK for building Conductor plugins. Provides types, utilities, and helpers for plugin development.
|
|
4
|
+
|
|
5
|
+
## Contents
|
|
6
|
+
|
|
7
|
+
- `package.json` - Package manifest and dependencies
|
|
8
|
+
- `src/` - SDK source code
|
|
9
|
+
|
|
10
|
+
## Architecture
|
|
11
|
+
|
|
12
|
+
The Plugin SDK is published to npm and consumed by plugin developers. It re-exports the core `Plugin` interface, tool types, config schema types, and validation utilities. Use this SDK when building external plugins to ensure type safety and API compatibility with the Conductor plugin system.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@conductor/plugin-sdk",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "SDK for building Conductor plugins with TypeScript",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"scripts": {
|
|
9
|
+
"build": "tsc",
|
|
10
|
+
"test": "vitest run"
|
|
11
|
+
},
|
|
12
|
+
"dependencies": {
|
|
13
|
+
"zod": "^4.3.6"
|
|
14
|
+
},
|
|
15
|
+
"peerDependencies": {
|
|
16
|
+
"typescript": ">=5.0.0"
|
|
17
|
+
},
|
|
18
|
+
"devDependencies": {
|
|
19
|
+
"typescript": "^5.9.3",
|
|
20
|
+
"vitest": "^4.1.2"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# packages/plugin-sdk/src
|
|
2
|
+
|
|
3
|
+
Source code for the Conductor Plugin SDK.
|
|
4
|
+
|
|
5
|
+
## Contents
|
|
6
|
+
|
|
7
|
+
- `index.ts` - SDK entry point, re-exports all public types and utilities
|
|
8
|
+
|
|
9
|
+
## Architecture
|
|
10
|
+
|
|
11
|
+
This is the implementation of the Plugin SDK. The single entry point re-exports the `Plugin` interface, `PluginTool`, `PluginConfigSchema`, and validation helpers from the main codebase. This allows plugin developers to import everything from `@conductor/plugin-sdk` without depending on the full Conductor package.
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @conductor/plugin-sdk
|
|
3
|
+
*
|
|
4
|
+
* The official SDK for building Conductor plugins.
|
|
5
|
+
* Provides type-safe plugin creation, input validation, testing utilities,
|
|
6
|
+
* and a development server with hot-reload.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* import { createPlugin, z } from '@conductor/plugin-sdk';
|
|
10
|
+
*
|
|
11
|
+
* export default createPlugin({
|
|
12
|
+
* name: 'my-plugin',
|
|
13
|
+
* description: 'My awesome plugin',
|
|
14
|
+
* tools: [
|
|
15
|
+
* {
|
|
16
|
+
* name: 'hello',
|
|
17
|
+
* description: 'Say hello',
|
|
18
|
+
* input: z.object({ name: z.string() }),
|
|
19
|
+
* handler: async ({ name }) => `Hello, ${name}!`,
|
|
20
|
+
* },
|
|
21
|
+
* ],
|
|
22
|
+
* });
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
import { z } from 'zod';
|
|
26
|
+
|
|
27
|
+
// ── Types ────────────────────────────────────────────────────────────────────
|
|
28
|
+
|
|
29
|
+
export interface PluginToolDefinition<TInput = Record<string, unknown>> {
|
|
30
|
+
name: string;
|
|
31
|
+
description: string;
|
|
32
|
+
/** Zod schema for input validation */
|
|
33
|
+
input: z.ZodType<TInput>;
|
|
34
|
+
/** Tool handler — receives validated input */
|
|
35
|
+
handler: (input: TInput) => Promise<unknown>;
|
|
36
|
+
/** Whether this tool requires user approval before execution */
|
|
37
|
+
requiresApproval?: boolean;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export interface PluginDefinition {
|
|
41
|
+
name: string;
|
|
42
|
+
description: string;
|
|
43
|
+
version?: string;
|
|
44
|
+
tools: PluginToolDefinition[];
|
|
45
|
+
/** Called when the plugin is loaded */
|
|
46
|
+
onInitialize?: () => Promise<void>;
|
|
47
|
+
/** Called when the plugin is unloaded */
|
|
48
|
+
onDestroy?: () => Promise<void>;
|
|
49
|
+
/** Whether the plugin is configured and ready */
|
|
50
|
+
isConfigured?: () => boolean;
|
|
51
|
+
/** Configuration schema for the plugin */
|
|
52
|
+
config?: Record<string, {
|
|
53
|
+
label: string;
|
|
54
|
+
type: 'string' | 'password' | 'number' | 'boolean';
|
|
55
|
+
required: boolean;
|
|
56
|
+
description?: string;
|
|
57
|
+
}>;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// ── Plugin Factory ───────────────────────────────────────────────────────────
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Create a plugin with type-safe tool definitions.
|
|
64
|
+
*/
|
|
65
|
+
export function createPlugin(definition: PluginDefinition): PluginDefinition {
|
|
66
|
+
return {
|
|
67
|
+
version: '1.0.0',
|
|
68
|
+
...definition,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// ── Tool Helpers ─────────────────────────────────────────────────────────────
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Create a tool definition with Zod-validated input.
|
|
76
|
+
*/
|
|
77
|
+
export function createTool<TInput>(tool: PluginToolDefinition<TInput>): PluginToolDefinition<TInput> {
|
|
78
|
+
return tool;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// ── Testing Utilities ────────────────────────────────────────────────────────
|
|
82
|
+
|
|
83
|
+
export interface TestResult {
|
|
84
|
+
tool: string;
|
|
85
|
+
input: unknown;
|
|
86
|
+
output: unknown;
|
|
87
|
+
success: boolean;
|
|
88
|
+
error?: string;
|
|
89
|
+
latencyMs: number;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Test a plugin's tools with mocked inputs.
|
|
94
|
+
*/
|
|
95
|
+
export async function testPlugin(
|
|
96
|
+
plugin: PluginDefinition,
|
|
97
|
+
tests: Array<{ tool: string; input: Record<string, unknown>; expectedError?: string }>,
|
|
98
|
+
): Promise<TestResult[]> {
|
|
99
|
+
const results: TestResult[] = [];
|
|
100
|
+
|
|
101
|
+
for (const test of tests) {
|
|
102
|
+
const toolDef = plugin.tools.find((t) => t.name === test.tool);
|
|
103
|
+
if (!toolDef) {
|
|
104
|
+
results.push({
|
|
105
|
+
tool: test.tool,
|
|
106
|
+
input: test.input,
|
|
107
|
+
output: null,
|
|
108
|
+
success: false,
|
|
109
|
+
error: `Tool "${test.tool}" not found in plugin "${plugin.name}"`,
|
|
110
|
+
latencyMs: 0,
|
|
111
|
+
});
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const start = Date.now();
|
|
116
|
+
try {
|
|
117
|
+
// Validate input
|
|
118
|
+
const validated = toolDef.input.parse(test.input);
|
|
119
|
+
const output = await toolDef.handler(validated);
|
|
120
|
+
results.push({
|
|
121
|
+
tool: test.tool,
|
|
122
|
+
input: test.input,
|
|
123
|
+
output,
|
|
124
|
+
success: true,
|
|
125
|
+
latencyMs: Date.now() - start,
|
|
126
|
+
});
|
|
127
|
+
} catch (err) {
|
|
128
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
129
|
+
if (test.expectedError && message.includes(test.expectedError)) {
|
|
130
|
+
results.push({
|
|
131
|
+
tool: test.tool,
|
|
132
|
+
input: test.input,
|
|
133
|
+
output: null,
|
|
134
|
+
success: true, // Expected error = test passed
|
|
135
|
+
latencyMs: Date.now() - start,
|
|
136
|
+
});
|
|
137
|
+
} else {
|
|
138
|
+
results.push({
|
|
139
|
+
tool: test.tool,
|
|
140
|
+
input: test.input,
|
|
141
|
+
output: null,
|
|
142
|
+
success: false,
|
|
143
|
+
error: message,
|
|
144
|
+
latencyMs: Date.now() - start,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
return results;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Generate an MCP-compatible inputSchema from a Zod schema.
|
|
155
|
+
*/
|
|
156
|
+
export function zodToJsonSchema(schema: z.ZodType): Record<string, unknown> {
|
|
157
|
+
// Simplified Zod → JSON Schema conversion
|
|
158
|
+
if (schema instanceof z.ZodObject) {
|
|
159
|
+
const shape = (schema as z.ZodObject<Record<string, z.ZodType>>).shape;
|
|
160
|
+
const properties: Record<string, unknown> = {};
|
|
161
|
+
const required: string[] = [];
|
|
162
|
+
|
|
163
|
+
for (const [key, field] of Object.entries(shape)) {
|
|
164
|
+
if (!(field instanceof z.ZodOptional)) {
|
|
165
|
+
required.push(key);
|
|
166
|
+
}
|
|
167
|
+
properties[key] = zodFieldSchema(field);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
return {
|
|
171
|
+
type: 'object',
|
|
172
|
+
properties,
|
|
173
|
+
required: required.length > 0 ? required : undefined,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
return { type: 'object', properties: {} };
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
function zodFieldSchema(field: z.ZodType): Record<string, unknown> {
|
|
181
|
+
if (field instanceof z.ZodString) return { type: 'string' };
|
|
182
|
+
if (field instanceof z.ZodNumber) return { type: 'number' };
|
|
183
|
+
if (field instanceof z.ZodBoolean) return { type: 'boolean' };
|
|
184
|
+
if (field instanceof z.ZodArray) return { type: 'array', items: { type: 'string' } };
|
|
185
|
+
if (field instanceof z.ZodOptional) return zodFieldSchema(field.unwrap());
|
|
186
|
+
if (field instanceof z.ZodEnum) return { type: 'string', enum: field._def.values };
|
|
187
|
+
return { type: 'string' };
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// Re-export Zod for convenience
|
|
191
|
+
export { z };
|
package/sdks/README.md
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Conductor SDKs
|
|
2
|
+
|
|
3
|
+
Official SDKs for integrating with Conductor from any language.
|
|
4
|
+
|
|
5
|
+
| Language | Package | Status |
|
|
6
|
+
|----------|---------|--------|
|
|
7
|
+
| **TypeScript** | `@conductor/cli` | ✅ Production |
|
|
8
|
+
| **TypeScript Plugin SDK** | `@conductor/plugin-sdk` | ✅ Production |
|
|
9
|
+
| **Python** | `conductor-python` | 🚧 Starter |
|
|
10
|
+
| **Go** | `go-conductor` | 🚧 Starter |
|
|
11
|
+
| **Rust** | `conductor-rs` | 🚧 Starter |
|
|
12
|
+
| **Java** | `conductor-java` | 🚧 Starter |
|
|
13
|
+
| **Ruby** | `conductor-ruby` | 🚧 Starter |
|
|
14
|
+
| **PHP** | `conductor-php` | 🚧 Starter |
|
|
15
|
+
| **C#** | `Conductor.NET` | 🚧 Starter |
|
|
16
|
+
| **Swift** | `ConductorSwift` | 🚧 Starter |
|
|
17
|
+
|
|
18
|
+
## Quick Start (Any Language)
|
|
19
|
+
|
|
20
|
+
All SDKs connect to the Conductor MCP server. The simplest integration:
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
conductor mcp start
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Then use the SDK to call tools programmatically.
|