@commandable/mcp 0.1.3 → 0.2.1

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 (282) hide show
  1. package/{dist/app → .output}/nitro.json +1 -1
  2. package/{dist/app/public/_nuxt/-tOYwuj2.js → .output/public/_nuxt/B04gGCnx.js} +3 -3
  3. package/{dist/app/public/_nuxt/D-43HurL.js → .output/public/_nuxt/B2dAlp_u.js} +8 -8
  4. package/.output/public/_nuxt/Ba0BY0O0.js +1 -0
  5. package/.output/public/_nuxt/BvFUCPqA.js +1 -0
  6. package/{dist/app/public/_nuxt/BdctKXor.js → .output/public/_nuxt/Dm_hd4at.js} +1 -1
  7. package/{dist/app/public/_nuxt/BlP7Uu-5.js → .output/public/_nuxt/S2P9sd4n.js} +1 -1
  8. package/.output/public/_nuxt/builds/latest.json +1 -0
  9. package/.output/public/_nuxt/builds/meta/87720575-dfd4-475f-92c1-554fcd8b22f1.json +1 -0
  10. package/{dist/app/public/_nuxt/CsbkV5Bd.js → .output/public/_nuxt/d2XTSFt9.js} +1 -1
  11. package/{dist/app/server/chunks/build/_id_-DBwSV4AY.mjs → .output/server/chunks/build/_id_-Bnxenh08.mjs} +7 -7
  12. package/{dist/app/server/chunks/build/_id_-DBwSV4AY.mjs.map → .output/server/chunks/build/_id_-Bnxenh08.mjs.map} +1 -1
  13. package/{dist/app → .output}/server/chunks/build/client.precomputed.mjs +1 -1
  14. package/{dist/app/server/chunks/build/fetch-ZbqIFhDG.mjs → .output/server/chunks/build/fetch-BmYZnj75.mjs} +58 -6
  15. package/.output/server/chunks/build/fetch-BmYZnj75.mjs.map +1 -0
  16. package/{dist/app/server/chunks/build/index-C8flTcKI.mjs → .output/server/chunks/build/index-CL-Gkd-Y.mjs} +4 -4
  17. package/.output/server/chunks/build/index-CL-Gkd-Y.mjs.map +1 -0
  18. package/{dist/app → .output}/server/chunks/build/server.mjs +3 -3
  19. package/{dist/app → .output}/server/chunks/nitro/nitro.mjs +419 -206
  20. package/.output/server/chunks/nitro/nitro.mjs.map +1 -0
  21. package/{dist/app → .output}/server/chunks/routes/api/index.get.mjs +1 -1
  22. package/{dist/app → .output}/server/chunks/routes/api/index.post.mjs +1 -1
  23. package/{dist/app → .output}/server/chunks/routes/api/integrations/_id/credentials-config.get.mjs +1 -1
  24. package/{dist/app → .output}/server/chunks/routes/api/integrations/_id/credentials-status.get.mjs +1 -1
  25. package/{dist/app → .output}/server/chunks/routes/api/integrations/_id/credentials.delete.mjs +1 -1
  26. package/{dist/app → .output}/server/chunks/routes/api/integrations/_id/credentials.post.mjs +1 -1
  27. package/{dist/app → .output}/server/chunks/routes/api/integrations/_id/permissions.post.mjs +1 -1
  28. package/.output/server/chunks/routes/api/integrations/_id/tools.delete.mjs +51 -0
  29. package/.output/server/chunks/routes/api/integrations/_id/tools.delete.mjs.map +1 -0
  30. package/.output/server/chunks/routes/api/integrations/_id/tools.get.mjs +57 -0
  31. package/.output/server/chunks/routes/api/integrations/_id/tools.get.mjs.map +1 -0
  32. package/.output/server/chunks/routes/api/integrations/_id/toolsets.get.mjs +53 -0
  33. package/.output/server/chunks/routes/api/integrations/_id/toolsets.get.mjs.map +1 -0
  34. package/{dist/app → .output}/server/chunks/routes/api/integrations/_id/toolsets.post.mjs +1 -1
  35. package/.output/server/chunks/routes/api/integrations/_id_.delete.mjs +55 -0
  36. package/.output/server/chunks/routes/api/integrations/_id_.delete.mjs.map +1 -0
  37. package/{dist/app → .output}/server/chunks/routes/mcp/create.mjs +1 -1
  38. package/{dist/app → .output}/server/chunks/routes/mcp.mjs +1 -1
  39. package/{dist/app → .output}/server/chunks/routes/renderer.mjs +1 -1
  40. package/{dist/app → .output}/server/index.mjs +1 -1
  41. package/{dist/app → .output}/server/package.json +2 -2
  42. package/LICENSE +17 -6
  43. package/README.md +32 -32
  44. package/bin/cli.mjs +552 -0
  45. package/bin/commandable-mcp.mjs +8 -0
  46. package/package.json +30 -40
  47. package/dist/app/public/_nuxt/DU1mG77A.js +0 -1
  48. package/dist/app/public/_nuxt/builds/latest.json +0 -1
  49. package/dist/app/public/_nuxt/builds/meta/669e3b7a-802b-4f02-b218-3c758cac3ab7.json +0 -1
  50. package/dist/app/public/_nuxt/uS7FY2am.js +0 -1
  51. package/dist/app/server/chunks/build/fetch-ZbqIFhDG.mjs.map +0 -1
  52. package/dist/app/server/chunks/build/index-C8flTcKI.mjs.map +0 -1
  53. package/dist/app/server/chunks/nitro/nitro.mjs.map +0 -1
  54. package/dist/app/server/chunks/routes/api/integrations/_id_.delete.mjs +0 -44
  55. package/dist/app/server/chunks/routes/api/integrations/_id_.delete.mjs.map +0 -1
  56. package/dist/app/server/migrations/pg/0000_initial.sql +0 -74
  57. package/dist/app/server/migrations/pg/meta/_journal.json +0 -13
  58. package/dist/app/server/migrations/sqlite/0000_initial.sql +0 -74
  59. package/dist/app/server/migrations/sqlite/meta/_journal.json +0 -13
  60. package/dist/cli/bin.d.ts +0 -3
  61. package/dist/cli/bin.d.ts.map +0 -1
  62. package/dist/cli/bin.js +0 -7
  63. package/dist/cli/bin.js.map +0 -1
  64. package/dist/cli/credentialManager.d.ts +0 -19
  65. package/dist/cli/credentialManager.d.ts.map +0 -1
  66. package/dist/cli/credentialManager.js +0 -82
  67. package/dist/cli/credentialManager.js.map +0 -1
  68. package/dist/cli/index.d.ts +0 -17
  69. package/dist/cli/index.d.ts.map +0 -1
  70. package/dist/cli/index.js +0 -832
  71. package/dist/cli/index.js.map +0 -1
  72. package/dist/cli/setup.d.ts +0 -3
  73. package/dist/cli/setup.d.ts.map +0 -1
  74. package/dist/cli/setup.js +0 -353
  75. package/dist/cli/setup.js.map +0 -1
  76. package/dist/config/configApply.d.ts +0 -16
  77. package/dist/config/configApply.d.ts.map +0 -1
  78. package/dist/config/configApply.js +0 -77
  79. package/dist/config/configApply.js.map +0 -1
  80. package/dist/config/configLoader.d.ts +0 -9
  81. package/dist/config/configLoader.d.ts.map +0 -1
  82. package/dist/config/configLoader.js +0 -75
  83. package/dist/config/configLoader.js.map +0 -1
  84. package/dist/config/configSchema.d.ts +0 -45
  85. package/dist/config/configSchema.d.ts.map +0 -1
  86. package/dist/config/configSchema.js +0 -23
  87. package/dist/config/configSchema.js.map +0 -1
  88. package/dist/crypto/encryption.d.ts +0 -3
  89. package/dist/crypto/encryption.d.ts.map +0 -1
  90. package/dist/crypto/encryption.js +0 -29
  91. package/dist/crypto/encryption.js.map +0 -1
  92. package/dist/db/client.d.ts +0 -24
  93. package/dist/db/client.d.ts.map +0 -1
  94. package/dist/db/client.js +0 -50
  95. package/dist/db/client.js.map +0 -1
  96. package/dist/db/credentialStore.d.ts +0 -15
  97. package/dist/db/credentialStore.d.ts.map +0 -1
  98. package/dist/db/credentialStore.js +0 -56
  99. package/dist/db/credentialStore.js.map +0 -1
  100. package/dist/db/integrationStore.d.ts +0 -12
  101. package/dist/db/integrationStore.d.ts.map +0 -1
  102. package/dist/db/integrationStore.js +0 -111
  103. package/dist/db/integrationStore.js.map +0 -1
  104. package/dist/db/integrationTypeConfigStore.d.ts +0 -6
  105. package/dist/db/integrationTypeConfigStore.d.ts.map +0 -1
  106. package/dist/db/integrationTypeConfigStore.js +0 -94
  107. package/dist/db/integrationTypeConfigStore.js.map +0 -1
  108. package/dist/db/migrate.d.ts +0 -3
  109. package/dist/db/migrate.d.ts.map +0 -1
  110. package/dist/db/migrate.js +0 -11
  111. package/dist/db/migrate.js.map +0 -1
  112. package/dist/db/migrations/pg/0000_initial.sql +0 -74
  113. package/dist/db/migrations/pg/meta/_journal.json +0 -13
  114. package/dist/db/migrations/sqlite/0000_initial.sql +0 -74
  115. package/dist/db/migrations/sqlite/meta/_journal.json +0 -13
  116. package/dist/db/schema.d.ts +0 -1863
  117. package/dist/db/schema.d.ts.map +0 -1
  118. package/dist/db/schema.js +0 -133
  119. package/dist/db/schema.js.map +0 -1
  120. package/dist/db/toolDefinitionStore.d.ts +0 -6
  121. package/dist/db/toolDefinitionStore.d.ts.map +0 -1
  122. package/dist/db/toolDefinitionStore.js +0 -95
  123. package/dist/db/toolDefinitionStore.js.map +0 -1
  124. package/dist/errors/httpError.d.ts +0 -6
  125. package/dist/errors/httpError.d.ts.map +0 -1
  126. package/dist/errors/httpError.js +0 -11
  127. package/dist/errors/httpError.js.map +0 -1
  128. package/dist/index.d.ts +0 -32
  129. package/dist/index.d.ts.map +0 -1
  130. package/dist/index.js +0 -32
  131. package/dist/index.js.map +0 -1
  132. package/dist/integrations/actionsFactory.d.ts +0 -16
  133. package/dist/integrations/actionsFactory.d.ts.map +0 -1
  134. package/dist/integrations/actionsFactory.js +0 -98
  135. package/dist/integrations/actionsFactory.js.map +0 -1
  136. package/dist/integrations/catalog.d.ts +0 -8
  137. package/dist/integrations/catalog.d.ts.map +0 -1
  138. package/dist/integrations/catalog.js +0 -45
  139. package/dist/integrations/catalog.js.map +0 -1
  140. package/dist/integrations/customToolFactory.d.ts +0 -13
  141. package/dist/integrations/customToolFactory.d.ts.map +0 -1
  142. package/dist/integrations/customToolFactory.js +0 -31
  143. package/dist/integrations/customToolFactory.js.map +0 -1
  144. package/dist/integrations/dataLoader.d.ts +0 -3
  145. package/dist/integrations/dataLoader.d.ts.map +0 -1
  146. package/dist/integrations/dataLoader.js +0 -2
  147. package/dist/integrations/dataLoader.js.map +0 -1
  148. package/dist/integrations/fileIntegrationTypeConfigStore.d.ts +0 -7
  149. package/dist/integrations/fileIntegrationTypeConfigStore.d.ts.map +0 -1
  150. package/dist/integrations/fileIntegrationTypeConfigStore.js +0 -34
  151. package/dist/integrations/fileIntegrationTypeConfigStore.js.map +0 -1
  152. package/dist/integrations/getIntegration.d.ts +0 -14
  153. package/dist/integrations/getIntegration.d.ts.map +0 -1
  154. package/dist/integrations/getIntegration.js +0 -30
  155. package/dist/integrations/getIntegration.js.map +0 -1
  156. package/dist/integrations/googleServiceAccount.d.ts +0 -6
  157. package/dist/integrations/googleServiceAccount.d.ts.map +0 -1
  158. package/dist/integrations/googleServiceAccount.js +0 -54
  159. package/dist/integrations/googleServiceAccount.js.map +0 -1
  160. package/dist/integrations/health.d.ts +0 -20
  161. package/dist/integrations/health.d.ts.map +0 -1
  162. package/dist/integrations/health.js +0 -43
  163. package/dist/integrations/health.js.map +0 -1
  164. package/dist/integrations/integrationTypeConfigLookup.d.ts +0 -12
  165. package/dist/integrations/integrationTypeConfigLookup.d.ts.map +0 -1
  166. package/dist/integrations/integrationTypeConfigLookup.js +0 -11
  167. package/dist/integrations/integrationTypeConfigLookup.js.map +0 -1
  168. package/dist/integrations/providerRegistry.d.ts +0 -2
  169. package/dist/integrations/providerRegistry.d.ts.map +0 -1
  170. package/dist/integrations/providerRegistry.js +0 -72
  171. package/dist/integrations/providerRegistry.js.map +0 -1
  172. package/dist/integrations/proxy.d.ts +0 -19
  173. package/dist/integrations/proxy.d.ts.map +0 -1
  174. package/dist/integrations/proxy.js +0 -377
  175. package/dist/integrations/proxy.js.map +0 -1
  176. package/dist/integrations/sandbox.d.ts +0 -8
  177. package/dist/integrations/sandbox.d.ts.map +0 -1
  178. package/dist/integrations/sandbox.js +0 -221
  179. package/dist/integrations/sandbox.js.map +0 -1
  180. package/dist/integrations/sandboxUtils.d.ts +0 -15
  181. package/dist/integrations/sandboxUtils.d.ts.map +0 -1
  182. package/dist/integrations/sandboxUtils.js +0 -489
  183. package/dist/integrations/sandboxUtils.js.map +0 -1
  184. package/dist/integrations/tools.d.ts +0 -3
  185. package/dist/integrations/tools.d.ts.map +0 -1
  186. package/dist/integrations/tools.js +0 -70
  187. package/dist/integrations/tools.js.map +0 -1
  188. package/dist/mcp/abilityCatalog.d.ts +0 -46
  189. package/dist/mcp/abilityCatalog.d.ts.map +0 -1
  190. package/dist/mcp/abilityCatalog.js +0 -275
  191. package/dist/mcp/abilityCatalog.js.map +0 -1
  192. package/dist/mcp/auth.d.ts +0 -18
  193. package/dist/mcp/auth.d.ts.map +0 -1
  194. package/dist/mcp/auth.js +0 -45
  195. package/dist/mcp/auth.js.map +0 -1
  196. package/dist/mcp/builder_guide.md +0 -441
  197. package/dist/mcp/commandable_readme.md +0 -29
  198. package/dist/mcp/handlers.d.ts +0 -21
  199. package/dist/mcp/handlers.d.ts.map +0 -1
  200. package/dist/mcp/handlers.js +0 -86
  201. package/dist/mcp/handlers.js.map +0 -1
  202. package/dist/mcp/metaTools.d.ts +0 -77
  203. package/dist/mcp/metaTools.d.ts.map +0 -1
  204. package/dist/mcp/metaTools.js +0 -753
  205. package/dist/mcp/metaTools.js.map +0 -1
  206. package/dist/mcp/server.d.ts +0 -25
  207. package/dist/mcp/server.d.ts.map +0 -1
  208. package/dist/mcp/server.js +0 -14
  209. package/dist/mcp/server.js.map +0 -1
  210. package/dist/mcp/sessionState.d.ts +0 -18
  211. package/dist/mcp/sessionState.d.ts.map +0 -1
  212. package/dist/mcp/sessionState.js +0 -65
  213. package/dist/mcp/sessionState.js.map +0 -1
  214. package/dist/mcp/toolAdapter.d.ts +0 -34
  215. package/dist/mcp/toolAdapter.d.ts.map +0 -1
  216. package/dist/mcp/toolAdapter.js +0 -24
  217. package/dist/mcp/toolAdapter.js.map +0 -1
  218. package/dist/types.d.ts +0 -92
  219. package/dist/types.d.ts.map +0 -1
  220. package/dist/types.js +0 -2
  221. package/dist/types.js.map +0 -1
  222. package/dist/version.d.ts +0 -2
  223. package/dist/version.d.ts.map +0 -1
  224. package/dist/version.js +0 -7
  225. package/dist/version.js.map +0 -1
  226. /package/{dist/app → .output}/public/_fonts/57NSSoFy1VLVs2gqly8Ls9awBnZMFyXGrefpmqvdqmc-zJfbBtpgM4cDmcXBsqZNW79_kFnlpPd62b48glgdydA.woff2 +0 -0
  227. /package/{dist/app → .output}/public/_fonts/8VR2wSMN-3U4NbWAVYXlkRV6hA0jFBXP-0RtL3X7fko-x2gYI4qfmkRdxyQQUPaBZdZdgl1TeVrquF_TxHeM4lM.woff2 +0 -0
  228. /package/{dist/app → .output}/public/_fonts/GsKUclqeNLJ96g5AU593ug6yanivOiwjW_7zESNPChw-jHA4tBeM1bjF7LATGUpfBuSTyomIFrWBTzjF7txVYfg.woff2 +0 -0
  229. /package/{dist/app → .output}/public/_fonts/Ld1FnTo3yTIwDyGfTQ5-Fws9AWsCbKfMvgxduXr7JcY-W25bL8NF1fjpLRSOgJb7RoZPHqGQNwMTM7S9tHVoxx8.woff2 +0 -0
  230. /package/{dist/app → .output}/public/_fonts/NdzqRASp2bovDUhQT1IRE_EMqKJ2KYQdTCfFcBvL8yw-KhwZiS86o3fErOe5GGMExHUemmI_dBfaEFxjISZrBd0.woff2 +0 -0
  231. /package/{dist/app → .output}/public/_fonts/iTkrULNFJJkTvihIg1Vqi5IODRH_9btXCioVF5l98I8-AndUyau2HR2felA_ra8V2mutQgschhasE5FD1dXGJX8.woff2 +0 -0
  232. /package/{dist/app → .output}/public/_nuxt/_id_.BKAjWkoP.css +0 -0
  233. /package/{dist/app → .output}/public/_nuxt/entry.Y3mA4bzA.css +0 -0
  234. /package/{dist/app → .output}/public/_nuxt/error-404.C7fg894-.css +0 -0
  235. /package/{dist/app → .output}/public/_nuxt/error-500.DjUK_N2Y.css +0 -0
  236. /package/{dist/app → .output}/public/favicon.ico +0 -0
  237. /package/{dist/app → .output}/server/chunks/_/error-500.mjs +0 -0
  238. /package/{dist/app → .output}/server/chunks/_/error-500.mjs.map +0 -0
  239. /package/{dist/app → .output}/server/chunks/_/icons.mjs +0 -0
  240. /package/{dist/app → .output}/server/chunks/_/icons.mjs.map +0 -0
  241. /package/{dist/app → .output}/server/chunks/_/icons2.mjs +0 -0
  242. /package/{dist/app → .output}/server/chunks/_/icons2.mjs.map +0 -0
  243. /package/{dist/app → .output}/server/chunks/build/IntegrationCredentials-styles.CULcCK6_.mjs +0 -0
  244. /package/{dist/app → .output}/server/chunks/build/IntegrationCredentials-styles.CULcCK6_.mjs.map +0 -0
  245. /package/{dist/app → .output}/server/chunks/build/client.precomputed.mjs.map +0 -0
  246. /package/{dist/app → .output}/server/chunks/build/error-404-D2QibUBT.mjs +0 -0
  247. /package/{dist/app → .output}/server/chunks/build/error-404-D2QibUBT.mjs.map +0 -0
  248. /package/{dist/app → .output}/server/chunks/build/error-404-styles.Bvxdxqjk.mjs +0 -0
  249. /package/{dist/app → .output}/server/chunks/build/error-404-styles.Bvxdxqjk.mjs.map +0 -0
  250. /package/{dist/app → .output}/server/chunks/build/error-500-DYvawybF.mjs +0 -0
  251. /package/{dist/app → .output}/server/chunks/build/error-500-DYvawybF.mjs.map +0 -0
  252. /package/{dist/app → .output}/server/chunks/build/error-500-styles.BnYAAXSg.mjs +0 -0
  253. /package/{dist/app → .output}/server/chunks/build/error-500-styles.BnYAAXSg.mjs.map +0 -0
  254. /package/{dist/app → .output}/server/chunks/build/index-5H-nmhph.mjs +0 -0
  255. /package/{dist/app → .output}/server/chunks/build/index-5H-nmhph.mjs.map +0 -0
  256. /package/{dist/app → .output}/server/chunks/build/server.mjs.map +0 -0
  257. /package/{dist/app → .output}/server/chunks/build/styles.mjs +0 -0
  258. /package/{dist/app → .output}/server/chunks/build/styles.mjs.map +0 -0
  259. /package/{dist/app → .output}/server/chunks/routes/api/_commandable/status.get.mjs +0 -0
  260. /package/{dist/app → .output}/server/chunks/routes/api/_commandable/status.get.mjs.map +0 -0
  261. /package/{dist/app → .output}/server/chunks/routes/api/catalog/_type/tools.get.mjs +0 -0
  262. /package/{dist/app → .output}/server/chunks/routes/api/catalog/_type/tools.get.mjs.map +0 -0
  263. /package/{dist/app → .output}/server/chunks/routes/api/catalog/_type/toolsets.get.mjs +0 -0
  264. /package/{dist/app → .output}/server/chunks/routes/api/catalog/_type/toolsets.get.mjs.map +0 -0
  265. /package/{dist/app → .output}/server/chunks/routes/api/catalog.get.mjs +0 -0
  266. /package/{dist/app → .output}/server/chunks/routes/api/catalog.get.mjs.map +0 -0
  267. /package/{dist/app → .output}/server/chunks/routes/api/index.get.mjs.map +0 -0
  268. /package/{dist/app → .output}/server/chunks/routes/api/index.post.mjs.map +0 -0
  269. /package/{dist/app → .output}/server/chunks/routes/api/integrations/_id/credentials-config.get.mjs.map +0 -0
  270. /package/{dist/app → .output}/server/chunks/routes/api/integrations/_id/credentials-status.get.mjs.map +0 -0
  271. /package/{dist/app → .output}/server/chunks/routes/api/integrations/_id/credentials.delete.mjs.map +0 -0
  272. /package/{dist/app → .output}/server/chunks/routes/api/integrations/_id/credentials.post.mjs.map +0 -0
  273. /package/{dist/app → .output}/server/chunks/routes/api/integrations/_id/permissions.post.mjs.map +0 -0
  274. /package/{dist/app → .output}/server/chunks/routes/api/integrations/_id/toolsets.post.mjs.map +0 -0
  275. /package/{dist/app → .output}/server/chunks/routes/health.get.mjs +0 -0
  276. /package/{dist/app → .output}/server/chunks/routes/health.get.mjs.map +0 -0
  277. /package/{dist/app → .output}/server/chunks/routes/mcp/create.mjs.map +0 -0
  278. /package/{dist/app → .output}/server/chunks/routes/mcp.mjs.map +0 -0
  279. /package/{dist/app → .output}/server/chunks/routes/renderer.mjs.map +0 -0
  280. /package/{dist/app → .output}/server/chunks/virtual/_virtual_spa-template.mjs +0 -0
  281. /package/{dist/app → .output}/server/chunks/virtual/_virtual_spa-template.mjs.map +0 -0
  282. /package/{dist/app → .output}/server/index.mjs.map +0 -0
@@ -1,75 +0,0 @@
1
- import { existsSync, readFileSync } from 'node:fs';
2
- import { resolve } from 'node:path';
3
- import { cwd } from 'node:process';
4
- import YAML from 'js-yaml';
5
- import { CommandableConfigSchema } from './configSchema.js';
6
- export class ConfigError extends Error {
7
- name = 'ConfigError';
8
- }
9
- function parseConfigFile(raw, filePath) {
10
- if (filePath.endsWith('.json')) {
11
- try {
12
- return JSON.parse(raw);
13
- }
14
- catch (err) {
15
- throw new ConfigError(`Invalid JSON in config file: ${filePath}${err?.message ? ` (${err.message})` : ''}`);
16
- }
17
- }
18
- try {
19
- return YAML.load(raw);
20
- }
21
- catch (err) {
22
- throw new ConfigError(`Invalid YAML in config file: ${filePath}${err?.message ? ` (${err.message})` : ''}`);
23
- }
24
- }
25
- function resolveEnvRefs(value, filePath) {
26
- if (typeof value === 'string') {
27
- return value.replace(/\$\{([A-Z0-9_]+)\}/g, (_m, name) => {
28
- const v = process.env[name];
29
- if (v == null || v === '')
30
- throw new ConfigError(`Missing environment variable ${name} referenced in ${filePath}`);
31
- return v;
32
- });
33
- }
34
- if (Array.isArray(value))
35
- return value.map(v => resolveEnvRefs(v, filePath));
36
- if (value && typeof value === 'object') {
37
- const out = {};
38
- for (const [k, v] of Object.entries(value))
39
- out[k] = resolveEnvRefs(v, filePath);
40
- return out;
41
- }
42
- return value;
43
- }
44
- function findConfigPath() {
45
- const explicit = process.env.COMMANDABLE_CONFIG_FILE;
46
- if (explicit && explicit.trim().length)
47
- return resolve(explicit.trim());
48
- const base = resolve(cwd());
49
- const candidates = [
50
- 'commandable.config.yaml',
51
- 'commandable.config.yml',
52
- 'commandable.config.json',
53
- ].map(f => resolve(base, f));
54
- for (const p of candidates) {
55
- if (existsSync(p))
56
- return p;
57
- }
58
- return null;
59
- }
60
- export function loadConfig(configPath) {
61
- const path = configPath?.trim().length ? resolve(configPath) : findConfigPath();
62
- if (!path)
63
- throw new ConfigError('No config file found. Provide --config <path> or set COMMANDABLE_CONFIG_FILE.');
64
- if (!existsSync(path))
65
- throw new ConfigError(`Config file not found: ${path}`);
66
- const raw = readFileSync(path, 'utf8');
67
- const parsed = parseConfigFile(raw, path);
68
- const resolved = resolveEnvRefs(parsed, path);
69
- const result = CommandableConfigSchema.safeParse(resolved);
70
- if (!result.success) {
71
- throw new ConfigError(`Invalid config file: ${path}\n${result.error.toString()}`);
72
- }
73
- return { path, config: result.data };
74
- }
75
- //# sourceMappingURL=configLoader.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"configLoader.js","sourceRoot":"","sources":["../../src/config/configLoader.ts"],"names":[],"mappings":"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"}
@@ -1,45 +0,0 @@
1
- import { z } from 'zod';
2
- export declare const IntegrationConfigSchema: z.ZodObject<{
3
- id: z.ZodOptional<z.ZodString>;
4
- type: z.ZodString;
5
- label: z.ZodOptional<z.ZodString>;
6
- referenceId: z.ZodOptional<z.ZodString>;
7
- spaceId: z.ZodOptional<z.ZodString>;
8
- enabled: z.ZodOptional<z.ZodBoolean>;
9
- credentialId: z.ZodOptional<z.ZodString>;
10
- credentialVariant: z.ZodOptional<z.ZodString>;
11
- toolsets: z.ZodOptional<z.ZodArray<z.ZodString>>;
12
- maxScope: z.ZodOptional<z.ZodEnum<{
13
- read: "read";
14
- write: "write";
15
- }>>;
16
- disabledTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
17
- credentials: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
18
- }, z.core.$strip>;
19
- export declare const CommandableConfigSchema: z.ZodObject<{
20
- spaceId: z.ZodOptional<z.ZodString>;
21
- mode: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
22
- static: "static";
23
- create: "create";
24
- }>>>;
25
- integrations: z.ZodDefault<z.ZodArray<z.ZodObject<{
26
- id: z.ZodOptional<z.ZodString>;
27
- type: z.ZodString;
28
- label: z.ZodOptional<z.ZodString>;
29
- referenceId: z.ZodOptional<z.ZodString>;
30
- spaceId: z.ZodOptional<z.ZodString>;
31
- enabled: z.ZodOptional<z.ZodBoolean>;
32
- credentialId: z.ZodOptional<z.ZodString>;
33
- credentialVariant: z.ZodOptional<z.ZodString>;
34
- toolsets: z.ZodOptional<z.ZodArray<z.ZodString>>;
35
- maxScope: z.ZodOptional<z.ZodEnum<{
36
- read: "read";
37
- write: "write";
38
- }>>;
39
- disabledTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
40
- credentials: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
41
- }, z.core.$strip>>>;
42
- }, z.core.$strip>;
43
- export type CommandableConfig = z.infer<typeof CommandableConfigSchema>;
44
- export type IntegrationConfig = z.infer<typeof IntegrationConfigSchema>;
45
- //# sourceMappingURL=configSchema.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"configSchema.d.ts","sourceRoot":"","sources":["../../src/config/configSchema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;iBAelC,CAAA;AAEF,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;iBAIlC,CAAA;AAEF,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAA;AACvE,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAA"}
@@ -1,23 +0,0 @@
1
- import { z } from 'zod';
2
- export const IntegrationConfigSchema = z.object({
3
- id: z.string().min(1).optional(),
4
- type: z.string().min(1),
5
- label: z.string().min(1).optional(),
6
- referenceId: z.string().min(1).optional(),
7
- spaceId: z.string().min(1).optional(),
8
- enabled: z.boolean().optional(),
9
- credentialId: z.string().min(1).optional(),
10
- credentialVariant: z.string().min(1).optional(),
11
- toolsets: z.array(z.string()).optional(),
12
- /** Cap the maximum scope tier. 'read' means only read tools; 'write' means read+write. */
13
- maxScope: z.enum(['read', 'write']).optional(),
14
- /** Individual tool names to block regardless of toolset or scope. */
15
- disabledTools: z.array(z.string()).optional(),
16
- credentials: z.record(z.string(), z.string()).optional(),
17
- });
18
- export const CommandableConfigSchema = z.object({
19
- spaceId: z.string().min(1).optional(),
20
- mode: z.enum(['static', 'create']).optional().default('static'),
21
- integrations: z.array(IntegrationConfigSchema).default([]),
22
- });
23
- //# sourceMappingURL=configSchema.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"configSchema.js","sourceRoot":"","sources":["../../src/config/configSchema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9C,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAChC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACnC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACzC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACrC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC/B,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC1C,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC/C,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACxC,0FAA0F;IAC1F,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC9C,qEAAqE;IACrE,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC7C,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CACzD,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACrC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;IAC/D,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CAC3D,CAAC,CAAA"}
@@ -1,3 +0,0 @@
1
- export declare function encrypt(text: string, secret: string): string;
2
- export declare function decrypt(encryptedText: string, secret: string): string;
3
- //# sourceMappingURL=encryption.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"encryption.d.ts","sourceRoot":"","sources":["../../src/crypto/encryption.ts"],"names":[],"mappings":"AAQA,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAQ5D;AAED,wBAAgB,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAcrE"}
@@ -1,29 +0,0 @@
1
- import crypto from 'node:crypto';
2
- const algorithm = 'aes-256-cbc';
3
- function getKey(secret) {
4
- return crypto.createHash('sha256').update(secret).digest();
5
- }
6
- export function encrypt(text, secret) {
7
- const key = getKey(secret);
8
- const iv = crypto.randomBytes(16);
9
- const cipher = crypto.createCipheriv(algorithm, key, iv);
10
- let encrypted = cipher.update(text, 'utf8', 'hex');
11
- encrypted += cipher.final('hex');
12
- return `${iv.toString('hex')}:${encrypted}`;
13
- }
14
- export function decrypt(encryptedText, secret) {
15
- const key = getKey(secret);
16
- const parts = encryptedText.split(':');
17
- if (parts.length !== 2)
18
- throw new Error('Invalid encrypted text format');
19
- const ivHex = parts[0];
20
- const encrypted = parts[1];
21
- if (!ivHex || !encrypted)
22
- throw new Error('Invalid encrypted text format');
23
- const iv = Buffer.from(ivHex, 'hex');
24
- const decipher = crypto.createDecipheriv(algorithm, key, iv);
25
- let decrypted = decipher.update(encrypted, 'hex', 'utf8');
26
- decrypted += decipher.final('utf8');
27
- return decrypted;
28
- }
29
- //# sourceMappingURL=encryption.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"encryption.js","sourceRoot":"","sources":["../../src/crypto/encryption.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAA;AAEhC,MAAM,SAAS,GAAG,aAAa,CAAA;AAE/B,SAAS,MAAM,CAAC,MAAc;IAC5B,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAA;AAC5D,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,IAAY,EAAE,MAAc;IAClD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;IAC1B,MAAM,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;IACjC,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,GAAG,EAAE,EAAE,CAAC,CAAA;IAExD,IAAI,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;IAClD,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IAChC,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,SAAS,EAAE,CAAA;AAC7C,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,aAAqB,EAAE,MAAc;IAC3D,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;IAC1B,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACtC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAA;IAClD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;IACtB,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;IAC1B,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS;QACtB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAA;IAClD,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;IACpC,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,GAAG,EAAE,EAAE,CAAC,CAAA;IAC5D,IAAI,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;IACzD,SAAS,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IACnC,OAAO,SAAS,CAAA;AAClB,CAAC"}
@@ -1,24 +0,0 @@
1
- import Database from 'better-sqlite3';
2
- import { drizzle as drizzleSqlite } from 'drizzle-orm/better-sqlite3';
3
- import { drizzle as drizzlePg } from 'drizzle-orm/node-postgres';
4
- import { Pool } from 'pg';
5
- export type DbDialect = 'sqlite' | 'postgres';
6
- export type AnyDrizzle = ReturnType<typeof drizzleSqlite> | ReturnType<typeof drizzlePg>;
7
- export type DbClient = {
8
- dialect: 'sqlite';
9
- db: ReturnType<typeof drizzleSqlite>;
10
- raw: InstanceType<typeof Database>;
11
- close: () => void;
12
- } | {
13
- dialect: 'postgres';
14
- db: ReturnType<typeof drizzlePg>;
15
- raw: Pool;
16
- close: () => Promise<void>;
17
- };
18
- export interface CreateDbOptions {
19
- sqlitePath?: string;
20
- databaseUrl?: string;
21
- }
22
- export declare function createDbFromEnv(): DbClient;
23
- export declare function createDb(opts?: CreateDbOptions): DbClient;
24
- //# sourceMappingURL=client.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"AAGA,OAAO,QAAQ,MAAM,gBAAgB,CAAA;AACrC,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,4BAA4B,CAAA;AACrE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAA;AAEzB,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,UAAU,CAAA;AAE7C,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAA;AAExF,MAAM,MAAM,QAAQ,GAChB;IAAE,OAAO,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;IAAC,GAAG,EAAE,YAAY,CAAC,OAAO,QAAQ,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,IAAI,CAAA;CAAE,GAClH;IAAE,OAAO,EAAE,UAAU,CAAC;IAAC,EAAE,EAAE,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC;IAAC,GAAG,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAAA;AAEpG,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,wBAAgB,eAAe,IAAI,QAAQ,CAS1C;AAED,wBAAgB,QAAQ,CAAC,IAAI,GAAE,eAAoB,GAAG,QAAQ,CAkC7D"}
package/dist/db/client.js DELETED
@@ -1,50 +0,0 @@
1
- import { dirname, resolve } from 'node:path';
2
- import { mkdirSync } from 'node:fs';
3
- import { homedir } from 'node:os';
4
- import Database from 'better-sqlite3';
5
- import { drizzle as drizzleSqlite } from 'drizzle-orm/better-sqlite3';
6
- import { drizzle as drizzlePg } from 'drizzle-orm/node-postgres';
7
- import { Pool } from 'pg';
8
- export function createDbFromEnv() {
9
- const dataDir = process.env.COMMANDABLE_DATA_DIR;
10
- const sqliteFromDataDir = dataDir && dataDir.trim().length
11
- ? resolve(dataDir, 'credentials.sqlite')
12
- : undefined;
13
- return createDb({
14
- databaseUrl: process.env.DATABASE_URL,
15
- sqlitePath: process.env.COMMANDABLE_MCP_SQLITE_PATH || sqliteFromDataDir,
16
- });
17
- }
18
- export function createDb(opts = {}) {
19
- const databaseUrl = opts.databaseUrl || process.env.DATABASE_URL;
20
- if (databaseUrl) {
21
- const pool = new Pool({ connectionString: databaseUrl });
22
- const db = drizzlePg(pool);
23
- return {
24
- dialect: 'postgres',
25
- db,
26
- raw: pool,
27
- close: async () => {
28
- await pool.end();
29
- },
30
- };
31
- }
32
- const sqlitePath = opts.sqlitePath
33
- ? resolve(opts.sqlitePath)
34
- : resolve(homedir(), '.commandable', 'credentials.sqlite');
35
- // Ensure parent directory exists so SQLite can create the file.
36
- // (better-sqlite3 does not create directories automatically)
37
- try {
38
- mkdirSync(dirname(sqlitePath), { recursive: true, mode: 0o700 });
39
- }
40
- catch { }
41
- const sqlite = new Database(sqlitePath);
42
- const db = drizzleSqlite(sqlite);
43
- return {
44
- dialect: 'sqlite',
45
- db,
46
- raw: sqlite,
47
- close: () => sqlite.close(),
48
- };
49
- }
50
- //# sourceMappingURL=client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,QAAQ,MAAM,gBAAgB,CAAA;AACrC,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,4BAA4B,CAAA;AACrE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAA;AAezB,MAAM,UAAU,eAAe;IAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAA;IAChD,MAAM,iBAAiB,GAAG,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM;QACxD,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,oBAAoB,CAAC;QACxC,CAAC,CAAC,SAAS,CAAA;IACb,OAAO,QAAQ,CAAC;QACd,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY;QACrC,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,iBAAiB;KACzE,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,OAAwB,EAAE;IACjD,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,CAAA;IAChE,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE,gBAAgB,EAAE,WAAW,EAAE,CAAC,CAAA;QACxD,MAAM,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;QAC1B,OAAO;YACL,OAAO,EAAE,UAAU;YACnB,EAAE;YACF,GAAG,EAAE,IAAI;YACT,KAAK,EAAE,KAAK,IAAI,EAAE;gBAChB,MAAM,IAAI,CAAC,GAAG,EAAE,CAAA;YAClB,CAAC;SACF,CAAA;IACH,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU;QAChC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;QAC1B,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,oBAAoB,CAAC,CAAA;IAE5D,gEAAgE;IAChE,6DAA6D;IAC7D,IAAI,CAAC;QACH,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;IAClE,CAAC;IACD,MAAM,CAAC,CAAA,CAAC;IAER,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC,UAAU,CAAC,CAAA;IACvC,MAAM,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,CAAA;IAChC,OAAO;QACL,OAAO,EAAE,QAAQ;QACjB,EAAE;QACF,GAAG,EAAE,MAAM;QACX,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE;KAC5B,CAAA;AACH,CAAC"}
@@ -1,15 +0,0 @@
1
- import type { CredentialStore } from '../integrations/proxy.js';
2
- import type { DbClient } from './client.js';
3
- export declare class SqlCredentialStore implements CredentialStore {
4
- private readonly client;
5
- private readonly encryptionSecret;
6
- constructor(client: DbClient, encryptionSecret: string);
7
- hasCredentials(spaceId: string, credentialId: string): Promise<boolean>;
8
- saveCredentials(spaceId: string, credentialId: string, credentials: Record<string, string>): Promise<void>;
9
- getCredentials(spaceId: string, credentialId: string): Promise<Record<string, string> | null>;
10
- deleteCredentials(spaceId: string, credentialId: string): Promise<void>;
11
- private _table;
12
- private _db;
13
- private _getRow;
14
- }
15
- //# sourceMappingURL=credentialStore.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"credentialStore.d.ts","sourceRoot":"","sources":["../../src/db/credentialStore.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAC/D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAG3C,qBAAa,kBAAmB,YAAW,eAAe;IAEtD,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,gBAAgB;gBADhB,MAAM,EAAE,QAAQ,EAChB,gBAAgB,EAAE,MAAM;IAGrC,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIvE,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAc1G,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAS7F,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO7E,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,GAAG;YAIG,OAAO;CAStB"}
@@ -1,56 +0,0 @@
1
- import { and, eq } from 'drizzle-orm';
2
- import { decrypt, encrypt } from '../crypto/encryption.js';
3
- import { pgCredentials, sqliteCredentials } from './schema.js';
4
- export class SqlCredentialStore {
5
- client;
6
- encryptionSecret;
7
- constructor(client, encryptionSecret) {
8
- this.client = client;
9
- this.encryptionSecret = encryptionSecret;
10
- }
11
- async hasCredentials(spaceId, credentialId) {
12
- return !!(await this._getRow(spaceId, credentialId));
13
- }
14
- async saveCredentials(spaceId, credentialId, credentials) {
15
- const ciphertext = encrypt(JSON.stringify(credentials ?? {}), this.encryptionSecret);
16
- const now = new Date();
17
- const table = this._table();
18
- await this._db()
19
- .insert(table)
20
- .values({ spaceId, id: credentialId, ciphertext, createdAt: now, updatedAt: now })
21
- .onConflictDoUpdate({
22
- target: [table.spaceId, table.id],
23
- set: { ciphertext, updatedAt: now },
24
- });
25
- }
26
- async getCredentials(spaceId, credentialId) {
27
- const row = await this._getRow(spaceId, credentialId);
28
- if (!row?.ciphertext)
29
- return null;
30
- const plaintext = decrypt(row.ciphertext, this.encryptionSecret);
31
- const parsed = JSON.parse(plaintext);
32
- return (parsed && typeof parsed === 'object') ? parsed : null;
33
- }
34
- async deleteCredentials(spaceId, credentialId) {
35
- const table = this._table();
36
- await this._db()
37
- .delete(table)
38
- .where(and(eq(table.spaceId, spaceId), eq(table.id, credentialId)));
39
- }
40
- _table() {
41
- return this.client.dialect === 'sqlite' ? sqliteCredentials : pgCredentials;
42
- }
43
- _db() {
44
- return this.client.db;
45
- }
46
- async _getRow(spaceId, credentialId) {
47
- const table = this._table();
48
- const rows = await this._db()
49
- .select()
50
- .from(table)
51
- .where(and(eq(table.spaceId, spaceId), eq(table.id, credentialId)))
52
- .limit(1);
53
- return rows[0] ?? null;
54
- }
55
- }
56
- //# sourceMappingURL=credentialStore.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"credentialStore.js","sourceRoot":"","sources":["../../src/db/credentialStore.ts"],"names":[],"mappings":"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"}
@@ -1,12 +0,0 @@
1
- import type { IntegrationData } from '../types.js';
2
- import type { DbClient } from './client.js';
3
- export declare function listIntegrations(client: DbClient, spaceId?: string): Promise<IntegrationData[]>;
4
- export declare function upsertIntegration(client: DbClient, integration: IntegrationData): Promise<void>;
5
- /** Update only credential linkage fields — does not clobber toolsets/permissions. */
6
- export declare function updateIntegrationCredentials(client: DbClient, integrationId: string, fields: {
7
- connectionMethod: 'credentials' | null;
8
- credentialId: string | null;
9
- credentialVariant: string | null;
10
- }): Promise<void>;
11
- export declare function updateIntegrationHealth(client: DbClient, integrationId: string, healthStatus: 'disconnected' | 'connected' | 'invalid_credentials', checkedAt?: Date): Promise<void>;
12
- //# sourceMappingURL=integrationStore.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"integrationStore.d.ts","sourceRoot":"","sources":["../../src/db/integrationStore.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAqB3C,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CA8BrG;AAED,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAwCrG;AAED,qFAAqF;AACrF,wBAAsB,4BAA4B,CAChD,MAAM,EAAE,QAAQ,EAChB,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE;IACN,gBAAgB,EAAE,aAAa,GAAG,IAAI,CAAA;IACtC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAA;CACjC,GACA,OAAO,CAAC,IAAI,CAAC,CAUf;AAED,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,QAAQ,EAChB,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,cAAc,GAAG,WAAW,GAAG,qBAAqB,EAClE,SAAS,CAAC,EAAE,IAAI,GACf,OAAO,CAAC,IAAI,CAAC,CAMf"}
@@ -1,111 +0,0 @@
1
- import { and, eq } from 'drizzle-orm';
2
- import { pgIntegrations, sqliteIntegrations } from './schema.js';
3
- function t(client) {
4
- return client.dialect === 'sqlite' ? sqliteIntegrations : pgIntegrations;
5
- }
6
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
7
- function db(client) {
8
- return client.db;
9
- }
10
- function parseJson(raw) {
11
- if (!raw)
12
- return undefined;
13
- if (typeof raw === 'string') {
14
- try {
15
- return JSON.parse(raw);
16
- }
17
- catch {
18
- return undefined;
19
- }
20
- }
21
- return raw;
22
- }
23
- export async function listIntegrations(client, spaceId) {
24
- const table = t(client);
25
- let query = db(client).select().from(table);
26
- if (spaceId)
27
- query = query.where(eq(table.spaceId, spaceId));
28
- const rows = await query;
29
- return rows.map((r) => {
30
- const healthCheckedAt = r.healthCheckedAt
31
- ? (r.healthCheckedAt instanceof Date ? r.healthCheckedAt : new Date(r.healthCheckedAt))
32
- : null;
33
- return {
34
- id: r.id,
35
- spaceId: r.spaceId ?? undefined,
36
- type: r.type,
37
- referenceId: r.referenceId,
38
- label: r.label,
39
- enabled: r.enabled === 0 ? false : true,
40
- connectionMethod: r.connectionMethod ?? undefined,
41
- connectionId: r.connectionId ?? undefined,
42
- credentialId: r.credentialId ?? undefined,
43
- credentialVariant: r.credentialVariant ?? undefined,
44
- enabledToolsets: parseJson(r.enabledToolsets),
45
- maxScope: r.maxScope ?? undefined,
46
- disabledTools: parseJson(r.disabledTools),
47
- healthStatus: r.healthStatus ?? null,
48
- healthCheckedAt,
49
- };
50
- });
51
- }
52
- export async function upsertIntegration(client, integration) {
53
- const table = t(client);
54
- const now = new Date();
55
- const enabled = integration.enabled === false ? 0 : 1;
56
- await db(client)
57
- .insert(table)
58
- .values({
59
- id: integration.id,
60
- spaceId: integration.spaceId ?? null,
61
- type: integration.type,
62
- referenceId: integration.referenceId,
63
- label: integration.label,
64
- enabled,
65
- connectionMethod: integration.connectionMethod ?? null,
66
- connectionId: integration.connectionId ?? null,
67
- credentialId: integration.credentialId ?? null,
68
- credentialVariant: integration.credentialVariant ?? null,
69
- enabledToolsets: integration.enabledToolsets ? JSON.stringify(integration.enabledToolsets) : null,
70
- maxScope: integration.maxScope ?? null,
71
- disabledTools: integration.disabledTools?.length ? JSON.stringify(integration.disabledTools) : null,
72
- createdAt: now,
73
- })
74
- .onConflictDoUpdate({
75
- target: table.id,
76
- set: {
77
- spaceId: integration.spaceId ?? null,
78
- type: integration.type,
79
- referenceId: integration.referenceId,
80
- label: integration.label,
81
- enabled,
82
- connectionMethod: integration.connectionMethod ?? null,
83
- connectionId: integration.connectionId ?? null,
84
- credentialId: integration.credentialId ?? null,
85
- credentialVariant: integration.credentialVariant ?? null,
86
- enabledToolsets: integration.enabledToolsets ? JSON.stringify(integration.enabledToolsets) : null,
87
- maxScope: integration.maxScope ?? null,
88
- disabledTools: integration.disabledTools?.length ? JSON.stringify(integration.disabledTools) : null,
89
- },
90
- });
91
- }
92
- /** Update only credential linkage fields — does not clobber toolsets/permissions. */
93
- export async function updateIntegrationCredentials(client, integrationId, fields) {
94
- const table = t(client);
95
- await db(client)
96
- .update(table)
97
- .set({
98
- connectionMethod: fields.connectionMethod ?? null,
99
- credentialId: fields.credentialId ?? null,
100
- credentialVariant: fields.credentialVariant ?? null,
101
- })
102
- .where(eq(table.id, integrationId));
103
- }
104
- export async function updateIntegrationHealth(client, integrationId, healthStatus, checkedAt) {
105
- const table = t(client);
106
- await db(client)
107
- .update(table)
108
- .set({ healthStatus, healthCheckedAt: checkedAt ?? new Date() })
109
- .where(and(eq(table.id, integrationId)));
110
- }
111
- //# sourceMappingURL=integrationStore.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"integrationStore.js","sourceRoot":"","sources":["../../src/db/integrationStore.ts"],"names":[],"mappings":"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"}
@@ -1,6 +0,0 @@
1
- import type { DbClient } from './client.js';
2
- import type { IntegrationTypeConfig } from '../types.js';
3
- export declare function listIntegrationTypeConfigs(client: DbClient, spaceId: string): Promise<IntegrationTypeConfig[]>;
4
- export declare function getIntegrationTypeConfig(client: DbClient, spaceId: string, typeSlug: string): Promise<IntegrationTypeConfig | null>;
5
- export declare function upsertIntegrationTypeConfig(client: DbClient, cfg: Required<Pick<IntegrationTypeConfig, 'id' | 'spaceId'>> & Omit<IntegrationTypeConfig, 'createdAt' | 'updatedAt'>): Promise<void>;
6
- //# sourceMappingURL=integrationTypeConfigStore.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"integrationTypeConfigStore.d.ts","sourceRoot":"","sources":["../../src/db/integrationTypeConfigStore.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAE3C,OAAO,KAAK,EAAgC,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAwDtF,wBAAsB,0BAA0B,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAGpH;AAED,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,QAAQ,EAChB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAQvC;AAED,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,QAAQ,EAChB,GAAG,EAAE,QAAQ,CAAC,IAAI,CAAC,qBAAqB,EAAE,IAAI,GAAG,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,qBAAqB,EAAE,WAAW,GAAG,WAAW,CAAC,GACpH,OAAO,CAAC,IAAI,CAAC,CA6Bf"}
@@ -1,94 +0,0 @@
1
- import { and, eq } from 'drizzle-orm';
2
- import { pgIntegrationTypeConfigs, sqliteIntegrationTypeConfigs } from './schema.js';
3
- function t(client) {
4
- return client.dialect === 'sqlite' ? sqliteIntegrationTypeConfigs : pgIntegrationTypeConfigs;
5
- }
6
- function db(client) {
7
- return client.db;
8
- }
9
- function parseJson(raw) {
10
- if (raw == null)
11
- return null;
12
- if (typeof raw === 'string') {
13
- try {
14
- return JSON.parse(raw);
15
- }
16
- catch {
17
- return null;
18
- }
19
- }
20
- return raw;
21
- }
22
- function normalizeHintMarkdown(value) {
23
- return value
24
- .replace(/\r\n/g, '\n')
25
- .replace(/\\r\\n/g, '\n')
26
- .replace(/\\n/g, '\n');
27
- }
28
- function normalizeVariants(variants) {
29
- return Object.fromEntries(Object.entries(variants).map(([key, variant]) => [
30
- key,
31
- {
32
- ...variant,
33
- hintMarkdown: typeof variant.hintMarkdown === 'string'
34
- ? normalizeHintMarkdown(variant.hintMarkdown)
35
- : variant.hintMarkdown,
36
- },
37
- ]));
38
- }
39
- function rowToIntegrationTypeConfig(r) {
40
- const variants = parseJson(r.variantsJson) || {};
41
- return {
42
- id: r.id,
43
- spaceId: r.spaceId,
44
- typeSlug: r.typeSlug,
45
- label: r.label,
46
- defaultVariant: r.defaultVariant,
47
- variants: normalizeVariants(variants),
48
- createdAt: r.createdAt instanceof Date ? r.createdAt : (r.createdAt ? new Date(r.createdAt) : undefined),
49
- updatedAt: r.updatedAt instanceof Date ? r.updatedAt : (r.updatedAt ? new Date(r.updatedAt) : undefined),
50
- };
51
- }
52
- export async function listIntegrationTypeConfigs(client, spaceId) {
53
- const rows = await db(client).select().from(t(client)).where(eq(t(client).spaceId, spaceId));
54
- return rows.map(rowToIntegrationTypeConfig);
55
- }
56
- export async function getIntegrationTypeConfig(client, spaceId, typeSlug) {
57
- const table = t(client);
58
- const rows = await db(client)
59
- .select()
60
- .from(table)
61
- .where(and(eq(table.spaceId, spaceId), eq(table.typeSlug, typeSlug)))
62
- .limit(1);
63
- return rows[0] ? rowToIntegrationTypeConfig(rows[0]) : null;
64
- }
65
- export async function upsertIntegrationTypeConfig(client, cfg) {
66
- const table = t(client);
67
- const now = new Date();
68
- const variantsValue = client.dialect === 'sqlite'
69
- ? JSON.stringify(cfg.variants ?? {})
70
- : (cfg.variants ?? {});
71
- await db(client)
72
- .insert(table)
73
- .values({
74
- id: cfg.id,
75
- spaceId: cfg.spaceId,
76
- typeSlug: cfg.typeSlug,
77
- label: cfg.label,
78
- defaultVariant: cfg.defaultVariant,
79
- variantsJson: variantsValue,
80
- createdAt: now,
81
- updatedAt: now,
82
- })
83
- .onConflictDoUpdate({
84
- target: table.id,
85
- set: {
86
- typeSlug: cfg.typeSlug,
87
- label: cfg.label,
88
- defaultVariant: cfg.defaultVariant,
89
- variantsJson: variantsValue,
90
- updatedAt: now,
91
- },
92
- });
93
- }
94
- //# sourceMappingURL=integrationTypeConfigStore.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"integrationTypeConfigStore.js","sourceRoot":"","sources":["../../src/db/integrationTypeConfigStore.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import type { DbClient } from './client.js';
2
- export declare function ensureSchema(client: DbClient): Promise<void>;
3
- //# sourceMappingURL=migrate.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/db/migrate.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAE3C,wBAAsB,YAAY,CAAC,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAOlE"}