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.
- package/LICENSE +674 -0
- package/README.md +460 -0
- package/bin/telemeister.js +18 -0
- package/dist/bot/polling.d.ts +20 -0
- package/dist/bot/polling.d.ts.map +1 -0
- package/dist/bot/polling.js +115 -0
- package/dist/bot/polling.js.map +1 -0
- package/dist/bot/session.d.ts +50 -0
- package/dist/bot/session.d.ts.map +1 -0
- package/dist/bot/session.js +92 -0
- package/dist/bot/session.js.map +1 -0
- package/dist/bot/webhook.d.ts +36 -0
- package/dist/bot/webhook.d.ts.map +1 -0
- package/dist/bot/webhook.js +199 -0
- package/dist/bot/webhook.js.map +1 -0
- package/dist/bot-state-types.d.ts +10 -0
- package/dist/bot-state-types.d.ts.map +1 -0
- package/dist/bot-state-types.js +3 -0
- package/dist/bot-state-types.js.map +1 -0
- package/dist/cli/cli.d.ts +14 -0
- package/dist/cli/cli.d.ts.map +1 -0
- package/dist/cli/cli.js +57 -0
- package/dist/cli/cli.js.map +1 -0
- package/dist/cli/create-bot.d.ts +5 -0
- package/dist/cli/create-bot.d.ts.map +1 -0
- package/dist/cli/create-bot.js +275 -0
- package/dist/cli/create-bot.js.map +1 -0
- package/dist/cli/index.d.ts +4 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +4 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/state-manager.d.ts +9 -0
- package/dist/cli/state-manager.d.ts.map +1 -0
- package/dist/cli/state-manager.js +381 -0
- package/dist/cli/state-manager.js.map +1 -0
- package/dist/config.d.ts +24 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +52 -0
- package/dist/config.js.map +1 -0
- package/dist/core/app-states.d.ts +8 -0
- package/dist/core/app-states.d.ts.map +1 -0
- package/dist/core/app-states.js +8 -0
- package/dist/core/app-states.js.map +1 -0
- package/dist/core/builder.d.ts +138 -0
- package/dist/core/builder.d.ts.map +1 -0
- package/dist/core/builder.js +195 -0
- package/dist/core/builder.js.map +1 -0
- package/dist/core/compact-machine.d.ts +57 -0
- package/dist/core/compact-machine.d.ts.map +1 -0
- package/dist/core/compact-machine.js +113 -0
- package/dist/core/compact-machine.js.map +1 -0
- package/dist/core/index.d.ts +13 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +9 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/types.d.ts +47 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +3 -0
- package/dist/core/types.js.map +1 -0
- package/dist/database.d.ts +43 -0
- package/dist/database.d.ts.map +1 -0
- package/dist/database.js +127 -0
- package/dist/database.js.map +1 -0
- package/dist/generated/prisma/browser.d.ts +15 -0
- package/dist/generated/prisma/browser.d.ts.map +1 -0
- package/dist/generated/prisma/browser.js +18 -0
- package/dist/generated/prisma/browser.js.map +1 -0
- package/dist/generated/prisma/client.d.ts +32 -0
- package/dist/generated/prisma/client.d.ts.map +1 -0
- package/dist/generated/prisma/client.js +33 -0
- package/dist/generated/prisma/client.js.map +1 -0
- package/dist/generated/prisma/commonInputTypes.d.ts +166 -0
- package/dist/generated/prisma/commonInputTypes.d.ts.map +1 -0
- package/dist/generated/prisma/commonInputTypes.js +11 -0
- package/dist/generated/prisma/commonInputTypes.js.map +1 -0
- package/dist/generated/prisma/enums.d.ts +2 -0
- package/dist/generated/prisma/enums.d.ts.map +1 -0
- package/dist/generated/prisma/enums.js +11 -0
- package/dist/generated/prisma/enums.js.map +1 -0
- package/dist/generated/prisma/internal/class.d.ts +138 -0
- package/dist/generated/prisma/internal/class.d.ts.map +1 -0
- package/dist/generated/prisma/internal/class.js +50 -0
- package/dist/generated/prisma/internal/class.js.map +1 -0
- package/dist/generated/prisma/internal/prismaNamespace.d.ts +591 -0
- package/dist/generated/prisma/internal/prismaNamespace.d.ts.map +1 -0
- package/dist/generated/prisma/internal/prismaNamespace.js +96 -0
- package/dist/generated/prisma/internal/prismaNamespace.js.map +1 -0
- package/dist/generated/prisma/internal/prismaNamespaceBrowser.d.ts +56 -0
- package/dist/generated/prisma/internal/prismaNamespaceBrowser.d.ts.map +1 -0
- package/dist/generated/prisma/internal/prismaNamespaceBrowser.js +67 -0
- package/dist/generated/prisma/internal/prismaNamespaceBrowser.js.map +1 -0
- package/dist/generated/prisma/models/User.d.ts +1181 -0
- package/dist/generated/prisma/models/User.d.ts.map +1 -0
- package/dist/generated/prisma/models/User.js +2 -0
- package/dist/generated/prisma/models/User.js.map +1 -0
- package/dist/generated/prisma/models/UserInfo.d.ts +1101 -0
- package/dist/generated/prisma/models/UserInfo.d.ts.map +1 -0
- package/dist/generated/prisma/models/UserInfo.js +2 -0
- package/dist/generated/prisma/models/UserInfo.js.map +1 -0
- package/dist/generated/prisma/models.d.ts +4 -0
- package/dist/generated/prisma/models.d.ts.map +1 -0
- package/dist/generated/prisma/models.js +2 -0
- package/dist/generated/prisma/models.js.map +1 -0
- package/dist/handlers/idle/index.d.ts +2 -0
- package/dist/handlers/idle/index.d.ts.map +1 -0
- package/dist/handlers/idle/index.js +22 -0
- package/dist/handlers/idle/index.js.map +1 -0
- package/dist/handlers/index.d.ts +12 -0
- package/dist/handlers/index.d.ts.map +1 -0
- package/dist/handlers/index.js +14 -0
- package/dist/handlers/index.js.map +1 -0
- package/dist/handlers/menu/index.d.ts +2 -0
- package/dist/handlers/menu/index.d.ts.map +1 -0
- package/dist/handlers/menu/index.js +35 -0
- package/dist/handlers/menu/index.js.map +1 -0
- package/dist/handlers/menu.d.ts +2 -0
- package/dist/handlers/menu.d.ts.map +1 -0
- package/dist/handlers/menu.js +37 -0
- package/dist/handlers/menu.js.map +1 -0
- package/dist/handlers/welcome/index.d.ts +2 -0
- package/dist/handlers/welcome/index.d.ts.map +1 -0
- package/dist/handlers/welcome/index.js +22 -0
- package/dist/handlers/welcome/index.js.map +1 -0
- package/dist/handlers/welcome.d.ts +2 -0
- package/dist/handlers/welcome.d.ts.map +1 -0
- package/dist/handlers/welcome.js +30 -0
- package/dist/handlers/welcome.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/package.json +111 -0
- 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":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE/D,+DAA+D;AAC/D,SAAS,eAAe,CAAC,GAAW;IAClC,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC;QAC7B,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,UAAU,CAAC;QAC9C,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC;QACvC,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,oBAAoB,CAAC;QAC3D,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,gBAAgB,CAAC;QACzD,iBAAiB,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,iBAAiB,CAAC;QAC3D,+DAA+D;QAC/D,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,gBAAgB,CAAC;KAC9E,CAAC;AACJ,CAAC;AAID,SAAS,aAAa,CAAC,GAAW;IAChC,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;QACtC,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,aAAa,CAAC,MAAiB,EAAE,GAAW;IACnD,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACnC,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY;IACrC,OAAO,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,UAAU,CAAC,GAAW;IAC7B,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,cAAc,CAAC,SAAiB,EAAE,GAAW;IACpD,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,aAAa,CAAC,SAAiB,EAAE,GAAW;IACnD,OAAO,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,uBAAuB,CAAC,SAAiB,EAAE,GAAW;IAC7D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAC1E,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7C,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IACzC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,sBAAsB,CAAC,MAAiB,EAAE,SAAiB;IAClE,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACrD,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YAChC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,aAAa,CAAC,MAAiB;IACtC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IAE1C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO;;;;;;CAMV,CAAC;IACA,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAE5D,IAAI,uBAAuB,GAAG,EAAE,CAAC;IACjC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACpC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,uBAAuB,IAAI,KAAK,KAAK,WAAW,CAAC;QACnD,CAAC;aAAM,CAAC;YACN,MAAM,YAAY,GAAG,CAAC,GAAG,OAAO,CAAC;iBAC9B,IAAI,EAAE;iBACN,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC;iBACpB,IAAI,CAAC,KAAK,CAAC,CAAC;YACf,uBAAuB,IAAI,KAAK,KAAK,KAAK,YAAY,YAAY,CAAC;QACrE,CAAC;IACH,CAAC;IAED,IAAI,kBAAkB,GAAG,EAAE,CAAC;IAC5B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,aAAa,CAAC;QACnD,kBAAkB,IAAI,eAAe,QAAQ,gCAAgC,KAAK,QAAQ,CAAC;IAC7F,CAAC;IAED,OAAO;;0BAEiB,WAAW;;;EAGnC,uBAAuB;;EAEvB,kBAAkB;CACnB,CAAC;AACF,CAAC;AAED,SAAS,sBAAsB,CAAC,MAAiB;IAC/C,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEnC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,kCAAkC,CAAC;IAC5C,CAAC;IAED,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACrD,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;YACzB,WAAW,CAAC,IAAI,CAAC,OAAO,IAAI,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,OAAO,oBAAoB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AACtD,CAAC;AAED,SAAS,uBAAuB,CAAC,MAAiB;IAChD,MAAM,WAAW,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAEnD,OAAO;;;EAGP,WAAW;;CAEZ,CAAC;AACF,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,MAAiB,EAAE,GAAW;IAC3D,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,SAAS,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAClD,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAE9C,MAAM,WAAW,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;IACnD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;IAExD,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAE3C,IAAI,CAAC;QACH,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;QACnD,QAAQ,CAAC,gBAAgB,WAAW,SAAS,KAAK,CAAC,iBAAiB,YAAY,EAAE;YAChF,KAAK,EAAE,MAAM;YACb,GAAG,EAAE,GAAG;SACT,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAC;IACxF,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,SAAiB,EACjB,gBAA0B,EAC1B,GAAW;IAEX,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAC3D,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAEtD,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,4CAA4C,SAAS,WAAW,CAAC,CAAC;QAC9E,OAAO;IACT,CAAC;IAED,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,eAAe,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACrE,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,eAAe,EAAE;QAC1C,SAAS;QACT,gBAAgB,EAAE,CAAC,GAAG,gBAAgB,CAAC,CAAC,IAAI,EAAE;QAC9C,UAAU;KACX,CAAC,CAAC;IAEH,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,4BAA4B,SAAS,WAAW,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,mBAAmB,CAAC,SAAiB,EAAE,GAAW;IACzD,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IAE3D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG;;;;;;YAMR,SAAS;CACpB,CAAC;QACE,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QACjD,OAAO;IACT,CAAC;IAED,IAAI,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAClD,MAAM,UAAU,GAAG,aAAa,SAAS,aAAa,CAAC;IAEvD,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACjC,OAAO;IACT,CAAC;IAED,wBAAwB;IACxB,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,KAAK,UAAU,IAAI,CAAC;IAClD,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,uBAAuB,CAAC,SAAiB,EAAE,GAAW;IAC7D,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IAE3D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO;IAEtC,IAAI,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAClD,MAAM,UAAU,GAAG,aAAa,SAAS,aAAa,CAAC;IAEvD,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACjC,OAAO,GAAG,OAAO,CAAC,OAAO,CACvB,IAAI,MAAM,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,EAC3E,EAAE,CACH,CAAC;QACF,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC;AAED,WAAW;AAEX,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,SAA6B;IAC1D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1B,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACjD,OAAO,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,CAAC;QAClC,OAAO,CAAC,KAAK,CACX,iGAAiG,CAClG,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAElC,IAAI,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,mBAAmB,SAAS,8BAA8B,CAAC,CAAC;QAC1E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,sBAAsB;IACtB,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;IACvB,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,OAAO,CAAC,GAAG,CAAC,kBAAkB,SAAS,eAAe,CAAC,CAAC;IAExD,iBAAiB;IACjB,MAAM,aAAa,CAAC,SAAS,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;IACxC,mBAAmB,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IAEpC,aAAa;IACb,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IAC3C,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAElD,mBAAmB;IACnB,MAAM,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAEnC,OAAO,CAAC,GAAG,CAAC,cAAc,SAAS,uBAAuB,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC7B,OAAO,CAAC,GAAG,CAAC,0BAA0B,SAAS,oCAAoC,CAAC,CAAC;IACrF,OAAO,CAAC,GAAG,CAAC,0DAA0D,SAAS,iBAAiB,CAAC,CAAC;AACpG,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,SAA6B;IAC7D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1B,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACjD,OAAO,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAElC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,mBAAmB,SAAS,8BAA8B,CAAC,CAAC;QAC1E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,yCAAyC;IACzC,IAAI,uBAAuB,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC;QAC5C,OAAO,CAAC,KAAK,CAAC,iCAAiC,SAAS,iCAAiC,CAAC,CAAC;QAC3F,OAAO,CAAC,KAAK,CAAC,yBAAyB,SAAS,GAAG,CAAC,CAAC;QACrD,OAAO,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,qCAAqC;IACrC,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IACzC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,KAAK,CAAC,iCAAiC,SAAS,+BAA+B,CAAC,CAAC;QACzF,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,SAAS,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QACjE,OAAO,CAAC,KAAK,CACX,oEAAoE,SAAS,WAAW,CACzF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,qCAAqC;IACrC,MAAM,QAAQ,GAAG,sBAAsB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC3D,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,KAAK,CAAC,iCAAiC,SAAS,+BAA+B,CAAC,CAAC;QACzF,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,SAAS,EAAE,CAAC,CAAC,CAAC;QACjE,OAAO,CAAC,KAAK,CACX,6EAA6E,SAAS,EAAE,CACzF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,eAAe;IACf,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC;IACzB,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,OAAO,CAAC,GAAG,CAAC,oBAAoB,SAAS,iBAAiB,CAAC,CAAC;IAE5D,6BAA6B;IAC7B,uBAAuB,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IAExC,aAAa;IACb,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IAC3C,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAElD,mBAAmB;IACnB,MAAM,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAEnC,8BAA8B;IAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAC3D,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,2CAA2C,SAAS,GAAG,CAAC,CAAC;IACvE,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,cAAc,SAAS,yBAAyB,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEnC,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;IAExD,iBAAiB;IACjB,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IAC3C,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAElD,0BAA0B;IAC1B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;YACrD,mBAAmB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,oCAAoC,KAAK,WAAW,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED,mBAAmB;IACnB,MAAM,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAEnC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,SAA6B,EAC7B,OAA2B;IAE3B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1B,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAC1E,OAAO,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAAC;QACjF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAElC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,0BAA0B,SAAS,8BAA8B,CAAC,CAAC;QACjF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QACrB,OAAO,CAAC,KAAK,CAAC,0BAA0B,OAAO,8BAA8B,CAAC,CAAC;QAC/E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACxC,OAAO,CAAC,KAAK,CAAC,wBAAwB,SAAS,QAAQ,OAAO,kBAAkB,CAAC,CAAC;QAClF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAChC,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,OAAO,CAAC,GAAG,CAAC,uBAAuB,SAAS,MAAM,OAAO,EAAE,CAAC,CAAC;IAE7D,aAAa;IACb,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IAC3C,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAElD,mBAAmB;IACnB,MAAM,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,SAA6B,EAC7B,OAA2B;IAE3B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1B,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAC1E,OAAO,CAAC,KAAK,CAAC,oEAAoE,CAAC,CAAC;QACpF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAElC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,0BAA0B,SAAS,8BAA8B,CAAC,CAAC;QACjF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACjD,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,CAAC,wBAAwB,SAAS,QAAQ,OAAO,kBAAkB,CAAC,CAAC;QAClF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACnC,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,OAAO,CAAC,GAAG,CAAC,yBAAyB,SAAS,MAAM,OAAO,EAAE,CAAC,CAAC;IAE/D,aAAa;IACb,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IAC3C,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAElD,mBAAmB;IACnB,MAAM,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACrC,CAAC"}
|
package/dist/config.d.ts
ADDED
|
@@ -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"}
|