@hasna/connectors 1.4.1 → 1.4.3

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 (499) hide show
  1. package/bin/index.js +1271 -317
  2. package/bin/mcp.js +524 -211
  3. package/bin/serve.js +1208 -256
  4. package/connectors/adobe/package.json +1 -1
  5. package/connectors/aitableai/package.json +1 -1
  6. package/connectors/alchemy/package.json +1 -1
  7. package/connectors/alerty/package.json +1 -1
  8. package/connectors/alienvault/package.json +1 -1
  9. package/connectors/alphamoon/package.json +1 -1
  10. package/connectors/alttextai/package.json +1 -1
  11. package/connectors/amadeus/package.json +1 -1
  12. package/connectors/amadeus/src/api/client.ts +6 -6
  13. package/connectors/amadeus/src/cli/index.ts +6 -6
  14. package/connectors/amadeus/src/utils/output.ts +5 -5
  15. package/connectors/amazon/package.json +1 -1
  16. package/connectors/amilia/package.json +1 -1
  17. package/connectors/amqpsender/package.json +1 -1
  18. package/connectors/announcekit/package.json +1 -1
  19. package/connectors/anthropic/.env.example +1 -1
  20. package/connectors/anyscale/package.json +1 -1
  21. package/connectors/apiary/package.json +1 -1
  22. package/connectors/apiflash/package.json +1 -1
  23. package/connectors/apitemplateio/package.json +1 -1
  24. package/connectors/apptivegrid/package.json +1 -1
  25. package/connectors/assemblyai/package.json +1 -1
  26. package/connectors/autom/package.json +1 -1
  27. package/connectors/automizy/package.json +1 -1
  28. package/connectors/autopilot/package.json +1 -1
  29. package/connectors/awscognito/package.json +1 -1
  30. package/connectors/bamboohr/package.json +1 -1
  31. package/connectors/bannerbear/package.json +1 -1
  32. package/connectors/baseten/package.json +1 -1
  33. package/connectors/box/package.json +1 -1
  34. package/connectors/brevo/package.json +1 -1
  35. package/connectors/calendly/package.json +1 -1
  36. package/connectors/cerebras/package.json +1 -1
  37. package/connectors/chargebee/package.json +1 -1
  38. package/connectors/clearbit/package.json +1 -1
  39. package/connectors/clickbank/README.md +2 -2
  40. package/connectors/cloudflare-workers/package.json +1 -1
  41. package/connectors/coda/package.json +1 -1
  42. package/connectors/coingecko/package.json +1 -1
  43. package/connectors/convertkit/package.json +1 -1
  44. package/connectors/customerio/package.json +1 -1
  45. package/connectors/databricks/package.json +1 -1
  46. package/connectors/datadog/package.json +1 -1
  47. package/connectors/datasoap/README.md +2 -2
  48. package/connectors/datasoap/package.json +1 -1
  49. package/connectors/datumbox/README.md +2 -2
  50. package/connectors/datumbox/package.json +1 -1
  51. package/connectors/dayschedule/README.md +2 -2
  52. package/connectors/dayschedule/package.json +1 -1
  53. package/connectors/deepgram/package.json +1 -1
  54. package/connectors/deepinfra/README.md +2 -2
  55. package/connectors/deepinfra/package.json +1 -1
  56. package/connectors/deepl/README.md +2 -2
  57. package/connectors/deepl/package.json +1 -1
  58. package/connectors/deepseek/package.json +1 -1
  59. package/connectors/demio/README.md +2 -2
  60. package/connectors/demio/package.json +1 -1
  61. package/connectors/descript/README.md +2 -2
  62. package/connectors/descript/package.json +1 -1
  63. package/connectors/detrack/README.md +2 -2
  64. package/connectors/detrack/package.json +1 -1
  65. package/connectors/devcycle/README.md +2 -2
  66. package/connectors/devcycle/package.json +1 -1
  67. package/connectors/dhl/README.md +2 -2
  68. package/connectors/dhl/package.json +1 -1
  69. package/connectors/docusign/package.json +1 -1
  70. package/connectors/dropbox/package.json +1 -1
  71. package/connectors/fal/package.json +1 -1
  72. package/connectors/fathom/package.json +1 -1
  73. package/connectors/fireworks/package.json +1 -1
  74. package/connectors/gitlab/package.json +1 -1
  75. package/connectors/googlechat/README.md +1 -2
  76. package/connectors/googledrive/src/api/client.ts +5 -5
  77. package/connectors/googledrive/src/api/files.ts +11 -11
  78. package/connectors/googledrive/src/api/folders.ts +2 -2
  79. package/connectors/googledrive/src/cli/index.ts +4 -4
  80. package/connectors/googledrive/src/utils/output.ts +3 -3
  81. package/connectors/googleforms/README.md +1 -2
  82. package/connectors/googleperspective/README.md +1 -2
  83. package/connectors/grafana/package.json +1 -1
  84. package/connectors/growbots/README.md +2 -2
  85. package/connectors/growbots/package.json +1 -1
  86. package/connectors/gumroad/package.json +1 -1
  87. package/connectors/gupshup/README.md +2 -2
  88. package/connectors/gupshup/package.json +1 -1
  89. package/connectors/guru/README.md +2 -2
  90. package/connectors/guru/package.json +1 -1
  91. package/connectors/hackernews/README.md +2 -2
  92. package/connectors/hackernews/package.json +1 -1
  93. package/connectors/halopsa/README.md +2 -2
  94. package/connectors/halopsa/package.json +1 -1
  95. package/connectors/handwrytten/README.md +2 -2
  96. package/connectors/handwrytten/package.json +1 -1
  97. package/connectors/hansei/README.md +2 -2
  98. package/connectors/hansei/package.json +1 -1
  99. package/connectors/harrypotterapi/README.md +2 -2
  100. package/connectors/harrypotterapi/package.json +1 -1
  101. package/connectors/harvest/README.md +2 -2
  102. package/connectors/harvest/package.json +1 -1
  103. package/connectors/headlesstesting/README.md +2 -2
  104. package/connectors/headlesstesting/package.json +1 -1
  105. package/connectors/homeassistant/package.json +1 -1
  106. package/connectors/klaviyo/package.json +1 -1
  107. package/connectors/lemonsqueezy/package.json +1 -1
  108. package/connectors/lighthouse/src/api/index.ts +1 -1
  109. package/connectors/linkedin/package.json +1 -1
  110. package/connectors/linkish/README.md +2 -2
  111. package/connectors/linkish/package.json +1 -1
  112. package/connectors/liveagent/README.md +2 -2
  113. package/connectors/liveagent/package.json +1 -1
  114. package/connectors/localazy/README.md +2 -2
  115. package/connectors/localazy/package.json +1 -1
  116. package/connectors/loginradius/README.md +2 -2
  117. package/connectors/loginradius/package.json +1 -1
  118. package/connectors/lokalise/README.md +2 -2
  119. package/connectors/lokalise/package.json +1 -1
  120. package/connectors/lonescale/README.md +2 -2
  121. package/connectors/lonescale/package.json +1 -1
  122. package/connectors/lucidchart/README.md +2 -2
  123. package/connectors/lucidchart/package.json +1 -1
  124. package/connectors/luma/package.json +1 -1
  125. package/connectors/magento2/README.md +2 -2
  126. package/connectors/magento2/package.json +1 -1
  127. package/connectors/mailcheck/README.md +2 -2
  128. package/connectors/mailcheck/package.json +1 -1
  129. package/connectors/mailchimp/package.json +1 -1
  130. package/connectors/mailerlite/README.md +2 -2
  131. package/connectors/mailerlite/package.json +1 -1
  132. package/connectors/mailersend/README.md +2 -2
  133. package/connectors/mailersend/package.json +1 -1
  134. package/connectors/mailify/README.md +2 -2
  135. package/connectors/mailify/package.json +1 -1
  136. package/connectors/mailjet/README.md +2 -2
  137. package/connectors/mailjet/package.json +1 -1
  138. package/connectors/mailmodo/README.md +2 -2
  139. package/connectors/mailmodo/package.json +1 -1
  140. package/connectors/malcore/README.md +2 -2
  141. package/connectors/malcore/package.json +1 -1
  142. package/connectors/mandrill/README.md +2 -2
  143. package/connectors/mandrill/package.json +1 -1
  144. package/connectors/marcomrobot/README.md +2 -2
  145. package/connectors/marcomrobot/package.json +1 -1
  146. package/connectors/marketingmasterio/README.md +2 -2
  147. package/connectors/marketingmasterio/package.json +1 -1
  148. package/connectors/marketplacer/README.md +2 -2
  149. package/connectors/marketplacer/package.json +1 -1
  150. package/connectors/marketstack/README.md +2 -2
  151. package/connectors/marketstack/package.json +1 -1
  152. package/connectors/matrix/README.md +1 -1
  153. package/connectors/matrix/package.json +1 -1
  154. package/connectors/mattermost/README.md +1 -1
  155. package/connectors/mattermost/package.json +1 -1
  156. package/connectors/mautic/README.md +1 -1
  157. package/connectors/mautic/package.json +1 -1
  158. package/connectors/mav/README.md +1 -1
  159. package/connectors/mav/package.json +1 -1
  160. package/connectors/maverick/README.md +1 -1
  161. package/connectors/maverick/package.json +1 -1
  162. package/connectors/mem/README.md +1 -1
  163. package/connectors/mem/package.json +1 -1
  164. package/connectors/messagebird/package.json +1 -1
  165. package/connectors/metabase/README.md +1 -1
  166. package/connectors/metabase/package.json +1 -1
  167. package/connectors/miro/package.json +1 -1
  168. package/connectors/mocean/package.json +1 -1
  169. package/connectors/modal/package.json +1 -1
  170. package/connectors/monday/package.json +1 -1
  171. package/connectors/monicacrm/package.json +1 -1
  172. package/connectors/moonclerk/package.json +1 -1
  173. package/connectors/moonmail/package.json +1 -1
  174. package/connectors/morph/package.json +1 -1
  175. package/connectors/mqtt/package.json +1 -1
  176. package/connectors/msg91/package.json +1 -1
  177. package/connectors/mubert/package.json +1 -1
  178. package/connectors/murf/package.json +1 -1
  179. package/connectors/mux/package.json +1 -1
  180. package/connectors/netlify/package.json +1 -1
  181. package/connectors/okta/package.json +1 -1
  182. package/connectors/paddle/package.json +1 -1
  183. package/connectors/perplexity/package.json +1 -1
  184. package/connectors/pinterest/package.json +1 -1
  185. package/connectors/pipedrive/package.json +1 -1
  186. package/connectors/plaid/package.json +1 -1
  187. package/connectors/quickchart/README.md +2 -2
  188. package/connectors/quintadb/README.md +2 -2
  189. package/connectors/rabbitmq/README.md +2 -2
  190. package/connectors/radar/README.md +2 -2
  191. package/connectors/raindrop/README.md +2 -2
  192. package/connectors/rapid7insightvm/README.md +2 -2
  193. package/connectors/raventools/README.md +2 -2
  194. package/connectors/rawgvideogamesdatabase/README.md +2 -2
  195. package/connectors/rdstationcrm/README.md +2 -2
  196. package/connectors/readai/README.md +2 -2
  197. package/connectors/roboflow/package.json +1 -1
  198. package/connectors/runway/package.json +1 -1
  199. package/connectors/sendgrid/package.json +1 -1
  200. package/connectors/shuffler/package.json +1 -1
  201. package/connectors/sierrainteractive/package.json +1 -1
  202. package/connectors/sifter/package.json +1 -1
  203. package/connectors/signaturit/package.json +1 -1
  204. package/connectors/signl4/package.json +1 -1
  205. package/connectors/simpleem/package.json +1 -1
  206. package/connectors/simplehash/package.json +1 -1
  207. package/connectors/simplekpi/package.json +1 -1
  208. package/connectors/simplelocalize/package.json +1 -1
  209. package/connectors/simplero/package.json +1 -1
  210. package/connectors/smartrecruiters/package.json +1 -1
  211. package/connectors/smtp2go/package.json +1 -1
  212. package/connectors/snowflake/package.json +1 -1
  213. package/connectors/sparkpost/package.json +1 -1
  214. package/connectors/split-in-batches/CLAUDE.md +1 -1
  215. package/connectors/split-in-batches/README.md +1 -1
  216. package/connectors/split-in-batches/src/api/client.test.ts +16 -17
  217. package/connectors/split-in-batches/src/api/client.ts +4 -3
  218. package/connectors/split-in-batches/src/cli/index.ts +1 -1
  219. package/connectors/split-io/package.json +1 -1
  220. package/connectors/split-io/src/api/client.test.ts +20 -0
  221. package/connectors/split-io/src/cli/index.ts +9 -9
  222. package/connectors/spreadsheet-file/.env.example +1 -1
  223. package/connectors/spreadsheet-file/CLAUDE.md +2 -2
  224. package/connectors/spreadsheet-file/README.md +3 -3
  225. package/connectors/spreadsheet-file/src/api/client.test.ts +8 -9
  226. package/connectors/spreadsheet-file/src/api/client.ts +4 -3
  227. package/connectors/spreadsheet-file/src/cli/index.ts +1 -1
  228. package/connectors/sprinklr/package.json +1 -1
  229. package/connectors/sprout-social/package.json +1 -1
  230. package/connectors/square/package.json +1 -1
  231. package/connectors/sse-trigger/.env.example +1 -1
  232. package/connectors/sse-trigger/CLAUDE.md +2 -2
  233. package/connectors/sse-trigger/README.md +1 -1
  234. package/connectors/sse-trigger/package.json +1 -1
  235. package/connectors/sse-trigger/src/api/client.test.ts +12 -8
  236. package/connectors/sse-trigger/src/api/client.ts +4 -3
  237. package/connectors/sse-trigger/src/api/index.ts +1 -1
  238. package/connectors/sse-trigger/src/cli/index.ts +1 -1
  239. package/connectors/sse-trigger/src/index.ts +1 -1
  240. package/connectors/stability-api-platform/AGENTS.md +2 -2
  241. package/connectors/stability-api-platform/CLAUDE.md +1 -1
  242. package/connectors/stability-api-platform/README.md +2 -2
  243. package/connectors/stability-api-platform/src/api/client.test.ts +17 -12
  244. package/connectors/stability-api-platform/src/api/client.ts +4 -3
  245. package/connectors/stability-api-platform/src/api/index.ts +0 -1
  246. package/connectors/stability-api-platform/src/cli/index.ts +1 -1
  247. package/connectors/stability-api-platform/src/index.ts +0 -1
  248. package/connectors/standout/package.json +1 -1
  249. package/connectors/statuspage/package.json +1 -1
  250. package/connectors/stop-and-error/.env.example +1 -1
  251. package/connectors/stop-and-error/CLAUDE.md +1 -1
  252. package/connectors/stop-and-error/README.md +1 -1
  253. package/connectors/stop-and-error/src/api/client.test.ts +12 -8
  254. package/connectors/stop-and-error/src/api/client.ts +4 -3
  255. package/connectors/stop-and-error/src/cli/index.ts +2 -2
  256. package/connectors/stoplight/package.json +1 -1
  257. package/connectors/stoplight-api-platform/package.json +1 -1
  258. package/connectors/strand-ai/CLAUDE.md +1 -1
  259. package/connectors/stripe-financial-connections/.env.example +1 -1
  260. package/connectors/stripe-financial-connections/CLAUDE.md +2 -2
  261. package/connectors/stripe-financial-connections/package.json +1 -1
  262. package/connectors/stripe-financial-connections/src/api/client.test.ts +34 -0
  263. package/connectors/stripe-financial-connections/src/api/client.ts +4 -3
  264. package/connectors/stripe-financial-connections/src/cli/index.ts +1 -1
  265. package/connectors/stripe-terminal/package.json +1 -1
  266. package/connectors/stytch/package.json +1 -1
  267. package/connectors/sucuri-api-platform/.env.example +1 -1
  268. package/connectors/sucuri-api-platform/CLAUDE.md +1 -1
  269. package/connectors/sucuri-api-platform/README.md +2 -2
  270. package/connectors/sucuri-api-platform/src/api/client.test.ts +9 -7
  271. package/connectors/sucuri-api-platform/src/api/client.ts +4 -3
  272. package/connectors/sucuri-api-platform/src/api/index.ts +1 -1
  273. package/connectors/sucuri-api-platform/src/cli/index.ts +1 -1
  274. package/connectors/sucuri-api-platform/src/index.ts +1 -1
  275. package/connectors/sumo-logic/package.json +1 -1
  276. package/connectors/supabase/package.json +1 -1
  277. package/connectors/supabase-api-platform/package.json +1 -1
  278. package/connectors/sysdig/package.json +1 -1
  279. package/connectors/tableau/package.json +1 -1
  280. package/connectors/takecareos/README.md +2 -2
  281. package/connectors/takecareos/package.json +1 -1
  282. package/connectors/telegram/src/api/bot.ts +20 -0
  283. package/connectors/telegram/src/api/client.ts +32 -0
  284. package/connectors/telegram/src/api/files.test.ts +103 -0
  285. package/connectors/telegram/src/api/index.ts +1 -0
  286. package/connectors/telegram/src/api/messages.test.ts +8 -2
  287. package/connectors/telegram/src/cli/files.test.ts +40 -0
  288. package/connectors/telegram/src/cli/files.ts +38 -0
  289. package/connectors/telegram/src/cli/index.ts +27 -30
  290. package/connectors/telegram/src/cli/updates.test.ts +176 -0
  291. package/connectors/telegram/src/cli/updates.ts +95 -0
  292. package/connectors/telegram/src/index.ts +1 -0
  293. package/connectors/telegram/src/types/index.ts +13 -0
  294. package/connectors/terraform-cloud/package.json +1 -1
  295. package/connectors/tettra-api-platform/CLAUDE.md +1 -1
  296. package/connectors/tettra-api-platform/README.md +2 -2
  297. package/connectors/tettra-api-platform/src/api/client.test.ts +7 -8
  298. package/connectors/tettra-api-platform/src/api/client.ts +4 -3
  299. package/connectors/tettra-api-platform/src/api/index.ts +1 -1
  300. package/connectors/tettra-api-platform/src/cli/index.ts +1 -1
  301. package/connectors/tettra-api-platform/src/index.ts +1 -1
  302. package/connectors/textit/package.json +1 -1
  303. package/connectors/thousandeyes/package.json +1 -1
  304. package/connectors/ticket-tailor/package.json +1 -1
  305. package/connectors/ticketsource/package.json +1 -1
  306. package/connectors/tiktokads/README.md +1 -1
  307. package/connectors/time-saved/package.json +1 -1
  308. package/connectors/tipalti/package.json +1 -1
  309. package/connectors/together-api-platform/.env.example +1 -1
  310. package/connectors/together-api-platform/CLAUDE.md +1 -1
  311. package/connectors/together-api-platform/README.md +1 -1
  312. package/connectors/together-api-platform/src/api/client.test.ts +11 -7
  313. package/connectors/together-api-platform/src/api/client.ts +4 -4
  314. package/connectors/together-api-platform/src/api/index.ts +1 -1
  315. package/connectors/together-api-platform/src/cli/index.ts +1 -1
  316. package/connectors/together-api-platform/src/index.ts +1 -1
  317. package/connectors/tomtom/AGENTS.md +1 -1
  318. package/connectors/totp/package.json +1 -1
  319. package/connectors/traverse/package.json +1 -1
  320. package/connectors/travo-ai/package.json +1 -1
  321. package/connectors/travo-real-estate/CLAUDE.md +1 -1
  322. package/connectors/travo-real-estate/README.md +1 -1
  323. package/connectors/travo-real-estate/src/api/client.test.ts +20 -16
  324. package/connectors/travo-real-estate/src/api/client.ts +4 -3
  325. package/connectors/travo-real-estate/src/utils/config.ts +2 -4
  326. package/connectors/tray-api-platform/CLAUDE.md +1 -1
  327. package/connectors/tray-api-platform/src/api/client.test.ts +17 -13
  328. package/connectors/tray-api-platform/src/api/client.ts +4 -3
  329. package/connectors/tray-api-platform/src/api/index.ts +1 -1
  330. package/connectors/tray-api-platform/src/cli/index.ts +1 -1
  331. package/connectors/tray-api-platform/src/index.ts +0 -1
  332. package/connectors/trigger-dev/package.json +1 -1
  333. package/connectors/trigger-dev-api-platform/package.json +1 -1
  334. package/connectors/turbot-pipes/package.json +1 -1
  335. package/connectors/turso/package.json +1 -1
  336. package/connectors/turso-api-platform/CLAUDE.md +1 -1
  337. package/connectors/turso-api-platform/README.md +2 -2
  338. package/connectors/turso-api-platform/package.json +1 -1
  339. package/connectors/turso-api-platform/src/api/client.test.ts +17 -13
  340. package/connectors/turso-api-platform/src/api/client.ts +4 -3
  341. package/connectors/turso-api-platform/src/cli/index.ts +2 -2
  342. package/connectors/twilio-api-platform/CLAUDE.md +1 -1
  343. package/connectors/twilio-api-platform/src/api/client.test.ts +11 -11
  344. package/connectors/twilio-api-platform/src/api/client.ts +4 -3
  345. package/connectors/twilio-api-platform/src/api/index.ts +1 -1
  346. package/connectors/twilio-api-platform/src/cli/index.ts +1 -1
  347. package/connectors/twilio-api-platform/src/index.ts +1 -1
  348. package/connectors/tyk-api-platform/.env.example +1 -1
  349. package/connectors/tyk-api-platform/CLAUDE.md +2 -2
  350. package/connectors/tyk-api-platform/README.md +1 -1
  351. package/connectors/tyk-api-platform/package.json +1 -1
  352. package/connectors/tyk-api-platform/src/api/client.test.ts +14 -15
  353. package/connectors/tyk-api-platform/src/api/client.ts +4 -3
  354. package/connectors/tyk-api-platform/src/api/index.ts +1 -1
  355. package/connectors/tyk-api-platform/src/cli/index.ts +1 -1
  356. package/connectors/tyk-api-platform/src/index.ts +1 -1
  357. package/connectors/umami/package.json +1 -1
  358. package/connectors/unifold/package.json +1 -1
  359. package/connectors/unione/package.json +1 -1
  360. package/connectors/uniprot/README.md +1 -1
  361. package/connectors/uniswap-api/package.json +1 -1
  362. package/connectors/ups/package.json +1 -1
  363. package/connectors/usereframe/package.json +1 -1
  364. package/connectors/vanta/package.json +1 -1
  365. package/connectors/vector-legal/.env.example +1 -1
  366. package/connectors/vector-legal/AGENTS.md +1 -1
  367. package/connectors/vector-legal/CLAUDE.md +1 -1
  368. package/connectors/vector-legal/README.md +1 -1
  369. package/connectors/vector-legal/src/api/client.test.ts +9 -5
  370. package/connectors/vector-legal/src/api/client.ts +4 -3
  371. package/connectors/vector-legal/src/api/index.ts +1 -1
  372. package/connectors/vector-legal/src/cli/index.ts +2 -2
  373. package/connectors/vector-legal/src/index.ts +0 -1
  374. package/connectors/vector-legal-api/CLAUDE.md +1 -1
  375. package/connectors/vector-legal-api/README.md +2 -2
  376. package/connectors/vector-legal-api/src/api/client.test.ts +12 -7
  377. package/connectors/vector-legal-api/src/api/client.ts +4 -3
  378. package/connectors/vector-legal-api/src/api/index.ts +1 -1
  379. package/connectors/vector-legal-api/src/cli/index.ts +1 -1
  380. package/connectors/vector-legal-api/src/index.ts +1 -2
  381. package/connectors/vela/package.json +1 -1
  382. package/connectors/velum-data-quality/.env.example +1 -1
  383. package/connectors/velum-data-quality/CLAUDE.md +1 -1
  384. package/connectors/velum-data-quality/src/api/client.test.ts +15 -16
  385. package/connectors/velum-data-quality/src/api/client.ts +4 -3
  386. package/connectors/velum-data-quality/src/api/index.ts +1 -1
  387. package/connectors/velum-data-quality/src/cli/index.ts +1 -1
  388. package/connectors/velum-data-quality/src/index.ts +0 -1
  389. package/connectors/velum-labs/package.json +1 -1
  390. package/connectors/vercel/package.json +1 -1
  391. package/connectors/vercel-api-platform/.env.example +1 -1
  392. package/connectors/vercel-api-platform/CLAUDE.md +2 -2
  393. package/connectors/vercel-api-platform/README.md +2 -2
  394. package/connectors/vercel-api-platform/src/api/client.test.ts +27 -6
  395. package/connectors/vercel-api-platform/src/api/client.ts +4 -3
  396. package/connectors/vercel-api-platform/src/api/index.ts +1 -1
  397. package/connectors/vercel-api-platform/src/cli/index.ts +2 -2
  398. package/connectors/vercel-api-platform/src/index.ts +0 -1
  399. package/connectors/vercel-blob/package.json +1 -1
  400. package/connectors/vercel-blob-platform/package.json +1 -1
  401. package/connectors/vercel-edge-config/package.json +1 -1
  402. package/connectors/vercel-edge-config-platform/package.json +1 -1
  403. package/connectors/veriphone/README.md +2 -2
  404. package/connectors/vertex-ai/package.json +1 -1
  405. package/connectors/vidyard/package.json +1 -1
  406. package/connectors/vonage/package.json +1 -1
  407. package/connectors/voygr/package.json +1 -1
  408. package/connectors/wait/package.json +1 -1
  409. package/connectors/walmart-marketplace/package.json +1 -1
  410. package/connectors/wato/package.json +1 -1
  411. package/connectors/wave-accounting/CLAUDE.md +1 -1
  412. package/connectors/wave-accounting/package.json +1 -1
  413. package/connectors/wave-accounting/src/utils/auth.ts +1 -1
  414. package/connectors/wayco/package.json +1 -1
  415. package/connectors/weaviate-api-platform/CLAUDE.md +1 -1
  416. package/connectors/weaviate-api-platform/src/api/client.test.ts +32 -7
  417. package/connectors/weaviate-api-platform/src/api/client.ts +4 -3
  418. package/connectors/weaviate-api-platform/src/api/index.ts +1 -1
  419. package/connectors/weaviate-api-platform/src/cli/index.ts +1 -1
  420. package/connectors/weaviate-api-platform/src/index.ts +1 -1
  421. package/connectors/webpagetest/package.json +1 -1
  422. package/connectors/weezevent/package.json +1 -1
  423. package/connectors/wikipedia/src/api/client.ts +1 -1
  424. package/connectors/wildcard/package.json +1 -1
  425. package/connectors/windmill/package.json +1 -1
  426. package/connectors/wise/package.json +1 -1
  427. package/connectors/withai/package.json +1 -1
  428. package/connectors/wiz/CLAUDE.md +1 -1
  429. package/connectors/wiz/package.json +1 -1
  430. package/connectors/wordfence/package.json +1 -1
  431. package/connectors/wordfence-api-platform/package.json +1 -1
  432. package/connectors/workflow-trigger/.env.example +1 -1
  433. package/connectors/workflow-trigger/CLAUDE.md +1 -1
  434. package/connectors/workflow-trigger/README.md +1 -1
  435. package/connectors/workflow-trigger/src/api/client.test.ts +10 -6
  436. package/connectors/workflow-trigger/src/api/client.ts +4 -3
  437. package/connectors/workflow-trigger/src/cli/index.ts +1 -1
  438. package/connectors/workos/package.json +1 -1
  439. package/connectors/write-binary-file/CLAUDE.md +1 -1
  440. package/connectors/write-binary-file/README.md +1 -1
  441. package/connectors/write-binary-file/package.json +1 -1
  442. package/connectors/write-binary-file/src/api/client.test.ts +16 -12
  443. package/connectors/write-binary-file/src/api/client.ts +4 -3
  444. package/connectors/write-binary-file/src/api/index.ts +1 -1
  445. package/connectors/write-binary-file/src/index.ts +1 -1
  446. package/connectors/wubookratechecker/src/api/client.test.ts +34 -0
  447. package/connectors/wubookratechecker/src/api/client.ts +3 -1
  448. package/connectors/wubookratechecker/src/api/index.ts +1 -1
  449. package/connectors/wubookratechecker/src/types/index.ts +1 -1
  450. package/connectors/xai/.env.example +1 -1
  451. package/connectors/xai-api-platform/.env.example +1 -1
  452. package/connectors/xai-api-platform/CLAUDE.md +1 -1
  453. package/connectors/xai-api-platform/README.md +1 -1
  454. package/connectors/xai-api-platform/src/api/client.test.ts +34 -9
  455. package/connectors/xai-api-platform/src/api/client.ts +4 -3
  456. package/connectors/xai-api-platform/src/api/index.ts +1 -1
  457. package/connectors/xai-api-platform/src/cli/index.ts +1 -1
  458. package/connectors/xai-api-platform/src/index.ts +1 -1
  459. package/connectors/xai-api-platform/src/utils/config.ts +3 -4
  460. package/connectors/xai-grok/.env.example +1 -1
  461. package/connectors/xai-grok/src/api/client.test.ts +3 -3
  462. package/connectors/xai-grok/src/cli/index.ts +1 -1
  463. package/connectors/xai-grok/src/utils/config.ts +1 -1
  464. package/connectors/ynab/package.json +1 -1
  465. package/connectors/you-com/README.md +2 -2
  466. package/connectors/you-com/package.json +1 -1
  467. package/connectors/yousign/package.json +1 -1
  468. package/connectors/zapier-api-platform/CLAUDE.md +1 -1
  469. package/connectors/zapier-api-platform/README.md +1 -1
  470. package/connectors/zapier-api-platform/src/api/client.test.ts +19 -14
  471. package/connectors/zapier-api-platform/src/api/client.ts +4 -3
  472. package/connectors/zapier-api-platform/src/api/index.ts +1 -1
  473. package/connectors/zapier-api-platform/src/cli/index.ts +1 -1
  474. package/connectors/zapier-api-platform/src/index.ts +1 -1
  475. package/connectors/zendesk/.env.example +4 -4
  476. package/connectors/zendesk/CLAUDE.md +1 -3
  477. package/connectors/zendesk/Makefile +18 -5
  478. package/connectors/zendesk/README.md +3 -8
  479. package/connectors/zendesk/SCAFFOLD.md +6 -5
  480. package/connectors/zerosettle/package.json +1 -1
  481. package/connectors/zoho-bigin/CLAUDE.md +1 -1
  482. package/connectors/zoho-campaigns/package.json +1 -1
  483. package/connectors/zoho-sign/package.json +1 -1
  484. package/connectors/zoho-subscriptions/CLAUDE.md +1 -1
  485. package/connectors/zohoprojects/CLAUDE.md +1 -1
  486. package/connectors/zolvo/package.json +1 -1
  487. package/connectors/zoom-api/package.json +1 -1
  488. package/connectors/zymbly/README.md +2 -2
  489. package/connectors/zymbly/package.json +1 -1
  490. package/dashboard/dist/assets/index-8uoGZF7B.js +280 -0
  491. package/dashboard/dist/index.html +1 -1
  492. package/dist/db/locks.d.ts +1 -1
  493. package/dist/index.js +17 -15
  494. package/dist/lib/connector-resolver.d.ts +1 -1
  495. package/dist/lib/llm.d.ts +1 -1
  496. package/dist/lib/open-browser.d.ts +18 -0
  497. package/dist/lib/open-browser.test.d.ts +1 -0
  498. package/package.json +6 -4
  499. package/dashboard/dist/assets/index-DlEljRrW.js +0 -285
@@ -51,11 +51,11 @@ afterEach(() => {
51
51
  describe('StopAndErrorClient', () => {
52
52
  const mockConfig = {
53
53
  apiKey: 'test-api-key-12345',
54
- baseUrl: 'https://api.stop-and-error.com/v1',
54
+ baseUrl: 'https://configured.example.com/v1',
55
55
  };
56
56
 
57
57
  test('throws when api key is missing', () => {
58
- expect(() => new StopAndErrorClient({ apiKey: '' })).toThrow('API key is required');
58
+ expect(() => new StopAndErrorClient({ apiKey: '', baseUrl: 'https://configured.example.com/v1' })).toThrow('API key is required');
59
59
  });
60
60
 
61
61
  test('getApiKeyPreview masks long keys', () => {
@@ -65,7 +65,7 @@ describe('StopAndErrorClient', () => {
65
65
 
66
66
  test('listErrors GET /errors with bearer auth', async () => {
67
67
  const recorded = installFetch((req) => {
68
- expect(req.url).toBe('https://api.stop-and-error.com/v1/errors?limit=10');
68
+ expect(req.url).toBe('https://configured.example.com/v1/errors?limit=10');
69
69
  expect(req.method).toBe('GET');
70
70
  expect(req.headers.authorization).toBe('Bearer test-api-key-12345');
71
71
  return { data: [{ id: 'err_1', message: 'boom' }] };
@@ -78,7 +78,7 @@ describe('StopAndErrorClient', () => {
78
78
 
79
79
  test('getError GET /errors/{id}', async () => {
80
80
  const recorded = installFetch((req) => {
81
- expect(req.url).toBe('https://api.stop-and-error.com/v1/errors/err_42');
81
+ expect(req.url).toBe('https://configured.example.com/v1/errors/err_42');
82
82
  expect(req.method).toBe('GET');
83
83
  return { id: 'err_42', message: 'failed node' };
84
84
  });
@@ -90,7 +90,7 @@ describe('StopAndErrorClient', () => {
90
90
 
91
91
  test('createError POST /errors with body', async () => {
92
92
  const recorded = installFetch((req) => {
93
- expect(req.url).toBe('https://api.stop-and-error.com/v1/errors');
93
+ expect(req.url).toBe('https://configured.example.com/v1/errors');
94
94
  expect(req.method).toBe('POST');
95
95
  expect(req.headers.authorization).toBe('Bearer test-api-key-12345');
96
96
  const body = JSON.parse(req.body!);
@@ -106,7 +106,7 @@ describe('StopAndErrorClient', () => {
106
106
 
107
107
  test('listEvents GET /events', async () => {
108
108
  const recorded = installFetch((req) => {
109
- expect(req.url).toBe('https://api.stop-and-error.com/v1/events?errorId=err_1');
109
+ expect(req.url).toBe('https://configured.example.com/v1/events?errorId=err_1');
110
110
  expect(req.method).toBe('GET');
111
111
  return { data: [{ id: 'evt_1', type: 'error.created' }] };
112
112
  });
@@ -118,7 +118,7 @@ describe('StopAndErrorClient', () => {
118
118
 
119
119
  test('search POST /search with query body', async () => {
120
120
  const recorded = installFetch((req) => {
121
- expect(req.url).toBe('https://api.stop-and-error.com/v1/search');
121
+ expect(req.url).toBe('https://configured.example.com/v1/search');
122
122
  expect(req.method).toBe('POST');
123
123
  const body = JSON.parse(req.body!);
124
124
  expect(body.query).toBe('timeout');
@@ -147,7 +147,7 @@ describe('StopAndErrorClient', () => {
147
147
 
148
148
  test('rawRequest supports custom path and method', async () => {
149
149
  const recorded = installFetch((req) => {
150
- expect(req.url).toBe('https://api.stop-and-error.com/v1/custom?foo=bar');
150
+ expect(req.url).toBe('https://configured.example.com/v1/custom?foo=bar');
151
151
  expect(req.method).toBe('PUT');
152
152
  return { ok: true };
153
153
  });
@@ -155,4 +155,8 @@ describe('StopAndErrorClient', () => {
155
155
  await connector.rawRequest({ method: 'PUT', path: '/custom', params: { foo: 'bar' } });
156
156
  expect(recorded).toHaveLength(1);
157
157
  });
158
+
159
+ test('refuses to send without a configured base URL (no default endpoint)', () => {
160
+ expect(() => new StopAndErrorClient({ apiKey: 'test-key' })).toThrow(/baseUrl/);
161
+ });
158
162
  });
@@ -1,8 +1,6 @@
1
1
  import type { StopAndErrorConfig } from '../types';
2
2
  import { StopAndErrorApiError } from '../types';
3
3
 
4
- const DEFAULT_BASE_URL = 'https://api.stop-and-error.com/v1';
5
-
6
4
  export interface RequestOptions {
7
5
  method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
8
6
  params?: Record<string, string | number | boolean | undefined>;
@@ -19,7 +17,10 @@ export class StopAndErrorClient {
19
17
  throw new Error('API key is required');
20
18
  }
21
19
  this.apiKey = config.apiKey;
22
- this.baseUrl = (config.baseUrl || DEFAULT_BASE_URL).replace(/\/$/, '');
20
+ if (!config.baseUrl) {
21
+ throw new Error('baseUrl is required: no default endpoint is configured; set baseUrl (profile, config, or the connector BASE_URL environment variable)');
22
+ }
23
+ this.baseUrl = config.baseUrl.replace(/\/$/, '');
23
24
  }
24
25
 
25
26
  private buildUrl(path: string, params?: Record<string, string | number | boolean | undefined>): string {
@@ -167,7 +167,7 @@ configCmd
167
167
  console.log(chalk.bold(`Active Profile: ${getCurrentProfile()}`));
168
168
  info(`Config directory: ${getConfigDir()}`);
169
169
  info(`API Key: ${apiKey ? `${apiKey.substring(0, 8)}...` : chalk.gray('not set')}`);
170
- info(`Base URL: ${getBaseUrl() || chalk.gray('default (https://api.stop-and-error.com/v1)')}`);
170
+ info(`Base URL: ${getBaseUrl() || chalk.gray('none configured')}`);
171
171
  });
172
172
 
173
173
  configCmd
@@ -187,7 +187,7 @@ statusCmd.action(() => {
187
187
  console.log(chalk.bold('StopAndError Connector Status'));
188
188
  info(`Profile: ${getCurrentProfile()}`);
189
189
  info(`API Key: ${apiKey ? client!.getApiKeyPreview() : chalk.gray('not set')}`);
190
- info(`Base URL: ${getBaseUrl() || 'https://api.stop-and-error.com/v1'}`);
190
+ info(`Base URL: ${getBaseUrl() || 'none configured'}`);
191
191
  });
192
192
 
193
193
  const errorsCmd = program.command('errors').description('Workflow error operations');
@@ -45,6 +45,6 @@
45
45
  },
46
46
  "repository": {
47
47
  "type": "git",
48
- "url": "git+https://github.com/hasna/open-connectors.git"
48
+ "url": "git+https://github.com/hasna/apps.git"
49
49
  }
50
50
  }
@@ -48,6 +48,6 @@
48
48
  },
49
49
  "repository": {
50
50
  "type": "git",
51
- "url": "git+https://github.com/hasna/open-connectors.git"
51
+ "url": "git+https://github.com/hasna/apps.git"
52
52
  }
53
53
  }
@@ -1,6 +1,6 @@
1
1
  # CLAUDE.md
2
2
 
3
- Strand AI connector for the open-connectors monorepo.
3
+ Strand AI connector for the connectors monorepo.
4
4
 
5
5
  ## Overview
6
6
 
@@ -1,5 +1,5 @@
1
1
  # Stripe Financial Connections API credentials
2
2
  STRIPE_FINANCIAL_CONNECTIONS_API_KEY=your-api-key-here
3
3
 
4
- # Optional: override API base URL (default: https://api.stripefinancialconnections.com/v1)
4
+ # Optional: override API base URL (no default - must be configured)
5
5
  # STRIPE_FINANCIAL_CONNECTIONS_BASE_URL=https://api.stripefinancialconnections.com/v1
@@ -54,7 +54,7 @@ connect-stripe-financial-connections raw --path /items --method GET
54
54
 
55
55
  ## Authentication
56
56
 
57
- Bearer Token authentication. API base URL defaults to `https://api.stripefinancialconnections.com/v1`.
57
+ Bearer Token authentication. API base URL has no default (must be configured).
58
58
 
59
59
  ## Data Storage
60
60
 
@@ -70,7 +70,7 @@ Profile JSON structure:
70
70
  ```json
71
71
  {
72
72
  "apiKey": "your-api-key",
73
- "baseUrl": "https://api.stripefinancialconnections.com/v1"
73
+ "baseUrl": "configured.example.com/v1"
74
74
  }
75
75
  ```
76
76
 
@@ -45,6 +45,6 @@
45
45
  },
46
46
  "repository": {
47
47
  "type": "git",
48
- "url": "git+https://github.com/hasna/open-connectors.git"
48
+ "url": "git+https://github.com/hasna/apps.git"
49
49
  }
50
50
  }
@@ -0,0 +1,34 @@
1
+ import { afterEach, describe, expect, test } from 'bun:test';
2
+ import { StripeFinancialConnectionsClient } from './client';
3
+
4
+ const realFetch = globalThis.fetch;
5
+
6
+ afterEach(() => {
7
+ globalThis.fetch = realFetch;
8
+ });
9
+
10
+ describe('StripeFinancialConnectionsClient transport', () => {
11
+ test('refuses to send without a configured base URL (no default endpoint)', () => {
12
+ expect(() => new StripeFinancialConnectionsClient({ apiKey: 'test-key' })).toThrow(/baseUrl/);
13
+ });
14
+
15
+ test('sends the API key only to the configured base URL', async () => {
16
+ const recorded: string[] = [];
17
+ globalThis.fetch = (async (input: string | URL | Request, init?: RequestInit) => {
18
+ recorded.push(typeof input === 'string' ? input : input.toString());
19
+ return {
20
+ ok: true,
21
+ status: 200,
22
+ statusText: 'OK',
23
+ headers: new Headers({ 'content-type': 'application/json' }),
24
+ async text() { return JSON.stringify({ ok: true }); },
25
+ async json() { return { ok: true }; },
26
+ } as Response;
27
+ }) as typeof fetch;
28
+ const client = new StripeFinancialConnectionsClient({ apiKey: 'test-key', baseUrl: 'https://configured.example.com/v1' });
29
+ await client.request('/ping');
30
+ expect(recorded).toHaveLength(1);
31
+ expect(recorded[0].startsWith('https://configured.example.com/v1/')).toBe(true);
32
+ expect(recorded[0]).not.toContain('api.stripefinancialconnections.com');
33
+ });
34
+ });
@@ -1,8 +1,6 @@
1
1
  import type { StripeFinancialConnectionsConfig, OutputFormat } from '../types';
2
2
  import { StripeFinancialConnectionsApiError } from '../types';
3
3
 
4
- export const DEFAULT_BASE_URL = 'https://api.stripefinancialconnections.com/v1';
5
-
6
4
  export interface RequestOptions {
7
5
  method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
8
6
  params?: Record<string, string | number | boolean | undefined>;
@@ -20,7 +18,10 @@ export class StripeFinancialConnectionsClient {
20
18
  throw new Error('API key is required');
21
19
  }
22
20
  this.apiKey = config.apiKey;
23
- this.baseUrl = config.baseUrl || DEFAULT_BASE_URL;
21
+ if (!config.baseUrl) {
22
+ throw new Error('baseUrl is required: no default endpoint is configured; set baseUrl (profile, config, or the connector BASE_URL environment variable)');
23
+ }
24
+ this.baseUrl = config.baseUrl;
24
25
  }
25
26
 
26
27
  private buildUrl(path: string, params?: Record<string, string | number | boolean | undefined>): string {
@@ -178,7 +178,7 @@ configCmd
178
178
  console.log(chalk.bold(`Active Profile: ${getCurrentProfile()}`));
179
179
  info(`Config directory: ${getConfigDir()}`);
180
180
  info(`API Key: ${apiKey ? `${apiKey.substring(0, 8)}...` : chalk.gray('not set')}`);
181
- info(`Base URL: ${baseUrl || chalk.gray('default (https://api.stripefinancialconnections.com/v1)')}`);
181
+ info(`Base URL: ${baseUrl || chalk.gray('none configured')}`);
182
182
  });
183
183
 
184
184
  configCmd
@@ -48,6 +48,6 @@
48
48
  },
49
49
  "repository": {
50
50
  "type": "git",
51
- "url": "git+https://github.com/hasna/open-connectors.git"
51
+ "url": "git+https://github.com/hasna/apps.git"
52
52
  }
53
53
  }
@@ -49,6 +49,6 @@
49
49
  },
50
50
  "repository": {
51
51
  "type": "git",
52
- "url": "git+https://github.com/hasna/open-connectors.git"
52
+ "url": "git+https://github.com/hasna/apps.git"
53
53
  }
54
54
  }
@@ -1,5 +1,5 @@
1
1
  # Sucuri API Platform credentials (placeholder values only)
2
2
  SUCURI_API_PLATFORM_API_KEY=your-api-key-here
3
3
 
4
- # Optional: override the API base URL (default https://api.sucuriapiplatform.com/v1)
4
+ # Optional: override the API base URL (no default - must be configured)
5
5
  # SUCURI_API_PLATFORM_BASE_URL=https://api.sucuriapiplatform.com/v1
@@ -27,7 +27,7 @@ bun run dev raw request --path /items --method GET
27
27
 
28
28
  ## API Details
29
29
 
30
- - **Base URL**: `https://api.sucuriapiplatform.com/v1` (override via `SUCURI_API_PLATFORM_BASE_URL` or profile `baseUrl`)
30
+ - **Base URL**: no default (must be configured) (override via `SUCURI_API_PLATFORM_BASE_URL` or profile `baseUrl`)
31
31
  - **Auth**: Bearer token (`Authorization: Bearer <api_key>`)
32
32
  - **Endpoints**:
33
33
  - `GET /items` — list items
@@ -1,6 +1,6 @@
1
1
  # @hasna/connect-sucuri-api-platform
2
2
 
3
- TypeScript connector and CLI for the [Sucuri API Platform](https://api.sucuriapiplatform.com/v1).
3
+ TypeScript connector and CLI for the [Sucuri API Platform](configured.example.com/v1).
4
4
 
5
5
  ## Install
6
6
 
@@ -13,7 +13,7 @@ bun add @hasna/connect-sucuri-api-platform
13
13
  ```bash
14
14
  export SUCURI_API_PLATFORM_API_KEY=your-api-key
15
15
  # optional
16
- export SUCURI_API_PLATFORM_BASE_URL=https://api.sucuriapiplatform.com/v1
16
+ export SUCURI_API_PLATFORM_BASE_URL=https://configured.example.com/v1
17
17
  ```
18
18
 
19
19
  Or use the CLI profile/config commands:
@@ -1,11 +1,11 @@
1
1
  import { describe, test, expect, mock, beforeEach, afterEach } from 'bun:test';
2
- import { ConnectorClient, DEFAULT_BASE_URL } from './client';
2
+ import { ConnectorClient } from './client';
3
3
  import { ConnectorApiError } from '../types';
4
4
 
5
5
  describe('ConnectorClient', () => {
6
6
  const mockConfig = {
7
7
  apiKey: 'test-api-key-12345',
8
- baseUrl: 'https://api.sucuriapiplatform.com/v1',
8
+ baseUrl: 'https://configured.example.com/v1',
9
9
  };
10
10
 
11
11
  describe('constructor', () => {
@@ -18,14 +18,16 @@ describe('ConnectorClient', () => {
18
18
  expect(client).toBeInstanceOf(ConnectorClient);
19
19
  });
20
20
 
21
- test('uses default base URL when not provided', () => {
22
- const client = new ConnectorClient({ apiKey: 'token' });
23
- expect(client.getBaseUrl()).toBe(DEFAULT_BASE_URL);
24
- });
21
+ test('refuses to send without a configured base URL (no default endpoint)', () => {
22
+ expect(() => new ConnectorClient({ apiKey: 'test-key' })).toThrow(/baseUrl/);
23
+ });
25
24
 
26
25
  test('strips trailing slash from base URL', () => {
27
26
  const client = new ConnectorClient({
28
27
  apiKey: 'token',
28
+ baseUrl: 'https://configured.example.com/v1',
29
+ baseUrl: 'https://configured.example.com/v1',
30
+ baseUrl: 'https://configured.example.com/v1',
29
31
  baseUrl: 'https://custom.example.com/v1/',
30
32
  });
31
33
  expect(client.getBaseUrl()).toBe('https://custom.example.com/v1');
@@ -72,7 +74,7 @@ describe('ConnectorClient', () => {
72
74
 
73
75
  expect(global.fetch).toHaveBeenCalledTimes(1);
74
76
  const [url, options] = (global.fetch as ReturnType<typeof mock>).mock.calls[0];
75
- expect(url).toBe('https://api.sucuriapiplatform.com/v1/items');
77
+ expect(url).toBe('https://configured.example.com/v1/items');
76
78
  expect(options.method).toBe('GET');
77
79
  expect(options.headers.Authorization).toBe('Bearer test-api-key-12345');
78
80
  expect(options.headers.Accept).toBe('application/json');
@@ -1,8 +1,6 @@
1
1
  import type { ConnectorConfig, OutputFormat } from '../types';
2
2
  import { ConnectorApiError, parseApiError } from '../types';
3
3
 
4
- export const DEFAULT_BASE_URL = 'https://api.sucuriapiplatform.com/v1';
5
-
6
4
  export interface RequestOptions {
7
5
  method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
8
6
  params?: Record<string, string | number | boolean | undefined>;
@@ -23,7 +21,10 @@ export class ConnectorClient {
23
21
  throw new Error('Sucuri API Platform API key is required');
24
22
  }
25
23
  this.apiKey = key;
26
- this.baseUrl = (config.baseUrl || DEFAULT_BASE_URL).replace(/\/$/, '');
24
+ if (!config.baseUrl) {
25
+ throw new Error('baseUrl is required: no default endpoint is configured; set baseUrl (profile, config, or the connector BASE_URL environment variable)');
26
+ }
27
+ this.baseUrl = config.baseUrl.replace(/\/$/, '');
27
28
  }
28
29
 
29
30
  private buildUrl(path: string, params?: Record<string, string | number | boolean | undefined>): string {
@@ -49,7 +49,7 @@ export class Connector {
49
49
  }
50
50
  }
51
51
 
52
- export { ConnectorClient, DEFAULT_BASE_URL } from './client';
52
+ export { ConnectorClient } from './client';
53
53
  export { ItemsApi } from './items';
54
54
  export { EventsApi } from './events';
55
55
  export { SearchApi } from './search';
@@ -187,7 +187,7 @@ configCmd
187
187
  console.log(chalk.bold(`Active Profile: ${profileName}`));
188
188
  info(`Config directory: ${getConfigDir()}`);
189
189
  info(`API Key: ${apiKey ? `${apiKey.substring(0, 8)}...` : chalk.gray('not set')}`);
190
- info(`Base URL: ${baseUrl || chalk.gray('https://api.sucuriapiplatform.com/v1 (default)')}`);
190
+ info(`Base URL: ${baseUrl || chalk.gray('none configured')}`);
191
191
  });
192
192
 
193
193
  configCmd
@@ -3,7 +3,7 @@
3
3
  export { Connector } from './api';
4
4
  export * from './types';
5
5
 
6
- export { ConnectorClient, ItemsApi, EventsApi, SearchApi, DEFAULT_BASE_URL } from './api';
6
+ export { ConnectorClient, ItemsApi, EventsApi, SearchApi } from './api';
7
7
 
8
8
  export {
9
9
  getApiKey,
@@ -49,6 +49,6 @@
49
49
  },
50
50
  "repository": {
51
51
  "type": "git",
52
- "url": "git+https://github.com/hasna/open-connectors.git"
52
+ "url": "git+https://github.com/hasna/apps.git"
53
53
  }
54
54
  }
@@ -47,6 +47,6 @@
47
47
  },
48
48
  "repository": {
49
49
  "type": "git",
50
- "url": "git+https://github.com/hasna/open-connectors.git"
50
+ "url": "git+https://github.com/hasna/apps.git"
51
51
  }
52
52
  }
@@ -50,6 +50,6 @@
50
50
  },
51
51
  "repository": {
52
52
  "type": "git",
53
- "url": "git+https://github.com/hasna/open-connectors.git"
53
+ "url": "git+https://github.com/hasna/apps.git"
54
54
  }
55
55
  }
@@ -49,6 +49,6 @@
49
49
  },
50
50
  "repository": {
51
51
  "type": "git",
52
- "url": "git+https://github.com/hasna/open-connectors.git"
52
+ "url": "git+https://github.com/hasna/apps.git"
53
53
  }
54
54
  }
@@ -47,6 +47,6 @@
47
47
  },
48
48
  "repository": {
49
49
  "type": "git",
50
- "url": "git+https://github.com/hasna/open-connectors.git"
50
+ "url": "git+https://github.com/hasna/apps.git"
51
51
  }
52
52
  }
@@ -1,6 +1,6 @@
1
1
  # @hasna/connect-takecareos
2
2
 
3
- TakeCareOS connector for the [open-connectors](https://github.com/hasna/open-connectors) registry.
3
+ TakeCareOS connector for the [connectors](https://github.com/hasna/apps) registry.
4
4
 
5
5
  TakeCareOS is a home-care agency operating system. This connector wraps its public
6
6
  REST API to manage clients (care recipients), caregivers, shifts, incident reports,
@@ -18,7 +18,7 @@ The connector authenticates with a Bearer API key. Provide it via environment
18
18
  variable, a CLI flag, or a stored profile:
19
19
 
20
20
  ```bash
21
- export TAKECAREOS_API_KEY=your-api-key
21
+ export TAKECAREOS_API_KEY=<your-api-key>
22
22
  # optional, for a dedicated/regional host
23
23
  export TAKECAREOS_BASE_URL=https://api.takecareos.com/v1
24
24
  ```
@@ -50,6 +50,6 @@
50
50
  },
51
51
  "repository": {
52
52
  "type": "git",
53
- "url": "git+https://github.com/hasna/open-connectors.git"
53
+ "url": "git+https://github.com/hasna/apps.git"
54
54
  }
55
55
  }
@@ -59,6 +59,11 @@ export interface GetFileOptions {
59
59
  fileId: string;
60
60
  }
61
61
 
62
+ export interface DownloadFileResult {
63
+ file: TelegramFile;
64
+ data: Uint8Array;
65
+ }
66
+
62
67
  export interface BotName {
63
68
  name: string;
64
69
  }
@@ -220,4 +225,19 @@ export class BotApi {
220
225
  },
221
226
  });
222
227
  }
228
+
229
+ /**
230
+ * Resolve and download a Telegram file
231
+ */
232
+ async downloadFile(options: GetFileOptions): Promise<DownloadFileResult> {
233
+ const file = await this.getFile(options);
234
+ if (!file.file_path) {
235
+ throw new Error('Telegram did not return a downloadable file path');
236
+ }
237
+
238
+ return {
239
+ file,
240
+ data: await this.client.downloadFile(file.file_path),
241
+ };
242
+ }
223
243
  }
@@ -118,6 +118,38 @@ export class TelegramClient {
118
118
  return this.request<T>(method, { body: formData });
119
119
  }
120
120
 
121
+ /**
122
+ * Download a file returned by the Telegram Bot API
123
+ */
124
+ async downloadFile(filePath: string): Promise<Uint8Array> {
125
+ const normalizedPath = filePath.replace(/^\/+/, '');
126
+ if (!normalizedPath) {
127
+ throw new Error('Telegram file path is required');
128
+ }
129
+
130
+ const encodedPath = normalizedPath
131
+ .split('/')
132
+ .map(segment => encodeURIComponent(segment))
133
+ .join('/');
134
+ const url = `${TELEGRAM_API_BASE}/file/bot${this.botToken}/${encodedPath}`;
135
+
136
+ let response: Response;
137
+ try {
138
+ response = await fetch(url);
139
+ } catch {
140
+ throw new Error('Failed to download Telegram file');
141
+ }
142
+
143
+ if (!response.ok) {
144
+ throw new TelegramApiError(
145
+ `Telegram file download failed with HTTP ${response.status}`,
146
+ response.status
147
+ );
148
+ }
149
+
150
+ return new Uint8Array(await response.arrayBuffer());
151
+ }
152
+
121
153
  /**
122
154
  * Get a preview of the bot token (for display/debugging)
123
155
  */
@@ -0,0 +1,103 @@
1
+ import { afterEach, describe, expect, mock, test } from 'bun:test';
2
+ import { Telegram } from './index';
3
+
4
+ const originalFetch = globalThis.fetch;
5
+
6
+ afterEach(() => {
7
+ globalThis.fetch = originalFetch;
8
+ });
9
+
10
+ describe('Telegram files API', () => {
11
+ test('resolves a file ID and downloads its bytes from the authenticated file URL', async () => {
12
+ const botToken = '123456:test-token';
13
+ const fetchMock = mock(async (
14
+ input: string | URL | Request,
15
+ _init?: RequestInit
16
+ ) => {
17
+ const url = String(input);
18
+ if (url.endsWith('/getFile')) {
19
+ return Response.json({
20
+ ok: true,
21
+ result: {
22
+ file_id: 'incoming-file-id',
23
+ file_unique_id: 'unique-file-id',
24
+ file_size: 4,
25
+ file_path: 'documents/report 1.pdf',
26
+ },
27
+ });
28
+ }
29
+
30
+ return new Response(new Uint8Array([1, 2, 3, 4]));
31
+ });
32
+ globalThis.fetch = fetchMock as unknown as typeof fetch;
33
+
34
+ const telegram = new Telegram({ botToken });
35
+ const downloaded = await telegram.bot.downloadFile({
36
+ fileId: 'incoming-file-id',
37
+ });
38
+
39
+ expect(fetchMock).toHaveBeenCalledTimes(2);
40
+ expect(String(fetchMock.mock.calls[0]?.[0])).toBe(
41
+ `https://api.telegram.org/bot${botToken}/getFile`
42
+ );
43
+ expect(JSON.parse(String(fetchMock.mock.calls[0]?.[1]?.body))).toEqual({
44
+ file_id: 'incoming-file-id',
45
+ });
46
+ expect(String(fetchMock.mock.calls[1]?.[0])).toBe(
47
+ `https://api.telegram.org/file/bot${botToken}/documents/report%201.pdf`
48
+ );
49
+ expect(downloaded.file.file_path).toBe('documents/report 1.pdf');
50
+ expect(downloaded.data).toEqual(new Uint8Array([1, 2, 3, 4]));
51
+ });
52
+
53
+ test('fails explicitly when Telegram does not return a file path', async () => {
54
+ const fetchMock = mock(async () =>
55
+ Response.json({
56
+ ok: true,
57
+ result: {
58
+ file_id: 'incoming-file-id',
59
+ file_unique_id: 'unique-file-id',
60
+ },
61
+ })
62
+ );
63
+ globalThis.fetch = fetchMock as unknown as typeof fetch;
64
+
65
+ const telegram = new Telegram({ botToken: '123456:test-token' });
66
+
67
+ expect(
68
+ telegram.bot.downloadFile({ fileId: 'incoming-file-id' })
69
+ ).rejects.toThrow('Telegram did not return a downloadable file path');
70
+ expect(fetchMock).toHaveBeenCalledTimes(1);
71
+ });
72
+
73
+ test('does not expose the bot token in download errors', async () => {
74
+ const botToken = '123456:must-not-leak';
75
+ const fetchMock = mock(async (
76
+ input: string | URL | Request,
77
+ _init?: RequestInit
78
+ ) => {
79
+ if (String(input).endsWith('/getFile')) {
80
+ return Response.json({
81
+ ok: true,
82
+ result: {
83
+ file_id: 'incoming-file-id',
84
+ file_unique_id: 'unique-file-id',
85
+ file_path: 'photos/file.jpg',
86
+ },
87
+ });
88
+ }
89
+ return new Response('not found', { status: 404 });
90
+ });
91
+ globalThis.fetch = fetchMock as unknown as typeof fetch;
92
+
93
+ const telegram = new Telegram({ botToken });
94
+
95
+ try {
96
+ await telegram.bot.downloadFile({ fileId: 'incoming-file-id' });
97
+ throw new Error('Expected download to fail');
98
+ } catch (err) {
99
+ expect(String(err)).toContain('Telegram file download failed');
100
+ expect(String(err)).not.toContain(botToken);
101
+ }
102
+ });
103
+ });
@@ -64,3 +64,4 @@ export { ChatsApi } from './chats';
64
64
  export { UpdatesApi } from './updates';
65
65
  export { InlineApi } from './inline';
66
66
  export { BotApi } from './bot';
67
+ export type { DownloadFileResult } from './bot';