@skelm/integrations 0.3.6 → 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 +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/registry.d.ts +3 -1
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +9 -12
- package/dist/registry.js.map +1 -1
- package/dist/telegram.d.ts +169 -0
- package/dist/telegram.d.ts.map +1 -0
- package/dist/telegram.js +314 -0
- package/dist/telegram.js.map +1 -0
- package/dist/types.d.ts +5 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +4 -4
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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;
|
|
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"}
|
package/dist/registry.d.ts
CHANGED
|
@@ -39,7 +39,9 @@ export declare class IntegrationRegistry {
|
|
|
39
39
|
*/
|
|
40
40
|
offEvent(integrationId: string, handler: (event: unknown) => Promise<unknown>): void;
|
|
41
41
|
/**
|
|
42
|
-
* Dispatch an event to all handlers for an integration
|
|
42
|
+
* Dispatch an event to all handlers for an integration.
|
|
43
|
+
* Errors from handlers are not swallowed — they propagate to the caller
|
|
44
|
+
* so auth failures and misconfiguration are surfaced rather than hidden.
|
|
43
45
|
*/
|
|
44
46
|
dispatchEvent(integrationId: string, event: unknown): Promise<unknown[]>;
|
|
45
47
|
/**
|
package/dist/registry.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAqB,MAAM,YAAY,CAAA;AAEhE;;;GAGG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,YAAY,CAAiC;IACrD,OAAO,CAAC,aAAa,CAAiE;IAEtF;;OAEG;IACG,QAAQ,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IASvD;;OAEG;IACG,UAAU,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUtD;;OAEG;IACH,GAAG,CAAC,aAAa,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAInD;;OAEG;IACH,IAAI,IAAI,WAAW,EAAE;IAIrB;;OAEG;IACH,WAAW,IAAI,WAAW,EAAE;IAI5B;;OAEG;IACH,GAAG,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO;IAInC;;OAEG;IACH,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI;IAOnF;;OAEG;IACH,QAAQ,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI;IAYpF
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAqB,MAAM,YAAY,CAAA;AAEhE;;;GAGG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,YAAY,CAAiC;IACrD,OAAO,CAAC,aAAa,CAAiE;IAEtF;;OAEG;IACG,QAAQ,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IASvD;;OAEG;IACG,UAAU,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUtD;;OAEG;IACH,GAAG,CAAC,aAAa,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAInD;;OAEG;IACH,IAAI,IAAI,WAAW,EAAE;IAIrB;;OAEG;IACH,WAAW,IAAI,WAAW,EAAE;IAI5B;;OAEG;IACH,GAAG,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO;IAInC;;OAEG;IACH,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI;IAOnF;;OAEG;IACH,QAAQ,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI;IAYpF;;;;OAIG;IACG,aAAa,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAS9E;;OAEG;IACH,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IASpD;;OAEG;IACG,aAAa,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAyB5E;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAO/B;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAcnD"}
|
package/dist/registry.js
CHANGED
|
@@ -73,20 +73,15 @@ export class IntegrationRegistry {
|
|
|
73
73
|
}
|
|
74
74
|
}
|
|
75
75
|
/**
|
|
76
|
-
* Dispatch an event to all handlers for an integration
|
|
76
|
+
* Dispatch an event to all handlers for an integration.
|
|
77
|
+
* Errors from handlers are not swallowed — they propagate to the caller
|
|
78
|
+
* so auth failures and misconfiguration are surfaced rather than hidden.
|
|
77
79
|
*/
|
|
78
80
|
async dispatchEvent(integrationId, event) {
|
|
79
|
-
const handlers = this.eventHandlers.get(integrationId)
|
|
81
|
+
const handlers = this.eventHandlers.get(integrationId) ?? [];
|
|
80
82
|
const results = [];
|
|
81
83
|
for (const handler of handlers) {
|
|
82
|
-
|
|
83
|
-
const result = await handler(event);
|
|
84
|
-
results.push(result);
|
|
85
|
-
}
|
|
86
|
-
catch (error) {
|
|
87
|
-
console.error(`Event handler error for ${integrationId}:`, error);
|
|
88
|
-
results.push({ error: String(error) });
|
|
89
|
-
}
|
|
84
|
+
results.push(await handler(event));
|
|
90
85
|
}
|
|
91
86
|
return results;
|
|
92
87
|
}
|
|
@@ -111,8 +106,10 @@ export class IntegrationRegistry {
|
|
|
111
106
|
if (!integration.config.enabled) {
|
|
112
107
|
throw new Error(`Integration ${integrationId} is not enabled`);
|
|
113
108
|
}
|
|
114
|
-
// Try to convert event to RunInput if the integration supports it
|
|
115
|
-
|
|
109
|
+
// Try to convert event to RunInput if the integration supports it.
|
|
110
|
+
// Use the typed optional method from the Integration interface rather than
|
|
111
|
+
// a duck-type check, so only the declared interface contract is exercised.
|
|
112
|
+
if (integration.eventToRunInput !== undefined) {
|
|
116
113
|
const runInput = await integration.eventToRunInput(event);
|
|
117
114
|
if (runInput) {
|
|
118
115
|
return { type: 'run_input', data: runInput };
|
package/dist/registry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,OAAO,mBAAmB;IACtB,YAAY,GAAG,IAAI,GAAG,EAAuB,CAAA;IAC7C,aAAa,GAAG,IAAI,GAAG,EAAuD,CAAA;IAEtF;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,WAAwB;QACrC,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,eAAe,WAAW,CAAC,EAAE,qBAAqB,CAAC,CAAA;QACrE,CAAC;QAED,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,EAAE,WAAW,CAAC,CAAA;QAClD,MAAM,WAAW,CAAC,IAAI,EAAE,CAAA;IAC1B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,aAAqB;QACpC,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;QACxD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,eAAe,aAAa,YAAY,CAAC,CAAA;QAC3D,CAAC;QAED,MAAM,WAAW,CAAC,QAAQ,EAAE,CAAA;QAC5B,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;IACzC,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,aAAqB;QACvB,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;IAC7C,CAAC;IAED;;OAEG;IACH,IAAI;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAA;IAC/C,CAAC;IAED;;OAEG;IACH,WAAW;QACT,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACpD,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,aAAqB;QACvB,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;IAC7C,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,aAAqB,EAAE,OAA6C;QAC1E,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,aAAa,EAAE,EAAE,CAAC,CAAA;QAC3C,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;IACtD,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,aAAqB,EAAE,OAA6C;QAC3E,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;QACtD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAM;QACR,CAAC;QAED,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QACvC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YACf,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;QAC3B,CAAC;IACH,CAAC;IAED
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -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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"}
|
package/dist/telegram.js
ADDED
|
@@ -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/dist/types.d.ts
CHANGED
|
@@ -18,7 +18,11 @@ export interface IntegrationConfig {
|
|
|
18
18
|
name: string;
|
|
19
19
|
/** Whether the integration is enabled */
|
|
20
20
|
enabled: boolean;
|
|
21
|
-
/**
|
|
21
|
+
/**
|
|
22
|
+
* Authentication credentials. Values must be resolved from a SecretResolver
|
|
23
|
+
* before being placed here — do not log, serialize to audit, or expose in
|
|
24
|
+
* health-check output.
|
|
25
|
+
*/
|
|
22
26
|
credentials: Record<string, string | number | boolean>;
|
|
23
27
|
/** Optional webhook configuration */
|
|
24
28
|
webhook?: WebhookConfig;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAE9C,qCAAqC;AACrC,MAAM,WAAW,iBAAiB;IAChC,uDAAuD;IACvD,EAAE,EAAE,MAAM,CAAA;IACV,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,yCAAyC;IACzC,OAAO,EAAE,OAAO,CAAA;IAChB
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.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.
|
|
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://
|
|
7
|
+
"homepage": "https://skelm.dev/",
|
|
8
8
|
"repository": {
|
|
9
9
|
"type": "git",
|
|
10
10
|
"url": "git+https://github.com/scottgl9/skelm.git",
|
|
@@ -43,10 +43,10 @@
|
|
|
43
43
|
"build": "tsc -p tsconfig.json",
|
|
44
44
|
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
45
45
|
"test": "vitest run",
|
|
46
|
-
"clean": "rm -rf dist"
|
|
46
|
+
"clean": "rm -rf dist tsconfig.tsbuildinfo"
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
|
-
"@skelm/core": "^0.3.
|
|
49
|
+
"@skelm/core": "^0.3.8"
|
|
50
50
|
},
|
|
51
51
|
"devDependencies": {
|
|
52
52
|
"typescript": "^5.6.3",
|