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
@@ -11,7 +11,13 @@ async function api(url, apiKey, method, path, body, qs) {
11
11
  u.searchParams.set(k, String(v));
12
12
  }
13
13
  }
14
- const init = { method, headers: { Authorization: `Bearer ${apiKey}`, "Content-Type": "application/json" } };
14
+ const init = {
15
+ method,
16
+ headers: {
17
+ Authorization: `Bearer ${apiKey}`,
18
+ "Content-Type": "application/json",
19
+ },
20
+ };
15
21
  if (body && Object.keys(body).length > 0)
16
22
  init.body = JSON.stringify(body);
17
23
  const res = await fetch(u.toString(), init);
@@ -44,15 +50,31 @@ async function query(url, apiKey, scope, filters, sortFields, limit) {
44
50
  let from = 0;
45
51
  let batch;
46
52
  do {
47
- batch = (await api(url, apiKey, "POST", "/v1/query", { query: [...q, { _name: "page", from, to: from + 500 }] }) ?? []);
53
+ batch = ((await api(url, apiKey, "POST", "/v1/query", {
54
+ query: [...q, { _name: "page", from, to: from + 500 }],
55
+ })) ?? []);
48
56
  results.push(...batch);
49
57
  from += 500;
50
58
  } while (batch.length > 0);
51
59
  return results;
52
60
  }
53
61
  function searchAction(rl, name, scope, description, extraInputs) {
54
- rl.registerAction(name, { description,
55
- inputSchema: { limit: { type: "number", required: false }, filters: { type: "object", required: false, description: "Array of filter objects" }, sort: { type: "object", required: false, description: "Array of sort field objects" }, ...extraInputs },
62
+ rl.registerAction(name, {
63
+ description,
64
+ inputSchema: {
65
+ limit: { type: "number", required: false },
66
+ filters: {
67
+ type: "object",
68
+ required: false,
69
+ description: "Array of filter objects",
70
+ },
71
+ sort: {
72
+ type: "object",
73
+ required: false,
74
+ description: "Array of sort field objects",
75
+ },
76
+ ...extraInputs,
77
+ },
56
78
  async execute(input, ctx) {
57
79
  const { url, apiKey } = getConn(ctx);
58
80
  const p = (input ?? {});
@@ -65,130 +87,476 @@ function searchAction(rl, name, scope, description, extraInputs) {
65
87
  }
66
88
  // If there's scope customization via input (e.g. caseId for tasks)
67
89
  if (p.caseId && typeof scope === "object" && scope.restrictTo) {
68
- s = { query: "getCase", id: p.caseId, restrictTo: scope.restrictTo };
90
+ s = {
91
+ query: "getCase",
92
+ id: p.caseId,
93
+ restrictTo: scope.restrictTo,
94
+ };
69
95
  }
70
96
  return query(url, apiKey, s, p.filters, p.sort, p.limit);
71
- } });
97
+ },
98
+ });
72
99
  }
73
100
  export default function theHiveProject(rl) {
74
101
  rl.setName("thehiveProject");
75
102
  rl.setVersion("0.1.0");
76
103
  rl.setConnectionSchema({
77
- url: { type: "string", required: true, description: "TheHive instance URL", env: "THEHIVE_URL" },
78
- apiKey: { type: "string", required: true, description: "API key", env: "THEHIVE_API_KEY" },
104
+ url: {
105
+ type: "string",
106
+ required: true,
107
+ description: "TheHive instance URL",
108
+ env: "THEHIVE_URL",
109
+ },
110
+ apiKey: {
111
+ type: "string",
112
+ required: true,
113
+ description: "API key",
114
+ env: "THEHIVE_API_KEY",
115
+ },
79
116
  });
80
117
  // ── Alert ───────────────────────────────────────────
81
- rl.registerAction("alert.create", { description: "Create an alert",
82
- inputSchema: { type: { type: "string", required: true }, source: { type: "string", required: true }, sourceRef: { type: "string", required: true }, title: { type: "string", required: true }, description: { type: "string", required: false }, severity: { type: "number", required: false }, tlp: { type: "number", required: false }, tags: { type: "object", required: false }, customFields: { type: "object", required: false } },
83
- async execute(input, ctx) { const { url, apiKey } = getConn(ctx); return api(url, apiKey, "POST", "/v1/alert", input); } });
84
- rl.registerAction("alert.get", { description: "Get an alert by ID", inputSchema: { id: { type: "string", required: true } },
85
- async execute(input, ctx) { const { url, apiKey } = getConn(ctx); return api(url, apiKey, "GET", `/v1/alert/${input.id}`); } });
86
- rl.registerAction("alert.update", { description: "Update an alert by ID",
87
- inputSchema: { id: { type: "string", required: true }, title: { type: "string", required: false }, description: { type: "string", required: false }, severity: { type: "number", required: false }, tlp: { type: "number", required: false }, tags: { type: "object", required: false }, status: { type: "string", required: false }, customFields: { type: "object", required: false } },
88
- async execute(input, ctx) { const { url, apiKey } = getConn(ctx); const { id, ...body } = input; await api(url, apiKey, "PATCH", `/v1/alert/${id}`, body); return { success: true }; } });
89
- rl.registerAction("alert.delete", { description: "Delete an alert", inputSchema: { id: { type: "string", required: true } },
90
- async execute(input, ctx) { const { url, apiKey } = getConn(ctx); await api(url, apiKey, "DELETE", `/v1/alert/${input.id}`); return { success: true }; } });
118
+ rl.registerAction("alert.create", {
119
+ description: "Create an alert",
120
+ inputSchema: {
121
+ type: { type: "string", required: true },
122
+ source: { type: "string", required: true },
123
+ sourceRef: { type: "string", required: true },
124
+ title: { type: "string", required: true },
125
+ description: { type: "string", required: false },
126
+ severity: { type: "number", required: false },
127
+ tlp: { type: "number", required: false },
128
+ tags: { type: "object", required: false },
129
+ customFields: { type: "object", required: false },
130
+ },
131
+ async execute(input, ctx) {
132
+ const { url, apiKey } = getConn(ctx);
133
+ return api(url, apiKey, "POST", "/v1/alert", input);
134
+ },
135
+ });
136
+ rl.registerAction("alert.get", {
137
+ description: "Get an alert by ID",
138
+ inputSchema: { id: { type: "string", required: true } },
139
+ async execute(input, ctx) {
140
+ const { url, apiKey } = getConn(ctx);
141
+ return api(url, apiKey, "GET", `/v1/alert/${input.id}`);
142
+ },
143
+ });
144
+ rl.registerAction("alert.update", {
145
+ description: "Update an alert by ID",
146
+ inputSchema: {
147
+ id: { type: "string", required: true },
148
+ title: { type: "string", required: false },
149
+ description: { type: "string", required: false },
150
+ severity: { type: "number", required: false },
151
+ tlp: { type: "number", required: false },
152
+ tags: { type: "object", required: false },
153
+ status: { type: "string", required: false },
154
+ customFields: { type: "object", required: false },
155
+ },
156
+ async execute(input, ctx) {
157
+ const { url, apiKey } = getConn(ctx);
158
+ const { id, ...body } = input;
159
+ await api(url, apiKey, "PATCH", `/v1/alert/${id}`, body);
160
+ return { success: true };
161
+ },
162
+ });
163
+ rl.registerAction("alert.delete", {
164
+ description: "Delete an alert",
165
+ inputSchema: { id: { type: "string", required: true } },
166
+ async execute(input, ctx) {
167
+ const { url, apiKey } = getConn(ctx);
168
+ await api(url, apiKey, "DELETE", `/v1/alert/${input.id}`);
169
+ return { success: true };
170
+ },
171
+ });
91
172
  searchAction(rl, "alert.search", "listAlert", "Search alerts");
92
- rl.registerAction("alert.merge", { description: "Merge an alert into a case",
93
- inputSchema: { alertId: { type: "string", required: true }, caseId: { type: "string", required: true } },
94
- async execute(input, ctx) { const { url, apiKey } = getConn(ctx); const p = input; return api(url, apiKey, "POST", `/alert/${p.alertId}/merge/${p.caseId}`); } });
95
- rl.registerAction("alert.promote", { description: "Promote an alert to a case",
96
- inputSchema: { id: { type: "string", required: true }, caseTemplate: { type: "string", required: false } },
97
- async execute(input, ctx) { const { url, apiKey } = getConn(ctx); const p = input; const body = {}; if (p.caseTemplate)
98
- body.caseTemplate = p.caseTemplate; return api(url, apiKey, "POST", `/v1/alert/${p.id}/case`, body); } });
99
- rl.registerAction("alert.setStatus", { description: "Set alert status",
100
- inputSchema: { id: { type: "string", required: true }, status: { type: "string", required: true } },
101
- async execute(input, ctx) { const { url, apiKey } = getConn(ctx); const p = input; await api(url, apiKey, "PATCH", `/v1/alert/${p.id}`, { status: p.status }); return { success: true }; } });
173
+ rl.registerAction("alert.merge", {
174
+ description: "Merge an alert into a case",
175
+ inputSchema: {
176
+ alertId: { type: "string", required: true },
177
+ caseId: { type: "string", required: true },
178
+ },
179
+ async execute(input, ctx) {
180
+ const { url, apiKey } = getConn(ctx);
181
+ const p = input;
182
+ return api(url, apiKey, "POST", `/alert/${p.alertId}/merge/${p.caseId}`);
183
+ },
184
+ });
185
+ rl.registerAction("alert.promote", {
186
+ description: "Promote an alert to a case",
187
+ inputSchema: {
188
+ id: { type: "string", required: true },
189
+ caseTemplate: { type: "string", required: false },
190
+ },
191
+ async execute(input, ctx) {
192
+ const { url, apiKey } = getConn(ctx);
193
+ const p = input;
194
+ const body = {};
195
+ if (p.caseTemplate)
196
+ body.caseTemplate = p.caseTemplate;
197
+ return api(url, apiKey, "POST", `/v1/alert/${p.id}/case`, body);
198
+ },
199
+ });
200
+ rl.registerAction("alert.setStatus", {
201
+ description: "Set alert status",
202
+ inputSchema: {
203
+ id: { type: "string", required: true },
204
+ status: { type: "string", required: true },
205
+ },
206
+ async execute(input, ctx) {
207
+ const { url, apiKey } = getConn(ctx);
208
+ const p = input;
209
+ await api(url, apiKey, "PATCH", `/v1/alert/${p.id}`, {
210
+ status: p.status,
211
+ });
212
+ return { success: true };
213
+ },
214
+ });
102
215
  // ── Case ────────────────────────────────────────────
103
- rl.registerAction("case.create", { description: "Create a case",
104
- inputSchema: { title: { type: "string", required: true }, description: { type: "string", required: false }, severity: { type: "number", required: false }, tlp: { type: "number", required: false }, tags: { type: "object", required: false }, assignee: { type: "string", required: false }, customFields: { type: "object", required: false } },
105
- async execute(input, ctx) { const { url, apiKey } = getConn(ctx); return api(url, apiKey, "POST", "/v1/case", input); } });
106
- rl.registerAction("case.get", { description: "Get a case by ID", inputSchema: { id: { type: "string", required: true } },
107
- async execute(input, ctx) { const { url, apiKey } = getConn(ctx); return api(url, apiKey, "POST", "/v1/query", { query: [{ _name: "getCase", idOrName: input.id }, { _name: "page", from: 0, to: 10, extraData: ["attachmentCount"] }] }); } });
108
- rl.registerAction("case.update", { description: "Update a case by ID",
109
- inputSchema: { id: { type: "string", required: true }, title: { type: "string", required: false }, description: { type: "string", required: false }, severity: { type: "number", required: false }, tlp: { type: "number", required: false }, tags: { type: "object", required: false }, status: { type: "string", required: false }, assignee: { type: "string", required: false }, customFields: { type: "object", required: false } },
110
- async execute(input, ctx) { const { url, apiKey } = getConn(ctx); const { id, ...body } = input; await api(url, apiKey, "PATCH", `/v1/case/${id}`, body); return { success: true }; } });
111
- rl.registerAction("case.delete", { description: "Delete a case", inputSchema: { id: { type: "string", required: true } },
112
- async execute(input, ctx) { const { url, apiKey } = getConn(ctx); await api(url, apiKey, "DELETE", `/v1/case/${input.id}`); return { success: true }; } });
216
+ rl.registerAction("case.create", {
217
+ description: "Create a case",
218
+ inputSchema: {
219
+ title: { type: "string", required: true },
220
+ description: { type: "string", required: false },
221
+ severity: { type: "number", required: false },
222
+ tlp: { type: "number", required: false },
223
+ tags: { type: "object", required: false },
224
+ assignee: { type: "string", required: false },
225
+ customFields: { type: "object", required: false },
226
+ },
227
+ async execute(input, ctx) {
228
+ const { url, apiKey } = getConn(ctx);
229
+ return api(url, apiKey, "POST", "/v1/case", input);
230
+ },
231
+ });
232
+ rl.registerAction("case.get", {
233
+ description: "Get a case by ID",
234
+ inputSchema: { id: { type: "string", required: true } },
235
+ async execute(input, ctx) {
236
+ const { url, apiKey } = getConn(ctx);
237
+ return api(url, apiKey, "POST", "/v1/query", {
238
+ query: [
239
+ { _name: "getCase", idOrName: input.id },
240
+ { _name: "page", from: 0, to: 10, extraData: ["attachmentCount"] },
241
+ ],
242
+ });
243
+ },
244
+ });
245
+ rl.registerAction("case.update", {
246
+ description: "Update a case by ID",
247
+ inputSchema: {
248
+ id: { type: "string", required: true },
249
+ title: { type: "string", required: false },
250
+ description: { type: "string", required: false },
251
+ severity: { type: "number", required: false },
252
+ tlp: { type: "number", required: false },
253
+ tags: { type: "object", required: false },
254
+ status: { type: "string", required: false },
255
+ assignee: { type: "string", required: false },
256
+ customFields: { type: "object", required: false },
257
+ },
258
+ async execute(input, ctx) {
259
+ const { url, apiKey } = getConn(ctx);
260
+ const { id, ...body } = input;
261
+ await api(url, apiKey, "PATCH", `/v1/case/${id}`, body);
262
+ return { success: true };
263
+ },
264
+ });
265
+ rl.registerAction("case.delete", {
266
+ description: "Delete a case",
267
+ inputSchema: { id: { type: "string", required: true } },
268
+ async execute(input, ctx) {
269
+ const { url, apiKey } = getConn(ctx);
270
+ await api(url, apiKey, "DELETE", `/v1/case/${input.id}`);
271
+ return { success: true };
272
+ },
273
+ });
113
274
  searchAction(rl, "case.search", "listCase", "Search cases");
114
- rl.registerAction("case.getTimeline", { description: "Get case timeline", inputSchema: { id: { type: "string", required: true } },
115
- async execute(input, ctx) { const { url, apiKey } = getConn(ctx); return api(url, apiKey, "GET", `/v1/case/${input.id}/timeline`); } });
275
+ rl.registerAction("case.getTimeline", {
276
+ description: "Get case timeline",
277
+ inputSchema: { id: { type: "string", required: true } },
278
+ async execute(input, ctx) {
279
+ const { url, apiKey } = getConn(ctx);
280
+ return api(url, apiKey, "GET", `/v1/case/${input.id}/timeline`);
281
+ },
282
+ });
116
283
  // ── Task ────────────────────────────────────────────
117
- rl.registerAction("task.create", { description: "Create a task in a case",
118
- inputSchema: { caseId: { type: "string", required: true }, title: { type: "string", required: true }, description: { type: "string", required: false }, status: { type: "string", required: false }, flag: { type: "boolean", required: false }, assignee: { type: "string", required: false } },
119
- async execute(input, ctx) { const { url, apiKey } = getConn(ctx); const { caseId, ...body } = input; return api(url, apiKey, "POST", `/v1/case/${caseId}/task`, body); } });
120
- rl.registerAction("task.get", { description: "Get a task by ID", inputSchema: { id: { type: "string", required: true } },
121
- async execute(input, ctx) { const { url, apiKey } = getConn(ctx); return api(url, apiKey, "POST", "/v1/query", { query: [{ _name: "getTask", idOrName: input.id }] }); } });
122
- rl.registerAction("task.update", { description: "Update a task by ID",
123
- inputSchema: { id: { type: "string", required: true }, title: { type: "string", required: false }, description: { type: "string", required: false }, status: { type: "string", required: false }, flag: { type: "boolean", required: false }, assignee: { type: "string", required: false } },
124
- async execute(input, ctx) { const { url, apiKey } = getConn(ctx); const { id, ...body } = input; await api(url, apiKey, "PATCH", `/v1/task/${id}`, body); return { success: true }; } });
125
- rl.registerAction("task.delete", { description: "Delete a task", inputSchema: { id: { type: "string", required: true } },
126
- async execute(input, ctx) { const { url, apiKey } = getConn(ctx); await api(url, apiKey, "DELETE", `/v1/task/${input.id}`); return { success: true }; } });
284
+ rl.registerAction("task.create", {
285
+ description: "Create a task in a case",
286
+ inputSchema: {
287
+ caseId: { type: "string", required: true },
288
+ title: { type: "string", required: true },
289
+ description: { type: "string", required: false },
290
+ status: { type: "string", required: false },
291
+ flag: { type: "boolean", required: false },
292
+ assignee: { type: "string", required: false },
293
+ },
294
+ async execute(input, ctx) {
295
+ const { url, apiKey } = getConn(ctx);
296
+ const { caseId, ...body } = input;
297
+ return api(url, apiKey, "POST", `/v1/case/${caseId}/task`, body);
298
+ },
299
+ });
300
+ rl.registerAction("task.get", {
301
+ description: "Get a task by ID",
302
+ inputSchema: { id: { type: "string", required: true } },
303
+ async execute(input, ctx) {
304
+ const { url, apiKey } = getConn(ctx);
305
+ return api(url, apiKey, "POST", "/v1/query", {
306
+ query: [
307
+ { _name: "getTask", idOrName: input.id },
308
+ ],
309
+ });
310
+ },
311
+ });
312
+ rl.registerAction("task.update", {
313
+ description: "Update a task by ID",
314
+ inputSchema: {
315
+ id: { type: "string", required: true },
316
+ title: { type: "string", required: false },
317
+ description: { type: "string", required: false },
318
+ status: { type: "string", required: false },
319
+ flag: { type: "boolean", required: false },
320
+ assignee: { type: "string", required: false },
321
+ },
322
+ async execute(input, ctx) {
323
+ const { url, apiKey } = getConn(ctx);
324
+ const { id, ...body } = input;
325
+ await api(url, apiKey, "PATCH", `/v1/task/${id}`, body);
326
+ return { success: true };
327
+ },
328
+ });
329
+ rl.registerAction("task.delete", {
330
+ description: "Delete a task",
331
+ inputSchema: { id: { type: "string", required: true } },
332
+ async execute(input, ctx) {
333
+ const { url, apiKey } = getConn(ctx);
334
+ await api(url, apiKey, "DELETE", `/v1/task/${input.id}`);
335
+ return { success: true };
336
+ },
337
+ });
127
338
  searchAction(rl, "task.search", "listTask", "Search tasks");
128
339
  // ── Observable ──────────────────────────────────────
129
- rl.registerAction("observable.create", { description: "Create an observable in a case or alert",
130
- inputSchema: { createIn: { type: "string", required: true, description: "case or alert" }, parentId: { type: "string", required: true, description: "Case or alert ID" }, dataType: { type: "string", required: true }, data: { type: "string", required: false, description: "Value (for non-file types)" }, message: { type: "string", required: false }, tlp: { type: "number", required: false }, tags: { type: "object", required: false }, ioc: { type: "boolean", required: false } },
340
+ rl.registerAction("observable.create", {
341
+ description: "Create an observable in a case or alert",
342
+ inputSchema: {
343
+ createIn: {
344
+ type: "string",
345
+ required: true,
346
+ description: "case or alert",
347
+ },
348
+ parentId: {
349
+ type: "string",
350
+ required: true,
351
+ description: "Case or alert ID",
352
+ },
353
+ dataType: { type: "string", required: true },
354
+ data: {
355
+ type: "string",
356
+ required: false,
357
+ description: "Value (for non-file types)",
358
+ },
359
+ message: { type: "string", required: false },
360
+ tlp: { type: "number", required: false },
361
+ tags: { type: "object", required: false },
362
+ ioc: { type: "boolean", required: false },
363
+ },
131
364
  async execute(input, ctx) {
132
365
  const { url, apiKey } = getConn(ctx);
133
366
  const { createIn, parentId, ...body } = input;
134
367
  return api(url, apiKey, "POST", `/v1/${createIn}/${parentId}/observable`, body);
135
- } });
136
- rl.registerAction("observable.get", { description: "Get an observable by ID", inputSchema: { id: { type: "string", required: true } },
137
- async execute(input, ctx) { const { url, apiKey } = getConn(ctx); return api(url, apiKey, "POST", "/v1/query", { query: [{ _name: "getObservable", idOrName: input.id }] }); } });
138
- rl.registerAction("observable.update", { description: "Update an observable by ID",
139
- inputSchema: { id: { type: "string", required: true }, message: { type: "string", required: false }, tlp: { type: "number", required: false }, tags: { type: "object", required: false }, ioc: { type: "boolean", required: false }, sighted: { type: "boolean", required: false } },
140
- async execute(input, ctx) { const { url, apiKey } = getConn(ctx); const { id, ...body } = input; await api(url, apiKey, "PATCH", `/v1/observable/${id}`, body); return { success: true }; } });
141
- rl.registerAction("observable.delete", { description: "Delete an observable", inputSchema: { id: { type: "string", required: true } },
142
- async execute(input, ctx) { const { url, apiKey } = getConn(ctx); await api(url, apiKey, "DELETE", `/v1/observable/${input.id}`); return { success: true }; } });
368
+ },
369
+ });
370
+ rl.registerAction("observable.get", {
371
+ description: "Get an observable by ID",
372
+ inputSchema: { id: { type: "string", required: true } },
373
+ async execute(input, ctx) {
374
+ const { url, apiKey } = getConn(ctx);
375
+ return api(url, apiKey, "POST", "/v1/query", {
376
+ query: [
377
+ {
378
+ _name: "getObservable",
379
+ idOrName: input.id,
380
+ },
381
+ ],
382
+ });
383
+ },
384
+ });
385
+ rl.registerAction("observable.update", {
386
+ description: "Update an observable by ID",
387
+ inputSchema: {
388
+ id: { type: "string", required: true },
389
+ message: { type: "string", required: false },
390
+ tlp: { type: "number", required: false },
391
+ tags: { type: "object", required: false },
392
+ ioc: { type: "boolean", required: false },
393
+ sighted: { type: "boolean", required: false },
394
+ },
395
+ async execute(input, ctx) {
396
+ const { url, apiKey } = getConn(ctx);
397
+ const { id, ...body } = input;
398
+ await api(url, apiKey, "PATCH", `/v1/observable/${id}`, body);
399
+ return { success: true };
400
+ },
401
+ });
402
+ rl.registerAction("observable.delete", {
403
+ description: "Delete an observable",
404
+ inputSchema: { id: { type: "string", required: true } },
405
+ async execute(input, ctx) {
406
+ const { url, apiKey } = getConn(ctx);
407
+ await api(url, apiKey, "DELETE", `/v1/observable/${input.id}`);
408
+ return { success: true };
409
+ },
410
+ });
143
411
  searchAction(rl, "observable.search", "listObservable", "Search observables");
144
412
  // ── Comment ─────────────────────────────────────────
145
- rl.registerAction("comment.add", { description: "Add a comment to a case or alert",
146
- inputSchema: { addTo: { type: "string", required: true, description: "case or alert" }, parentId: { type: "string", required: true }, message: { type: "string", required: true } },
147
- async execute(input, ctx) { const { url, apiKey } = getConn(ctx); const p = input; return api(url, apiKey, "POST", `/v1/${p.addTo}/${p.parentId}/comment`, { message: p.message }); } });
148
- rl.registerAction("comment.update", { description: "Update a comment",
149
- inputSchema: { id: { type: "string", required: true }, message: { type: "string", required: true } },
150
- async execute(input, ctx) { const { url, apiKey } = getConn(ctx); const p = input; return api(url, apiKey, "PATCH", `/v1/comment/${p.id}`, { message: p.message }); } });
151
- rl.registerAction("comment.delete", { description: "Delete a comment", inputSchema: { id: { type: "string", required: true } },
152
- async execute(input, ctx) { const { url, apiKey } = getConn(ctx); await api(url, apiKey, "DELETE", `/v1/comment/${input.id}`); return { success: true }; } });
413
+ rl.registerAction("comment.add", {
414
+ description: "Add a comment to a case or alert",
415
+ inputSchema: {
416
+ addTo: { type: "string", required: true, description: "case or alert" },
417
+ parentId: { type: "string", required: true },
418
+ message: { type: "string", required: true },
419
+ },
420
+ async execute(input, ctx) {
421
+ const { url, apiKey } = getConn(ctx);
422
+ const p = input;
423
+ return api(url, apiKey, "POST", `/v1/${p.addTo}/${p.parentId}/comment`, {
424
+ message: p.message,
425
+ });
426
+ },
427
+ });
428
+ rl.registerAction("comment.update", {
429
+ description: "Update a comment",
430
+ inputSchema: {
431
+ id: { type: "string", required: true },
432
+ message: { type: "string", required: true },
433
+ },
434
+ async execute(input, ctx) {
435
+ const { url, apiKey } = getConn(ctx);
436
+ const p = input;
437
+ return api(url, apiKey, "PATCH", `/v1/comment/${p.id}`, {
438
+ message: p.message,
439
+ });
440
+ },
441
+ });
442
+ rl.registerAction("comment.delete", {
443
+ description: "Delete a comment",
444
+ inputSchema: { id: { type: "string", required: true } },
445
+ async execute(input, ctx) {
446
+ const { url, apiKey } = getConn(ctx);
447
+ await api(url, apiKey, "DELETE", `/v1/comment/${input.id}`);
448
+ return { success: true };
449
+ },
450
+ });
153
451
  searchAction(rl, "comment.search", "listComment", "Search comments");
154
452
  // ── Task Log ────────────────────────────────────────
155
- rl.registerAction("log.create", { description: "Create a task log entry",
156
- inputSchema: { taskId: { type: "string", required: true }, message: { type: "string", required: true }, startDate: { type: "string", required: false }, includeInTimeline: { type: "string", required: false } },
157
- async execute(input, ctx) { const { url, apiKey } = getConn(ctx); const { taskId, ...body } = input; return api(url, apiKey, "POST", `/v1/task/${taskId}/log`, body); } });
158
- rl.registerAction("log.get", { description: "Get a log entry by ID", inputSchema: { id: { type: "string", required: true } },
159
- async execute(input, ctx) { const { url, apiKey } = getConn(ctx); return api(url, apiKey, "POST", "/v1/query", { query: [{ _name: "getLog", idOrName: input.id }] }); } });
160
- rl.registerAction("log.delete", { description: "Delete a log entry", inputSchema: { id: { type: "string", required: true } },
161
- async execute(input, ctx) { const { url, apiKey } = getConn(ctx); await api(url, apiKey, "DELETE", `/v1/log/${input.id}`); return { success: true }; } });
453
+ rl.registerAction("log.create", {
454
+ description: "Create a task log entry",
455
+ inputSchema: {
456
+ taskId: { type: "string", required: true },
457
+ message: { type: "string", required: true },
458
+ startDate: { type: "string", required: false },
459
+ includeInTimeline: { type: "string", required: false },
460
+ },
461
+ async execute(input, ctx) {
462
+ const { url, apiKey } = getConn(ctx);
463
+ const { taskId, ...body } = input;
464
+ return api(url, apiKey, "POST", `/v1/task/${taskId}/log`, body);
465
+ },
466
+ });
467
+ rl.registerAction("log.get", {
468
+ description: "Get a log entry by ID",
469
+ inputSchema: { id: { type: "string", required: true } },
470
+ async execute(input, ctx) {
471
+ const { url, apiKey } = getConn(ctx);
472
+ return api(url, apiKey, "POST", "/v1/query", {
473
+ query: [
474
+ { _name: "getLog", idOrName: input.id },
475
+ ],
476
+ });
477
+ },
478
+ });
479
+ rl.registerAction("log.delete", {
480
+ description: "Delete a log entry",
481
+ inputSchema: { id: { type: "string", required: true } },
482
+ async execute(input, ctx) {
483
+ const { url, apiKey } = getConn(ctx);
484
+ await api(url, apiKey, "DELETE", `/v1/log/${input.id}`);
485
+ return { success: true };
486
+ },
487
+ });
162
488
  searchAction(rl, "log.search", "listLog", "Search task logs");
163
489
  // ── Page ────────────────────────────────────────────
164
- rl.registerAction("page.create", { description: "Create a page (case page or knowledge base)",
165
- inputSchema: { caseId: { type: "string", required: false, description: "If omitted, creates in knowledge base" }, title: { type: "string", required: true }, category: { type: "string", required: true }, content: { type: "string", required: true } },
490
+ rl.registerAction("page.create", {
491
+ description: "Create a page (case page or knowledge base)",
492
+ inputSchema: {
493
+ caseId: {
494
+ type: "string",
495
+ required: false,
496
+ description: "If omitted, creates in knowledge base",
497
+ },
498
+ title: { type: "string", required: true },
499
+ category: { type: "string", required: true },
500
+ content: { type: "string", required: true },
501
+ },
166
502
  async execute(input, ctx) {
167
503
  const { url, apiKey } = getConn(ctx);
168
504
  const { caseId, ...body } = input;
169
505
  const endpoint = caseId ? `/v1/case/${caseId}/page` : "/v1/page";
170
506
  return api(url, apiKey, "POST", endpoint, body);
171
- } });
172
- rl.registerAction("page.update", { description: "Update a page",
173
- inputSchema: { pageId: { type: "string", required: true }, caseId: { type: "string", required: false }, content: { type: "string", required: false }, title: { type: "string", required: false }, category: { type: "string", required: false }, order: { type: "number", required: false } },
507
+ },
508
+ });
509
+ rl.registerAction("page.update", {
510
+ description: "Update a page",
511
+ inputSchema: {
512
+ pageId: { type: "string", required: true },
513
+ caseId: { type: "string", required: false },
514
+ content: { type: "string", required: false },
515
+ title: { type: "string", required: false },
516
+ category: { type: "string", required: false },
517
+ order: { type: "number", required: false },
518
+ },
174
519
  async execute(input, ctx) {
175
520
  const { url, apiKey } = getConn(ctx);
176
521
  const { pageId, caseId, ...body } = input;
177
- const endpoint = caseId ? `/v1/case/${caseId}/page/${pageId}` : `/v1/page/${pageId}`;
522
+ const endpoint = caseId
523
+ ? `/v1/case/${caseId}/page/${pageId}`
524
+ : `/v1/page/${pageId}`;
178
525
  return api(url, apiKey, "PATCH", endpoint, body);
179
- } });
180
- rl.registerAction("page.delete", { description: "Delete a page",
181
- inputSchema: { pageId: { type: "string", required: true }, caseId: { type: "string", required: false } },
526
+ },
527
+ });
528
+ rl.registerAction("page.delete", {
529
+ description: "Delete a page",
530
+ inputSchema: {
531
+ pageId: { type: "string", required: true },
532
+ caseId: { type: "string", required: false },
533
+ },
182
534
  async execute(input, ctx) {
183
535
  const { url, apiKey } = getConn(ctx);
184
536
  const p = input;
185
- const endpoint = p.caseId ? `/v1/case/${p.caseId}/page/${p.pageId}` : `/v1/page/${p.pageId}`;
537
+ const endpoint = p.caseId
538
+ ? `/v1/case/${p.caseId}/page/${p.pageId}`
539
+ : `/v1/page/${p.pageId}`;
186
540
  await api(url, apiKey, "DELETE", endpoint);
187
541
  return { success: true };
188
- } });
542
+ },
543
+ });
189
544
  searchAction(rl, "page.search", "listOrganisationPage", "Search pages");
190
545
  // ── Query ───────────────────────────────────────────
191
- rl.registerAction("query.execute", { description: "Execute a raw TheHive Query API request",
192
- inputSchema: { query: { type: "object", required: true, description: "Array of query operations" } },
193
- async execute(input, ctx) { const { url, apiKey } = getConn(ctx); return api(url, apiKey, "POST", "/v1/query", { query: input.query }); } });
546
+ rl.registerAction("query.execute", {
547
+ description: "Execute a raw TheHive Query API request",
548
+ inputSchema: {
549
+ query: {
550
+ type: "object",
551
+ required: true,
552
+ description: "Array of query operations",
553
+ },
554
+ },
555
+ async execute(input, ctx) {
556
+ const { url, apiKey } = getConn(ctx);
557
+ return api(url, apiKey, "POST", "/v1/query", {
558
+ query: input.query,
559
+ });
560
+ },
561
+ });
194
562
  }