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,381 @@
1
+ /**
2
+ * State Management for Telemeister CLI
3
+ */
4
+ import * as fs from 'fs';
5
+ import * as path from 'path';
6
+ import { fileURLToPath } from 'url';
7
+ import ejs from 'ejs';
8
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
9
+ // Paths are relative to project CWD (where the bot project is)
10
+ function getProjectPaths(cwd) {
11
+ return {
12
+ srcDir: path.join(cwd, 'src'),
13
+ handlersDir: path.join(cwd, 'src', 'handlers'),
14
+ botJsonPath: path.join(cwd, 'bot.json'),
15
+ stateTypesPath: path.join(cwd, 'src', 'bot-state-types.ts'),
16
+ botDiagramMdPath: path.join(cwd, 'src', 'bot-diagram.md'),
17
+ botDiagramPngPath: path.join(cwd, 'src', 'bot-diagram.png'),
18
+ // Templates are relative to the package root, not the CLI file
19
+ templatePath: path.join(__dirname, '..', '..', 'templates', 'handler.ts.ejs'),
20
+ };
21
+ }
22
+ function loadBotConfig(cwd) {
23
+ const paths = getProjectPaths(cwd);
24
+ if (!fs.existsSync(paths.botJsonPath)) {
25
+ return {};
26
+ }
27
+ return JSON.parse(fs.readFileSync(paths.botJsonPath, 'utf-8'));
28
+ }
29
+ function saveBotConfig(config, cwd) {
30
+ const paths = getProjectPaths(cwd);
31
+ fs.writeFileSync(paths.botJsonPath, JSON.stringify(config, null, 2) + '\n');
32
+ }
33
+ function validateStateName(name) {
34
+ return /^[a-zA-Z][a-zA-Z0-9_]*$/.test(name);
35
+ }
36
+ function pascalCase(str) {
37
+ return str.charAt(0).toUpperCase() + str.slice(1);
38
+ }
39
+ function getHandlerPath(stateName, cwd) {
40
+ return path.join(getProjectPaths(cwd).handlersDir, stateName, 'index.ts');
41
+ }
42
+ function handlerExists(stateName, cwd) {
43
+ return fs.existsSync(getHandlerPath(stateName, cwd));
44
+ }
45
+ function isHandlerFolderNonEmpty(stateName, cwd) {
46
+ const handlerDir = path.join(getProjectPaths(cwd).handlersDir, stateName);
47
+ if (!fs.existsSync(handlerDir))
48
+ return false;
49
+ const files = fs.readdirSync(handlerDir);
50
+ return files.length > 0;
51
+ }
52
+ function getIncomingTransitions(config, stateName) {
53
+ const incoming = [];
54
+ for (const [from, targets] of Object.entries(config)) {
55
+ if (targets.includes(stateName)) {
56
+ incoming.push(from);
57
+ }
58
+ }
59
+ return incoming;
60
+ }
61
+ function generateTypes(config) {
62
+ const states = Object.keys(config).sort();
63
+ if (states.length === 0) {
64
+ return `// Auto-generated by telemeister state:sync - DO NOT EDIT
65
+ // No states defined yet
66
+
67
+ export type AppStates = never;
68
+
69
+ export type StateTransitions = Record<string, never>;
70
+ `;
71
+ }
72
+ const statesUnion = states.map((s) => `'${s}'`).join(' | ');
73
+ let stateTransitionsContent = '';
74
+ for (const state of states) {
75
+ const targets = config[state] || [];
76
+ if (targets.length === 0) {
77
+ stateTransitionsContent += ` ${state}: void;\n`;
78
+ }
79
+ else {
80
+ const targetsUnion = [...targets]
81
+ .sort()
82
+ .map((t) => `'${t}'`)
83
+ .join(' | ');
84
+ stateTransitionsContent += ` ${state}: ${targetsUnion} | void;\n`;
85
+ }
86
+ }
87
+ let returnTypesContent = '';
88
+ for (const state of states) {
89
+ const typeName = `${pascalCase(state)}Transitions`;
90
+ returnTypesContent += `export type ${typeName} = Promise<StateTransitions['${state}']>;\n`;
91
+ }
92
+ return `// Auto-generated by telemeister state:sync - DO NOT EDIT
93
+
94
+ export type AppStates = ${statesUnion};
95
+
96
+ export type StateTransitions = {
97
+ ${stateTransitionsContent}};
98
+
99
+ ${returnTypesContent}
100
+ `;
101
+ }
102
+ function generateMermaidDiagram(config) {
103
+ const states = Object.keys(config);
104
+ if (states.length === 0) {
105
+ return 'stateDiagram-v2\n [*] --> [*]';
106
+ }
107
+ const transitions = [];
108
+ for (const [from, targets] of Object.entries(config)) {
109
+ for (const to of targets) {
110
+ transitions.push(` ${from} --> ${to}`);
111
+ }
112
+ }
113
+ return `stateDiagram-v2\n${transitions.join('\n')}`;
114
+ }
115
+ function generateMermaidMarkdown(config) {
116
+ const mermaidCode = generateMermaidDiagram(config);
117
+ return `# Bot State Diagram
118
+
119
+ \`\`\`mermaid
120
+ ${mermaidCode}
121
+ \`\`\`
122
+ `;
123
+ }
124
+ async function generateDiagram(config, cwd) {
125
+ const paths = getProjectPaths(cwd);
126
+ const mdContent = generateMermaidMarkdown(config);
127
+ fs.writeFileSync(paths.botDiagramMdPath, mdContent);
128
+ console.log(`📝 Updated: src/bot-diagram.md`);
129
+ const mermaidCode = generateMermaidDiagram(config);
130
+ const tempMmdPath = path.join(cwd, '.temp-diagram.mmd');
131
+ fs.writeFileSync(tempMmdPath, mermaidCode);
132
+ try {
133
+ const { execSync } = await import('child_process');
134
+ execSync(`npx mmdc -i "${tempMmdPath}" -o "${paths.botDiagramPngPath}" -b white`, {
135
+ stdio: 'pipe',
136
+ cwd: cwd,
137
+ });
138
+ console.log(`📝 Updated: src/bot-diagram.png`);
139
+ }
140
+ catch {
141
+ console.warn(`⚠️ Could not generate PNG diagram (mermaid-cli may not be installed)`);
142
+ }
143
+ finally {
144
+ fs.unlinkSync(tempMmdPath);
145
+ }
146
+ }
147
+ async function createHandler(stateName, transitionStates, cwd) {
148
+ const paths = getProjectPaths(cwd);
149
+ const handlerDir = path.join(paths.handlersDir, stateName);
150
+ const handlerPath = path.join(handlerDir, 'index.ts');
151
+ if (fs.existsSync(handlerPath)) {
152
+ console.log(`⏭️ Handler already exists: src/handlers/${stateName}/index.ts`);
153
+ return;
154
+ }
155
+ if (!fs.existsSync(handlerDir)) {
156
+ fs.mkdirSync(handlerDir, { recursive: true });
157
+ }
158
+ const templateContent = fs.readFileSync(paths.templatePath, 'utf-8');
159
+ const content = ejs.render(templateContent, {
160
+ stateName,
161
+ transitionStates: [...transitionStates].sort(),
162
+ pascalCase,
163
+ });
164
+ fs.writeFileSync(handlerPath, content);
165
+ console.log(`📝 Created: src/handlers/${stateName}/index.ts`);
166
+ }
167
+ function updateHandlersIndex(stateName, cwd) {
168
+ const paths = getProjectPaths(cwd);
169
+ const indexPath = path.join(paths.handlersDir, 'index.ts');
170
+ if (!fs.existsSync(indexPath)) {
171
+ const content = `/**
172
+ * State Handlers Index
173
+ *
174
+ * Import all your state handler files here.
175
+ */
176
+
177
+ import './${stateName}/index.js';
178
+ `;
179
+ fs.writeFileSync(indexPath, content);
180
+ console.log(`📝 Created: src/handlers/index.ts`);
181
+ return;
182
+ }
183
+ let content = fs.readFileSync(indexPath, 'utf-8');
184
+ const importLine = `import './${stateName}/index.js';`;
185
+ if (content.includes(importLine)) {
186
+ return;
187
+ }
188
+ // Add import at the end
189
+ content = content.trimEnd() + `\n${importLine}\n`;
190
+ fs.writeFileSync(indexPath, content);
191
+ console.log(`📝 Updated: src/handlers/index.ts`);
192
+ }
193
+ function removeFromHandlersIndex(stateName, cwd) {
194
+ const paths = getProjectPaths(cwd);
195
+ const indexPath = path.join(paths.handlersDir, 'index.ts');
196
+ if (!fs.existsSync(indexPath))
197
+ return;
198
+ let content = fs.readFileSync(indexPath, 'utf-8');
199
+ const importLine = `import './${stateName}/index.js';`;
200
+ if (content.includes(importLine)) {
201
+ content = content.replace(new RegExp(`^${importLine.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}\n?`, 'm'), '');
202
+ fs.writeFileSync(indexPath, content);
203
+ console.log(`📝 Removed import from: src/handlers/index.ts`);
204
+ }
205
+ }
206
+ // Commands
207
+ export async function stateAdd(stateName) {
208
+ const cwd = process.cwd();
209
+ if (!stateName) {
210
+ console.error('❌ Error: State name is required');
211
+ console.error('Usage: telemeister state:add <state-name>');
212
+ process.exit(1);
213
+ }
214
+ if (!validateStateName(stateName)) {
215
+ console.error('❌ Error: State name must start with a letter and contain only letters, numbers, and underscores');
216
+ process.exit(1);
217
+ }
218
+ const config = loadBotConfig(cwd);
219
+ if (config[stateName]) {
220
+ console.error(`❌ Error: State "${stateName}" already exists in bot.json`);
221
+ process.exit(1);
222
+ }
223
+ // Add state to config
224
+ config[stateName] = [];
225
+ saveBotConfig(config, cwd);
226
+ console.log(`✅ Added state "${stateName}" to bot.json`);
227
+ // Create handler
228
+ await createHandler(stateName, [], cwd);
229
+ updateHandlersIndex(stateName, cwd);
230
+ // Sync types
231
+ const paths = getProjectPaths(cwd);
232
+ const typesContent = generateTypes(config);
233
+ fs.writeFileSync(paths.stateTypesPath, typesContent);
234
+ console.log(`📝 Updated: src/bot-state-types.ts`);
235
+ // Generate diagram
236
+ await generateDiagram(config, cwd);
237
+ console.log(`\n✅ State "${stateName}" added successfully!`);
238
+ console.log(`\nNext steps:`);
239
+ console.log(` 1. Edit src/handlers/${stateName}/index.ts to customize the handler`);
240
+ console.log(` 2. Add transitions: telemeister state:transition:add ${stateName} <target-state>`);
241
+ }
242
+ export async function stateDelete(stateName) {
243
+ const cwd = process.cwd();
244
+ if (!stateName) {
245
+ console.error('❌ Error: State name is required');
246
+ console.error('Usage: telemeister state:delete <state-name>');
247
+ process.exit(1);
248
+ }
249
+ const config = loadBotConfig(cwd);
250
+ if (!config[stateName]) {
251
+ console.error(`❌ Error: State "${stateName}" does not exist in bot.json`);
252
+ process.exit(1);
253
+ }
254
+ // Safety check: non-empty handler folder
255
+ if (isHandlerFolderNonEmpty(stateName, cwd)) {
256
+ console.error(`❌ Error: Cannot delete state "${stateName}" - handler folder is not empty`);
257
+ console.error(` Path: src/handlers/${stateName}/`);
258
+ console.error(` Remove or move the handler files first, then retry.`);
259
+ process.exit(1);
260
+ }
261
+ // Safety check: outgoing transitions
262
+ const outgoing = config[stateName] || [];
263
+ if (outgoing.length > 0) {
264
+ console.error(`❌ Error: Cannot delete state "${stateName}" - has outgoing transitions:`);
265
+ outgoing.forEach((t) => console.error(` ${stateName} → ${t}`));
266
+ console.error(` Remove transitions first: telemeister state:transition:delete ${stateName} <target>`);
267
+ process.exit(1);
268
+ }
269
+ // Safety check: incoming transitions
270
+ const incoming = getIncomingTransitions(config, stateName);
271
+ if (incoming.length > 0) {
272
+ console.error(`❌ Error: Cannot delete state "${stateName}" - has incoming transitions:`);
273
+ incoming.forEach((f) => console.error(` ${f} → ${stateName}`));
274
+ console.error(` Remove transitions first: telemeister state:transition:delete <source> ${stateName}`);
275
+ process.exit(1);
276
+ }
277
+ // Delete state
278
+ delete config[stateName];
279
+ saveBotConfig(config, cwd);
280
+ console.log(`✅ Removed state "${stateName}" from bot.json`);
281
+ // Remove from handlers index
282
+ removeFromHandlersIndex(stateName, cwd);
283
+ // Sync types
284
+ const paths = getProjectPaths(cwd);
285
+ const typesContent = generateTypes(config);
286
+ fs.writeFileSync(paths.stateTypesPath, typesContent);
287
+ console.log(`📝 Updated: src/bot-state-types.ts`);
288
+ // Generate diagram
289
+ await generateDiagram(config, cwd);
290
+ // Remove empty handler folder
291
+ const handlerDir = path.join(paths.handlersDir, stateName);
292
+ if (fs.existsSync(handlerDir)) {
293
+ fs.rmdirSync(handlerDir);
294
+ console.log(`🗑️ Removed empty folder: src/handlers/${stateName}/`);
295
+ }
296
+ console.log(`\n✅ State "${stateName}" deleted successfully!`);
297
+ }
298
+ export async function stateSync() {
299
+ const cwd = process.cwd();
300
+ const config = loadBotConfig(cwd);
301
+ const states = Object.keys(config);
302
+ console.log('🔄 Syncing state types and handlers...\n');
303
+ // Generate types
304
+ const paths = getProjectPaths(cwd);
305
+ const typesContent = generateTypes(config);
306
+ fs.writeFileSync(paths.stateTypesPath, typesContent);
307
+ console.log(`📝 Updated: src/bot-state-types.ts`);
308
+ // Create missing handlers
309
+ for (const state of states) {
310
+ if (!handlerExists(state, cwd)) {
311
+ await createHandler(state, config[state] || [], cwd);
312
+ updateHandlersIndex(state, cwd);
313
+ }
314
+ else {
315
+ console.log(`⏭️ Handler exists: src/handlers/${state}/index.ts`);
316
+ }
317
+ }
318
+ // Generate diagram
319
+ await generateDiagram(config, cwd);
320
+ console.log('\n✅ Sync complete!');
321
+ }
322
+ export async function transitionAdd(fromState, toState) {
323
+ const cwd = process.cwd();
324
+ if (!fromState || !toState) {
325
+ console.error('❌ Error: Both source and target state names are required');
326
+ console.error('Usage: telemeister state:transition:add <from-state> <to-state>');
327
+ process.exit(1);
328
+ }
329
+ const config = loadBotConfig(cwd);
330
+ if (!config[fromState]) {
331
+ console.error(`❌ Error: Source state "${fromState}" does not exist in bot.json`);
332
+ process.exit(1);
333
+ }
334
+ if (!config[toState]) {
335
+ console.error(`❌ Error: Target state "${toState}" does not exist in bot.json`);
336
+ process.exit(1);
337
+ }
338
+ if (config[fromState].includes(toState)) {
339
+ console.error(`❌ Error: Transition "${fromState}" → "${toState}" already exists`);
340
+ process.exit(1);
341
+ }
342
+ config[fromState].push(toState);
343
+ saveBotConfig(config, cwd);
344
+ console.log(`✅ Added transition: ${fromState} → ${toState}`);
345
+ // Sync types
346
+ const paths = getProjectPaths(cwd);
347
+ const typesContent = generateTypes(config);
348
+ fs.writeFileSync(paths.stateTypesPath, typesContent);
349
+ console.log(`📝 Updated: src/bot-state-types.ts`);
350
+ // Generate diagram
351
+ await generateDiagram(config, cwd);
352
+ }
353
+ export async function transitionDelete(fromState, toState) {
354
+ const cwd = process.cwd();
355
+ if (!fromState || !toState) {
356
+ console.error('❌ Error: Both source and target state names are required');
357
+ console.error('Usage: telemeister state:transition:delete <from-state> <to-state>');
358
+ process.exit(1);
359
+ }
360
+ const config = loadBotConfig(cwd);
361
+ if (!config[fromState]) {
362
+ console.error(`❌ Error: Source state "${fromState}" does not exist in bot.json`);
363
+ process.exit(1);
364
+ }
365
+ const index = config[fromState].indexOf(toState);
366
+ if (index === -1) {
367
+ console.error(`❌ Error: Transition "${fromState}" → "${toState}" does not exist`);
368
+ process.exit(1);
369
+ }
370
+ config[fromState].splice(index, 1);
371
+ saveBotConfig(config, cwd);
372
+ console.log(`✅ Removed transition: ${fromState} → ${toState}`);
373
+ // Sync types
374
+ const paths = getProjectPaths(cwd);
375
+ const typesContent = generateTypes(config);
376
+ fs.writeFileSync(paths.stateTypesPath, typesContent);
377
+ console.log(`📝 Updated: src/bot-state-types.ts`);
378
+ // Generate diagram
379
+ await generateDiagram(config, cwd);
380
+ }
381
+ //# sourceMappingURL=state-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-manager.js","sourceRoot":"","sources":["../../src/cli/state-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Configuration and environment variables
3
+ *
4
+ * This file centralizes all environment variable access
5
+ * and provides validation.
6
+ */
7
+ export declare const config: {
8
+ botToken: string;
9
+ botMode: "polling" | "webhook";
10
+ webhookUrl: string;
11
+ port: number;
12
+ db: {
13
+ host: string;
14
+ port: number;
15
+ user: string;
16
+ password: string;
17
+ name: string;
18
+ };
19
+ };
20
+ /**
21
+ * Validate configuration
22
+ */
23
+ export declare function validateConfig(): void;
24
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAoBH,eAAO,MAAM,MAAM;;aAK+B,SAAS,GAAG,SAAS;;;;;;;;;;CActE,CAAC;AAEF;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAQrC"}
package/dist/config.js ADDED
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Configuration and environment variables
3
+ *
4
+ * This file centralizes all environment variable access
5
+ * and provides validation.
6
+ */
7
+ function getEnvVar(name, required = true) {
8
+ const value = process.env[name];
9
+ if (required && !value) {
10
+ throw new Error(`Missing required environment variable: ${name}`);
11
+ }
12
+ return value || '';
13
+ }
14
+ function getEnvVarInt(name, defaultValue) {
15
+ const value = process.env[name];
16
+ if (!value)
17
+ return defaultValue;
18
+ const parsed = parseInt(value, 10);
19
+ if (isNaN(parsed)) {
20
+ throw new Error(`Environment variable ${name} must be a valid integer`);
21
+ }
22
+ return parsed;
23
+ }
24
+ export const config = {
25
+ // Telegram Bot API credentials (from @BotFather)
26
+ botToken: getEnvVar('BOT_TOKEN'),
27
+ // Bot mode: 'polling' or 'webhook'
28
+ botMode: (process.env.BOT_MODE || 'polling'),
29
+ // Webhook configuration
30
+ webhookUrl: process.env.WEBHOOK_URL || '',
31
+ port: getEnvVarInt('PORT', 3000),
32
+ // Database configuration
33
+ db: {
34
+ host: process.env.DB_HOST || 'localhost',
35
+ port: getEnvVarInt('DB_PORT', 3306),
36
+ user: process.env.DB_USER || 'root',
37
+ password: process.env.DB_PASSWORD || '',
38
+ name: process.env.DB_NAME || 'telemeister',
39
+ },
40
+ };
41
+ /**
42
+ * Validate configuration
43
+ */
44
+ export function validateConfig() {
45
+ if (!config.botToken) {
46
+ throw new Error('BOT_TOKEN is required. Get it from @BotFather on Telegram.');
47
+ }
48
+ if (config.botMode === 'webhook' && !config.webhookUrl) {
49
+ throw new Error('WEBHOOK_URL is required when BOT_MODE=webhook');
50
+ }
51
+ }
52
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,SAAS,SAAS,CAAC,IAAY,EAAE,WAAoB,IAAI;IACvD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,QAAQ,IAAI,CAAC,KAAK,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,0CAA0C,IAAI,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,KAAK,IAAI,EAAE,CAAC;AACrB,CAAC;AAED,SAAS,YAAY,CAAC,IAAY,EAAE,YAAoB;IACtD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC,KAAK;QAAE,OAAO,YAAY,CAAC;IAChC,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACnC,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,0BAA0B,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,iDAAiD;IACjD,QAAQ,EAAE,SAAS,CAAC,WAAW,CAAC;IAEhC,mCAAmC;IACnC,OAAO,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,SAAS,CAA0B;IAErE,wBAAwB;IACxB,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE;IACzC,IAAI,EAAE,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC;IAEhC,yBAAyB;IACzB,EAAE,EAAE;QACF,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,WAAW;QACxC,IAAI,EAAE,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC;QACnC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM;QACnC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE;QACvC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,aAAa;KAC3C;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChF,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Centralized Application State Types for Telemeister
3
+ *
4
+ * This file re-exports types from the auto-generated bot-state-types.ts.
5
+ * Do not edit this file - use npm run state:sync to regenerate types.
6
+ */
7
+ export type { AppStates, StateTransitions } from '../bot-state-types.js';
8
+ //# sourceMappingURL=app-states.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-states.d.ts","sourceRoot":"","sources":["../../src/core/app-states.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,YAAY,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Centralized Application State Types for Telemeister
3
+ *
4
+ * This file re-exports types from the auto-generated bot-state-types.ts.
5
+ * Do not edit this file - use npm run state:sync to regenerate types.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=app-states.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-states.js","sourceRoot":"","sources":["../../src/core/app-states.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,138 @@
1
+ import type { BotHandlerContext, BotState, EnterHandler, ResponseHandler, StateHandlers } from './types.js';
2
+ /**
3
+ * State Builder - Fluent API for configuring a single state
4
+ *
5
+ * @template TState - Union type of all valid states
6
+ */
7
+ declare class StateBuilder<TState extends BotState = BotState> {
8
+ private state;
9
+ private handlers;
10
+ constructor(state: TState, handlers: Map<TState, StateHandlers<TState>>);
11
+ /**
12
+ * Set the onEnter handler for this state
13
+ * Called when the user enters this state
14
+ * Can optionally return a state name to immediately transition to
15
+ *
16
+ * Example:
17
+ * .onEnter(async (ctx) => {
18
+ * await ctx.send('Welcome!');
19
+ * // Optionally transition immediately:
20
+ * return 'anotherState';
21
+ * })
22
+ */
23
+ onEnter(handler: EnterHandler<TState>): this;
24
+ /**
25
+ * Set the onResponse handler for this state
26
+ * Called when the user sends a message while in this state
27
+ *
28
+ * Example:
29
+ * .onResponse(async (ctx, response) => {
30
+ * if (response === 'yes') {
31
+ * return 'confirmed';
32
+ * }
33
+ * return 'cancelled';
34
+ * })
35
+ */
36
+ onResponse(handler: ResponseHandler<TState>): this;
37
+ }
38
+ /**
39
+ * Multi-State Builder - Registers handlers for multiple states at once
40
+ *
41
+ * @template TState - Union type of all valid states
42
+ */
43
+ declare class MultiStateBuilder<TState extends BotState = BotState> {
44
+ private states;
45
+ private handlers;
46
+ constructor(states: TState[], handlers: Map<TState, StateHandlers<TState>>);
47
+ onEnter(handler: EnterHandler<TState>): this;
48
+ onResponse(handler: ResponseHandler<TState>): this;
49
+ }
50
+ /**
51
+ * Bot Builder - Main API for registering state handlers
52
+ *
53
+ * For type-safe state returns, define your states as a union type:
54
+ *
55
+ * @example
56
+ * ```typescript
57
+ * // Define your states
58
+ * type MyStates = 'idle' | 'welcome' | 'menu' | 'collectName';
59
+ *
60
+ * // Create typed builder
61
+ * const typedBuilder = botBuilder as BotBuilder<MyStates>;
62
+ *
63
+ * typedBuilder
64
+ * .forState('welcome')
65
+ * .onEnter(async (ctx) => {
66
+ * await ctx.send('Welcome!');
67
+ * return 'menu'; // ✅ Type-safe: only 'idle' | 'welcome' | 'menu' | 'collectName' allowed
68
+ * })
69
+ * .onResponse(async (ctx, response) => {
70
+ * return 'collectName'; // ✅ Also type-safe
71
+ * });
72
+ * ```
73
+ *
74
+ * @template TState - Union type of all valid states (defaults to string)
75
+ */
76
+ export declare class BotBuilder<TState extends BotState = BotState> {
77
+ private handlers;
78
+ /**
79
+ * Register handlers for one or more states using chaining
80
+ * @param state - State name(s) to configure
81
+ * @returns StateBuilder for method chaining
82
+ */
83
+ forState(state: TState): StateBuilder<TState>;
84
+ forState(states: TState[]): MultiStateBuilder<TState>;
85
+ /**
86
+ * Register an onEnter handler for a state
87
+ * @param state - State name
88
+ * @param handler - Handler function
89
+ * @returns this for chaining
90
+ */
91
+ onEnter(state: TState, handler: EnterHandler<TState>): this;
92
+ /**
93
+ * Register an onResponse handler for a state
94
+ * @param state - State name
95
+ * @param handler - Handler function
96
+ * @returns this for chaining
97
+ */
98
+ onResponse(state: TState, handler: ResponseHandler<TState>): this;
99
+ /**
100
+ * Execute the onEnter handler for a given state
101
+ * @internal Called by the bot handlers
102
+ * @returns The next state to transition to (if any), or void
103
+ */
104
+ executeOnEnter(state: TState, context: BotHandlerContext<TState>): Promise<TState | void>;
105
+ /**
106
+ * Execute the onResponse handler for a given state
107
+ * @internal Called by the bot handlers
108
+ * @returns The next state to transition to, or void
109
+ */
110
+ executeOnResponse(state: TState, context: BotHandlerContext<TState>, response: string): Promise<TState | void>;
111
+ /**
112
+ * Check if a state has an onEnter handler
113
+ */
114
+ hasOnEnter(state: TState): boolean;
115
+ /**
116
+ * Check if a state has an onResponse handler
117
+ */
118
+ hasOnResponse(state: TState): boolean;
119
+ /**
120
+ * Get all registered state names
121
+ */
122
+ getRegisteredStates(): TState[];
123
+ /**
124
+ * Get handlers for a specific state
125
+ */
126
+ getHandlers(state: TState): StateHandlers<TState> | undefined;
127
+ }
128
+ /**
129
+ * Global bot builder instance (untyped - accepts any string state)
130
+ *
131
+ * For type safety, cast to BotBuilder<YourStateUnion>:
132
+ * ```typescript
133
+ * const typedBuilder = botBuilder as BotBuilder<'idle' | 'welcome' | 'menu'>;
134
+ * ```
135
+ */
136
+ export declare const botBuilder: BotBuilder<string>;
137
+ export type { BotHandlerContext, BotState, EnterHandler, ResponseHandler } from './types.js';
138
+ //# sourceMappingURL=builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/core/builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,QAAQ,EACR,YAAY,EACZ,eAAe,EACf,aAAa,EACd,MAAM,YAAY,CAAC;AAEpB;;;;GAIG;AACH,cAAM,YAAY,CAAC,MAAM,SAAS,QAAQ,GAAG,QAAQ;IACnD,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,QAAQ,CAAqC;gBAEzC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAKvE;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC,MAAM,CAAC,GAAG,IAAI;IAO5C;;;;;;;;;;;OAWG;IACH,UAAU,CAAC,OAAO,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,IAAI;CAMnD;AAED;;;;GAIG;AACH,cAAM,iBAAiB,CAAC,MAAM,SAAS,QAAQ,GAAG,QAAQ;IACxD,OAAO,CAAC,MAAM,CAAW;IACzB,OAAO,CAAC,QAAQ,CAAqC;gBAEzC,MAAM,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAK1E,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC,MAAM,CAAC,GAAG,IAAI;IAS5C,UAAU,CAAC,OAAO,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,IAAI;CAQnD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,qBAAa,UAAU,CAAC,MAAM,SAAS,QAAQ,GAAG,QAAQ;IACxD,OAAO,CAAC,QAAQ,CAA4C;IAE5D;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC;IAC7C,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,iBAAiB,CAAC,MAAM,CAAC;IAQrD;;;;;OAKG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,CAAC,MAAM,CAAC,GAAG,IAAI;IAO3D;;;;;OAKG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,IAAI;IAOjE;;;;OAIG;IACG,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAQ/F;;;;OAIG;IACG,iBAAiB,CACrB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,iBAAiB,CAAC,MAAM,CAAC,EAClC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAQzB;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIlC;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIrC;;OAEG;IACH,mBAAmB,IAAI,MAAM,EAAE;IAI/B;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,GAAG,SAAS;CAG9D;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,UAAU,oBAAmB,CAAC;AAG3C,YAAY,EAAE,iBAAiB,EAAE,QAAQ,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}