@skelm/integrations 0.3.7 → 0.3.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -7,5 +7,6 @@ export type { IntegrationConfig, WebhookConfig, RateLimitConfig, IntegrationCapa
7
7
  export { IntegrationBase } from './base.js';
8
8
  export { GitHubIntegration } from './github.js';
9
9
  export { SlackIntegration } from './slack.js';
10
+ export { TelegramIntegration, telegramUpdateToInput, type CreateTelegramTriggerSourceOptions, type TelegramGetUpdatesOptions, type TelegramMessageInput, type TelegramSendMessageOptions, type TelegramTriggerSource, } from './telegram.js';
10
11
  export { IntegrationRegistry } from './registry.js';
11
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EACV,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,uBAAuB,EACvB,WAAW,EACX,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EAClB,WAAW,EACX,iBAAiB,EACjB,UAAU,EACV,gBAAgB,EAChB,UAAU,EACV,YAAY,EACZ,cAAc,EACd,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,YAAY,CAAA;AAGnB,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAG3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAG7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EACV,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,uBAAuB,EACvB,WAAW,EACX,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EAClB,WAAW,EACX,iBAAiB,EACjB,UAAU,EACV,gBAAgB,EAChB,UAAU,EACV,YAAY,EACZ,cAAc,EACd,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,YAAY,CAAA;AAGnB,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAG3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAC7C,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,KAAK,kCAAkC,EACvC,KAAK,yBAAyB,EAC9B,KAAK,oBAAoB,EACzB,KAAK,0BAA0B,EAC/B,KAAK,qBAAqB,GAC3B,MAAM,eAAe,CAAA;AAGtB,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA"}
package/dist/index.js CHANGED
@@ -8,6 +8,7 @@ export { IntegrationBase } from './base.js';
8
8
  // Integration implementations
9
9
  export { GitHubIntegration } from './github.js';
10
10
  export { SlackIntegration } from './slack.js';
11
+ export { TelegramIntegration, telegramUpdateToInput, } from './telegram.js';
11
12
  // Integration registry
12
13
  export { IntegrationRegistry } from './registry.js';
13
14
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAsBH,yBAAyB;AACzB,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAE3C,8BAA8B;AAC9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAE7C,uBAAuB;AACvB,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAsBH,yBAAyB;AACzB,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAE3C,8BAA8B;AAC9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAC7C,OAAO,EACL,mBAAmB,EACnB,qBAAqB,GAMtB,MAAM,eAAe,CAAA;AAEtB,uBAAuB;AACvB,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA"}
@@ -0,0 +1,169 @@
1
+ import { IntegrationBase } from './base.js';
2
+ import type { TelegramConfig } from './types.js';
3
+ /**
4
+ * Flat shape suitable for use as a pipeline input. Mirrors the runtime
5
+ * input the example pipelines accept and is what the trigger source emits
6
+ * per inbound update.
7
+ */
8
+ export interface TelegramMessageInput {
9
+ updateId: number;
10
+ messageId: number;
11
+ chatId: string;
12
+ from: string;
13
+ text: string;
14
+ }
15
+ /**
16
+ * Convert a raw Telegram update into the flat input shape pipelines
17
+ * consume. Returns null for updates that don't carry text content (those
18
+ * are skipped by the trigger source).
19
+ */
20
+ export declare function telegramUpdateToInput(update: unknown): TelegramMessageInput | null;
21
+ /**
22
+ * QueueDriver-shaped contract the trigger source returned from
23
+ * `createTriggerSource()` satisfies. Declared structurally here so this
24
+ * file has no dependency on @skelm/gateway.
25
+ */
26
+ export interface TelegramTriggerSource {
27
+ start(opts: {
28
+ config?: Record<string, unknown>;
29
+ onMessage: (payload?: unknown) => Promise<void>;
30
+ }): Promise<void> | void;
31
+ stop(): Promise<void> | void;
32
+ onResult?(payload: unknown, output: unknown): Promise<void> | void;
33
+ }
34
+ export interface CreateTelegramTriggerSourceOptions {
35
+ /**
36
+ * Drop any pending updates queued before the bot started. Recommended
37
+ * when the gateway is restarted, to avoid replying to stale messages.
38
+ * Default: true.
39
+ */
40
+ dropPending?: boolean;
41
+ /** Long-poll timeout in seconds. Default: 25. */
42
+ longPollSeconds?: number;
43
+ /**
44
+ * `allowed_updates` forwarded to getUpdates(). Default: `['message']`.
45
+ */
46
+ allowedUpdates?: string[];
47
+ /**
48
+ * If true, the source's `onResult` posts `output.reply` back to the
49
+ * originating chat. Default: true. The pipeline returns
50
+ * `{ reply: string }` for the default behavior to apply.
51
+ */
52
+ postReply?: boolean;
53
+ }
54
+ interface TelegramRawMessage {
55
+ message_id: number;
56
+ chat: {
57
+ id: number | string;
58
+ type?: string;
59
+ title?: string;
60
+ username?: string;
61
+ };
62
+ from?: {
63
+ id: number;
64
+ is_bot?: boolean;
65
+ username?: string;
66
+ first_name?: string;
67
+ };
68
+ date: number;
69
+ text?: string;
70
+ entities?: Array<{
71
+ type: string;
72
+ offset: number;
73
+ length: number;
74
+ }>;
75
+ }
76
+ interface TelegramRawUpdate {
77
+ update_id: number;
78
+ message?: TelegramRawMessage;
79
+ edited_message?: TelegramRawMessage;
80
+ callback_query?: unknown;
81
+ }
82
+ export interface TelegramSendMessageOptions {
83
+ chatId: number | string;
84
+ text: string;
85
+ parseMode?: 'Markdown' | 'MarkdownV2' | 'HTML';
86
+ replyToMessageId?: number;
87
+ disableWebPagePreview?: boolean;
88
+ }
89
+ export interface TelegramGetUpdatesOptions {
90
+ offset?: number;
91
+ limit?: number;
92
+ /** Long-poll timeout in seconds. 0 = short poll. */
93
+ timeoutSeconds?: number;
94
+ allowedUpdates?: string[];
95
+ /** Abort signal to cancel an in-flight long poll on shutdown. */
96
+ signal?: AbortSignal;
97
+ }
98
+ /**
99
+ * Telegram Bot API integration.
100
+ *
101
+ * Supports both webhook and long-poll delivery. Webhooks call
102
+ * eventToRunInput() to convert an incoming Update into a
103
+ * TelegramMessageTrigger; long pollers consume getUpdates() directly.
104
+ */
105
+ export declare class TelegramIntegration extends IntegrationBase {
106
+ readonly id: "telegram";
107
+ readonly name = "Telegram";
108
+ readonly capabilities: {
109
+ canTrigger: boolean;
110
+ canReceiveWebhooks: boolean;
111
+ canPoll: boolean;
112
+ canSendNotifications: boolean;
113
+ };
114
+ private botToken;
115
+ config: TelegramConfig;
116
+ /** Override fetch — useful for tests. */
117
+ private readonly fetchImpl;
118
+ constructor(config: TelegramConfig, options?: {
119
+ fetch?: typeof fetch;
120
+ });
121
+ protected validateCredentials(): Promise<void>;
122
+ protected performHealthCheck(): Promise<boolean>;
123
+ protected setupWebhook(): Promise<void>;
124
+ protected cleanupWebhook(): Promise<void>;
125
+ /**
126
+ * Verify the X-Telegram-Bot-Api-Secret-Token header against the configured
127
+ * webhook secret. Returns false on mismatch or missing config.
128
+ */
129
+ verifyWebhookSecret(headerSecret: string | undefined): boolean;
130
+ eventToRunInput(event: unknown): Promise<Record<string, unknown> | null>;
131
+ /** Send a message. Returns the sent message id. */
132
+ sendMessage(options: TelegramSendMessageOptions): Promise<{
133
+ messageId: number;
134
+ }>;
135
+ /** Notification-style helper that matches the Integration interface. */
136
+ sendNotification(message: string, options?: {
137
+ chatId?: number | string;
138
+ parseMode?: 'Markdown' | 'MarkdownV2' | 'HTML';
139
+ }): Promise<void>;
140
+ sendChatAction(chatId: number | string, action: 'typing'): Promise<void>;
141
+ getMe(): Promise<{
142
+ id: number;
143
+ username?: string;
144
+ firstName?: string;
145
+ }>;
146
+ /**
147
+ * Long-poll for updates. The caller is responsible for tracking the next
148
+ * offset (offset = lastUpdateId + 1) and for aborting on shutdown via
149
+ * options.signal.
150
+ */
151
+ getUpdates(options?: TelegramGetUpdatesOptions): Promise<TelegramRawUpdate[]>;
152
+ /** Drop any pending updates (useful when starting fresh). */
153
+ clearPendingUpdates(): Promise<void>;
154
+ /**
155
+ * Build a queue-style trigger source that long-polls Telegram and emits
156
+ * one `onMessage(payload)` per inbound text-bearing update. The payload
157
+ * is a flat `TelegramMessageInput` ready to use as a pipeline input.
158
+ *
159
+ * Register the returned object as a triggerSource in `skelm.config.ts`,
160
+ * then have a pipeline declare
161
+ * `triggers: [{ kind: 'queue', sourceId: '<id>' }]`. The gateway wires
162
+ * the rest — runs the workflow per message and (when `postReply` is on)
163
+ * sends `output.reply` back to the chat via `onResult`.
164
+ */
165
+ createTriggerSource(options?: CreateTelegramTriggerSourceOptions): TelegramTriggerSource;
166
+ private callApi;
167
+ }
168
+ export {};
169
+ //# sourceMappingURL=telegram.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegram.d.ts","sourceRoot":"","sources":["../src/telegram.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,314 @@
1
+ import { IntegrationBase } from './base.js';
2
+ /**
3
+ * Convert a raw Telegram update into the flat input shape pipelines
4
+ * consume. Returns null for updates that don't carry text content (those
5
+ * are skipped by the trigger source).
6
+ */
7
+ export function telegramUpdateToInput(update) {
8
+ const u = update;
9
+ const msg = u.message;
10
+ if (msg === undefined ||
11
+ typeof u.update_id !== 'number' ||
12
+ typeof msg.message_id !== 'number' ||
13
+ typeof msg.text !== 'string') {
14
+ return null;
15
+ }
16
+ const chat = msg.chat;
17
+ const from = msg.from;
18
+ return {
19
+ updateId: u.update_id,
20
+ messageId: msg.message_id,
21
+ chatId: String(chat.id),
22
+ from: from?.username ?? from?.first_name ?? 'user',
23
+ text: msg.text,
24
+ };
25
+ }
26
+ const TELEGRAM_API_BASE = 'https://api.telegram.org';
27
+ /**
28
+ * Telegram Bot API integration.
29
+ *
30
+ * Supports both webhook and long-poll delivery. Webhooks call
31
+ * eventToRunInput() to convert an incoming Update into a
32
+ * TelegramMessageTrigger; long pollers consume getUpdates() directly.
33
+ */
34
+ export class TelegramIntegration extends IntegrationBase {
35
+ id = 'telegram';
36
+ name = 'Telegram';
37
+ capabilities = {
38
+ canTrigger: true,
39
+ canReceiveWebhooks: true,
40
+ canPoll: true,
41
+ canSendNotifications: true,
42
+ };
43
+ botToken = null;
44
+ /** Override fetch — useful for tests. */
45
+ fetchImpl;
46
+ constructor(config, options = {}) {
47
+ super(config);
48
+ this.fetchImpl = options.fetch ?? fetch;
49
+ }
50
+ async validateCredentials() {
51
+ const token = this.config.credentials.botToken;
52
+ if (typeof token !== 'string' || token.length === 0) {
53
+ throw new Error('Telegram credentials missing: botToken required');
54
+ }
55
+ // Format: <bot_id>:<35-char-secret>. Reject obvious mistakes early.
56
+ if (!/^\d+:[A-Za-z0-9_-]{20,}$/.test(token)) {
57
+ throw new Error('Invalid Telegram bot token format');
58
+ }
59
+ this.botToken = token;
60
+ }
61
+ async performHealthCheck() {
62
+ try {
63
+ await this.getMe();
64
+ return true;
65
+ }
66
+ catch {
67
+ return false;
68
+ }
69
+ }
70
+ async setupWebhook() {
71
+ const webhook = this.config.webhook;
72
+ if (!webhook)
73
+ return;
74
+ const url = this.config.credentials.webhookUrl;
75
+ if (typeof url !== 'string' || url.length === 0)
76
+ return;
77
+ const secret = webhook.secret;
78
+ await this.callApi('setWebhook', {
79
+ url,
80
+ ...(secret !== undefined && { secret_token: secret }),
81
+ ...(webhook.events.length > 0 && { allowed_updates: webhook.events }),
82
+ });
83
+ }
84
+ async cleanupWebhook() {
85
+ if (!this.config.webhook)
86
+ return;
87
+ try {
88
+ await this.callApi('deleteWebhook', {});
89
+ }
90
+ catch {
91
+ // best-effort on shutdown
92
+ }
93
+ }
94
+ /**
95
+ * Verify the X-Telegram-Bot-Api-Secret-Token header against the configured
96
+ * webhook secret. Returns false on mismatch or missing config.
97
+ */
98
+ verifyWebhookSecret(headerSecret) {
99
+ const expected = this.config.webhook?.secret;
100
+ if (typeof expected !== 'string' || expected.length === 0)
101
+ return false;
102
+ if (typeof headerSecret !== 'string' || headerSecret.length === 0)
103
+ return false;
104
+ if (expected.length !== headerSecret.length)
105
+ return false;
106
+ let mismatch = 0;
107
+ for (let i = 0; i < expected.length; i++) {
108
+ mismatch |= expected.charCodeAt(i) ^ headerSecret.charCodeAt(i);
109
+ }
110
+ return mismatch === 0;
111
+ }
112
+ async eventToRunInput(event) {
113
+ const update = event;
114
+ const msg = update.message ?? update.edited_message;
115
+ if (!msg || typeof msg.message_id !== 'number') {
116
+ return null;
117
+ }
118
+ const m = msg;
119
+ const trigger = {
120
+ messageId: m.message_id,
121
+ chatId: String(m.chat.id),
122
+ from: m.from?.username ?? m.from?.first_name ?? String(m.from?.id ?? ''),
123
+ ...(m.text !== undefined && { text: m.text }),
124
+ ...(m.entities !== undefined && { entities: m.entities }),
125
+ date: m.date,
126
+ };
127
+ return {
128
+ trigger: { type: 'telegram-message', ...trigger, updateId: update.update_id },
129
+ };
130
+ }
131
+ /** Send a message. Returns the sent message id. */
132
+ async sendMessage(options) {
133
+ const result = await this.callApi('sendMessage', {
134
+ chat_id: options.chatId,
135
+ text: options.text,
136
+ ...(options.parseMode !== undefined && { parse_mode: options.parseMode }),
137
+ ...(options.replyToMessageId !== undefined && {
138
+ reply_to_message_id: options.replyToMessageId,
139
+ }),
140
+ ...(options.disableWebPagePreview !== undefined && {
141
+ disable_web_page_preview: options.disableWebPagePreview,
142
+ }),
143
+ });
144
+ return { messageId: result.message_id };
145
+ }
146
+ /** Notification-style helper that matches the Integration interface. */
147
+ async sendNotification(message, options) {
148
+ const chatId = options?.chatId ?? this.config.credentials.chatId;
149
+ if (chatId === undefined || chatId === '') {
150
+ throw new Error('Telegram sendNotification requires chatId in options or config.credentials');
151
+ }
152
+ await this.sendMessage({
153
+ chatId,
154
+ text: message,
155
+ ...(options?.parseMode !== undefined && { parseMode: options.parseMode }),
156
+ });
157
+ }
158
+ async sendChatAction(chatId, action) {
159
+ await this.callApi('sendChatAction', { chat_id: chatId, action });
160
+ }
161
+ async getMe() {
162
+ const r = await this.callApi('getMe', {});
163
+ return {
164
+ id: r.id,
165
+ ...(r.username !== undefined && { username: r.username }),
166
+ ...(r.first_name !== undefined && { firstName: r.first_name }),
167
+ };
168
+ }
169
+ /**
170
+ * Long-poll for updates. The caller is responsible for tracking the next
171
+ * offset (offset = lastUpdateId + 1) and for aborting on shutdown via
172
+ * options.signal.
173
+ */
174
+ async getUpdates(options = {}) {
175
+ return this.callApi('getUpdates', {
176
+ ...(options.offset !== undefined && { offset: options.offset }),
177
+ limit: options.limit ?? 100,
178
+ timeout: options.timeoutSeconds ?? 25,
179
+ ...(options.allowedUpdates !== undefined && { allowed_updates: options.allowedUpdates }),
180
+ }, options.signal);
181
+ }
182
+ /** Drop any pending updates (useful when starting fresh). */
183
+ async clearPendingUpdates() {
184
+ const updates = await this.getUpdates({ timeoutSeconds: 0, limit: 1 });
185
+ if (updates.length > 0) {
186
+ const last = updates[updates.length - 1];
187
+ await this.getUpdates({ offset: last.update_id + 1, timeoutSeconds: 0, limit: 1 });
188
+ }
189
+ }
190
+ /**
191
+ * Build a queue-style trigger source that long-polls Telegram and emits
192
+ * one `onMessage(payload)` per inbound text-bearing update. The payload
193
+ * is a flat `TelegramMessageInput` ready to use as a pipeline input.
194
+ *
195
+ * Register the returned object as a triggerSource in `skelm.config.ts`,
196
+ * then have a pipeline declare
197
+ * `triggers: [{ kind: 'queue', sourceId: '<id>' }]`. The gateway wires
198
+ * the rest — runs the workflow per message and (when `postReply` is on)
199
+ * sends `output.reply` back to the chat via `onResult`.
200
+ */
201
+ createTriggerSource(options = {}) {
202
+ const dropPending = options.dropPending ?? true;
203
+ const longPollSeconds = options.longPollSeconds ?? 25;
204
+ const allowedUpdates = options.allowedUpdates ?? ['message'];
205
+ const postReply = options.postReply ?? true;
206
+ const integration = this;
207
+ let stopping = false;
208
+ let abortCtl = null;
209
+ const seen = new Set();
210
+ let offset;
211
+ let loopPromise = null;
212
+ const loop = async (onMessage) => {
213
+ if (dropPending) {
214
+ try {
215
+ await integration.clearPendingUpdates();
216
+ }
217
+ catch {
218
+ // best-effort
219
+ }
220
+ }
221
+ while (!stopping) {
222
+ abortCtl = new AbortController();
223
+ let updates;
224
+ try {
225
+ updates = await integration.getUpdates({
226
+ ...(offset !== undefined && { offset }),
227
+ timeoutSeconds: longPollSeconds,
228
+ allowedUpdates,
229
+ signal: abortCtl.signal,
230
+ });
231
+ }
232
+ catch (err) {
233
+ if (stopping)
234
+ break;
235
+ const msg = err instanceof Error ? err.message : String(err);
236
+ // Telegram returns 409 Conflict for ~30s after a previous
237
+ // long-poll dies; back off harder than for a generic failure.
238
+ const backoff = msg.includes('Conflict') ? 5000 : 1000;
239
+ await new Promise((r) => setTimeout(r, backoff));
240
+ continue;
241
+ }
242
+ for (const update of updates) {
243
+ if (stopping)
244
+ break;
245
+ offset = update.update_id + 1;
246
+ if (seen.has(update.update_id))
247
+ continue;
248
+ seen.add(update.update_id);
249
+ const input = telegramUpdateToInput(update);
250
+ if (input === null)
251
+ continue;
252
+ try {
253
+ await onMessage(input);
254
+ }
255
+ catch {
256
+ // Coordinator records lastError on its own; keep the loop alive.
257
+ }
258
+ }
259
+ }
260
+ };
261
+ return {
262
+ start({ onMessage }) {
263
+ stopping = false;
264
+ loopPromise = loop(onMessage);
265
+ },
266
+ async stop() {
267
+ stopping = true;
268
+ abortCtl?.abort();
269
+ try {
270
+ await loopPromise;
271
+ }
272
+ catch {
273
+ // ignore
274
+ }
275
+ },
276
+ ...(postReply && {
277
+ async onResult(payload, output) {
278
+ const input = payload;
279
+ const reply = output?.reply;
280
+ if (input === undefined || typeof reply !== 'string' || reply === '')
281
+ return;
282
+ try {
283
+ await integration.sendMessage({
284
+ chatId: input.chatId,
285
+ text: reply,
286
+ replyToMessageId: input.messageId,
287
+ });
288
+ }
289
+ catch {
290
+ // best-effort; gateway audit will record the run, the loop continues.
291
+ }
292
+ },
293
+ }),
294
+ };
295
+ }
296
+ async callApi(method, body, signal) {
297
+ if (this.botToken === null) {
298
+ throw new Error('TelegramIntegration not initialized — call init() first');
299
+ }
300
+ const url = `${TELEGRAM_API_BASE}/bot${this.botToken}/${method}`;
301
+ const res = await this.fetchImpl(url, {
302
+ method: 'POST',
303
+ headers: { 'content-type': 'application/json' },
304
+ body: JSON.stringify(body),
305
+ ...(signal !== undefined && { signal }),
306
+ });
307
+ const json = (await res.json());
308
+ if (!json.ok || json.result === undefined) {
309
+ throw new Error(`Telegram API ${method} failed: ${json.description ?? `HTTP ${res.status}`}`);
310
+ }
311
+ return json.result;
312
+ }
313
+ }
314
+ //# sourceMappingURL=telegram.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegram.js","sourceRoot":"","sources":["../src/telegram.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@skelm/integrations",
3
- "version": "0.3.7",
3
+ "version": "0.3.8",
4
4
  "description": "Third-party integrations for skelm pipelines",
5
5
  "license": "MIT",
6
6
  "author": "Scott Glover <scottgl@gmail.com>",
7
- "homepage": "https://github.com/scottgl9/skelm#readme",
7
+ "homepage": "https://skelm.dev/",
8
8
  "repository": {
9
9
  "type": "git",
10
10
  "url": "git+https://github.com/scottgl9/skelm.git",
@@ -46,7 +46,7 @@
46
46
  "clean": "rm -rf dist tsconfig.tsbuildinfo"
47
47
  },
48
48
  "dependencies": {
49
- "@skelm/core": "^0.3.7"
49
+ "@skelm/core": "^0.3.8"
50
50
  },
51
51
  "devDependencies": {
52
52
  "typescript": "^5.6.3",