@oomol-lab/open-connector 1.6.5 → 1.8.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 (495) hide show
  1. package/README.md +4 -0
  2. package/assets/open-connector/catalog/apps/airtable.json +134 -0
  3. package/assets/open-connector/catalog/apps/aisa.json +6985 -319
  4. package/assets/open-connector/catalog/apps/baizhi_mcp.json +135 -0
  5. package/assets/open-connector/catalog/apps/cal.json +24 -6
  6. package/assets/open-connector/catalog/apps/discordbot.json +2888 -248
  7. package/assets/open-connector/catalog/apps/drawio_mcp.json +192 -0
  8. package/assets/open-connector/catalog/apps/enormail.json +411 -0
  9. package/assets/open-connector/catalog/apps/feishu_app_bot.json +158 -0
  10. package/assets/open-connector/catalog/apps/firecrawl.json +176 -32
  11. package/assets/open-connector/catalog/apps/framejet.json +273 -0
  12. package/assets/open-connector/catalog/apps/futunn.json +2967 -0
  13. package/assets/open-connector/catalog/apps/github.json +275 -0
  14. package/assets/open-connector/catalog/apps/gitlab.json +125 -0
  15. package/assets/open-connector/catalog/apps/gmail.json +376 -0
  16. package/assets/open-connector/catalog/apps/google_analytics.json +4 -1
  17. package/assets/open-connector/catalog/apps/google_bigquery.json +4 -1
  18. package/assets/open-connector/catalog/apps/google_search_console.json +4 -1
  19. package/assets/open-connector/catalog/apps/googlecalendar.json +210 -1
  20. package/assets/open-connector/catalog/apps/googlechat.json +694 -7
  21. package/assets/open-connector/catalog/apps/googledocs.json +4 -1
  22. package/assets/open-connector/catalog/apps/googledrive.json +479 -0
  23. package/assets/open-connector/catalog/apps/googlesheets.json +148 -1
  24. package/assets/open-connector/catalog/apps/granola.json +23 -0
  25. package/assets/open-connector/catalog/apps/hithink_finance.json +6 -3
  26. package/assets/open-connector/catalog/apps/indexed.json +1115 -0
  27. package/assets/open-connector/catalog/apps/keepa.json +3534 -987
  28. package/assets/open-connector/catalog/apps/linear.json +133 -0
  29. package/assets/open-connector/catalog/apps/linear_mcp.json +510 -0
  30. package/assets/open-connector/catalog/apps/moneyforward_mcp.json +1432 -0
  31. package/assets/open-connector/catalog/apps/notion.json +588 -1
  32. package/assets/open-connector/catalog/apps/notion_mcp.json +490 -0
  33. package/assets/open-connector/catalog/apps/odoo.json +619 -0
  34. package/assets/open-connector/catalog/apps/one_drive.json +185 -0
  35. package/assets/open-connector/catalog/apps/outlook.json +212 -8
  36. package/assets/open-connector/catalog/apps/outlook_calendar.json +23 -2
  37. package/assets/open-connector/catalog/apps/postiz.json +334 -0
  38. package/assets/open-connector/catalog/apps/proworkflow.json +529 -0
  39. package/assets/open-connector/catalog/apps/sellersprite_mcp.json +2 -1
  40. package/assets/open-connector/catalog/apps/shopify.json +282 -0
  41. package/assets/open-connector/catalog/apps/slack.json +405 -0
  42. package/assets/open-connector/catalog/apps/slackbot.json +214 -0
  43. package/assets/open-connector/catalog/apps/spotify.json +46 -43
  44. package/assets/open-connector/catalog/apps/stripe.json +96 -0
  45. package/assets/open-connector/catalog/apps/telegram.json +138 -0
  46. package/assets/open-connector/catalog/apps/tencent_docs.json +3 -0
  47. package/assets/open-connector/catalog/apps/weixin_store.json +543 -2
  48. package/assets/open-connector/catalog/apps/wisburg.json +1528 -0
  49. package/assets/open-connector/catalog/apps/woocommerce.json +127 -0
  50. package/assets/open-connector/catalog/apps/youtube.json +4 -1
  51. package/assets/open-connector/catalog/apps/zendesk.json +152 -0
  52. package/assets/open-connector/catalog/apps/zerotier.json +3319 -0
  53. package/assets/open-connector/catalog/apps-index.json +1 -1
  54. package/assets/open-connector/migrations/0014_saas_project.sql +55 -0
  55. package/assets/open-connector/migrations/0015_saas_cleanup_runtime.sql +8 -0
  56. package/assets/open-connector/migrations/0016_trigger_policy.sql +1 -0
  57. package/assets/open-connector/migrations/0017_trigger_subscriptions.sql +17 -0
  58. package/assets/open-connector/migrations/postgresql/0014_saas_project.sql +55 -0
  59. package/assets/open-connector/migrations/postgresql/0015_saas_cleanup_runtime.sql +8 -0
  60. package/assets/open-connector/migrations/postgresql/0016_trigger_policy.sql +1 -0
  61. package/assets/open-connector/migrations/postgresql/0017_trigger_subscriptions.sql +17 -0
  62. package/package.json +2 -2
  63. package/src/connection-service.d.ts +40 -7
  64. package/src/connection-service.js +60 -18
  65. package/src/core/action-policy.d.ts +8 -1
  66. package/src/core/action-policy.js +51 -0
  67. package/src/core/cast.d.ts +13 -0
  68. package/src/core/cast.js +18 -1
  69. package/src/core/guarded-fetch.d.ts +11 -3
  70. package/src/core/guarded-fetch.js +19 -7
  71. package/src/core/provider-scenarios.js +67 -13
  72. package/src/core/remote-http.d.ts +33 -0
  73. package/src/core/remote-http.js +104 -0
  74. package/src/core/request.d.ts +1 -0
  75. package/src/core/request.js +11 -1
  76. package/src/core/types.d.ts +5 -1
  77. package/src/marketplace/marketplace-service.d.ts +0 -1
  78. package/src/marketplace/marketplace-service.js +80 -92
  79. package/src/mcp.js +26 -9
  80. package/src/oauth/oauth-client-config-service.d.ts +16 -1
  81. package/src/oauth/oauth-client-config-service.js +59 -3
  82. package/src/oauth/oauth-flow-service.d.ts +14 -1
  83. package/src/oauth/oauth-flow-service.js +14 -6
  84. package/src/providers/17track/runtime.js +1 -1
  85. package/src/providers/action-contracts.generated.d.ts +20 -6
  86. package/src/providers/aifinmarket/runtime.js +1 -1
  87. package/src/providers/airtable/executors.d.ts +3 -0
  88. package/src/providers/airtable/executors.js +2 -0
  89. package/src/providers/airtable/trigger-on-record-changed.d.ts +2 -0
  90. package/src/providers/airtable/trigger-on-record-changed.definition.d.ts +4 -0
  91. package/src/providers/airtable/trigger-on-record-changed.definition.js +54 -0
  92. package/src/providers/airtable/trigger-on-record-changed.js +235 -0
  93. package/src/providers/aisa/executors.js +912 -50
  94. package/src/providers/aliyun_ack/runtime.js +1 -1
  95. package/src/providers/aliyun_sls/runtime.js +1 -1
  96. package/src/providers/app_store_server/runtime-helpers.js +1 -1
  97. package/src/providers/baizhi_mcp/actions.d.ts +2 -0
  98. package/src/providers/baizhi_mcp/actions.js +40 -0
  99. package/src/providers/baizhi_mcp/executors.d.ts +3 -0
  100. package/src/providers/baizhi_mcp/executors.js +102 -0
  101. package/src/providers/bazhuayu/runtime.js +2 -2
  102. package/src/providers/bilibili/runtime.js +2 -4
  103. package/src/providers/bilibili/upload.js +9 -7
  104. package/src/providers/cal/actions.js +5 -1
  105. package/src/providers/cloudflare_browser_rendering/executors.js +1 -1
  106. package/src/providers/cloudflare_dns/executors.js +1 -1
  107. package/src/providers/{cloudflare-current-user.js → cloudflare_dns/runtime-user.js} +2 -2
  108. package/src/providers/cloudflare_dns/runtime.d.ts +1 -1
  109. package/src/providers/cloudflare_dns/runtime.js +1 -1
  110. package/src/providers/cloudflare_r2/executors.js +1 -1
  111. package/src/providers/cloudflare_r2/runtime.d.ts +1 -1
  112. package/src/providers/cloudflare_r2/runtime.js +1 -1
  113. package/src/providers/cloudflare_worker/executors.js +1 -1
  114. package/src/providers/cloudflare_worker/runtime.d.ts +1 -1
  115. package/src/providers/cloudflare_worker/runtime.js +1 -1
  116. package/src/providers/dingtalk_mcp/runtime.js +1 -1
  117. package/src/providers/discordbot/executors.d.ts +0 -9
  118. package/src/providers/discordbot/executors.js +9 -101
  119. package/src/providers/discordbot/runtime-guilds.d.ts +3 -0
  120. package/src/providers/discordbot/runtime-guilds.js +464 -0
  121. package/src/providers/discordbot/runtime.d.ts +42 -0
  122. package/src/providers/discordbot/runtime.js +124 -0
  123. package/src/providers/drawio_mcp/executors.d.ts +3 -0
  124. package/src/providers/drawio_mcp/executors.js +19 -0
  125. package/src/providers/drawio_mcp/runtime.d.ts +8 -0
  126. package/src/providers/drawio_mcp/runtime.js +175 -0
  127. package/src/providers/enormail/executors.d.ts +4 -0
  128. package/src/providers/enormail/executors.js +97 -0
  129. package/src/providers/fastmoss_mcp/executors.js +2 -2
  130. package/src/providers/feishu_app_bot/executors.d.ts +3 -0
  131. package/src/providers/feishu_app_bot/executors.js +2 -0
  132. package/src/providers/feishu_app_bot/trigger-config.d.ts +1 -0
  133. package/src/providers/feishu_app_bot/trigger-config.js +10 -0
  134. package/src/providers/feishu_app_bot/trigger-on-event.d.ts +2 -0
  135. package/src/providers/feishu_app_bot/trigger-on-event.definition.d.ts +4 -0
  136. package/src/providers/feishu_app_bot/trigger-on-event.definition.js +63 -0
  137. package/src/providers/feishu_app_bot/trigger-on-event.js +29 -0
  138. package/src/providers/feishu_app_bot/trigger-subscriptions.d.ts +5 -0
  139. package/src/providers/feishu_app_bot/trigger-subscriptions.js +70 -0
  140. package/src/providers/finchina/executors.js +1 -1
  141. package/src/providers/framejet/executors.d.ts +4 -0
  142. package/src/providers/framejet/executors.js +19 -0
  143. package/src/providers/framejet/runtime.d.ts +16 -0
  144. package/src/providers/framejet/runtime.js +148 -0
  145. package/src/providers/futunn/actions.d.ts +2 -0
  146. package/src/providers/futunn/actions.js +152 -0
  147. package/src/providers/futunn/actions.research.d.ts +2 -0
  148. package/src/providers/futunn/actions.research.js +423 -0
  149. package/src/providers/futunn/actions.trading.d.ts +2 -0
  150. package/src/providers/futunn/actions.trading.js +204 -0
  151. package/src/providers/futunn/executors.d.ts +3 -0
  152. package/src/providers/futunn/executors.js +24 -0
  153. package/src/providers/futunn/runtime-research.d.ts +3 -0
  154. package/src/providers/futunn/runtime-research.js +133 -0
  155. package/src/providers/futunn/runtime-trading.d.ts +3 -0
  156. package/src/providers/futunn/runtime-trading.js +39 -0
  157. package/src/providers/futunn/runtime.d.ts +2 -0
  158. package/src/providers/futunn/runtime.js +50 -0
  159. package/src/providers/futunn/transport.d.ts +11 -0
  160. package/src/providers/futunn/transport.js +76 -0
  161. package/src/providers/gildata/executors.js +1 -1
  162. package/src/providers/github/executors.d.ts +3 -0
  163. package/src/providers/github/executors.js +6 -0
  164. package/src/providers/github/trigger-on-repo-event.d.ts +2 -0
  165. package/src/providers/github/trigger-on-repo-event.definition.d.ts +4 -0
  166. package/src/providers/github/trigger-on-repo-event.definition.js +94 -0
  167. package/src/providers/github/trigger-on-repo-event.js +168 -0
  168. package/src/providers/github/trigger-watch-pull-request.d.ts +2 -0
  169. package/src/providers/github/trigger-watch-pull-request.definition.d.ts +4 -0
  170. package/src/providers/github/trigger-watch-pull-request.definition.js +49 -0
  171. package/src/providers/github/trigger-watch-pull-request.js +106 -0
  172. package/src/providers/gitlab/executors.d.ts +3 -0
  173. package/src/providers/gitlab/executors.js +2 -0
  174. package/src/providers/gitlab/trigger-on-project-event.d.ts +2 -0
  175. package/src/providers/gitlab/trigger-on-project-event.definition.d.ts +5 -0
  176. package/src/providers/gitlab/trigger-on-project-event.definition.js +63 -0
  177. package/src/providers/gitlab/trigger-on-project-event.js +186 -0
  178. package/src/providers/gmail/executors.d.ts +3 -0
  179. package/src/providers/gmail/executors.js +5 -3
  180. package/src/providers/gmail/message.d.ts +6 -8
  181. package/src/providers/gmail/message.js +4 -0
  182. package/src/providers/gmail/scopes.d.ts +32 -0
  183. package/src/providers/gmail/scopes.js +37 -0
  184. package/src/providers/gmail/trigger-on-message-received.d.ts +2 -0
  185. package/src/providers/gmail/trigger-on-message-received.definition.d.ts +4 -0
  186. package/src/providers/gmail/trigger-on-message-received.definition.js +74 -0
  187. package/src/providers/gmail/trigger-on-message-received.js +232 -0
  188. package/src/providers/google_analytics/executors.js +2 -2
  189. package/src/providers/google_analytics/scopes.js +6 -1
  190. package/src/providers/google_bigquery/executors.js +2 -2
  191. package/src/providers/google_bigquery/scopes.js +2 -0
  192. package/src/providers/google_search_console/executors.js +2 -2
  193. package/src/providers/google_search_console/scopes.js +2 -0
  194. package/src/providers/googleads/executors.js +1 -1
  195. package/src/providers/googleads/scopes.d.ts +1 -3
  196. package/src/providers/googleads/scopes.js +2 -4
  197. package/src/providers/googlecalendar/executors.d.ts +3 -0
  198. package/src/providers/googlecalendar/executors.js +3 -1
  199. package/src/providers/googlecalendar/runtime-shared.js +2 -2
  200. package/src/providers/googlecalendar/scopes.js +2 -0
  201. package/src/providers/googlecalendar/trigger-on-event-changed.d.ts +2 -0
  202. package/src/providers/googlecalendar/trigger-on-event-changed.definition.d.ts +4 -0
  203. package/src/providers/googlecalendar/trigger-on-event-changed.definition.js +74 -0
  204. package/src/providers/googlecalendar/trigger-on-event-changed.js +233 -0
  205. package/src/providers/googlechat/executors.d.ts +1 -3
  206. package/src/providers/googlechat/executors.js +219 -28
  207. package/src/providers/googlechat/members.d.ts +55 -0
  208. package/src/providers/googlechat/members.js +293 -0
  209. package/src/providers/googlechat/runtime.d.ts +16 -0
  210. package/src/providers/googlechat/runtime.js +25 -0
  211. package/src/providers/googlechat/scopes.d.ts +22 -3
  212. package/src/providers/googlechat/scopes.js +30 -7
  213. package/src/providers/googledocs/executors.js +1 -1
  214. package/src/providers/googledrive/executors.d.ts +3 -0
  215. package/src/providers/googledrive/executors.js +9 -2
  216. package/src/providers/{google-auth.d.ts → googledrive/runtime-auth.d.ts} +2 -2
  217. package/src/providers/{google-auth.js → googledrive/runtime-auth.js} +3 -3
  218. package/src/providers/googledrive/runtime-collaboration.js +1 -1
  219. package/src/providers/{google-runtime.d.ts → googledrive/runtime-request.d.ts} +1 -1
  220. package/src/providers/{google-runtime.js → googledrive/runtime-request.js} +2 -2
  221. package/src/providers/googledrive/trigger-changes.d.ts +12 -0
  222. package/src/providers/googledrive/trigger-changes.definition.d.ts +7 -0
  223. package/src/providers/googledrive/trigger-changes.definition.js +101 -0
  224. package/src/providers/googledrive/trigger-changes.js +452 -0
  225. package/src/providers/googledrive/trigger-on-file-change.d.ts +2 -0
  226. package/src/providers/googledrive/trigger-on-file-change.definition.d.ts +4 -0
  227. package/src/providers/googledrive/trigger-on-file-change.definition.js +77 -0
  228. package/src/providers/googledrive/trigger-on-file-change.js +258 -0
  229. package/src/providers/googleforms/executors.js +2 -2
  230. package/src/providers/googleforms/scopes.d.ts +0 -3
  231. package/src/providers/googleforms/scopes.js +2 -6
  232. package/src/providers/googlemeet/executors.js +2 -2
  233. package/src/providers/googlemeet/scopes.d.ts +0 -3
  234. package/src/providers/googlemeet/scopes.js +2 -6
  235. package/src/providers/googlesheets/executors.d.ts +3 -0
  236. package/src/providers/googlesheets/executors.js +3 -1
  237. package/src/providers/googlesheets/scopes.js +2 -0
  238. package/src/providers/googlesheets/trigger-on-row-added.d.ts +2 -0
  239. package/src/providers/googlesheets/trigger-on-row-added.definition.d.ts +4 -0
  240. package/src/providers/googlesheets/trigger-on-row-added.definition.js +54 -0
  241. package/src/providers/googlesheets/trigger-on-row-added.js +234 -0
  242. package/src/providers/googleslides/executors.js +2 -2
  243. package/src/providers/googleslides/scopes.d.ts +0 -3
  244. package/src/providers/googleslides/scopes.js +2 -6
  245. package/src/providers/googletasks/executors.js +2 -2
  246. package/src/providers/googletasks/scopes.d.ts +0 -3
  247. package/src/providers/googletasks/scopes.js +2 -6
  248. package/src/providers/granola/actions.js +2 -0
  249. package/src/providers/granola/runtime-mcp.js +2 -0
  250. package/src/providers/granola/runtime.js +2 -2
  251. package/src/providers/hithink_finance/runtime.js +1 -1
  252. package/src/providers/indexed/executors.d.ts +4 -0
  253. package/src/providers/indexed/executors.js +16 -0
  254. package/src/providers/indexed/runtime.d.ts +26 -0
  255. package/src/providers/indexed/runtime.js +129 -0
  256. package/src/providers/indiegogo/executors.js +1 -1
  257. package/src/providers/investoday_mcp/executors.js +2 -2
  258. package/src/providers/iyunbiao/runtime.js +2 -2
  259. package/src/providers/keepa/actions.d.ts +1 -1
  260. package/src/providers/keepa/actions.js +371 -149
  261. package/src/providers/keepa/deal-attributes.d.ts +1 -0
  262. package/src/providers/keepa/deal-attributes.js +26 -0
  263. package/src/providers/keepa/runtime.js +212 -18
  264. package/src/providers/kingdee/executors.js +1 -1
  265. package/src/providers/kingdee/runtime.js +2 -2
  266. package/src/providers/kuaidi100/runtime.js +1 -1
  267. package/src/providers/linear/executors.d.ts +3 -0
  268. package/src/providers/linear/executors.js +14 -9
  269. package/src/providers/linear/trigger-on-issue-changed.d.ts +2 -0
  270. package/src/providers/linear/trigger-on-issue-changed.definition.d.ts +5 -0
  271. package/src/providers/linear/trigger-on-issue-changed.definition.js +43 -0
  272. package/src/providers/linear/trigger-on-issue-changed.js +215 -0
  273. package/src/providers/linear_mcp/actions.d.ts +47 -0
  274. package/src/providers/linear_mcp/actions.js +102 -0
  275. package/src/providers/linear_mcp/endpoints.d.ts +3 -0
  276. package/src/providers/linear_mcp/endpoints.js +3 -0
  277. package/src/providers/linear_mcp/executors.d.ts +3 -0
  278. package/src/providers/linear_mcp/executors.js +9 -0
  279. package/src/providers/linear_mcp/runtime-mcp.d.ts +15 -0
  280. package/src/providers/linear_mcp/runtime-mcp.js +238 -0
  281. package/src/providers/lingxing_mcp/runtime.js +1 -1
  282. package/src/providers/mcdonalds_cn_mcp/runtime.js +1 -1
  283. package/src/providers/metabase/mcp-runtime.js +1 -1
  284. package/src/providers/moneyforward_mcp/executors.d.ts +3 -0
  285. package/src/providers/moneyforward_mcp/executors.js +11 -0
  286. package/src/providers/moneyforward_mcp/manifest.d.ts +31 -0
  287. package/src/providers/moneyforward_mcp/manifest.js +204 -0
  288. package/src/providers/moneyforward_mcp/runtime.d.ts +18 -0
  289. package/src/providers/moneyforward_mcp/runtime.js +296 -0
  290. package/src/providers/notion/executors.d.ts +3 -0
  291. package/src/providers/notion/executors.js +41 -3
  292. package/src/providers/notion/trigger-on-database-page-event.d.ts +2 -0
  293. package/src/providers/notion/trigger-on-database-page-event.definition.d.ts +4 -0
  294. package/src/providers/notion/trigger-on-database-page-event.definition.js +63 -0
  295. package/src/providers/notion/trigger-on-database-page-event.js +293 -0
  296. package/src/providers/notion_mcp/endpoints.d.ts +3 -0
  297. package/src/providers/notion_mcp/endpoints.js +3 -0
  298. package/src/providers/notion_mcp/executors.d.ts +3 -0
  299. package/src/providers/notion_mcp/executors.js +176 -0
  300. package/src/providers/notion_mcp/mcp-response.d.ts +86 -0
  301. package/src/providers/notion_mcp/mcp-response.js +314 -0
  302. package/src/providers/odoo/executors.d.ts +3 -0
  303. package/src/providers/odoo/executors.js +32 -0
  304. package/src/providers/odoo/runtime.d.ts +16 -0
  305. package/src/providers/odoo/runtime.js +140 -0
  306. package/src/providers/one_drive/executors.d.ts +3 -0
  307. package/src/providers/one_drive/executors.js +2 -0
  308. package/src/providers/one_drive/trigger-on-item-changed.d.ts +2 -0
  309. package/src/providers/one_drive/trigger-on-item-changed.definition.d.ts +4 -0
  310. package/src/providers/one_drive/trigger-on-item-changed.definition.js +63 -0
  311. package/src/providers/one_drive/trigger-on-item-changed.js +214 -0
  312. package/src/providers/outlook/executors.d.ts +3 -0
  313. package/src/providers/outlook/executors.js +29 -6
  314. package/src/providers/outlook/microsoft-graph.js +17 -6
  315. package/src/providers/outlook/trigger-on-message-received.d.ts +2 -0
  316. package/src/providers/outlook/trigger-on-message-received.definition.d.ts +4 -0
  317. package/src/providers/outlook/trigger-on-message-received.definition.js +93 -0
  318. package/src/providers/outlook/trigger-on-message-received.js +226 -0
  319. package/src/providers/outlook_calendar/executors.js +30 -7
  320. package/src/providers/patsnap_mcp/executors.js +2 -2
  321. package/src/providers/postiz/executors.d.ts +4 -0
  322. package/src/providers/postiz/executors.js +83 -0
  323. package/src/providers/provider-loader.d.ts +5 -0
  324. package/src/providers/provider-loader.js +4 -0
  325. package/src/providers/provider-runtime.d.ts +15 -0
  326. package/src/providers/provider-runtime.js +57 -4
  327. package/src/providers/proworkflow/executors.d.ts +4 -0
  328. package/src/providers/proworkflow/executors.js +135 -0
  329. package/src/providers/registry.generated.js +14 -0
  330. package/src/providers/scrape_creators/catalog.js +1 -1
  331. package/src/providers/scrape_creators/runtime.js +1 -1
  332. package/src/providers/sellersprite_mcp/executors.js +2 -2
  333. package/src/providers/sellersprite_mcp/official-actions.js +3 -2
  334. package/src/providers/sentry/runtime.js +6 -7
  335. package/src/providers/shopify/executors.d.ts +3 -0
  336. package/src/providers/shopify/executors.js +2 -0
  337. package/src/providers/shopify/trigger-on-shop-event.d.ts +2 -0
  338. package/src/providers/shopify/trigger-on-shop-event.definition.d.ts +4 -0
  339. package/src/providers/shopify/trigger-on-shop-event.definition.js +214 -0
  340. package/src/providers/shopify/trigger-on-shop-event.js +165 -0
  341. package/src/providers/slack/actions.js +52 -3
  342. package/src/providers/slack/executors.d.ts +3 -0
  343. package/src/providers/slack/executors.js +2 -0
  344. package/src/providers/slack/runtime.js +58 -21
  345. package/src/providers/slack/trigger-on-message-posted.d.ts +2 -0
  346. package/src/providers/slack/trigger-on-message-posted.definition.d.ts +4 -0
  347. package/src/providers/slack/trigger-on-message-posted.definition.js +80 -0
  348. package/src/providers/slack/trigger-on-message-posted.js +176 -0
  349. package/src/providers/slickdeals/runtime.js +1 -1
  350. package/src/providers/sorftime_mcp/executors.js +2 -2
  351. package/src/providers/spotify/runtime.js +15 -4
  352. package/src/providers/stripe/executors.d.ts +3 -0
  353. package/src/providers/stripe/executors.js +2 -0
  354. package/src/providers/stripe/trigger-on-event.d.ts +2 -0
  355. package/src/providers/stripe/trigger-on-event.definition.d.ts +4 -0
  356. package/src/providers/stripe/trigger-on-event.definition.js +43 -0
  357. package/src/providers/stripe/trigger-on-event.js +212 -0
  358. package/src/providers/telegram/executors.d.ts +3 -0
  359. package/src/providers/telegram/executors.js +2 -0
  360. package/src/providers/telegram/trigger-on-update.d.ts +2 -0
  361. package/src/providers/telegram/trigger-on-update.definition.d.ts +5 -0
  362. package/src/providers/telegram/trigger-on-update.definition.js +78 -0
  363. package/src/providers/telegram/trigger-on-update.js +141 -0
  364. package/src/providers/tikhub/bounded-response.d.ts +1 -1
  365. package/src/providers/tikhub/bounded-response.js +8 -34
  366. package/src/providers/tikhub/endpoint-catalog.js +1 -1
  367. package/src/providers/tikhub/runtime.js +2 -2
  368. package/src/providers/tongdaxin/executors.js +79 -15
  369. package/src/providers/uspto/executors.js +1 -1
  370. package/src/providers/waffo/executors.js +1 -1
  371. package/src/providers/waffo/runtime.js +1 -1
  372. package/src/providers/wecom_mcp/runtime.js +1 -1
  373. package/src/providers/weixin_store/access-token.d.ts +2 -1
  374. package/src/providers/weixin_store/access-token.js +15 -4
  375. package/src/providers/weixin_store/executors.js +97 -12
  376. package/src/providers/wisburg/executors.d.ts +4 -0
  377. package/src/providers/wisburg/executors.js +13 -0
  378. package/src/providers/wisburg/runtime.d.ts +12 -0
  379. package/src/providers/wisburg/runtime.js +133 -0
  380. package/src/providers/woocommerce/executors.d.ts +3 -0
  381. package/src/providers/woocommerce/executors.js +2 -0
  382. package/src/providers/woocommerce/trigger-on-store-event.d.ts +2 -0
  383. package/src/providers/woocommerce/trigger-on-store-event.definition.d.ts +4 -0
  384. package/src/providers/woocommerce/trigger-on-store-event.definition.js +55 -0
  385. package/src/providers/woocommerce/trigger-on-store-event.js +179 -0
  386. package/src/providers/xydc_mcp/executors.js +2 -2
  387. package/src/providers/youtube/executors.js +1 -1
  388. package/src/providers/youtube/runtime.js +1 -1
  389. package/src/providers/zendesk/executors.d.ts +3 -0
  390. package/src/providers/zendesk/executors.js +2 -0
  391. package/src/providers/zendesk/trigger-on-event.d.ts +2 -0
  392. package/src/providers/zendesk/trigger-on-event.definition.d.ts +5 -0
  393. package/src/providers/zendesk/trigger-on-event.definition.js +101 -0
  394. package/src/providers/zendesk/trigger-on-event.js +188 -0
  395. package/src/providers/zerotier/executors.d.ts +9 -0
  396. package/src/providers/zerotier/executors.js +629 -0
  397. package/src/providers/zerotier/runtime.d.ts +54 -0
  398. package/src/providers/zerotier/runtime.js +207 -0
  399. package/src/saas/saas-cleanup-service.d.ts +26 -0
  400. package/src/saas/saas-cleanup-service.js +124 -0
  401. package/src/saas/saas-client.d.ts +86 -0
  402. package/src/saas/saas-client.js +369 -0
  403. package/src/saas/saas-execution-service.d.ts +15 -0
  404. package/src/saas/saas-execution-service.js +21 -0
  405. package/src/saas/saas-oauth-service.d.ts +25 -0
  406. package/src/saas/saas-oauth-service.js +197 -0
  407. package/src/saas/saas-project-service.d.ts +61 -0
  408. package/src/saas/saas-project-service.js +211 -0
  409. package/src/server/actions/action-idempotency.d.ts +1 -0
  410. package/src/server/actions/action-idempotency.js +1 -0
  411. package/src/server/actions/action-runner.d.ts +7 -0
  412. package/src/server/actions/action-runner.js +43 -7
  413. package/src/server/actions/run-log-summary.js +9 -0
  414. package/src/server/api/auth.d.ts +1 -0
  415. package/src/server/api/auth.js +13 -2
  416. package/src/server/api/cache-policy.js +4 -1
  417. package/src/server/api/connection-input.d.ts +7 -1
  418. package/src/server/api/connection-input.js +7 -1
  419. package/src/server/api/connection-routes.d.ts +3 -1
  420. package/src/server/api/connection-routes.js +21 -3
  421. package/src/server/api/http-utils.d.ts +4 -3
  422. package/src/server/api/oauth-completion-page.d.ts +124 -0
  423. package/src/server/api/oauth-completion-page.js +113 -18
  424. package/src/server/api/openapi.js +123 -15
  425. package/src/server/api/policy-input.js +6 -0
  426. package/src/server/api/runtime-api.d.ts +18 -3
  427. package/src/server/api/runtime-api.js +36 -5
  428. package/src/server/api/saas-completion-page.d.ts +2 -0
  429. package/src/server/api/saas-completion-page.js +103 -0
  430. package/src/server/connect-app.d.ts +5 -0
  431. package/src/server/connect-app.js +50 -0
  432. package/src/server/connect-server.d.ts +12 -0
  433. package/src/server/connect-server.js +157 -15
  434. package/src/server/connector-runtime.d.ts +3 -1
  435. package/src/server/connector-runtime.js +5 -2
  436. package/src/server/files/transit-files.js +16 -7
  437. package/src/server/proxy/proxy-runner.d.ts +5 -1
  438. package/src/server/proxy/proxy-runner.js +72 -26
  439. package/src/server/storage/connection-request-store.d.ts +41 -1
  440. package/src/server/storage/connection-request-store.js +245 -20
  441. package/src/server/storage/connection-store.d.ts +16 -0
  442. package/src/server/storage/connection-store.js +119 -0
  443. package/src/server/storage/node-runtime-database.js +3 -3
  444. package/src/server/storage/{postgres-migrations.d.ts → postgres/migrations.d.ts} +2 -2
  445. package/src/server/storage/{postgres-migrations.js → postgres/migrations.js} +1 -1
  446. package/src/server/storage/postgres/runtime-store.d.ts +43 -0
  447. package/src/server/storage/{postgres-runtime-store.js → postgres/runtime-store.js} +59 -94
  448. package/src/server/storage/runtime-database.d.ts +4 -0
  449. package/src/server/storage/runtime-sql.d.ts +1 -1
  450. package/src/server/storage/runtime-sql.js +2 -1
  451. package/src/server/storage/runtime-store.d.ts +1 -0
  452. package/src/server/storage/runtime-token-service.d.ts +2 -0
  453. package/src/server/storage/runtime-token-service.js +3 -0
  454. package/src/server/storage/saas-project-store.d.ts +77 -0
  455. package/src/server/storage/saas-project-store.js +273 -0
  456. package/src/server/storage/{sqlite-runtime-store.d.ts → sqlite/runtime-store.d.ts} +21 -25
  457. package/src/server/storage/{sqlite-runtime-store.js → sqlite/runtime-store.js} +100 -115
  458. package/src/server/storage/trigger-store.d.ts +16 -0
  459. package/src/server/storage/trigger-store.js +96 -0
  460. package/src/triggers/common/config.d.ts +2 -0
  461. package/src/triggers/common/config.js +17 -0
  462. package/src/triggers/common/configOptions.d.ts +13 -0
  463. package/src/triggers/common/configOptions.js +1 -0
  464. package/src/triggers/common/encoding.d.ts +3 -0
  465. package/src/triggers/common/encoding.js +19 -0
  466. package/src/triggers/common/integration.d.ts +115 -0
  467. package/src/triggers/common/integration.js +31 -0
  468. package/src/triggers/common/json.d.ts +6 -0
  469. package/src/triggers/common/json.js +91 -0
  470. package/src/triggers/common/poll.d.ts +41 -0
  471. package/src/triggers/common/poll.js +15 -0
  472. package/src/triggers/common/proxy.d.ts +14 -0
  473. package/src/triggers/common/proxy.js +1 -0
  474. package/src/triggers/common/types.d.ts +42 -0
  475. package/src/triggers/common/types.js +1 -0
  476. package/src/triggers/maintenance.d.ts +40 -0
  477. package/src/triggers/maintenance.js +120 -0
  478. package/src/triggers/metadata.d.ts +8 -0
  479. package/src/triggers/metadata.js +1 -0
  480. package/src/triggers/request.d.ts +33 -0
  481. package/src/triggers/request.js +52 -0
  482. package/src/triggers/resources.d.ts +12 -0
  483. package/src/triggers/resources.js +121 -0
  484. package/src/triggers/signature.d.ts +4 -0
  485. package/src/triggers/signature.js +48 -0
  486. package/src/triggers/store.d.ts +29 -0
  487. package/src/triggers/store.js +1 -0
  488. package/src/triggers/subscriptions.d.ts +22 -0
  489. package/src/triggers/subscriptions.js +220 -0
  490. package/src/triggers/trigger-runner.d.ts +34 -0
  491. package/src/triggers/trigger-runner.js +169 -0
  492. package/src/providers/sentry/scopes.d.ts +0 -1
  493. package/src/providers/sentry/scopes.js +0 -7
  494. package/src/server/storage/postgres-runtime-store.d.ts +0 -39
  495. /package/src/providers/{cloudflare-current-user.d.ts → cloudflare_dns/runtime-user.d.ts} +0 -0
@@ -0,0 +1,314 @@
1
+ import { compactObject, looseArray, optionalRawString, optionalRecord, optionalString, pickOptionalString, recordOrEmpty, } from "../../core/cast.js";
2
+ // Tag and attribute patterns exclude `<` and use a lookbehind so each scan is linear in the text length: page
3
+ // content and comments are user-written, and a quadratic pattern would block the event loop on a crafted answer.
4
+ const pageTag = /<page\b([^<>]*)>/i;
5
+ const contentOpening = /<content\b[^<>]*>/i;
6
+ const tagAttribute = /(?<![\w:-])([\w:-]+)\s*=\s*"([^"]*)"/g;
7
+ const anyTag = /<[^<>]+>/g;
8
+ const namedEntities = { amp: "&", lt: "<", gt: ">", quot: '"', apos: "'" };
9
+ /** Notion's tools answer JSON in a text block on most calls and prose or XML fragments on the rest. */
10
+ export function decodeNotionToolText(text) {
11
+ const trimmed = text.trim();
12
+ if (trimmed.startsWith("{") || trimmed.startsWith("[")) {
13
+ try {
14
+ return JSON.parse(trimmed);
15
+ }
16
+ catch {
17
+ // Not JSON after all: the text is the value.
18
+ }
19
+ }
20
+ return text;
21
+ }
22
+ /**
23
+ * The connected user as notion-get-users answers `user_id: "self"`: the first listed user of
24
+ * `{results: [{type, id, name, email}], has_more}` that carries an ID or an email, or the answer itself when it is a
25
+ * single user.
26
+ */
27
+ export function parseNotionSelf(value) {
28
+ const users = findList(value, "results", "users").flatMap((item) => {
29
+ const user = readUser(item);
30
+ return user ? [user] : [];
31
+ });
32
+ const candidates = users.length > 0 ? users : [readUser(value)];
33
+ return candidates.find((user) => user?.id !== undefined || user?.email !== undefined);
34
+ }
35
+ /**
36
+ * Search results plus the server's notices, such as a filter dropped on the connected plan, and the search `type`
37
+ * the server reports: `workspace_search`, or `ai_search` when it routed a keyword query to Notion AI search.
38
+ */
39
+ export function parseNotionSearch(value) {
40
+ const record = optionalRecord(value);
41
+ const results = findList(value, "results", "pages", "items").flatMap((item) => {
42
+ const result = optionalRecord(item);
43
+ if (!result)
44
+ return [];
45
+ const typed = compactObject({
46
+ id: pickOptionalString(result, "id"),
47
+ title: readTitle(result),
48
+ url: pickOptionalString(result, "url"),
49
+ type: pickOptionalString(result, "type"),
50
+ timestamp: pickOptionalString(result, "timestamp", "last_edited_time"),
51
+ path: pickOptionalString(result, "path"),
52
+ });
53
+ return [typed];
54
+ });
55
+ return { type: record && pickOptionalString(record, "type"), results, notices: readNotices(record?.notices) };
56
+ }
57
+ /**
58
+ * The page envelope notion-fetch answers: a preamble line, then
59
+ * `<page url="..."><properties>...</properties><content>MARKDOWN</content></page>`, either bare in the text block or
60
+ * under `text` of a `{title, url, page_last_edited_at, text}` object. A page the server cut says so with a
61
+ * `truncated` flag on the object or on the tag.
62
+ */
63
+ export function parseNotionPage(value) {
64
+ const record = optionalRecord(value);
65
+ const text = record ? pickOptionalString(record, "text", "content", "markdown", "body") : optionalString(value);
66
+ const tag = text === undefined ? null : pageTag.exec(text);
67
+ const attributes = tag ? readAttributes(tag[1]) : {};
68
+ const properties = text === undefined ? undefined : nextXmlBlock(text, "properties", 0);
69
+ const content = text === undefined ? undefined : nextXmlBlock(text, "content", 0);
70
+ let body;
71
+ if (content) {
72
+ body = content.body;
73
+ }
74
+ else if (text !== undefined) {
75
+ // No closed content block: an unclosed one takes the rest; a bare answer is the whole text.
76
+ const opening = contentOpening.exec(text);
77
+ body = opening ? text.slice(opening.index + opening[0].length) : text;
78
+ }
79
+ return {
80
+ ...compactObject({
81
+ title: (record && pickOptionalString(record, "title")) ?? optionalString(attributes.title),
82
+ url: (record && pickOptionalString(record, "url")) ?? optionalString(attributes.url),
83
+ page_last_edited_at: (record && pickOptionalString(record, "page_last_edited_at", "last_edited_time")) ??
84
+ optionalString(attributes.page_last_edited_at ?? attributes.last_edited_time),
85
+ properties: properties ? unescapeEntities(properties.body).trim() : undefined,
86
+ content: body === undefined ? undefined : unescapeEntities(body).trim(),
87
+ }),
88
+ truncated: record?.truncated === true ||
89
+ isTrue(attributes.truncated) ||
90
+ (content !== undefined && isTrue(readAttributes(content.attributes).truncated)),
91
+ };
92
+ }
93
+ /**
94
+ * Comments as notion-get-comments answers them, in both recorded shapes: the structured
95
+ * `{discussions: [{id, comments: [{id, plain_text, created_time, created_by}]}]}` (or a flat `{comments: [...]}`),
96
+ * or the XML twin `<discussion id><comment id author author_id created_time>text</comment></discussion>`.
97
+ */
98
+ export function parseNotionComments(value) {
99
+ const record = optionalRecord(value);
100
+ if (!record) {
101
+ const text = optionalString(value);
102
+ return text === undefined ? [] : readXmlComments(text);
103
+ }
104
+ const comments = findList(record, "comments", "results", "items").flatMap((item) => readComment(item, undefined));
105
+ for (const discussion of findList(record, "discussions")) {
106
+ const thread = optionalRecord(discussion);
107
+ if (!thread)
108
+ continue;
109
+ const discussionId = pickOptionalString(thread, "id", "discussion_id");
110
+ comments.push(...findList(thread, "comments", "results").flatMap((item) => readComment(item, discussionId)));
111
+ }
112
+ if (comments.length > 0)
113
+ return comments;
114
+ const text = pickOptionalString(record, "text");
115
+ return text === undefined ? [] : readXmlComments(text);
116
+ }
117
+ /**
118
+ * The plan report notion-get-tool-access answers: `{current_tool_access: {<tool>: {status, restricted_parameters?,
119
+ * upgrade_url?, full_version_url?, landing_page_url?, landing_page_action?}}}`, keyed by each tool's base name
120
+ * (`search`, `ai_search`), where `restricted_parameters` maps a parameter path such as `filters.title_only` to the
121
+ * reason it is unavailable. The reason is kept as text and never interpreted.
122
+ */
123
+ export function parseNotionToolAccess(value) {
124
+ const access = recordOrEmpty(optionalRecord(value)?.current_tool_access);
125
+ return Object.entries(access).flatMap(([tool, item]) => {
126
+ const entry = optionalRecord(item);
127
+ if (!entry)
128
+ return [];
129
+ const restrictions = Object.entries(recordOrEmpty(entry.restricted_parameters)).map(([parameter, reason]) => ({
130
+ parameter,
131
+ reason: optionalRawString(reason) ?? JSON.stringify(reason),
132
+ }));
133
+ return [
134
+ {
135
+ tool,
136
+ status: pickOptionalString(entry, "status"),
137
+ restricted_parameters: restrictions,
138
+ upgrade_url: pickOptionalString(entry, "upgrade_url"),
139
+ full_version_url: pickOptionalString(entry, "full_version_url"),
140
+ landing_page_url: pickOptionalString(entry, "landing_page_url"),
141
+ landing_page_action: pickOptionalString(entry, "landing_page_action"),
142
+ },
143
+ ];
144
+ });
145
+ }
146
+ /** The first present list among keys of a decoded object, or the value itself when it is a list. */
147
+ function findList(value, ...keys) {
148
+ if (Array.isArray(value))
149
+ return value;
150
+ const record = optionalRecord(value);
151
+ if (!record)
152
+ return [];
153
+ for (const key of keys) {
154
+ if (Array.isArray(record[key]))
155
+ return looseArray(record[key]);
156
+ }
157
+ return [];
158
+ }
159
+ function readUser(value) {
160
+ const record = optionalRecord(value);
161
+ if (!record)
162
+ return undefined;
163
+ const user = compactObject({
164
+ id: pickOptionalString(record, "id", "user_id"),
165
+ name: pickOptionalString(record, "name"),
166
+ email: pickOptionalString(record, "email"),
167
+ type: pickOptionalString(record, "type"),
168
+ });
169
+ return Object.keys(user).length > 0 ? user : undefined;
170
+ }
171
+ /** A result title as the server spells it: a plain string, or the API's rich-text array under properties. */
172
+ function readTitle(record) {
173
+ const plain = pickOptionalString(record, "title", "name");
174
+ if (plain)
175
+ return plain;
176
+ const properties = optionalRecord(record.properties);
177
+ if (!properties)
178
+ return undefined;
179
+ for (const key of ["title", "Name", "name"]) {
180
+ const property = optionalRecord(properties[key]);
181
+ if (!property)
182
+ continue;
183
+ const text = looseArray(property.title)
184
+ .map((part) => optionalRawString(optionalRecord(part)?.plain_text) ?? "")
185
+ .join("");
186
+ if (text.trim())
187
+ return text.trim();
188
+ }
189
+ return undefined;
190
+ }
191
+ /** A notice is a sentence or an object naming a parameter; either way its text is kept, never interpreted. */
192
+ function readNotices(value) {
193
+ const single = optionalString(value);
194
+ if (single)
195
+ return [single];
196
+ return looseArray(value).flatMap((item) => {
197
+ const text = optionalString(item);
198
+ if (text)
199
+ return [text];
200
+ const record = optionalRecord(item);
201
+ if (!record)
202
+ return [];
203
+ return [
204
+ pickOptionalString(record, "message", "parameter", "field", "name", "detail", "text") ?? JSON.stringify(record),
205
+ ];
206
+ });
207
+ }
208
+ function readComment(value, discussionId) {
209
+ const record = optionalRecord(value);
210
+ if (!record)
211
+ return [];
212
+ const author = optionalRecord(record.created_by);
213
+ const createdBy = author
214
+ ? (readUser(author) ?? {})
215
+ : compactObject({
216
+ id: pickOptionalString(record, "author_id", "user_id"),
217
+ name: pickOptionalString(record, "author", "author_name"),
218
+ email: pickOptionalString(record, "author_email"),
219
+ });
220
+ const comment = compactObject({
221
+ id: pickOptionalString(record, "id", "comment_id"),
222
+ discussion_id: pickOptionalString(record, "discussion_id") ?? discussionId,
223
+ plain_text: pickOptionalString(record, "plain_text", "text", "content", "body"),
224
+ created_time: pickOptionalString(record, "created_time", "created_at", "timestamp"),
225
+ created_by: Object.keys(createdBy).length > 0 ? createdBy : undefined,
226
+ });
227
+ return comment.id !== undefined || comment.plain_text !== undefined ? [comment] : [];
228
+ }
229
+ function readXmlComments(text) {
230
+ const comments = [];
231
+ let remainder = "";
232
+ let last = 0;
233
+ for (const block of xmlBlocks(text, "discussion")) {
234
+ remainder += text.slice(last, block.start);
235
+ last = block.end;
236
+ const attributes = readAttributes(block.attributes);
237
+ comments.push(...readXmlCommentTags(block.body, optionalString(attributes.id ?? attributes.discussion_id)));
238
+ }
239
+ remainder += text.slice(last);
240
+ comments.push(...readXmlCommentTags(remainder, undefined));
241
+ return comments;
242
+ }
243
+ function readXmlCommentTags(text, discussionId) {
244
+ return xmlBlocks(text, "comment").flatMap((block) => {
245
+ const attributes = readAttributes(block.attributes);
246
+ const createdBy = compactObject({
247
+ id: optionalString(attributes.author_id ?? attributes.user_id ?? attributes.created_by_id),
248
+ name: optionalString(attributes.author ?? attributes.author_name ?? attributes.created_by ?? attributes.user),
249
+ email: optionalString(attributes.author_email ?? attributes.email),
250
+ });
251
+ const comment = compactObject({
252
+ id: optionalString(attributes.id ?? attributes.comment_id),
253
+ discussion_id: optionalString(attributes.discussion_id) ?? discussionId,
254
+ plain_text: optionalString(unescapeEntities(block.body.replace(anyTag, " ")).replace(/[ \t]{2,}/g, " ")),
255
+ created_time: optionalString(attributes.created_time ?? attributes.created_at ?? attributes.timestamp ?? attributes.time ?? attributes.date),
256
+ created_by: Object.keys(createdBy).length > 0 ? createdBy : undefined,
257
+ });
258
+ return comment.plain_text !== undefined ? [comment] : [];
259
+ });
260
+ }
261
+ /** Every `<tag ...>body</tag>` element in order, each scan resuming after the previous element. */
262
+ function xmlBlocks(text, tag) {
263
+ const blocks = [];
264
+ for (let block = nextXmlBlock(text, tag, 0); block; block = nextXmlBlock(text, tag, block.end)) {
265
+ blocks.push(block);
266
+ }
267
+ return blocks;
268
+ }
269
+ /**
270
+ * The first `<tag ...>body</tag>` element at or after `from`, ending at the first closing tag after its opening.
271
+ * When that opening has no closing tag after it, no later opening can have one either, so the scan stops instead of
272
+ * retrying every opening the way a lazy `[\s\S]*?` pattern does.
273
+ */
274
+ function nextXmlBlock(text, tag, from) {
275
+ const opening = new RegExp(`<${tag}\\b([^<>]*)>`, "gi");
276
+ opening.lastIndex = from;
277
+ const open = opening.exec(text);
278
+ if (!open)
279
+ return undefined;
280
+ const closing = new RegExp(`</${tag}>`, "gi");
281
+ closing.lastIndex = opening.lastIndex;
282
+ const close = closing.exec(text);
283
+ if (!close)
284
+ return undefined;
285
+ return {
286
+ attributes: open[1],
287
+ body: text.slice(opening.lastIndex, close.index),
288
+ start: open.index,
289
+ end: closing.lastIndex,
290
+ };
291
+ }
292
+ /** The attributes of one tag's attribute text, names lower-cased and values entity-decoded. */
293
+ function readAttributes(attributes) {
294
+ const found = {};
295
+ for (const match of attributes.matchAll(tagAttribute)) {
296
+ found[match[1].toLowerCase()] = unescapeEntities(match[2]);
297
+ }
298
+ return found;
299
+ }
300
+ function isTrue(value) {
301
+ return value?.trim().toLowerCase() === "true";
302
+ }
303
+ /** The XML entities Notion escapes inside its envelopes; the Markdown itself is left alone. */
304
+ function unescapeEntities(text) {
305
+ return text.replace(/&(#x[0-9a-f]+|#\d+|amp|lt|gt|quot|apos);/gi, (entity, body) => {
306
+ if (body.startsWith("#")) {
307
+ const hex = body[1] === "x" || body[1] === "X";
308
+ const code = Number.parseInt(body.slice(hex ? 2 : 1), hex ? 16 : 10);
309
+ // A number past U+10FFFF names no character, and String.fromCodePoint throws on it; keep the entity as text.
310
+ return code <= 0x10ffff ? String.fromCodePoint(code) : entity;
311
+ }
312
+ return namedEntities[body.toLowerCase()] ?? entity;
313
+ });
314
+ }
@@ -0,0 +1,3 @@
1
+ import type { CredentialValidators, ProviderExecutors } from "../../core/types.ts";
2
+ export declare const executors: ProviderExecutors;
3
+ export declare const credentialValidators: CredentialValidators;
@@ -0,0 +1,32 @@
1
+ import { isPrivateNetworkAccessAllowed } from "../../core/request.js";
2
+ import { createProviderFetch, defineProviderExecutors, ProviderRequestError, providerInputError, requireCustomCredential, } from "../provider-runtime.js";
3
+ import { createOdooContext, odooActionHandlers } from "./runtime.js";
4
+ export const executors = defineProviderExecutors({
5
+ service: "odoo",
6
+ handlers: odooActionHandlers,
7
+ allowPrivateNetwork: isPrivateNetworkAccessAllowed,
8
+ async createContext(context, fetcher) {
9
+ const credential = await requireCustomCredential(context, "odoo");
10
+ return createOdooContext(credential.values, fetcher, context.signal);
11
+ },
12
+ });
13
+ export const credentialValidators = {
14
+ async customCredential(input, { fetcher, signal }) {
15
+ const guardedFetcher = createProviderFetch({ fetch: fetcher, allowPrivateNetwork: isPrivateNetworkAccessAllowed });
16
+ try {
17
+ const context = await createOdooContext(input.values, guardedFetcher, signal);
18
+ return {
19
+ profile: {
20
+ accountId: `${context.endpoint}:${context.database}:${context.uid}`,
21
+ displayName: `${context.username} (${context.database})`,
22
+ },
23
+ };
24
+ }
25
+ catch (error) {
26
+ if (error instanceof ProviderRequestError && (error.status === 401 || error.status === 403)) {
27
+ throw providerInputError(error.message);
28
+ }
29
+ throw error;
30
+ }
31
+ },
32
+ };
@@ -0,0 +1,16 @@
1
+ import type { ProviderActionHandlers } from "../provider-runtime.ts";
2
+ interface OdooConnection {
3
+ endpoint: string;
4
+ database: string;
5
+ username: string;
6
+ password: string;
7
+ fetcher: typeof fetch;
8
+ signal?: AbortSignal;
9
+ }
10
+ export interface OdooActionContext extends OdooConnection {
11
+ uid: number;
12
+ }
13
+ type OdooActionHandler = (input: Record<string, unknown>, context: OdooActionContext) => Promise<unknown>;
14
+ export declare const odooActionHandlers: ProviderActionHandlers<"odoo", OdooActionHandler>;
15
+ export declare function createOdooContext(values: Record<string, string>, fetcher: typeof fetch, signal?: AbortSignal): Promise<OdooActionContext>;
16
+ export {};
@@ -0,0 +1,140 @@
1
+ import { compactObject, looseArray, optionalInteger, optionalRecord, optionalString, recordOrEmpty, requiredRawString, } from "../../core/cast.js";
2
+ import { assertPublicHttpUrl, isPrivateNetworkAccessAllowed } from "../../core/request.js";
3
+ import { ProviderRequestError, providerInputError, providerResponseError, providerUserAgent, readProviderJsonBody, requiredInputString, requiredResponseRecord, runProviderRequest, } from "../provider-runtime.js";
4
+ export const odooActionHandlers = {
5
+ async search({ model, domain, limit, offset, order, context }, connection) {
6
+ return {
7
+ ids: await executeOdoo(connection, model, "search", [domain], { limit: limit ?? 100, offset, order, context }),
8
+ };
9
+ },
10
+ async read({ model, ids, fields, context }, connection) {
11
+ return { records: await executeOdoo(connection, model, "read", [ids], { fields, context }) };
12
+ },
13
+ async search_read({ model, domain, fields, limit, offset, order, context }, connection) {
14
+ return {
15
+ records: await executeOdoo(connection, model, "search_read", [domain], {
16
+ fields,
17
+ limit: limit ?? 100,
18
+ offset,
19
+ order,
20
+ context,
21
+ }),
22
+ };
23
+ },
24
+ async search_count({ model, domain, context }, connection) {
25
+ return { count: await executeOdoo(connection, model, "search_count", [domain], { context }) };
26
+ },
27
+ async fields_get({ model, fields, attributes, context }, connection) {
28
+ return {
29
+ fields: await executeOdoo(connection, model, "fields_get", [], { allfields: fields, attributes, context }),
30
+ };
31
+ },
32
+ async create({ model, values, context }, connection) {
33
+ return { id: await executeOdoo(connection, model, "create", [values], { context }) };
34
+ },
35
+ async write({ model, ids, values, context }, connection) {
36
+ return { success: await executeOdoo(connection, model, "write", [ids, values], { context }) };
37
+ },
38
+ async unlink({ model, ids, context }, connection) {
39
+ return { success: await executeOdoo(connection, model, "unlink", [ids], { context }) };
40
+ },
41
+ async execute_kw({ model, method, args, kwargs }, connection) {
42
+ return {
43
+ result: await executeOdoo(connection, model, requiredInputString(method, "method"), looseArray(args), recordOrEmpty(kwargs)),
44
+ };
45
+ },
46
+ };
47
+ export async function createOdooContext(values, fetcher, signal) {
48
+ const allowPrivateNetwork = isPrivateNetworkAccessAllowed();
49
+ const url = assertPublicHttpUrl(requiredInputString(values.baseUrl, "baseUrl"), {
50
+ fieldName: "baseUrl",
51
+ createError: providerInputError,
52
+ allowPrivateNetwork,
53
+ });
54
+ if (url.protocol !== "https:" && !allowPrivateNetwork) {
55
+ throw providerInputError("baseUrl must use HTTPS unless the self-hosted runtime enables OOMOL_CONNECT_ALLOW_PRIVATE_NETWORK");
56
+ }
57
+ if (url.username || url.password || url.search || url.hash) {
58
+ throw providerInputError("baseUrl must not contain credentials, a query, or a fragment");
59
+ }
60
+ url.pathname = `${url.pathname.replace(/\/+$/, "")}/jsonrpc`;
61
+ const password = requiredRawString(values.password, "password", providerInputError);
62
+ if (!password) {
63
+ throw providerInputError("password is required");
64
+ }
65
+ const connection = {
66
+ endpoint: url.toString(),
67
+ database: requiredInputString(values.database, "database"),
68
+ username: requiredInputString(values.username, "username"),
69
+ password,
70
+ fetcher,
71
+ signal,
72
+ };
73
+ const result = await requestOdooRpc(connection, "common", "authenticate", [
74
+ connection.database,
75
+ connection.username,
76
+ password,
77
+ {},
78
+ ]);
79
+ if (result === false) {
80
+ throw new ProviderRequestError(401, "Odoo authentication failed. Check the database, username, and password or API key.");
81
+ }
82
+ const uid = optionalInteger(result);
83
+ if (uid === undefined || uid <= 0) {
84
+ throw providerResponseError("Odoo authentication returned an invalid user ID");
85
+ }
86
+ return { ...connection, uid };
87
+ }
88
+ function executeOdoo(connection, model, method, args, kwargs) {
89
+ return requestOdooRpc(connection, "object", "execute_kw", [
90
+ connection.database,
91
+ connection.uid,
92
+ connection.password,
93
+ requiredInputString(model, "model"),
94
+ method,
95
+ args,
96
+ compactObject(kwargs),
97
+ ]);
98
+ }
99
+ function requestOdooRpc(connection, service, method, args) {
100
+ return runProviderRequest({ signal: connection.signal, label: "Odoo" }, async (signal) => {
101
+ const response = await connection.fetcher(connection.endpoint, {
102
+ method: "POST",
103
+ headers: { "content-type": "application/json", accept: "application/json", "user-agent": providerUserAgent },
104
+ body: JSON.stringify({ jsonrpc: "2.0", method: "call", params: { service, method, args }, id: 1 }),
105
+ // RPC credentials are in the body and must not be forwarded to a redirect target.
106
+ redirect: "manual",
107
+ signal,
108
+ });
109
+ if (!response.ok) {
110
+ throw new ProviderRequestError(response.status, `Odoo request failed with HTTP ${response.status}`);
111
+ }
112
+ const payload = requiredResponseRecord(await readProviderJsonBody(response, {
113
+ emptyBody: null,
114
+ invalidJsonMessage: "Odoo returned an invalid JSON-RPC response",
115
+ }), "Odoo response");
116
+ if (payload.jsonrpc !== "2.0" || payload.id !== 1) {
117
+ throw providerResponseError("Odoo returned an invalid JSON-RPC envelope");
118
+ }
119
+ if (payload.error !== undefined) {
120
+ const error = requiredResponseRecord(payload.error, "Odoo RPC error");
121
+ const data = optionalRecord(error.data);
122
+ const name = optionalString(data?.name);
123
+ const message = optionalString(data?.message) ?? optionalString(error.message) ?? "Odoo RPC request failed";
124
+ const status = name === "odoo.exceptions.AccessDenied"
125
+ ? 401
126
+ : name === "odoo.exceptions.AccessError"
127
+ ? 403
128
+ : name === "odoo.exceptions.UserError" ||
129
+ name === "odoo.exceptions.ValidationError" ||
130
+ name === "odoo.exceptions.MissingError"
131
+ ? 400
132
+ : 502;
133
+ throw new ProviderRequestError(status, message);
134
+ }
135
+ if (!Object.hasOwn(payload, "result")) {
136
+ throw providerResponseError("Odoo response is missing the RPC result");
137
+ }
138
+ return payload.result;
139
+ });
140
+ }
@@ -1,4 +1,6 @@
1
1
  import type { CredentialValidators, ProviderExecutors, ProviderProxyExecutor } from "../../core/types.ts";
2
+ import type { IntegrationDefinition } from "../../triggers/common/integration.ts";
3
+ import type { PollDefinition } from "../../triggers/common/poll.ts";
2
4
  import type { ProviderActionHandlers } from "../provider-runtime.ts";
3
5
  import type { OAuthProviderContext } from "../provider-runtime.ts";
4
6
  type OneDriveRuntimeDeps = OAuthProviderContext;
@@ -23,4 +25,5 @@ export declare const proxy: ProviderProxyExecutor;
23
25
  export declare const credentialValidators: CredentialValidators;
24
26
  export declare function oneDriveJsonRequest<T>(pathOrUrl: string, input: OneDriveRequestInput): Promise<T>;
25
27
  export declare function assertOneDriveResponse(response: Response): Promise<void>;
28
+ export declare const triggers: readonly (IntegrationDefinition | PollDefinition)[];
26
29
  export {};
@@ -2,6 +2,7 @@ import { Buffer } from "node:buffer";
2
2
  import { compactObject, requiredRecord } from "../../core/cast.js";
3
3
  import { readBoundedResponseBytes } from "../../core/request.js";
4
4
  import { defineOAuthProviderExecutors, defineProviderProxy, ProviderRequestError, readTransitFileInput, } from "../provider-runtime.js";
5
+ import { oneDriveItemChanged } from "./trigger-on-item-changed.js";
5
6
  const graphBaseUrl = "https://graph.microsoft.com/v1.0";
6
7
  const graphOrigin = new URL(graphBaseUrl).origin;
7
8
  const oneDriveUploadChunkSizeBytes = 10 * 1024 * 1024;
@@ -1194,3 +1195,4 @@ function toArrayBuffer(bytes) {
1194
1195
  }
1195
1196
  return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength);
1196
1197
  }
1198
+ export const triggers = [oneDriveItemChanged];
@@ -0,0 +1,2 @@
1
+ import type { PollDefinition } from "../../triggers/common/poll.ts";
2
+ export declare const oneDriveItemChanged: PollDefinition;
@@ -0,0 +1,4 @@
1
+ import type { TriggerKeySnapshot } from "../../triggers/common/types.ts";
2
+ export declare const snapshot: TriggerKeySnapshot & {
3
+ readonly type: "poll";
4
+ };
@@ -0,0 +1,63 @@
1
+ import { jsonSchema as s } from "../../core/json-schema.js";
2
+ const eventSchema = s.object({
3
+ changeType: s.stringEnum(["created", "updated", "deleted"]),
4
+ createdDateTime: { type: ["string", "null"] },
5
+ driveId: { type: ["string", "null"] },
6
+ eTag: { type: ["string", "null"] },
7
+ itemId: s.string(),
8
+ itemType: s.stringEnum(["file", "folder"]),
9
+ lastModifiedDateTime: { type: ["string", "null"] },
10
+ mimeType: { type: ["string", "null"] },
11
+ name: s.string(),
12
+ parentFolderId: { type: ["string", "null"] },
13
+ size: { type: ["number", "null"] },
14
+ webUrl: s.string(),
15
+ }, {
16
+ additionalProperties: false,
17
+ required: [
18
+ "itemId",
19
+ "name",
20
+ "changeType",
21
+ "itemType",
22
+ "size",
23
+ "mimeType",
24
+ "webUrl",
25
+ "parentFolderId",
26
+ "driveId",
27
+ "createdDateTime",
28
+ "lastModifiedDateTime",
29
+ "eTag",
30
+ ],
31
+ });
32
+ export const snapshot = {
33
+ configInputs: [
34
+ {
35
+ handle: "events",
36
+ jsonSchema: s.array(s.stringEnum(["created", "updated", "deleted"]), { minItems: 1, uniqueItems: true }),
37
+ nullable: false,
38
+ value: ["created", "updated"],
39
+ },
40
+ { handle: "itemId", jsonSchema: s.string(), nullable: false, value: "" },
41
+ {
42
+ handle: "itemTypes",
43
+ jsonSchema: s.array(s.stringEnum(["file", "folder"]), { minItems: 1, uniqueItems: true }),
44
+ nullable: false,
45
+ value: ["file"],
46
+ },
47
+ {
48
+ handle: "maxItemsPerPoll",
49
+ jsonSchema: s.integer({ maximum: 200, minimum: 1 }),
50
+ nullable: false,
51
+ value: 50,
52
+ },
53
+ { handle: "parentFolderId", jsonSchema: s.string(), nullable: false, value: "" },
54
+ ],
55
+ definitionVersion: 2,
56
+ description: "Polls the OneDrive change feed and triggers when a file or folder is created, updated or deleted.",
57
+ displayName: "File or Folder Changed",
58
+ key: "one_drive.on_item_changed",
59
+ name: "on_item_changed",
60
+ outputs: [{ handle: "events", jsonSchema: s.array(eventSchema), nullable: false }],
61
+ provider: "one_drive",
62
+ type: "poll",
63
+ };