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.
- package/dist/commands/auth.d.ts +7 -0
- package/dist/commands/auth.js +96 -0
- package/dist/config/loader.d.ts +11 -0
- package/dist/config/loader.js +46 -0
- package/dist/core/engine.js +7 -1
- package/dist/core/oauth.d.ts +46 -0
- package/dist/core/oauth.js +145 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.js +2 -1
- package/dist/main.js +28 -0
- package/dist/plugin/api.d.ts +7 -1
- package/dist/plugin/api.js +7 -0
- package/dist/plugin/types.d.ts +47 -0
- 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/gmail/src/index.js +1075 -0
- 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 +3 -1
|
@@ -8,7 +8,14 @@ async function api(token, method, endpoint, body, qs) {
|
|
|
8
8
|
url.searchParams.set(k, String(v));
|
|
9
9
|
}
|
|
10
10
|
}
|
|
11
|
-
const init = {
|
|
11
|
+
const init = {
|
|
12
|
+
method,
|
|
13
|
+
headers: {
|
|
14
|
+
Authorization: `Bearer ${token}`,
|
|
15
|
+
"Notion-Version": NOTION_VERSION,
|
|
16
|
+
"Content-Type": "application/json",
|
|
17
|
+
},
|
|
18
|
+
};
|
|
12
19
|
if (body && Object.keys(body).length > 0)
|
|
13
20
|
init.body = JSON.stringify(body);
|
|
14
21
|
const res = await fetch(url.toString(), init);
|
|
@@ -19,14 +26,39 @@ async function api(token, method, endpoint, body, qs) {
|
|
|
19
26
|
export default function notion(rl) {
|
|
20
27
|
rl.setName("notion");
|
|
21
28
|
rl.setVersion("0.1.0");
|
|
22
|
-
rl.setConnectionSchema({
|
|
29
|
+
rl.setConnectionSchema({
|
|
30
|
+
apiKey: {
|
|
31
|
+
type: "string",
|
|
32
|
+
required: true,
|
|
33
|
+
description: "Notion integration token (secret_...)",
|
|
34
|
+
env: "NOTION_API_KEY",
|
|
35
|
+
},
|
|
36
|
+
});
|
|
23
37
|
const t = (ctx) => ctx.connection.config.apiKey;
|
|
24
38
|
// ── Block ───────────────────────────────────────────
|
|
25
|
-
rl.registerAction("block.append", {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
39
|
+
rl.registerAction("block.append", {
|
|
40
|
+
description: "Append children blocks to a block/page",
|
|
41
|
+
inputSchema: {
|
|
42
|
+
blockId: { type: "string", required: true },
|
|
43
|
+
children: {
|
|
44
|
+
type: "object",
|
|
45
|
+
required: true,
|
|
46
|
+
description: "Array of block objects",
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
async execute(input, ctx) {
|
|
50
|
+
const p = input;
|
|
51
|
+
return api(t(ctx), "PATCH", `/blocks/${p.blockId}/children`, {
|
|
52
|
+
children: p.children,
|
|
53
|
+
});
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
rl.registerAction("block.getChildren", {
|
|
57
|
+
description: "Get child blocks of a block/page",
|
|
58
|
+
inputSchema: {
|
|
59
|
+
blockId: { type: "string", required: true },
|
|
60
|
+
limit: { type: "number", required: false },
|
|
61
|
+
},
|
|
30
62
|
async execute(input, ctx) {
|
|
31
63
|
const p = input;
|
|
32
64
|
const qs = {};
|
|
@@ -34,25 +66,52 @@ export default function notion(rl) {
|
|
|
34
66
|
qs.page_size = p.limit;
|
|
35
67
|
const data = (await api(t(ctx), "GET", `/blocks/${p.blockId}/children`, undefined, qs));
|
|
36
68
|
return data.results;
|
|
37
|
-
}
|
|
38
|
-
|
|
69
|
+
},
|
|
70
|
+
});
|
|
71
|
+
rl.registerAction("block.delete", {
|
|
72
|
+
description: "Delete (archive) a block",
|
|
39
73
|
inputSchema: { blockId: { type: "string", required: true } },
|
|
40
|
-
async execute(input, ctx) {
|
|
74
|
+
async execute(input, ctx) {
|
|
75
|
+
return api(t(ctx), "DELETE", `/blocks/${input.blockId}`);
|
|
76
|
+
},
|
|
77
|
+
});
|
|
41
78
|
// ── Database ────────────────────────────────────────
|
|
42
|
-
rl.registerAction("database.get", {
|
|
79
|
+
rl.registerAction("database.get", {
|
|
80
|
+
description: "Get a database",
|
|
43
81
|
inputSchema: { databaseId: { type: "string", required: true } },
|
|
44
|
-
async execute(input, ctx) {
|
|
45
|
-
|
|
82
|
+
async execute(input, ctx) {
|
|
83
|
+
return api(t(ctx), "GET", `/databases/${input.databaseId}`);
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
rl.registerAction("database.list", {
|
|
87
|
+
description: "List all databases (via search)",
|
|
46
88
|
inputSchema: { limit: { type: "number", required: false } },
|
|
47
89
|
async execute(input, ctx) {
|
|
48
|
-
const body = {
|
|
90
|
+
const body = {
|
|
91
|
+
filter: { property: "object", value: "database" },
|
|
92
|
+
};
|
|
49
93
|
if (input?.limit)
|
|
50
94
|
body.page_size = input.limit;
|
|
51
95
|
const data = (await api(t(ctx), "POST", "/search", body));
|
|
52
96
|
return data.results;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
|
|
97
|
+
},
|
|
98
|
+
});
|
|
99
|
+
rl.registerAction("database.query", {
|
|
100
|
+
description: "Query a database (list pages with filters)",
|
|
101
|
+
inputSchema: {
|
|
102
|
+
databaseId: { type: "string", required: true },
|
|
103
|
+
filter: {
|
|
104
|
+
type: "object",
|
|
105
|
+
required: false,
|
|
106
|
+
description: "Notion filter object",
|
|
107
|
+
},
|
|
108
|
+
sorts: {
|
|
109
|
+
type: "object",
|
|
110
|
+
required: false,
|
|
111
|
+
description: "Array of sort objects",
|
|
112
|
+
},
|
|
113
|
+
limit: { type: "number", required: false },
|
|
114
|
+
},
|
|
56
115
|
async execute(input, ctx) {
|
|
57
116
|
const p = input;
|
|
58
117
|
const body = {};
|
|
@@ -64,25 +123,66 @@ export default function notion(rl) {
|
|
|
64
123
|
body.page_size = p.limit;
|
|
65
124
|
const data = (await api(t(ctx), "POST", `/databases/${p.databaseId}/query`, body));
|
|
66
125
|
return data.results;
|
|
67
|
-
}
|
|
126
|
+
},
|
|
127
|
+
});
|
|
68
128
|
// ── Page ────────────────────────────────────────────
|
|
69
|
-
rl.registerAction("page.create", {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
129
|
+
rl.registerAction("page.create", {
|
|
130
|
+
description: "Create a page (in a database or under a page)",
|
|
131
|
+
inputSchema: {
|
|
132
|
+
parent: {
|
|
133
|
+
type: "object",
|
|
134
|
+
required: true,
|
|
135
|
+
description: "{ database_id: '...' } or { page_id: '...' }",
|
|
136
|
+
},
|
|
137
|
+
properties: {
|
|
138
|
+
type: "object",
|
|
139
|
+
required: true,
|
|
140
|
+
description: "Page properties",
|
|
141
|
+
},
|
|
142
|
+
children: {
|
|
143
|
+
type: "object",
|
|
144
|
+
required: false,
|
|
145
|
+
description: "Array of block children",
|
|
146
|
+
},
|
|
147
|
+
icon: { type: "object", required: false },
|
|
148
|
+
},
|
|
149
|
+
async execute(input, ctx) {
|
|
150
|
+
return api(t(ctx), "POST", "/pages", input);
|
|
151
|
+
},
|
|
152
|
+
});
|
|
153
|
+
rl.registerAction("page.get", {
|
|
154
|
+
description: "Get a page",
|
|
73
155
|
inputSchema: { pageId: { type: "string", required: true } },
|
|
74
|
-
async execute(input, ctx) {
|
|
75
|
-
|
|
76
|
-
|
|
156
|
+
async execute(input, ctx) {
|
|
157
|
+
return api(t(ctx), "GET", `/pages/${input.pageId}`);
|
|
158
|
+
},
|
|
159
|
+
});
|
|
160
|
+
rl.registerAction("page.update", {
|
|
161
|
+
description: "Update page properties",
|
|
162
|
+
inputSchema: {
|
|
163
|
+
pageId: { type: "string", required: true },
|
|
164
|
+
properties: { type: "object", required: false },
|
|
165
|
+
archived: { type: "boolean", required: false },
|
|
166
|
+
icon: { type: "object", required: false },
|
|
167
|
+
},
|
|
77
168
|
async execute(input, ctx) {
|
|
78
169
|
const { pageId, ...body } = input;
|
|
79
170
|
return api(t(ctx), "PATCH", `/pages/${pageId}`, body);
|
|
80
|
-
}
|
|
81
|
-
|
|
171
|
+
},
|
|
172
|
+
});
|
|
173
|
+
rl.registerAction("page.archive", {
|
|
174
|
+
description: "Archive a page",
|
|
82
175
|
inputSchema: { pageId: { type: "string", required: true } },
|
|
83
|
-
async execute(input, ctx) {
|
|
84
|
-
|
|
85
|
-
|
|
176
|
+
async execute(input, ctx) {
|
|
177
|
+
return api(t(ctx), "PATCH", `/pages/${input.pageId}`, { archived: true });
|
|
178
|
+
},
|
|
179
|
+
});
|
|
180
|
+
rl.registerAction("page.search", {
|
|
181
|
+
description: "Search pages",
|
|
182
|
+
inputSchema: {
|
|
183
|
+
query: { type: "string", required: false },
|
|
184
|
+
limit: { type: "number", required: false },
|
|
185
|
+
},
|
|
86
186
|
async execute(input, ctx) {
|
|
87
187
|
const p = (input ?? {});
|
|
88
188
|
const body = {};
|
|
@@ -92,12 +192,18 @@ export default function notion(rl) {
|
|
|
92
192
|
body.page_size = p.limit;
|
|
93
193
|
const data = (await api(t(ctx), "POST", "/search", body));
|
|
94
194
|
return data.results;
|
|
95
|
-
}
|
|
195
|
+
},
|
|
196
|
+
});
|
|
96
197
|
// ── User ────────────────────────────────────────────
|
|
97
|
-
rl.registerAction("user.get", {
|
|
198
|
+
rl.registerAction("user.get", {
|
|
199
|
+
description: "Get a user",
|
|
98
200
|
inputSchema: { userId: { type: "string", required: true } },
|
|
99
|
-
async execute(input, ctx) {
|
|
100
|
-
|
|
201
|
+
async execute(input, ctx) {
|
|
202
|
+
return api(t(ctx), "GET", `/users/${input.userId}`);
|
|
203
|
+
},
|
|
204
|
+
});
|
|
205
|
+
rl.registerAction("user.list", {
|
|
206
|
+
description: "List all users",
|
|
101
207
|
inputSchema: { limit: { type: "number", required: false } },
|
|
102
208
|
async execute(input, ctx) {
|
|
103
209
|
const qs = {};
|
|
@@ -105,8 +211,13 @@ export default function notion(rl) {
|
|
|
105
211
|
qs.page_size = input.limit;
|
|
106
212
|
const data = (await api(t(ctx), "GET", "/users", undefined, qs));
|
|
107
213
|
return data.results;
|
|
108
|
-
}
|
|
109
|
-
|
|
214
|
+
},
|
|
215
|
+
});
|
|
216
|
+
rl.registerAction("user.me", {
|
|
217
|
+
description: "Get the bot user",
|
|
110
218
|
inputSchema: {},
|
|
111
|
-
async execute(_input, ctx) {
|
|
219
|
+
async execute(_input, ctx) {
|
|
220
|
+
return api(t(ctx), "GET", "/users/me");
|
|
221
|
+
},
|
|
222
|
+
});
|
|
112
223
|
}
|
|
@@ -25,14 +25,32 @@ export default function npm(rl) {
|
|
|
25
25
|
rl.setName("npm");
|
|
26
26
|
rl.setVersion("0.1.0");
|
|
27
27
|
rl.setConnectionSchema({
|
|
28
|
-
registryUrl: {
|
|
29
|
-
|
|
28
|
+
registryUrl: {
|
|
29
|
+
type: "string",
|
|
30
|
+
required: false,
|
|
31
|
+
description: "NPM registry URL (default: https://registry.npmjs.org)",
|
|
32
|
+
env: "NPM_REGISTRY_URL",
|
|
33
|
+
},
|
|
34
|
+
token: {
|
|
35
|
+
type: "string",
|
|
36
|
+
required: false,
|
|
37
|
+
description: "NPM auth token (optional, needed for private packages and dist-tag updates)",
|
|
38
|
+
env: "NPM_TOKEN",
|
|
39
|
+
},
|
|
30
40
|
});
|
|
31
41
|
rl.registerAction("package.getMetadata", {
|
|
32
42
|
description: "Get metadata for a package at a specific version",
|
|
33
43
|
inputSchema: {
|
|
34
|
-
packageName: {
|
|
35
|
-
|
|
44
|
+
packageName: {
|
|
45
|
+
type: "string",
|
|
46
|
+
required: true,
|
|
47
|
+
description: "Package name (e.g. lodash)",
|
|
48
|
+
},
|
|
49
|
+
version: {
|
|
50
|
+
type: "string",
|
|
51
|
+
required: false,
|
|
52
|
+
description: "Version or tag (default: latest)",
|
|
53
|
+
},
|
|
36
54
|
},
|
|
37
55
|
async execute(input, ctx) {
|
|
38
56
|
const { packageName, version } = input;
|
|
@@ -43,7 +61,11 @@ export default function npm(rl) {
|
|
|
43
61
|
rl.registerAction("package.getVersions", {
|
|
44
62
|
description: "Get all versions for a package with publish dates",
|
|
45
63
|
inputSchema: {
|
|
46
|
-
packageName: {
|
|
64
|
+
packageName: {
|
|
65
|
+
type: "string",
|
|
66
|
+
required: true,
|
|
67
|
+
description: "Package name",
|
|
68
|
+
},
|
|
47
69
|
},
|
|
48
70
|
async execute(input, ctx) {
|
|
49
71
|
const { packageName } = input;
|
|
@@ -52,7 +74,8 @@ export default function npm(rl) {
|
|
|
52
74
|
const versions = Object.entries(time)
|
|
53
75
|
.filter(([v]) => /^\d+\.\d+\.\d+/.test(v))
|
|
54
76
|
.map(([version, published_at]) => ({ version, published_at }))
|
|
55
|
-
.sort((a, b) => new Date(b.published_at).getTime() -
|
|
77
|
+
.sort((a, b) => new Date(b.published_at).getTime() -
|
|
78
|
+
new Date(a.published_at).getTime());
|
|
56
79
|
return versions;
|
|
57
80
|
},
|
|
58
81
|
});
|
|
@@ -60,8 +83,16 @@ export default function npm(rl) {
|
|
|
60
83
|
description: "Search for packages on the npm registry",
|
|
61
84
|
inputSchema: {
|
|
62
85
|
query: { type: "string", required: true, description: "Search query" },
|
|
63
|
-
limit: {
|
|
64
|
-
|
|
86
|
+
limit: {
|
|
87
|
+
type: "number",
|
|
88
|
+
required: false,
|
|
89
|
+
description: "Max results (default 10, max 100)",
|
|
90
|
+
},
|
|
91
|
+
offset: {
|
|
92
|
+
type: "number",
|
|
93
|
+
required: false,
|
|
94
|
+
description: "Offset for pagination (default 0)",
|
|
95
|
+
},
|
|
65
96
|
},
|
|
66
97
|
async execute(input, ctx) {
|
|
67
98
|
const p = (input ?? {});
|
|
@@ -82,7 +113,11 @@ export default function npm(rl) {
|
|
|
82
113
|
rl.registerAction("distTag.list", {
|
|
83
114
|
description: "Get all dist-tags for a package",
|
|
84
115
|
inputSchema: {
|
|
85
|
-
packageName: {
|
|
116
|
+
packageName: {
|
|
117
|
+
type: "string",
|
|
118
|
+
required: true,
|
|
119
|
+
description: "Package name",
|
|
120
|
+
},
|
|
86
121
|
},
|
|
87
122
|
async execute(input, ctx) {
|
|
88
123
|
const { packageName } = input;
|
|
@@ -92,9 +127,21 @@ export default function npm(rl) {
|
|
|
92
127
|
rl.registerAction("distTag.update", {
|
|
93
128
|
description: "Update a dist-tag for a package (requires auth)",
|
|
94
129
|
inputSchema: {
|
|
95
|
-
packageName: {
|
|
96
|
-
|
|
97
|
-
|
|
130
|
+
packageName: {
|
|
131
|
+
type: "string",
|
|
132
|
+
required: true,
|
|
133
|
+
description: "Package name",
|
|
134
|
+
},
|
|
135
|
+
tagName: {
|
|
136
|
+
type: "string",
|
|
137
|
+
required: true,
|
|
138
|
+
description: "Dist-tag name (e.g. latest)",
|
|
139
|
+
},
|
|
140
|
+
version: {
|
|
141
|
+
type: "string",
|
|
142
|
+
required: true,
|
|
143
|
+
description: "Version to point the tag to",
|
|
144
|
+
},
|
|
98
145
|
},
|
|
99
146
|
async execute(input, ctx) {
|
|
100
147
|
const { packageName, tagName, version } = input;
|
|
@@ -18,7 +18,12 @@ function getDBName(db, url) {
|
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
20
|
async function jsonRpc(url, params) {
|
|
21
|
-
const body = {
|
|
21
|
+
const body = {
|
|
22
|
+
jsonrpc: "2.0",
|
|
23
|
+
method: "call",
|
|
24
|
+
params,
|
|
25
|
+
id: Math.floor(Math.random() * 1000),
|
|
26
|
+
};
|
|
22
27
|
const res = await fetch(`${url}/jsonrpc`, {
|
|
23
28
|
method: "POST",
|
|
24
29
|
headers: { "Content-Type": "application/json" },
|
|
@@ -35,14 +40,19 @@ async function jsonRpc(url, params) {
|
|
|
35
40
|
return json.result;
|
|
36
41
|
}
|
|
37
42
|
async function login(url, db, username, password) {
|
|
38
|
-
const uid = (await jsonRpc(url, {
|
|
43
|
+
const uid = (await jsonRpc(url, {
|
|
44
|
+
service: "common",
|
|
45
|
+
method: "login",
|
|
46
|
+
args: [db, username, password],
|
|
47
|
+
}));
|
|
39
48
|
if (!uid)
|
|
40
49
|
throw new Error("Odoo login failed — check credentials");
|
|
41
50
|
return uid;
|
|
42
51
|
}
|
|
43
52
|
async function execute(url, db, uid, password, model, method, ...args) {
|
|
44
53
|
return jsonRpc(url, {
|
|
45
|
-
service: "object",
|
|
54
|
+
service: "object",
|
|
55
|
+
method: "execute",
|
|
46
56
|
args: [db, uid, password, model, method, ...args],
|
|
47
57
|
});
|
|
48
58
|
}
|
|
@@ -58,10 +68,30 @@ export default function odoo(rl) {
|
|
|
58
68
|
rl.setName("odoo");
|
|
59
69
|
rl.setVersion("0.1.0");
|
|
60
70
|
rl.setConnectionSchema({
|
|
61
|
-
url: {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
71
|
+
url: {
|
|
72
|
+
type: "string",
|
|
73
|
+
required: true,
|
|
74
|
+
description: "Odoo instance URL (e.g. https://mycompany.odoo.com)",
|
|
75
|
+
env: "ODOO_URL",
|
|
76
|
+
},
|
|
77
|
+
db: {
|
|
78
|
+
type: "string",
|
|
79
|
+
required: false,
|
|
80
|
+
description: "Database name (auto-detected from URL if omitted)",
|
|
81
|
+
env: "ODOO_DB",
|
|
82
|
+
},
|
|
83
|
+
username: {
|
|
84
|
+
type: "string",
|
|
85
|
+
required: true,
|
|
86
|
+
description: "Odoo username (email)",
|
|
87
|
+
env: "ODOO_USERNAME",
|
|
88
|
+
},
|
|
89
|
+
password: {
|
|
90
|
+
type: "string",
|
|
91
|
+
required: true,
|
|
92
|
+
description: "Odoo password or API key",
|
|
93
|
+
env: "ODOO_PASSWORD",
|
|
94
|
+
},
|
|
65
95
|
});
|
|
66
96
|
// Helper to get authenticated session
|
|
67
97
|
async function getSession(ctx) {
|
|
@@ -73,8 +103,16 @@ export default function odoo(rl) {
|
|
|
73
103
|
rl.registerAction("record.create", {
|
|
74
104
|
description: "Create a record in any Odoo model (contact, opportunity, note, or custom model name)",
|
|
75
105
|
inputSchema: {
|
|
76
|
-
model: {
|
|
77
|
-
|
|
106
|
+
model: {
|
|
107
|
+
type: "string",
|
|
108
|
+
required: true,
|
|
109
|
+
description: "Model: contact, opportunity, note, or Odoo model name (e.g. res.partner)",
|
|
110
|
+
},
|
|
111
|
+
fields: {
|
|
112
|
+
type: "object",
|
|
113
|
+
required: true,
|
|
114
|
+
description: "Fields to set on the new record",
|
|
115
|
+
},
|
|
78
116
|
},
|
|
79
117
|
async execute(input, ctx) {
|
|
80
118
|
const { model, fields } = input;
|
|
@@ -86,9 +124,17 @@ export default function odoo(rl) {
|
|
|
86
124
|
rl.registerAction("record.get", {
|
|
87
125
|
description: "Read a record by ID",
|
|
88
126
|
inputSchema: {
|
|
89
|
-
model: {
|
|
127
|
+
model: {
|
|
128
|
+
type: "string",
|
|
129
|
+
required: true,
|
|
130
|
+
description: "Model: contact, opportunity, note, or Odoo model name",
|
|
131
|
+
},
|
|
90
132
|
id: { type: "number", required: true, description: "Record ID" },
|
|
91
|
-
fields: {
|
|
133
|
+
fields: {
|
|
134
|
+
type: "object",
|
|
135
|
+
required: false,
|
|
136
|
+
description: "Array of field names to return (default: all)",
|
|
137
|
+
},
|
|
92
138
|
},
|
|
93
139
|
async execute(input, ctx) {
|
|
94
140
|
const p = input;
|
|
@@ -100,11 +146,31 @@ export default function odoo(rl) {
|
|
|
100
146
|
rl.registerAction("record.list", {
|
|
101
147
|
description: "Search and read records from any Odoo model",
|
|
102
148
|
inputSchema: {
|
|
103
|
-
model: {
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
149
|
+
model: {
|
|
150
|
+
type: "string",
|
|
151
|
+
required: true,
|
|
152
|
+
description: "Model: contact, opportunity, note, or Odoo model name",
|
|
153
|
+
},
|
|
154
|
+
filters: {
|
|
155
|
+
type: "object",
|
|
156
|
+
required: false,
|
|
157
|
+
description: 'Array of filter tuples, e.g. [["name", "like", "test"]]',
|
|
158
|
+
},
|
|
159
|
+
fields: {
|
|
160
|
+
type: "object",
|
|
161
|
+
required: false,
|
|
162
|
+
description: "Array of field names to return",
|
|
163
|
+
},
|
|
164
|
+
limit: {
|
|
165
|
+
type: "number",
|
|
166
|
+
required: false,
|
|
167
|
+
description: "Max records (0 = no limit)",
|
|
168
|
+
},
|
|
169
|
+
offset: {
|
|
170
|
+
type: "number",
|
|
171
|
+
required: false,
|
|
172
|
+
description: "Offset for pagination",
|
|
173
|
+
},
|
|
108
174
|
},
|
|
109
175
|
async execute(input, ctx) {
|
|
110
176
|
const p = input;
|
|
@@ -119,9 +185,17 @@ export default function odoo(rl) {
|
|
|
119
185
|
rl.registerAction("record.update", {
|
|
120
186
|
description: "Update a record by ID",
|
|
121
187
|
inputSchema: {
|
|
122
|
-
model: {
|
|
188
|
+
model: {
|
|
189
|
+
type: "string",
|
|
190
|
+
required: true,
|
|
191
|
+
description: "Model: contact, opportunity, note, or Odoo model name",
|
|
192
|
+
},
|
|
123
193
|
id: { type: "number", required: true, description: "Record ID" },
|
|
124
|
-
fields: {
|
|
194
|
+
fields: {
|
|
195
|
+
type: "object",
|
|
196
|
+
required: true,
|
|
197
|
+
description: "Fields to update",
|
|
198
|
+
},
|
|
125
199
|
},
|
|
126
200
|
async execute(input, ctx) {
|
|
127
201
|
const p = input;
|
|
@@ -133,7 +207,11 @@ export default function odoo(rl) {
|
|
|
133
207
|
rl.registerAction("record.delete", {
|
|
134
208
|
description: "Delete a record by ID",
|
|
135
209
|
inputSchema: {
|
|
136
|
-
model: {
|
|
210
|
+
model: {
|
|
211
|
+
type: "string",
|
|
212
|
+
required: true,
|
|
213
|
+
description: "Model: contact, opportunity, note, or Odoo model name",
|
|
214
|
+
},
|
|
137
215
|
id: { type: "number", required: true, description: "Record ID" },
|
|
138
216
|
},
|
|
139
217
|
async execute(input, ctx) {
|
|
@@ -146,7 +224,11 @@ export default function odoo(rl) {
|
|
|
146
224
|
rl.registerAction("model.getFields", {
|
|
147
225
|
description: "Get field definitions for an Odoo model",
|
|
148
226
|
inputSchema: {
|
|
149
|
-
model: {
|
|
227
|
+
model: {
|
|
228
|
+
type: "string",
|
|
229
|
+
required: true,
|
|
230
|
+
description: "Model: contact, opportunity, note, or Odoo model name",
|
|
231
|
+
},
|
|
150
232
|
},
|
|
151
233
|
async execute(input, ctx) {
|
|
152
234
|
const { model } = input;
|
|
@@ -50,19 +50,41 @@ export default function okta(rl) {
|
|
|
50
50
|
rl.setName("okta");
|
|
51
51
|
rl.setVersion("0.1.0");
|
|
52
52
|
rl.setConnectionSchema({
|
|
53
|
-
url: {
|
|
54
|
-
|
|
53
|
+
url: {
|
|
54
|
+
type: "string",
|
|
55
|
+
required: true,
|
|
56
|
+
description: "Okta org URL (e.g. https://yourorg.okta.com)",
|
|
57
|
+
env: "OKTA_URL",
|
|
58
|
+
},
|
|
59
|
+
apiToken: {
|
|
60
|
+
type: "string",
|
|
61
|
+
required: true,
|
|
62
|
+
description: "Okta API token (SSWS)",
|
|
63
|
+
env: "OKTA_API_TOKEN",
|
|
64
|
+
},
|
|
55
65
|
});
|
|
56
66
|
rl.registerAction("user.create", {
|
|
57
67
|
description: "Create a new user in Okta",
|
|
58
68
|
inputSchema: {
|
|
59
69
|
firstName: { type: "string", required: true },
|
|
60
70
|
lastName: { type: "string", required: true },
|
|
61
|
-
login: {
|
|
71
|
+
login: {
|
|
72
|
+
type: "string",
|
|
73
|
+
required: true,
|
|
74
|
+
description: "Username (must be email)",
|
|
75
|
+
},
|
|
62
76
|
email: { type: "string", required: true },
|
|
63
|
-
activate: {
|
|
77
|
+
activate: {
|
|
78
|
+
type: "boolean",
|
|
79
|
+
required: false,
|
|
80
|
+
description: "Activate user immediately (default true)",
|
|
81
|
+
},
|
|
64
82
|
password: { type: "string", required: false },
|
|
65
|
-
profile: {
|
|
83
|
+
profile: {
|
|
84
|
+
type: "object",
|
|
85
|
+
required: false,
|
|
86
|
+
description: "Additional profile fields (city, department, displayName, etc.)",
|
|
87
|
+
},
|
|
66
88
|
},
|
|
67
89
|
async execute(input, ctx) {
|
|
68
90
|
const p = input;
|
|
@@ -79,7 +101,9 @@ export default function okta(rl) {
|
|
|
79
101
|
if (p.password) {
|
|
80
102
|
body.credentials = { password: { value: p.password } };
|
|
81
103
|
}
|
|
82
|
-
const qs = {
|
|
104
|
+
const qs = {
|
|
105
|
+
activate: p.activate !== false ? "true" : "false",
|
|
106
|
+
};
|
|
83
107
|
const { data } = await apiRequest(conn, "POST", "/api/v1/users/", body, qs);
|
|
84
108
|
return data;
|
|
85
109
|
},
|
|
@@ -87,7 +111,11 @@ export default function okta(rl) {
|
|
|
87
111
|
rl.registerAction("user.get", {
|
|
88
112
|
description: "Get user details by ID or login",
|
|
89
113
|
inputSchema: {
|
|
90
|
-
userId: {
|
|
114
|
+
userId: {
|
|
115
|
+
type: "string",
|
|
116
|
+
required: true,
|
|
117
|
+
description: "User ID or login (email)",
|
|
118
|
+
},
|
|
91
119
|
},
|
|
92
120
|
async execute(input, ctx) {
|
|
93
121
|
const { userId } = input;
|
|
@@ -98,8 +126,16 @@ export default function okta(rl) {
|
|
|
98
126
|
rl.registerAction("user.list", {
|
|
99
127
|
description: "List users (with optional search query)",
|
|
100
128
|
inputSchema: {
|
|
101
|
-
search: {
|
|
102
|
-
|
|
129
|
+
search: {
|
|
130
|
+
type: "string",
|
|
131
|
+
required: false,
|
|
132
|
+
description: 'Search/filter query, e.g. profile.lastName sw "Smi"',
|
|
133
|
+
},
|
|
134
|
+
limit: {
|
|
135
|
+
type: "number",
|
|
136
|
+
required: false,
|
|
137
|
+
description: "Max results (default all)",
|
|
138
|
+
},
|
|
103
139
|
},
|
|
104
140
|
async execute(input, ctx) {
|
|
105
141
|
const p = (input ?? {});
|
|
@@ -119,7 +155,11 @@ export default function okta(rl) {
|
|
|
119
155
|
description: "Update a user's profile",
|
|
120
156
|
inputSchema: {
|
|
121
157
|
userId: { type: "string", required: true, description: "User ID" },
|
|
122
|
-
profile: {
|
|
158
|
+
profile: {
|
|
159
|
+
type: "object",
|
|
160
|
+
required: true,
|
|
161
|
+
description: "Profile fields to update (firstName, lastName, email, login, city, department, etc.)",
|
|
162
|
+
},
|
|
123
163
|
},
|
|
124
164
|
async execute(input, ctx) {
|
|
125
165
|
const { userId, profile } = input;
|