runline 0.1.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 (230) hide show
  1. package/.pi/extensions/runline-context/index.ts +135 -0
  2. package/.pi/extensions/runline-context/package.json +17 -0
  3. package/README.md +273 -0
  4. package/dist/commands/actions.d.ts +3 -0
  5. package/dist/commands/actions.js +43 -0
  6. package/dist/commands/connection.d.ts +11 -0
  7. package/dist/commands/connection.js +56 -0
  8. package/dist/commands/exec.d.ts +5 -0
  9. package/dist/commands/exec.js +46 -0
  10. package/dist/commands/init.d.ts +4 -0
  11. package/dist/commands/init.js +26 -0
  12. package/dist/commands/plugin.d.ts +10 -0
  13. package/dist/commands/plugin.js +57 -0
  14. package/dist/config/index.d.ts +3 -0
  15. package/dist/config/index.js +2 -0
  16. package/dist/config/loader.d.ts +11 -0
  17. package/dist/config/loader.js +82 -0
  18. package/dist/config/types.d.ts +9 -0
  19. package/dist/config/types.js +5 -0
  20. package/dist/core/engine.d.ts +21 -0
  21. package/dist/core/engine.js +280 -0
  22. package/dist/index.d.ts +16 -0
  23. package/dist/index.js +9 -0
  24. package/dist/main.d.ts +2 -0
  25. package/dist/main.js +127 -0
  26. package/dist/plugin/api.d.ts +32 -0
  27. package/dist/plugin/api.js +68 -0
  28. package/dist/plugin/installer.d.ts +27 -0
  29. package/dist/plugin/installer.js +181 -0
  30. package/dist/plugin/loader.d.ts +13 -0
  31. package/dist/plugin/loader.js +164 -0
  32. package/dist/plugin/registry.d.ts +18 -0
  33. package/dist/plugin/registry.js +43 -0
  34. package/dist/plugin/types.d.ts +40 -0
  35. package/dist/plugin/types.js +1 -0
  36. package/dist/plugins/actionNetwork/src/index.js +353 -0
  37. package/dist/plugins/activeCampaign/src/index.js +711 -0
  38. package/dist/plugins/adalo/src/index.js +131 -0
  39. package/dist/plugins/affinity/src/index.js +279 -0
  40. package/dist/plugins/agileCrm/src/index.js +415 -0
  41. package/dist/plugins/airtable/src/index.js +280 -0
  42. package/dist/plugins/airtop/src/index.js +527 -0
  43. package/dist/plugins/apiTemplateIo/src/index.js +86 -0
  44. package/dist/plugins/asana/src/index.js +413 -0
  45. package/dist/plugins/autopilot/src/index.js +203 -0
  46. package/dist/plugins/bambooHr/src/index.js +252 -0
  47. package/dist/plugins/bannerbear/src/index.js +100 -0
  48. package/dist/plugins/baserow/src/index.js +180 -0
  49. package/dist/plugins/beeminder/src/index.js +298 -0
  50. package/dist/plugins/bitly/src/index.js +107 -0
  51. package/dist/plugins/bitwarden/src/index.js +383 -0
  52. package/dist/plugins/box/src/index.js +300 -0
  53. package/dist/plugins/brandfetch/src/index.js +80 -0
  54. package/dist/plugins/brevo/src/index.js +305 -0
  55. package/dist/plugins/bubble/src/index.js +181 -0
  56. package/dist/plugins/chargebee/src/index.js +126 -0
  57. package/dist/plugins/circleci/src/index.js +111 -0
  58. package/dist/plugins/ciscoWebex/src/index.js +245 -0
  59. package/dist/plugins/clearbit/src/index.js +103 -0
  60. package/dist/plugins/clickup/src/index.js +1043 -0
  61. package/dist/plugins/clockify/src/index.js +443 -0
  62. package/dist/plugins/cloudflare/src/index.js +93 -0
  63. package/dist/plugins/cockpit/src/index.js +131 -0
  64. package/dist/plugins/coda/src/index.js +327 -0
  65. package/dist/plugins/coingecko/src/index.js +244 -0
  66. package/dist/plugins/contentful/src/index.js +146 -0
  67. package/dist/plugins/convertkit/src/index.js +270 -0
  68. package/dist/plugins/copper/src/index.js +140 -0
  69. package/dist/plugins/cortex/src/index.js +147 -0
  70. package/dist/plugins/currents/src/index.js +405 -0
  71. package/dist/plugins/customerIo/src/index.js +184 -0
  72. package/dist/plugins/databricks/src/index.js +342 -0
  73. package/dist/plugins/deepl/src/index.js +87 -0
  74. package/dist/plugins/demio/src/index.js +111 -0
  75. package/dist/plugins/dhl/src/index.js +40 -0
  76. package/dist/plugins/discord/src/index.js +275 -0
  77. package/dist/plugins/discourse/src/index.js +273 -0
  78. package/dist/plugins/disqus/src/index.js +145 -0
  79. package/dist/plugins/docker/src/index.js +76 -0
  80. package/dist/plugins/drift/src/index.js +89 -0
  81. package/dist/plugins/dropbox/src/index.js +159 -0
  82. package/dist/plugins/dropcontact/src/index.js +59 -0
  83. package/dist/plugins/egoi/src/index.js +151 -0
  84. package/dist/plugins/elasticsearch/src/index.js +157 -0
  85. package/dist/plugins/emelia/src/index.js +174 -0
  86. package/dist/plugins/erpnext/src/index.js +121 -0
  87. package/dist/plugins/facebookGraph/src/index.js +57 -0
  88. package/dist/plugins/freshdesk/src/index.js +320 -0
  89. package/dist/plugins/freshservice/src/index.js +146 -0
  90. package/dist/plugins/freshworksCrm/src/index.js +149 -0
  91. package/dist/plugins/getresponse/src/index.js +140 -0
  92. package/dist/plugins/ghost/src/index.js +192 -0
  93. package/dist/plugins/github/src/index.js +630 -0
  94. package/dist/plugins/gitlab/src/index.js +358 -0
  95. package/dist/plugins/gong/src/index.js +126 -0
  96. package/dist/plugins/gotify/src/index.js +77 -0
  97. package/dist/plugins/gotowebinar/src/index.js +316 -0
  98. package/dist/plugins/grafana/src/index.js +250 -0
  99. package/dist/plugins/graphql/src/index.js +78 -0
  100. package/dist/plugins/grist/src/index.js +106 -0
  101. package/dist/plugins/hackernews/src/index.js +89 -0
  102. package/dist/plugins/halopsa/src/index.js +79 -0
  103. package/dist/plugins/harvest/src/index.js +163 -0
  104. package/dist/plugins/helpscout/src/index.js +176 -0
  105. package/dist/plugins/highlevel/src/index.js +172 -0
  106. package/dist/plugins/homeAssistant/src/index.js +148 -0
  107. package/dist/plugins/hubspot/src/index.js +176 -0
  108. package/dist/plugins/humanticAi/src/index.js +60 -0
  109. package/dist/plugins/hunter/src/index.js +59 -0
  110. package/dist/plugins/intercom/src/index.js +156 -0
  111. package/dist/plugins/iterable/src/index.js +139 -0
  112. package/dist/plugins/jenkins/src/index.js +132 -0
  113. package/dist/plugins/jira/src/index.js +229 -0
  114. package/dist/plugins/keap/src/index.js +502 -0
  115. package/dist/plugins/kobotoolbox/src/index.js +281 -0
  116. package/dist/plugins/lemlist/src/index.js +231 -0
  117. package/dist/plugins/linear/src/index.js +133 -0
  118. package/dist/plugins/lingvanex/src/index.js +31 -0
  119. package/dist/plugins/linkedin/src/index.js +80 -0
  120. package/dist/plugins/lonescale/src/index.js +119 -0
  121. package/dist/plugins/magento/src/index.js +300 -0
  122. package/dist/plugins/mailcheck/src/index.js +27 -0
  123. package/dist/plugins/mailchimp/src/index.js +321 -0
  124. package/dist/plugins/mailerlite/src/index.js +123 -0
  125. package/dist/plugins/mailgun/src/index.js +48 -0
  126. package/dist/plugins/mailjet/src/index.js +155 -0
  127. package/dist/plugins/mandrill/src/index.js +145 -0
  128. package/dist/plugins/marketstack/src/index.js +97 -0
  129. package/dist/plugins/matrix/src/index.js +194 -0
  130. package/dist/plugins/mattermost/src/index.js +331 -0
  131. package/dist/plugins/mautic/src/index.js +311 -0
  132. package/dist/plugins/medium/src/index.js +77 -0
  133. package/dist/plugins/messagebird/src/index.js +57 -0
  134. package/dist/plugins/metabase/src/index.js +130 -0
  135. package/dist/plugins/misp/src/index.js +476 -0
  136. package/dist/plugins/mocean/src/index.js +67 -0
  137. package/dist/plugins/monday/src/index.js +231 -0
  138. package/dist/plugins/monicaCrm/src/index.js +52 -0
  139. package/dist/plugins/msg91/src/index.js +31 -0
  140. package/dist/plugins/nasa/src/index.js +146 -0
  141. package/dist/plugins/netlify/src/index.js +151 -0
  142. package/dist/plugins/netscalerAdc/src/index.js +131 -0
  143. package/dist/plugins/nextcloud/src/index.js +263 -0
  144. package/dist/plugins/nocodb/src/index.js +130 -0
  145. package/dist/plugins/notion/src/index.js +112 -0
  146. package/dist/plugins/npm/src/index.js +104 -0
  147. package/dist/plugins/odoo/src/index.js +157 -0
  148. package/dist/plugins/okta/src/index.js +141 -0
  149. package/dist/plugins/oneSimpleApi/src/index.js +155 -0
  150. package/dist/plugins/onfleet/src/index.js +254 -0
  151. package/dist/plugins/openThesaurus/src/index.js +32 -0
  152. package/dist/plugins/openweathermap/src/index.js +60 -0
  153. package/dist/plugins/oura/src/index.js +62 -0
  154. package/dist/plugins/paddle/src/index.js +247 -0
  155. package/dist/plugins/pagerduty/src/index.js +201 -0
  156. package/dist/plugins/paypal/src/index.js +106 -0
  157. package/dist/plugins/peekalink/src/index.js +35 -0
  158. package/dist/plugins/phantombuster/src/index.js +94 -0
  159. package/dist/plugins/philipsHue/src/index.js +98 -0
  160. package/dist/plugins/pipedrive/src/index.js +169 -0
  161. package/dist/plugins/plivo/src/index.js +66 -0
  162. package/dist/plugins/postbin/src/index.js +93 -0
  163. package/dist/plugins/posthog/src/index.js +113 -0
  164. package/dist/plugins/profitwell/src/index.js +50 -0
  165. package/dist/plugins/pushbullet/src/index.js +102 -0
  166. package/dist/plugins/pushcut/src/index.js +39 -0
  167. package/dist/plugins/pushover/src/index.js +65 -0
  168. package/dist/plugins/quickbase/src/index.js +153 -0
  169. package/dist/plugins/quickbooks/src/index.js +73 -0
  170. package/dist/plugins/quickchart/src/index.js +36 -0
  171. package/dist/plugins/raindrop/src/index.js +209 -0
  172. package/dist/plugins/reddit/src/index.js +185 -0
  173. package/dist/plugins/rocketchat/src/index.js +53 -0
  174. package/dist/plugins/rundeck/src/index.js +62 -0
  175. package/dist/plugins/salesforce/src/index.js +94 -0
  176. package/dist/plugins/salesmate/src/index.js +83 -0
  177. package/dist/plugins/securityScorecard/src/index.js +200 -0
  178. package/dist/plugins/segment/src/index.js +125 -0
  179. package/dist/plugins/sendgrid/src/index.js +187 -0
  180. package/dist/plugins/sendy/src/index.js +138 -0
  181. package/dist/plugins/sentry/src/index.js +233 -0
  182. package/dist/plugins/servicenow/src/index.js +108 -0
  183. package/dist/plugins/shopify/src/index.js +222 -0
  184. package/dist/plugins/signl4/src/index.js +61 -0
  185. package/dist/plugins/slack/src/index.js +236 -0
  186. package/dist/plugins/sms77/src/index.js +63 -0
  187. package/dist/plugins/splunk/src/index.js +207 -0
  188. package/dist/plugins/spotify/src/index.js +188 -0
  189. package/dist/plugins/stackby/src/index.js +82 -0
  190. package/dist/plugins/storyblok/src/index.js +141 -0
  191. package/dist/plugins/strapi/src/index.js +152 -0
  192. package/dist/plugins/strava/src/index.js +137 -0
  193. package/dist/plugins/stripe/src/index.js +222 -0
  194. package/dist/plugins/supabase/src/index.js +121 -0
  195. package/dist/plugins/syncromsp/src/index.js +255 -0
  196. package/dist/plugins/tapfiliate/src/index.js +125 -0
  197. package/dist/plugins/telegram/src/index.js +233 -0
  198. package/dist/plugins/thehive/src/index.js +142 -0
  199. package/dist/plugins/thehiveProject/src/index.js +194 -0
  200. package/dist/plugins/todoist/src/index.js +244 -0
  201. package/dist/plugins/travisci/src/index.js +71 -0
  202. package/dist/plugins/trello/src/index.js +341 -0
  203. package/dist/plugins/twake/src/index.js +40 -0
  204. package/dist/plugins/twilio/src/index.js +75 -0
  205. package/dist/plugins/twist/src/index.js +90 -0
  206. package/dist/plugins/twitter/src/index.js +123 -0
  207. package/dist/plugins/unleashedSoftware/src/index.js +84 -0
  208. package/dist/plugins/uplead/src/index.js +59 -0
  209. package/dist/plugins/uproc/src/index.js +34 -0
  210. package/dist/plugins/uptimerobot/src/index.js +264 -0
  211. package/dist/plugins/urlscanio/src/index.js +64 -0
  212. package/dist/plugins/vero/src/index.js +80 -0
  213. package/dist/plugins/vonage/src/index.js +42 -0
  214. package/dist/plugins/wekan/src/index.js +91 -0
  215. package/dist/plugins/woocommerce/src/index.js +92 -0
  216. package/dist/plugins/wordpress/src/index.js +121 -0
  217. package/dist/plugins/xero/src/index.js +136 -0
  218. package/dist/plugins/yourls/src/index.js +56 -0
  219. package/dist/plugins/zammad/src/index.js +91 -0
  220. package/dist/plugins/zendesk/src/index.js +137 -0
  221. package/dist/plugins/zoho/src/index.js +85 -0
  222. package/dist/plugins/zoom/src/index.js +122 -0
  223. package/dist/plugins/zulip/src/index.js +170 -0
  224. package/dist/sdk.d.ts +38 -0
  225. package/dist/sdk.js +105 -0
  226. package/dist/utils/cli.d.ts +13 -0
  227. package/dist/utils/cli.js +32 -0
  228. package/dist/utils/output.d.ts +4 -0
  229. package/dist/utils/output.js +13 -0
  230. package/package.json +57 -0
@@ -0,0 +1,711 @@
1
+ async function apiRequest(baseUrl, apiKey, method, endpoint, body, qs) {
2
+ const url = new URL(`${baseUrl}${endpoint}`);
3
+ if (qs) {
4
+ for (const [k, v] of Object.entries(qs)) {
5
+ if (v !== undefined)
6
+ url.searchParams.set(k, String(v));
7
+ }
8
+ }
9
+ const opts = {
10
+ method,
11
+ headers: {
12
+ "Content-Type": "application/json",
13
+ "Api-Token": apiKey,
14
+ },
15
+ };
16
+ if (body && Object.keys(body).length > 0) {
17
+ opts.body = JSON.stringify(body);
18
+ }
19
+ const res = await fetch(url.toString(), opts);
20
+ if (!res.ok) {
21
+ const text = await res.text();
22
+ throw new Error(`ActiveCampaign API error ${res.status}: ${text}`);
23
+ }
24
+ if (res.status === 204)
25
+ return { ok: true };
26
+ return res.json();
27
+ }
28
+ async function paginate(baseUrl, apiKey, endpoint, dataKey, limit) {
29
+ const results = [];
30
+ let offset = 0;
31
+ const pageSize = 100;
32
+ while (true) {
33
+ const data = (await apiRequest(baseUrl, apiKey, "GET", endpoint, undefined, {
34
+ limit: pageSize,
35
+ offset,
36
+ }));
37
+ const items = data[dataKey] ?? [];
38
+ results.push(...items);
39
+ if (limit && results.length >= limit)
40
+ return results.slice(0, limit);
41
+ const meta = data.meta;
42
+ if (!meta?.total || results.length >= meta.total)
43
+ break;
44
+ offset = results.length;
45
+ }
46
+ return results;
47
+ }
48
+ function getConn(ctx) {
49
+ return {
50
+ baseUrl: ctx.connection.config.apiUrl.replace(/\/$/, ""),
51
+ apiKey: ctx.connection.config.apiKey,
52
+ };
53
+ }
54
+ export default function activeCampaign(rl) {
55
+ rl.setName("activeCampaign");
56
+ rl.setVersion("0.1.0");
57
+ rl.setConnectionSchema({
58
+ apiUrl: {
59
+ type: "string",
60
+ required: true,
61
+ description: "ActiveCampaign API URL (e.g. https://youraccountname.api-us1.com)",
62
+ env: "ACTIVE_CAMPAIGN_API_URL",
63
+ },
64
+ apiKey: {
65
+ type: "string",
66
+ required: true,
67
+ description: "ActiveCampaign API key",
68
+ env: "ACTIVE_CAMPAIGN_API_KEY",
69
+ },
70
+ });
71
+ // ── Contact ─────────────────────────────────────────
72
+ rl.registerAction("contact.create", {
73
+ description: "Create a new contact (or update if exists with updateIfExists flag)",
74
+ inputSchema: {
75
+ email: { type: "string", required: true, description: "Contact email" },
76
+ firstName: { type: "string", required: false, description: "First name" },
77
+ lastName: { type: "string", required: false, description: "Last name" },
78
+ phone: { type: "string", required: false, description: "Phone number" },
79
+ updateIfExists: { type: "boolean", required: false, description: "Update if contact exists" },
80
+ },
81
+ async execute(input, ctx) {
82
+ const { email, firstName, lastName, phone, updateIfExists, ...rest } = input;
83
+ const { baseUrl, apiKey } = getConn(ctx);
84
+ const contact = { email, ...rest };
85
+ if (firstName)
86
+ contact.firstName = firstName;
87
+ if (lastName)
88
+ contact.lastName = lastName;
89
+ if (phone)
90
+ contact.phone = phone;
91
+ const endpoint = updateIfExists ? "/api/3/contact/sync" : "/api/3/contacts";
92
+ return apiRequest(baseUrl, apiKey, "POST", endpoint, { contact });
93
+ },
94
+ });
95
+ rl.registerAction("contact.get", {
96
+ description: "Get a contact by ID",
97
+ inputSchema: {
98
+ contactId: { type: "string", required: true, description: "Contact ID" },
99
+ },
100
+ async execute(input, ctx) {
101
+ const { contactId } = input;
102
+ const { baseUrl, apiKey } = getConn(ctx);
103
+ return apiRequest(baseUrl, apiKey, "GET", `/api/3/contacts/${contactId}`);
104
+ },
105
+ });
106
+ rl.registerAction("contact.list", {
107
+ description: "List all contacts",
108
+ inputSchema: {
109
+ limit: { type: "number", required: false, description: "Max results to return" },
110
+ },
111
+ async execute(input, ctx) {
112
+ const { limit } = input ?? {};
113
+ const { baseUrl, apiKey } = getConn(ctx);
114
+ return paginate(baseUrl, apiKey, "/api/3/contacts", "contacts", limit);
115
+ },
116
+ });
117
+ rl.registerAction("contact.update", {
118
+ description: "Update a contact",
119
+ inputSchema: {
120
+ contactId: { type: "string", required: true, description: "Contact ID" },
121
+ email: { type: "string", required: false, description: "Email" },
122
+ firstName: { type: "string", required: false, description: "First name" },
123
+ lastName: { type: "string", required: false, description: "Last name" },
124
+ phone: { type: "string", required: false, description: "Phone number" },
125
+ },
126
+ async execute(input, ctx) {
127
+ const { contactId, ...fields } = input;
128
+ const { baseUrl, apiKey } = getConn(ctx);
129
+ return apiRequest(baseUrl, apiKey, "PUT", `/api/3/contacts/${contactId}`, {
130
+ contact: fields,
131
+ });
132
+ },
133
+ });
134
+ rl.registerAction("contact.delete", {
135
+ description: "Delete a contact",
136
+ inputSchema: {
137
+ contactId: { type: "string", required: true, description: "Contact ID" },
138
+ },
139
+ async execute(input, ctx) {
140
+ const { contactId } = input;
141
+ const { baseUrl, apiKey } = getConn(ctx);
142
+ return apiRequest(baseUrl, apiKey, "DELETE", `/api/3/contacts/${contactId}`);
143
+ },
144
+ });
145
+ // ── Account ─────────────────────────────────────────
146
+ rl.registerAction("account.create", {
147
+ description: "Create a new account",
148
+ inputSchema: {
149
+ name: { type: "string", required: true, description: "Account name" },
150
+ },
151
+ async execute(input, ctx) {
152
+ const { name, ...rest } = input;
153
+ const { baseUrl, apiKey } = getConn(ctx);
154
+ return apiRequest(baseUrl, apiKey, "POST", "/api/3/accounts", {
155
+ account: { name, ...rest },
156
+ });
157
+ },
158
+ });
159
+ rl.registerAction("account.get", {
160
+ description: "Get an account by ID",
161
+ inputSchema: {
162
+ accountId: { type: "string", required: true, description: "Account ID" },
163
+ },
164
+ async execute(input, ctx) {
165
+ const { accountId } = input;
166
+ const { baseUrl, apiKey } = getConn(ctx);
167
+ return apiRequest(baseUrl, apiKey, "GET", `/api/3/accounts/${accountId}`);
168
+ },
169
+ });
170
+ rl.registerAction("account.list", {
171
+ description: "List all accounts",
172
+ inputSchema: {
173
+ limit: { type: "number", required: false, description: "Max results to return" },
174
+ },
175
+ async execute(input, ctx) {
176
+ const { limit } = input ?? {};
177
+ const { baseUrl, apiKey } = getConn(ctx);
178
+ return paginate(baseUrl, apiKey, "/api/3/accounts", "accounts", limit);
179
+ },
180
+ });
181
+ rl.registerAction("account.update", {
182
+ description: "Update an account",
183
+ inputSchema: {
184
+ accountId: { type: "string", required: true, description: "Account ID" },
185
+ name: { type: "string", required: false, description: "Account name" },
186
+ },
187
+ async execute(input, ctx) {
188
+ const { accountId, ...fields } = input;
189
+ const { baseUrl, apiKey } = getConn(ctx);
190
+ return apiRequest(baseUrl, apiKey, "PUT", `/api/3/accounts/${accountId}`, {
191
+ account: fields,
192
+ });
193
+ },
194
+ });
195
+ rl.registerAction("account.delete", {
196
+ description: "Delete an account",
197
+ inputSchema: {
198
+ accountId: { type: "string", required: true, description: "Account ID" },
199
+ },
200
+ async execute(input, ctx) {
201
+ const { accountId } = input;
202
+ const { baseUrl, apiKey } = getConn(ctx);
203
+ return apiRequest(baseUrl, apiKey, "DELETE", `/api/3/accounts/${accountId}`);
204
+ },
205
+ });
206
+ // ── Account Contact ─────────────────────────────────
207
+ rl.registerAction("accountContact.create", {
208
+ description: "Associate a contact with an account",
209
+ inputSchema: {
210
+ contact: { type: "string", required: true, description: "Contact ID" },
211
+ account: { type: "string", required: true, description: "Account ID" },
212
+ jobTitle: { type: "string", required: false, description: "Job title" },
213
+ },
214
+ async execute(input, ctx) {
215
+ const { contact, account, ...rest } = input;
216
+ const { baseUrl, apiKey } = getConn(ctx);
217
+ return apiRequest(baseUrl, apiKey, "POST", "/api/3/accountContacts", {
218
+ accountContact: { contact, account, ...rest },
219
+ });
220
+ },
221
+ });
222
+ rl.registerAction("accountContact.update", {
223
+ description: "Update an account-contact association",
224
+ inputSchema: {
225
+ accountContactId: { type: "string", required: true, description: "Account Contact ID" },
226
+ jobTitle: { type: "string", required: false, description: "Job title" },
227
+ },
228
+ async execute(input, ctx) {
229
+ const { accountContactId, ...fields } = input;
230
+ const { baseUrl, apiKey } = getConn(ctx);
231
+ return apiRequest(baseUrl, apiKey, "PUT", `/api/3/accountContacts/${accountContactId}`, {
232
+ accountContact: fields,
233
+ });
234
+ },
235
+ });
236
+ rl.registerAction("accountContact.delete", {
237
+ description: "Remove a contact from an account",
238
+ inputSchema: {
239
+ accountContactId: { type: "string", required: true, description: "Account Contact ID" },
240
+ },
241
+ async execute(input, ctx) {
242
+ const { accountContactId } = input;
243
+ const { baseUrl, apiKey } = getConn(ctx);
244
+ return apiRequest(baseUrl, apiKey, "DELETE", `/api/3/accountContacts/${accountContactId}`);
245
+ },
246
+ });
247
+ // ── Contact Tag ─────────────────────────────────────
248
+ rl.registerAction("contactTag.add", {
249
+ description: "Add a tag to a contact",
250
+ inputSchema: {
251
+ contactId: { type: "string", required: true, description: "Contact ID" },
252
+ tagId: { type: "string", required: true, description: "Tag ID" },
253
+ },
254
+ async execute(input, ctx) {
255
+ const { contactId, tagId } = input;
256
+ const { baseUrl, apiKey } = getConn(ctx);
257
+ return apiRequest(baseUrl, apiKey, "POST", "/api/3/contactTags", {
258
+ contactTag: { contact: contactId, tag: tagId },
259
+ });
260
+ },
261
+ });
262
+ rl.registerAction("contactTag.remove", {
263
+ description: "Remove a tag from a contact",
264
+ inputSchema: {
265
+ contactTagId: { type: "string", required: true, description: "Contact Tag ID" },
266
+ },
267
+ async execute(input, ctx) {
268
+ const { contactTagId } = input;
269
+ const { baseUrl, apiKey } = getConn(ctx);
270
+ return apiRequest(baseUrl, apiKey, "DELETE", `/api/3/contactTags/${contactTagId}`);
271
+ },
272
+ });
273
+ // ── Contact List ────────────────────────────────────
274
+ rl.registerAction("contactList.add", {
275
+ description: "Add a contact to a list",
276
+ inputSchema: {
277
+ contactId: { type: "string", required: true, description: "Contact ID" },
278
+ listId: { type: "string", required: true, description: "List ID" },
279
+ },
280
+ async execute(input, ctx) {
281
+ const { contactId, listId } = input;
282
+ const { baseUrl, apiKey } = getConn(ctx);
283
+ return apiRequest(baseUrl, apiKey, "POST", "/api/3/contactLists", {
284
+ contactList: { list: listId, contact: contactId, status: 1 },
285
+ });
286
+ },
287
+ });
288
+ rl.registerAction("contactList.remove", {
289
+ description: "Remove a contact from a list",
290
+ inputSchema: {
291
+ contactId: { type: "string", required: true, description: "Contact ID" },
292
+ listId: { type: "string", required: true, description: "List ID" },
293
+ },
294
+ async execute(input, ctx) {
295
+ const { contactId, listId } = input;
296
+ const { baseUrl, apiKey } = getConn(ctx);
297
+ return apiRequest(baseUrl, apiKey, "POST", "/api/3/contactLists", {
298
+ contactList: { list: listId, contact: contactId, status: 2 },
299
+ });
300
+ },
301
+ });
302
+ // ── List ────────────────────────────────────────────
303
+ rl.registerAction("list.list", {
304
+ description: "List all lists",
305
+ inputSchema: {
306
+ limit: { type: "number", required: false, description: "Max results to return" },
307
+ },
308
+ async execute(input, ctx) {
309
+ const { limit } = input ?? {};
310
+ const { baseUrl, apiKey } = getConn(ctx);
311
+ return paginate(baseUrl, apiKey, "/api/3/lists", "lists", limit);
312
+ },
313
+ });
314
+ // ── Tag ─────────────────────────────────────────────
315
+ rl.registerAction("tag.create", {
316
+ description: "Create a new tag",
317
+ inputSchema: {
318
+ name: { type: "string", required: true, description: "Tag name" },
319
+ tagType: { type: "string", required: true, description: "Tag type (contact, template, etc)" },
320
+ },
321
+ async execute(input, ctx) {
322
+ const { name, tagType, ...rest } = input;
323
+ const { baseUrl, apiKey } = getConn(ctx);
324
+ return apiRequest(baseUrl, apiKey, "POST", "/api/3/tags", {
325
+ tag: { tag: name, tagType, ...rest },
326
+ });
327
+ },
328
+ });
329
+ rl.registerAction("tag.get", {
330
+ description: "Get a tag by ID",
331
+ inputSchema: {
332
+ tagId: { type: "string", required: true, description: "Tag ID" },
333
+ },
334
+ async execute(input, ctx) {
335
+ const { tagId } = input;
336
+ const { baseUrl, apiKey } = getConn(ctx);
337
+ return apiRequest(baseUrl, apiKey, "GET", `/api/3/tags/${tagId}`);
338
+ },
339
+ });
340
+ rl.registerAction("tag.list", {
341
+ description: "List all tags",
342
+ inputSchema: {
343
+ limit: { type: "number", required: false, description: "Max results to return" },
344
+ },
345
+ async execute(input, ctx) {
346
+ const { limit } = input ?? {};
347
+ const { baseUrl, apiKey } = getConn(ctx);
348
+ return paginate(baseUrl, apiKey, "/api/3/tags", "tags", limit);
349
+ },
350
+ });
351
+ rl.registerAction("tag.update", {
352
+ description: "Update a tag",
353
+ inputSchema: {
354
+ tagId: { type: "string", required: true, description: "Tag ID" },
355
+ name: { type: "string", required: false, description: "Tag name" },
356
+ tagType: { type: "string", required: false, description: "Tag type" },
357
+ },
358
+ async execute(input, ctx) {
359
+ const { tagId, name, tagType, ...rest } = input;
360
+ const { baseUrl, apiKey } = getConn(ctx);
361
+ const tag = { ...rest };
362
+ if (name)
363
+ tag.tag = name;
364
+ if (tagType)
365
+ tag.tagType = tagType;
366
+ return apiRequest(baseUrl, apiKey, "PUT", `/api/3/tags/${tagId}`, { tag });
367
+ },
368
+ });
369
+ rl.registerAction("tag.delete", {
370
+ description: "Delete a tag",
371
+ inputSchema: {
372
+ tagId: { type: "string", required: true, description: "Tag ID" },
373
+ },
374
+ async execute(input, ctx) {
375
+ const { tagId } = input;
376
+ const { baseUrl, apiKey } = getConn(ctx);
377
+ return apiRequest(baseUrl, apiKey, "DELETE", `/api/3/tags/${tagId}`);
378
+ },
379
+ });
380
+ // ── Deal ────────────────────────────────────────────
381
+ rl.registerAction("deal.create", {
382
+ description: "Create a new deal",
383
+ inputSchema: {
384
+ title: { type: "string", required: true, description: "Deal title" },
385
+ contact: { type: "string", required: true, description: "Contact ID" },
386
+ value: { type: "number", required: true, description: "Deal value in cents" },
387
+ currency: { type: "string", required: true, description: "Currency code (e.g. USD)" },
388
+ group: { type: "string", required: false, description: "Pipeline/group ID" },
389
+ stage: { type: "string", required: false, description: "Stage ID" },
390
+ owner: { type: "string", required: false, description: "Owner ID" },
391
+ },
392
+ async execute(input, ctx) {
393
+ const { title, contact, value, currency, ...rest } = input;
394
+ const { baseUrl, apiKey } = getConn(ctx);
395
+ return apiRequest(baseUrl, apiKey, "POST", "/api/3/deals", {
396
+ deal: { title, contact, value, currency, ...rest },
397
+ });
398
+ },
399
+ });
400
+ rl.registerAction("deal.get", {
401
+ description: "Get a deal by ID",
402
+ inputSchema: {
403
+ dealId: { type: "string", required: true, description: "Deal ID" },
404
+ },
405
+ async execute(input, ctx) {
406
+ const { dealId } = input;
407
+ const { baseUrl, apiKey } = getConn(ctx);
408
+ return apiRequest(baseUrl, apiKey, "GET", `/api/3/deals/${dealId}`);
409
+ },
410
+ });
411
+ rl.registerAction("deal.list", {
412
+ description: "List all deals",
413
+ inputSchema: {
414
+ limit: { type: "number", required: false, description: "Max results to return" },
415
+ },
416
+ async execute(input, ctx) {
417
+ const { limit } = input ?? {};
418
+ const { baseUrl, apiKey } = getConn(ctx);
419
+ return paginate(baseUrl, apiKey, "/api/3/deals", "deals", limit);
420
+ },
421
+ });
422
+ rl.registerAction("deal.update", {
423
+ description: "Update a deal",
424
+ inputSchema: {
425
+ dealId: { type: "string", required: true, description: "Deal ID" },
426
+ title: { type: "string", required: false, description: "Deal title" },
427
+ value: { type: "number", required: false, description: "Deal value in cents" },
428
+ },
429
+ async execute(input, ctx) {
430
+ const { dealId, ...fields } = input;
431
+ const { baseUrl, apiKey } = getConn(ctx);
432
+ return apiRequest(baseUrl, apiKey, "PUT", `/api/3/deals/${dealId}`, { deal: fields });
433
+ },
434
+ });
435
+ rl.registerAction("deal.delete", {
436
+ description: "Delete a deal",
437
+ inputSchema: {
438
+ dealId: { type: "string", required: true, description: "Deal ID" },
439
+ },
440
+ async execute(input, ctx) {
441
+ const { dealId } = input;
442
+ const { baseUrl, apiKey } = getConn(ctx);
443
+ return apiRequest(baseUrl, apiKey, "DELETE", `/api/3/deals/${dealId}`);
444
+ },
445
+ });
446
+ rl.registerAction("deal.createNote", {
447
+ description: "Add a note to a deal",
448
+ inputSchema: {
449
+ dealId: { type: "string", required: true, description: "Deal ID" },
450
+ note: { type: "string", required: true, description: "Note content" },
451
+ },
452
+ async execute(input, ctx) {
453
+ const { dealId, note } = input;
454
+ const { baseUrl, apiKey } = getConn(ctx);
455
+ return apiRequest(baseUrl, apiKey, "POST", `/api/3/deals/${dealId}/notes`, {
456
+ note: { note },
457
+ });
458
+ },
459
+ });
460
+ rl.registerAction("deal.updateNote", {
461
+ description: "Update a note on a deal",
462
+ inputSchema: {
463
+ dealId: { type: "string", required: true, description: "Deal ID" },
464
+ noteId: { type: "string", required: true, description: "Note ID" },
465
+ note: { type: "string", required: true, description: "Note content" },
466
+ },
467
+ async execute(input, ctx) {
468
+ const { dealId, noteId, note } = input;
469
+ const { baseUrl, apiKey } = getConn(ctx);
470
+ return apiRequest(baseUrl, apiKey, "PUT", `/api/3/deals/${dealId}/notes/${noteId}`, {
471
+ note: { note },
472
+ });
473
+ },
474
+ });
475
+ // ── Connection ──────────────────────────────────────
476
+ rl.registerAction("connection.create", {
477
+ description: "Create a new connection (e-commerce integration)",
478
+ inputSchema: {
479
+ service: { type: "string", required: true, description: "Service name" },
480
+ externalid: { type: "string", required: true, description: "External ID" },
481
+ name: { type: "string", required: true, description: "Connection name" },
482
+ logoUrl: { type: "string", required: true, description: "Logo URL" },
483
+ linkUrl: { type: "string", required: true, description: "Link URL" },
484
+ },
485
+ async execute(input, ctx) {
486
+ const { baseUrl, apiKey } = getConn(ctx);
487
+ return apiRequest(baseUrl, apiKey, "POST", "/api/3/connections", {
488
+ connection: input,
489
+ });
490
+ },
491
+ });
492
+ rl.registerAction("connection.get", {
493
+ description: "Get a connection by ID",
494
+ inputSchema: {
495
+ connectionId: { type: "string", required: true, description: "Connection ID" },
496
+ },
497
+ async execute(input, ctx) {
498
+ const { connectionId } = input;
499
+ const { baseUrl, apiKey } = getConn(ctx);
500
+ return apiRequest(baseUrl, apiKey, "GET", `/api/3/connections/${connectionId}`);
501
+ },
502
+ });
503
+ rl.registerAction("connection.list", {
504
+ description: "List all connections",
505
+ inputSchema: {
506
+ limit: { type: "number", required: false, description: "Max results to return" },
507
+ },
508
+ async execute(input, ctx) {
509
+ const { limit } = input ?? {};
510
+ const { baseUrl, apiKey } = getConn(ctx);
511
+ return paginate(baseUrl, apiKey, "/api/3/connections", "connections", limit);
512
+ },
513
+ });
514
+ rl.registerAction("connection.update", {
515
+ description: "Update a connection",
516
+ inputSchema: {
517
+ connectionId: { type: "string", required: true, description: "Connection ID" },
518
+ },
519
+ async execute(input, ctx) {
520
+ const { connectionId, ...fields } = input;
521
+ const { baseUrl, apiKey } = getConn(ctx);
522
+ return apiRequest(baseUrl, apiKey, "PUT", `/api/3/connections/${connectionId}`, {
523
+ connection: fields,
524
+ });
525
+ },
526
+ });
527
+ rl.registerAction("connection.delete", {
528
+ description: "Delete a connection",
529
+ inputSchema: {
530
+ connectionId: { type: "string", required: true, description: "Connection ID" },
531
+ },
532
+ async execute(input, ctx) {
533
+ const { connectionId } = input;
534
+ const { baseUrl, apiKey } = getConn(ctx);
535
+ return apiRequest(baseUrl, apiKey, "DELETE", `/api/3/connections/${connectionId}`);
536
+ },
537
+ });
538
+ // ── E-Commerce Customer ─────────────────────────────
539
+ rl.registerAction("ecomCustomer.create", {
540
+ description: "Create an e-commerce customer",
541
+ inputSchema: {
542
+ connectionid: { type: "string", required: true, description: "Connection ID" },
543
+ externalid: { type: "string", required: true, description: "External customer ID" },
544
+ email: { type: "string", required: true, description: "Customer email" },
545
+ acceptsMarketing: { type: "boolean", required: false, description: "Accepts marketing" },
546
+ },
547
+ async execute(input, ctx) {
548
+ const { acceptsMarketing, ...rest } = input;
549
+ const { baseUrl, apiKey } = getConn(ctx);
550
+ const customer = { ...rest };
551
+ if (acceptsMarketing !== undefined) {
552
+ customer.acceptsMarketing = acceptsMarketing ? "1" : "0";
553
+ }
554
+ return apiRequest(baseUrl, apiKey, "POST", "/api/3/ecomCustomers", {
555
+ ecomCustomer: customer,
556
+ });
557
+ },
558
+ });
559
+ rl.registerAction("ecomCustomer.get", {
560
+ description: "Get an e-commerce customer by ID",
561
+ inputSchema: {
562
+ customerId: { type: "string", required: true, description: "Customer ID" },
563
+ },
564
+ async execute(input, ctx) {
565
+ const { customerId } = input;
566
+ const { baseUrl, apiKey } = getConn(ctx);
567
+ return apiRequest(baseUrl, apiKey, "GET", `/api/3/ecomCustomers/${customerId}`);
568
+ },
569
+ });
570
+ rl.registerAction("ecomCustomer.list", {
571
+ description: "List all e-commerce customers",
572
+ inputSchema: {
573
+ limit: { type: "number", required: false, description: "Max results to return" },
574
+ },
575
+ async execute(input, ctx) {
576
+ const { limit } = input ?? {};
577
+ const { baseUrl, apiKey } = getConn(ctx);
578
+ return paginate(baseUrl, apiKey, "/api/3/ecomCustomers", "ecomCustomers", limit);
579
+ },
580
+ });
581
+ rl.registerAction("ecomCustomer.update", {
582
+ description: "Update an e-commerce customer",
583
+ inputSchema: {
584
+ customerId: { type: "string", required: true, description: "Customer ID" },
585
+ acceptsMarketing: { type: "boolean", required: false, description: "Accepts marketing" },
586
+ },
587
+ async execute(input, ctx) {
588
+ const { customerId, acceptsMarketing, ...rest } = input;
589
+ const { baseUrl, apiKey } = getConn(ctx);
590
+ const customer = { ...rest };
591
+ if (acceptsMarketing !== undefined) {
592
+ customer.acceptsMarketing = acceptsMarketing ? "1" : "0";
593
+ }
594
+ return apiRequest(baseUrl, apiKey, "PUT", `/api/3/ecomCustomers/${customerId}`, {
595
+ ecomCustomer: customer,
596
+ });
597
+ },
598
+ });
599
+ rl.registerAction("ecomCustomer.delete", {
600
+ description: "Delete an e-commerce customer",
601
+ inputSchema: {
602
+ customerId: { type: "string", required: true, description: "Customer ID" },
603
+ },
604
+ async execute(input, ctx) {
605
+ const { customerId } = input;
606
+ const { baseUrl, apiKey } = getConn(ctx);
607
+ return apiRequest(baseUrl, apiKey, "DELETE", `/api/3/ecomCustomers/${customerId}`);
608
+ },
609
+ });
610
+ // ── E-Commerce Order ────────────────────────────────
611
+ rl.registerAction("ecomOrder.create", {
612
+ description: "Create an e-commerce order",
613
+ inputSchema: {
614
+ source: { type: "string", required: true, description: "Order source" },
615
+ email: { type: "string", required: true, description: "Customer email" },
616
+ totalPrice: { type: "number", required: true, description: "Total price in cents" },
617
+ currency: { type: "string", required: true, description: "Currency code (e.g. USD)" },
618
+ externalCreatedDate: { type: "string", required: true, description: "ISO date string" },
619
+ connectionid: { type: "string", required: true, description: "Connection ID" },
620
+ customerid: { type: "string", required: true, description: "Customer ID" },
621
+ orderProducts: { type: "array", required: false, description: "Array of order products" },
622
+ },
623
+ async execute(input, ctx) {
624
+ const { currency, ...rest } = input;
625
+ const { baseUrl, apiKey } = getConn(ctx);
626
+ return apiRequest(baseUrl, apiKey, "POST", "/api/3/ecomOrders", {
627
+ ecomOrder: { ...rest, currency: currency.toUpperCase() },
628
+ });
629
+ },
630
+ });
631
+ rl.registerAction("ecomOrder.get", {
632
+ description: "Get an e-commerce order by ID",
633
+ inputSchema: {
634
+ orderId: { type: "string", required: true, description: "Order ID" },
635
+ },
636
+ async execute(input, ctx) {
637
+ const { orderId } = input;
638
+ const { baseUrl, apiKey } = getConn(ctx);
639
+ return apiRequest(baseUrl, apiKey, "GET", `/api/3/ecomOrders/${orderId}`);
640
+ },
641
+ });
642
+ rl.registerAction("ecomOrder.list", {
643
+ description: "List all e-commerce orders",
644
+ inputSchema: {
645
+ limit: { type: "number", required: false, description: "Max results to return" },
646
+ },
647
+ async execute(input, ctx) {
648
+ const { limit } = input ?? {};
649
+ const { baseUrl, apiKey } = getConn(ctx);
650
+ return paginate(baseUrl, apiKey, "/api/3/ecomOrders", "ecomOrders", limit);
651
+ },
652
+ });
653
+ rl.registerAction("ecomOrder.update", {
654
+ description: "Update an e-commerce order",
655
+ inputSchema: {
656
+ orderId: { type: "string", required: true, description: "Order ID" },
657
+ },
658
+ async execute(input, ctx) {
659
+ const { orderId, ...fields } = input;
660
+ const { baseUrl, apiKey } = getConn(ctx);
661
+ return apiRequest(baseUrl, apiKey, "PUT", `/api/3/ecomOrders/${orderId}`, {
662
+ ecomOrder: fields,
663
+ });
664
+ },
665
+ });
666
+ rl.registerAction("ecomOrder.delete", {
667
+ description: "Delete an e-commerce order",
668
+ inputSchema: {
669
+ orderId: { type: "string", required: true, description: "Order ID" },
670
+ },
671
+ async execute(input, ctx) {
672
+ const { orderId } = input;
673
+ const { baseUrl, apiKey } = getConn(ctx);
674
+ return apiRequest(baseUrl, apiKey, "DELETE", `/api/3/ecomOrders/${orderId}`);
675
+ },
676
+ });
677
+ // ── E-Commerce Order Products ───────────────────────
678
+ rl.registerAction("ecomOrderProduct.getByProductId", {
679
+ description: "Get an order product by product ID",
680
+ inputSchema: {
681
+ productId: { type: "string", required: true, description: "Product ID" },
682
+ },
683
+ async execute(input, ctx) {
684
+ const { productId } = input;
685
+ const { baseUrl, apiKey } = getConn(ctx);
686
+ return apiRequest(baseUrl, apiKey, "GET", `/api/3/ecomOrderProducts/${productId}`);
687
+ },
688
+ });
689
+ rl.registerAction("ecomOrderProduct.getByOrderId", {
690
+ description: "Get order products for an order",
691
+ inputSchema: {
692
+ orderId: { type: "string", required: true, description: "Order ID" },
693
+ },
694
+ async execute(input, ctx) {
695
+ const { orderId } = input;
696
+ const { baseUrl, apiKey } = getConn(ctx);
697
+ return apiRequest(baseUrl, apiKey, "GET", `/api/3/ecomOrders/${orderId}/orderProducts`);
698
+ },
699
+ });
700
+ rl.registerAction("ecomOrderProduct.list", {
701
+ description: "List all e-commerce order products",
702
+ inputSchema: {
703
+ limit: { type: "number", required: false, description: "Max results to return" },
704
+ },
705
+ async execute(input, ctx) {
706
+ const { limit } = input ?? {};
707
+ const { baseUrl, apiKey } = getConn(ctx);
708
+ return paginate(baseUrl, apiKey, "/api/3/ecomOrderProducts", "ecomOrderProducts", limit);
709
+ },
710
+ });
711
+ }