telemeister 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +460 -0
  3. package/bin/telemeister.js +18 -0
  4. package/dist/bot/polling.d.ts +20 -0
  5. package/dist/bot/polling.d.ts.map +1 -0
  6. package/dist/bot/polling.js +115 -0
  7. package/dist/bot/polling.js.map +1 -0
  8. package/dist/bot/session.d.ts +50 -0
  9. package/dist/bot/session.d.ts.map +1 -0
  10. package/dist/bot/session.js +92 -0
  11. package/dist/bot/session.js.map +1 -0
  12. package/dist/bot/webhook.d.ts +36 -0
  13. package/dist/bot/webhook.d.ts.map +1 -0
  14. package/dist/bot/webhook.js +199 -0
  15. package/dist/bot/webhook.js.map +1 -0
  16. package/dist/bot-state-types.d.ts +10 -0
  17. package/dist/bot-state-types.d.ts.map +1 -0
  18. package/dist/bot-state-types.js +3 -0
  19. package/dist/bot-state-types.js.map +1 -0
  20. package/dist/cli/cli.d.ts +14 -0
  21. package/dist/cli/cli.d.ts.map +1 -0
  22. package/dist/cli/cli.js +57 -0
  23. package/dist/cli/cli.js.map +1 -0
  24. package/dist/cli/create-bot.d.ts +5 -0
  25. package/dist/cli/create-bot.d.ts.map +1 -0
  26. package/dist/cli/create-bot.js +275 -0
  27. package/dist/cli/create-bot.js.map +1 -0
  28. package/dist/cli/index.d.ts +4 -0
  29. package/dist/cli/index.d.ts.map +1 -0
  30. package/dist/cli/index.js +4 -0
  31. package/dist/cli/index.js.map +1 -0
  32. package/dist/cli/state-manager.d.ts +9 -0
  33. package/dist/cli/state-manager.d.ts.map +1 -0
  34. package/dist/cli/state-manager.js +381 -0
  35. package/dist/cli/state-manager.js.map +1 -0
  36. package/dist/config.d.ts +24 -0
  37. package/dist/config.d.ts.map +1 -0
  38. package/dist/config.js +52 -0
  39. package/dist/config.js.map +1 -0
  40. package/dist/core/app-states.d.ts +8 -0
  41. package/dist/core/app-states.d.ts.map +1 -0
  42. package/dist/core/app-states.js +8 -0
  43. package/dist/core/app-states.js.map +1 -0
  44. package/dist/core/builder.d.ts +138 -0
  45. package/dist/core/builder.d.ts.map +1 -0
  46. package/dist/core/builder.js +195 -0
  47. package/dist/core/builder.js.map +1 -0
  48. package/dist/core/compact-machine.d.ts +57 -0
  49. package/dist/core/compact-machine.d.ts.map +1 -0
  50. package/dist/core/compact-machine.js +113 -0
  51. package/dist/core/compact-machine.js.map +1 -0
  52. package/dist/core/index.d.ts +13 -0
  53. package/dist/core/index.d.ts.map +1 -0
  54. package/dist/core/index.js +9 -0
  55. package/dist/core/index.js.map +1 -0
  56. package/dist/core/types.d.ts +47 -0
  57. package/dist/core/types.d.ts.map +1 -0
  58. package/dist/core/types.js +3 -0
  59. package/dist/core/types.js.map +1 -0
  60. package/dist/database.d.ts +43 -0
  61. package/dist/database.d.ts.map +1 -0
  62. package/dist/database.js +127 -0
  63. package/dist/database.js.map +1 -0
  64. package/dist/generated/prisma/browser.d.ts +15 -0
  65. package/dist/generated/prisma/browser.d.ts.map +1 -0
  66. package/dist/generated/prisma/browser.js +18 -0
  67. package/dist/generated/prisma/browser.js.map +1 -0
  68. package/dist/generated/prisma/client.d.ts +32 -0
  69. package/dist/generated/prisma/client.d.ts.map +1 -0
  70. package/dist/generated/prisma/client.js +33 -0
  71. package/dist/generated/prisma/client.js.map +1 -0
  72. package/dist/generated/prisma/commonInputTypes.d.ts +166 -0
  73. package/dist/generated/prisma/commonInputTypes.d.ts.map +1 -0
  74. package/dist/generated/prisma/commonInputTypes.js +11 -0
  75. package/dist/generated/prisma/commonInputTypes.js.map +1 -0
  76. package/dist/generated/prisma/enums.d.ts +2 -0
  77. package/dist/generated/prisma/enums.d.ts.map +1 -0
  78. package/dist/generated/prisma/enums.js +11 -0
  79. package/dist/generated/prisma/enums.js.map +1 -0
  80. package/dist/generated/prisma/internal/class.d.ts +138 -0
  81. package/dist/generated/prisma/internal/class.d.ts.map +1 -0
  82. package/dist/generated/prisma/internal/class.js +50 -0
  83. package/dist/generated/prisma/internal/class.js.map +1 -0
  84. package/dist/generated/prisma/internal/prismaNamespace.d.ts +591 -0
  85. package/dist/generated/prisma/internal/prismaNamespace.d.ts.map +1 -0
  86. package/dist/generated/prisma/internal/prismaNamespace.js +96 -0
  87. package/dist/generated/prisma/internal/prismaNamespace.js.map +1 -0
  88. package/dist/generated/prisma/internal/prismaNamespaceBrowser.d.ts +56 -0
  89. package/dist/generated/prisma/internal/prismaNamespaceBrowser.d.ts.map +1 -0
  90. package/dist/generated/prisma/internal/prismaNamespaceBrowser.js +67 -0
  91. package/dist/generated/prisma/internal/prismaNamespaceBrowser.js.map +1 -0
  92. package/dist/generated/prisma/models/User.d.ts +1181 -0
  93. package/dist/generated/prisma/models/User.d.ts.map +1 -0
  94. package/dist/generated/prisma/models/User.js +2 -0
  95. package/dist/generated/prisma/models/User.js.map +1 -0
  96. package/dist/generated/prisma/models/UserInfo.d.ts +1101 -0
  97. package/dist/generated/prisma/models/UserInfo.d.ts.map +1 -0
  98. package/dist/generated/prisma/models/UserInfo.js +2 -0
  99. package/dist/generated/prisma/models/UserInfo.js.map +1 -0
  100. package/dist/generated/prisma/models.d.ts +4 -0
  101. package/dist/generated/prisma/models.d.ts.map +1 -0
  102. package/dist/generated/prisma/models.js +2 -0
  103. package/dist/generated/prisma/models.js.map +1 -0
  104. package/dist/handlers/idle/index.d.ts +2 -0
  105. package/dist/handlers/idle/index.d.ts.map +1 -0
  106. package/dist/handlers/idle/index.js +22 -0
  107. package/dist/handlers/idle/index.js.map +1 -0
  108. package/dist/handlers/index.d.ts +12 -0
  109. package/dist/handlers/index.d.ts.map +1 -0
  110. package/dist/handlers/index.js +14 -0
  111. package/dist/handlers/index.js.map +1 -0
  112. package/dist/handlers/menu/index.d.ts +2 -0
  113. package/dist/handlers/menu/index.d.ts.map +1 -0
  114. package/dist/handlers/menu/index.js +35 -0
  115. package/dist/handlers/menu/index.js.map +1 -0
  116. package/dist/handlers/menu.d.ts +2 -0
  117. package/dist/handlers/menu.d.ts.map +1 -0
  118. package/dist/handlers/menu.js +37 -0
  119. package/dist/handlers/menu.js.map +1 -0
  120. package/dist/handlers/welcome/index.d.ts +2 -0
  121. package/dist/handlers/welcome/index.d.ts.map +1 -0
  122. package/dist/handlers/welcome/index.js +22 -0
  123. package/dist/handlers/welcome/index.js.map +1 -0
  124. package/dist/handlers/welcome.d.ts +2 -0
  125. package/dist/handlers/welcome.d.ts.map +1 -0
  126. package/dist/handlers/welcome.js +30 -0
  127. package/dist/handlers/welcome.js.map +1 -0
  128. package/dist/index.d.ts +3 -0
  129. package/dist/index.d.ts.map +1 -0
  130. package/dist/index.js +39 -0
  131. package/dist/index.js.map +1 -0
  132. package/package.json +111 -0
  133. package/templates/handler.ts.ejs +36 -0
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Grammy Session Adapter for Prisma Database
3
+ *
4
+ * This adapter integrates Grammy's session system with the Prisma database,
5
+ * allowing user state to persist across restarts.
6
+ */
7
+ import { getUserByTelegramId, createOrUpdateUser, updateUserState } from '../database.js';
8
+ /**
9
+ * Prisma-backed session storage adapter for Grammy
10
+ *
11
+ * This adapter loads/saves session data from/to the database,
12
+ * keyed by Telegram user ID.
13
+ */
14
+ export class PrismaSessionAdapter {
15
+ /**
16
+ * Read session data from database
17
+ * @param key - Telegram user ID (as string)
18
+ */
19
+ async read(key) {
20
+ const telegramId = parseInt(key, 10);
21
+ if (isNaN(telegramId))
22
+ return undefined;
23
+ const user = await getUserByTelegramId(telegramId);
24
+ if (!user)
25
+ return undefined;
26
+ const stateData = user.info?.stateData
27
+ ? JSON.parse(user.info.stateData)
28
+ : {};
29
+ return {
30
+ currentState: user.currentState,
31
+ stateData,
32
+ userId: user.id,
33
+ chatId: user.chatId,
34
+ };
35
+ }
36
+ /**
37
+ * Write session data to database
38
+ * @param key - Telegram user ID (as string)
39
+ * @param value - Session data to save
40
+ */
41
+ async write(key, value) {
42
+ const telegramId = parseInt(key, 10);
43
+ if (isNaN(telegramId))
44
+ return;
45
+ await updateUserState(telegramId, value.currentState, value.stateData);
46
+ }
47
+ /**
48
+ * Delete session data (not typically used in bots)
49
+ * @param key - Telegram user ID (as string)
50
+ */
51
+ async delete(key) {
52
+ // Sessions are not deleted - user records persist
53
+ // This could be implemented if needed for GDPR compliance
54
+ const telegramId = parseInt(key, 10);
55
+ if (isNaN(telegramId))
56
+ return;
57
+ // Reset to idle state instead of deleting
58
+ await updateUserState(telegramId, 'idle', {});
59
+ }
60
+ }
61
+ /**
62
+ * Get or create user session
63
+ * This helper ensures a user exists in the database before processing
64
+ */
65
+ export async function getOrCreateSession(telegramId, chatId) {
66
+ const existing = await getUserByTelegramId(telegramId);
67
+ if (existing) {
68
+ const stateData = existing.info?.stateData
69
+ ? JSON.parse(existing.info.stateData)
70
+ : {};
71
+ return {
72
+ currentState: existing.currentState,
73
+ stateData,
74
+ userId: existing.id,
75
+ chatId: existing.chatId,
76
+ };
77
+ }
78
+ // Create new user
79
+ const newUser = await createOrUpdateUser({
80
+ telegramId,
81
+ chatId,
82
+ currentState: 'idle',
83
+ stateData: {},
84
+ });
85
+ return {
86
+ currentState: 'idle',
87
+ stateData: {},
88
+ userId: newUser.id,
89
+ chatId: newUser.chatId,
90
+ };
91
+ }
92
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/bot/session.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAgB1F;;;;;GAKG;AACH,MAAM,OAAO,oBAAoB;IAC/B;;;OAGG;IACH,KAAK,CAAC,IAAI,CAAC,GAAW;QACpB,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACrC,IAAI,KAAK,CAAC,UAAU,CAAC;YAAE,OAAO,SAAS,CAAC;QAExC,MAAM,IAAI,GAAG,MAAM,mBAAmB,CAAC,UAAU,CAAC,CAAC;QACnD,IAAI,CAAC,IAAI;YAAE,OAAO,SAAS,CAAC;QAE5B,MAAM,SAAS,GAA4B,IAAI,CAAC,IAAI,EAAE,SAAS;YAC7D,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAmB,CAAC;YAC3C,CAAC,CAAC,EAAE,CAAC;QAEP,OAAO;YACL,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,SAAS;YACT,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK,CAAC,GAAW,EAAE,KAAkB;QACzC,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACrC,IAAI,KAAK,CAAC,UAAU,CAAC;YAAE,OAAO;QAE9B,MAAM,eAAe,CAAC,UAAU,EAAE,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IACzE,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,kDAAkD;QAClD,0DAA0D;QAC1D,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACrC,IAAI,KAAK,CAAC,UAAU,CAAC;YAAE,OAAO;QAE9B,0CAA0C;QAC1C,MAAM,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IAChD,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,UAAkB,EAAE,MAAc;IACzE,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAEvD,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,SAAS,GAA4B,QAAQ,CAAC,IAAI,EAAE,SAAS;YACjE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAmB,CAAC;YAC/C,CAAC,CAAC,EAAE,CAAC;QAEP,OAAO;YACL,YAAY,EAAE,QAAQ,CAAC,YAAY;YACnC,SAAS;YACT,MAAM,EAAE,QAAQ,CAAC,EAAE;YACnB,MAAM,EAAE,QAAQ,CAAC,MAAM;SACxB,CAAC;IACJ,CAAC;IAED,kBAAkB;IAClB,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC;QACvC,UAAU;QACV,MAAM;QACN,YAAY,EAAE,MAAM;QACpB,SAAS,EAAE,EAAE;KACd,CAAC,CAAC;IAEH,OAAO;QACL,YAAY,EAAE,MAAM;QACpB,SAAS,EAAE,EAAE;QACb,MAAM,EAAE,OAAO,CAAC,EAAE;QAClB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Grammy-based Webhook Mode Implementation
3
+ *
4
+ * Uses Grammy Bot API library with Express for webhook handling.
5
+ */
6
+ import { Bot, type Context } from 'grammy';
7
+ import { type SessionData } from './session.js';
8
+ interface BotContext extends Context {
9
+ session: SessionData;
10
+ }
11
+ /**
12
+ * Create and configure the Grammy bot (shared with polling)
13
+ */
14
+ export declare function createBot(botToken: string): Bot<BotContext>;
15
+ /**
16
+ * Start the bot in webhook mode
17
+ *
18
+ * @param botToken - Telegram bot token
19
+ * @param webhookUrl - Public URL where Telegram will send updates
20
+ * @param port - Port to listen on
21
+ */
22
+ export declare function startWebhookMode(botToken: string, webhookUrl: string, port: number): Promise<void>;
23
+ /**
24
+ * Set webhook URL manually (for scripts)
25
+ */
26
+ export declare function setWebhook(botToken: string, webhookUrl: string): Promise<void>;
27
+ /**
28
+ * Delete webhook (stop receiving updates)
29
+ */
30
+ export declare function deleteWebhook(botToken: string): Promise<void>;
31
+ /**
32
+ * Get webhook info
33
+ */
34
+ export declare function getWebhookInfo(botToken: string): Promise<unknown>;
35
+ export {};
36
+ //# sourceMappingURL=webhook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../src/bot/webhook.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,GAAG,EAA4B,KAAK,OAAO,EAAE,MAAM,QAAQ,CAAC;AAGrE,OAAO,EAA4C,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAI1F,UAAU,UAAW,SAAQ,OAAO;IAClC,OAAO,EAAE,WAAW,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC,UAAU,CAAC,CAoE3D;AAED;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,IAAI,CAAC,CAoCf;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAepF;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAUnE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAUvE"}
@@ -0,0 +1,199 @@
1
+ /**
2
+ * Grammy-based Webhook Mode Implementation
3
+ *
4
+ * Uses Grammy Bot API library with Express for webhook handling.
5
+ */
6
+ import express from 'express';
7
+ import { Bot, session, webhookCallback } from 'grammy';
8
+ import { appBuilder } from '../core/index.js';
9
+ import { PrismaSessionAdapter, getOrCreateSession } from './session.js';
10
+ /**
11
+ * Create and configure the Grammy bot (shared with polling)
12
+ */
13
+ export function createBot(botToken) {
14
+ const bot = new Bot(botToken);
15
+ // Install session middleware with Prisma adapter
16
+ bot.use(session({
17
+ initial: () => ({
18
+ currentState: 'idle',
19
+ stateData: {},
20
+ }),
21
+ storage: new PrismaSessionAdapter(),
22
+ getSessionKey: (ctx) => ctx.from?.id.toString(),
23
+ }));
24
+ // Ensure user exists in database on each update
25
+ bot.use(async (ctx, next) => {
26
+ if (!ctx.from || !ctx.chat) {
27
+ return next();
28
+ }
29
+ const telegramId = ctx.from.id;
30
+ const chatId = ctx.chat.id;
31
+ // Get or create user session
32
+ const userSession = await getOrCreateSession(telegramId, chatId);
33
+ ctx.session = userSession;
34
+ return next();
35
+ });
36
+ // Handle text messages
37
+ bot.on('message:text', async (ctx) => {
38
+ const text = ctx.message.text;
39
+ const session = ctx.session;
40
+ // Create handler context compatible with existing handlers
41
+ const handlerContext = createHandlerContext(ctx, session);
42
+ // Execute onResponse handler for current state
43
+ const nextState = await appBuilder.executeOnResponse(session.currentState, handlerContext, text);
44
+ // Handle state transition
45
+ if (nextState && nextState !== session.currentState) {
46
+ await transitionToState(ctx, session, nextState, handlerContext);
47
+ }
48
+ else {
49
+ // Save any state data changes
50
+ session.stateData =
51
+ handlerContext.getData('__all') || session.stateData;
52
+ }
53
+ });
54
+ // Handle /start command
55
+ bot.command('start', async (ctx) => {
56
+ const session = ctx.session;
57
+ // Create handler context
58
+ const handlerContext = createHandlerContext(ctx, session);
59
+ // Transition to welcome state
60
+ await transitionToState(ctx, session, 'welcome', handlerContext);
61
+ });
62
+ return bot;
63
+ }
64
+ /**
65
+ * Start the bot in webhook mode
66
+ *
67
+ * @param botToken - Telegram bot token
68
+ * @param webhookUrl - Public URL where Telegram will send updates
69
+ * @param port - Port to listen on
70
+ */
71
+ export async function startWebhookMode(botToken, webhookUrl, port) {
72
+ const bot = createBot(botToken);
73
+ // Create Express app
74
+ const app = express();
75
+ // Health check endpoint
76
+ app.get('/health', (_req, res) => {
77
+ res.json({
78
+ status: 'ok',
79
+ mode: 'webhook',
80
+ timestamp: new Date().toISOString(),
81
+ });
82
+ });
83
+ // Set up webhook endpoint using Grammy's webhookCallback
84
+ // This handles the Telegram update parsing automatically
85
+ app.use('/webhook', webhookCallback(bot, 'express'));
86
+ // Start server
87
+ app.listen(port, async () => {
88
+ console.log(`🤖 Bot started in webhook mode`);
89
+ console.log(`📡 Webhook URL: ${webhookUrl}`);
90
+ console.log(`🖥️ Server listening on port ${port}`);
91
+ // Set webhook with Telegram
92
+ try {
93
+ await bot.api.setWebhook(webhookUrl, {
94
+ allowed_updates: ['message'],
95
+ });
96
+ console.log('✅ Webhook set successfully with Telegram');
97
+ }
98
+ catch (error) {
99
+ console.error('❌ Failed to set webhook:', error);
100
+ throw error;
101
+ }
102
+ });
103
+ }
104
+ /**
105
+ * Set webhook URL manually (for scripts)
106
+ */
107
+ export async function setWebhook(botToken, webhookUrl) {
108
+ const bot = new Bot(botToken);
109
+ try {
110
+ await bot.api.setWebhook(webhookUrl, {
111
+ allowed_updates: ['message'],
112
+ });
113
+ console.log('✅ Webhook set successfully');
114
+ }
115
+ catch (error) {
116
+ console.error('❌ Failed to set webhook:', error);
117
+ throw error;
118
+ }
119
+ finally {
120
+ // Don't start the bot, just set the webhook
121
+ await bot.api.deleteWebhook({ drop_pending_updates: true });
122
+ }
123
+ }
124
+ /**
125
+ * Delete webhook (stop receiving updates)
126
+ */
127
+ export async function deleteWebhook(botToken) {
128
+ const bot = new Bot(botToken);
129
+ try {
130
+ await bot.api.deleteWebhook({ drop_pending_updates: true });
131
+ console.log('✅ Webhook deleted successfully');
132
+ }
133
+ catch (error) {
134
+ console.error('❌ Failed to delete webhook:', error);
135
+ throw error;
136
+ }
137
+ }
138
+ /**
139
+ * Get webhook info
140
+ */
141
+ export async function getWebhookInfo(botToken) {
142
+ const bot = new Bot(botToken);
143
+ try {
144
+ const info = await bot.api.getWebhookInfo();
145
+ return info;
146
+ }
147
+ catch (error) {
148
+ console.error('Error getting webhook info:', error);
149
+ throw error;
150
+ }
151
+ }
152
+ /**
153
+ * Create a handler context compatible with existing handlers
154
+ */
155
+ function createHandlerContext(ctx, session) {
156
+ // Local state data copy for modifications
157
+ const localStateData = { ...session.stateData };
158
+ return {
159
+ userId: session.userId || 0,
160
+ telegramId: ctx.from?.id || 0,
161
+ chatId: ctx.chat?.id || 0,
162
+ currentState: session.currentState,
163
+ send: async (text) => {
164
+ await ctx.reply(text, { parse_mode: 'Markdown' });
165
+ },
166
+ setData: (key, value) => {
167
+ localStateData[key] = value;
168
+ },
169
+ getData: (key) => {
170
+ if (key === '__all') {
171
+ return localStateData;
172
+ }
173
+ return localStateData[key];
174
+ },
175
+ transition: async (toState) => {
176
+ await transitionToState(ctx, session, toState, createHandlerContext(ctx, session));
177
+ },
178
+ };
179
+ }
180
+ /**
181
+ * Transition to a new state and execute onEnter handler
182
+ */
183
+ async function transitionToState(ctx, session, toState, handlerContext) {
184
+ // Update session state
185
+ session.currentState = toState;
186
+ // Execute onEnter handler for new state
187
+ const enterNextState = await appBuilder.executeOnEnter(toState, handlerContext);
188
+ // Save state data changes
189
+ session.stateData = handlerContext.getData('__all') || session.stateData;
190
+ // Handle chained transition from onEnter
191
+ if (enterNextState && enterNextState !== toState) {
192
+ // Create fresh context for the next state
193
+ const nextContext = createHandlerContext(ctx, session);
194
+ const nextState = enterNextState;
195
+ nextContext.currentState = nextState;
196
+ await transitionToState(ctx, session, nextState, nextContext);
197
+ }
198
+ }
199
+ //# sourceMappingURL=webhook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../src/bot/webhook.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export type AppStates = 'idle' | 'menu' | 'welcome';
2
+ export type StateTransitions = {
3
+ idle: 'welcome' | void;
4
+ menu: 'idle' | 'welcome' | void;
5
+ welcome: 'menu' | void;
6
+ };
7
+ export type IdleTransitions = Promise<StateTransitions['idle']>;
8
+ export type MenuTransitions = Promise<StateTransitions['menu']>;
9
+ export type WelcomeTransitions = Promise<StateTransitions['welcome']>;
10
+ //# sourceMappingURL=bot-state-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bot-state-types.d.ts","sourceRoot":"","sources":["../src/bot-state-types.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AAEpD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,SAAS,GAAG,IAAI,CAAC;IACvB,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IAChC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC;AAChE,MAAM,MAAM,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC;AAChE,MAAM,MAAM,kBAAkB,GAAG,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ // Auto-generated by state:sync - DO NOT EDIT
2
+ export {};
3
+ //# sourceMappingURL=bot-state-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bot-state-types.js","sourceRoot":"","sources":["../src/bot-state-types.ts"],"names":[],"mappings":"AAAA,6CAA6C"}
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Telemeister CLI
4
+ *
5
+ * Available commands:
6
+ * create-bot <name> - Create a new bot project
7
+ * state:add <name> - Add a new state + create handler
8
+ * state:delete <name> - Delete a state (with safety checks)
9
+ * state:sync - Sync types and create missing handlers
10
+ * state:transition:add <from> <to> - Add a transition
11
+ * state:transition:delete <from> <to> - Delete a transition
12
+ */
13
+ export declare function runCLI(): Promise<void>;
14
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;GAUG;AAeH,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAkC5C"}
@@ -0,0 +1,57 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Telemeister CLI
4
+ *
5
+ * Available commands:
6
+ * create-bot <name> - Create a new bot project
7
+ * state:add <name> - Add a new state + create handler
8
+ * state:delete <name> - Delete a state (with safety checks)
9
+ * state:sync - Sync types and create missing handlers
10
+ * state:transition:add <from> <to> - Add a transition
11
+ * state:transition:delete <from> <to> - Delete a transition
12
+ */
13
+ import { stateAdd, stateDelete, stateSync, transitionAdd, transitionDelete, } from './state-manager.js';
14
+ import { createBot } from './create-bot.js';
15
+ const command = process.argv[2];
16
+ const arg1 = process.argv[3];
17
+ const arg2 = process.argv[4];
18
+ export async function runCLI() {
19
+ switch (command) {
20
+ case 'create-bot':
21
+ await createBot(arg1);
22
+ break;
23
+ case 'state:add':
24
+ await stateAdd(arg1);
25
+ break;
26
+ case 'state:delete':
27
+ await stateDelete(arg1);
28
+ break;
29
+ case 'state:sync':
30
+ await stateSync();
31
+ break;
32
+ case 'state:transition:add':
33
+ await transitionAdd(arg1, arg2);
34
+ break;
35
+ case 'state:transition:delete':
36
+ await transitionDelete(arg1, arg2);
37
+ break;
38
+ default:
39
+ console.error('❌ Unknown command:', command);
40
+ console.error('');
41
+ console.error('Available commands:');
42
+ console.error(' create-bot <name> - Create a new bot project');
43
+ console.error(' state:add <name> - Add a new state + create handler');
44
+ console.error(' state:delete <name> - Delete a state (with safety checks)');
45
+ console.error(' state:sync - Sync types and create missing handlers');
46
+ console.error(' state:transition:add <from> <to> - Add a transition');
47
+ console.error(' state:transition:delete <from> <to> - Delete a transition');
48
+ process.exit(1);
49
+ }
50
+ }
51
+ if (import.meta.url === `file://${process.argv[1]}`) {
52
+ runCLI().catch((err) => {
53
+ console.error('❌ Error:', err.message);
54
+ process.exit(1);
55
+ });
56
+ }
57
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;GAUG;AAEH,OAAO,EACL,QAAQ,EACR,WAAW,EACX,SAAS,EACT,aAAa,EACb,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAChC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC7B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAE7B,MAAM,CAAC,KAAK,UAAU,MAAM;IAC1B,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,YAAY;YACf,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;YACtB,MAAM;QACR,KAAK,WAAW;YACd,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;YACrB,MAAM;QACR,KAAK,cAAc;YACjB,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;YACxB,MAAM;QACR,KAAK,YAAY;YACf,MAAM,SAAS,EAAE,CAAC;YAClB,MAAM;QACR,KAAK,sBAAsB;YACzB,MAAM,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAChC,MAAM;QACR,KAAK,yBAAyB;YAC5B,MAAM,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACnC,MAAM;QACR;YACE,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;YAC7C,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;YACrC,OAAO,CAAC,KAAK,CAAC,mEAAmE,CAAC,CAAC;YACnF,OAAO,CAAC,KAAK,CAAC,2EAA2E,CAAC,CAAC;YAC3F,OAAO,CAAC,KAAK,CAAC,8EAA8E,CAAC,CAAC;YAC9F,OAAO,CAAC,KAAK,CACX,iFAAiF,CAClF,CAAC;YACF,OAAO,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;YAC3E,OAAO,CAAC,KAAK,CAAC,8DAA8D,CAAC,CAAC;YAC9E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,UAAU,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACpD,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACrB,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Create Bot Project scaffolding
3
+ */
4
+ export declare function createBot(botName: string | undefined): Promise<void>;
5
+ //# sourceMappingURL=create-bot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-bot.d.ts","sourceRoot":"","sources":["../../src/cli/create-bot.ts"],"names":[],"mappings":"AAAA;;GAEG;AAmNH,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAmG1E"}