@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,213 @@
1
+ import crypto from 'crypto';
2
+ import fs from 'fs/promises';
3
+ import { readFileSync, mkdirSync, writeFileSync } from 'fs';
4
+ import { execSync } from 'child_process';
5
+ import path from 'path';
6
+ import os from 'os';
7
+ /**
8
+ * Keychain — encrypted credential storage.
9
+ *
10
+ * Supports two formats:
11
+ * v2 — AES-256-GCM with machine-specific key derivation (written by install.sh)
12
+ * v1 — AES-256-CBC legacy format (written by older versions)
13
+ *
14
+ * New writes always use the v2 format.
15
+ */
16
+ export class Keychain {
17
+ keychainDir;
18
+ masterKey;
19
+ constructor(configDir) {
20
+ this.keychainDir = path.join(configDir, 'keychain');
21
+ this.masterKey = this.deriveMasterKey();
22
+ }
23
+ /**
24
+ * Derive a machine-specific master key.
25
+ * Matches the install.sh derivation so credentials saved by either
26
+ * the installer or the app are interchangeable.
27
+ */
28
+ deriveMasterKey() {
29
+ const machineSecret = this.getMachineSecret();
30
+ const salt = crypto.createHash('sha256').update('conductor:keychain:v1').digest();
31
+ return crypto.scryptSync(machineSecret, salt, 32, { N: 16384, r: 8, p: 1 });
32
+ }
33
+ /**
34
+ * Get a machine-specific secret for key derivation.
35
+ * Mirrors the logic in install.sh's save_cred function.
36
+ */
37
+ getMachineSecret() {
38
+ // Linux: /etc/machine-id or /var/lib/dbus/machine-id
39
+ const linuxSources = ['/etc/machine-id', '/var/lib/dbus/machine-id', '/proc/sys/kernel/random/boot_id'];
40
+ for (const src of linuxSources) {
41
+ try {
42
+ const data = readFileSync(src, 'utf8').trim();
43
+ if (data)
44
+ return data;
45
+ }
46
+ catch {
47
+ // Not available on this platform
48
+ }
49
+ }
50
+ // macOS: IOPlatformUUID
51
+ if (process.platform === 'darwin') {
52
+ try {
53
+ const out = execSync("ioreg -rd1 -c IOPlatformExpertDevice | awk '/IOPlatformUUID/{print $NF}'", {
54
+ encoding: 'utf8',
55
+ stdio: ['pipe', 'pipe', 'pipe'],
56
+ })
57
+ .trim()
58
+ .replace(/"/g, '');
59
+ if (out)
60
+ return out;
61
+ }
62
+ catch {
63
+ // ioreg not available
64
+ }
65
+ }
66
+ // Windows: MachineGuid from registry
67
+ if (process.platform === 'win32') {
68
+ try {
69
+ const out = execSync('reg query "HKLM\\SOFTWARE\\Microsoft\\Cryptography" /v MachineGuid', {
70
+ encoding: 'utf8',
71
+ stdio: ['pipe', 'pipe', 'pipe'],
72
+ });
73
+ const match = out.match(/MachineGuid\s+REG_SZ\s+(.+)/);
74
+ if (match?.[1]?.trim())
75
+ return match[1].trim();
76
+ }
77
+ catch {
78
+ // Registry not accessible
79
+ }
80
+ }
81
+ // Persistent fallback: Save a random UUID to a file if hardware IDs fail.
82
+ // This is safer than hostname which can change.
83
+ const fallbackPath = path.join(this.keychainDir, 'machine_secret');
84
+ try {
85
+ if (readFileSync(fallbackPath, 'utf8').trim()) {
86
+ return readFileSync(fallbackPath, 'utf8').trim();
87
+ }
88
+ }
89
+ catch {
90
+ try {
91
+ const secret = crypto.randomUUID();
92
+ // Use synchronous write since this is inside deriveMasterKey constructor path
93
+ mkdirSync(this.keychainDir, { recursive: true, mode: 0o700 });
94
+ writeFileSync(fallbackPath, secret, { mode: 0o600 });
95
+ return secret;
96
+ }
97
+ catch {
98
+ // Absolute last resort
99
+ return os.hostname();
100
+ }
101
+ }
102
+ return os.hostname();
103
+ }
104
+ /**
105
+ * Store an encrypted credential (v2 format: AES-256-GCM).
106
+ */
107
+ async set(service, key, value) {
108
+ await fs.mkdir(this.keychainDir, { recursive: true, mode: 0o700 });
109
+ // Enforce 0700 permissions in case dir already existed with wrong perms
110
+ await fs.chmod(this.keychainDir, 0o700).catch(() => { });
111
+ const iv = crypto.randomBytes(12); // 96-bit IV for GCM
112
+ const cipher = crypto.createCipheriv('aes-256-gcm', this.masterKey, iv);
113
+ let encrypted = cipher.update(value, 'utf8', 'hex');
114
+ encrypted += cipher.final('hex');
115
+ const tag = cipher.getAuthTag().toString('hex');
116
+ // Format: v2:iv:tag:ciphertext
117
+ const result = ['v2', iv.toString('hex'), tag, encrypted].join(':');
118
+ const filepath = path.join(this.keychainDir, `${service}.${key}.enc`);
119
+ await fs.writeFile(filepath, result, { mode: 0o600 });
120
+ }
121
+ /**
122
+ * Retrieve and decrypt a credential.
123
+ * Handles both v2 (GCM) and legacy v1 (CBC) formats.
124
+ */
125
+ async get(service, key) {
126
+ try {
127
+ const filepath = path.join(this.keychainDir, `${service}.${key}.enc`);
128
+ const data = await fs.readFile(filepath, 'utf-8');
129
+ return this.decrypt(data.trim());
130
+ }
131
+ catch {
132
+ return null;
133
+ }
134
+ }
135
+ /**
136
+ * Delete a credential.
137
+ */
138
+ async delete(service, key) {
139
+ const filepath = path.join(this.keychainDir, `${service}.${key}.enc`);
140
+ try {
141
+ await fs.unlink(filepath);
142
+ }
143
+ catch {
144
+ // File doesn't exist — that's fine
145
+ }
146
+ }
147
+ /**
148
+ * Check if a credential exists.
149
+ */
150
+ async has(service, key) {
151
+ try {
152
+ const filepath = path.join(this.keychainDir, `${service}.${key}.enc`);
153
+ await fs.access(filepath);
154
+ return true;
155
+ }
156
+ catch {
157
+ return false;
158
+ }
159
+ }
160
+ /**
161
+ * List all credential keys for a service.
162
+ */
163
+ async list(service) {
164
+ try {
165
+ const files = await fs.readdir(this.keychainDir);
166
+ return files
167
+ .filter((f) => f.startsWith(`${service}.`) && f.endsWith('.enc'))
168
+ .map((f) => f.replace(`${service}.`, '').replace('.enc', ''));
169
+ }
170
+ catch {
171
+ return [];
172
+ }
173
+ }
174
+ /**
175
+ * Decrypt a stored value, auto-detecting format version.
176
+ */
177
+ decrypt(stored) {
178
+ const parts = stored.split(':');
179
+ if (parts[0] === 'v2' && parts.length === 4) {
180
+ // v2: AES-256-GCM — iv:tag:ciphertext
181
+ return this.decryptGCM(parts[1], parts[2], parts[3]);
182
+ }
183
+ if (parts.length === 2) {
184
+ // Legacy v1: AES-256-CBC — iv:ciphertext (no version prefix)
185
+ return this.decryptCBC(parts[0], parts[1]);
186
+ }
187
+ throw new Error('Unrecognized credential format');
188
+ }
189
+ /**
190
+ * AES-256-GCM decryption (v2 format, matches install.sh).
191
+ */
192
+ decryptGCM(ivHex, tagHex, cipherHex) {
193
+ const iv = Buffer.from(ivHex, 'hex');
194
+ const tag = Buffer.from(tagHex, 'hex');
195
+ const decipher = crypto.createDecipheriv('aes-256-gcm', this.masterKey, iv);
196
+ decipher.setAuthTag(tag);
197
+ let decrypted = decipher.update(cipherHex, 'hex', 'utf8');
198
+ decrypted += decipher.final('utf8');
199
+ return decrypted;
200
+ }
201
+ /**
202
+ * AES-256-CBC decryption (legacy v1 format).
203
+ * Kept for backward-compat with credentials written before the v2 migration.
204
+ */
205
+ decryptCBC(ivHex, cipherHex) {
206
+ const iv = Buffer.from(ivHex, 'hex');
207
+ const decipher = crypto.createDecipheriv('aes-256-cbc', this.masterKey, iv);
208
+ let decrypted = decipher.update(cipherHex, 'hex', 'utf8');
209
+ decrypted += decipher.final('utf8');
210
+ return decrypted;
211
+ }
212
+ }
213
+ //# sourceMappingURL=keychain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keychain.js","sourceRoot":"","sources":["../../src/security/keychain.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB;;;;;;;;GAQG;AACH,MAAM,OAAO,QAAQ;IACX,WAAW,CAAS;IACpB,SAAS,CAAS;IAE1B,YAAY,SAAiB;QAC3B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACpD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;IAC1C,CAAC;IAED;;;;OAIG;IACK,eAAe;QACrB,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC9C,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC,MAAM,EAAE,CAAC;QAClF,OAAO,MAAM,CAAC,UAAU,CAAC,aAAa,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED;;;OAGG;IACK,gBAAgB;QACtB,qDAAqD;QACrD,MAAM,YAAY,GAAG,CAAC,iBAAiB,EAAE,0BAA0B,EAAE,iCAAiC,CAAC,CAAC;QAExG,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC9C,IAAI,IAAI;oBAAE,OAAO,IAAI,CAAC;YACxB,CAAC;YAAC,MAAM,CAAC;gBACP,iCAAiC;YACnC,CAAC;QACH,CAAC;QAED,wBAAwB;QACxB,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAClC,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,QAAQ,CAAC,0EAA0E,EAAE;oBAC/F,QAAQ,EAAE,MAAM;oBAChB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;iBAChC,CAAC;qBACC,IAAI,EAAE;qBACN,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBACrB,IAAI,GAAG;oBAAE,OAAO,GAAG,CAAC;YACtB,CAAC;YAAC,MAAM,CAAC;gBACP,sBAAsB;YACxB,CAAC;QACH,CAAC;QAED,qCAAqC;QACrC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,QAAQ,CAAC,oEAAoE,EAAE;oBACzF,QAAQ,EAAE,MAAM;oBAChB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;iBAChC,CAAC,CAAC;gBACH,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;gBACvD,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE;oBAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACjD,CAAC;YAAC,MAAM,CAAC;gBACP,0BAA0B;YAC5B,CAAC;QACH,CAAC;QAED,0EAA0E;QAC1E,gDAAgD;QAChD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;QACnE,IAAI,CAAC;YACH,IAAI,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC9C,OAAO,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;YACnD,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;gBACnC,8EAA8E;gBAC9E,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC9D,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;gBACrD,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,MAAM,CAAC;gBACP,uBAAuB;gBACvB,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC;YACvB,CAAC;QACH,CAAC;QAED,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,OAAe,EAAE,GAAW,EAAE,KAAa;QACnD,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACnE,wEAAwE;QACxE,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAExD,MAAM,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,oBAAoB;QACvD,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAExE,IAAI,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QACpD,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAEhD,+BAA+B;QAC/B,MAAM,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEpE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,OAAO,IAAI,GAAG,MAAM,CAAC,CAAC;QACtE,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACxD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,GAAG,CAAC,OAAe,EAAE,GAAW;QACpC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,OAAO,IAAI,GAAG,MAAM,CAAC,CAAC;YACtE,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAClD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,OAAe,EAAE,GAAW;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,OAAO,IAAI,GAAG,MAAM,CAAC,CAAC;QACtE,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,mCAAmC;QACrC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,OAAe,EAAE,GAAW;QACpC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,OAAO,IAAI,GAAG,MAAM,CAAC,CAAC;YACtE,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC1B,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,OAAe;QACxB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACjD,OAAO,KAAK;iBACT,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;iBAChE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,OAAO,GAAG,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;QAClE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,OAAO,CAAC,MAAc;QAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAEhC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5C,sCAAsC;YACtC,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,6DAA6D;YAC7D,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;IAED;;OAEG;IACK,UAAU,CAAC,KAAa,EAAE,MAAc,EAAE,SAAiB;QACjE,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACrC,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACvC,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC5E,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAEzB,IAAI,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QAC1D,SAAS,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACpC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;OAGG;IACK,UAAU,CAAC,KAAa,EAAE,SAAiB;QACjD,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAE5E,IAAI,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QAC1D,SAAS,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACpC,OAAO,SAAS,CAAC;IACnB,CAAC;CACF"}
@@ -0,0 +1,21 @@
1
+ import { Conductor } from '../core/conductor.js';
2
+ export interface GoogleAuthOptions {
3
+ scopes: string[];
4
+ port?: number;
5
+ }
6
+ export declare class GoogleAuthManager {
7
+ private conductor;
8
+ private keychain;
9
+ private oauth2Client;
10
+ constructor(conductor: Conductor);
11
+ /**
12
+ * Start the browser-based OAuth flow.
13
+ * Returns a promise that resolves when authentication is complete.
14
+ */
15
+ login(options: GoogleAuthOptions): Promise<void>;
16
+ /**
17
+ * Import OAuth credentials from a Google JSON file.
18
+ */
19
+ importFromJson(filePath: string): Promise<void>;
20
+ }
21
+ //# sourceMappingURL=google-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google-auth.d.ts","sourceRoot":"","sources":["../../src/utils/google-auth.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAKjD,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,YAAY,CAAa;gBAErB,SAAS,EAAE,SAAS;IAKhC;;;OAGG;IACG,KAAK,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IA2GtD;;OAEG;IACG,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAqBtD"}
@@ -0,0 +1,135 @@
1
+ import { google } from 'googleapis';
2
+ import http from 'http';
3
+ import { URL } from 'url';
4
+ import { Keychain } from '../security/keychain.js';
5
+ import { getOAuthCredentials } from '../config/oauth.js';
6
+ import fs from 'fs/promises';
7
+ export class GoogleAuthManager {
8
+ conductor;
9
+ keychain;
10
+ oauth2Client = null;
11
+ constructor(conductor) {
12
+ this.conductor = conductor;
13
+ this.keychain = new Keychain(conductor.getConfig().getConfigDir());
14
+ }
15
+ /**
16
+ * Start the browser-based OAuth flow.
17
+ * Returns a promise that resolves when authentication is complete.
18
+ */
19
+ async login(options) {
20
+ let creds;
21
+ try {
22
+ creds = getOAuthCredentials(this.conductor, 'google');
23
+ }
24
+ catch {
25
+ console.log('\n 🔑 Google OAuth configuration missing.');
26
+ console.log(' To get these, go to: https://console.cloud.google.com/apis/credentials');
27
+ console.log(' 1. Create a "OAuth client ID" for "Web application"');
28
+ console.log(' 2. Set Redirect URI to: http://localhost:3000/callback\n');
29
+ const { default: inquirer } = await import('inquirer');
30
+ const answers = await inquirer.prompt([
31
+ {
32
+ type: 'input',
33
+ name: 'clientId',
34
+ message: 'Enter your Google Client ID:',
35
+ validate: (input) => input.length > 0 || 'Client ID is required',
36
+ },
37
+ {
38
+ type: 'password',
39
+ name: 'clientSecret',
40
+ message: 'Enter your Google Client Secret:',
41
+ mask: '*',
42
+ validate: (input) => input.length > 0 || 'Client Secret is required',
43
+ },
44
+ ]);
45
+ await this.conductor.getConfig().set('oauth.google', {
46
+ clientId: answers.clientId,
47
+ clientSecret: answers.clientSecret,
48
+ redirectUri: 'http://localhost:3000/callback',
49
+ });
50
+ console.log('\n ✅ Credentials saved locally.');
51
+ creds = {
52
+ clientId: answers.clientId,
53
+ clientSecret: answers.clientSecret,
54
+ redirectUri: 'http://localhost:3000/callback',
55
+ };
56
+ }
57
+ const port = options.port || 3000;
58
+ const redirectUri = creds.redirectUri || `http://localhost:${port}/google/callback`;
59
+ this.oauth2Client = new google.auth.OAuth2(creds.clientId, creds.clientSecret, redirectUri);
60
+ const authUrl = this.oauth2Client.generateAuthUrl({
61
+ access_type: 'offline',
62
+ prompt: 'consent',
63
+ scope: options.scopes,
64
+ });
65
+ const open = (await import('open')).default;
66
+ await open(authUrl);
67
+ console.log('\n 🌍 Opening browser for Google authentication...');
68
+ console.log(' ⌛ Waiting for authorization...\n');
69
+ return new Promise((resolve, reject) => {
70
+ const server = http.createServer(async (req, res) => {
71
+ const url = new URL(req.url || '', `http://localhost:${port}`);
72
+ if (url.pathname === '/google/callback' || url.pathname === '/callback') {
73
+ const code = url.searchParams.get('code');
74
+ if (code) {
75
+ try {
76
+ const { tokens } = await this.oauth2Client.getToken(code);
77
+ // Save tokens to keychain
78
+ if (tokens.access_token) {
79
+ await this.keychain.set('google', 'access_token', tokens.access_token);
80
+ }
81
+ if (tokens.refresh_token) {
82
+ await this.keychain.set('google', 'refresh_token', tokens.refresh_token);
83
+ }
84
+ res.writeHead(200, { 'Content-Type': 'text/html' });
85
+ res.end(`
86
+ <html>
87
+ <body style="font-family: sans-serif; text-align: center; padding: 50px; background: #f4f7f6;">
88
+ <div style="max-width: 500px; margin: auto; background: white; padding: 40px; border-radius: 12px; box-shadow: 0 4px 12px rgba(0,0,0,0.1);">
89
+ <h1 style="color: #2e7d32;">✅ Success!</h1>
90
+ <p style="font-size: 18px; color: #444;">Conductor is now connected to your Google account.</p>
91
+ <p style="color: #666;">You can safely close this window and return to the terminal.</p>
92
+ </div>
93
+ </body>
94
+ </html>
95
+ `);
96
+ server.close();
97
+ resolve();
98
+ }
99
+ catch (error) {
100
+ res.writeHead(500, { 'Content-Type': 'text/html' });
101
+ res.end('<h1>Authentication failed</h1>');
102
+ server.close();
103
+ reject(error);
104
+ }
105
+ }
106
+ }
107
+ });
108
+ server.listen(port);
109
+ server.on('error', reject);
110
+ });
111
+ }
112
+ /**
113
+ * Import OAuth credentials from a Google JSON file.
114
+ */
115
+ async importFromJson(filePath) {
116
+ try {
117
+ const data = await fs.readFile(filePath, 'utf-8');
118
+ const json = JSON.parse(data);
119
+ const web = json.web || json.installed;
120
+ if (!web || !web.client_id || !web.client_secret) {
121
+ throw new Error('Invalid Google OAuth JSON file structure.');
122
+ }
123
+ await this.conductor.getConfig().set('oauth.google', {
124
+ clientId: web.client_id,
125
+ clientSecret: web.client_secret,
126
+ redirectUri: web.redirect_uris?.[0] || 'http://localhost:3000/callback',
127
+ });
128
+ console.log(` ✅ Successfully imported Google credentials from ${filePath}`);
129
+ }
130
+ catch (error) {
131
+ throw new Error(`Failed to import JSON: ${error.message}`);
132
+ }
133
+ }
134
+ }
135
+ //# sourceMappingURL=google-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google-auth.js","sourceRoot":"","sources":["../../src/utils/google-auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Utility for handling network retries with exponential backoff.
3
+ */
4
+ export declare function withRetry<T>(operation: () => Promise<T>, maxRetries?: number, baseDelayMs?: number): Promise<T>;
5
+ //# sourceMappingURL=retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,wBAAsB,SAAS,CAAC,CAAC,EAC/B,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,UAAU,GAAE,MAAU,EACtB,WAAW,GAAE,MAAa,GACzB,OAAO,CAAC,CAAC,CAAC,CAgCZ"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Utility for handling network retries with exponential backoff.
3
+ */
4
+ export async function withRetry(operation, maxRetries = 3, baseDelayMs = 1000) {
5
+ let attempt = 0;
6
+ while (true) {
7
+ try {
8
+ return await operation();
9
+ }
10
+ catch (error) {
11
+ attempt++;
12
+ if (attempt > maxRetries) {
13
+ throw error;
14
+ }
15
+ // Determine if error is retryable.
16
+ // Network errors (fetch failed), 429 Too Many Requests, and 5xx Server Errors are retryable.
17
+ const isRetryable = error.message?.includes('429') ||
18
+ error.message?.includes('500') ||
19
+ error.message?.includes('502') ||
20
+ error.message?.includes('503') ||
21
+ error.message?.includes('fetch failed') ||
22
+ error.code === 'ECONNRESET' ||
23
+ error.code === 'ETIMEDOUT';
24
+ if (!isRetryable) {
25
+ // e.g. 400 Bad Request, 401 Unauthorized, 403 Forbidden shouldn't be retried
26
+ throw error;
27
+ }
28
+ const delay = baseDelayMs * Math.pow(2, attempt - 1);
29
+ process.stderr.write(` ⚠ Operation failed. Retrying in ${delay}ms (Attempt ${attempt}/${maxRetries})...\n`);
30
+ await new Promise((resolve) => setTimeout(resolve, delay));
31
+ }
32
+ }
33
+ }
34
+ //# sourceMappingURL=retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,SAA2B,EAC3B,aAAqB,CAAC,EACtB,cAAsB,IAAI;IAE1B,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,MAAM,SAAS,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,EAAE,CAAC;YACV,IAAI,OAAO,GAAG,UAAU,EAAE,CAAC;gBACzB,MAAM,KAAK,CAAC;YACd,CAAC;YAED,mCAAmC;YACnC,6FAA6F;YAC7F,MAAM,WAAW,GACf,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC;gBAC9B,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC;gBAC9B,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC;gBAC9B,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC;gBAC9B,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,cAAc,CAAC;gBACvC,KAAK,CAAC,IAAI,KAAK,YAAY;gBAC3B,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC;YAE7B,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,6EAA6E;gBAC7E,MAAM,KAAK,CAAC;YACd,CAAC;YAED,MAAM,KAAK,GAAG,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;YACrD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qCAAqC,KAAK,eAAe,OAAO,IAAI,UAAU,QAAQ,CAAC,CAAC;YAC7G,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;AACH,CAAC"}
package/docs/README.md ADDED
@@ -0,0 +1,13 @@
1
+ # docs
2
+
3
+ Markdown documentation for Conductor.
4
+
5
+ ## Contents
6
+
7
+ - `getting-started.md` - Installation and initial setup guide
8
+ - `api.md` - API reference documentation
9
+ - `plugins.md` - Plugin development guide
10
+
11
+ ## Architecture
12
+
13
+ These are raw markdown docs for local reference. For the rendered documentation site, see `docs-site/` (VitePress). Keep docs in sync with code changes — update API docs when interfaces change and plugin docs when the plugin system evolves.
package/docs/api.md ADDED
@@ -0,0 +1,210 @@
1
+ # Conductor Dashboard API
2
+
3
+ All API routes are served by the Express dashboard on `http://127.0.0.1:4242`.
4
+
5
+ ## Authentication
6
+
7
+ Every `/api/*` request (except `/api/auth/google/callback`) must include:
8
+
9
+ ```
10
+ Authorization: Bearer <token>
11
+ ```
12
+
13
+ The token is generated on first startup and stored at `~/.conductor/dashboard.token` (mode 0600).
14
+ It is also injected into the served HTML as `<meta name="dashboard-token" content="...">`.
15
+
16
+ ---
17
+
18
+ ## Status
19
+
20
+ ### GET /api/status
21
+ Returns server version and environment info.
22
+
23
+ **Response**
24
+ ```json
25
+ {
26
+ "version": "1.0.0",
27
+ "configDir": "/Users/alex/.conductor",
28
+ "nodeVersion": "v20.11.0",
29
+ "platform": "darwin"
30
+ }
31
+ ```
32
+
33
+ ---
34
+
35
+ ## Config
36
+
37
+ ### GET /api/config
38
+ Returns the full config object (all keys).
39
+
40
+ ### POST /api/config
41
+ Set a config value by dot-notation key.
42
+
43
+ **Body**
44
+ ```json
45
+ { "key": "ai.provider", "value": "claude" }
46
+ ```
47
+
48
+ ---
49
+
50
+ ## Plugins
51
+
52
+ ### GET /api/plugins
53
+ Returns plugin registry state.
54
+
55
+ **Response**
56
+ ```json
57
+ {
58
+ "installed": ["gmail", "github"],
59
+ "enabled": ["gmail"],
60
+ "all": ["calculator", "gmail", ...],
61
+ "requiredCreds": { "gmail": [{"service": "google", "key": "access_token"}] }
62
+ }
63
+ ```
64
+
65
+ ### POST /api/plugins/toggle
66
+ Enable or disable a plugin. Returns 400 if required credentials are missing.
67
+
68
+ **Body**
69
+ ```json
70
+ { "plugin": "gmail", "enabled": true }
71
+ ```
72
+
73
+ ---
74
+
75
+ ## Credentials
76
+
77
+ ### GET /api/credentials
78
+ Returns credential status (does NOT return values).
79
+
80
+ **Response**
81
+ ```json
82
+ [
83
+ { "service": "claude", "key": "api_key", "hasValue": true },
84
+ { "service": "github", "key": "token", "hasValue": false }
85
+ ]
86
+ ```
87
+
88
+ ### POST /api/credentials
89
+ Store an encrypted credential.
90
+
91
+ **Body**
92
+ ```json
93
+ { "service": "github", "key": "token", "value": "ghp_..." }
94
+ ```
95
+
96
+ ### DELETE /api/credentials/:service/:key
97
+ Delete a credential.
98
+
99
+ ---
100
+
101
+ ## Google OAuth
102
+
103
+ ### GET /api/auth/google/status
104
+ Returns `{ "connected": true/false }`.
105
+
106
+ ### GET /api/auth/google/url
107
+ Returns the Google OAuth authorization URL.
108
+
109
+ **Response**
110
+ ```json
111
+ { "url": "https://accounts.google.com/o/oauth2/auth?..." }
112
+ ```
113
+
114
+ ### GET /api/auth/google/callback
115
+ OAuth redirect endpoint — must be accessible without auth token (browser redirect).
116
+
117
+ ### DELETE /api/auth/google
118
+ Revoke stored Google tokens.
119
+
120
+ ---
121
+
122
+ ## Conversations
123
+
124
+ ### GET /api/conversations
125
+ Returns recent messages from the database.
126
+
127
+ **Response**
128
+ ```json
129
+ {
130
+ "messages": [
131
+ {
132
+ "user_id": "123456",
133
+ "role": "user",
134
+ "content": "What's the weather?",
135
+ "timestamp": "2026-03-12 10:00:00"
136
+ }
137
+ ]
138
+ }
139
+ ```
140
+
141
+ ---
142
+
143
+ ## Live Logs
144
+
145
+ ### GET /api/logs/stream
146
+ Server-Sent Events stream of log output.
147
+
148
+ **Response** (SSE)
149
+ ```
150
+ data: {"level":"info","message":"Dashboard started","timestamp":"2026-03-12T10:00:00.000Z"}
151
+
152
+ data: {"level":"error","message":"Plugin error: ...","timestamp":"..."}
153
+ ```
154
+
155
+ Levels: `info`, `warn`, `error`
156
+
157
+ ---
158
+
159
+ ## Activity
160
+
161
+ ### GET /api/activity
162
+ Returns recent activity log entries (up to 20).
163
+
164
+ ---
165
+
166
+ ## Lumen API Key
167
+
168
+ ### POST /api/lumen/key
169
+ Generate and store a new Lumen API key. Returns the plaintext key once.
170
+
171
+ **Response**
172
+ ```json
173
+ { "ok": true, "key": "cnd_..." }
174
+ ```
175
+
176
+ ### GET /api/lumen/key/status
177
+ Returns `{ "hasKey": true/false }`.
178
+
179
+ ### DELETE /api/lumen/key
180
+ Revoke the current API key.
181
+
182
+ ---
183
+
184
+ ## Lumen Agent
185
+
186
+ ### POST /api/lumen/ask
187
+ Forward a task to the local Lumen/Ollama agent.
188
+
189
+ **Auth**: `Authorization: Bearer <lumen-api-key>` (uses the Lumen API key, not the dashboard token)
190
+
191
+ **Body**
192
+ ```json
193
+ { "task": "Show git status", "max_iterations": 5 }
194
+ ```
195
+
196
+ ---
197
+
198
+ ## Todoist Proxy
199
+
200
+ All routes require `todoist / api_token` to be set in the keychain.
201
+
202
+ | Method | Path | Description |
203
+ |--------|------|-------------|
204
+ | GET | /api/todoist/status | Check if configured |
205
+ | GET | /api/todoist/projects | List all projects |
206
+ | GET | /api/todoist/tasks | List tasks (query: project_id, label, filter) |
207
+ | POST | /api/todoist/tasks | Create a task |
208
+ | POST | /api/todoist/tasks/:id | Update a task |
209
+ | POST | /api/todoist/tasks/:id/close | Complete a task |
210
+ | DELETE | /api/todoist/tasks/:id | Delete a task |