runline 0.2.1 → 0.3.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 (203) hide show
  1. package/dist/commands/auth.d.ts +7 -0
  2. package/dist/commands/auth.js +96 -0
  3. package/dist/config/loader.d.ts +11 -0
  4. package/dist/config/loader.js +46 -0
  5. package/dist/core/engine.js +7 -1
  6. package/dist/core/oauth.d.ts +46 -0
  7. package/dist/core/oauth.js +145 -0
  8. package/dist/index.d.ts +4 -2
  9. package/dist/index.js +2 -1
  10. package/dist/main.js +28 -0
  11. package/dist/plugin/api.d.ts +7 -1
  12. package/dist/plugin/api.js +7 -0
  13. package/dist/plugin/types.d.ts +47 -0
  14. package/dist/plugins/actionNetwork/src/index.js +118 -25
  15. package/dist/plugins/activeCampaign/src/index.js +184 -38
  16. package/dist/plugins/adalo/src/index.js +40 -8
  17. package/dist/plugins/affinity/src/index.js +100 -20
  18. package/dist/plugins/agileCrm/src/index.js +115 -27
  19. package/dist/plugins/airtable/src/index.js +94 -19
  20. package/dist/plugins/airtop/src/index.js +266 -62
  21. package/dist/plugins/apiTemplateIo/src/index.js +25 -5
  22. package/dist/plugins/asana/src/index.js +195 -41
  23. package/dist/plugins/autopilot/src/index.js +39 -8
  24. package/dist/plugins/bambooHr/src/index.js +109 -22
  25. package/dist/plugins/bannerbear/src/index.js +36 -8
  26. package/dist/plugins/baserow/src/index.js +35 -7
  27. package/dist/plugins/beeminder/src/index.js +198 -40
  28. package/dist/plugins/bitly/src/index.js +46 -10
  29. package/dist/plugins/bitwarden/src/index.js +167 -36
  30. package/dist/plugins/box/src/index.js +172 -37
  31. package/dist/plugins/brandfetch/src/index.js +5 -1
  32. package/dist/plugins/brevo/src/index.js +136 -29
  33. package/dist/plugins/bubble/src/index.js +76 -17
  34. package/dist/plugins/chargebee/src/index.js +35 -7
  35. package/dist/plugins/circleci/src/index.js +50 -10
  36. package/dist/plugins/ciscoWebex/src/index.js +131 -27
  37. package/dist/plugins/clearbit/src/index.js +76 -17
  38. package/dist/plugins/clickup/src/index.js +500 -107
  39. package/dist/plugins/clockify/src/index.js +229 -47
  40. package/dist/plugins/cloudflare/src/index.js +28 -6
  41. package/dist/plugins/cockpit/src/index.js +54 -12
  42. package/dist/plugins/coda/src/index.js +81 -19
  43. package/dist/plugins/coingecko/src/index.js +157 -33
  44. package/dist/plugins/contentful/src/index.js +85 -17
  45. package/dist/plugins/convertkit/src/index.js +74 -18
  46. package/dist/plugins/copper/src/index.js +59 -11
  47. package/dist/plugins/cortex/src/index.js +55 -13
  48. package/dist/plugins/currents/src/index.js +310 -71
  49. package/dist/plugins/customerIo/src/index.js +112 -23
  50. package/dist/plugins/databricks/src/index.js +549 -115
  51. package/dist/plugins/deepl/src/index.js +26 -6
  52. package/dist/plugins/demio/src/index.js +56 -11
  53. package/dist/plugins/dhl/src/index.js +16 -3
  54. package/dist/plugins/discord/src/index.js +141 -31
  55. package/dist/plugins/discourse/src/index.js +136 -31
  56. package/dist/plugins/disqus/src/index.js +96 -20
  57. package/dist/plugins/docker/src/index.js +20 -4
  58. package/dist/plugins/drift/src/index.js +19 -5
  59. package/dist/plugins/dropbox/src/index.js +139 -30
  60. package/dist/plugins/dropcontact/src/index.js +21 -4
  61. package/dist/plugins/egoi/src/index.js +61 -15
  62. package/dist/plugins/elasticsearch/src/index.js +59 -13
  63. package/dist/plugins/emelia/src/index.js +95 -19
  64. package/dist/plugins/erpnext/src/index.js +74 -15
  65. package/dist/plugins/facebookGraph/src/index.js +52 -11
  66. package/dist/plugins/freshdesk/src/index.js +220 -48
  67. package/dist/plugins/freshservice/src/index.js +39 -9
  68. package/dist/plugins/freshworksCrm/src/index.js +58 -12
  69. package/dist/plugins/getresponse/src/index.js +87 -18
  70. package/dist/plugins/ghost/src/index.js +114 -26
  71. package/dist/plugins/github/src/index.js +483 -109
  72. package/dist/plugins/gitlab/src/index.js +193 -45
  73. package/dist/plugins/gmail/src/index.js +1075 -0
  74. package/dist/plugins/gong/src/index.js +68 -14
  75. package/dist/plugins/gotify/src/index.js +43 -9
  76. package/dist/plugins/gotowebinar/src/index.js +233 -47
  77. package/dist/plugins/grafana/src/index.js +92 -21
  78. package/dist/plugins/graphql/src/index.js +38 -8
  79. package/dist/plugins/grist/src/index.js +52 -10
  80. package/dist/plugins/hackernews/src/index.js +32 -6
  81. package/dist/plugins/halopsa/src/index.js +131 -26
  82. package/dist/plugins/harvest/src/index.js +182 -42
  83. package/dist/plugins/helpscout/src/index.js +153 -31
  84. package/dist/plugins/highlevel/src/index.js +291 -58
  85. package/dist/plugins/homeAssistant/src/index.js +124 -26
  86. package/dist/plugins/hubspot/src/index.js +163 -29
  87. package/dist/plugins/humanticAi/src/index.js +54 -5
  88. package/dist/plugins/hunter/src/index.js +21 -4
  89. package/dist/plugins/intercom/src/index.js +95 -20
  90. package/dist/plugins/iterable/src/index.js +96 -20
  91. package/dist/plugins/jenkins/src/index.js +75 -17
  92. package/dist/plugins/jira/src/index.js +193 -43
  93. package/dist/plugins/keap/src/index.js +222 -56
  94. package/dist/plugins/kobotoolbox/src/index.js +113 -25
  95. package/dist/plugins/lemlist/src/index.js +79 -18
  96. package/dist/plugins/linear/src/index.js +86 -19
  97. package/dist/plugins/lingvanex/src/index.js +38 -8
  98. package/dist/plugins/linkedin/src/index.js +37 -8
  99. package/dist/plugins/lonescale/src/index.js +41 -9
  100. package/dist/plugins/magento/src/index.js +98 -27
  101. package/dist/plugins/mailcheck/src/index.js +11 -2
  102. package/dist/plugins/mailchimp/src/index.js +193 -42
  103. package/dist/plugins/mailerlite/src/index.js +61 -12
  104. package/dist/plugins/mailgun/src/index.js +39 -7
  105. package/dist/plugins/mailjet/src/index.js +141 -30
  106. package/dist/plugins/mandrill/src/index.js +67 -14
  107. package/dist/plugins/marketstack/src/index.js +56 -10
  108. package/dist/plugins/matrix/src/index.js +97 -20
  109. package/dist/plugins/mattermost/src/index.js +124 -26
  110. package/dist/plugins/mautic/src/index.js +129 -26
  111. package/dist/plugins/medium/src/index.js +64 -13
  112. package/dist/plugins/messagebird/src/index.js +80 -15
  113. package/dist/plugins/metabase/src/index.js +57 -12
  114. package/dist/plugins/misp/src/index.js +135 -33
  115. package/dist/plugins/mocean/src/index.js +33 -7
  116. package/dist/plugins/monday/src/index.js +97 -23
  117. package/dist/plugins/monicaCrm/src/index.js +112 -23
  118. package/dist/plugins/msg91/src/index.js +11 -2
  119. package/dist/plugins/nasa/src/index.js +108 -21
  120. package/dist/plugins/netlify/src/index.js +28 -6
  121. package/dist/plugins/netscalerAdc/src/index.js +144 -29
  122. package/dist/plugins/nextcloud/src/index.js +103 -20
  123. package/dist/plugins/nocodb/src/index.js +57 -11
  124. package/dist/plugins/notion/src/index.js +148 -37
  125. package/dist/plugins/npm/src/index.js +59 -12
  126. package/dist/plugins/odoo/src/index.js +102 -20
  127. package/dist/plugins/okta/src/index.js +50 -10
  128. package/dist/plugins/oneSimpleApi/src/index.js +84 -17
  129. package/dist/plugins/onfleet/src/index.js +139 -32
  130. package/dist/plugins/openThesaurus/src/index.js +46 -9
  131. package/dist/plugins/openweathermap/src/index.js +31 -6
  132. package/dist/plugins/oura/src/index.js +36 -7
  133. package/dist/plugins/paddle/src/index.js +80 -17
  134. package/dist/plugins/pagerduty/src/index.js +53 -12
  135. package/dist/plugins/paypal/src/index.js +51 -11
  136. package/dist/plugins/peekalink/src/index.js +12 -3
  137. package/dist/plugins/phantombuster/src/index.js +39 -8
  138. package/dist/plugins/philipsHue/src/index.js +64 -13
  139. package/dist/plugins/pipedrive/src/index.js +167 -45
  140. package/dist/plugins/plivo/src/index.js +43 -8
  141. package/dist/plugins/postbin/src/index.js +9 -2
  142. package/dist/plugins/posthog/src/index.js +50 -13
  143. package/dist/plugins/profitwell/src/index.js +24 -5
  144. package/dist/plugins/pushbullet/src/index.js +45 -9
  145. package/dist/plugins/pushcut/src/index.js +31 -6
  146. package/dist/plugins/pushover/src/index.js +51 -10
  147. package/dist/plugins/quickbase/src/index.js +66 -13
  148. package/dist/plugins/quickbooks/src/index.js +86 -19
  149. package/dist/plugins/quickchart/src/index.js +35 -7
  150. package/dist/plugins/raindrop/src/index.js +54 -13
  151. package/dist/plugins/reddit/src/index.js +73 -18
  152. package/dist/plugins/rocketchat/src/index.js +47 -9
  153. package/dist/plugins/rundeck/src/index.js +26 -5
  154. package/dist/plugins/salesforce/src/index.js +161 -31
  155. package/dist/plugins/salesmate/src/index.js +75 -16
  156. package/dist/plugins/securityScorecard/src/index.js +73 -15
  157. package/dist/plugins/segment/src/index.js +21 -4
  158. package/dist/plugins/sendgrid/src/index.js +102 -24
  159. package/dist/plugins/sendy/src/index.js +54 -11
  160. package/dist/plugins/sentry/src/index.js +174 -34
  161. package/dist/plugins/servicenow/src/index.js +120 -27
  162. package/dist/plugins/shopify/src/index.js +53 -12
  163. package/dist/plugins/signl4/src/index.js +16 -3
  164. package/dist/plugins/slack/src/index.js +407 -105
  165. package/dist/plugins/sms77/src/index.js +26 -5
  166. package/dist/plugins/splunk/src/index.js +186 -45
  167. package/dist/plugins/spotify/src/index.js +265 -66
  168. package/dist/plugins/stackby/src/index.js +18 -6
  169. package/dist/plugins/storyblok/src/index.js +57 -11
  170. package/dist/plugins/strapi/src/index.js +63 -12
  171. package/dist/plugins/strava/src/index.js +58 -13
  172. package/dist/plugins/stripe/src/index.js +143 -30
  173. package/dist/plugins/supabase/src/index.js +49 -10
  174. package/dist/plugins/syncromsp/src/index.js +245 -67
  175. package/dist/plugins/tapfiliate/src/index.js +57 -14
  176. package/dist/plugins/telegram/src/index.js +202 -39
  177. package/dist/plugins/thehive/src/index.js +271 -66
  178. package/dist/plugins/thehiveProject/src/index.js +457 -89
  179. package/dist/plugins/todoist/src/index.js +326 -77
  180. package/dist/plugins/travisci/src/index.js +35 -8
  181. package/dist/plugins/trello/src/index.js +204 -46
  182. package/dist/plugins/twake/src/index.js +10 -2
  183. package/dist/plugins/twilio/src/index.js +56 -11
  184. package/dist/plugins/twist/src/index.js +241 -48
  185. package/dist/plugins/twitter/src/index.js +128 -30
  186. package/dist/plugins/unleashedSoftware/src/index.js +30 -6
  187. package/dist/plugins/uplead/src/index.js +9 -2
  188. package/dist/plugins/uproc/src/index.js +31 -6
  189. package/dist/plugins/uptimerobot/src/index.js +119 -25
  190. package/dist/plugins/urlscanio/src/index.js +25 -6
  191. package/dist/plugins/vero/src/index.js +68 -13
  192. package/dist/plugins/vonage/src/index.js +32 -6
  193. package/dist/plugins/wekan/src/index.js +297 -52
  194. package/dist/plugins/woocommerce/src/index.js +57 -12
  195. package/dist/plugins/wordpress/src/index.js +94 -18
  196. package/dist/plugins/xero/src/index.js +79 -13
  197. package/dist/plugins/yourls/src/index.js +33 -6
  198. package/dist/plugins/zammad/src/index.js +139 -36
  199. package/dist/plugins/zendesk/src/index.js +201 -48
  200. package/dist/plugins/zoho/src/index.js +88 -21
  201. package/dist/plugins/zoom/src/index.js +41 -7
  202. package/dist/plugins/zulip/src/index.js +101 -20
  203. package/package.json +3 -1
@@ -7,7 +7,10 @@ async function apiRequest(token, method, path, body, qs) {
7
7
  url.searchParams.set(k, String(v));
8
8
  }
9
9
  }
10
- const init = { method, headers: { "Access-Token": token, "Content-Type": "application/json" } };
10
+ const init = {
11
+ method,
12
+ headers: { "Access-Token": token, "Content-Type": "application/json" },
13
+ };
11
14
  if (body && Object.keys(body).length > 0)
12
15
  init.body = JSON.stringify(body);
13
16
  const res = await fetch(url.toString(), init);
@@ -33,7 +36,12 @@ export default function pushbullet(rl) {
33
36
  rl.setName("pushbullet");
34
37
  rl.setVersion("0.1.0");
35
38
  rl.setConnectionSchema({
36
- accessToken: { type: "string", required: true, description: "Pushbullet Access Token", env: "PUSHBULLET_ACCESS_TOKEN" },
39
+ accessToken: {
40
+ type: "string",
41
+ required: true,
42
+ description: "Pushbullet Access Token",
43
+ env: "PUSHBULLET_ACCESS_TOKEN",
44
+ },
37
45
  });
38
46
  const key = (ctx) => ctx.connection.config.accessToken;
39
47
  rl.registerAction("push.create", {
@@ -42,13 +50,29 @@ export default function pushbullet(rl) {
42
50
  type: { type: "string", required: true, description: "note or link" },
43
51
  title: { type: "string", required: true },
44
52
  body: { type: "string", required: true },
45
- url: { type: "string", required: false, description: "URL (required for link type)" },
46
- target: { type: "string", required: false, description: "Target: default, device_iden, email, channel_tag" },
47
- targetValue: { type: "string", required: false, description: "Value for target (device ID, email, or channel tag)" },
53
+ url: {
54
+ type: "string",
55
+ required: false,
56
+ description: "URL (required for link type)",
57
+ },
58
+ target: {
59
+ type: "string",
60
+ required: false,
61
+ description: "Target: default, device_iden, email, channel_tag",
62
+ },
63
+ targetValue: {
64
+ type: "string",
65
+ required: false,
66
+ description: "Value for target (device ID, email, or channel tag)",
67
+ },
48
68
  },
49
69
  async execute(input, ctx) {
50
70
  const p = input;
51
- const reqBody = { type: p.type, title: p.title, body: p.body };
71
+ const reqBody = {
72
+ type: p.type,
73
+ title: p.title,
74
+ body: p.body,
75
+ };
52
76
  if (p.type === "link" && p.url)
53
77
  reqBody.url = p.url;
54
78
  const target = p.target ?? "default";
@@ -61,8 +85,16 @@ export default function pushbullet(rl) {
61
85
  description: "List pushes",
62
86
  inputSchema: {
63
87
  limit: { type: "number", required: false },
64
- active: { type: "boolean", required: false, description: "Only return non-deleted pushes" },
65
- modifiedAfter: { type: "string", required: false, description: "ISO timestamp — only return pushes modified after this" },
88
+ active: {
89
+ type: "boolean",
90
+ required: false,
91
+ description: "Only return non-deleted pushes",
92
+ },
93
+ modifiedAfter: {
94
+ type: "string",
95
+ required: false,
96
+ description: "ISO timestamp — only return pushes modified after this",
97
+ },
66
98
  },
67
99
  async execute(input, ctx) {
68
100
  const p = (input ?? {});
@@ -92,7 +124,11 @@ export default function pushbullet(rl) {
92
124
  description: "Update a push (dismiss it)",
93
125
  inputSchema: {
94
126
  pushId: { type: "string", required: true },
95
- dismissed: { type: "boolean", required: true, description: "Mark push as dismissed" },
127
+ dismissed: {
128
+ type: "boolean",
129
+ required: true,
130
+ description: "Mark push as dismissed",
131
+ },
96
132
  },
97
133
  async execute(input, ctx) {
98
134
  const { pushId, dismissed } = input;
@@ -3,17 +3,42 @@ export default function pushcut(rl) {
3
3
  rl.setName("pushcut");
4
4
  rl.setVersion("0.1.0");
5
5
  rl.setConnectionSchema({
6
- apiKey: { type: "string", required: true, description: "Pushcut API key", env: "PUSHCUT_API_KEY" },
6
+ apiKey: {
7
+ type: "string",
8
+ required: true,
9
+ description: "Pushcut API key",
10
+ env: "PUSHCUT_API_KEY",
11
+ },
7
12
  });
8
13
  const key = (ctx) => ctx.connection.config.apiKey;
9
14
  rl.registerAction("notification.send", {
10
15
  description: "Send a Pushcut notification",
11
16
  inputSchema: {
12
- notificationName: { type: "string", required: true, description: "Notification name or ID" },
13
- text: { type: "string", required: false, description: "Override notification text" },
14
- title: { type: "string", required: false, description: "Override notification title" },
15
- input: { type: "string", required: false, description: "Value passed as input to the action" },
16
- devices: { type: "object", required: false, description: "Array of device IDs (default: all)" },
17
+ notificationName: {
18
+ type: "string",
19
+ required: true,
20
+ description: "Notification name or ID",
21
+ },
22
+ text: {
23
+ type: "string",
24
+ required: false,
25
+ description: "Override notification text",
26
+ },
27
+ title: {
28
+ type: "string",
29
+ required: false,
30
+ description: "Override notification title",
31
+ },
32
+ input: {
33
+ type: "string",
34
+ required: false,
35
+ description: "Value passed as input to the action",
36
+ },
37
+ devices: {
38
+ type: "object",
39
+ required: false,
40
+ description: "Array of device IDs (default: all)",
41
+ },
17
42
  },
18
43
  async execute(input, ctx) {
19
44
  const p = (input ?? {});
@@ -3,24 +3,65 @@ export default function pushover(rl) {
3
3
  rl.setName("pushover");
4
4
  rl.setVersion("0.1.0");
5
5
  rl.setConnectionSchema({
6
- apiToken: { type: "string", required: true, description: "Pushover application API token", env: "PUSHOVER_API_TOKEN" },
6
+ apiToken: {
7
+ type: "string",
8
+ required: true,
9
+ description: "Pushover application API token",
10
+ env: "PUSHOVER_API_TOKEN",
11
+ },
7
12
  });
8
13
  const token = (ctx) => ctx.connection.config.apiToken;
9
14
  rl.registerAction("message.push", {
10
15
  description: "Send a push notification via Pushover",
11
16
  inputSchema: {
12
- userKey: { type: "string", required: true, description: "User or group key" },
17
+ userKey: {
18
+ type: "string",
19
+ required: true,
20
+ description: "User or group key",
21
+ },
13
22
  message: { type: "string", required: true },
14
- priority: { type: "number", required: false, description: "-2 (lowest) to 2 (emergency), default 0" },
23
+ priority: {
24
+ type: "number",
25
+ required: false,
26
+ description: "-2 (lowest) to 2 (emergency), default 0",
27
+ },
15
28
  title: { type: "string", required: false },
16
- url: { type: "string", required: false, description: "Supplementary URL" },
29
+ url: {
30
+ type: "string",
31
+ required: false,
32
+ description: "Supplementary URL",
33
+ },
17
34
  urlTitle: { type: "string", required: false },
18
- sound: { type: "string", required: false, description: "Sound name (e.g. pushover, bike, bugle)" },
19
- device: { type: "string", required: false, description: "Target device name(s), comma-separated" },
20
- html: { type: "boolean", required: false, description: "Enable HTML formatting" },
21
- retry: { type: "number", required: false, description: "Retry interval in seconds (for priority 2, min 30)" },
22
- expire: { type: "number", required: false, description: "Expiry in seconds (for priority 2, max 10800)" },
23
- ttl: { type: "number", required: false, description: "Time to live in seconds" },
35
+ sound: {
36
+ type: "string",
37
+ required: false,
38
+ description: "Sound name (e.g. pushover, bike, bugle)",
39
+ },
40
+ device: {
41
+ type: "string",
42
+ required: false,
43
+ description: "Target device name(s), comma-separated",
44
+ },
45
+ html: {
46
+ type: "boolean",
47
+ required: false,
48
+ description: "Enable HTML formatting",
49
+ },
50
+ retry: {
51
+ type: "number",
52
+ required: false,
53
+ description: "Retry interval in seconds (for priority 2, min 30)",
54
+ },
55
+ expire: {
56
+ type: "number",
57
+ required: false,
58
+ description: "Expiry in seconds (for priority 2, max 10800)",
59
+ },
60
+ ttl: {
61
+ type: "number",
62
+ required: false,
63
+ description: "Time to live in seconds",
64
+ },
24
65
  },
25
66
  async execute(input, ctx) {
26
67
  const p = input;
@@ -31,8 +31,18 @@ export default function quickbase(rl) {
31
31
  rl.setName("quickbase");
32
32
  rl.setVersion("0.1.0");
33
33
  rl.setConnectionSchema({
34
- hostname: { type: "string", required: true, description: "QuickBase realm hostname (e.g. mycompany.quickbase.com)", env: "QUICKBASE_HOSTNAME" },
35
- userToken: { type: "string", required: true, description: "QuickBase user token", env: "QUICKBASE_USER_TOKEN" },
34
+ hostname: {
35
+ type: "string",
36
+ required: true,
37
+ description: "QuickBase realm hostname (e.g. mycompany.quickbase.com)",
38
+ env: "QUICKBASE_HOSTNAME",
39
+ },
40
+ userToken: {
41
+ type: "string",
42
+ required: true,
43
+ description: "QuickBase user token",
44
+ env: "QUICKBASE_USER_TOKEN",
45
+ },
36
46
  });
37
47
  rl.registerAction("field.list", {
38
48
  description: "List all fields for a table",
@@ -65,8 +75,16 @@ export default function quickbase(rl) {
65
75
  description: "Create records in a QuickBase table",
66
76
  inputSchema: {
67
77
  tableId: { type: "string", required: true },
68
- data: { type: "object", required: true, description: "Array of record objects with field IDs as keys, e.g. [{\"6\": {\"value\": \"test\"}}]" },
69
- fieldsToReturn: { type: "object", required: false, description: "Array of field IDs to return (default: [3])" },
78
+ data: {
79
+ type: "object",
80
+ required: true,
81
+ description: 'Array of record objects with field IDs as keys, e.g. [{"6": {"value": "test"}}]',
82
+ },
83
+ fieldsToReturn: {
84
+ type: "object",
85
+ required: false,
86
+ description: "Array of field IDs to return (default: [3])",
87
+ },
70
88
  },
71
89
  async execute(input, ctx) {
72
90
  const p = input;
@@ -79,20 +97,39 @@ export default function quickbase(rl) {
79
97
  description: "Delete records matching a query",
80
98
  inputSchema: {
81
99
  tableId: { type: "string", required: true },
82
- where: { type: "string", required: true, description: "Query string, e.g. {3.EX.123}" },
100
+ where: {
101
+ type: "string",
102
+ required: true,
103
+ description: "Query string, e.g. {3.EX.123}",
104
+ },
83
105
  },
84
106
  async execute(input, ctx) {
85
107
  const { tableId, where } = input;
86
- return apiRequest(getConn(ctx), "DELETE", "/records", { from: tableId, where });
108
+ return apiRequest(getConn(ctx), "DELETE", "/records", {
109
+ from: tableId,
110
+ where,
111
+ });
87
112
  },
88
113
  });
89
114
  rl.registerAction("record.query", {
90
115
  description: "Query records from a table",
91
116
  inputSchema: {
92
117
  tableId: { type: "string", required: true },
93
- where: { type: "string", required: false, description: "Query string filter" },
94
- select: { type: "object", required: false, description: "Array of field IDs to return" },
95
- sortBy: { type: "object", required: false, description: "Array of sort objects [{fieldId, order: 'ASC'|'DESC'}]" },
118
+ where: {
119
+ type: "string",
120
+ required: false,
121
+ description: "Query string filter",
122
+ },
123
+ select: {
124
+ type: "object",
125
+ required: false,
126
+ description: "Array of field IDs to return",
127
+ },
128
+ sortBy: {
129
+ type: "object",
130
+ required: false,
131
+ description: "Array of sort objects [{fieldId, order: 'ASC'|'DESC'}]",
132
+ },
96
133
  limit: { type: "number", required: false },
97
134
  },
98
135
  async execute(input, ctx) {
@@ -113,13 +150,29 @@ export default function quickbase(rl) {
113
150
  description: "Create or update records (upsert) using a merge field",
114
151
  inputSchema: {
115
152
  tableId: { type: "string", required: true },
116
- mergeFieldId: { type: "number", required: true, description: "Field ID used as the merge key" },
117
- data: { type: "object", required: true, description: "Array of record objects" },
118
- fieldsToReturn: { type: "object", required: false, description: "Array of field IDs to return" },
153
+ mergeFieldId: {
154
+ type: "number",
155
+ required: true,
156
+ description: "Field ID used as the merge key",
157
+ },
158
+ data: {
159
+ type: "object",
160
+ required: true,
161
+ description: "Array of record objects",
162
+ },
163
+ fieldsToReturn: {
164
+ type: "object",
165
+ required: false,
166
+ description: "Array of field IDs to return",
167
+ },
119
168
  },
120
169
  async execute(input, ctx) {
121
170
  const p = input;
122
- const body = { to: p.tableId, data: p.data, mergeFieldId: p.mergeFieldId };
171
+ const body = {
172
+ to: p.tableId,
173
+ data: p.data,
174
+ mergeFieldId: p.mergeFieldId,
175
+ };
123
176
  body.fieldsToReturn = p.fieldsToReturn ?? [3];
124
177
  return apiRequest(getConn(ctx), "POST", "/records", body);
125
178
  },
@@ -1,8 +1,14 @@
1
1
  function getConn(ctx) {
2
2
  const c = ctx.connection.config;
3
3
  const sandbox = c.sandbox === true;
4
- const base = sandbox ? "https://sandbox-quickbooks.api.intuit.com" : "https://quickbooks.api.intuit.com";
5
- return { base, accessToken: c.accessToken, companyId: c.companyId };
4
+ const base = sandbox
5
+ ? "https://sandbox-quickbooks.api.intuit.com"
6
+ : "https://quickbooks.api.intuit.com";
7
+ return {
8
+ base,
9
+ accessToken: c.accessToken,
10
+ companyId: c.companyId,
11
+ };
6
12
  }
7
13
  async function api(conn, method, endpoint, body, qs) {
8
14
  const url = new URL(`${conn.base}${endpoint}`);
@@ -12,7 +18,14 @@ async function api(conn, method, endpoint, body, qs) {
12
18
  url.searchParams.set(k, String(v));
13
19
  }
14
20
  }
15
- const init = { method, headers: { Authorization: `Bearer ${conn.accessToken}`, Accept: "application/json", "Content-Type": "application/json" } };
21
+ const init = {
22
+ method,
23
+ headers: {
24
+ Authorization: `Bearer ${conn.accessToken}`,
25
+ Accept: "application/json",
26
+ "Content-Type": "application/json",
27
+ },
28
+ };
16
29
  if (body && Object.keys(body).length > 0)
17
30
  init.body = JSON.stringify(body);
18
31
  const res = await fetch(url.toString(), init);
@@ -20,22 +33,39 @@ async function api(conn, method, endpoint, body, qs) {
20
33
  throw new Error(`QuickBooks error ${res.status}: ${await res.text()}`);
21
34
  return res.json();
22
35
  }
23
- function capitalCase(s) { return s.charAt(0).toUpperCase() + s.slice(1); }
36
+ function capitalCase(s) {
37
+ return s.charAt(0).toUpperCase() + s.slice(1);
38
+ }
24
39
  function registerQbResource(rl, resource, conn) {
25
40
  const cap = capitalCase(resource);
26
41
  const prefix = (c) => `/v3/company/${c.companyId}`;
27
- rl.registerAction(`${resource}.create`, { description: `Create a ${resource}`, inputSchema: { data: { type: "object", required: true } },
42
+ rl.registerAction(`${resource}.create`, {
43
+ description: `Create a ${resource}`,
44
+ inputSchema: { data: { type: "object", required: true } },
28
45
  async execute(input, ctx) {
29
46
  const c = conn(ctx);
30
47
  return api(c, "POST", `${prefix(c)}/${resource}`, input.data);
31
- } });
32
- rl.registerAction(`${resource}.get`, { description: `Get a ${resource} by ID`, inputSchema: { id: { type: "string", required: true } },
48
+ },
49
+ });
50
+ rl.registerAction(`${resource}.get`, {
51
+ description: `Get a ${resource} by ID`,
52
+ inputSchema: { id: { type: "string", required: true } },
33
53
  async execute(input, ctx) {
34
54
  const c = conn(ctx);
35
55
  const data = (await api(c, "GET", `${prefix(c)}/${resource}/${input.id}`));
36
56
  return data[cap];
37
- } });
38
- rl.registerAction(`${resource}.query`, { description: `Query ${resource}s (SQL-like)`, inputSchema: { query: { type: "string", required: false, description: `WHERE clause (default: SELECT * FROM ${cap})` }, limit: { type: "number", required: false } },
57
+ },
58
+ });
59
+ rl.registerAction(`${resource}.query`, {
60
+ description: `Query ${resource}s (SQL-like)`,
61
+ inputSchema: {
62
+ query: {
63
+ type: "string",
64
+ required: false,
65
+ description: `WHERE clause (default: SELECT * FROM ${cap})`,
66
+ },
67
+ limit: { type: "number", required: false },
68
+ },
39
69
  async execute(input, ctx) {
40
70
  const c = conn(ctx);
41
71
  const p = (input ?? {});
@@ -44,30 +74,67 @@ function registerQbResource(rl, resource, conn) {
44
74
  q += ` ${p.query}`;
45
75
  if (p.limit)
46
76
  q += ` MAXRESULTS ${p.limit}`;
47
- const data = (await api(c, "GET", `${prefix(c)}/query`, undefined, { query: q }));
77
+ const data = (await api(c, "GET", `${prefix(c)}/query`, undefined, {
78
+ query: q,
79
+ }));
48
80
  return data.QueryResponse?.[cap] ?? [];
49
- } });
50
- rl.registerAction(`${resource}.update`, { description: `Update a ${resource} (must include Id and SyncToken)`, inputSchema: { data: { type: "object", required: true } },
81
+ },
82
+ });
83
+ rl.registerAction(`${resource}.update`, {
84
+ description: `Update a ${resource} (must include Id and SyncToken)`,
85
+ inputSchema: { data: { type: "object", required: true } },
51
86
  async execute(input, ctx) {
52
87
  const c = conn(ctx);
53
88
  return api(c, "POST", `${prefix(c)}/${resource}`, input.data);
54
- } });
55
- rl.registerAction(`${resource}.delete`, { description: `Delete a ${resource}`, inputSchema: { id: { type: "string", required: true }, syncToken: { type: "string", required: true } },
89
+ },
90
+ });
91
+ rl.registerAction(`${resource}.delete`, {
92
+ description: `Delete a ${resource}`,
93
+ inputSchema: {
94
+ id: { type: "string", required: true },
95
+ syncToken: { type: "string", required: true },
96
+ },
56
97
  async execute(input, ctx) {
57
98
  const c = conn(ctx);
58
99
  const p = input;
59
100
  return api(c, "POST", `${prefix(c)}/${resource}`, { Id: p.id, SyncToken: p.syncToken }, { operation: "delete" });
60
- } });
101
+ },
102
+ });
61
103
  }
62
104
  export default function quickbooks(rl) {
63
105
  rl.setName("quickbooks");
64
106
  rl.setVersion("0.1.0");
65
107
  rl.setConnectionSchema({
66
- accessToken: { type: "string", required: true, description: "QuickBooks OAuth2 access token", env: "QUICKBOOKS_ACCESS_TOKEN" },
67
- companyId: { type: "string", required: true, description: "QuickBooks Company/Realm ID", env: "QUICKBOOKS_COMPANY_ID" },
68
- sandbox: { type: "boolean", required: false, description: "Use sandbox environment", env: "QUICKBOOKS_SANDBOX" },
108
+ accessToken: {
109
+ type: "string",
110
+ required: true,
111
+ description: "QuickBooks OAuth2 access token",
112
+ env: "QUICKBOOKS_ACCESS_TOKEN",
113
+ },
114
+ companyId: {
115
+ type: "string",
116
+ required: true,
117
+ description: "QuickBooks Company/Realm ID",
118
+ env: "QUICKBOOKS_COMPANY_ID",
119
+ },
120
+ sandbox: {
121
+ type: "boolean",
122
+ required: false,
123
+ description: "Use sandbox environment",
124
+ env: "QUICKBOOKS_SANDBOX",
125
+ },
69
126
  });
70
- for (const resource of ["bill", "customer", "employee", "estimate", "invoice", "item", "payment", "purchase", "vendor"]) {
127
+ for (const resource of [
128
+ "bill",
129
+ "customer",
130
+ "employee",
131
+ "estimate",
132
+ "invoice",
133
+ "item",
134
+ "payment",
135
+ "purchase",
136
+ "vendor",
137
+ ]) {
71
138
  registerQbResource(rl, resource, getConn);
72
139
  }
73
140
  }
@@ -5,13 +5,41 @@ export default function quickchart(rl) {
5
5
  rl.registerAction("chart.create", {
6
6
  description: "Generate a chart image URL via QuickChart.io (no auth required)",
7
7
  inputSchema: {
8
- type: { type: "string", required: true, description: "Chart type: bar, line, pie, doughnut, radar, scatter, etc." },
9
- labels: { type: "object", required: true, description: "Array of label strings" },
10
- datasets: { type: "object", required: true, description: "Array of dataset objects [{label, data: [...], backgroundColor?, borderColor?}]" },
11
- width: { type: "number", required: false, description: "Chart width in pixels (default 500)" },
12
- height: { type: "number", required: false, description: "Chart height in pixels (default 300)" },
13
- backgroundColor: { type: "string", required: false, description: "Chart background color" },
14
- format: { type: "string", required: false, description: "Output format: png (default), svg, webp, pdf" },
8
+ type: {
9
+ type: "string",
10
+ required: true,
11
+ description: "Chart type: bar, line, pie, doughnut, radar, scatter, etc.",
12
+ },
13
+ labels: {
14
+ type: "object",
15
+ required: true,
16
+ description: "Array of label strings",
17
+ },
18
+ datasets: {
19
+ type: "object",
20
+ required: true,
21
+ description: "Array of dataset objects [{label, data: [...], backgroundColor?, borderColor?}]",
22
+ },
23
+ width: {
24
+ type: "number",
25
+ required: false,
26
+ description: "Chart width in pixels (default 500)",
27
+ },
28
+ height: {
29
+ type: "number",
30
+ required: false,
31
+ description: "Chart height in pixels (default 300)",
32
+ },
33
+ backgroundColor: {
34
+ type: "string",
35
+ required: false,
36
+ description: "Chart background color",
37
+ },
38
+ format: {
39
+ type: "string",
40
+ required: false,
41
+ description: "Output format: png (default), svg, webp, pdf",
42
+ },
15
43
  },
16
44
  async execute(input) {
17
45
  const p = (input ?? {});