@soulbatical/tetra-core 0.5.3 → 0.6.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.
package/dist/index.d.ts CHANGED
@@ -118,6 +118,8 @@ export { BillingService, addBillingRoutes, addBillingWebhookRoutes } from './sha
118
118
  export type { PlanConfig, BillingConfig, BillingCycle, BillingProvider, SubscriptionStatus, SubscriptionRecord, BillingStatusResponse, BillingRouteOptions } from './shared/billing/index.js';
119
119
  export { addStorageProxyRoutes, addStorageUploadRoutes, StorageProxyService, StorageUploadService, ImageProcessingService, STANDARD_IMAGE_SIZES, getCreativeUrl, getCreativeStoragePath, getAdLibraryThumbnailUrl, getAdLibraryThumbnailPath } from './shared/storage/index.js';
120
120
  export type { StorageConfig, StorageProxyOptions, StorageUploadOptions, UploadResult as StorageUploadResult, ImageSize, ProcessedImageResult, ImageProcessingOptions, FileUploadOptions, MultiSizeUploadOptions, PrivateUploadOptions, PrivateUploadResult, MultiSizeUploadResult } from './shared/storage/index.js';
121
+ export { addTelegramRoutes } from './shared/telegram/index.js';
122
+ export type { TelegramRoutesConfig, TelegramService, TelegramUserSettings, TelegramRule, TelegramMessageHandler, TelegramCallbackHandler, TelegramMessageContext, TelegramCallbackContext, RuleConditions as TelegramRuleConditions, RuleAction as TelegramRuleAction, RulePreset as TelegramRulePreset, InlineKeyboard as TelegramInlineKeyboard, NotifyEventOptions as TelegramNotifyEventOptions } from './shared/telegram/index.js';
121
123
  export { META_API_VERSION, META_API_BASE, metaPost, metaGet } from './shared/meta-api/index.js';
122
124
  export { PlannerService, GoogleCalendarService, addPlannerRoutes, addPlannerPublicRoutes, addPlannerCalendarRoutes, computeAvailableSlots, timeToMinutes, minutesToTime } from './shared/planner/index.js';
123
125
  export type { PlannerConfig, PlannerCalendarConfig, PlannerRouteOptions, PlannerCallbackContext, AvailabilitySlotRecord, AvailabilitySlotInput, AppointmentRecord, AppointmentInput, SchedulerSettingsRecord, VacationRecord, CalendarTokenRecord, PublicBookingInput, PublicBookingVisitor, TimeSlot, DayAvailability, TeamAvailability, PublicSchedulerData } from './shared/planner/index.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -114,6 +114,8 @@ export { addMcpRoutes, addMcpAuthRoutes, addMcpTokenRoutes, addMcpUsageRoutes, g
114
114
  export { BillingService, addBillingRoutes, addBillingWebhookRoutes } from './shared/billing/index.js';
115
115
  // ─── Storage Module ─────────────────────────────────────────
116
116
  export { addStorageProxyRoutes, addStorageUploadRoutes, StorageProxyService, StorageUploadService, ImageProcessingService, STANDARD_IMAGE_SIZES, getCreativeUrl, getCreativeStoragePath, getAdLibraryThumbnailUrl, getAdLibraryThumbnailPath } from './shared/storage/index.js';
117
+ // ─── Telegram Module ────────────────────────────────────────
118
+ export { addTelegramRoutes } from './shared/telegram/index.js';
117
119
  // ─── Meta API Module ──────────────────────────────────────
118
120
  export { META_API_VERSION, META_API_BASE, metaPost, metaGet } from './shared/meta-api/index.js';
119
121
  // ─── Planner Module ────────────────────────────────────────
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAIH,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAMtE,+DAA+D;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AAClF,OAAO,EAAE,sBAAsB,EAAE,MAAM,gDAAgD,CAAC;AACxF,OAAO,EAAE,4BAA4B,EAAE,MAAM,gDAAgD,CAAC;AAE9F,+DAA+D;AAC/D,OAAO,EAAE,kBAAkB,EAAE,0BAA0B,EAAE,MAAM,2CAA2C,CAAC;AAE3G,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC7F,OAAO,EAAE,iBAAiB,EAAE,MAAM,4CAA4C,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAEzE,+DAA+D;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;AACnF,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AACpG,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAEvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAEzE,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8CAA8C,CAAC;AAEvF,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAGjF,gEAAgE;AAChE,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,wBAAwB,EAAE,WAAW,EAAE,0BAA0B,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAE9N,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAChJ,OAAO,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AAC5G,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAGvE,2CAA2C;AAC3C,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,kBAAkB,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAC;AAG9K,mCAAmC;AACnC,OAAO,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,eAAe,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAGtP,8DAA8D;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAGzD,yBAAyB;AACzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAEnE,gFAAgF;AAChF,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAE3E,iEAAiE;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAE5D,+DAA+D;AAC/D,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE7D,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AACpF,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,eAAe,EAAE,eAAe,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAEpO,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AACpG,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACrF,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAGpH,+DAA+D;AAC/D,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAC1H,OAAO,EAAE,oBAAoB,EAAE,6BAA6B,EAAE,eAAe,EAAE,MAAM,8CAA8C,CAAC;AAKpI,gEAAgE;AAChE,6EAA6E;AAC7E,uFAAuF;AAEvF,+DAA+D;AAC/D,4EAA4E;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAGxE,8DAA8D;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAElE,8DAA8D;AAC9D,OAAO,EAAE,2BAA2B,EAAE,MAAM,mDAAmD,CAAC;AAChG,OAAO,EAAE,qBAAqB,EAAE,MAAM,6CAA6C,CAAC;AACpF,OAAO,EAAE,6BAA6B,EAAE,MAAM,8CAA8C,CAAC;AAC7F,OAAO,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AAGzH,+DAA+D;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAG9D,gEAAgE;AAChE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAE9E,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAE/E,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAE5E,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAEnF,sCAAsC;AACtC,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,cAAc,IAAI,iBAAiB,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAG5O,8DAA8D;AAC9D,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,SAAS,EAAE,mBAAmB,EAAE,YAAY,EAAE,YAAY,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAC;AAE/L,+DAA+D;AAC/D,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,UAAU,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClJ,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAGhQ,+DAA+D;AAC/D,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGxO,+DAA+D;AAC/D,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAGtG,+DAA+D;AAC/D,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,cAAc,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAGhR,+DAA+D;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAG/D,6DAA6D;AAC7D,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAEhG,8DAA8D;AAC9D,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAG3M,6DAA6D;AAC7D,OAAO,EAAE,UAAU,EAAE,uBAAuB,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlG,+DAA+D;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { addTelegramRoutes } from './routes.js';
2
+ export type { TelegramRoutesConfig, TelegramService, TelegramUserSettings, TelegramRule, TelegramMessageHandler, TelegramCallbackHandler, TelegramMessageContext, TelegramCallbackContext, RuleConditions, RuleAction, RulePreset, InlineKeyboard, NotifyEventOptions, } from './types.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/shared/telegram/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,YAAY,EACV,oBAAoB,EACpB,eAAe,EACf,oBAAoB,EACpB,YAAY,EACZ,sBAAsB,EACtB,uBAAuB,EACvB,sBAAsB,EACtB,uBAAuB,EACvB,cAAc,EACd,UAAU,EACV,UAAU,EACV,cAAc,EACd,kBAAkB,GACnB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { addTelegramRoutes } from './routes.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/shared/telegram/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Telegram Route Factory — addTelegramRoutes()
3
+ *
4
+ * Creates all Telegram integration routes and services:
5
+ * - Webhook receiver (POST /webhook)
6
+ * - Admin CRUD: settings, connect, disconnect, test, rules, presets
7
+ * - Notification service (notifyEvent, editMessage, sendMessage)
8
+ * - Webhook auto-registration
9
+ *
10
+ * Usage:
11
+ * ```typescript
12
+ * import { addTelegramRoutes } from '@soulbatical/tetra-core';
13
+ *
14
+ * const telegram = addTelegramRoutes({
15
+ * botToken: process.env.MY_TELEGRAM_BOT_TOKEN!,
16
+ * botUsername: 'myapp_bot',
17
+ * appName: 'MyApp',
18
+ * dashboardUrl: 'https://myapp.com/settings/telegram',
19
+ * presets: [...],
20
+ * onMessage: async (ctx) => {
21
+ * // Handle free-text messages — return string to reply
22
+ * return `You said: ${ctx.text}`;
23
+ * },
24
+ * });
25
+ *
26
+ * // Mount in createApp routes:
27
+ * { prefix: '/api/public/telegram/webhook', access: 'public', rateLimit: 'none', router: telegram.webhookRouter },
28
+ * { prefix: '/api/admin/telegram', access: 'admin', router: telegram.adminRouter, middleware: [...] },
29
+ *
30
+ * // Register webhook on startup (in services):
31
+ * { name: 'TelegramWebhook', start: () => telegram.registerWebhook(baseUrl) },
32
+ *
33
+ * // Send notifications from anywhere:
34
+ * telegram.notifyEvent(orgId, projectId, 'campaign_published', 'Campaign X is live!');
35
+ * ```
36
+ */
37
+ import type { TelegramRoutesConfig, TelegramService } from './types.js';
38
+ export declare function addTelegramRoutes(config: TelegramRoutesConfig): TelegramService;
39
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../src/shared/telegram/routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAQH,OAAO,KAAK,EACV,oBAAoB,EACpB,eAAe,EAQhB,MAAM,YAAY,CAAC;AAgGpB,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,oBAAoB,GAAG,eAAe,CAymB/E"}
@@ -0,0 +1,690 @@
1
+ /**
2
+ * Telegram Route Factory — addTelegramRoutes()
3
+ *
4
+ * Creates all Telegram integration routes and services:
5
+ * - Webhook receiver (POST /webhook)
6
+ * - Admin CRUD: settings, connect, disconnect, test, rules, presets
7
+ * - Notification service (notifyEvent, editMessage, sendMessage)
8
+ * - Webhook auto-registration
9
+ *
10
+ * Usage:
11
+ * ```typescript
12
+ * import { addTelegramRoutes } from '@soulbatical/tetra-core';
13
+ *
14
+ * const telegram = addTelegramRoutes({
15
+ * botToken: process.env.MY_TELEGRAM_BOT_TOKEN!,
16
+ * botUsername: 'myapp_bot',
17
+ * appName: 'MyApp',
18
+ * dashboardUrl: 'https://myapp.com/settings/telegram',
19
+ * presets: [...],
20
+ * onMessage: async (ctx) => {
21
+ * // Handle free-text messages — return string to reply
22
+ * return `You said: ${ctx.text}`;
23
+ * },
24
+ * });
25
+ *
26
+ * // Mount in createApp routes:
27
+ * { prefix: '/api/public/telegram/webhook', access: 'public', rateLimit: 'none', router: telegram.webhookRouter },
28
+ * { prefix: '/api/admin/telegram', access: 'admin', router: telegram.adminRouter, middleware: [...] },
29
+ *
30
+ * // Register webhook on startup (in services):
31
+ * { name: 'TelegramWebhook', start: () => telegram.registerWebhook(baseUrl) },
32
+ *
33
+ * // Send notifications from anywhere:
34
+ * telegram.notifyEvent(orgId, projectId, 'campaign_published', 'Campaign X is live!');
35
+ * ```
36
+ */
37
+ import { Router } from 'express';
38
+ import crypto from 'crypto';
39
+ import { RFC7807ErrorResponse } from '../rfc7807ErrorResponse.js';
40
+ import { createLogger } from '../../utils/logger.js';
41
+ import { systemDB } from '../../core/systemDb.js';
42
+ import { adminDB } from '../../core/adminDb.js';
43
+ const log = createLogger('telegram');
44
+ // ── Telegram API Helpers ────────────────────────────────────
45
+ async function telegramApi(botToken, method, body) {
46
+ const res = await fetch(`https://api.telegram.org/bot${botToken}/${method}`, {
47
+ method: 'POST',
48
+ headers: { 'Content-Type': 'application/json' },
49
+ body: JSON.stringify(body),
50
+ });
51
+ return res.json();
52
+ }
53
+ function getOrgId(req) {
54
+ const user = req.user;
55
+ if (!user)
56
+ return undefined;
57
+ return user.active_organization_id || user.organizationId || user.activeOrganizationId;
58
+ }
59
+ function getUserId(req) {
60
+ return req.user?.id;
61
+ }
62
+ // ── Rule Evaluator ──────────────────────────────────────────
63
+ async function evaluateRules(botToken, userId, ctx) {
64
+ const db = systemDB('telegram-rules');
65
+ try {
66
+ const { data: rules } = await db
67
+ .from('telegram_rules')
68
+ .select('*')
69
+ .eq('organization_id', ctx.organizationId)
70
+ .eq('enabled', true)
71
+ .or(`user_id.is.null,user_id.eq.${userId}`)
72
+ .order('user_id', { ascending: true, nullsFirst: true })
73
+ .order('priority', { ascending: true });
74
+ if (!rules || rules.length === 0) {
75
+ return { action: 'notify', matchedRule: null };
76
+ }
77
+ for (const rule of rules) {
78
+ if (matchesConditions(rule.conditions, ctx)) {
79
+ return { action: rule.action, matchedRule: rule };
80
+ }
81
+ }
82
+ return { action: 'notify', matchedRule: null };
83
+ }
84
+ catch (err) {
85
+ log.error('Rule evaluation failed, defaulting to notify:', err);
86
+ return { action: 'notify', matchedRule: null };
87
+ }
88
+ }
89
+ function matchesConditions(conditions, ctx) {
90
+ if (!conditions || Object.keys(conditions).length === 0)
91
+ return true;
92
+ if (conditions.event_types?.length) {
93
+ if (!conditions.event_types.includes(ctx.eventType))
94
+ return false;
95
+ }
96
+ if (conditions.project_ids?.length) {
97
+ if (!ctx.projectId || !conditions.project_ids.includes(ctx.projectId))
98
+ return false;
99
+ }
100
+ if (conditions.custom_types?.length) {
101
+ if (!ctx.customType || !conditions.custom_types.includes(ctx.customType))
102
+ return false;
103
+ }
104
+ if (conditions.keywords?.length) {
105
+ if (!ctx.message)
106
+ return false;
107
+ const msgLower = ctx.message.toLowerCase();
108
+ if (!conditions.keywords.some(kw => msgLower.includes(kw.toLowerCase())))
109
+ return false;
110
+ }
111
+ return true;
112
+ }
113
+ // ── Factory ─────────────────────────────────────────────────
114
+ export function addTelegramRoutes(config) {
115
+ const { botToken, botUsername, presets = [], knownEvents } = config;
116
+ const appName = config.appName || 'App';
117
+ const dashboardUrl = config.dashboardUrl || '';
118
+ const VALID_ACTIONS = ['notify', 'silent'];
119
+ // ── Notification Service ────────────────────────────────
120
+ async function sendMessage(chatId, text, keyboard) {
121
+ const body = {
122
+ chat_id: chatId,
123
+ text,
124
+ parse_mode: 'Markdown',
125
+ };
126
+ if (keyboard)
127
+ body.reply_markup = keyboard;
128
+ const result = await telegramApi(botToken, 'sendMessage', body);
129
+ return result.ok;
130
+ }
131
+ async function editMessage(chatId, messageId, newText, keyboard) {
132
+ const body = {
133
+ chat_id: chatId,
134
+ message_id: messageId,
135
+ text: newText,
136
+ parse_mode: 'Markdown',
137
+ };
138
+ if (keyboard)
139
+ body.reply_markup = keyboard;
140
+ const result = await telegramApi(botToken, 'editMessageText', body);
141
+ return result.ok;
142
+ }
143
+ async function notifyEvent(organizationId, projectId, eventType, message, options) {
144
+ if (!organizationId)
145
+ return 0;
146
+ const db = systemDB('telegram-notify');
147
+ const { data: settings } = await db
148
+ .from('user_telegram_settings')
149
+ .select('user_id, telegram_chat_id, project_ids, notification_events, permissions')
150
+ .eq('organization_id', organizationId)
151
+ .eq('enabled', true);
152
+ if (!settings || settings.length === 0)
153
+ return 0;
154
+ let sentCount = 0;
155
+ for (const setting of settings) {
156
+ if (!setting.telegram_chat_id)
157
+ continue;
158
+ // Filter by project
159
+ if (setting.project_ids !== null && projectId) {
160
+ if (!setting.project_ids.includes(projectId))
161
+ continue;
162
+ }
163
+ if (setting.project_ids !== null && !projectId)
164
+ continue;
165
+ // Filter by notification_events
166
+ if (setting.notification_events !== null) {
167
+ if (!setting.notification_events.includes(eventType))
168
+ continue;
169
+ }
170
+ // Filter by required permission
171
+ if (options?.requiredPermission) {
172
+ if (!setting.permissions?.includes(options.requiredPermission))
173
+ continue;
174
+ }
175
+ // Evaluate rules engine
176
+ const { action } = await evaluateRules(botToken, setting.user_id, {
177
+ organizationId,
178
+ projectId,
179
+ eventType,
180
+ customType: options?.customType,
181
+ message,
182
+ });
183
+ if (action === 'silent')
184
+ continue;
185
+ const ok = await sendMessage(setting.telegram_chat_id, message, options?.keyboard);
186
+ if (ok)
187
+ sentCount++;
188
+ }
189
+ return sentCount;
190
+ }
191
+ // ── Webhook Router (public, no auth) ────────────────────
192
+ const webhookRouter = Router();
193
+ webhookRouter.post('/', async (req, res) => {
194
+ // Always return 200 to Telegram
195
+ res.sendStatus(200);
196
+ try {
197
+ const update = req.body;
198
+ // Handle callback queries
199
+ if (update?.callback_query && config.onCallbackQuery) {
200
+ const cq = update.callback_query;
201
+ const chatId = cq.message?.chat?.id;
202
+ const messageId = cq.message?.message_id;
203
+ // Answer callback to remove loading spinner
204
+ await telegramApi(botToken, 'answerCallbackQuery', { callback_query_id: cq.id });
205
+ // Look up user by chat_id
206
+ const db = systemDB('telegram-webhook');
207
+ const { data: settings } = await db
208
+ .from('user_telegram_settings')
209
+ .select('*')
210
+ .eq('telegram_chat_id', String(chatId))
211
+ .maybeSingle();
212
+ if (settings) {
213
+ const replyText = await config.onCallbackQuery({
214
+ chatId,
215
+ messageId,
216
+ callbackData: cq.data || '',
217
+ firstName: cq.from?.first_name || '',
218
+ userId: settings.user_id,
219
+ organizationId: settings.organization_id,
220
+ settings,
221
+ });
222
+ if (replyText) {
223
+ await editMessage(String(chatId), messageId, replyText);
224
+ }
225
+ }
226
+ return;
227
+ }
228
+ const message = update?.message;
229
+ if (!message?.text)
230
+ return;
231
+ const text = message.text.trim();
232
+ const chatId = message.chat.id;
233
+ const firstName = message.from?.first_name || 'there';
234
+ // /start <token> — deep link pairing
235
+ if (text.startsWith('/start ')) {
236
+ const linkToken = text.slice(7).trim();
237
+ if (!linkToken || linkToken.length < 16)
238
+ return;
239
+ const db = systemDB('telegram-webhook');
240
+ const { data: settings, error } = await db
241
+ .from('user_telegram_settings')
242
+ .select('id, link_token_expires_at')
243
+ .eq('link_token', linkToken)
244
+ .maybeSingle();
245
+ if (error || !settings) {
246
+ await sendMessage(chatId, '\u274C This link is invalid or expired. Go back and try again.');
247
+ return;
248
+ }
249
+ if (settings.link_token_expires_at && new Date(settings.link_token_expires_at) < new Date()) {
250
+ await sendMessage(chatId, `\u23F0 This link has expired. Go back to ${appName} and click "Connect Telegram" again.`);
251
+ return;
252
+ }
253
+ const { error: updateError } = await db
254
+ .from('user_telegram_settings')
255
+ .update({
256
+ telegram_chat_id: String(chatId),
257
+ enabled: true,
258
+ link_token: null,
259
+ link_token_expires_at: null,
260
+ updated_at: new Date().toISOString(),
261
+ })
262
+ .eq('id', settings.id);
263
+ if (updateError) {
264
+ log.error('Could not save chat_id:', updateError);
265
+ await sendMessage(chatId, '\u274C Something went wrong. Please try again.');
266
+ return;
267
+ }
268
+ await sendMessage(chatId, `\u2705 *${appName} connected!*\n\nHi ${firstName}! You will now receive Telegram notifications.\n\nYou can customize which notifications you receive in the ${appName} dashboard.`);
269
+ log.info(`Telegram linked: chat ${chatId}`);
270
+ return;
271
+ }
272
+ // /start — no token
273
+ if (text === '/start') {
274
+ const msg = config.welcomeMessage ||
275
+ `\u{1F680} *Welcome to ${appName}!*\n\nGo to your ${appName} dashboard and click "Connect Telegram" to enable notifications.${dashboardUrl ? `\n\n${dashboardUrl}` : ''}`;
276
+ await sendMessage(chatId, msg);
277
+ return;
278
+ }
279
+ // /help
280
+ if (text === '/help') {
281
+ const msg = config.helpMessage ||
282
+ `\u{1F680} *${appName} Bot*\n\nThis bot sends you notifications from ${appName}.\n\n*Setup:*\n1. Go to your ${appName} dashboard\n2. Click "Connect Telegram"\n3. Done!\n\n*Commands:*\n/start \u2014 Connect your account\n/help \u2014 This message\n/status \u2014 Check your status`;
283
+ await sendMessage(chatId, msg);
284
+ return;
285
+ }
286
+ // /status
287
+ if (text === '/status') {
288
+ const db = systemDB('telegram-webhook');
289
+ const { data: settings } = await db
290
+ .from('user_telegram_settings')
291
+ .select('enabled, project_ids')
292
+ .eq('telegram_chat_id', String(chatId))
293
+ .maybeSingle();
294
+ if (!settings) {
295
+ await sendMessage(chatId, `\u274C Your Telegram is not yet linked to ${appName}.${dashboardUrl ? ` Go to ${dashboardUrl}` : ''}`);
296
+ return;
297
+ }
298
+ const status = settings.enabled ? '\u2705 Active' : '\u23F8 Paused';
299
+ const projects = settings.project_ids ? `${settings.project_ids.length} project(s)` : 'All projects';
300
+ await sendMessage(chatId, `\u{1F680} *${appName} Status*\n\n*Notifications:* ${status}\n*Projects:* ${projects}`);
301
+ return;
302
+ }
303
+ // Free-text messages — forward to onMessage handler if connected
304
+ if (config.onMessage) {
305
+ const db = systemDB('telegram-webhook');
306
+ const { data: settings } = await db
307
+ .from('user_telegram_settings')
308
+ .select('*')
309
+ .eq('telegram_chat_id', String(chatId))
310
+ .maybeSingle();
311
+ if (!settings) {
312
+ await sendMessage(chatId, `\u274C Your Telegram is not yet linked to ${appName}. Use /start to connect.`);
313
+ return;
314
+ }
315
+ if (!settings.enabled) {
316
+ await sendMessage(chatId, `\u23F8 Your notifications are paused. Enable them in the ${appName} dashboard.`);
317
+ return;
318
+ }
319
+ const reply = await config.onMessage({
320
+ chatId,
321
+ text,
322
+ firstName,
323
+ userId: settings.user_id,
324
+ organizationId: settings.organization_id,
325
+ settings,
326
+ });
327
+ if (reply) {
328
+ await sendMessage(chatId, reply);
329
+ }
330
+ }
331
+ }
332
+ catch (err) {
333
+ log.error('Webhook processing error:', err);
334
+ }
335
+ });
336
+ // ── Admin Router (authenticated) ──────────────────────
337
+ const adminRouter = Router();
338
+ // GET /settings
339
+ adminRouter.get('/settings', async (req, res) => {
340
+ const userId = getUserId(req);
341
+ const orgId = getOrgId(req);
342
+ if (!orgId) {
343
+ res.json({ success: true, data: null, bot_available: true });
344
+ return;
345
+ }
346
+ const db = await adminDB(req);
347
+ const { data, error } = await db
348
+ .from('user_telegram_settings')
349
+ .select('id, user_id, organization_id, telegram_chat_id, enabled, project_ids, notification_events, permissions, created_at, updated_at')
350
+ .eq('user_id', userId)
351
+ .eq('organization_id', orgId)
352
+ .maybeSingle();
353
+ if (error) {
354
+ RFC7807ErrorResponse.internalError(res, 'Could not retrieve Telegram settings.');
355
+ return;
356
+ }
357
+ res.json({
358
+ success: true,
359
+ data: data ? { ...data, connected: !!data.telegram_chat_id } : null,
360
+ bot_available: true,
361
+ });
362
+ });
363
+ // POST /connect
364
+ adminRouter.post('/connect', async (req, res) => {
365
+ const userId = getUserId(req);
366
+ const orgId = getOrgId(req);
367
+ if (!orgId) {
368
+ RFC7807ErrorResponse.badRequest(res, 'No active organization.');
369
+ return;
370
+ }
371
+ const linkToken = crypto.randomBytes(16).toString('hex');
372
+ const expiresAt = new Date(Date.now() + 10 * 60 * 1000).toISOString();
373
+ const db = await adminDB(req);
374
+ const { error } = await db
375
+ .from('user_telegram_settings')
376
+ .upsert({
377
+ user_id: userId,
378
+ organization_id: orgId,
379
+ link_token: linkToken,
380
+ link_token_expires_at: expiresAt,
381
+ updated_at: new Date().toISOString(),
382
+ }, { onConflict: 'user_id,organization_id' });
383
+ if (error) {
384
+ log.error('Connect token upsert error:', error);
385
+ RFC7807ErrorResponse.internalError(res, 'Could not create connection link.');
386
+ return;
387
+ }
388
+ const deepLink = `https://t.me/${botUsername}?start=${linkToken}`;
389
+ res.json({ success: true, data: { deep_link: deepLink, expires_in: 600 } });
390
+ });
391
+ // POST /disconnect
392
+ adminRouter.post('/disconnect', async (req, res) => {
393
+ const userId = getUserId(req);
394
+ const orgId = getOrgId(req);
395
+ if (!orgId) {
396
+ RFC7807ErrorResponse.badRequest(res, 'No active organization.');
397
+ return;
398
+ }
399
+ const db = await adminDB(req);
400
+ await db
401
+ .from('user_telegram_settings')
402
+ .update({
403
+ telegram_chat_id: null,
404
+ enabled: false,
405
+ link_token: null,
406
+ link_token_expires_at: null,
407
+ updated_at: new Date().toISOString(),
408
+ })
409
+ .eq('user_id', userId)
410
+ .eq('organization_id', orgId);
411
+ res.json({ success: true, data: { message: 'Telegram disconnected.' } });
412
+ });
413
+ // PUT /settings
414
+ adminRouter.put('/settings', async (req, res) => {
415
+ const userId = getUserId(req);
416
+ const orgId = getOrgId(req);
417
+ if (!orgId) {
418
+ RFC7807ErrorResponse.badRequest(res, 'No active organization.');
419
+ return;
420
+ }
421
+ const { enabled, project_ids, notification_events } = req.body;
422
+ if (project_ids != null && !Array.isArray(project_ids)) {
423
+ RFC7807ErrorResponse.badRequest(res, 'project_ids must be an array.');
424
+ return;
425
+ }
426
+ if (notification_events != null) {
427
+ if (!Array.isArray(notification_events)) {
428
+ RFC7807ErrorResponse.badRequest(res, 'notification_events must be an array or null.');
429
+ return;
430
+ }
431
+ if (knownEvents) {
432
+ const knownSet = new Set(knownEvents);
433
+ for (const evt of notification_events) {
434
+ if (typeof evt !== 'string' || !knownSet.has(evt)) {
435
+ RFC7807ErrorResponse.badRequest(res, `Unknown event type: ${evt}`);
436
+ return;
437
+ }
438
+ }
439
+ }
440
+ }
441
+ const db = await adminDB(req);
442
+ const { data: existing } = await db
443
+ .from('user_telegram_settings')
444
+ .select('telegram_chat_id')
445
+ .eq('user_id', userId)
446
+ .eq('organization_id', orgId)
447
+ .maybeSingle();
448
+ if (enabled && (!existing || !existing.telegram_chat_id)) {
449
+ RFC7807ErrorResponse.badRequest(res, 'Connect Telegram first before enabling notifications.');
450
+ return;
451
+ }
452
+ const updates = {
453
+ enabled: enabled ?? false,
454
+ project_ids: project_ids ?? null,
455
+ updated_at: new Date().toISOString(),
456
+ };
457
+ if (notification_events !== undefined)
458
+ updates.notification_events = notification_events;
459
+ const { data, error } = await db
460
+ .from('user_telegram_settings')
461
+ .update(updates)
462
+ .eq('user_id', userId)
463
+ .eq('organization_id', orgId)
464
+ .select()
465
+ .single();
466
+ if (error) {
467
+ RFC7807ErrorResponse.internalError(res, 'Could not save settings.');
468
+ return;
469
+ }
470
+ res.json({ success: true, data });
471
+ });
472
+ // POST /test
473
+ adminRouter.post('/test', async (req, res) => {
474
+ const userId = getUserId(req);
475
+ const orgId = getOrgId(req);
476
+ if (!orgId) {
477
+ RFC7807ErrorResponse.badRequest(res, 'No active organization.');
478
+ return;
479
+ }
480
+ const db = await adminDB(req);
481
+ const { data: settings } = await db
482
+ .from('user_telegram_settings')
483
+ .select('telegram_chat_id')
484
+ .eq('user_id', userId)
485
+ .eq('organization_id', orgId)
486
+ .maybeSingle();
487
+ if (!settings?.telegram_chat_id) {
488
+ RFC7807ErrorResponse.badRequest(res, 'Telegram is not connected.');
489
+ return;
490
+ }
491
+ const ok = await sendMessage(settings.telegram_chat_id, `\u2705 *${appName} test* \u2014 Telegram works!\n\nYou will receive notifications here.`);
492
+ if (ok) {
493
+ res.json({ success: true, data: { message: 'Test message sent!' } });
494
+ }
495
+ else {
496
+ RFC7807ErrorResponse.badRequest(res, 'Could not send test message.');
497
+ }
498
+ });
499
+ // ── Rules CRUD ──────────────────────────────────────────
500
+ // GET /rules
501
+ adminRouter.get('/rules', async (req, res) => {
502
+ const userId = getUserId(req);
503
+ const orgId = getOrgId(req);
504
+ if (!orgId) {
505
+ res.json({ success: true, data: [] });
506
+ return;
507
+ }
508
+ const db = await adminDB(req);
509
+ const { data, error } = await db
510
+ .from('telegram_rules')
511
+ .select('*')
512
+ .eq('organization_id', orgId)
513
+ .or(`user_id.is.null,user_id.eq.${userId}`)
514
+ .order('priority', { ascending: true });
515
+ if (error) {
516
+ RFC7807ErrorResponse.internalError(res, 'Could not retrieve rules.');
517
+ return;
518
+ }
519
+ res.json({ success: true, data: data || [] });
520
+ });
521
+ // POST /rules
522
+ adminRouter.post('/rules', async (req, res) => {
523
+ const userId = getUserId(req);
524
+ const orgId = getOrgId(req);
525
+ if (!orgId) {
526
+ RFC7807ErrorResponse.badRequest(res, 'No active organization.');
527
+ return;
528
+ }
529
+ const { name, conditions, action, priority, enabled } = req.body;
530
+ if (!name || typeof name !== 'string' || !name.trim()) {
531
+ RFC7807ErrorResponse.badRequest(res, 'Name is required.');
532
+ return;
533
+ }
534
+ if (action && !VALID_ACTIONS.includes(action)) {
535
+ RFC7807ErrorResponse.badRequest(res, `Invalid action: ${action}`);
536
+ return;
537
+ }
538
+ const db = await adminDB(req);
539
+ const { data, error } = await db
540
+ .from('telegram_rules')
541
+ .insert({
542
+ organization_id: orgId,
543
+ user_id: userId,
544
+ name: name.trim(),
545
+ conditions: conditions || {},
546
+ action: action || 'notify',
547
+ priority: typeof priority === 'number' ? priority : 100,
548
+ enabled: enabled !== false,
549
+ })
550
+ .select()
551
+ .single();
552
+ if (error) {
553
+ RFC7807ErrorResponse.internalError(res, 'Could not create rule.');
554
+ return;
555
+ }
556
+ res.json({ success: true, data });
557
+ });
558
+ // PUT /rules/:id
559
+ adminRouter.put('/rules/:id', async (req, res) => {
560
+ const userId = getUserId(req);
561
+ const orgId = getOrgId(req);
562
+ if (!orgId) {
563
+ RFC7807ErrorResponse.badRequest(res, 'No active organization.');
564
+ return;
565
+ }
566
+ const { name, conditions, action, priority, enabled } = req.body;
567
+ if (action && !VALID_ACTIONS.includes(action)) {
568
+ RFC7807ErrorResponse.badRequest(res, `Invalid action: ${action}`);
569
+ return;
570
+ }
571
+ const updates = { updated_at: new Date().toISOString() };
572
+ if (name !== undefined)
573
+ updates.name = name;
574
+ if (conditions !== undefined)
575
+ updates.conditions = conditions;
576
+ if (action !== undefined)
577
+ updates.action = action;
578
+ if (priority !== undefined)
579
+ updates.priority = priority;
580
+ if (enabled !== undefined)
581
+ updates.enabled = enabled;
582
+ const db = await adminDB(req);
583
+ const { data, error } = await db
584
+ .from('telegram_rules')
585
+ .update(updates)
586
+ .eq('id', req.params.id)
587
+ .eq('user_id', userId)
588
+ .eq('organization_id', orgId)
589
+ .select()
590
+ .single();
591
+ if (error || !data) {
592
+ RFC7807ErrorResponse.notFound(res, 'Rule not found.');
593
+ return;
594
+ }
595
+ res.json({ success: true, data });
596
+ });
597
+ // DELETE /rules/:id
598
+ adminRouter.delete('/rules/:id', async (req, res) => {
599
+ const userId = getUserId(req);
600
+ const orgId = getOrgId(req);
601
+ if (!orgId) {
602
+ RFC7807ErrorResponse.badRequest(res, 'No active organization.');
603
+ return;
604
+ }
605
+ const db = await adminDB(req);
606
+ await db
607
+ .from('telegram_rules')
608
+ .delete()
609
+ .eq('id', req.params.id)
610
+ .eq('user_id', userId)
611
+ .eq('organization_id', orgId);
612
+ res.json({ success: true, data: { message: 'Rule deleted.' } });
613
+ });
614
+ // GET /presets
615
+ adminRouter.get('/presets', async (_req, res) => {
616
+ res.json({ success: true, data: presets });
617
+ });
618
+ // POST /rules/from-preset
619
+ adminRouter.post('/rules/from-preset', async (req, res) => {
620
+ const userId = getUserId(req);
621
+ const orgId = getOrgId(req);
622
+ if (!orgId) {
623
+ RFC7807ErrorResponse.badRequest(res, 'No active organization.');
624
+ return;
625
+ }
626
+ const { preset_key } = req.body;
627
+ const preset = presets.find(p => p.key === preset_key);
628
+ if (!preset) {
629
+ RFC7807ErrorResponse.badRequest(res, `Unknown preset: ${preset_key}`);
630
+ return;
631
+ }
632
+ const db = await adminDB(req);
633
+ const { data: existing } = await db
634
+ .from('telegram_rules')
635
+ .select('id')
636
+ .eq('organization_id', orgId)
637
+ .eq('user_id', userId)
638
+ .eq('preset_key', preset_key)
639
+ .maybeSingle();
640
+ if (existing) {
641
+ RFC7807ErrorResponse.badRequest(res, 'This preset is already active.');
642
+ return;
643
+ }
644
+ const { data, error } = await db
645
+ .from('telegram_rules')
646
+ .insert({
647
+ organization_id: orgId,
648
+ user_id: userId,
649
+ name: preset.name_en,
650
+ conditions: preset.conditions,
651
+ action: preset.action,
652
+ priority: preset.priority,
653
+ preset_key: preset.key,
654
+ enabled: true,
655
+ })
656
+ .select()
657
+ .single();
658
+ if (error) {
659
+ RFC7807ErrorResponse.internalError(res, 'Could not create preset rule.');
660
+ return;
661
+ }
662
+ res.json({ success: true, data });
663
+ });
664
+ // ── Webhook Registration ────────────────────────────────
665
+ async function registerWebhook(baseUrl) {
666
+ const webhookUrl = `https://${baseUrl.replace(/^https?:\/\//, '')}/api/public/telegram/webhook`;
667
+ try {
668
+ const result = await telegramApi(botToken, 'setWebhook', { url: webhookUrl });
669
+ if (result.ok) {
670
+ log.info(`Webhook registered: ${webhookUrl}`);
671
+ return true;
672
+ }
673
+ log.error(`Webhook registration failed: ${result.description}`);
674
+ return false;
675
+ }
676
+ catch (err) {
677
+ log.error('Webhook registration error:', err);
678
+ return false;
679
+ }
680
+ }
681
+ return {
682
+ notifyEvent,
683
+ editMessage,
684
+ sendMessage,
685
+ adminRouter,
686
+ webhookRouter,
687
+ registerWebhook,
688
+ };
689
+ }
690
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../../src/shared/telegram/routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Telegram Integration Types
3
+ *
4
+ * Used by addTelegramRoutes() factory and consumers.
5
+ */
6
+ import type { Router } from 'express';
7
+ export interface TelegramRoutesConfig {
8
+ /** Telegram Bot API token (from @BotFather) */
9
+ botToken: string;
10
+ /** Bot username without @ (e.g. 'agentrook_bot') */
11
+ botUsername: string;
12
+ /**
13
+ * Called when a free-text message arrives from a connected user.
14
+ * Return a string to send back, or null/undefined for no reply.
15
+ */
16
+ onMessage?: TelegramMessageHandler;
17
+ /**
18
+ * Called when a callback query (inline keyboard button press) arrives.
19
+ * Return a string to edit the original message, or null for no edit.
20
+ */
21
+ onCallbackQuery?: TelegramCallbackHandler;
22
+ /** Project-specific notification rule presets */
23
+ presets?: RulePreset[];
24
+ /** Custom welcome message for /start (no token). Supports Markdown. */
25
+ welcomeMessage?: string;
26
+ /** Custom help message for /help. Supports Markdown. */
27
+ helpMessage?: string;
28
+ /** App name shown in bot messages (e.g. 'Agentrook', 'VinciFox') */
29
+ appName?: string;
30
+ /** Dashboard URL for /start without token (e.g. 'https://www.agentrook.com/settings/telegram') */
31
+ dashboardUrl?: string;
32
+ /** Known notification events for validation. If not set, any string is accepted. */
33
+ knownEvents?: readonly string[];
34
+ }
35
+ export type TelegramMessageHandler = (ctx: TelegramMessageContext) => Promise<string | null | undefined>;
36
+ export type TelegramCallbackHandler = (ctx: TelegramCallbackContext) => Promise<string | null | undefined>;
37
+ export interface TelegramMessageContext {
38
+ chatId: number;
39
+ text: string;
40
+ firstName: string;
41
+ userId: string;
42
+ organizationId: string;
43
+ /** The user_telegram_settings row */
44
+ settings: TelegramUserSettings;
45
+ }
46
+ export interface TelegramCallbackContext {
47
+ chatId: number;
48
+ messageId: number;
49
+ callbackData: string;
50
+ firstName: string;
51
+ userId: string;
52
+ organizationId: string;
53
+ settings: TelegramUserSettings;
54
+ }
55
+ export interface TelegramUserSettings {
56
+ id: string;
57
+ user_id: string;
58
+ organization_id: string;
59
+ telegram_chat_id: string | null;
60
+ enabled: boolean;
61
+ project_ids: string[] | null;
62
+ notification_events: string[] | null;
63
+ permissions: string[] | null;
64
+ link_token: string | null;
65
+ link_token_expires_at: string | null;
66
+ connected?: boolean;
67
+ created_at: string;
68
+ updated_at: string;
69
+ }
70
+ export interface TelegramRule {
71
+ id: string;
72
+ organization_id: string;
73
+ user_id: string | null;
74
+ name: string;
75
+ enabled: boolean;
76
+ priority: number;
77
+ conditions: RuleConditions;
78
+ action: RuleAction;
79
+ preset_key: string | null;
80
+ created_at: string;
81
+ updated_at: string;
82
+ }
83
+ export interface RuleConditions {
84
+ event_types?: string[];
85
+ project_ids?: string[];
86
+ /** Project-specific type filter (e.g. feedback_types, campaign_types) */
87
+ custom_types?: string[];
88
+ keywords?: string[];
89
+ }
90
+ export type RuleAction = 'notify' | 'silent';
91
+ export interface RulePreset {
92
+ key: string;
93
+ name_en: string;
94
+ name_nl: string;
95
+ description_en: string;
96
+ description_nl: string;
97
+ conditions: RuleConditions;
98
+ action: RuleAction;
99
+ priority: number;
100
+ }
101
+ export interface InlineKeyboard {
102
+ inline_keyboard: Array<Array<{
103
+ text: string;
104
+ callback_data: string;
105
+ }>>;
106
+ }
107
+ export interface NotifyEventOptions {
108
+ keyboard?: InlineKeyboard;
109
+ requiredPermission?: string;
110
+ customType?: string;
111
+ }
112
+ export interface TelegramService {
113
+ /** Send notification to all matching users in an org */
114
+ notifyEvent: (organizationId: string, projectId: string | null, eventType: string, message: string, options?: NotifyEventOptions) => Promise<number>;
115
+ /** Edit a previously sent message */
116
+ editMessage: (chatId: string, messageId: number, newText: string, keyboard?: InlineKeyboard | null) => Promise<boolean>;
117
+ /** Send a direct message to a specific chat */
118
+ sendMessage: (chatId: string | number, text: string, keyboard?: InlineKeyboard) => Promise<boolean>;
119
+ /** The admin router (settings, connect, disconnect, test, rules) */
120
+ adminRouter: Router;
121
+ /** The public webhook router */
122
+ webhookRouter: Router;
123
+ /** Register webhook URL with Telegram API (call on server start) */
124
+ registerWebhook: (baseUrl: string) => Promise<boolean>;
125
+ }
126
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/shared/telegram/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAW,MAAM,SAAS,CAAC;AAI/C,MAAM,WAAW,oBAAoB;IACnC,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB,oDAAoD;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,SAAS,CAAC,EAAE,sBAAsB,CAAC;IACnC;;;OAGG;IACH,eAAe,CAAC,EAAE,uBAAuB,CAAC;IAC1C,iDAAiD;IACjD,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;IACvB,uEAAuE;IACvE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wDAAwD;IACxD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oEAAoE;IACpE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kGAAkG;IAClG,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oFAAoF;IACpF,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACjC;AAED,MAAM,MAAM,sBAAsB,GAAG,CAAC,GAAG,EAAE,sBAAsB,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;AAEzG,MAAM,MAAM,uBAAuB,GAAG,CAAC,GAAG,EAAE,uBAAuB,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;AAE3G,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,qCAAqC;IACrC,QAAQ,EAAE,oBAAoB,CAAC;CAChC;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,oBAAoB,CAAC;CAChC;AAID,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC7B,mBAAmB,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACrC,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC7B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,cAAc,CAAC;IAC3B,MAAM,EAAE,UAAU,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAID,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,yEAAyE;IACzE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE7C,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,cAAc,CAAC;IAC3B,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAID,MAAM,WAAW,cAAc;IAC7B,eAAe,EAAE,KAAK,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;CACxE;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAID,MAAM,WAAW,eAAe;IAC9B,wDAAwD;IACxD,WAAW,EAAE,CACX,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,kBAAkB,KACzB,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,qCAAqC;IACrC,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,cAAc,GAAG,IAAI,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACxH,+CAA+C;IAC/C,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,cAAc,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACpG,oEAAoE;IACpE,WAAW,EAAE,MAAM,CAAC;IACpB,gCAAgC;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,oEAAoE;IACpE,eAAe,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACxD"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Telegram Integration Types
3
+ *
4
+ * Used by addTelegramRoutes() factory and consumers.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/shared/telegram/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -5,6 +5,9 @@
5
5
  * are tracked. Non-blocking: failures are silently ignored so the app
6
6
  * always works, with or without connectivity.
7
7
  *
8
+ * The server controls the heartbeat interval via nextIntervalMs in the
9
+ * response. This allows remote adjustment without redeploying clients.
10
+ *
8
11
  * Opt-out: set TETRA_TELEMETRY=false env var.
9
12
  *
10
13
  * @module @soulbatical/tetra-core/telemetry
@@ -24,15 +27,20 @@ export declare function isTelemetryEnabled(config?: {
24
27
  export declare function buildHeartbeatPayload(config: TelemetryConfig): HeartbeatPayload | null;
25
28
  /**
26
29
  * Send a single heartbeat. Non-blocking: never throws.
30
+ * Returns the server-suggested next interval in ms, or null on failure.
27
31
  */
28
- export declare function sendHeartbeat(config: TelemetryConfig): Promise<boolean>;
32
+ export declare function sendHeartbeat(config: TelemetryConfig): Promise<number | null>;
29
33
  /**
30
34
  * Start periodic heartbeat. Call once at server startup.
31
- * Returns a cleanup function to stop the interval.
35
+ * Returns a cleanup function to stop the timer.
32
36
  */
33
37
  export declare function startHeartbeat(config: TelemetryConfig): () => void;
34
38
  /**
35
39
  * Stop the heartbeat timer (for testing or shutdown).
36
40
  */
37
41
  export declare function stopHeartbeat(): void;
42
+ /**
43
+ * Get the current heartbeat interval (for observability).
44
+ */
45
+ export declare function getCurrentInterval(): number;
38
46
  //# sourceMappingURL=heartbeat.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"heartbeat.d.ts","sourceRoot":"","sources":["../../../src/shared/telemetry/heartbeat.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAQpE;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAK3E;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,eAAe,GAAG,gBAAgB,GAAG,IAAI,CA+BtF;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAyB7E;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,IAAI,CA2BlE;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAKpC"}
1
+ {"version":3,"file":"heartbeat.d.ts","sourceRoot":"","sources":["../../../src/shared/telemetry/heartbeat.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAWpE;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAK3E;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,eAAe,GAAG,gBAAgB,GAAG,IAAI,CA+BtF;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAkCnF;AAoBD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,IAAI,CAwBlE;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAKpC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C"}
@@ -5,6 +5,9 @@
5
5
  * are tracked. Non-blocking: failures are silently ignored so the app
6
6
  * always works, with or without connectivity.
7
7
  *
8
+ * The server controls the heartbeat interval via nextIntervalMs in the
9
+ * response. This allows remote adjustment without redeploying clients.
10
+ *
8
11
  * Opt-out: set TETRA_TELEMETRY=false env var.
9
12
  *
10
13
  * @module @soulbatical/tetra-core/telemetry
@@ -12,9 +15,12 @@
12
15
  import crypto from 'node:crypto';
13
16
  import { hostname } from 'node:os';
14
17
  import { validateLicense } from '../license/validator.js';
15
- const TWENTY_FOUR_HOURS = 24 * 60 * 60 * 1000;
18
+ const ONE_HOUR = 60 * 60 * 1000;
19
+ const MIN_INTERVAL = 60 * 1000; // 1 minute minimum (prevent abuse)
20
+ const MAX_INTERVAL = 7 * 24 * 60 * 60 * 1000; // 1 week maximum
16
21
  const DEFAULT_HEARTBEAT_URL = 'https://ralph.soulbatical.com/api/public/tetra/heartbeat';
17
22
  let heartbeatTimer = null;
23
+ let currentIntervalMs = ONE_HOUR;
18
24
  /**
19
25
  * Check if telemetry is enabled.
20
26
  * Disabled by TETRA_TELEMETRY=false or config.disabled=true.
@@ -64,14 +70,15 @@ export function buildHeartbeatPayload(config) {
64
70
  }
65
71
  /**
66
72
  * Send a single heartbeat. Non-blocking: never throws.
73
+ * Returns the server-suggested next interval in ms, or null on failure.
67
74
  */
68
75
  export async function sendHeartbeat(config) {
69
76
  try {
70
77
  if (!isTelemetryEnabled(config))
71
- return false;
78
+ return null;
72
79
  const payload = buildHeartbeatPayload(config);
73
80
  if (!payload)
74
- return false;
81
+ return null;
75
82
  const url = config.heartbeatUrl || DEFAULT_HEARTBEAT_URL;
76
83
  const controller = new AbortController();
77
84
  const timeout = setTimeout(() => controller.abort(), 10_000);
@@ -82,37 +89,59 @@ export async function sendHeartbeat(config) {
82
89
  signal: controller.signal,
83
90
  });
84
91
  clearTimeout(timeout);
85
- return response.ok;
92
+ if (!response.ok)
93
+ return null;
94
+ // Read server-controlled interval from response
95
+ const body = await response.json();
96
+ if (body.nextIntervalMs && body.nextIntervalMs >= MIN_INTERVAL && body.nextIntervalMs <= MAX_INTERVAL) {
97
+ return body.nextIntervalMs;
98
+ }
99
+ return currentIntervalMs;
86
100
  }
87
101
  catch {
88
102
  // Silently ignore — telemetry must never break the app
89
- return false;
103
+ return null;
90
104
  }
91
105
  }
106
+ /**
107
+ * Schedule the next heartbeat using setTimeout (not setInterval).
108
+ * This allows dynamic interval changes based on server response.
109
+ */
110
+ function scheduleNext(config) {
111
+ heartbeatTimer = setTimeout(async () => {
112
+ const nextInterval = await sendHeartbeat(config);
113
+ if (nextInterval != null) {
114
+ currentIntervalMs = nextInterval;
115
+ }
116
+ // Schedule again with (possibly updated) interval
117
+ scheduleNext(config);
118
+ }, currentIntervalMs);
119
+ // Don't prevent process exit
120
+ if (heartbeatTimer.unref)
121
+ heartbeatTimer.unref();
122
+ }
92
123
  /**
93
124
  * Start periodic heartbeat. Call once at server startup.
94
- * Returns a cleanup function to stop the interval.
125
+ * Returns a cleanup function to stop the timer.
95
126
  */
96
127
  export function startHeartbeat(config) {
97
128
  if (!isTelemetryEnabled(config)) {
98
129
  return () => { };
99
130
  }
100
- const intervalMs = config.intervalMs ?? TWENTY_FOUR_HOURS;
131
+ currentIntervalMs = config.intervalMs ?? ONE_HOUR;
101
132
  // Initial heartbeat (delayed 5s to let the server fully start)
102
- const initialTimeout = setTimeout(() => {
103
- sendHeartbeat(config);
133
+ const initialTimeout = setTimeout(async () => {
134
+ const nextInterval = await sendHeartbeat(config);
135
+ if (nextInterval != null) {
136
+ currentIntervalMs = nextInterval;
137
+ }
138
+ // Start the recurring schedule
139
+ scheduleNext(config);
104
140
  }, 5_000);
105
- // Periodic heartbeat
106
- heartbeatTimer = setInterval(() => {
107
- sendHeartbeat(config);
108
- }, intervalMs);
109
- // Don't prevent process exit
110
- if (heartbeatTimer.unref)
111
- heartbeatTimer.unref();
112
141
  return () => {
113
142
  clearTimeout(initialTimeout);
114
143
  if (heartbeatTimer) {
115
- clearInterval(heartbeatTimer);
144
+ clearTimeout(heartbeatTimer);
116
145
  heartbeatTimer = null;
117
146
  }
118
147
  };
@@ -122,8 +151,14 @@ export function startHeartbeat(config) {
122
151
  */
123
152
  export function stopHeartbeat() {
124
153
  if (heartbeatTimer) {
125
- clearInterval(heartbeatTimer);
154
+ clearTimeout(heartbeatTimer);
126
155
  heartbeatTimer = null;
127
156
  }
128
157
  }
158
+ /**
159
+ * Get the current heartbeat interval (for observability).
160
+ */
161
+ export function getCurrentInterval() {
162
+ return currentIntervalMs;
163
+ }
129
164
  //# sourceMappingURL=heartbeat.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../../../src/shared/telemetry/heartbeat.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,MAAM,iBAAiB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAC9C,MAAM,qBAAqB,GAAG,0DAA0D,CAAC;AAEzF,IAAI,cAAc,GAA0C,IAAI,CAAC;AAEjE;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAA+B;IAChE,IAAI,MAAM,EAAE,QAAQ;QAAE,OAAO,KAAK,CAAC;IACnC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IAC3C,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IAC3E,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAuB;IAC3D,MAAM,aAAa,GAAG,eAAe,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,IAAI,CAAC,aAAa,CAAC,KAAK,IAAI,CAAC,aAAa,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAEhE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC;IAChD,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAEtE,IAAI,YAAY,GAAG,SAAS,CAAC;IAC7B,IAAI,CAAC;QACH,4CAA4C;QAC5C,MAAM,GAAG,GAAG,OAAO,CAAC,sCAAsC,CAAC,CAAC;QAC5D,YAAY,GAAG,GAAG,CAAC,OAAO,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,oCAAoC;IACtC,CAAC;IAED,OAAO;QACL,cAAc,EAAE,OAAO;QACvB,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC,QAAQ;QACxC,IAAI,EAAE,aAAa,CAAC,OAAO,CAAC,IAAI;QAChC,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,QAAQ,EAAE,QAAQ,EAAE;QACpB,YAAY;QACZ,WAAW,EAAE,OAAO,CAAC,OAAO;QAC5B,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,aAAa;QAClD,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACpC,aAAa,EAAE,aAAa,CAAC,OAAO,CAAC,MAAM;QAC3C,gBAAgB,EAAE,aAAa,CAAC,OAAO,CAAC,gBAAgB,IAAI,IAAI;QAChE,cAAc,EAAE,aAAa,CAAC,OAAO,CAAC,cAAc,IAAI,IAAI;KAC7D,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAAuB;IACzD,IAAI,CAAC;QACH,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC;YAAE,OAAO,KAAK,CAAC;QAE9C,MAAM,OAAO,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QAE3B,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,IAAI,qBAAqB,CAAC;QAEzD,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,CAAC;QAE7D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;YAC7B,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;QAEH,YAAY,CAAC,OAAO,CAAC,CAAC;QACtB,OAAO,QAAQ,CAAC,EAAE,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,uDAAuD;QACvD,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,MAAuB;IACpD,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC;QAChC,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,iBAAiB,CAAC;IAE1D,+DAA+D;IAC/D,MAAM,cAAc,GAAG,UAAU,CAAC,GAAG,EAAE;QACrC,aAAa,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC,EAAE,KAAK,CAAC,CAAC;IAEV,qBAAqB;IACrB,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;QAChC,aAAa,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC,EAAE,UAAU,CAAC,CAAC;IAEf,6BAA6B;IAC7B,IAAI,cAAc,CAAC,KAAK;QAAE,cAAc,CAAC,KAAK,EAAE,CAAC;IAEjD,OAAO,GAAG,EAAE;QACV,YAAY,CAAC,cAAc,CAAC,CAAC;QAC7B,IAAI,cAAc,EAAE,CAAC;YACnB,aAAa,CAAC,cAAc,CAAC,CAAC;YAC9B,cAAc,GAAG,IAAI,CAAC;QACxB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,IAAI,cAAc,EAAE,CAAC;QACnB,aAAa,CAAC,cAAc,CAAC,CAAC;QAC9B,cAAc,GAAG,IAAI,CAAC;IACxB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../../../src/shared/telemetry/heartbeat.ts"],"names":[],"mappings":"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"}
@@ -8,5 +8,5 @@
8
8
  * @module @soulbatical/tetra-core/telemetry
9
9
  */
10
10
  export type { HeartbeatPayload, TelemetryConfig } from './types.js';
11
- export { isTelemetryEnabled, buildHeartbeatPayload, sendHeartbeat, startHeartbeat, stopHeartbeat, } from './heartbeat.js';
11
+ export { isTelemetryEnabled, buildHeartbeatPayload, sendHeartbeat, startHeartbeat, stopHeartbeat, getCurrentInterval, } from './heartbeat.js';
12
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/shared/telemetry/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,aAAa,EACb,cAAc,EACd,aAAa,GACd,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/shared/telemetry/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,aAAa,EACb,cAAc,EACd,aAAa,EACb,kBAAkB,GACnB,MAAM,gBAAgB,CAAC"}
@@ -7,5 +7,5 @@
7
7
  *
8
8
  * @module @soulbatical/tetra-core/telemetry
9
9
  */
10
- export { isTelemetryEnabled, buildHeartbeatPayload, sendHeartbeat, startHeartbeat, stopHeartbeat, } from './heartbeat.js';
10
+ export { isTelemetryEnabled, buildHeartbeatPayload, sendHeartbeat, startHeartbeat, stopHeartbeat, getCurrentInterval, } from './heartbeat.js';
11
11
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/shared/telemetry/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,aAAa,EACb,cAAc,EACd,aAAa,GACd,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/shared/telemetry/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,aAAa,EACb,cAAc,EACd,aAAa,EACb,kBAAkB,GACnB,MAAM,gBAAgB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@soulbatical/tetra-core",
3
- "version": "0.5.3",
3
+ "version": "0.6.0",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },