@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.
Files changed (504) hide show
  1. package/.claude-plugin/marketplace.json +33 -0
  2. package/.claude-plugin/plugin.json +23 -0
  3. package/.eslintrc.json +23 -0
  4. package/.gitattributes +6 -0
  5. package/.github/FUNDING.yml +15 -0
  6. package/.github/ISSUE_TEMPLATE/bug_report.yml +91 -0
  7. package/.github/ISSUE_TEMPLATE/config.yml +8 -0
  8. package/.github/ISSUE_TEMPLATE/feature_request.yml +63 -0
  9. package/.github/ISSUE_TEMPLATE/plugin_request.yml +71 -0
  10. package/.github/README.md +13 -0
  11. package/.github/workflows/README.md +22 -0
  12. package/.github/workflows/auto-release.yml +112 -0
  13. package/.github/workflows/ci.yml +49 -0
  14. package/.github/workflows/claude-code-review.yml +44 -0
  15. package/.github/workflows/claude.yml +36 -0
  16. package/.github/workflows/sync-install.yml +47 -0
  17. package/.mcp.json +9 -0
  18. package/.prettierrc.json +7 -0
  19. package/C.png +0 -0
  20. package/CHANGELOG.md +74 -0
  21. package/CLAUDE.md +118 -0
  22. package/CONTRIBUTING.md +231 -0
  23. package/LICENSE +201 -0
  24. package/README.md +179 -0
  25. package/SECURITY.md +47 -0
  26. package/commands/conductor-setup.md +11 -0
  27. package/commands/conductor-status.md +7 -0
  28. package/dist/ai/base.d.ts +44 -0
  29. package/dist/ai/base.d.ts.map +1 -0
  30. package/dist/ai/base.js +47 -0
  31. package/dist/ai/base.js.map +1 -0
  32. package/dist/ai/claude.d.ts +11 -0
  33. package/dist/ai/claude.d.ts.map +1 -0
  34. package/dist/ai/claude.js +149 -0
  35. package/dist/ai/claude.js.map +1 -0
  36. package/dist/ai/gemini.d.ts +15 -0
  37. package/dist/ai/gemini.d.ts.map +1 -0
  38. package/dist/ai/gemini.js +156 -0
  39. package/dist/ai/gemini.js.map +1 -0
  40. package/dist/ai/maestro.d.ts +22 -0
  41. package/dist/ai/maestro.d.ts.map +1 -0
  42. package/dist/ai/maestro.js +142 -0
  43. package/dist/ai/maestro.js.map +1 -0
  44. package/dist/ai/manager.d.ts +47 -0
  45. package/dist/ai/manager.d.ts.map +1 -0
  46. package/dist/ai/manager.js +450 -0
  47. package/dist/ai/manager.js.map +1 -0
  48. package/dist/ai/ollama.d.ts +16 -0
  49. package/dist/ai/ollama.d.ts.map +1 -0
  50. package/dist/ai/ollama.js +151 -0
  51. package/dist/ai/ollama.js.map +1 -0
  52. package/dist/ai/openai.d.ts +11 -0
  53. package/dist/ai/openai.d.ts.map +1 -0
  54. package/dist/ai/openai.js +132 -0
  55. package/dist/ai/openai.js.map +1 -0
  56. package/dist/ai/openrouter.d.ts +11 -0
  57. package/dist/ai/openrouter.d.ts.map +1 -0
  58. package/dist/ai/openrouter.js +139 -0
  59. package/dist/ai/openrouter.js.map +1 -0
  60. package/dist/bot/slack.d.ts +17 -0
  61. package/dist/bot/slack.d.ts.map +1 -0
  62. package/dist/bot/slack.js +144 -0
  63. package/dist/bot/slack.js.map +1 -0
  64. package/dist/bot/telegram.d.ts +19 -0
  65. package/dist/bot/telegram.d.ts.map +1 -0
  66. package/dist/bot/telegram.js +157 -0
  67. package/dist/bot/telegram.js.map +1 -0
  68. package/dist/cli/commands/ai.d.ts +4 -0
  69. package/dist/cli/commands/ai.d.ts.map +1 -0
  70. package/dist/cli/commands/ai.js +161 -0
  71. package/dist/cli/commands/ai.js.map +1 -0
  72. package/dist/cli/commands/doctor.d.ts +18 -0
  73. package/dist/cli/commands/doctor.d.ts.map +1 -0
  74. package/dist/cli/commands/doctor.js +213 -0
  75. package/dist/cli/commands/doctor.js.map +1 -0
  76. package/dist/cli/commands/init.d.ts +15 -0
  77. package/dist/cli/commands/init.d.ts.map +1 -0
  78. package/dist/cli/commands/init.js +281 -0
  79. package/dist/cli/commands/init.js.map +1 -0
  80. package/dist/cli/commands/install.d.ts +16 -0
  81. package/dist/cli/commands/install.d.ts.map +1 -0
  82. package/dist/cli/commands/install.js +750 -0
  83. package/dist/cli/commands/install.js.map +1 -0
  84. package/dist/cli/commands/lifecycle.d.ts +4 -0
  85. package/dist/cli/commands/lifecycle.d.ts.map +1 -0
  86. package/dist/cli/commands/lifecycle.js +84 -0
  87. package/dist/cli/commands/lifecycle.js.map +1 -0
  88. package/dist/cli/commands/marketplace.d.ts +13 -0
  89. package/dist/cli/commands/marketplace.d.ts.map +1 -0
  90. package/dist/cli/commands/marketplace.js +197 -0
  91. package/dist/cli/commands/marketplace.js.map +1 -0
  92. package/dist/cli/commands/mcp.d.ts +6 -0
  93. package/dist/cli/commands/mcp.d.ts.map +1 -0
  94. package/dist/cli/commands/mcp.js +83 -0
  95. package/dist/cli/commands/mcp.js.map +1 -0
  96. package/dist/cli/commands/onboard.d.ts +10 -0
  97. package/dist/cli/commands/onboard.d.ts.map +1 -0
  98. package/dist/cli/commands/onboard.js +207 -0
  99. package/dist/cli/commands/onboard.js.map +1 -0
  100. package/dist/cli/commands/plugin-create.d.ts +13 -0
  101. package/dist/cli/commands/plugin-create.d.ts.map +1 -0
  102. package/dist/cli/commands/plugin-create.js +122 -0
  103. package/dist/cli/commands/plugin-create.js.map +1 -0
  104. package/dist/cli/commands/plugins.d.ts +5 -0
  105. package/dist/cli/commands/plugins.d.ts.map +1 -0
  106. package/dist/cli/commands/plugins.js +30 -0
  107. package/dist/cli/commands/plugins.js.map +1 -0
  108. package/dist/cli/commands/release.d.ts +13 -0
  109. package/dist/cli/commands/release.d.ts.map +1 -0
  110. package/dist/cli/commands/release.js +243 -0
  111. package/dist/cli/commands/release.js.map +1 -0
  112. package/dist/cli/commands/telegram.d.ts +3 -0
  113. package/dist/cli/commands/telegram.d.ts.map +1 -0
  114. package/dist/cli/commands/telegram.js +20 -0
  115. package/dist/cli/commands/telegram.js.map +1 -0
  116. package/dist/cli/index.d.ts +3 -0
  117. package/dist/cli/index.d.ts.map +1 -0
  118. package/dist/cli/index.js +402 -0
  119. package/dist/cli/index.js.map +1 -0
  120. package/dist/config/oauth.d.ts +8 -0
  121. package/dist/config/oauth.d.ts.map +1 -0
  122. package/dist/config/oauth.js +13 -0
  123. package/dist/config/oauth.js.map +1 -0
  124. package/dist/core/audit.d.ts +91 -0
  125. package/dist/core/audit.d.ts.map +1 -0
  126. package/dist/core/audit.js +233 -0
  127. package/dist/core/audit.js.map +1 -0
  128. package/dist/core/circuit-breaker.d.ts +56 -0
  129. package/dist/core/circuit-breaker.d.ts.map +1 -0
  130. package/dist/core/circuit-breaker.js +107 -0
  131. package/dist/core/circuit-breaker.js.map +1 -0
  132. package/dist/core/conductor.d.ts +44 -0
  133. package/dist/core/conductor.d.ts.map +1 -0
  134. package/dist/core/conductor.js +200 -0
  135. package/dist/core/conductor.js.map +1 -0
  136. package/dist/core/config.d.ts +66 -0
  137. package/dist/core/config.d.ts.map +1 -0
  138. package/dist/core/config.js +86 -0
  139. package/dist/core/config.js.map +1 -0
  140. package/dist/core/database.d.ts +59 -0
  141. package/dist/core/database.d.ts.map +1 -0
  142. package/dist/core/database.js +342 -0
  143. package/dist/core/database.js.map +1 -0
  144. package/dist/core/errors.d.ts +231 -0
  145. package/dist/core/errors.d.ts.map +1 -0
  146. package/dist/core/errors.js +254 -0
  147. package/dist/core/errors.js.map +1 -0
  148. package/dist/core/health.d.ts +72 -0
  149. package/dist/core/health.d.ts.map +1 -0
  150. package/dist/core/health.js +116 -0
  151. package/dist/core/health.js.map +1 -0
  152. package/dist/core/interfaces.d.ts +62 -0
  153. package/dist/core/interfaces.d.ts.map +1 -0
  154. package/dist/core/interfaces.js +8 -0
  155. package/dist/core/interfaces.js.map +1 -0
  156. package/dist/core/logger.d.ts +15 -0
  157. package/dist/core/logger.d.ts.map +1 -0
  158. package/dist/core/logger.js +30 -0
  159. package/dist/core/logger.js.map +1 -0
  160. package/dist/core/rbac.d.ts +132 -0
  161. package/dist/core/rbac.d.ts.map +1 -0
  162. package/dist/core/rbac.js +230 -0
  163. package/dist/core/rbac.js.map +1 -0
  164. package/dist/core/retry.d.ts +22 -0
  165. package/dist/core/retry.d.ts.map +1 -0
  166. package/dist/core/retry.js +41 -0
  167. package/dist/core/retry.js.map +1 -0
  168. package/dist/core/webhooks.d.ts +92 -0
  169. package/dist/core/webhooks.d.ts.map +1 -0
  170. package/dist/core/webhooks.js +176 -0
  171. package/dist/core/webhooks.js.map +1 -0
  172. package/dist/core/zero-config.d.ts +22 -0
  173. package/dist/core/zero-config.d.ts.map +1 -0
  174. package/dist/core/zero-config.js +59 -0
  175. package/dist/core/zero-config.js.map +1 -0
  176. package/dist/dashboard/cli.d.ts +6 -0
  177. package/dist/dashboard/cli.d.ts.map +1 -0
  178. package/dist/dashboard/cli.js +42 -0
  179. package/dist/dashboard/cli.js.map +1 -0
  180. package/dist/dashboard/index.html +3426 -0
  181. package/dist/dashboard/server.d.ts +7 -0
  182. package/dist/dashboard/server.d.ts.map +1 -0
  183. package/dist/dashboard/server.js +1427 -0
  184. package/dist/dashboard/server.js.map +1 -0
  185. package/dist/mcp/server.d.ts +27 -0
  186. package/dist/mcp/server.d.ts.map +1 -0
  187. package/dist/mcp/server.js +380 -0
  188. package/dist/mcp/server.js.map +1 -0
  189. package/dist/mcp/tools/misc.d.ts +15 -0
  190. package/dist/mcp/tools/misc.d.ts.map +1 -0
  191. package/dist/mcp/tools/misc.js +49 -0
  192. package/dist/mcp/tools/misc.js.map +1 -0
  193. package/dist/plugins/builtin/calculator.d.ts +11 -0
  194. package/dist/plugins/builtin/calculator.d.ts.map +1 -0
  195. package/dist/plugins/builtin/calculator.js +166 -0
  196. package/dist/plugins/builtin/calculator.js.map +1 -0
  197. package/dist/plugins/builtin/colors.d.ts +15 -0
  198. package/dist/plugins/builtin/colors.d.ts.map +1 -0
  199. package/dist/plugins/builtin/colors.js +193 -0
  200. package/dist/plugins/builtin/colors.js.map +1 -0
  201. package/dist/plugins/builtin/cron.d.ts +40 -0
  202. package/dist/plugins/builtin/cron.d.ts.map +1 -0
  203. package/dist/plugins/builtin/cron.js +578 -0
  204. package/dist/plugins/builtin/cron.js.map +1 -0
  205. package/dist/plugins/builtin/crypto.d.ts +11 -0
  206. package/dist/plugins/builtin/crypto.d.ts.map +1 -0
  207. package/dist/plugins/builtin/crypto.js +83 -0
  208. package/dist/plugins/builtin/crypto.js.map +1 -0
  209. package/dist/plugins/builtin/database.d.ts +29 -0
  210. package/dist/plugins/builtin/database.d.ts.map +1 -0
  211. package/dist/plugins/builtin/database.js +230 -0
  212. package/dist/plugins/builtin/database.js.map +1 -0
  213. package/dist/plugins/builtin/docker.d.ts +12 -0
  214. package/dist/plugins/builtin/docker.d.ts.map +1 -0
  215. package/dist/plugins/builtin/docker.js +436 -0
  216. package/dist/plugins/builtin/docker.js.map +1 -0
  217. package/dist/plugins/builtin/fun.d.ts +11 -0
  218. package/dist/plugins/builtin/fun.d.ts.map +1 -0
  219. package/dist/plugins/builtin/fun.js +114 -0
  220. package/dist/plugins/builtin/fun.js.map +1 -0
  221. package/dist/plugins/builtin/gcal.d.ts +38 -0
  222. package/dist/plugins/builtin/gcal.d.ts.map +1 -0
  223. package/dist/plugins/builtin/gcal.js +280 -0
  224. package/dist/plugins/builtin/gcal.js.map +1 -0
  225. package/dist/plugins/builtin/gdrive.d.ts +26 -0
  226. package/dist/plugins/builtin/gdrive.d.ts.map +1 -0
  227. package/dist/plugins/builtin/gdrive.js +295 -0
  228. package/dist/plugins/builtin/gdrive.js.map +1 -0
  229. package/dist/plugins/builtin/github-actions.d.ts +38 -0
  230. package/dist/plugins/builtin/github-actions.d.ts.map +1 -0
  231. package/dist/plugins/builtin/github-actions.js +629 -0
  232. package/dist/plugins/builtin/github-actions.js.map +1 -0
  233. package/dist/plugins/builtin/github.d.ts +26 -0
  234. package/dist/plugins/builtin/github.d.ts.map +1 -0
  235. package/dist/plugins/builtin/github.js +800 -0
  236. package/dist/plugins/builtin/github.js.map +1 -0
  237. package/dist/plugins/builtin/gmail.d.ts +50 -0
  238. package/dist/plugins/builtin/gmail.d.ts.map +1 -0
  239. package/dist/plugins/builtin/gmail.js +445 -0
  240. package/dist/plugins/builtin/gmail.js.map +1 -0
  241. package/dist/plugins/builtin/hash.d.ts +11 -0
  242. package/dist/plugins/builtin/hash.d.ts.map +1 -0
  243. package/dist/plugins/builtin/hash.js +95 -0
  244. package/dist/plugins/builtin/hash.js.map +1 -0
  245. package/dist/plugins/builtin/homekit.d.ts +53 -0
  246. package/dist/plugins/builtin/homekit.d.ts.map +1 -0
  247. package/dist/plugins/builtin/homekit.js +341 -0
  248. package/dist/plugins/builtin/homekit.js.map +1 -0
  249. package/dist/plugins/builtin/index.d.ts +4 -0
  250. package/dist/plugins/builtin/index.d.ts.map +1 -0
  251. package/dist/plugins/builtin/index.js +96 -0
  252. package/dist/plugins/builtin/index.js.map +1 -0
  253. package/dist/plugins/builtin/jira.d.ts +50 -0
  254. package/dist/plugins/builtin/jira.d.ts.map +1 -0
  255. package/dist/plugins/builtin/jira.js +353 -0
  256. package/dist/plugins/builtin/jira.js.map +1 -0
  257. package/dist/plugins/builtin/linear.d.ts +35 -0
  258. package/dist/plugins/builtin/linear.d.ts.map +1 -0
  259. package/dist/plugins/builtin/linear.js +397 -0
  260. package/dist/plugins/builtin/linear.js.map +1 -0
  261. package/dist/plugins/builtin/lumen.d.ts +21 -0
  262. package/dist/plugins/builtin/lumen.d.ts.map +1 -0
  263. package/dist/plugins/builtin/lumen.js +404 -0
  264. package/dist/plugins/builtin/lumen.js.map +1 -0
  265. package/dist/plugins/builtin/memory.d.ts +22 -0
  266. package/dist/plugins/builtin/memory.d.ts.map +1 -0
  267. package/dist/plugins/builtin/memory.js +184 -0
  268. package/dist/plugins/builtin/memory.js.map +1 -0
  269. package/dist/plugins/builtin/n8n.d.ts +60 -0
  270. package/dist/plugins/builtin/n8n.d.ts.map +1 -0
  271. package/dist/plugins/builtin/n8n.js +519 -0
  272. package/dist/plugins/builtin/n8n.js.map +1 -0
  273. package/dist/plugins/builtin/network.d.ts +11 -0
  274. package/dist/plugins/builtin/network.d.ts.map +1 -0
  275. package/dist/plugins/builtin/network.js +88 -0
  276. package/dist/plugins/builtin/network.js.map +1 -0
  277. package/dist/plugins/builtin/notes.d.ts +47 -0
  278. package/dist/plugins/builtin/notes.d.ts.map +1 -0
  279. package/dist/plugins/builtin/notes.js +641 -0
  280. package/dist/plugins/builtin/notes.js.map +1 -0
  281. package/dist/plugins/builtin/notion.d.ts +47 -0
  282. package/dist/plugins/builtin/notion.d.ts.map +1 -0
  283. package/dist/plugins/builtin/notion.js +317 -0
  284. package/dist/plugins/builtin/notion.js.map +1 -0
  285. package/dist/plugins/builtin/shell.d.ts +12 -0
  286. package/dist/plugins/builtin/shell.d.ts.map +1 -0
  287. package/dist/plugins/builtin/shell.js +310 -0
  288. package/dist/plugins/builtin/shell.js.map +1 -0
  289. package/dist/plugins/builtin/slack.d.ts +31 -0
  290. package/dist/plugins/builtin/slack.d.ts.map +1 -0
  291. package/dist/plugins/builtin/slack.js +295 -0
  292. package/dist/plugins/builtin/slack.js.map +1 -0
  293. package/dist/plugins/builtin/spotify.d.ts +55 -0
  294. package/dist/plugins/builtin/spotify.d.ts.map +1 -0
  295. package/dist/plugins/builtin/spotify.js +623 -0
  296. package/dist/plugins/builtin/spotify.js.map +1 -0
  297. package/dist/plugins/builtin/stripe.d.ts +35 -0
  298. package/dist/plugins/builtin/stripe.d.ts.map +1 -0
  299. package/dist/plugins/builtin/stripe.js +376 -0
  300. package/dist/plugins/builtin/stripe.js.map +1 -0
  301. package/dist/plugins/builtin/system.d.ts +11 -0
  302. package/dist/plugins/builtin/system.d.ts.map +1 -0
  303. package/dist/plugins/builtin/system.js +91 -0
  304. package/dist/plugins/builtin/system.js.map +1 -0
  305. package/dist/plugins/builtin/text-tools.d.ts +11 -0
  306. package/dist/plugins/builtin/text-tools.d.ts.map +1 -0
  307. package/dist/plugins/builtin/text-tools.js +146 -0
  308. package/dist/plugins/builtin/text-tools.js.map +1 -0
  309. package/dist/plugins/builtin/timezone.d.ts +13 -0
  310. package/dist/plugins/builtin/timezone.d.ts.map +1 -0
  311. package/dist/plugins/builtin/timezone.js +164 -0
  312. package/dist/plugins/builtin/timezone.js.map +1 -0
  313. package/dist/plugins/builtin/todoist.d.ts +49 -0
  314. package/dist/plugins/builtin/todoist.d.ts.map +1 -0
  315. package/dist/plugins/builtin/todoist.js +540 -0
  316. package/dist/plugins/builtin/todoist.js.map +1 -0
  317. package/dist/plugins/builtin/translate.d.ts +11 -0
  318. package/dist/plugins/builtin/translate.d.ts.map +1 -0
  319. package/dist/plugins/builtin/translate.js +42 -0
  320. package/dist/plugins/builtin/translate.js.map +1 -0
  321. package/dist/plugins/builtin/url-tools.d.ts +11 -0
  322. package/dist/plugins/builtin/url-tools.d.ts.map +1 -0
  323. package/dist/plugins/builtin/url-tools.js +70 -0
  324. package/dist/plugins/builtin/url-tools.js.map +1 -0
  325. package/dist/plugins/builtin/vercel.d.ts +55 -0
  326. package/dist/plugins/builtin/vercel.d.ts.map +1 -0
  327. package/dist/plugins/builtin/vercel.js +514 -0
  328. package/dist/plugins/builtin/vercel.js.map +1 -0
  329. package/dist/plugins/builtin/weather.d.ts +13 -0
  330. package/dist/plugins/builtin/weather.d.ts.map +1 -0
  331. package/dist/plugins/builtin/weather.js +103 -0
  332. package/dist/plugins/builtin/weather.js.map +1 -0
  333. package/dist/plugins/builtin/x.d.ts +54 -0
  334. package/dist/plugins/builtin/x.d.ts.map +1 -0
  335. package/dist/plugins/builtin/x.js +402 -0
  336. package/dist/plugins/builtin/x.js.map +1 -0
  337. package/dist/plugins/manager.d.ts +77 -0
  338. package/dist/plugins/manager.d.ts.map +1 -0
  339. package/dist/plugins/manager.js +141 -0
  340. package/dist/plugins/manager.js.map +1 -0
  341. package/dist/plugins/validation.d.ts +18 -0
  342. package/dist/plugins/validation.d.ts.map +1 -0
  343. package/dist/plugins/validation.js +81 -0
  344. package/dist/plugins/validation.js.map +1 -0
  345. package/dist/security/auth.d.ts +23 -0
  346. package/dist/security/auth.d.ts.map +1 -0
  347. package/dist/security/auth.js +56 -0
  348. package/dist/security/auth.js.map +1 -0
  349. package/dist/security/keychain.d.ts +60 -0
  350. package/dist/security/keychain.d.ts.map +1 -0
  351. package/dist/security/keychain.js +213 -0
  352. package/dist/security/keychain.js.map +1 -0
  353. package/dist/utils/google-auth.d.ts +21 -0
  354. package/dist/utils/google-auth.d.ts.map +1 -0
  355. package/dist/utils/google-auth.js +135 -0
  356. package/dist/utils/google-auth.js.map +1 -0
  357. package/dist/utils/retry.d.ts +5 -0
  358. package/dist/utils/retry.d.ts.map +1 -0
  359. package/dist/utils/retry.js +34 -0
  360. package/dist/utils/retry.js.map +1 -0
  361. package/docs/README.md +13 -0
  362. package/docs/api.md +210 -0
  363. package/docs/getting-started.md +100 -0
  364. package/docs/plugins.md +306 -0
  365. package/docs-site/.vitepress/config.ts +59 -0
  366. package/docs-site/README.md +12 -0
  367. package/docs-site/index.md +30 -0
  368. package/eslint.config.js +29 -0
  369. package/install.ps1 +334 -0
  370. package/install.sh +1119 -0
  371. package/local-install.sh +304 -0
  372. package/package.json +90 -0
  373. package/packages/README.md +11 -0
  374. package/packages/plugin-sdk/README.md +12 -0
  375. package/packages/plugin-sdk/package.json +22 -0
  376. package/packages/plugin-sdk/src/README.md +11 -0
  377. package/packages/plugin-sdk/src/index.ts +191 -0
  378. package/sdks/README.md +26 -0
  379. package/sdks/csharp/ConductorClient.cs +65 -0
  380. package/sdks/csharp/README.md +11 -0
  381. package/sdks/go/README.md +11 -0
  382. package/sdks/go/conductor.go +257 -0
  383. package/sdks/java/ConductorClient.java +27 -0
  384. package/sdks/java/README.md +11 -0
  385. package/sdks/php/README.md +11 -0
  386. package/sdks/php/src/Client.php +72 -0
  387. package/sdks/python/README.md +12 -0
  388. package/sdks/python/conductor/__init__.py +227 -0
  389. package/sdks/python/pyproject.toml +30 -0
  390. package/sdks/ruby/README.md +11 -0
  391. package/sdks/ruby/lib/conductor.rb +46 -0
  392. package/sdks/rust/Cargo.toml +14 -0
  393. package/sdks/rust/README.md +11 -0
  394. package/sdks/swift/README.md +11 -0
  395. package/sdks/swift/Sources/Conductor/ConductorClient.swift +65 -0
  396. package/skills/conductor-mcp/SKILL.md +38 -0
  397. package/src/README.md +20 -0
  398. package/src/ai/README.md +18 -0
  399. package/src/ai/base.ts +93 -0
  400. package/src/ai/claude.ts +162 -0
  401. package/src/ai/gemini.ts +188 -0
  402. package/src/ai/maestro.ts +168 -0
  403. package/src/ai/manager.ts +537 -0
  404. package/src/ai/ollama.ts +186 -0
  405. package/src/ai/openai.ts +147 -0
  406. package/src/ai/openrouter.ts +152 -0
  407. package/src/bot/README.md +12 -0
  408. package/src/bot/slack.ts +164 -0
  409. package/src/bot/telegram.ts +185 -0
  410. package/src/cli/README.md +24 -0
  411. package/src/cli/commands/README.md +20 -0
  412. package/src/cli/commands/ai.ts +170 -0
  413. package/src/cli/commands/doctor.ts +221 -0
  414. package/src/cli/commands/init.ts +348 -0
  415. package/src/cli/commands/install.ts +792 -0
  416. package/src/cli/commands/lifecycle.ts +95 -0
  417. package/src/cli/commands/marketplace.ts +253 -0
  418. package/src/cli/commands/mcp.ts +92 -0
  419. package/src/cli/commands/onboard.ts +248 -0
  420. package/src/cli/commands/plugin-create.ts +130 -0
  421. package/src/cli/commands/plugins.ts +36 -0
  422. package/src/cli/commands/release.ts +251 -0
  423. package/src/cli/commands/telegram.ts +25 -0
  424. package/src/cli/index.ts +450 -0
  425. package/src/config/README.md +11 -0
  426. package/src/config/oauth.ts +26 -0
  427. package/src/core/README.md +22 -0
  428. package/src/core/audit.ts +291 -0
  429. package/src/core/circuit-breaker.ts +129 -0
  430. package/src/core/conductor.ts +240 -0
  431. package/src/core/config.ts +149 -0
  432. package/src/core/database.ts +411 -0
  433. package/src/core/errors.ts +275 -0
  434. package/src/core/health.ts +159 -0
  435. package/src/core/interfaces.ts +75 -0
  436. package/src/core/logger.ts +33 -0
  437. package/src/core/rbac.ts +321 -0
  438. package/src/core/retry.ts +61 -0
  439. package/src/core/webhooks.ts +234 -0
  440. package/src/core/zero-config.ts +72 -0
  441. package/src/dashboard/README.md +15 -0
  442. package/src/dashboard/cli.ts +48 -0
  443. package/src/dashboard/index.html +3426 -0
  444. package/src/dashboard/server.ts +1544 -0
  445. package/src/mcp/README.md +20 -0
  446. package/src/mcp/server.ts +475 -0
  447. package/src/mcp/tools/README.md +11 -0
  448. package/src/mcp/tools/misc.ts +61 -0
  449. package/src/plugins/README.md +28 -0
  450. package/src/plugins/builtin/README.md +23 -0
  451. package/src/plugins/builtin/calculator.ts +178 -0
  452. package/src/plugins/builtin/colors.ts +201 -0
  453. package/src/plugins/builtin/cron.ts +649 -0
  454. package/src/plugins/builtin/crypto.ts +85 -0
  455. package/src/plugins/builtin/database.ts +235 -0
  456. package/src/plugins/builtin/docker.ts +426 -0
  457. package/src/plugins/builtin/fun.ts +118 -0
  458. package/src/plugins/builtin/gcal.ts +305 -0
  459. package/src/plugins/builtin/gdrive.ts +326 -0
  460. package/src/plugins/builtin/github-actions.ts +666 -0
  461. package/src/plugins/builtin/github.ts +912 -0
  462. package/src/plugins/builtin/gmail.ts +492 -0
  463. package/src/plugins/builtin/hash.ts +98 -0
  464. package/src/plugins/builtin/homekit.ts +389 -0
  465. package/src/plugins/builtin/index.ts +116 -0
  466. package/src/plugins/builtin/jira.ts +380 -0
  467. package/src/plugins/builtin/linear.ts +448 -0
  468. package/src/plugins/builtin/lumen.ts +497 -0
  469. package/src/plugins/builtin/memory.ts +200 -0
  470. package/src/plugins/builtin/n8n.ts +565 -0
  471. package/src/plugins/builtin/network.ts +92 -0
  472. package/src/plugins/builtin/notes.ts +689 -0
  473. package/src/plugins/builtin/notion.ts +348 -0
  474. package/src/plugins/builtin/shell.ts +334 -0
  475. package/src/plugins/builtin/slack.ts +327 -0
  476. package/src/plugins/builtin/spotify.ts +665 -0
  477. package/src/plugins/builtin/stripe.ts +388 -0
  478. package/src/plugins/builtin/system.ts +93 -0
  479. package/src/plugins/builtin/text-tools.ts +150 -0
  480. package/src/plugins/builtin/timezone.ts +173 -0
  481. package/src/plugins/builtin/todoist.ts +625 -0
  482. package/src/plugins/builtin/translate.ts +47 -0
  483. package/src/plugins/builtin/url-tools.ts +73 -0
  484. package/src/plugins/builtin/vercel.ts +546 -0
  485. package/src/plugins/builtin/weather.ts +112 -0
  486. package/src/plugins/builtin/x.ts +440 -0
  487. package/src/plugins/manager.ts +213 -0
  488. package/src/plugins/validation.ts +94 -0
  489. package/src/security/README.md +12 -0
  490. package/src/security/auth.ts +72 -0
  491. package/src/security/keychain.ts +226 -0
  492. package/src/utils/README.md +12 -0
  493. package/src/utils/google-auth.ts +159 -0
  494. package/src/utils/retry.ts +41 -0
  495. package/test-all.mjs +1256 -0
  496. package/test.mjs +633 -0
  497. package/tests/README.md +19 -0
  498. package/tests/calculator.test.ts +54 -0
  499. package/tests/docker.test.ts +42 -0
  500. package/tests/load.test.ts +129 -0
  501. package/tests/mcp.test.ts +14 -0
  502. package/tests/shell.test.ts +42 -0
  503. package/tsconfig.json +21 -0
  504. 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.
@@ -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
+ }