runline 0.2.0 → 0.2.2
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.
- package/README.md +1 -1
- package/dist/plugins/actionNetwork/src/index.js +118 -25
- package/dist/plugins/activeCampaign/src/index.js +184 -38
- package/dist/plugins/adalo/src/index.js +40 -8
- package/dist/plugins/affinity/src/index.js +100 -20
- package/dist/plugins/agileCrm/src/index.js +115 -27
- package/dist/plugins/airtable/src/index.js +94 -19
- package/dist/plugins/airtop/src/index.js +266 -62
- package/dist/plugins/apiTemplateIo/src/index.js +25 -5
- package/dist/plugins/asana/src/index.js +195 -41
- package/dist/plugins/autopilot/src/index.js +39 -8
- package/dist/plugins/bambooHr/src/index.js +109 -22
- package/dist/plugins/bannerbear/src/index.js +36 -8
- package/dist/plugins/baserow/src/index.js +35 -7
- package/dist/plugins/beeminder/src/index.js +198 -40
- package/dist/plugins/bitly/src/index.js +46 -10
- package/dist/plugins/bitwarden/src/index.js +167 -36
- package/dist/plugins/box/src/index.js +172 -37
- package/dist/plugins/brandfetch/src/index.js +5 -1
- package/dist/plugins/brevo/src/index.js +136 -29
- package/dist/plugins/bubble/src/index.js +76 -17
- package/dist/plugins/chargebee/src/index.js +35 -7
- package/dist/plugins/circleci/src/index.js +50 -10
- package/dist/plugins/ciscoWebex/src/index.js +131 -27
- package/dist/plugins/clearbit/src/index.js +76 -17
- package/dist/plugins/clickup/src/index.js +500 -107
- package/dist/plugins/clockify/src/index.js +229 -47
- package/dist/plugins/cloudflare/src/index.js +28 -6
- package/dist/plugins/cockpit/src/index.js +54 -12
- package/dist/plugins/coda/src/index.js +81 -19
- package/dist/plugins/coingecko/src/index.js +157 -33
- package/dist/plugins/contentful/src/index.js +85 -17
- package/dist/plugins/convertkit/src/index.js +74 -18
- package/dist/plugins/copper/src/index.js +59 -11
- package/dist/plugins/cortex/src/index.js +55 -13
- package/dist/plugins/currents/src/index.js +310 -71
- package/dist/plugins/customerIo/src/index.js +112 -23
- package/dist/plugins/databricks/src/index.js +549 -115
- package/dist/plugins/deepl/src/index.js +26 -6
- package/dist/plugins/demio/src/index.js +56 -11
- package/dist/plugins/dhl/src/index.js +16 -3
- package/dist/plugins/discord/src/index.js +141 -31
- package/dist/plugins/discourse/src/index.js +136 -31
- package/dist/plugins/disqus/src/index.js +96 -20
- package/dist/plugins/docker/src/index.js +20 -4
- package/dist/plugins/drift/src/index.js +19 -5
- package/dist/plugins/dropbox/src/index.js +139 -30
- package/dist/plugins/dropcontact/src/index.js +21 -4
- package/dist/plugins/egoi/src/index.js +61 -15
- package/dist/plugins/elasticsearch/src/index.js +59 -13
- package/dist/plugins/emelia/src/index.js +95 -19
- package/dist/plugins/erpnext/src/index.js +74 -15
- package/dist/plugins/facebookGraph/src/index.js +52 -11
- package/dist/plugins/freshdesk/src/index.js +220 -48
- package/dist/plugins/freshservice/src/index.js +39 -9
- package/dist/plugins/freshworksCrm/src/index.js +58 -12
- package/dist/plugins/getresponse/src/index.js +87 -18
- package/dist/plugins/ghost/src/index.js +114 -26
- package/dist/plugins/github/src/index.js +483 -109
- package/dist/plugins/gitlab/src/index.js +193 -45
- package/dist/plugins/gong/src/index.js +68 -14
- package/dist/plugins/gotify/src/index.js +43 -9
- package/dist/plugins/gotowebinar/src/index.js +233 -47
- package/dist/plugins/grafana/src/index.js +92 -21
- package/dist/plugins/graphql/src/index.js +38 -8
- package/dist/plugins/grist/src/index.js +52 -10
- package/dist/plugins/hackernews/src/index.js +32 -6
- package/dist/plugins/halopsa/src/index.js +131 -26
- package/dist/plugins/harvest/src/index.js +182 -42
- package/dist/plugins/helpscout/src/index.js +153 -31
- package/dist/plugins/highlevel/src/index.js +291 -58
- package/dist/plugins/homeAssistant/src/index.js +124 -26
- package/dist/plugins/hubspot/src/index.js +163 -29
- package/dist/plugins/humanticAi/src/index.js +54 -5
- package/dist/plugins/hunter/src/index.js +21 -4
- package/dist/plugins/intercom/src/index.js +95 -20
- package/dist/plugins/iterable/src/index.js +96 -20
- package/dist/plugins/jenkins/src/index.js +75 -17
- package/dist/plugins/jira/src/index.js +193 -43
- package/dist/plugins/keap/src/index.js +222 -56
- package/dist/plugins/kobotoolbox/src/index.js +113 -25
- package/dist/plugins/lemlist/src/index.js +79 -18
- package/dist/plugins/linear/src/index.js +86 -19
- package/dist/plugins/lingvanex/src/index.js +38 -8
- package/dist/plugins/linkedin/src/index.js +37 -8
- package/dist/plugins/lonescale/src/index.js +41 -9
- package/dist/plugins/magento/src/index.js +98 -27
- package/dist/plugins/mailcheck/src/index.js +11 -2
- package/dist/plugins/mailchimp/src/index.js +193 -42
- package/dist/plugins/mailerlite/src/index.js +61 -12
- package/dist/plugins/mailgun/src/index.js +39 -7
- package/dist/plugins/mailjet/src/index.js +141 -30
- package/dist/plugins/mandrill/src/index.js +67 -14
- package/dist/plugins/marketstack/src/index.js +56 -10
- package/dist/plugins/matrix/src/index.js +97 -20
- package/dist/plugins/mattermost/src/index.js +124 -26
- package/dist/plugins/mautic/src/index.js +129 -26
- package/dist/plugins/medium/src/index.js +64 -13
- package/dist/plugins/messagebird/src/index.js +80 -15
- package/dist/plugins/metabase/src/index.js +57 -12
- package/dist/plugins/misp/src/index.js +135 -33
- package/dist/plugins/mocean/src/index.js +33 -7
- package/dist/plugins/monday/src/index.js +97 -23
- package/dist/plugins/monicaCrm/src/index.js +112 -23
- package/dist/plugins/msg91/src/index.js +11 -2
- package/dist/plugins/nasa/src/index.js +108 -21
- package/dist/plugins/netlify/src/index.js +28 -6
- package/dist/plugins/netscalerAdc/src/index.js +144 -29
- package/dist/plugins/nextcloud/src/index.js +103 -20
- package/dist/plugins/nocodb/src/index.js +57 -11
- package/dist/plugins/notion/src/index.js +148 -37
- package/dist/plugins/npm/src/index.js +59 -12
- package/dist/plugins/odoo/src/index.js +102 -20
- package/dist/plugins/okta/src/index.js +50 -10
- package/dist/plugins/oneSimpleApi/src/index.js +84 -17
- package/dist/plugins/onfleet/src/index.js +139 -32
- package/dist/plugins/openThesaurus/src/index.js +46 -9
- package/dist/plugins/openweathermap/src/index.js +31 -6
- package/dist/plugins/oura/src/index.js +36 -7
- package/dist/plugins/paddle/src/index.js +80 -17
- package/dist/plugins/pagerduty/src/index.js +53 -12
- package/dist/plugins/paypal/src/index.js +51 -11
- package/dist/plugins/peekalink/src/index.js +12 -3
- package/dist/plugins/phantombuster/src/index.js +39 -8
- package/dist/plugins/philipsHue/src/index.js +64 -13
- package/dist/plugins/pipedrive/src/index.js +167 -45
- package/dist/plugins/plivo/src/index.js +43 -8
- package/dist/plugins/postbin/src/index.js +9 -2
- package/dist/plugins/posthog/src/index.js +50 -13
- package/dist/plugins/profitwell/src/index.js +24 -5
- package/dist/plugins/pushbullet/src/index.js +45 -9
- package/dist/plugins/pushcut/src/index.js +31 -6
- package/dist/plugins/pushover/src/index.js +51 -10
- package/dist/plugins/quickbase/src/index.js +66 -13
- package/dist/plugins/quickbooks/src/index.js +86 -19
- package/dist/plugins/quickchart/src/index.js +35 -7
- package/dist/plugins/raindrop/src/index.js +54 -13
- package/dist/plugins/reddit/src/index.js +73 -18
- package/dist/plugins/rocketchat/src/index.js +47 -9
- package/dist/plugins/rundeck/src/index.js +26 -5
- package/dist/plugins/salesforce/src/index.js +161 -31
- package/dist/plugins/salesmate/src/index.js +75 -16
- package/dist/plugins/securityScorecard/src/index.js +73 -15
- package/dist/plugins/segment/src/index.js +21 -4
- package/dist/plugins/sendgrid/src/index.js +102 -24
- package/dist/plugins/sendy/src/index.js +54 -11
- package/dist/plugins/sentry/src/index.js +174 -34
- package/dist/plugins/servicenow/src/index.js +120 -27
- package/dist/plugins/shopify/src/index.js +53 -12
- package/dist/plugins/signl4/src/index.js +16 -3
- package/dist/plugins/slack/src/index.js +407 -105
- package/dist/plugins/sms77/src/index.js +26 -5
- package/dist/plugins/splunk/src/index.js +186 -45
- package/dist/plugins/spotify/src/index.js +265 -66
- package/dist/plugins/stackby/src/index.js +18 -6
- package/dist/plugins/storyblok/src/index.js +57 -11
- package/dist/plugins/strapi/src/index.js +63 -12
- package/dist/plugins/strava/src/index.js +58 -13
- package/dist/plugins/stripe/src/index.js +143 -30
- package/dist/plugins/supabase/src/index.js +49 -10
- package/dist/plugins/syncromsp/src/index.js +245 -67
- package/dist/plugins/tapfiliate/src/index.js +57 -14
- package/dist/plugins/telegram/src/index.js +202 -39
- package/dist/plugins/thehive/src/index.js +271 -66
- package/dist/plugins/thehiveProject/src/index.js +457 -89
- package/dist/plugins/todoist/src/index.js +326 -77
- package/dist/plugins/travisci/src/index.js +35 -8
- package/dist/plugins/trello/src/index.js +204 -46
- package/dist/plugins/twake/src/index.js +10 -2
- package/dist/plugins/twilio/src/index.js +56 -11
- package/dist/plugins/twist/src/index.js +241 -48
- package/dist/plugins/twitter/src/index.js +128 -30
- package/dist/plugins/unleashedSoftware/src/index.js +30 -6
- package/dist/plugins/uplead/src/index.js +9 -2
- package/dist/plugins/uproc/src/index.js +31 -6
- package/dist/plugins/uptimerobot/src/index.js +119 -25
- package/dist/plugins/urlscanio/src/index.js +25 -6
- package/dist/plugins/vero/src/index.js +68 -13
- package/dist/plugins/vonage/src/index.js +32 -6
- package/dist/plugins/wekan/src/index.js +297 -52
- package/dist/plugins/woocommerce/src/index.js +57 -12
- package/dist/plugins/wordpress/src/index.js +94 -18
- package/dist/plugins/xero/src/index.js +79 -13
- package/dist/plugins/yourls/src/index.js +33 -6
- package/dist/plugins/zammad/src/index.js +139 -36
- package/dist/plugins/zendesk/src/index.js +201 -48
- package/dist/plugins/zoho/src/index.js +88 -21
- package/dist/plugins/zoom/src/index.js +41 -7
- package/dist/plugins/zulip/src/index.js +101 -20
- package/package.json +1 -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 = {
|
|
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: {
|
|
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: {
|
|
46
|
-
|
|
47
|
-
|
|
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 = {
|
|
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: {
|
|
65
|
-
|
|
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: {
|
|
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: {
|
|
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: {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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: {
|
|
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: {
|
|
17
|
+
userKey: {
|
|
18
|
+
type: "string",
|
|
19
|
+
required: true,
|
|
20
|
+
description: "User or group key",
|
|
21
|
+
},
|
|
13
22
|
message: { type: "string", required: true },
|
|
14
|
-
priority: {
|
|
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: {
|
|
29
|
+
url: {
|
|
30
|
+
type: "string",
|
|
31
|
+
required: false,
|
|
32
|
+
description: "Supplementary URL",
|
|
33
|
+
},
|
|
17
34
|
urlTitle: { type: "string", required: false },
|
|
18
|
-
sound: {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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: {
|
|
35
|
-
|
|
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: {
|
|
69
|
-
|
|
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: {
|
|
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", {
|
|
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: {
|
|
94
|
-
|
|
95
|
-
|
|
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: {
|
|
117
|
-
|
|
118
|
-
|
|
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 = {
|
|
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
|
|
5
|
-
|
|
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 = {
|
|
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) {
|
|
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`, {
|
|
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
|
-
|
|
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
|
-
|
|
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, {
|
|
77
|
+
const data = (await api(c, "GET", `${prefix(c)}/query`, undefined, {
|
|
78
|
+
query: q,
|
|
79
|
+
}));
|
|
48
80
|
return data.QueryResponse?.[cap] ?? [];
|
|
49
|
-
}
|
|
50
|
-
|
|
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
|
-
|
|
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: {
|
|
67
|
-
|
|
68
|
-
|
|
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 [
|
|
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: {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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 ?? {});
|