@dreb/telegram 2.25.4 → 2.27.2

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.
@@ -1 +1 @@
1
- {"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../src/commands/sessions.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAGtC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG7C,wBAAsB,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgCnG;AAED,wBAAsB,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyC/G;AAED,wBAAsB,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsD/G","sourcesContent":["/**\n * Session slash commands: /sessions, /resume, /recent\n */\n\nimport type { Context } from \"grammy\";\nimport type { AgentBridge } from \"../agent-bridge.js\";\nimport { ensureBridge } from \"../bridge-lifecycle.js\";\nimport type { Config } from \"../config.js\";\nimport { setUserSession } from \"../state.js\";\nimport type { UserState } from \"../types.js\";\nimport { log, safeSend, sendLong } from \"../util/telegram.js\";\n\nexport async function cmdSessions(ctx: Context, userState: UserState, config: Config): Promise<void> {\n\tconst chatId = ctx.chat!.id;\n\n\tlet bridge: AgentBridge;\n\ttry {\n\t\tbridge = await ensureBridge(config, userState);\n\t} catch (e) {\n\t\tawait safeSend(ctx.api, chatId, `❌ Failed to start agent: ${e}`);\n\t\treturn;\n\t}\n\n\tconst sessions = await bridge.listSessions();\n\tif (sessions.length === 0) {\n\t\tawait safeSend(ctx.api, chatId, \"No saved sessions. Send a message to start one.\");\n\t\treturn;\n\t}\n\n\tconst lines = [\"📂 *Recent Sessions*:\\n\"];\n\t// Show newest first, max 10\n\tfor (const s of sessions.slice(0, 10)) {\n\t\tconst date = new Date(s.modified);\n\t\tconst ts =\n\t\t\tdate.toLocaleDateString(\"en-US\", { month: \"short\", day: \"numeric\" }) +\n\t\t\t\" \" +\n\t\t\tdate.toLocaleTimeString(\"en-US\", { hour: \"2-digit\", minute: \"2-digit\", hour12: false });\n\t\tconst sid = s.id.slice(0, 8);\n\t\tconst preview = s.firstMessage.slice(0, 60);\n\t\tlines.push(`\\`${sid}\\` (${ts})\\n ${preview}`);\n\t}\n\n\tlines.push(\"\\nUse /resume <id> to resume a session.\");\n\tawait safeSend(ctx.api, chatId, lines.join(\"\\n\"));\n}\n\nexport async function cmdResume(ctx: Context, userState: UserState, args: string, config: Config): Promise<void> {\n\tconst chatId = ctx.chat!.id;\n\n\tif (!args.trim()) {\n\t\tawait safeSend(ctx.api, chatId, \"Usage: /resume <session\\\\_id>\\nUse /sessions to list available sessions.\");\n\t\treturn;\n\t}\n\n\tlet bridge: AgentBridge;\n\ttry {\n\t\tbridge = await ensureBridge(config, userState);\n\t} catch (e) {\n\t\tawait safeSend(ctx.api, chatId, `❌ Failed to start agent: ${e}`);\n\t\treturn;\n\t}\n\n\tconst partialId = args.trim();\n\tconst sessions = await bridge.listSessions();\n\tconst matches = sessions.filter((s) => s.id.startsWith(partialId));\n\n\tif (matches.length === 0) {\n\t\tawait safeSend(ctx.api, chatId, `No session found matching \\`${partialId}\\``);\n\t\treturn;\n\t}\n\tif (matches.length > 1) {\n\t\tawait safeSend(ctx.api, chatId, `Multiple sessions match \\`${partialId}\\` — be more specific.`);\n\t\treturn;\n\t}\n\n\tconst session = matches[0];\n\tconst switched = await bridge.switchSession(session.path);\n\tif (switched) {\n\t\tsetUserSession(ctx.from!.id, session.path);\n\t\tawait safeSend(\n\t\t\tctx.api,\n\t\t\tchatId,\n\t\t\t`✅ Resumed session \\`${session.id.slice(0, 8)}...\\`\\nUse /recent to see recent messages.`,\n\t\t);\n\t} else {\n\t\tawait safeSend(ctx.api, chatId, `❌ Failed to switch to session \\`${session.id.slice(0, 8)}...\\``);\n\t}\n}\n\nexport async function cmdRecent(ctx: Context, userState: UserState, args: string, config: Config): Promise<void> {\n\tconst chatId = ctx.chat!.id;\n\n\tlet bridge: AgentBridge;\n\ttry {\n\t\tbridge = await ensureBridge(config, userState);\n\t} catch (e) {\n\t\tawait safeSend(ctx.api, chatId, `❌ Failed to start agent: ${e}`);\n\t\treturn;\n\t}\n\n\t// Parse N (default 1)\n\tlet n = 1;\n\tif (args.trim()) {\n\t\tn = Number.parseInt(args.trim(), 10);\n\t\tif (Number.isNaN(n) || n < 1) {\n\t\t\tawait safeSend(ctx.api, chatId, \"Usage: /recent \\\\[N\\\\] — resend last N messages (default 1, max 50)\");\n\t\t\treturn;\n\t\t}\n\t\tn = Math.min(n, 50);\n\t}\n\n\ttry {\n\t\tconst messages = await bridge.getMessages();\n\t\t// Filter to assistant text messages\n\t\tconst assistantTexts: string[] = [];\n\t\tfor (const msg of messages) {\n\t\t\tif (msg.role !== \"assistant\") continue;\n\t\t\tconst content = (msg as any).content;\n\t\t\tif (!Array.isArray(content)) continue;\n\t\t\tfor (const block of content) {\n\t\t\t\tif (block.type === \"text\" && block.text?.trim()) {\n\t\t\t\t\tassistantTexts.push(block.text.trim());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst recent = assistantTexts.slice(-n);\n\t\tif (recent.length === 0) {\n\t\t\tawait safeSend(ctx.api, chatId, \"No assistant messages found in this session.\");\n\t\t\treturn;\n\t\t}\n\n\t\tfor (let i = 0; i < recent.length; i++) {\n\t\t\tlet text = recent[i];\n\t\t\tif (recent.length > 1) {\n\t\t\t\ttext = `📨 *Message ${i + 1}/${recent.length}*\\n\\n${text}`;\n\t\t\t}\n\t\t\tawait sendLong(ctx.api, chatId, text);\n\t\t}\n\t} catch (e) {\n\t\tlog(`[CMD] /recent error: ${e}`);\n\t\tawait safeSend(ctx.api, chatId, `❌ Failed to retrieve messages: ${e}`);\n\t}\n}\n"]}
1
+ {"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../src/commands/sessions.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAGtC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG7C,wBAAsB,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgCnG;AAED,wBAAsB,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyC/G;AAED,wBAAsB,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsD/G","sourcesContent":["/**\n * Session slash commands: /sessions, /resume, /recent\n */\n\nimport type { Context } from \"grammy\";\nimport type { AgentBridge } from \"../agent-bridge.js\";\nimport { ensureBridge } from \"../bridge-lifecycle.js\";\nimport type { Config } from \"../config.js\";\nimport { setUserSession } from \"../state.js\";\nimport type { UserState } from \"../types.js\";\nimport { log, safeSend, sendLong } from \"../util/telegram.js\";\n\nexport async function cmdSessions(ctx: Context, userState: UserState, config: Config): Promise<void> {\n\tconst chatId = ctx.chat!.id;\n\n\tlet bridge: AgentBridge;\n\ttry {\n\t\tbridge = await ensureBridge(config, userState);\n\t} catch (e) {\n\t\tawait safeSend(ctx.api, chatId, `❌ Failed to start agent: ${e}`);\n\t\treturn;\n\t}\n\n\tconst sessions = await bridge.listSessions();\n\tif (sessions.length === 0) {\n\t\tawait safeSend(ctx.api, chatId, \"No saved sessions. Send a message to start one.\");\n\t\treturn;\n\t}\n\n\tconst lines = [\"📂 *Recent Sessions*:\\n\"];\n\t// Show newest first, max 10\n\tfor (const s of sessions.slice(0, 10)) {\n\t\tconst date = new Date(s.modified);\n\t\tconst ts =\n\t\t\tdate.toLocaleDateString(\"en-US\", { month: \"short\", day: \"numeric\" }) +\n\t\t\t\" \" +\n\t\t\tdate.toLocaleTimeString(\"en-US\", { hour: \"2-digit\", minute: \"2-digit\", hour12: false });\n\t\tconst sid = s.id.slice(0, 8);\n\t\tconst preview = s.name ? s.name : s.firstMessage.slice(0, 60);\n\t\tlines.push(`\\`${sid}\\` (${ts})\\n ${preview}`);\n\t}\n\n\tlines.push(\"\\nUse /resume <id> to resume a session.\");\n\tawait safeSend(ctx.api, chatId, lines.join(\"\\n\"));\n}\n\nexport async function cmdResume(ctx: Context, userState: UserState, args: string, config: Config): Promise<void> {\n\tconst chatId = ctx.chat!.id;\n\n\tif (!args.trim()) {\n\t\tawait safeSend(ctx.api, chatId, \"Usage: /resume <session\\\\_id>\\nUse /sessions to list available sessions.\");\n\t\treturn;\n\t}\n\n\tlet bridge: AgentBridge;\n\ttry {\n\t\tbridge = await ensureBridge(config, userState);\n\t} catch (e) {\n\t\tawait safeSend(ctx.api, chatId, `❌ Failed to start agent: ${e}`);\n\t\treturn;\n\t}\n\n\tconst partialId = args.trim();\n\tconst sessions = await bridge.listSessions();\n\tconst matches = sessions.filter((s) => s.id.startsWith(partialId));\n\n\tif (matches.length === 0) {\n\t\tawait safeSend(ctx.api, chatId, `No session found matching \\`${partialId}\\``);\n\t\treturn;\n\t}\n\tif (matches.length > 1) {\n\t\tawait safeSend(ctx.api, chatId, `Multiple sessions match \\`${partialId}\\` — be more specific.`);\n\t\treturn;\n\t}\n\n\tconst session = matches[0];\n\tconst switched = await bridge.switchSession(session.path);\n\tif (switched) {\n\t\tsetUserSession(ctx.from!.id, session.path);\n\t\tawait safeSend(\n\t\t\tctx.api,\n\t\t\tchatId,\n\t\t\t`✅ Resumed session \\`${session.id.slice(0, 8)}...\\`\\nUse /recent to see recent messages.`,\n\t\t);\n\t} else {\n\t\tawait safeSend(ctx.api, chatId, `❌ Failed to switch to session \\`${session.id.slice(0, 8)}...\\``);\n\t}\n}\n\nexport async function cmdRecent(ctx: Context, userState: UserState, args: string, config: Config): Promise<void> {\n\tconst chatId = ctx.chat!.id;\n\n\tlet bridge: AgentBridge;\n\ttry {\n\t\tbridge = await ensureBridge(config, userState);\n\t} catch (e) {\n\t\tawait safeSend(ctx.api, chatId, `❌ Failed to start agent: ${e}`);\n\t\treturn;\n\t}\n\n\t// Parse N (default 1)\n\tlet n = 1;\n\tif (args.trim()) {\n\t\tn = Number.parseInt(args.trim(), 10);\n\t\tif (Number.isNaN(n) || n < 1) {\n\t\t\tawait safeSend(ctx.api, chatId, \"Usage: /recent \\\\[N\\\\] — resend last N messages (default 1, max 50)\");\n\t\t\treturn;\n\t\t}\n\t\tn = Math.min(n, 50);\n\t}\n\n\ttry {\n\t\tconst messages = await bridge.getMessages();\n\t\t// Filter to assistant text messages\n\t\tconst assistantTexts: string[] = [];\n\t\tfor (const msg of messages) {\n\t\t\tif (msg.role !== \"assistant\") continue;\n\t\t\tconst content = (msg as any).content;\n\t\t\tif (!Array.isArray(content)) continue;\n\t\t\tfor (const block of content) {\n\t\t\t\tif (block.type === \"text\" && block.text?.trim()) {\n\t\t\t\t\tassistantTexts.push(block.text.trim());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst recent = assistantTexts.slice(-n);\n\t\tif (recent.length === 0) {\n\t\t\tawait safeSend(ctx.api, chatId, \"No assistant messages found in this session.\");\n\t\t\treturn;\n\t\t}\n\n\t\tfor (let i = 0; i < recent.length; i++) {\n\t\t\tlet text = recent[i];\n\t\t\tif (recent.length > 1) {\n\t\t\t\ttext = `📨 *Message ${i + 1}/${recent.length}*\\n\\n${text}`;\n\t\t\t}\n\t\t\tawait sendLong(ctx.api, chatId, text);\n\t\t}\n\t} catch (e) {\n\t\tlog(`[CMD] /recent error: ${e}`);\n\t\tawait safeSend(ctx.api, chatId, `❌ Failed to retrieve messages: ${e}`);\n\t}\n}\n"]}
@@ -27,7 +27,7 @@ export async function cmdSessions(ctx, userState, config) {
27
27
  " " +
28
28
  date.toLocaleTimeString("en-US", { hour: "2-digit", minute: "2-digit", hour12: false });
29
29
  const sid = s.id.slice(0, 8);
30
- const preview = s.firstMessage.slice(0, 60);
30
+ const preview = s.name ? s.name : s.firstMessage.slice(0, 60);
31
31
  lines.push(`\`${sid}\` (${ts})\n ${preview}`);
32
32
  }
33
33
  lines.push("\nUse /resume <id> to resume a session.");
@@ -1 +1 @@
1
- {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/commands/sessions.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Session slash commands: /sessions, /resume, /recent\n */\n\nimport type { Context } from \"grammy\";\nimport type { AgentBridge } from \"../agent-bridge.js\";\nimport { ensureBridge } from \"../bridge-lifecycle.js\";\nimport type { Config } from \"../config.js\";\nimport { setUserSession } from \"../state.js\";\nimport type { UserState } from \"../types.js\";\nimport { log, safeSend, sendLong } from \"../util/telegram.js\";\n\nexport async function cmdSessions(ctx: Context, userState: UserState, config: Config): Promise<void> {\n\tconst chatId = ctx.chat!.id;\n\n\tlet bridge: AgentBridge;\n\ttry {\n\t\tbridge = await ensureBridge(config, userState);\n\t} catch (e) {\n\t\tawait safeSend(ctx.api, chatId, `❌ Failed to start agent: ${e}`);\n\t\treturn;\n\t}\n\n\tconst sessions = await bridge.listSessions();\n\tif (sessions.length === 0) {\n\t\tawait safeSend(ctx.api, chatId, \"No saved sessions. Send a message to start one.\");\n\t\treturn;\n\t}\n\n\tconst lines = [\"📂 *Recent Sessions*:\\n\"];\n\t// Show newest first, max 10\n\tfor (const s of sessions.slice(0, 10)) {\n\t\tconst date = new Date(s.modified);\n\t\tconst ts =\n\t\t\tdate.toLocaleDateString(\"en-US\", { month: \"short\", day: \"numeric\" }) +\n\t\t\t\" \" +\n\t\t\tdate.toLocaleTimeString(\"en-US\", { hour: \"2-digit\", minute: \"2-digit\", hour12: false });\n\t\tconst sid = s.id.slice(0, 8);\n\t\tconst preview = s.firstMessage.slice(0, 60);\n\t\tlines.push(`\\`${sid}\\` (${ts})\\n ${preview}`);\n\t}\n\n\tlines.push(\"\\nUse /resume <id> to resume a session.\");\n\tawait safeSend(ctx.api, chatId, lines.join(\"\\n\"));\n}\n\nexport async function cmdResume(ctx: Context, userState: UserState, args: string, config: Config): Promise<void> {\n\tconst chatId = ctx.chat!.id;\n\n\tif (!args.trim()) {\n\t\tawait safeSend(ctx.api, chatId, \"Usage: /resume <session\\\\_id>\\nUse /sessions to list available sessions.\");\n\t\treturn;\n\t}\n\n\tlet bridge: AgentBridge;\n\ttry {\n\t\tbridge = await ensureBridge(config, userState);\n\t} catch (e) {\n\t\tawait safeSend(ctx.api, chatId, `❌ Failed to start agent: ${e}`);\n\t\treturn;\n\t}\n\n\tconst partialId = args.trim();\n\tconst sessions = await bridge.listSessions();\n\tconst matches = sessions.filter((s) => s.id.startsWith(partialId));\n\n\tif (matches.length === 0) {\n\t\tawait safeSend(ctx.api, chatId, `No session found matching \\`${partialId}\\``);\n\t\treturn;\n\t}\n\tif (matches.length > 1) {\n\t\tawait safeSend(ctx.api, chatId, `Multiple sessions match \\`${partialId}\\` — be more specific.`);\n\t\treturn;\n\t}\n\n\tconst session = matches[0];\n\tconst switched = await bridge.switchSession(session.path);\n\tif (switched) {\n\t\tsetUserSession(ctx.from!.id, session.path);\n\t\tawait safeSend(\n\t\t\tctx.api,\n\t\t\tchatId,\n\t\t\t`✅ Resumed session \\`${session.id.slice(0, 8)}...\\`\\nUse /recent to see recent messages.`,\n\t\t);\n\t} else {\n\t\tawait safeSend(ctx.api, chatId, `❌ Failed to switch to session \\`${session.id.slice(0, 8)}...\\``);\n\t}\n}\n\nexport async function cmdRecent(ctx: Context, userState: UserState, args: string, config: Config): Promise<void> {\n\tconst chatId = ctx.chat!.id;\n\n\tlet bridge: AgentBridge;\n\ttry {\n\t\tbridge = await ensureBridge(config, userState);\n\t} catch (e) {\n\t\tawait safeSend(ctx.api, chatId, `❌ Failed to start agent: ${e}`);\n\t\treturn;\n\t}\n\n\t// Parse N (default 1)\n\tlet n = 1;\n\tif (args.trim()) {\n\t\tn = Number.parseInt(args.trim(), 10);\n\t\tif (Number.isNaN(n) || n < 1) {\n\t\t\tawait safeSend(ctx.api, chatId, \"Usage: /recent \\\\[N\\\\] — resend last N messages (default 1, max 50)\");\n\t\t\treturn;\n\t\t}\n\t\tn = Math.min(n, 50);\n\t}\n\n\ttry {\n\t\tconst messages = await bridge.getMessages();\n\t\t// Filter to assistant text messages\n\t\tconst assistantTexts: string[] = [];\n\t\tfor (const msg of messages) {\n\t\t\tif (msg.role !== \"assistant\") continue;\n\t\t\tconst content = (msg as any).content;\n\t\t\tif (!Array.isArray(content)) continue;\n\t\t\tfor (const block of content) {\n\t\t\t\tif (block.type === \"text\" && block.text?.trim()) {\n\t\t\t\t\tassistantTexts.push(block.text.trim());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst recent = assistantTexts.slice(-n);\n\t\tif (recent.length === 0) {\n\t\t\tawait safeSend(ctx.api, chatId, \"No assistant messages found in this session.\");\n\t\t\treturn;\n\t\t}\n\n\t\tfor (let i = 0; i < recent.length; i++) {\n\t\t\tlet text = recent[i];\n\t\t\tif (recent.length > 1) {\n\t\t\t\ttext = `📨 *Message ${i + 1}/${recent.length}*\\n\\n${text}`;\n\t\t\t}\n\t\t\tawait sendLong(ctx.api, chatId, text);\n\t\t}\n\t} catch (e) {\n\t\tlog(`[CMD] /recent error: ${e}`);\n\t\tawait safeSend(ctx.api, chatId, `❌ Failed to retrieve messages: ${e}`);\n\t}\n}\n"]}
1
+ {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/commands/sessions.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Session slash commands: /sessions, /resume, /recent\n */\n\nimport type { Context } from \"grammy\";\nimport type { AgentBridge } from \"../agent-bridge.js\";\nimport { ensureBridge } from \"../bridge-lifecycle.js\";\nimport type { Config } from \"../config.js\";\nimport { setUserSession } from \"../state.js\";\nimport type { UserState } from \"../types.js\";\nimport { log, safeSend, sendLong } from \"../util/telegram.js\";\n\nexport async function cmdSessions(ctx: Context, userState: UserState, config: Config): Promise<void> {\n\tconst chatId = ctx.chat!.id;\n\n\tlet bridge: AgentBridge;\n\ttry {\n\t\tbridge = await ensureBridge(config, userState);\n\t} catch (e) {\n\t\tawait safeSend(ctx.api, chatId, `❌ Failed to start agent: ${e}`);\n\t\treturn;\n\t}\n\n\tconst sessions = await bridge.listSessions();\n\tif (sessions.length === 0) {\n\t\tawait safeSend(ctx.api, chatId, \"No saved sessions. Send a message to start one.\");\n\t\treturn;\n\t}\n\n\tconst lines = [\"📂 *Recent Sessions*:\\n\"];\n\t// Show newest first, max 10\n\tfor (const s of sessions.slice(0, 10)) {\n\t\tconst date = new Date(s.modified);\n\t\tconst ts =\n\t\t\tdate.toLocaleDateString(\"en-US\", { month: \"short\", day: \"numeric\" }) +\n\t\t\t\" \" +\n\t\t\tdate.toLocaleTimeString(\"en-US\", { hour: \"2-digit\", minute: \"2-digit\", hour12: false });\n\t\tconst sid = s.id.slice(0, 8);\n\t\tconst preview = s.name ? s.name : s.firstMessage.slice(0, 60);\n\t\tlines.push(`\\`${sid}\\` (${ts})\\n ${preview}`);\n\t}\n\n\tlines.push(\"\\nUse /resume <id> to resume a session.\");\n\tawait safeSend(ctx.api, chatId, lines.join(\"\\n\"));\n}\n\nexport async function cmdResume(ctx: Context, userState: UserState, args: string, config: Config): Promise<void> {\n\tconst chatId = ctx.chat!.id;\n\n\tif (!args.trim()) {\n\t\tawait safeSend(ctx.api, chatId, \"Usage: /resume <session\\\\_id>\\nUse /sessions to list available sessions.\");\n\t\treturn;\n\t}\n\n\tlet bridge: AgentBridge;\n\ttry {\n\t\tbridge = await ensureBridge(config, userState);\n\t} catch (e) {\n\t\tawait safeSend(ctx.api, chatId, `❌ Failed to start agent: ${e}`);\n\t\treturn;\n\t}\n\n\tconst partialId = args.trim();\n\tconst sessions = await bridge.listSessions();\n\tconst matches = sessions.filter((s) => s.id.startsWith(partialId));\n\n\tif (matches.length === 0) {\n\t\tawait safeSend(ctx.api, chatId, `No session found matching \\`${partialId}\\``);\n\t\treturn;\n\t}\n\tif (matches.length > 1) {\n\t\tawait safeSend(ctx.api, chatId, `Multiple sessions match \\`${partialId}\\` — be more specific.`);\n\t\treturn;\n\t}\n\n\tconst session = matches[0];\n\tconst switched = await bridge.switchSession(session.path);\n\tif (switched) {\n\t\tsetUserSession(ctx.from!.id, session.path);\n\t\tawait safeSend(\n\t\t\tctx.api,\n\t\t\tchatId,\n\t\t\t`✅ Resumed session \\`${session.id.slice(0, 8)}...\\`\\nUse /recent to see recent messages.`,\n\t\t);\n\t} else {\n\t\tawait safeSend(ctx.api, chatId, `❌ Failed to switch to session \\`${session.id.slice(0, 8)}...\\``);\n\t}\n}\n\nexport async function cmdRecent(ctx: Context, userState: UserState, args: string, config: Config): Promise<void> {\n\tconst chatId = ctx.chat!.id;\n\n\tlet bridge: AgentBridge;\n\ttry {\n\t\tbridge = await ensureBridge(config, userState);\n\t} catch (e) {\n\t\tawait safeSend(ctx.api, chatId, `❌ Failed to start agent: ${e}`);\n\t\treturn;\n\t}\n\n\t// Parse N (default 1)\n\tlet n = 1;\n\tif (args.trim()) {\n\t\tn = Number.parseInt(args.trim(), 10);\n\t\tif (Number.isNaN(n) || n < 1) {\n\t\t\tawait safeSend(ctx.api, chatId, \"Usage: /recent \\\\[N\\\\] — resend last N messages (default 1, max 50)\");\n\t\t\treturn;\n\t\t}\n\t\tn = Math.min(n, 50);\n\t}\n\n\ttry {\n\t\tconst messages = await bridge.getMessages();\n\t\t// Filter to assistant text messages\n\t\tconst assistantTexts: string[] = [];\n\t\tfor (const msg of messages) {\n\t\t\tif (msg.role !== \"assistant\") continue;\n\t\t\tconst content = (msg as any).content;\n\t\t\tif (!Array.isArray(content)) continue;\n\t\t\tfor (const block of content) {\n\t\t\t\tif (block.type === \"text\" && block.text?.trim()) {\n\t\t\t\t\tassistantTexts.push(block.text.trim());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst recent = assistantTexts.slice(-n);\n\t\tif (recent.length === 0) {\n\t\t\tawait safeSend(ctx.api, chatId, \"No assistant messages found in this session.\");\n\t\t\treturn;\n\t\t}\n\n\t\tfor (let i = 0; i < recent.length; i++) {\n\t\t\tlet text = recent[i];\n\t\t\tif (recent.length > 1) {\n\t\t\t\ttext = `📨 *Message ${i + 1}/${recent.length}*\\n\\n${text}`;\n\t\t\t}\n\t\t\tawait sendLong(ctx.api, chatId, text);\n\t\t}\n\t} catch (e) {\n\t\tlog(`[CMD] /recent error: ${e}`);\n\t\tawait safeSend(ctx.api, chatId, `❌ Failed to retrieve messages: ${e}`);\n\t}\n}\n"]}
package/package.json CHANGED
@@ -1,7 +1,8 @@
1
1
  {
2
2
  "name": "@dreb/telegram",
3
- "version": "2.25.4",
3
+ "version": "2.27.2",
4
4
  "description": "Telegram bot frontend for dreb coding agent",
5
+ "license": "MIT",
5
6
  "type": "module",
6
7
  "main": "./dist/index.js",
7
8
  "types": "./dist/index.d.ts",
@@ -39,7 +40,7 @@
39
40
  "vitest": "^4.1.8"
40
41
  },
41
42
  "engines": {
42
- "node": ">=20.0.0"
43
+ "node": "^22.0.0"
43
44
  },
44
45
  "repository": {
45
46
  "type": "git",