runline 0.2.1 → 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.
Files changed (189) hide show
  1. package/dist/plugins/actionNetwork/src/index.js +118 -25
  2. package/dist/plugins/activeCampaign/src/index.js +184 -38
  3. package/dist/plugins/adalo/src/index.js +40 -8
  4. package/dist/plugins/affinity/src/index.js +100 -20
  5. package/dist/plugins/agileCrm/src/index.js +115 -27
  6. package/dist/plugins/airtable/src/index.js +94 -19
  7. package/dist/plugins/airtop/src/index.js +266 -62
  8. package/dist/plugins/apiTemplateIo/src/index.js +25 -5
  9. package/dist/plugins/asana/src/index.js +195 -41
  10. package/dist/plugins/autopilot/src/index.js +39 -8
  11. package/dist/plugins/bambooHr/src/index.js +109 -22
  12. package/dist/plugins/bannerbear/src/index.js +36 -8
  13. package/dist/plugins/baserow/src/index.js +35 -7
  14. package/dist/plugins/beeminder/src/index.js +198 -40
  15. package/dist/plugins/bitly/src/index.js +46 -10
  16. package/dist/plugins/bitwarden/src/index.js +167 -36
  17. package/dist/plugins/box/src/index.js +172 -37
  18. package/dist/plugins/brandfetch/src/index.js +5 -1
  19. package/dist/plugins/brevo/src/index.js +136 -29
  20. package/dist/plugins/bubble/src/index.js +76 -17
  21. package/dist/plugins/chargebee/src/index.js +35 -7
  22. package/dist/plugins/circleci/src/index.js +50 -10
  23. package/dist/plugins/ciscoWebex/src/index.js +131 -27
  24. package/dist/plugins/clearbit/src/index.js +76 -17
  25. package/dist/plugins/clickup/src/index.js +500 -107
  26. package/dist/plugins/clockify/src/index.js +229 -47
  27. package/dist/plugins/cloudflare/src/index.js +28 -6
  28. package/dist/plugins/cockpit/src/index.js +54 -12
  29. package/dist/plugins/coda/src/index.js +81 -19
  30. package/dist/plugins/coingecko/src/index.js +157 -33
  31. package/dist/plugins/contentful/src/index.js +85 -17
  32. package/dist/plugins/convertkit/src/index.js +74 -18
  33. package/dist/plugins/copper/src/index.js +59 -11
  34. package/dist/plugins/cortex/src/index.js +55 -13
  35. package/dist/plugins/currents/src/index.js +310 -71
  36. package/dist/plugins/customerIo/src/index.js +112 -23
  37. package/dist/plugins/databricks/src/index.js +549 -115
  38. package/dist/plugins/deepl/src/index.js +26 -6
  39. package/dist/plugins/demio/src/index.js +56 -11
  40. package/dist/plugins/dhl/src/index.js +16 -3
  41. package/dist/plugins/discord/src/index.js +141 -31
  42. package/dist/plugins/discourse/src/index.js +136 -31
  43. package/dist/plugins/disqus/src/index.js +96 -20
  44. package/dist/plugins/docker/src/index.js +20 -4
  45. package/dist/plugins/drift/src/index.js +19 -5
  46. package/dist/plugins/dropbox/src/index.js +139 -30
  47. package/dist/plugins/dropcontact/src/index.js +21 -4
  48. package/dist/plugins/egoi/src/index.js +61 -15
  49. package/dist/plugins/elasticsearch/src/index.js +59 -13
  50. package/dist/plugins/emelia/src/index.js +95 -19
  51. package/dist/plugins/erpnext/src/index.js +74 -15
  52. package/dist/plugins/facebookGraph/src/index.js +52 -11
  53. package/dist/plugins/freshdesk/src/index.js +220 -48
  54. package/dist/plugins/freshservice/src/index.js +39 -9
  55. package/dist/plugins/freshworksCrm/src/index.js +58 -12
  56. package/dist/plugins/getresponse/src/index.js +87 -18
  57. package/dist/plugins/ghost/src/index.js +114 -26
  58. package/dist/plugins/github/src/index.js +483 -109
  59. package/dist/plugins/gitlab/src/index.js +193 -45
  60. package/dist/plugins/gong/src/index.js +68 -14
  61. package/dist/plugins/gotify/src/index.js +43 -9
  62. package/dist/plugins/gotowebinar/src/index.js +233 -47
  63. package/dist/plugins/grafana/src/index.js +92 -21
  64. package/dist/plugins/graphql/src/index.js +38 -8
  65. package/dist/plugins/grist/src/index.js +52 -10
  66. package/dist/plugins/hackernews/src/index.js +32 -6
  67. package/dist/plugins/halopsa/src/index.js +131 -26
  68. package/dist/plugins/harvest/src/index.js +182 -42
  69. package/dist/plugins/helpscout/src/index.js +153 -31
  70. package/dist/plugins/highlevel/src/index.js +291 -58
  71. package/dist/plugins/homeAssistant/src/index.js +124 -26
  72. package/dist/plugins/hubspot/src/index.js +163 -29
  73. package/dist/plugins/humanticAi/src/index.js +54 -5
  74. package/dist/plugins/hunter/src/index.js +21 -4
  75. package/dist/plugins/intercom/src/index.js +95 -20
  76. package/dist/plugins/iterable/src/index.js +96 -20
  77. package/dist/plugins/jenkins/src/index.js +75 -17
  78. package/dist/plugins/jira/src/index.js +193 -43
  79. package/dist/plugins/keap/src/index.js +222 -56
  80. package/dist/plugins/kobotoolbox/src/index.js +113 -25
  81. package/dist/plugins/lemlist/src/index.js +79 -18
  82. package/dist/plugins/linear/src/index.js +86 -19
  83. package/dist/plugins/lingvanex/src/index.js +38 -8
  84. package/dist/plugins/linkedin/src/index.js +37 -8
  85. package/dist/plugins/lonescale/src/index.js +41 -9
  86. package/dist/plugins/magento/src/index.js +98 -27
  87. package/dist/plugins/mailcheck/src/index.js +11 -2
  88. package/dist/plugins/mailchimp/src/index.js +193 -42
  89. package/dist/plugins/mailerlite/src/index.js +61 -12
  90. package/dist/plugins/mailgun/src/index.js +39 -7
  91. package/dist/plugins/mailjet/src/index.js +141 -30
  92. package/dist/plugins/mandrill/src/index.js +67 -14
  93. package/dist/plugins/marketstack/src/index.js +56 -10
  94. package/dist/plugins/matrix/src/index.js +97 -20
  95. package/dist/plugins/mattermost/src/index.js +124 -26
  96. package/dist/plugins/mautic/src/index.js +129 -26
  97. package/dist/plugins/medium/src/index.js +64 -13
  98. package/dist/plugins/messagebird/src/index.js +80 -15
  99. package/dist/plugins/metabase/src/index.js +57 -12
  100. package/dist/plugins/misp/src/index.js +135 -33
  101. package/dist/plugins/mocean/src/index.js +33 -7
  102. package/dist/plugins/monday/src/index.js +97 -23
  103. package/dist/plugins/monicaCrm/src/index.js +112 -23
  104. package/dist/plugins/msg91/src/index.js +11 -2
  105. package/dist/plugins/nasa/src/index.js +108 -21
  106. package/dist/plugins/netlify/src/index.js +28 -6
  107. package/dist/plugins/netscalerAdc/src/index.js +144 -29
  108. package/dist/plugins/nextcloud/src/index.js +103 -20
  109. package/dist/plugins/nocodb/src/index.js +57 -11
  110. package/dist/plugins/notion/src/index.js +148 -37
  111. package/dist/plugins/npm/src/index.js +59 -12
  112. package/dist/plugins/odoo/src/index.js +102 -20
  113. package/dist/plugins/okta/src/index.js +50 -10
  114. package/dist/plugins/oneSimpleApi/src/index.js +84 -17
  115. package/dist/plugins/onfleet/src/index.js +139 -32
  116. package/dist/plugins/openThesaurus/src/index.js +46 -9
  117. package/dist/plugins/openweathermap/src/index.js +31 -6
  118. package/dist/plugins/oura/src/index.js +36 -7
  119. package/dist/plugins/paddle/src/index.js +80 -17
  120. package/dist/plugins/pagerduty/src/index.js +53 -12
  121. package/dist/plugins/paypal/src/index.js +51 -11
  122. package/dist/plugins/peekalink/src/index.js +12 -3
  123. package/dist/plugins/phantombuster/src/index.js +39 -8
  124. package/dist/plugins/philipsHue/src/index.js +64 -13
  125. package/dist/plugins/pipedrive/src/index.js +167 -45
  126. package/dist/plugins/plivo/src/index.js +43 -8
  127. package/dist/plugins/postbin/src/index.js +9 -2
  128. package/dist/plugins/posthog/src/index.js +50 -13
  129. package/dist/plugins/profitwell/src/index.js +24 -5
  130. package/dist/plugins/pushbullet/src/index.js +45 -9
  131. package/dist/plugins/pushcut/src/index.js +31 -6
  132. package/dist/plugins/pushover/src/index.js +51 -10
  133. package/dist/plugins/quickbase/src/index.js +66 -13
  134. package/dist/plugins/quickbooks/src/index.js +86 -19
  135. package/dist/plugins/quickchart/src/index.js +35 -7
  136. package/dist/plugins/raindrop/src/index.js +54 -13
  137. package/dist/plugins/reddit/src/index.js +73 -18
  138. package/dist/plugins/rocketchat/src/index.js +47 -9
  139. package/dist/plugins/rundeck/src/index.js +26 -5
  140. package/dist/plugins/salesforce/src/index.js +161 -31
  141. package/dist/plugins/salesmate/src/index.js +75 -16
  142. package/dist/plugins/securityScorecard/src/index.js +73 -15
  143. package/dist/plugins/segment/src/index.js +21 -4
  144. package/dist/plugins/sendgrid/src/index.js +102 -24
  145. package/dist/plugins/sendy/src/index.js +54 -11
  146. package/dist/plugins/sentry/src/index.js +174 -34
  147. package/dist/plugins/servicenow/src/index.js +120 -27
  148. package/dist/plugins/shopify/src/index.js +53 -12
  149. package/dist/plugins/signl4/src/index.js +16 -3
  150. package/dist/plugins/slack/src/index.js +407 -105
  151. package/dist/plugins/sms77/src/index.js +26 -5
  152. package/dist/plugins/splunk/src/index.js +186 -45
  153. package/dist/plugins/spotify/src/index.js +265 -66
  154. package/dist/plugins/stackby/src/index.js +18 -6
  155. package/dist/plugins/storyblok/src/index.js +57 -11
  156. package/dist/plugins/strapi/src/index.js +63 -12
  157. package/dist/plugins/strava/src/index.js +58 -13
  158. package/dist/plugins/stripe/src/index.js +143 -30
  159. package/dist/plugins/supabase/src/index.js +49 -10
  160. package/dist/plugins/syncromsp/src/index.js +245 -67
  161. package/dist/plugins/tapfiliate/src/index.js +57 -14
  162. package/dist/plugins/telegram/src/index.js +202 -39
  163. package/dist/plugins/thehive/src/index.js +271 -66
  164. package/dist/plugins/thehiveProject/src/index.js +457 -89
  165. package/dist/plugins/todoist/src/index.js +326 -77
  166. package/dist/plugins/travisci/src/index.js +35 -8
  167. package/dist/plugins/trello/src/index.js +204 -46
  168. package/dist/plugins/twake/src/index.js +10 -2
  169. package/dist/plugins/twilio/src/index.js +56 -11
  170. package/dist/plugins/twist/src/index.js +241 -48
  171. package/dist/plugins/twitter/src/index.js +128 -30
  172. package/dist/plugins/unleashedSoftware/src/index.js +30 -6
  173. package/dist/plugins/uplead/src/index.js +9 -2
  174. package/dist/plugins/uproc/src/index.js +31 -6
  175. package/dist/plugins/uptimerobot/src/index.js +119 -25
  176. package/dist/plugins/urlscanio/src/index.js +25 -6
  177. package/dist/plugins/vero/src/index.js +68 -13
  178. package/dist/plugins/vonage/src/index.js +32 -6
  179. package/dist/plugins/wekan/src/index.js +297 -52
  180. package/dist/plugins/woocommerce/src/index.js +57 -12
  181. package/dist/plugins/wordpress/src/index.js +94 -18
  182. package/dist/plugins/xero/src/index.js +79 -13
  183. package/dist/plugins/yourls/src/index.js +33 -6
  184. package/dist/plugins/zammad/src/index.js +139 -36
  185. package/dist/plugins/zendesk/src/index.js +201 -48
  186. package/dist/plugins/zoho/src/index.js +88 -21
  187. package/dist/plugins/zoom/src/index.js +41 -7
  188. package/dist/plugins/zulip/src/index.js +101 -20
  189. package/package.json +1 -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 = { method, headers: { Authorization: `Bearer ${token}`, "Notion-Version": NOTION_VERSION, "Content-Type": "application/json" } };
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({ apiKey: { type: "string", required: true, description: "Notion integration token (secret_...)", env: "NOTION_API_KEY" } });
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", { description: "Append children blocks to a block/page",
26
- inputSchema: { blockId: { type: "string", required: true }, children: { type: "object", required: true, description: "Array of block objects" } },
27
- async execute(input, ctx) { const p = input; return api(t(ctx), "PATCH", `/blocks/${p.blockId}/children`, { children: p.children }); } });
28
- rl.registerAction("block.getChildren", { description: "Get child blocks of a block/page",
29
- inputSchema: { blockId: { type: "string", required: true }, limit: { type: "number", required: false } },
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
- rl.registerAction("block.delete", { description: "Delete (archive) a block",
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) { return api(t(ctx), "DELETE", `/blocks/${input.blockId}`); } });
74
+ async execute(input, ctx) {
75
+ return api(t(ctx), "DELETE", `/blocks/${input.blockId}`);
76
+ },
77
+ });
41
78
  // ── Database ────────────────────────────────────────
42
- rl.registerAction("database.get", { description: "Get a database",
79
+ rl.registerAction("database.get", {
80
+ description: "Get a database",
43
81
  inputSchema: { databaseId: { type: "string", required: true } },
44
- async execute(input, ctx) { return api(t(ctx), "GET", `/databases/${input.databaseId}`); } });
45
- rl.registerAction("database.list", { description: "List all databases (via search)",
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 = { filter: { property: "object", value: "database" } };
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
- rl.registerAction("database.query", { description: "Query a database (list pages with filters)",
55
- inputSchema: { databaseId: { type: "string", required: true }, filter: { type: "object", required: false, description: "Notion filter object" }, sorts: { type: "object", required: false, description: "Array of sort objects" }, limit: { type: "number", required: false } },
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", { description: "Create a page (in a database or under a page)",
70
- inputSchema: { parent: { type: "object", required: true, description: "{ database_id: '...' } or { page_id: '...' }" }, properties: { type: "object", required: true, description: "Page properties" }, children: { type: "object", required: false, description: "Array of block children" }, icon: { type: "object", required: false } },
71
- async execute(input, ctx) { return api(t(ctx), "POST", "/pages", input); } });
72
- rl.registerAction("page.get", { description: "Get a page",
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) { return api(t(ctx), "GET", `/pages/${input.pageId}`); } });
75
- rl.registerAction("page.update", { description: "Update page properties",
76
- inputSchema: { pageId: { type: "string", required: true }, properties: { type: "object", required: false }, archived: { type: "boolean", required: false }, icon: { type: "object", required: false } },
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
- rl.registerAction("page.archive", { description: "Archive a page",
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) { return api(t(ctx), "PATCH", `/pages/${input.pageId}`, { archived: true }); } });
84
- rl.registerAction("page.search", { description: "Search pages",
85
- inputSchema: { query: { type: "string", required: false }, limit: { type: "number", required: false } },
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", { description: "Get a user",
198
+ rl.registerAction("user.get", {
199
+ description: "Get a user",
98
200
  inputSchema: { userId: { type: "string", required: true } },
99
- async execute(input, ctx) { return api(t(ctx), "GET", `/users/${input.userId}`); } });
100
- rl.registerAction("user.list", { description: "List all users",
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
- rl.registerAction("user.me", { description: "Get the bot user",
214
+ },
215
+ });
216
+ rl.registerAction("user.me", {
217
+ description: "Get the bot user",
110
218
  inputSchema: {},
111
- async execute(_input, ctx) { return api(t(ctx), "GET", "/users/me"); } });
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: { type: "string", required: false, description: "NPM registry URL (default: https://registry.npmjs.org)", env: "NPM_REGISTRY_URL" },
29
- token: { type: "string", required: false, description: "NPM auth token (optional, needed for private packages and dist-tag updates)", env: "NPM_TOKEN" },
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: { type: "string", required: true, description: "Package name (e.g. lodash)" },
35
- version: { type: "string", required: false, description: "Version or tag (default: latest)" },
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: { type: "string", required: true, description: "Package name" },
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() - new Date(a.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: { type: "number", required: false, description: "Max results (default 10, max 100)" },
64
- offset: { type: "number", required: false, description: "Offset for pagination (default 0)" },
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: { type: "string", required: true, description: "Package name" },
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: { type: "string", required: true, description: "Package name" },
96
- tagName: { type: "string", required: true, description: "Dist-tag name (e.g. latest)" },
97
- version: { type: "string", required: true, description: "Version to point the tag to" },
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 = { jsonrpc: "2.0", method: "call", params, id: Math.floor(Math.random() * 1000) };
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, { service: "common", method: "login", args: [db, username, password] }));
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", method: "execute",
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: { type: "string", required: true, description: "Odoo instance URL (e.g. https://mycompany.odoo.com)", env: "ODOO_URL" },
62
- db: { type: "string", required: false, description: "Database name (auto-detected from URL if omitted)", env: "ODOO_DB" },
63
- username: { type: "string", required: true, description: "Odoo username (email)", env: "ODOO_USERNAME" },
64
- password: { type: "string", required: true, description: "Odoo password or API key", env: "ODOO_PASSWORD" },
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: { type: "string", required: true, description: "Model: contact, opportunity, note, or Odoo model name (e.g. res.partner)" },
77
- fields: { type: "object", required: true, description: "Fields to set on the new record" },
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: { type: "string", required: true, description: "Model: contact, opportunity, note, or Odoo model name" },
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: { type: "object", required: false, description: "Array of field names to return (default: all)" },
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: { type: "string", required: true, description: "Model: contact, opportunity, note, or Odoo model name" },
104
- filters: { type: "object", required: false, description: "Array of filter tuples, e.g. [[\"name\", \"like\", \"test\"]]" },
105
- fields: { type: "object", required: false, description: "Array of field names to return" },
106
- limit: { type: "number", required: false, description: "Max records (0 = no limit)" },
107
- offset: { type: "number", required: false, description: "Offset for pagination" },
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: { type: "string", required: true, description: "Model: contact, opportunity, note, or Odoo model name" },
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: { type: "object", required: true, description: "Fields to update" },
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: { type: "string", required: true, description: "Model: contact, opportunity, note, or Odoo model name" },
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: { type: "string", required: true, description: "Model: contact, opportunity, note, or Odoo model name" },
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: { type: "string", required: true, description: "Okta org URL (e.g. https://yourorg.okta.com)", env: "OKTA_URL" },
54
- apiToken: { type: "string", required: true, description: "Okta API token (SSWS)", env: "OKTA_API_TOKEN" },
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: { type: "string", required: true, description: "Username (must be email)" },
71
+ login: {
72
+ type: "string",
73
+ required: true,
74
+ description: "Username (must be email)",
75
+ },
62
76
  email: { type: "string", required: true },
63
- activate: { type: "boolean", required: false, description: "Activate user immediately (default true)" },
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: { type: "object", required: false, description: "Additional profile fields (city, department, displayName, etc.)" },
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 = { activate: p.activate !== false ? "true" : "false" };
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: { type: "string", required: true, description: "User ID or login (email)" },
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: { type: "string", required: false, description: "Search/filter query, e.g. profile.lastName sw \"Smi\"" },
102
- limit: { type: "number", required: false, description: "Max results (default all)" },
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: { type: "object", required: true, description: "Profile fields to update (firstName, lastName, email, login, city, department, etc.)" },
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;