runline 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. package/dist/commands/auth.d.ts +7 -0
  2. package/dist/commands/auth.js +96 -0
  3. package/dist/config/loader.d.ts +11 -0
  4. package/dist/config/loader.js +46 -0
  5. package/dist/core/engine.js +7 -1
  6. package/dist/core/oauth.d.ts +46 -0
  7. package/dist/core/oauth.js +145 -0
  8. package/dist/index.d.ts +4 -2
  9. package/dist/index.js +2 -1
  10. package/dist/main.js +28 -0
  11. package/dist/plugin/api.d.ts +7 -1
  12. package/dist/plugin/api.js +7 -0
  13. package/dist/plugin/types.d.ts +47 -0
  14. package/dist/plugins/actionNetwork/src/index.js +118 -25
  15. package/dist/plugins/activeCampaign/src/index.js +184 -38
  16. package/dist/plugins/adalo/src/index.js +40 -8
  17. package/dist/plugins/affinity/src/index.js +100 -20
  18. package/dist/plugins/agileCrm/src/index.js +115 -27
  19. package/dist/plugins/airtable/src/index.js +94 -19
  20. package/dist/plugins/airtop/src/index.js +266 -62
  21. package/dist/plugins/apiTemplateIo/src/index.js +25 -5
  22. package/dist/plugins/asana/src/index.js +195 -41
  23. package/dist/plugins/autopilot/src/index.js +39 -8
  24. package/dist/plugins/bambooHr/src/index.js +109 -22
  25. package/dist/plugins/bannerbear/src/index.js +36 -8
  26. package/dist/plugins/baserow/src/index.js +35 -7
  27. package/dist/plugins/beeminder/src/index.js +198 -40
  28. package/dist/plugins/bitly/src/index.js +46 -10
  29. package/dist/plugins/bitwarden/src/index.js +167 -36
  30. package/dist/plugins/box/src/index.js +172 -37
  31. package/dist/plugins/brandfetch/src/index.js +5 -1
  32. package/dist/plugins/brevo/src/index.js +136 -29
  33. package/dist/plugins/bubble/src/index.js +76 -17
  34. package/dist/plugins/chargebee/src/index.js +35 -7
  35. package/dist/plugins/circleci/src/index.js +50 -10
  36. package/dist/plugins/ciscoWebex/src/index.js +131 -27
  37. package/dist/plugins/clearbit/src/index.js +76 -17
  38. package/dist/plugins/clickup/src/index.js +500 -107
  39. package/dist/plugins/clockify/src/index.js +229 -47
  40. package/dist/plugins/cloudflare/src/index.js +28 -6
  41. package/dist/plugins/cockpit/src/index.js +54 -12
  42. package/dist/plugins/coda/src/index.js +81 -19
  43. package/dist/plugins/coingecko/src/index.js +157 -33
  44. package/dist/plugins/contentful/src/index.js +85 -17
  45. package/dist/plugins/convertkit/src/index.js +74 -18
  46. package/dist/plugins/copper/src/index.js +59 -11
  47. package/dist/plugins/cortex/src/index.js +55 -13
  48. package/dist/plugins/currents/src/index.js +310 -71
  49. package/dist/plugins/customerIo/src/index.js +112 -23
  50. package/dist/plugins/databricks/src/index.js +549 -115
  51. package/dist/plugins/deepl/src/index.js +26 -6
  52. package/dist/plugins/demio/src/index.js +56 -11
  53. package/dist/plugins/dhl/src/index.js +16 -3
  54. package/dist/plugins/discord/src/index.js +141 -31
  55. package/dist/plugins/discourse/src/index.js +136 -31
  56. package/dist/plugins/disqus/src/index.js +96 -20
  57. package/dist/plugins/docker/src/index.js +20 -4
  58. package/dist/plugins/drift/src/index.js +19 -5
  59. package/dist/plugins/dropbox/src/index.js +139 -30
  60. package/dist/plugins/dropcontact/src/index.js +21 -4
  61. package/dist/plugins/egoi/src/index.js +61 -15
  62. package/dist/plugins/elasticsearch/src/index.js +59 -13
  63. package/dist/plugins/emelia/src/index.js +95 -19
  64. package/dist/plugins/erpnext/src/index.js +74 -15
  65. package/dist/plugins/facebookGraph/src/index.js +52 -11
  66. package/dist/plugins/freshdesk/src/index.js +220 -48
  67. package/dist/plugins/freshservice/src/index.js +39 -9
  68. package/dist/plugins/freshworksCrm/src/index.js +58 -12
  69. package/dist/plugins/getresponse/src/index.js +87 -18
  70. package/dist/plugins/ghost/src/index.js +114 -26
  71. package/dist/plugins/github/src/index.js +483 -109
  72. package/dist/plugins/gitlab/src/index.js +193 -45
  73. package/dist/plugins/gmail/src/index.js +1075 -0
  74. package/dist/plugins/gong/src/index.js +68 -14
  75. package/dist/plugins/gotify/src/index.js +43 -9
  76. package/dist/plugins/gotowebinar/src/index.js +233 -47
  77. package/dist/plugins/grafana/src/index.js +92 -21
  78. package/dist/plugins/graphql/src/index.js +38 -8
  79. package/dist/plugins/grist/src/index.js +52 -10
  80. package/dist/plugins/hackernews/src/index.js +32 -6
  81. package/dist/plugins/halopsa/src/index.js +131 -26
  82. package/dist/plugins/harvest/src/index.js +182 -42
  83. package/dist/plugins/helpscout/src/index.js +153 -31
  84. package/dist/plugins/highlevel/src/index.js +291 -58
  85. package/dist/plugins/homeAssistant/src/index.js +124 -26
  86. package/dist/plugins/hubspot/src/index.js +163 -29
  87. package/dist/plugins/humanticAi/src/index.js +54 -5
  88. package/dist/plugins/hunter/src/index.js +21 -4
  89. package/dist/plugins/intercom/src/index.js +95 -20
  90. package/dist/plugins/iterable/src/index.js +96 -20
  91. package/dist/plugins/jenkins/src/index.js +75 -17
  92. package/dist/plugins/jira/src/index.js +193 -43
  93. package/dist/plugins/keap/src/index.js +222 -56
  94. package/dist/plugins/kobotoolbox/src/index.js +113 -25
  95. package/dist/plugins/lemlist/src/index.js +79 -18
  96. package/dist/plugins/linear/src/index.js +86 -19
  97. package/dist/plugins/lingvanex/src/index.js +38 -8
  98. package/dist/plugins/linkedin/src/index.js +37 -8
  99. package/dist/plugins/lonescale/src/index.js +41 -9
  100. package/dist/plugins/magento/src/index.js +98 -27
  101. package/dist/plugins/mailcheck/src/index.js +11 -2
  102. package/dist/plugins/mailchimp/src/index.js +193 -42
  103. package/dist/plugins/mailerlite/src/index.js +61 -12
  104. package/dist/plugins/mailgun/src/index.js +39 -7
  105. package/dist/plugins/mailjet/src/index.js +141 -30
  106. package/dist/plugins/mandrill/src/index.js +67 -14
  107. package/dist/plugins/marketstack/src/index.js +56 -10
  108. package/dist/plugins/matrix/src/index.js +97 -20
  109. package/dist/plugins/mattermost/src/index.js +124 -26
  110. package/dist/plugins/mautic/src/index.js +129 -26
  111. package/dist/plugins/medium/src/index.js +64 -13
  112. package/dist/plugins/messagebird/src/index.js +80 -15
  113. package/dist/plugins/metabase/src/index.js +57 -12
  114. package/dist/plugins/misp/src/index.js +135 -33
  115. package/dist/plugins/mocean/src/index.js +33 -7
  116. package/dist/plugins/monday/src/index.js +97 -23
  117. package/dist/plugins/monicaCrm/src/index.js +112 -23
  118. package/dist/plugins/msg91/src/index.js +11 -2
  119. package/dist/plugins/nasa/src/index.js +108 -21
  120. package/dist/plugins/netlify/src/index.js +28 -6
  121. package/dist/plugins/netscalerAdc/src/index.js +144 -29
  122. package/dist/plugins/nextcloud/src/index.js +103 -20
  123. package/dist/plugins/nocodb/src/index.js +57 -11
  124. package/dist/plugins/notion/src/index.js +148 -37
  125. package/dist/plugins/npm/src/index.js +59 -12
  126. package/dist/plugins/odoo/src/index.js +102 -20
  127. package/dist/plugins/okta/src/index.js +50 -10
  128. package/dist/plugins/oneSimpleApi/src/index.js +84 -17
  129. package/dist/plugins/onfleet/src/index.js +139 -32
  130. package/dist/plugins/openThesaurus/src/index.js +46 -9
  131. package/dist/plugins/openweathermap/src/index.js +31 -6
  132. package/dist/plugins/oura/src/index.js +36 -7
  133. package/dist/plugins/paddle/src/index.js +80 -17
  134. package/dist/plugins/pagerduty/src/index.js +53 -12
  135. package/dist/plugins/paypal/src/index.js +51 -11
  136. package/dist/plugins/peekalink/src/index.js +12 -3
  137. package/dist/plugins/phantombuster/src/index.js +39 -8
  138. package/dist/plugins/philipsHue/src/index.js +64 -13
  139. package/dist/plugins/pipedrive/src/index.js +167 -45
  140. package/dist/plugins/plivo/src/index.js +43 -8
  141. package/dist/plugins/postbin/src/index.js +9 -2
  142. package/dist/plugins/posthog/src/index.js +50 -13
  143. package/dist/plugins/profitwell/src/index.js +24 -5
  144. package/dist/plugins/pushbullet/src/index.js +45 -9
  145. package/dist/plugins/pushcut/src/index.js +31 -6
  146. package/dist/plugins/pushover/src/index.js +51 -10
  147. package/dist/plugins/quickbase/src/index.js +66 -13
  148. package/dist/plugins/quickbooks/src/index.js +86 -19
  149. package/dist/plugins/quickchart/src/index.js +35 -7
  150. package/dist/plugins/raindrop/src/index.js +54 -13
  151. package/dist/plugins/reddit/src/index.js +73 -18
  152. package/dist/plugins/rocketchat/src/index.js +47 -9
  153. package/dist/plugins/rundeck/src/index.js +26 -5
  154. package/dist/plugins/salesforce/src/index.js +161 -31
  155. package/dist/plugins/salesmate/src/index.js +75 -16
  156. package/dist/plugins/securityScorecard/src/index.js +73 -15
  157. package/dist/plugins/segment/src/index.js +21 -4
  158. package/dist/plugins/sendgrid/src/index.js +102 -24
  159. package/dist/plugins/sendy/src/index.js +54 -11
  160. package/dist/plugins/sentry/src/index.js +174 -34
  161. package/dist/plugins/servicenow/src/index.js +120 -27
  162. package/dist/plugins/shopify/src/index.js +53 -12
  163. package/dist/plugins/signl4/src/index.js +16 -3
  164. package/dist/plugins/slack/src/index.js +407 -105
  165. package/dist/plugins/sms77/src/index.js +26 -5
  166. package/dist/plugins/splunk/src/index.js +186 -45
  167. package/dist/plugins/spotify/src/index.js +265 -66
  168. package/dist/plugins/stackby/src/index.js +18 -6
  169. package/dist/plugins/storyblok/src/index.js +57 -11
  170. package/dist/plugins/strapi/src/index.js +63 -12
  171. package/dist/plugins/strava/src/index.js +58 -13
  172. package/dist/plugins/stripe/src/index.js +143 -30
  173. package/dist/plugins/supabase/src/index.js +49 -10
  174. package/dist/plugins/syncromsp/src/index.js +245 -67
  175. package/dist/plugins/tapfiliate/src/index.js +57 -14
  176. package/dist/plugins/telegram/src/index.js +202 -39
  177. package/dist/plugins/thehive/src/index.js +271 -66
  178. package/dist/plugins/thehiveProject/src/index.js +457 -89
  179. package/dist/plugins/todoist/src/index.js +326 -77
  180. package/dist/plugins/travisci/src/index.js +35 -8
  181. package/dist/plugins/trello/src/index.js +204 -46
  182. package/dist/plugins/twake/src/index.js +10 -2
  183. package/dist/plugins/twilio/src/index.js +56 -11
  184. package/dist/plugins/twist/src/index.js +241 -48
  185. package/dist/plugins/twitter/src/index.js +128 -30
  186. package/dist/plugins/unleashedSoftware/src/index.js +30 -6
  187. package/dist/plugins/uplead/src/index.js +9 -2
  188. package/dist/plugins/uproc/src/index.js +31 -6
  189. package/dist/plugins/uptimerobot/src/index.js +119 -25
  190. package/dist/plugins/urlscanio/src/index.js +25 -6
  191. package/dist/plugins/vero/src/index.js +68 -13
  192. package/dist/plugins/vonage/src/index.js +32 -6
  193. package/dist/plugins/wekan/src/index.js +297 -52
  194. package/dist/plugins/woocommerce/src/index.js +57 -12
  195. package/dist/plugins/wordpress/src/index.js +94 -18
  196. package/dist/plugins/xero/src/index.js +79 -13
  197. package/dist/plugins/yourls/src/index.js +33 -6
  198. package/dist/plugins/zammad/src/index.js +139 -36
  199. package/dist/plugins/zendesk/src/index.js +201 -48
  200. package/dist/plugins/zoho/src/index.js +88 -21
  201. package/dist/plugins/zoom/src/index.js +41 -7
  202. package/dist/plugins/zulip/src/index.js +101 -20
  203. package/package.json +3 -1
@@ -36,15 +36,39 @@ export default function bannerbear(rl) {
36
36
  rl.registerAction("image.create", {
37
37
  description: "Create an image from a template",
38
38
  inputSchema: {
39
- templateId: { type: "string", required: true, description: "Template UID" },
40
- modifications: { type: "array", required: false, description: "Array of modification objects (name, text, color, image_url, etc.)" },
41
- webhookUrl: { type: "string", required: false, description: "Webhook URL to notify on completion" },
42
- metadata: { type: "string", required: false, description: "Custom metadata string" },
43
- waitForImage: { type: "boolean", required: false, description: "Wait for image to finish processing (polls until complete)" },
44
- maxTries: { type: "number", required: false, description: "Max poll attempts when waiting (default: 3)" },
39
+ templateId: {
40
+ type: "string",
41
+ required: true,
42
+ description: "Template UID",
43
+ },
44
+ modifications: {
45
+ type: "array",
46
+ required: false,
47
+ description: "Array of modification objects (name, text, color, image_url, etc.)",
48
+ },
49
+ webhookUrl: {
50
+ type: "string",
51
+ required: false,
52
+ description: "Webhook URL to notify on completion",
53
+ },
54
+ metadata: {
55
+ type: "string",
56
+ required: false,
57
+ description: "Custom metadata string",
58
+ },
59
+ waitForImage: {
60
+ type: "boolean",
61
+ required: false,
62
+ description: "Wait for image to finish processing (polls until complete)",
63
+ },
64
+ maxTries: {
65
+ type: "number",
66
+ required: false,
67
+ description: "Max poll attempts when waiting (default: 3)",
68
+ },
45
69
  },
46
70
  async execute(input, ctx) {
47
- const { templateId, modifications, webhookUrl, metadata, waitForImage, maxTries = 3 } = (input ?? {});
71
+ const { templateId, modifications, webhookUrl, metadata, waitForImage, maxTries = 3, } = (input ?? {});
48
72
  const apiKey = getKey(ctx);
49
73
  const body = { template: templateId };
50
74
  if (modifications)
@@ -84,7 +108,11 @@ export default function bannerbear(rl) {
84
108
  rl.registerAction("template.get", {
85
109
  description: "Get a template by ID",
86
110
  inputSchema: {
87
- templateId: { type: "string", required: true, description: "Template UID" },
111
+ templateId: {
112
+ type: "string",
113
+ required: true,
114
+ description: "Template UID",
115
+ },
88
116
  },
89
117
  async execute(input, ctx) {
90
118
  const { templateId } = input;
@@ -73,7 +73,11 @@ export default function baserow(rl) {
73
73
  description: "Create a row in a table",
74
74
  inputSchema: {
75
75
  tableId: { type: "string", required: true, description: "Table ID" },
76
- fields: { type: "object", required: true, description: "Field values as key-value pairs (use field_N keys or field names)" },
76
+ fields: {
77
+ type: "object",
78
+ required: true,
79
+ description: "Field values as key-value pairs (use field_N keys or field names)",
80
+ },
77
81
  },
78
82
  async execute(input, ctx) {
79
83
  const { tableId, fields } = input;
@@ -98,8 +102,16 @@ export default function baserow(rl) {
98
102
  inputSchema: {
99
103
  tableId: { type: "string", required: true, description: "Table ID" },
100
104
  search: { type: "string", required: false, description: "Search query" },
101
- orderBy: { type: "string", required: false, description: "Comma-separated field IDs prefixed with +/- (e.g. +field_1,-field_2)" },
102
- limit: { type: "number", required: false, description: "Max results to return" },
105
+ orderBy: {
106
+ type: "string",
107
+ required: false,
108
+ description: "Comma-separated field IDs prefixed with +/- (e.g. +field_1,-field_2)",
109
+ },
110
+ limit: {
111
+ type: "number",
112
+ required: false,
113
+ description: "Max results to return",
114
+ },
103
115
  },
104
116
  async execute(input, ctx) {
105
117
  const { tableId, search, orderBy, limit } = input;
@@ -117,7 +129,11 @@ export default function baserow(rl) {
117
129
  inputSchema: {
118
130
  tableId: { type: "string", required: true, description: "Table ID" },
119
131
  rowId: { type: "string", required: true, description: "Row ID" },
120
- fields: { type: "object", required: true, description: "Fields to update" },
132
+ fields: {
133
+ type: "object",
134
+ required: true,
135
+ description: "Fields to update",
136
+ },
121
137
  },
122
138
  async execute(input, ctx) {
123
139
  const { tableId, rowId, fields } = input;
@@ -142,7 +158,11 @@ export default function baserow(rl) {
142
158
  description: "Create up to 200 rows in one request",
143
159
  inputSchema: {
144
160
  tableId: { type: "string", required: true, description: "Table ID" },
145
- items: { type: "array", required: true, description: "Array of row objects with field values" },
161
+ items: {
162
+ type: "array",
163
+ required: true,
164
+ description: "Array of row objects with field values",
165
+ },
146
166
  },
147
167
  async execute(input, ctx) {
148
168
  const { tableId, items } = input;
@@ -154,7 +174,11 @@ export default function baserow(rl) {
154
174
  description: "Update up to 200 rows in one request",
155
175
  inputSchema: {
156
176
  tableId: { type: "string", required: true, description: "Table ID" },
157
- items: { type: "array", required: true, description: "Array of { id, ...fields } objects" },
177
+ items: {
178
+ type: "array",
179
+ required: true,
180
+ description: "Array of { id, ...fields } objects",
181
+ },
158
182
  },
159
183
  async execute(input, ctx) {
160
184
  const { tableId, items } = input;
@@ -166,7 +190,11 @@ export default function baserow(rl) {
166
190
  description: "Delete up to 200 rows in one request",
167
191
  inputSchema: {
168
192
  tableId: { type: "string", required: true, description: "Table ID" },
169
- rowIds: { type: "array", required: true, description: "Array of row IDs to delete" },
193
+ rowIds: {
194
+ type: "array",
195
+ required: true,
196
+ description: "Array of row IDs to delete",
197
+ },
170
198
  },
171
199
  async execute(input, ctx) {
172
200
  const { tableId, rowIds } = input;
@@ -12,7 +12,10 @@ async function apiRequest(token, method, endpoint, body, qs) {
12
12
  method,
13
13
  headers: { "Content-Type": "application/json" },
14
14
  };
15
- if (body && Object.keys(body).length > 0 && method !== "GET" && method !== "DELETE") {
15
+ if (body &&
16
+ Object.keys(body).length > 0 &&
17
+ method !== "GET" &&
18
+ method !== "DELETE") {
16
19
  opts.body = JSON.stringify(body);
17
20
  }
18
21
  const res = await fetch(url.toString(), opts);
@@ -29,7 +32,10 @@ async function paginateAll(token, endpoint, qs) {
29
32
  const results = [];
30
33
  let page = 1;
31
34
  while (true) {
32
- const data = (await apiRequest(token, "GET", endpoint, undefined, { ...qs, page }));
35
+ const data = (await apiRequest(token, "GET", endpoint, undefined, {
36
+ ...qs,
37
+ page,
38
+ }));
33
39
  if (!Array.isArray(data) || data.length === 0)
34
40
  break;
35
41
  results.push(...data);
@@ -57,9 +63,17 @@ export default function beeminder(rl) {
57
63
  inputSchema: {
58
64
  goalName: { type: "string", required: true, description: "Goal slug" },
59
65
  value: { type: "number", required: true, description: "Datapoint value" },
60
- timestamp: { type: "number", required: false, description: "Unix timestamp (default: now)" },
66
+ timestamp: {
67
+ type: "number",
68
+ required: false,
69
+ description: "Unix timestamp (default: now)",
70
+ },
61
71
  comment: { type: "string", required: false, description: "Comment" },
62
- requestid: { type: "string", required: false, description: "Unique ID to prevent duplicates" },
72
+ requestid: {
73
+ type: "string",
74
+ required: false,
75
+ description: "Unique ID to prevent duplicates",
76
+ },
63
77
  },
64
78
  async execute(input, ctx) {
65
79
  const { goalName, ...body } = input;
@@ -70,7 +84,11 @@ export default function beeminder(rl) {
70
84
  description: "Create multiple datapoints at once",
71
85
  inputSchema: {
72
86
  goalName: { type: "string", required: true, description: "Goal slug" },
73
- datapoints: { type: "array", required: true, description: "Array of {value, timestamp?, comment?, requestid?}" },
87
+ datapoints: {
88
+ type: "array",
89
+ required: true,
90
+ description: "Array of {value, timestamp?, comment?, requestid?}",
91
+ },
74
92
  },
75
93
  async execute(input, ctx) {
76
94
  const { goalName, datapoints } = input;
@@ -81,7 +99,11 @@ export default function beeminder(rl) {
81
99
  description: "Get a single datapoint",
82
100
  inputSchema: {
83
101
  goalName: { type: "string", required: true, description: "Goal slug" },
84
- datapointId: { type: "string", required: true, description: "Datapoint ID" },
102
+ datapointId: {
103
+ type: "string",
104
+ required: true,
105
+ description: "Datapoint ID",
106
+ },
85
107
  },
86
108
  async execute(input, ctx) {
87
109
  const { goalName, datapointId } = input;
@@ -92,9 +114,21 @@ export default function beeminder(rl) {
92
114
  description: "List datapoints for a goal",
93
115
  inputSchema: {
94
116
  goalName: { type: "string", required: true, description: "Goal slug" },
95
- sort: { type: "string", required: false, description: "Sort attribute (default: id)" },
96
- limit: { type: "number", required: false, description: "Max results (omit for all)" },
97
- page: { type: "number", required: false, description: "Page number (1-indexed)" },
117
+ sort: {
118
+ type: "string",
119
+ required: false,
120
+ description: "Sort attribute (default: id)",
121
+ },
122
+ limit: {
123
+ type: "number",
124
+ required: false,
125
+ description: "Max results (omit for all)",
126
+ },
127
+ page: {
128
+ type: "number",
129
+ required: false,
130
+ description: "Page number (1-indexed)",
131
+ },
98
132
  per: { type: "number", required: false, description: "Results per page" },
99
133
  },
100
134
  async execute(input, ctx) {
@@ -118,10 +152,18 @@ export default function beeminder(rl) {
118
152
  description: "Update a datapoint",
119
153
  inputSchema: {
120
154
  goalName: { type: "string", required: true, description: "Goal slug" },
121
- datapointId: { type: "string", required: true, description: "Datapoint ID" },
155
+ datapointId: {
156
+ type: "string",
157
+ required: true,
158
+ description: "Datapoint ID",
159
+ },
122
160
  value: { type: "number", required: false, description: "New value" },
123
161
  comment: { type: "string", required: false, description: "New comment" },
124
- timestamp: { type: "number", required: false, description: "New unix timestamp" },
162
+ timestamp: {
163
+ type: "number",
164
+ required: false,
165
+ description: "New unix timestamp",
166
+ },
125
167
  },
126
168
  async execute(input, ctx) {
127
169
  const { goalName, datapointId, ...body } = input;
@@ -132,7 +174,11 @@ export default function beeminder(rl) {
132
174
  description: "Delete a datapoint",
133
175
  inputSchema: {
134
176
  goalName: { type: "string", required: true, description: "Goal slug" },
135
- datapointId: { type: "string", required: true, description: "Datapoint ID" },
177
+ datapointId: {
178
+ type: "string",
179
+ required: true,
180
+ description: "Datapoint ID",
181
+ },
136
182
  },
137
183
  async execute(input, ctx) {
138
184
  const { goalName, datapointId } = input;
@@ -144,8 +190,16 @@ export default function beeminder(rl) {
144
190
  description: "Create a charge (pay money to Beeminder)",
145
191
  inputSchema: {
146
192
  amount: { type: "number", required: true, description: "Amount in USD" },
147
- note: { type: "string", required: false, description: "Charge explanation" },
148
- dryrun: { type: "boolean", required: false, description: "Test without actually charging" },
193
+ note: {
194
+ type: "string",
195
+ required: false,
196
+ description: "Charge explanation",
197
+ },
198
+ dryrun: {
199
+ type: "boolean",
200
+ required: false,
201
+ description: "Test without actually charging",
202
+ },
149
203
  },
150
204
  async execute(input, ctx) {
151
205
  const { amount, note, dryrun } = input;
@@ -161,19 +215,63 @@ export default function beeminder(rl) {
161
215
  rl.registerAction("goal.create", {
162
216
  description: "Create a new goal",
163
217
  inputSchema: {
164
- slug: { type: "string", required: true, description: "Goal slug (unique identifier)" },
165
- title: { type: "string", required: true, description: "Human-readable title" },
166
- goal_type: { type: "string", required: true, description: "Goal type: hustler, biker, fatloser, gainer, inboxer, drinker, custom" },
167
- gunits: { type: "string", required: true, description: "Units (e.g. hours, pages, pounds)" },
168
- goaldate: { type: "number", required: false, description: "Target date (unix timestamp)" },
218
+ slug: {
219
+ type: "string",
220
+ required: true,
221
+ description: "Goal slug (unique identifier)",
222
+ },
223
+ title: {
224
+ type: "string",
225
+ required: true,
226
+ description: "Human-readable title",
227
+ },
228
+ goal_type: {
229
+ type: "string",
230
+ required: true,
231
+ description: "Goal type: hustler, biker, fatloser, gainer, inboxer, drinker, custom",
232
+ },
233
+ gunits: {
234
+ type: "string",
235
+ required: true,
236
+ description: "Units (e.g. hours, pages, pounds)",
237
+ },
238
+ goaldate: {
239
+ type: "number",
240
+ required: false,
241
+ description: "Target date (unix timestamp)",
242
+ },
169
243
  goalval: { type: "number", required: false, description: "Target value" },
170
- rate: { type: "number", required: false, description: "Rate (units per day)" },
171
- initval: { type: "number", required: false, description: "Initial value (default: 0)" },
244
+ rate: {
245
+ type: "number",
246
+ required: false,
247
+ description: "Rate (units per day)",
248
+ },
249
+ initval: {
250
+ type: "number",
251
+ required: false,
252
+ description: "Initial value (default: 0)",
253
+ },
172
254
  secret: { type: "boolean", required: false, description: "Secret goal" },
173
- datapublic: { type: "boolean", required: false, description: "Public data" },
174
- datasource: { type: "string", required: false, description: "Data source: api, ifttt, zapier, manual" },
175
- dryrun: { type: "boolean", required: false, description: "Test without creating" },
176
- tags: { type: "array", required: false, description: "Array of tag strings" },
255
+ datapublic: {
256
+ type: "boolean",
257
+ required: false,
258
+ description: "Public data",
259
+ },
260
+ datasource: {
261
+ type: "string",
262
+ required: false,
263
+ description: "Data source: api, ifttt, zapier, manual",
264
+ },
265
+ dryrun: {
266
+ type: "boolean",
267
+ required: false,
268
+ description: "Test without creating",
269
+ },
270
+ tags: {
271
+ type: "array",
272
+ required: false,
273
+ description: "Array of tag strings",
274
+ },
177
275
  },
178
276
  async execute(input, ctx) {
179
277
  return apiRequest(getToken(ctx), "POST", "/users/me/goals.json", input);
@@ -183,8 +281,16 @@ export default function beeminder(rl) {
183
281
  description: "Get a specific goal",
184
282
  inputSchema: {
185
283
  goalName: { type: "string", required: true, description: "Goal slug" },
186
- datapoints: { type: "boolean", required: false, description: "Include datapoints" },
187
- emaciated: { type: "boolean", required: false, description: "Strip road/roadall/fullroad attributes" },
284
+ datapoints: {
285
+ type: "boolean",
286
+ required: false,
287
+ description: "Include datapoints",
288
+ },
289
+ emaciated: {
290
+ type: "boolean",
291
+ required: false,
292
+ description: "Strip road/roadall/fullroad attributes",
293
+ },
188
294
  },
189
295
  async execute(input, ctx) {
190
296
  const { goalName, ...qs } = input;
@@ -194,7 +300,11 @@ export default function beeminder(rl) {
194
300
  rl.registerAction("goal.list", {
195
301
  description: "List all goals",
196
302
  inputSchema: {
197
- emaciated: { type: "boolean", required: false, description: "Strip road attributes" },
303
+ emaciated: {
304
+ type: "boolean",
305
+ required: false,
306
+ description: "Strip road attributes",
307
+ },
198
308
  },
199
309
  async execute(input, ctx) {
200
310
  const qs = (input ?? {});
@@ -204,7 +314,11 @@ export default function beeminder(rl) {
204
314
  rl.registerAction("goal.listArchived", {
205
315
  description: "List archived goals",
206
316
  inputSchema: {
207
- emaciated: { type: "boolean", required: false, description: "Strip road attributes" },
317
+ emaciated: {
318
+ type: "boolean",
319
+ required: false,
320
+ description: "Strip road attributes",
321
+ },
208
322
  },
209
323
  async execute(input, ctx) {
210
324
  const qs = (input ?? {});
@@ -217,13 +331,37 @@ export default function beeminder(rl) {
217
331
  goalName: { type: "string", required: true, description: "Goal slug" },
218
332
  title: { type: "string", required: false, description: "New title" },
219
333
  yaxis: { type: "string", required: false, description: "Y-axis label" },
220
- tmin: { type: "string", required: false, description: "Min date (yyyy-mm-dd)" },
221
- tmax: { type: "string", required: false, description: "Max date (yyyy-mm-dd)" },
334
+ tmin: {
335
+ type: "string",
336
+ required: false,
337
+ description: "Min date (yyyy-mm-dd)",
338
+ },
339
+ tmax: {
340
+ type: "string",
341
+ required: false,
342
+ description: "Max date (yyyy-mm-dd)",
343
+ },
222
344
  secret: { type: "boolean", required: false, description: "Secret goal" },
223
- datapublic: { type: "boolean", required: false, description: "Public data" },
224
- roadall: { type: "array", required: false, description: "Road matrix [[date, value, rate], ...]" },
225
- datasource: { type: "string", required: false, description: "Data source" },
226
- tags: { type: "array", required: false, description: "Array of tag strings" },
345
+ datapublic: {
346
+ type: "boolean",
347
+ required: false,
348
+ description: "Public data",
349
+ },
350
+ roadall: {
351
+ type: "array",
352
+ required: false,
353
+ description: "Road matrix [[date, value, rate], ...]",
354
+ },
355
+ datasource: {
356
+ type: "string",
357
+ required: false,
358
+ description: "Data source",
359
+ },
360
+ tags: {
361
+ type: "array",
362
+ required: false,
363
+ description: "Array of tag strings",
364
+ },
227
365
  },
228
366
  async execute(input, ctx) {
229
367
  const { goalName, ...body } = input;
@@ -284,11 +422,31 @@ export default function beeminder(rl) {
284
422
  rl.registerAction("user.get", {
285
423
  description: "Get current user information",
286
424
  inputSchema: {
287
- associations: { type: "boolean", required: false, description: "Include associations" },
288
- diff_since: { type: "number", required: false, description: "Unix timestamp — only return goals/datapoints changed since" },
289
- skinny: { type: "boolean", required: false, description: "Minimal user data" },
290
- emaciated: { type: "boolean", required: false, description: "Strip road attributes from goals" },
291
- datapoints_count: { type: "number", required: false, description: "Number of datapoints to include" },
425
+ associations: {
426
+ type: "boolean",
427
+ required: false,
428
+ description: "Include associations",
429
+ },
430
+ diff_since: {
431
+ type: "number",
432
+ required: false,
433
+ description: "Unix timestamp — only return goals/datapoints changed since",
434
+ },
435
+ skinny: {
436
+ type: "boolean",
437
+ required: false,
438
+ description: "Minimal user data",
439
+ },
440
+ emaciated: {
441
+ type: "boolean",
442
+ required: false,
443
+ description: "Strip road attributes from goals",
444
+ },
445
+ datapoints_count: {
446
+ type: "number",
447
+ required: false,
448
+ description: "Number of datapoints to include",
449
+ },
292
450
  },
293
451
  async execute(input, ctx) {
294
452
  const qs = (input ?? {});
@@ -7,7 +7,10 @@ async function apiRequest(token, method, endpoint, body) {
7
7
  Authorization: `Bearer ${token}`,
8
8
  },
9
9
  };
10
- if (body && Object.keys(body).length > 0 && method !== "GET" && method !== "DELETE") {
10
+ if (body &&
11
+ Object.keys(body).length > 0 &&
12
+ method !== "GET" &&
13
+ method !== "DELETE") {
11
14
  opts.body = JSON.stringify(body);
12
15
  }
13
16
  const res = await fetch(`${BASE_URL}${endpoint}`, opts);
@@ -34,11 +37,27 @@ export default function bitly(rl) {
34
37
  rl.registerAction("link.create", {
35
38
  description: "Create a shortened link (bitlink)",
36
39
  inputSchema: {
37
- longUrl: { type: "string", required: true, description: "Long URL to shorten" },
38
- title: { type: "string", required: false, description: "Title for the link" },
39
- domain: { type: "string", required: false, description: "Custom domain (default: bit.ly)" },
40
+ longUrl: {
41
+ type: "string",
42
+ required: true,
43
+ description: "Long URL to shorten",
44
+ },
45
+ title: {
46
+ type: "string",
47
+ required: false,
48
+ description: "Title for the link",
49
+ },
50
+ domain: {
51
+ type: "string",
52
+ required: false,
53
+ description: "Custom domain (default: bit.ly)",
54
+ },
40
55
  group: { type: "string", required: false, description: "Group GUID" },
41
- tags: { type: "array", required: false, description: "Array of tag strings" },
56
+ tags: {
57
+ type: "array",
58
+ required: false,
59
+ description: "Array of tag strings",
60
+ },
42
61
  deeplinks: {
43
62
  type: "array",
44
63
  required: false,
@@ -46,7 +65,8 @@ export default function bitly(rl) {
46
65
  },
47
66
  },
48
67
  async execute(input, ctx) {
49
- const { longUrl, title, domain, group, tags, deeplinks } = (input ?? {});
68
+ const { longUrl, title, domain, group, tags, deeplinks } = (input ??
69
+ {});
50
70
  const body = { long_url: longUrl };
51
71
  if (title)
52
72
  body.title = title;
@@ -64,7 +84,11 @@ export default function bitly(rl) {
64
84
  rl.registerAction("link.get", {
65
85
  description: "Get a bitlink by ID",
66
86
  inputSchema: {
67
- bitlink: { type: "string", required: true, description: "Bitlink (e.g. bit.ly/22u3ypK)" },
87
+ bitlink: {
88
+ type: "string",
89
+ required: true,
90
+ description: "Bitlink (e.g. bit.ly/22u3ypK)",
91
+ },
68
92
  },
69
93
  async execute(input, ctx) {
70
94
  const { bitlink } = input;
@@ -74,12 +98,24 @@ export default function bitly(rl) {
74
98
  rl.registerAction("link.update", {
75
99
  description: "Update a bitlink",
76
100
  inputSchema: {
77
- bitlink: { type: "string", required: true, description: "Bitlink (e.g. bit.ly/22u3ypK)" },
101
+ bitlink: {
102
+ type: "string",
103
+ required: true,
104
+ description: "Bitlink (e.g. bit.ly/22u3ypK)",
105
+ },
78
106
  longUrl: { type: "string", required: false, description: "New long URL" },
79
107
  title: { type: "string", required: false, description: "New title" },
80
- archived: { type: "boolean", required: false, description: "Archive the link" },
108
+ archived: {
109
+ type: "boolean",
110
+ required: false,
111
+ description: "Archive the link",
112
+ },
81
113
  group: { type: "string", required: false, description: "Group GUID" },
82
- tags: { type: "array", required: false, description: "Array of tag strings" },
114
+ tags: {
115
+ type: "array",
116
+ required: false,
117
+ description: "Array of tag strings",
118
+ },
83
119
  deeplinks: {
84
120
  type: "array",
85
121
  required: false,