@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 @@
1
+ export declare const keepaDealAttributeNames: readonly ["material", "type", "manufacturer", "brand", "model", "color", "size", "unitType", "scent", "itemForm", "pattern", "style", "itemTypeKeyword", "targetAudienceKeyword", "edition", "format", "author", "binding", "languages", "brandStoreName", "brandStoreUrlName", "websiteDisplayGroup", "websiteDisplayGroupName", "salesRankDisplayGroup"];
@@ -0,0 +1,26 @@
1
+ export const keepaDealAttributeNames = [
2
+ "material",
3
+ "type",
4
+ "manufacturer",
5
+ "brand",
6
+ "model",
7
+ "color",
8
+ "size",
9
+ "unitType",
10
+ "scent",
11
+ "itemForm",
12
+ "pattern",
13
+ "style",
14
+ "itemTypeKeyword",
15
+ "targetAudienceKeyword",
16
+ "edition",
17
+ "format",
18
+ "author",
19
+ "binding",
20
+ "languages",
21
+ "brandStoreName",
22
+ "brandStoreUrlName",
23
+ "websiteDisplayGroup",
24
+ "websiteDisplayGroupName",
25
+ "salesRankDisplayGroup",
26
+ ];
@@ -1,6 +1,7 @@
1
1
  import { compactObject, optionalRawString, optionalRecord, rawStringOrNull } from "../../core/cast.js";
2
- import { createProviderTimeout, isAbortLikeError, ProviderRequestError, providerUserAgent, readProviderTextBody, requiredInputString, } from "../provider-runtime.js";
2
+ import { createProviderTimeout, isAbortLikeError, providerInputError, ProviderRequestError, providerUserAgent, readProviderTextBody, requiredInputString, } from "../provider-runtime.js";
3
3
  import { keepaDealPriceTypes as dealPriceTypes, keepaHistoryTypes as historyTypes } from "./actions.js";
4
+ import { keepaDealAttributeNames } from "./deal-attributes.js";
4
5
  export const keepaApiBaseUrl = "https://api.keepa.com";
5
6
  const keepaTimeStartMinutes = 21_564_000;
6
7
  const keepaDefaultTimeoutMs = 120_000;
@@ -211,6 +212,137 @@ export const keepaActionHandlers = {
211
212
  meta: normalizeMeta(payload),
212
213
  };
213
214
  },
215
+ async search_products(input, context) {
216
+ const marketplace = requireMarketplace(input.marketplace);
217
+ const payload = await requestKeepaAction(context, {
218
+ path: "/search",
219
+ query: {
220
+ domain: marketplaceDomainIdByCode[marketplace],
221
+ type: "product",
222
+ term: requiredInputString(input.term, "term"),
223
+ ...(input.asinsOnly === true ? { "asins-only": 1 } : {}),
224
+ ...buildStatsQuery(input),
225
+ ...(typeof input.updateHours === "number" ? { update: input.updateHours } : {}),
226
+ ...(input.includeHistory === false ? { history: 0 } : {}),
227
+ ...(input.includeRating === true ? { rating: 1 } : {}),
228
+ },
229
+ });
230
+ const products = readObjectArray(payload.products).map(normalizeProductSnapshot);
231
+ return {
232
+ marketplace,
233
+ asins: input.asinsOnly === true ? readStringArray(payload.asinList) : products.map((product) => product.asin),
234
+ products,
235
+ meta: normalizeMeta(payload),
236
+ };
237
+ },
238
+ async lookup_categories(input, context) {
239
+ const marketplace = requireMarketplace(input.marketplace);
240
+ const categoryIds = readIntegerArray(input.categoryIds);
241
+ if (categoryIds.includes(0) && categoryIds.length !== 1) {
242
+ throw providerInputError("root category lookup must use categoryIds [0] alone");
243
+ }
244
+ const payload = await requestKeepaAction(context, {
245
+ path: "/category",
246
+ query: {
247
+ domain: marketplaceDomainIdByCode[marketplace],
248
+ category: categoryIds.join(","),
249
+ parents: input.includeParents === true ? 1 : 0,
250
+ },
251
+ });
252
+ return {
253
+ marketplace,
254
+ categories: objectMapValues(payload.categories),
255
+ categoryParents: objectMapValues(payload.categoryParents),
256
+ meta: normalizeMeta(payload),
257
+ };
258
+ },
259
+ async find_sellers(input, context) {
260
+ const marketplace = requireMarketplace(input.marketplace);
261
+ const filters = optionalRecord(input.filters);
262
+ if (!filters)
263
+ throw providerInputError("filters must be an object");
264
+ if (!Object.keys(filters).some((key) => !["page", "perPage", "sort", "minMatch"].includes(key))) {
265
+ throw providerInputError("Seller Finder requires at least one business filter");
266
+ }
267
+ const page = typeof filters.page === "number" ? filters.page : 0;
268
+ const perPage = filters.perPage === 0 ? 100 : typeof filters.perPage === "number" ? filters.perPage : 50;
269
+ if (page > 0 && page * perPage >= 10_000) {
270
+ throw providerInputError("Seller Finder page starts beyond the 10000-result limit");
271
+ }
272
+ const payload = await requestKeepaAction(context, {
273
+ path: "/sellerquery",
274
+ query: { domain: marketplaceDomainIdByCode[marketplace] },
275
+ body: filters,
276
+ });
277
+ return {
278
+ marketplace,
279
+ sellerIds: readStringArray(payload.sellerIdList),
280
+ totalResults: asNullableInteger(payload.totalResults),
281
+ meta: normalizeMeta(payload),
282
+ };
283
+ },
284
+ async get_most_rated_sellers(input, context) {
285
+ const marketplace = requireMarketplace(input.marketplace);
286
+ const payload = await requestKeepaAction(context, {
287
+ path: "/topseller",
288
+ query: { domain: marketplaceDomainIdByCode[marketplace] },
289
+ });
290
+ const window = windowList(readStringArray(payload.sellerIdList), input);
291
+ return { marketplace, sellerIds: window.items, ...window.info, meta: normalizeMeta(payload) };
292
+ },
293
+ async get_seller_storefront(input, context) {
294
+ const marketplace = requireMarketplace(input.marketplace);
295
+ const sellerId = requiredInputString(input.sellerId, "sellerId");
296
+ const payload = await requestKeepaAction(context, {
297
+ path: "/seller",
298
+ query: { domain: marketplaceDomainIdByCode[marketplace], seller: sellerId, storefront: 1 },
299
+ });
300
+ const seller = optionalRecord(optionalRecord(payload.sellers)?.[sellerId]);
301
+ const asins = readStringArray(seller?.asinList);
302
+ const lastSeen = Array.isArray(seller?.asinListLastSeen) ? seller.asinListLastSeen : [];
303
+ const window = windowList(asins.map((asin, index) => ({ asin, lastSeen: asNullableInteger(lastSeen[index]) })), input);
304
+ const { asinList: _asinList, asinListLastSeen: _asinListLastSeen, ...sellerWithoutList } = seller ?? {};
305
+ return {
306
+ marketplace,
307
+ seller: seller ? normalizeSeller(sellerId, sellerWithoutList) : null,
308
+ items: window.items,
309
+ ...window.info,
310
+ meta: normalizeMeta(payload),
311
+ };
312
+ },
313
+ async get_lightning_deal(input, context) {
314
+ const marketplace = requireMarketplace(input.marketplace);
315
+ const payload = await requestKeepaAction(context, {
316
+ path: "/lightningdeal",
317
+ query: {
318
+ domain: marketplaceDomainIdByCode[marketplace],
319
+ asin: requiredInputString(input.asin, "asin"),
320
+ ...(typeof input.state === "string" ? { state: input.state } : {}),
321
+ },
322
+ });
323
+ return {
324
+ marketplace,
325
+ lightningDeals: readObjectArray(payload.lightningDeals),
326
+ meta: normalizeMeta(payload),
327
+ };
328
+ },
329
+ async list_lightning_deals(input, context) {
330
+ const marketplace = requireMarketplace(input.marketplace);
331
+ const payload = await requestKeepaAction(context, {
332
+ path: "/lightningdeal",
333
+ query: {
334
+ domain: marketplaceDomainIdByCode[marketplace],
335
+ ...(typeof input.state === "string" ? { state: input.state } : {}),
336
+ },
337
+ });
338
+ const window = windowList(readObjectArray(payload.lightningDeals), input);
339
+ return {
340
+ marketplace,
341
+ lightningDeals: window.items,
342
+ ...window.info,
343
+ meta: normalizeMeta(payload),
344
+ };
345
+ },
214
346
  };
215
347
  export async function validateKeepaCredential(apiKey, fetcher, signal) {
216
348
  const payload = await requestKeepa({
@@ -232,39 +364,80 @@ export async function validateKeepaCredential(apiKey, fetcher, signal) {
232
364
  },
233
365
  };
234
366
  }
367
+ function requestKeepaAction(context, input) {
368
+ return requestKeepa({ ...input, context, phase: "execute" });
369
+ }
235
370
  function buildProductQuery(input, marketplace, history) {
236
- const asins = readAsinArray(input.asins);
237
- assertProductRequestRules(input, asins);
371
+ const asins = input.asins === undefined ? [] : readAsinArray(input.asins);
372
+ const codes = readStringArray(input.codes).map((code) => code.trim());
373
+ if ((asins.length === 0) === (codes.length === 0)) {
374
+ throw providerInputError("provide either asins or codes");
375
+ }
376
+ const itemCount = asins.length || codes.length;
377
+ if (typeof input.offers === "number" && itemCount > 20) {
378
+ throw providerInputError("offers can only be requested for up to 20 ASINs or product codes");
379
+ }
380
+ if (input.codeLimit !== undefined && codes.length === 0) {
381
+ throw providerInputError("codeLimit requires codes");
382
+ }
383
+ if (input.onlyLiveOffers === true && typeof input.offers !== "number") {
384
+ throw providerInputError("onlyLiveOffers requires offers");
385
+ }
386
+ if (input.includeStock === true && typeof input.offers !== "number") {
387
+ throw providerInputError("includeStock requires offers");
388
+ }
238
389
  return {
239
- asin: asins.join(","),
390
+ ...(asins.length > 0 ? { asin: asins.join(",") } : { code: codes.join(",") }),
240
391
  domain: marketplaceDomainIdByCode[marketplace],
241
392
  history: history ? 1 : 0,
242
- ...(typeof input.statsDays === "number" ? { stats: input.statsDays } : {}),
393
+ ...buildStatsQuery(input),
394
+ ...(typeof input.codeLimit === "number" ? { "code-limit": input.codeLimit } : {}),
243
395
  ...(typeof input.updateHours === "number" ? { update: input.updateHours } : {}),
244
396
  ...(typeof input.offers === "number" ? { offers: input.offers } : {}),
245
397
  ...(input.onlyLiveOffers === true ? { "only-live-offers": 1 } : {}),
246
398
  ...(input.includeBuyBox === true ? { buybox: 1 } : {}),
247
399
  ...(input.includeRating === true ? { rating: 1 } : {}),
400
+ ...(input.includeVideos === true ? { videos: 1 } : {}),
401
+ ...(input.includeAPlus === true ? { aplus: 1 } : {}),
402
+ ...(input.includeStock === true ? { stock: 1 } : {}),
403
+ ...(input.includeHistoricalVariations === true ? { "historical-variations": 1 } : {}),
248
404
  };
249
405
  }
406
+ function buildStatsQuery(input) {
407
+ const range = optionalRecord(input.statsRange);
408
+ if (input.statsDays !== undefined && range) {
409
+ throw providerInputError("statsDays and statsRange are mutually exclusive");
410
+ }
411
+ if (range) {
412
+ const start = typeof range.start === "number" ? range.start : Date.parse(String(range.start));
413
+ const end = typeof range.end === "number" ? range.end : Date.parse(String(range.end));
414
+ if (typeof range.start !== typeof range.end || start >= end) {
415
+ throw providerInputError("statsRange requires matching types and start before end");
416
+ }
417
+ return { stats: `${range.start},${range.end}` };
418
+ }
419
+ return typeof input.statsDays === "number" ? { stats: input.statsDays } : {};
420
+ }
250
421
  function buildDealRequest(input, marketplace, priceType) {
251
422
  const metricDefinition = keepaMetricByType.get(priceType);
252
423
  if (!metricDefinition) {
253
- throw new ProviderRequestError(400, `unsupported deal price type: ${priceType}`);
424
+ throw providerInputError(`unsupported deal price type: ${priceType}`);
254
425
  }
255
426
  const sortName = typeof input.sortBy === "string" && input.sortBy in dealSortTypeByName
256
427
  ? input.sortBy
257
428
  : "newest";
258
429
  const sortType = dealSortTypeByName[sortName];
259
430
  if (sortType === 1 && input.invertSort === true) {
260
- throw new ProviderRequestError(400, "newest deal sorting cannot be inverted");
431
+ throw providerInputError("newest deal sorting cannot be inverted");
261
432
  }
262
433
  const ranges = {
263
434
  currentRange: readOptionalIntegerArray(input.currentRange),
264
435
  deltaRange: readOptionalIntegerArray(input.deltaRange),
265
436
  deltaPercentRange: readOptionalIntegerArray(input.deltaPercentRange),
437
+ deltaLastRange: readOptionalIntegerArray(input.deltaLastRange),
266
438
  salesRankRange: readOptionalIntegerArray(input.salesRankRange),
267
439
  };
440
+ const attributes = Object.fromEntries(keepaDealAttributeNames.map((name) => [name, readOptionalStringArray(input[name])]));
268
441
  return compactObject({
269
442
  page: typeof input.page === "number" ? input.page : 0,
270
443
  domainId: marketplaceDomainIdByCode[marketplace],
@@ -274,13 +447,17 @@ function buildDealRequest(input, marketplace, priceType) {
274
447
  isLowest: input.isLowestEver === true,
275
448
  isLowest90: input.isLowest90Days === true,
276
449
  isLowestOffer: input.isLowestOffer === true,
450
+ isHighest: input.isHighest === true,
277
451
  isBackInStock: input.isBackInStock === true,
278
452
  isOutOfStock: input.isOutOfStock === true,
279
453
  hasReviews: input.hasReviews === true,
280
454
  isPrimeExclusive: input.isPrimeExclusive === true,
281
455
  mustHaveAmazonOffer: input.mustHaveAmazonOffer === true,
282
456
  mustNotHaveAmazonOffer: input.mustNotHaveAmazonOffer === true,
283
- filterErotic: true,
457
+ filterErotic: typeof input.filterErotic === "boolean" ? input.filterErotic : undefined,
458
+ singleVariation: input.singleVariation === true,
459
+ isRisers: input.isRisers === true,
460
+ warehouseConditions: readOptionalIntegerArray(input.warehouseConditions),
284
461
  isRangeEnabled: Object.values(ranges).some((value) => value !== undefined),
285
462
  isFilterEnabled: [
286
463
  input.isLowestEver,
@@ -292,16 +469,38 @@ function buildDealRequest(input, marketplace, priceType) {
292
469
  input.isPrimeExclusive,
293
470
  input.mustHaveAmazonOffer,
294
471
  input.mustNotHaveAmazonOffer,
472
+ input.isHighest,
473
+ input.singleVariation,
474
+ input.isRisers,
475
+ input.warehouseConditions,
295
476
  input.minimumRating,
296
477
  input.titleSearch,
297
- ].some((value) => value !== undefined && value !== false),
478
+ ...Object.values(attributes),
479
+ ].some((value) => value !== undefined && value !== false) || input.filterErotic !== undefined,
298
480
  includeCategories: readOptionalIntegerArray(input.includeCategories),
299
481
  excludeCategories: readOptionalIntegerArray(input.excludeCategories),
300
- titleSearch: optionalRawString(input.titleSearch),
482
+ titleSearch: typeof input.titleSearch === "string" ? input.titleSearch : undefined,
301
483
  minRating: typeof input.minimumRating === "number" ? input.minimumRating : undefined,
302
484
  ...ranges,
485
+ ...attributes,
303
486
  });
304
487
  }
488
+ function windowList(items, input) {
489
+ const offset = typeof input.offset === "number" ? input.offset : 0;
490
+ const limit = input.limit === null ? null : typeof input.limit === "number" ? input.limit : 100;
491
+ const result = items.slice(offset, limit === null ? undefined : offset + limit);
492
+ const next = offset + result.length;
493
+ const hasMore = next < items.length;
494
+ return {
495
+ items: result,
496
+ info: {
497
+ totalAvailable: items.length,
498
+ returnedCount: result.length,
499
+ hasMore,
500
+ nextOffset: hasMore ? next : null,
501
+ },
502
+ };
503
+ }
305
504
  async function requestKeepa(input) {
306
505
  const url = new URL(input.path, keepaApiBaseUrl);
307
506
  url.searchParams.set("key", input.context.apiKey);
@@ -617,14 +816,6 @@ function validateCategorySearchTerm(term) {
617
816
  throw new ProviderRequestError(400, "each category search keyword must contain at least three characters");
618
817
  }
619
818
  }
620
- function assertProductRequestRules(input, asins) {
621
- if (typeof input.offers === "number" && asins.length > 20) {
622
- throw new ProviderRequestError(400, "offers can only be requested for up to 20 ASINs");
623
- }
624
- if (input.onlyLiveOffers === true && typeof input.offers !== "number") {
625
- throw new ProviderRequestError(400, "onlyLiveOffers requires offers");
626
- }
627
- }
628
819
  function requireInputObject(value, fieldName) {
629
820
  const object = optionalRecord(value);
630
821
  if (!object) {
@@ -683,6 +874,9 @@ function readIntegerArray(value) {
683
874
  function readOptionalIntegerArray(value) {
684
875
  return Array.isArray(value) ? readIntegerArray(value) : undefined;
685
876
  }
877
+ function readOptionalStringArray(value) {
878
+ return Array.isArray(value) ? readStringArray(value) : undefined;
879
+ }
686
880
  function objectMapValues(value) {
687
881
  const object = optionalRecord(value);
688
882
  if (!object) {
@@ -26,7 +26,7 @@ export const proxy = defineProviderProxy({
26
26
  allowedEndpoint: isBusinessEndpoint,
27
27
  allowPrivateNetwork: isPrivateNetworkAccessAllowed,
28
28
  sensitiveHeaders: ["kdservice-sessionid"],
29
- redirect: "error",
29
+ redirect: "manual",
30
30
  async customizeRequest({ context, fetcher, headers }) {
31
31
  const values = (await requireCustomCredential(context, service)).values;
32
32
  const kingdee = readCredential(values);
@@ -57,7 +57,7 @@ export async function login(credential, fetcher, parentSignal) {
57
57
  return runProviderRequest({ label: "Kingdee login", signal: parentSignal }, async (signal) => {
58
58
  const response = await fetcher(new URL("Kingdee.BOS.WebApi.ServicesStub.AuthService.LoginByAppSecret.common.kdsvc", credential.baseUrl), {
59
59
  method: "POST",
60
- redirect: "error",
60
+ redirect: "manual",
61
61
  signal,
62
62
  headers: { "content-type": "application/json", accept: "application/json" },
63
63
  body: JSON.stringify({
@@ -111,7 +111,7 @@ async function execute(action, input, context) {
111
111
  const response = await context.fetcher(new URL(`Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.${kingdeeMethods[action]}.common.kdsvc`, context.credential.baseUrl), {
112
112
  method: "POST",
113
113
  signal,
114
- redirect: "error",
114
+ redirect: "manual",
115
115
  headers: { "content-type": "application/json", "kdservice-sessionid": sessionId },
116
116
  body: JSON.stringify(body),
117
117
  });
@@ -150,7 +150,7 @@ function withKuaidi100Client(context, phase, run) {
150
150
  transport: "streamable_http",
151
151
  fetcher: context.fetcher,
152
152
  headers: { responseFormat: "json", "user-agent": providerUserAgent },
153
- redirect: "error",
153
+ redirect: "manual",
154
154
  signal: context.signal,
155
155
  mapError: (error) => mapKuaidi100McpError(error, phase),
156
156
  }, run);
@@ -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
  interface LinearActionContext {
4
6
  authorization: string;
@@ -10,4 +12,5 @@ export declare const executors: ProviderExecutors;
10
12
  export declare const proxy: ProviderProxyExecutor;
11
13
  export declare const credentialValidators: CredentialValidators;
12
14
  export declare function fetchLinearViewer(authorization: string, fetcher: typeof fetch): Promise<Record<string, unknown>>;
15
+ export declare const triggers: readonly (IntegrationDefinition | PollDefinition)[];
13
16
  export {};
@@ -1,5 +1,6 @@
1
1
  import { compactObject, optionalBoolean } from "../../core/cast.js";
2
- import { createProviderFetch, createProviderProxyUrl, defineProviderExecutors, normalizeProviderProxyHeaders, ProviderRequestError, providerUserAgent, readProviderProxyErrorMessage, readProviderProxyResponse, toProviderProxyError, } from "../provider-runtime.js";
2
+ import { createProviderFetch, createProviderProxyUrl, defineProviderExecutors, normalizeProviderProxyHeaders, ProviderRequestError, providerUserAgent, readProviderProxyErrorMessage, readProviderProxyResponse, toProviderProxyError, withRetryAfterSeconds, } from "../provider-runtime.js";
3
+ import { linearIssueChanged } from "./trigger-on-issue-changed.js";
3
4
  const linearApiBaseUrl = "https://api.linear.app";
4
5
  const linearGraphqlUrl = "https://api.linear.app/graphql";
5
6
  const linearFetch = createProviderFetch({ skipDnsValidation: true });
@@ -697,8 +698,8 @@ export const linearActionHandlers = {
697
698
  async list_linear_issues(input, context) {
698
699
  const assigneeId = await resolveAssigneeFilterId(context, getOptionalString(input.assignee_id));
699
700
  const payload = await linearGraphqlOperation(context, `
700
- query ListLinearIssues($after: String, $first: Int, $filter: IssueFilter) {
701
- issues(after: $after, first: $first, includeArchived: false, filter: $filter) {
701
+ query ListLinearIssues($after: String, $first: Int, $filter: IssueFilter, $includeArchived: Boolean, $orderBy: PaginationOrderBy) {
702
+ issues(after: $after, first: $first, includeArchived: $includeArchived, filter: $filter, orderBy: $orderBy) {
702
703
  nodes {
703
704
  ${issueFields}
704
705
  }
@@ -710,7 +711,9 @@ export const linearActionHandlers = {
710
711
  `, {
711
712
  after: getOptionalString(input.after),
712
713
  first: getOptionalNumber(input.first),
713
- filter: buildIssuesFilter(getOptionalString(input.project_id), assigneeId),
714
+ filter: buildIssuesFilter(getOptionalString(input.project_id), assigneeId, getOptionalString(input.updated_after)),
715
+ includeArchived: optionalBoolean(input.include_archived) ?? false,
716
+ orderBy: getOptionalString(input.order_by),
714
717
  });
715
718
  return {
716
719
  issues: (payload.issues?.nodes ?? []).map(mapIssueSummary),
@@ -1051,7 +1054,7 @@ export const proxy = async (input, context) => {
1051
1054
  const response = await linearFetch(url, init);
1052
1055
  if (!response.ok) {
1053
1056
  const text = await readProviderProxyErrorMessage(response, "");
1054
- throw new ProviderRequestError(response.status, text || `linear request failed with HTTP ${response.status}`);
1057
+ throw new ProviderRequestError(response.status, text || `linear request failed with HTTP ${response.status}`, withRetryAfterSeconds(response));
1055
1058
  }
1056
1059
  return { ok: true, response: await readProviderProxyResponse(response) };
1057
1060
  }
@@ -1117,7 +1120,7 @@ async function linearGraphqlRequest(authorization, fetcher, query, variables) {
1117
1120
  });
1118
1121
  const body = await readJson(response);
1119
1122
  if (!response.ok) {
1120
- throwLinearHttpError(response.status, body);
1123
+ throwLinearHttpError(response.status, body, withRetryAfterSeconds(response));
1121
1124
  }
1122
1125
  return body;
1123
1126
  }
@@ -1454,10 +1457,11 @@ async function resolveAssigneeFilterId(context, assigneeId) {
1454
1457
  const viewer = await fetchLinearViewer(context.authorization, context.fetcher);
1455
1458
  return String(viewer.id);
1456
1459
  }
1457
- function buildIssuesFilter(projectId, assigneeId) {
1460
+ function buildIssuesFilter(projectId, assigneeId, updatedAfter) {
1458
1461
  const filter = compactObject({
1459
1462
  project: projectId ? { id: { eq: projectId } } : undefined,
1460
1463
  assignee: assigneeId ? { id: { eq: assigneeId } } : undefined,
1464
+ updatedAt: updatedAfter ? { gte: updatedAfter } : undefined,
1461
1465
  });
1462
1466
  return Object.keys(filter).length > 0 ? filter : undefined;
1463
1467
  }
@@ -1800,7 +1804,7 @@ async function readJson(response) {
1800
1804
  };
1801
1805
  }
1802
1806
  }
1803
- function throwLinearHttpError(status, body) {
1807
+ function throwLinearHttpError(status, body, details) {
1804
1808
  const message = extractErrorMessage(body);
1805
1809
  if (status === 400) {
1806
1810
  throw new ProviderRequestError(400, message);
@@ -1809,7 +1813,7 @@ function throwLinearHttpError(status, body) {
1809
1813
  throw new ProviderRequestError(401, message);
1810
1814
  }
1811
1815
  if (status === 429) {
1812
- throw new ProviderRequestError(429, message);
1816
+ throw new ProviderRequestError(429, message, details);
1813
1817
  }
1814
1818
  throw new ProviderRequestError(502, message, status >= 500 ? 500 : status);
1815
1819
  }
@@ -1901,3 +1905,4 @@ function asOptionalObject(value) {
1901
1905
  }
1902
1906
  return value;
1903
1907
  }
1908
+ export const triggers = [linearIssueChanged];
@@ -0,0 +1,2 @@
1
+ import type { PollDefinition } from "../../triggers/common/poll.ts";
2
+ export declare const linearIssueChanged: PollDefinition;
@@ -0,0 +1,5 @@
1
+ import type { TriggerKeySnapshot } from "../../triggers/common/types.ts";
2
+ export declare const uuidPattern: string;
3
+ export declare const snapshot: TriggerKeySnapshot & {
4
+ readonly type: "poll";
5
+ };
@@ -0,0 +1,43 @@
1
+ import { jsonSchema as s } from "../../core/json-schema.js";
2
+ export const uuidPattern = "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$";
3
+ const issueSchema = s.object({
4
+ id: s.string(),
5
+ identifier: s.string(),
6
+ title: s.string(),
7
+ url: s.string(),
8
+ teamId: s.string(),
9
+ createdAt: s.string(),
10
+ updatedAt: s.string(),
11
+ state: s.object({ id: s.string(), name: s.string(), type: s.string() }, { additionalProperties: false, required: ["id", "name", "type"] }),
12
+ }, {
13
+ additionalProperties: false,
14
+ required: ["id", "identifier", "title", "url", "teamId", "createdAt", "updatedAt", "state"],
15
+ });
16
+ export const snapshot = {
17
+ configInputs: [
18
+ {
19
+ handle: "teamId",
20
+ jsonSchema: { ...s.string({ pattern: uuidPattern }), title: "Team ID" },
21
+ nullable: false,
22
+ description: "Linear Team UUID. Use Copy model UUID in Linear to find it.",
23
+ },
24
+ {
25
+ handle: "stateIds",
26
+ jsonSchema: {
27
+ ...s.array(s.string({ pattern: uuidPattern }), { uniqueItems: true, maxItems: 50 }),
28
+ title: "Issue statuses",
29
+ },
30
+ nullable: false,
31
+ value: [],
32
+ description: "Choose statuses from the selected Team. Empty means all statuses. Matches the current status, not every transition into it.",
33
+ },
34
+ ],
35
+ definitionVersion: 2,
36
+ description: "Watches new and updated issues in a Linear team with periodic checks. Starts from now without running existing issues. Reports observed current states, not deletions or every intermediate status change.",
37
+ displayName: "Issue Created or Updated",
38
+ key: "linear.on_issue_changed",
39
+ name: "on_issue_changed",
40
+ outputs: [{ handle: "events", jsonSchema: s.array(issueSchema), nullable: false }],
41
+ provider: "linear",
42
+ type: "poll",
43
+ };