@dreb/telegram 2.60.1 โ†’ 2.61.1

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":"agent.d.ts","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG7C,wBAAsB,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBlF;AAED,wBAAsB,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAcjF;AAED,wBAAsB,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAoEhF;AAED,wBAAsB,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqD9F;AAED,wBAAsB,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BjG","sourcesContent":["/**\n * Agent slash commands: /compact, /agents, /stats, /model, /thinking\n */\n\nimport type { Context } from \"grammy\";\nimport type { UserState } from \"../types.js\";\nimport { log, safeSend } from \"../util/telegram.js\";\n\nexport async function cmdCompact(ctx: Context, userState: UserState): Promise<void> {\n\tconst chatId = ctx.chat!.id;\n\tconst bridge = userState.bridge;\n\n\tif (!bridge?.isAlive) {\n\t\tawait safeSend(ctx.api, chatId, \"No active session.\");\n\t\treturn;\n\t}\n\n\tawait safeSend(ctx.api, chatId, \"๐Ÿ—œ _Compacting context..._\");\n\ttry {\n\t\tconst result = await bridge.compact();\n\t\tif (result) {\n\t\t\tconst before = (result as any).tokensBefore || 0;\n\t\t\tawait safeSend(ctx.api, chatId, `โœ… Compacted (was ${Math.round(before / 1000)}k tokens)`);\n\t\t} else {\n\t\t\tawait safeSend(ctx.api, chatId, \"โœ… Compacted.\");\n\t\t}\n\t} catch (e) {\n\t\tlog(`[CMD] /compact error: ${e}`);\n\t\tawait safeSend(ctx.api, chatId, `โŒ Compaction failed: ${e}`);\n\t}\n}\n\nexport async function cmdAgents(ctx: Context, userState: UserState): Promise<void> {\n\tconst chatId = ctx.chat!.id;\n\n\tif (userState.backgroundAgents.size === 0) {\n\t\tawait safeSend(ctx.api, chatId, \"No background agents running.\");\n\t\treturn;\n\t}\n\n\tconst lines = [\"๐Ÿค– *Background Agents*:\\n\"];\n\tfor (const agent of userState.backgroundAgents.values()) {\n\t\tconst elapsed = Math.round((Date.now() - agent.startTime) / 1000);\n\t\tlines.push(`โ€ข *${agent.agentType}* (${elapsed}s)\\n ${agent.taskSummary.slice(0, 200)}`);\n\t}\n\tawait safeSend(ctx.api, chatId, lines.join(\"\\n\"));\n}\n\nexport async function cmdStats(ctx: Context, userState: UserState): Promise<void> {\n\tconst chatId = ctx.chat!.id;\n\tconst bridge = userState.bridge;\n\n\tif (!bridge?.isAlive) {\n\t\tawait safeSend(ctx.api, chatId, \"No active session.\");\n\t\treturn;\n\t}\n\n\ttry {\n\t\tconst stats = await bridge.getSessionStats();\n\t\tif (!stats) {\n\t\t\tawait safeSend(ctx.api, chatId, \"No stats available.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst lines = [\"๐Ÿ“Š *Session Stats*:\\n\"];\n\t\tlines.push(`Messages: ${stats.userMessages || 0} user, ${stats.assistantMessages || 0} assistant`);\n\t\tlines.push(`Tool calls: ${stats.toolCalls || 0}`);\n\n\t\tif (stats.tokens) {\n\t\t\tconst t = stats.tokens;\n\t\t\tlines.push(`\\nTokens: ${Math.round((t.total || 0) / 1000)}k total`);\n\t\t\tlines.push(` Input: ${Math.round((t.input || 0) / 1000)}k`);\n\t\t\tlines.push(` Output: ${Math.round((t.output || 0) / 1000)}k`);\n\t\t\tif (t.cacheRead) lines.push(` Cache read: ${Math.round(t.cacheRead / 1000)}k`);\n\t\t}\n\n\t\tif (stats.cost != null) {\n\t\t\tlines.push(`\\n๐Ÿ’ฐ Cost: $${stats.cost.toFixed(4)}`);\n\t\t}\n\n\t\tif (stats.contextUsage) {\n\t\t\tconst cu = stats.contextUsage;\n\t\t\tif (cu.percent != null) {\n\t\t\t\tlines.push(\n\t\t\t\t\t`\\n๐Ÿ“ Context: ${cu.percent}% (${Math.round((cu.tokens || 0) / 1000)}k / ${Math.round((cu.contextWindow || 0) / 1000)}k)`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tconst perf = await bridge.getPerformanceStats();\n\t\t\tconst models = (perf?.models ?? []).filter((model) => model.rolling.count >= 3);\n\t\t\tif (models.length > 0) {\n\t\t\t\tlines.push(\"\\nโšก *Performance:*\");\n\t\t\t\tconst arrows = { above: \"โ†‘\", below: \"โ†“\", stable: \"โ†’\" } as const;\n\t\t\t\tfor (const model of models) {\n\t\t\t\t\tconst deltaPercent =\n\t\t\t\t\t\tmodel.delta.direction === \"stable\" ? 0 : Math.round(Math.abs(model.delta.percentDelta));\n\t\t\t\t\tconst medianDelta =\n\t\t\t\t\t\tmodel.delta.recentCount >= 3 && model.delta.baselineCount >= 3\n\t\t\t\t\t\t\t? ` ยท ${deltaPercent}% ${arrows[model.delta.direction]} median [${model.delta.baselineCount}]`\n\t\t\t\t\t\t\t: \"\";\n\t\t\t\t\tlines.push(\n\t\t\t\t\t\t` ${model.provider}/${model.modelId}: ~${Math.round(model.rolling.median)} tok/s [${model.rolling.count}]${medianDelta}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tlog(`[CMD] /stats performance section error: ${e}`);\n\t\t}\n\n\t\tawait safeSend(ctx.api, chatId, lines.join(\"\\n\"));\n\t} catch (e) {\n\t\tlog(`[CMD] /stats error: ${e}`);\n\t\tawait safeSend(ctx.api, chatId, `โŒ Failed to get stats: ${e}`);\n\t}\n}\n\nexport async function cmdModel(ctx: Context, userState: UserState, args: string): Promise<void> {\n\tconst chatId = ctx.chat!.id;\n\tconst bridge = userState.bridge;\n\n\tif (!bridge?.isAlive) {\n\t\tawait safeSend(ctx.api, chatId, \"No active session.\");\n\t\treturn;\n\t}\n\n\ttry {\n\t\tif (!args.trim()) {\n\t\t\t// Show current model\n\t\t\tconst state = await bridge.getState();\n\t\t\tif (state?.model) {\n\t\t\t\tawait safeSend(ctx.api, chatId, `๐Ÿง  Current model: \\`${state.model.provider}/${state.model.id}\\``);\n\t\t\t} else {\n\t\t\t\tawait safeSend(ctx.api, chatId, \"๐Ÿง  No model set.\");\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Resolve pattern using the same logic as CLI/TUI\n\t\tconst pattern = args.trim();\n\t\tconst result = await bridge.resolveModel(pattern);\n\n\t\tif (!result) {\n\t\t\t// No match โ€” list available models grouped by provider\n\t\t\tconst models = await bridge.getAvailableModels();\n\t\t\tconst byProvider = new Map<string, string[]>();\n\t\t\tfor (const m of models as any[]) {\n\t\t\t\tconst list = byProvider.get(m.provider) || [];\n\t\t\t\tlist.push(m.id);\n\t\t\t\tbyProvider.set(m.provider, list);\n\t\t\t}\n\t\t\tconst lines = [`No model matching \"${pattern}\". Available:`];\n\t\t\tfor (const [provider, ids] of byProvider) {\n\t\t\t\tlines.push(`\\n*${provider}*:`);\n\t\t\t\tfor (const id of ids) {\n\t\t\t\t\tlines.push(` \\`${id}\\``);\n\t\t\t\t}\n\t\t\t}\n\t\t\tawait safeSend(ctx.api, chatId, lines.join(\"\\n\").slice(0, 4000));\n\t\t\treturn;\n\t\t}\n\n\t\tconst model = result.model as any;\n\t\tawait bridge.setModel(model.provider, model.id);\n\t\tconst warning = result.warning ? ` โš ๏ธ ${result.warning}` : \"\";\n\t\tawait safeSend(ctx.api, chatId, `๐Ÿง  Switched to \\`${model.provider}/${model.id}\\`${warning}`);\n\t} catch (e) {\n\t\tlog(`[CMD] /model error: ${e}`);\n\t\tawait safeSend(ctx.api, chatId, `โŒ ${e}`);\n\t}\n}\n\nexport async function cmdThinking(ctx: Context, userState: UserState, args: string): Promise<void> {\n\tconst chatId = ctx.chat!.id;\n\tconst bridge = userState.bridge;\n\n\tif (!bridge?.isAlive) {\n\t\tawait safeSend(ctx.api, chatId, \"No active session.\");\n\t\treturn;\n\t}\n\n\ttry {\n\t\tif (!args.trim()) {\n\t\t\tconst state = await bridge.getState();\n\t\t\tawait safeSend(ctx.api, chatId, `๐Ÿ’ญ Thinking level: \\`${state?.thinkingLevel || \"unknown\"}\\``);\n\t\t\treturn;\n\t\t}\n\n\t\tconst level = args.trim().toLowerCase();\n\t\tconst valid = [\"off\", \"minimal\", \"low\", \"medium\", \"high\"];\n\t\tif (!valid.includes(level)) {\n\t\t\tawait safeSend(ctx.api, chatId, `Invalid level. Options: ${valid.join(\", \")}`);\n\t\t\treturn;\n\t\t}\n\n\t\tawait bridge.setThinkingLevel(level);\n\t\tawait safeSend(ctx.api, chatId, `๐Ÿ’ญ Thinking level set to \\`${level}\\``);\n\t} catch (e) {\n\t\tlog(`[CMD] /thinking error: ${e}`);\n\t\tawait safeSend(ctx.api, chatId, `โŒ ${e}`);\n\t}\n}\n"]}
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG7C,wBAAsB,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBlF;AAED,wBAAsB,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAcjF;AAED,wBAAsB,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAoEhF;AAED,wBAAsB,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqD9F;AAED,wBAAsB,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BjG","sourcesContent":["/**\n * Agent slash commands: /compact, /agents, /stats, /model, /thinking\n */\n\nimport type { Context } from \"grammy\";\nimport type { UserState } from \"../types.js\";\nimport { log, safeSend } from \"../util/telegram.js\";\n\nexport async function cmdCompact(ctx: Context, userState: UserState): Promise<void> {\n\tconst chatId = ctx.chat!.id;\n\tconst bridge = userState.bridge;\n\n\tif (!bridge?.isAlive) {\n\t\tawait safeSend(ctx.api, chatId, \"No active session.\");\n\t\treturn;\n\t}\n\n\tawait safeSend(ctx.api, chatId, \"๐Ÿ—œ _Compacting context..._\");\n\ttry {\n\t\tconst result = await bridge.compact();\n\t\tif (result) {\n\t\t\tconst before = (result as any).tokensBefore || 0;\n\t\t\tawait safeSend(ctx.api, chatId, `โœ… Compacted (was ${Math.round(before / 1000)}k tokens)`);\n\t\t} else {\n\t\t\tawait safeSend(ctx.api, chatId, \"โœ… Compacted.\");\n\t\t}\n\t} catch (e) {\n\t\tlog(`[CMD] /compact error: ${e}`);\n\t\tawait safeSend(ctx.api, chatId, `โŒ Compaction failed: ${e}`);\n\t}\n}\n\nexport async function cmdAgents(ctx: Context, userState: UserState): Promise<void> {\n\tconst chatId = ctx.chat!.id;\n\n\tif (userState.backgroundAgents.size === 0) {\n\t\tawait safeSend(ctx.api, chatId, \"No background agents running.\");\n\t\treturn;\n\t}\n\n\tconst lines = [\"๐Ÿค– *Background Agents*:\\n\"];\n\tfor (const agent of userState.backgroundAgents.values()) {\n\t\tconst elapsed = Math.round((Date.now() - agent.startTime) / 1000);\n\t\tlines.push(`โ€ข *${agent.agentType}* (${elapsed}s)\\n ${agent.taskSummary.slice(0, 200)}`);\n\t}\n\tawait safeSend(ctx.api, chatId, lines.join(\"\\n\"));\n}\n\nexport async function cmdStats(ctx: Context, userState: UserState): Promise<void> {\n\tconst chatId = ctx.chat!.id;\n\tconst bridge = userState.bridge;\n\n\tif (!bridge?.isAlive) {\n\t\tawait safeSend(ctx.api, chatId, \"No active session.\");\n\t\treturn;\n\t}\n\n\ttry {\n\t\tconst stats = await bridge.getSessionStats();\n\t\tif (!stats) {\n\t\t\tawait safeSend(ctx.api, chatId, \"No stats available.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst lines = [\"๐Ÿ“Š *Session Stats*:\\n\"];\n\t\tlines.push(`Messages: ${stats.userMessages || 0} user, ${stats.assistantMessages || 0} assistant`);\n\t\tlines.push(`Tool calls: ${stats.toolCalls || 0}`);\n\n\t\tif (stats.tokens) {\n\t\t\tconst t = stats.tokens;\n\t\t\tlines.push(`\\nTokens: ${Math.round((t.total || 0) / 1000)}k total`);\n\t\t\tlines.push(` Input: ${Math.round((t.input || 0) / 1000)}k`);\n\t\t\tlines.push(` Output: ${Math.round((t.output || 0) / 1000)}k`);\n\t\t\tif (t.cacheRead) lines.push(` Cache read: ${Math.round(t.cacheRead / 1000)}k`);\n\t\t}\n\n\t\tif (stats.cost != null) {\n\t\t\tlines.push(`\\n๐Ÿ’ฐ Cost: $${stats.cost.toFixed(4)}`);\n\t\t}\n\n\t\tif (stats.contextUsage) {\n\t\t\tconst cu = stats.contextUsage;\n\t\t\tif (cu.percent != null) {\n\t\t\t\tlines.push(\n\t\t\t\t\t`\\n๐Ÿ“ Context: ${cu.percent}% (${Math.round((cu.tokens || 0) / 1000)}k / ${Math.round((cu.contextWindow || 0) / 1000)}k)`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tconst perf = await bridge.getPerformanceStats();\n\t\t\tconst models = (perf?.models ?? []).filter((model) => model.rolling.count >= 3);\n\t\t\tif (models.length > 0) {\n\t\t\t\tlines.push(\"\\nโšก *Performance:*\");\n\t\t\t\tconst arrows = { above: \"โ†‘\", below: \"โ†“\", stable: \"โ†’\" } as const;\n\t\t\t\tfor (const model of models) {\n\t\t\t\t\tconst deltaPercent =\n\t\t\t\t\t\tmodel.delta.direction === \"stable\" ? 0 : Math.round(Math.abs(model.delta.percentDelta));\n\t\t\t\t\tconst medianDelta =\n\t\t\t\t\t\tmodel.delta.recentCount >= 3 && model.delta.baselineCount >= 3\n\t\t\t\t\t\t\t? ` ยท ${deltaPercent}% ${arrows[model.delta.direction]} median [${model.delta.baselineCount}]`\n\t\t\t\t\t\t\t: \"\";\n\t\t\t\t\tlines.push(\n\t\t\t\t\t\t` ${model.provider}/${model.modelId}: ~${Math.round(model.rolling.median)} tok/s [${model.rolling.count}]${medianDelta}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tlog(`[CMD] /stats performance section error: ${e}`);\n\t\t}\n\n\t\tawait safeSend(ctx.api, chatId, lines.join(\"\\n\"));\n\t} catch (e) {\n\t\tlog(`[CMD] /stats error: ${e}`);\n\t\tawait safeSend(ctx.api, chatId, `โŒ Failed to get stats: ${e}`);\n\t}\n}\n\nexport async function cmdModel(ctx: Context, userState: UserState, args: string): Promise<void> {\n\tconst chatId = ctx.chat!.id;\n\tconst bridge = userState.bridge;\n\n\tif (!bridge?.isAlive) {\n\t\tawait safeSend(ctx.api, chatId, \"No active session.\");\n\t\treturn;\n\t}\n\n\ttry {\n\t\tif (!args.trim()) {\n\t\t\t// Show current model\n\t\t\tconst state = await bridge.getState();\n\t\t\tif (state?.model) {\n\t\t\t\tawait safeSend(ctx.api, chatId, `๐Ÿง  Current model: \\`${state.model.provider}/${state.model.id}\\``);\n\t\t\t} else {\n\t\t\t\tawait safeSend(ctx.api, chatId, \"๐Ÿง  No model set.\");\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Resolve pattern using the same logic as CLI/TUI\n\t\tconst pattern = args.trim();\n\t\tconst result = await bridge.resolveModel(pattern);\n\n\t\tif (!result) {\n\t\t\t// No match โ€” list available models grouped by provider\n\t\t\tconst models = await bridge.getAvailableModels();\n\t\t\tconst byProvider = new Map<string, string[]>();\n\t\t\tfor (const m of models as any[]) {\n\t\t\t\tconst list = byProvider.get(m.provider) || [];\n\t\t\t\tlist.push(m.id);\n\t\t\t\tbyProvider.set(m.provider, list);\n\t\t\t}\n\t\t\tconst lines = [`No model matching \"${pattern}\". Available:`];\n\t\t\tfor (const [provider, ids] of byProvider) {\n\t\t\t\tlines.push(`\\n*${provider}*:`);\n\t\t\t\tfor (const id of ids) {\n\t\t\t\t\tlines.push(` \\`${id}\\``);\n\t\t\t\t}\n\t\t\t}\n\t\t\tawait safeSend(ctx.api, chatId, lines.join(\"\\n\").slice(0, 4000));\n\t\t\treturn;\n\t\t}\n\n\t\tconst model = result.model as any;\n\t\tawait bridge.setModel(model.provider, model.id);\n\t\tconst warning = result.warning ? ` โš ๏ธ ${result.warning}` : \"\";\n\t\tawait safeSend(ctx.api, chatId, `๐Ÿง  Switched to \\`${model.provider}/${model.id}\\`${warning}`);\n\t} catch (e) {\n\t\tlog(`[CMD] /model error: ${e}`);\n\t\tawait safeSend(ctx.api, chatId, `โŒ ${e}`);\n\t}\n}\n\nexport async function cmdThinking(ctx: Context, userState: UserState, args: string): Promise<void> {\n\tconst chatId = ctx.chat!.id;\n\tconst bridge = userState.bridge;\n\n\tif (!bridge?.isAlive) {\n\t\tawait safeSend(ctx.api, chatId, \"No active session.\");\n\t\treturn;\n\t}\n\n\ttry {\n\t\tif (!args.trim()) {\n\t\t\tconst state = await bridge.getState();\n\t\t\tawait safeSend(ctx.api, chatId, `๐Ÿ’ญ Thinking level: \\`${state?.thinkingLevel || \"unknown\"}\\``);\n\t\t\treturn;\n\t\t}\n\n\t\tconst level = args.trim().toLowerCase();\n\t\tconst valid = [\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"];\n\t\tif (!valid.includes(level)) {\n\t\t\tawait safeSend(ctx.api, chatId, `Invalid level. Options: ${valid.join(\", \")}`);\n\t\t\treturn;\n\t\t}\n\n\t\tawait bridge.setThinkingLevel(level);\n\t\tawait safeSend(ctx.api, chatId, `๐Ÿ’ญ Thinking level set to \\`${level}\\``);\n\t} catch (e) {\n\t\tlog(`[CMD] /thinking error: ${e}`);\n\t\tawait safeSend(ctx.api, chatId, `โŒ ${e}`);\n\t}\n}\n"]}
@@ -161,7 +161,7 @@ export async function cmdThinking(ctx, userState, args) {
161
161
  return;
162
162
  }
163
163
  const level = args.trim().toLowerCase();
164
- const valid = ["off", "minimal", "low", "medium", "high"];
164
+ const valid = ["off", "minimal", "low", "medium", "high", "xhigh", "max"];
165
165
  if (!valid.includes(level)) {
166
166
  await safeSend(ctx.api, chatId, `Invalid level. Options: ${valid.join(", ")}`);
167
167
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Agent slash commands: /compact, /agents, /stats, /model, /thinking\n */\n\nimport type { Context } from \"grammy\";\nimport type { UserState } from \"../types.js\";\nimport { log, safeSend } from \"../util/telegram.js\";\n\nexport async function cmdCompact(ctx: Context, userState: UserState): Promise<void> {\n\tconst chatId = ctx.chat!.id;\n\tconst bridge = userState.bridge;\n\n\tif (!bridge?.isAlive) {\n\t\tawait safeSend(ctx.api, chatId, \"No active session.\");\n\t\treturn;\n\t}\n\n\tawait safeSend(ctx.api, chatId, \"๐Ÿ—œ _Compacting context..._\");\n\ttry {\n\t\tconst result = await bridge.compact();\n\t\tif (result) {\n\t\t\tconst before = (result as any).tokensBefore || 0;\n\t\t\tawait safeSend(ctx.api, chatId, `โœ… Compacted (was ${Math.round(before / 1000)}k tokens)`);\n\t\t} else {\n\t\t\tawait safeSend(ctx.api, chatId, \"โœ… Compacted.\");\n\t\t}\n\t} catch (e) {\n\t\tlog(`[CMD] /compact error: ${e}`);\n\t\tawait safeSend(ctx.api, chatId, `โŒ Compaction failed: ${e}`);\n\t}\n}\n\nexport async function cmdAgents(ctx: Context, userState: UserState): Promise<void> {\n\tconst chatId = ctx.chat!.id;\n\n\tif (userState.backgroundAgents.size === 0) {\n\t\tawait safeSend(ctx.api, chatId, \"No background agents running.\");\n\t\treturn;\n\t}\n\n\tconst lines = [\"๐Ÿค– *Background Agents*:\\n\"];\n\tfor (const agent of userState.backgroundAgents.values()) {\n\t\tconst elapsed = Math.round((Date.now() - agent.startTime) / 1000);\n\t\tlines.push(`โ€ข *${agent.agentType}* (${elapsed}s)\\n ${agent.taskSummary.slice(0, 200)}`);\n\t}\n\tawait safeSend(ctx.api, chatId, lines.join(\"\\n\"));\n}\n\nexport async function cmdStats(ctx: Context, userState: UserState): Promise<void> {\n\tconst chatId = ctx.chat!.id;\n\tconst bridge = userState.bridge;\n\n\tif (!bridge?.isAlive) {\n\t\tawait safeSend(ctx.api, chatId, \"No active session.\");\n\t\treturn;\n\t}\n\n\ttry {\n\t\tconst stats = await bridge.getSessionStats();\n\t\tif (!stats) {\n\t\t\tawait safeSend(ctx.api, chatId, \"No stats available.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst lines = [\"๐Ÿ“Š *Session Stats*:\\n\"];\n\t\tlines.push(`Messages: ${stats.userMessages || 0} user, ${stats.assistantMessages || 0} assistant`);\n\t\tlines.push(`Tool calls: ${stats.toolCalls || 0}`);\n\n\t\tif (stats.tokens) {\n\t\t\tconst t = stats.tokens;\n\t\t\tlines.push(`\\nTokens: ${Math.round((t.total || 0) / 1000)}k total`);\n\t\t\tlines.push(` Input: ${Math.round((t.input || 0) / 1000)}k`);\n\t\t\tlines.push(` Output: ${Math.round((t.output || 0) / 1000)}k`);\n\t\t\tif (t.cacheRead) lines.push(` Cache read: ${Math.round(t.cacheRead / 1000)}k`);\n\t\t}\n\n\t\tif (stats.cost != null) {\n\t\t\tlines.push(`\\n๐Ÿ’ฐ Cost: $${stats.cost.toFixed(4)}`);\n\t\t}\n\n\t\tif (stats.contextUsage) {\n\t\t\tconst cu = stats.contextUsage;\n\t\t\tif (cu.percent != null) {\n\t\t\t\tlines.push(\n\t\t\t\t\t`\\n๐Ÿ“ Context: ${cu.percent}% (${Math.round((cu.tokens || 0) / 1000)}k / ${Math.round((cu.contextWindow || 0) / 1000)}k)`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tconst perf = await bridge.getPerformanceStats();\n\t\t\tconst models = (perf?.models ?? []).filter((model) => model.rolling.count >= 3);\n\t\t\tif (models.length > 0) {\n\t\t\t\tlines.push(\"\\nโšก *Performance:*\");\n\t\t\t\tconst arrows = { above: \"โ†‘\", below: \"โ†“\", stable: \"โ†’\" } as const;\n\t\t\t\tfor (const model of models) {\n\t\t\t\t\tconst deltaPercent =\n\t\t\t\t\t\tmodel.delta.direction === \"stable\" ? 0 : Math.round(Math.abs(model.delta.percentDelta));\n\t\t\t\t\tconst medianDelta =\n\t\t\t\t\t\tmodel.delta.recentCount >= 3 && model.delta.baselineCount >= 3\n\t\t\t\t\t\t\t? ` ยท ${deltaPercent}% ${arrows[model.delta.direction]} median [${model.delta.baselineCount}]`\n\t\t\t\t\t\t\t: \"\";\n\t\t\t\t\tlines.push(\n\t\t\t\t\t\t` ${model.provider}/${model.modelId}: ~${Math.round(model.rolling.median)} tok/s [${model.rolling.count}]${medianDelta}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tlog(`[CMD] /stats performance section error: ${e}`);\n\t\t}\n\n\t\tawait safeSend(ctx.api, chatId, lines.join(\"\\n\"));\n\t} catch (e) {\n\t\tlog(`[CMD] /stats error: ${e}`);\n\t\tawait safeSend(ctx.api, chatId, `โŒ Failed to get stats: ${e}`);\n\t}\n}\n\nexport async function cmdModel(ctx: Context, userState: UserState, args: string): Promise<void> {\n\tconst chatId = ctx.chat!.id;\n\tconst bridge = userState.bridge;\n\n\tif (!bridge?.isAlive) {\n\t\tawait safeSend(ctx.api, chatId, \"No active session.\");\n\t\treturn;\n\t}\n\n\ttry {\n\t\tif (!args.trim()) {\n\t\t\t// Show current model\n\t\t\tconst state = await bridge.getState();\n\t\t\tif (state?.model) {\n\t\t\t\tawait safeSend(ctx.api, chatId, `๐Ÿง  Current model: \\`${state.model.provider}/${state.model.id}\\``);\n\t\t\t} else {\n\t\t\t\tawait safeSend(ctx.api, chatId, \"๐Ÿง  No model set.\");\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Resolve pattern using the same logic as CLI/TUI\n\t\tconst pattern = args.trim();\n\t\tconst result = await bridge.resolveModel(pattern);\n\n\t\tif (!result) {\n\t\t\t// No match โ€” list available models grouped by provider\n\t\t\tconst models = await bridge.getAvailableModels();\n\t\t\tconst byProvider = new Map<string, string[]>();\n\t\t\tfor (const m of models as any[]) {\n\t\t\t\tconst list = byProvider.get(m.provider) || [];\n\t\t\t\tlist.push(m.id);\n\t\t\t\tbyProvider.set(m.provider, list);\n\t\t\t}\n\t\t\tconst lines = [`No model matching \"${pattern}\". Available:`];\n\t\t\tfor (const [provider, ids] of byProvider) {\n\t\t\t\tlines.push(`\\n*${provider}*:`);\n\t\t\t\tfor (const id of ids) {\n\t\t\t\t\tlines.push(` \\`${id}\\``);\n\t\t\t\t}\n\t\t\t}\n\t\t\tawait safeSend(ctx.api, chatId, lines.join(\"\\n\").slice(0, 4000));\n\t\t\treturn;\n\t\t}\n\n\t\tconst model = result.model as any;\n\t\tawait bridge.setModel(model.provider, model.id);\n\t\tconst warning = result.warning ? ` โš ๏ธ ${result.warning}` : \"\";\n\t\tawait safeSend(ctx.api, chatId, `๐Ÿง  Switched to \\`${model.provider}/${model.id}\\`${warning}`);\n\t} catch (e) {\n\t\tlog(`[CMD] /model error: ${e}`);\n\t\tawait safeSend(ctx.api, chatId, `โŒ ${e}`);\n\t}\n}\n\nexport async function cmdThinking(ctx: Context, userState: UserState, args: string): Promise<void> {\n\tconst chatId = ctx.chat!.id;\n\tconst bridge = userState.bridge;\n\n\tif (!bridge?.isAlive) {\n\t\tawait safeSend(ctx.api, chatId, \"No active session.\");\n\t\treturn;\n\t}\n\n\ttry {\n\t\tif (!args.trim()) {\n\t\t\tconst state = await bridge.getState();\n\t\t\tawait safeSend(ctx.api, chatId, `๐Ÿ’ญ Thinking level: \\`${state?.thinkingLevel || \"unknown\"}\\``);\n\t\t\treturn;\n\t\t}\n\n\t\tconst level = args.trim().toLowerCase();\n\t\tconst valid = [\"off\", \"minimal\", \"low\", \"medium\", \"high\"];\n\t\tif (!valid.includes(level)) {\n\t\t\tawait safeSend(ctx.api, chatId, `Invalid level. Options: ${valid.join(\", \")}`);\n\t\t\treturn;\n\t\t}\n\n\t\tawait bridge.setThinkingLevel(level);\n\t\tawait safeSend(ctx.api, chatId, `๐Ÿ’ญ Thinking level set to \\`${level}\\``);\n\t} catch (e) {\n\t\tlog(`[CMD] /thinking error: ${e}`);\n\t\tawait safeSend(ctx.api, chatId, `โŒ ${e}`);\n\t}\n}\n"]}
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Agent slash commands: /compact, /agents, /stats, /model, /thinking\n */\n\nimport type { Context } from \"grammy\";\nimport type { UserState } from \"../types.js\";\nimport { log, safeSend } from \"../util/telegram.js\";\n\nexport async function cmdCompact(ctx: Context, userState: UserState): Promise<void> {\n\tconst chatId = ctx.chat!.id;\n\tconst bridge = userState.bridge;\n\n\tif (!bridge?.isAlive) {\n\t\tawait safeSend(ctx.api, chatId, \"No active session.\");\n\t\treturn;\n\t}\n\n\tawait safeSend(ctx.api, chatId, \"๐Ÿ—œ _Compacting context..._\");\n\ttry {\n\t\tconst result = await bridge.compact();\n\t\tif (result) {\n\t\t\tconst before = (result as any).tokensBefore || 0;\n\t\t\tawait safeSend(ctx.api, chatId, `โœ… Compacted (was ${Math.round(before / 1000)}k tokens)`);\n\t\t} else {\n\t\t\tawait safeSend(ctx.api, chatId, \"โœ… Compacted.\");\n\t\t}\n\t} catch (e) {\n\t\tlog(`[CMD] /compact error: ${e}`);\n\t\tawait safeSend(ctx.api, chatId, `โŒ Compaction failed: ${e}`);\n\t}\n}\n\nexport async function cmdAgents(ctx: Context, userState: UserState): Promise<void> {\n\tconst chatId = ctx.chat!.id;\n\n\tif (userState.backgroundAgents.size === 0) {\n\t\tawait safeSend(ctx.api, chatId, \"No background agents running.\");\n\t\treturn;\n\t}\n\n\tconst lines = [\"๐Ÿค– *Background Agents*:\\n\"];\n\tfor (const agent of userState.backgroundAgents.values()) {\n\t\tconst elapsed = Math.round((Date.now() - agent.startTime) / 1000);\n\t\tlines.push(`โ€ข *${agent.agentType}* (${elapsed}s)\\n ${agent.taskSummary.slice(0, 200)}`);\n\t}\n\tawait safeSend(ctx.api, chatId, lines.join(\"\\n\"));\n}\n\nexport async function cmdStats(ctx: Context, userState: UserState): Promise<void> {\n\tconst chatId = ctx.chat!.id;\n\tconst bridge = userState.bridge;\n\n\tif (!bridge?.isAlive) {\n\t\tawait safeSend(ctx.api, chatId, \"No active session.\");\n\t\treturn;\n\t}\n\n\ttry {\n\t\tconst stats = await bridge.getSessionStats();\n\t\tif (!stats) {\n\t\t\tawait safeSend(ctx.api, chatId, \"No stats available.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst lines = [\"๐Ÿ“Š *Session Stats*:\\n\"];\n\t\tlines.push(`Messages: ${stats.userMessages || 0} user, ${stats.assistantMessages || 0} assistant`);\n\t\tlines.push(`Tool calls: ${stats.toolCalls || 0}`);\n\n\t\tif (stats.tokens) {\n\t\t\tconst t = stats.tokens;\n\t\t\tlines.push(`\\nTokens: ${Math.round((t.total || 0) / 1000)}k total`);\n\t\t\tlines.push(` Input: ${Math.round((t.input || 0) / 1000)}k`);\n\t\t\tlines.push(` Output: ${Math.round((t.output || 0) / 1000)}k`);\n\t\t\tif (t.cacheRead) lines.push(` Cache read: ${Math.round(t.cacheRead / 1000)}k`);\n\t\t}\n\n\t\tif (stats.cost != null) {\n\t\t\tlines.push(`\\n๐Ÿ’ฐ Cost: $${stats.cost.toFixed(4)}`);\n\t\t}\n\n\t\tif (stats.contextUsage) {\n\t\t\tconst cu = stats.contextUsage;\n\t\t\tif (cu.percent != null) {\n\t\t\t\tlines.push(\n\t\t\t\t\t`\\n๐Ÿ“ Context: ${cu.percent}% (${Math.round((cu.tokens || 0) / 1000)}k / ${Math.round((cu.contextWindow || 0) / 1000)}k)`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tconst perf = await bridge.getPerformanceStats();\n\t\t\tconst models = (perf?.models ?? []).filter((model) => model.rolling.count >= 3);\n\t\t\tif (models.length > 0) {\n\t\t\t\tlines.push(\"\\nโšก *Performance:*\");\n\t\t\t\tconst arrows = { above: \"โ†‘\", below: \"โ†“\", stable: \"โ†’\" } as const;\n\t\t\t\tfor (const model of models) {\n\t\t\t\t\tconst deltaPercent =\n\t\t\t\t\t\tmodel.delta.direction === \"stable\" ? 0 : Math.round(Math.abs(model.delta.percentDelta));\n\t\t\t\t\tconst medianDelta =\n\t\t\t\t\t\tmodel.delta.recentCount >= 3 && model.delta.baselineCount >= 3\n\t\t\t\t\t\t\t? ` ยท ${deltaPercent}% ${arrows[model.delta.direction]} median [${model.delta.baselineCount}]`\n\t\t\t\t\t\t\t: \"\";\n\t\t\t\t\tlines.push(\n\t\t\t\t\t\t` ${model.provider}/${model.modelId}: ~${Math.round(model.rolling.median)} tok/s [${model.rolling.count}]${medianDelta}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tlog(`[CMD] /stats performance section error: ${e}`);\n\t\t}\n\n\t\tawait safeSend(ctx.api, chatId, lines.join(\"\\n\"));\n\t} catch (e) {\n\t\tlog(`[CMD] /stats error: ${e}`);\n\t\tawait safeSend(ctx.api, chatId, `โŒ Failed to get stats: ${e}`);\n\t}\n}\n\nexport async function cmdModel(ctx: Context, userState: UserState, args: string): Promise<void> {\n\tconst chatId = ctx.chat!.id;\n\tconst bridge = userState.bridge;\n\n\tif (!bridge?.isAlive) {\n\t\tawait safeSend(ctx.api, chatId, \"No active session.\");\n\t\treturn;\n\t}\n\n\ttry {\n\t\tif (!args.trim()) {\n\t\t\t// Show current model\n\t\t\tconst state = await bridge.getState();\n\t\t\tif (state?.model) {\n\t\t\t\tawait safeSend(ctx.api, chatId, `๐Ÿง  Current model: \\`${state.model.provider}/${state.model.id}\\``);\n\t\t\t} else {\n\t\t\t\tawait safeSend(ctx.api, chatId, \"๐Ÿง  No model set.\");\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Resolve pattern using the same logic as CLI/TUI\n\t\tconst pattern = args.trim();\n\t\tconst result = await bridge.resolveModel(pattern);\n\n\t\tif (!result) {\n\t\t\t// No match โ€” list available models grouped by provider\n\t\t\tconst models = await bridge.getAvailableModels();\n\t\t\tconst byProvider = new Map<string, string[]>();\n\t\t\tfor (const m of models as any[]) {\n\t\t\t\tconst list = byProvider.get(m.provider) || [];\n\t\t\t\tlist.push(m.id);\n\t\t\t\tbyProvider.set(m.provider, list);\n\t\t\t}\n\t\t\tconst lines = [`No model matching \"${pattern}\". Available:`];\n\t\t\tfor (const [provider, ids] of byProvider) {\n\t\t\t\tlines.push(`\\n*${provider}*:`);\n\t\t\t\tfor (const id of ids) {\n\t\t\t\t\tlines.push(` \\`${id}\\``);\n\t\t\t\t}\n\t\t\t}\n\t\t\tawait safeSend(ctx.api, chatId, lines.join(\"\\n\").slice(0, 4000));\n\t\t\treturn;\n\t\t}\n\n\t\tconst model = result.model as any;\n\t\tawait bridge.setModel(model.provider, model.id);\n\t\tconst warning = result.warning ? ` โš ๏ธ ${result.warning}` : \"\";\n\t\tawait safeSend(ctx.api, chatId, `๐Ÿง  Switched to \\`${model.provider}/${model.id}\\`${warning}`);\n\t} catch (e) {\n\t\tlog(`[CMD] /model error: ${e}`);\n\t\tawait safeSend(ctx.api, chatId, `โŒ ${e}`);\n\t}\n}\n\nexport async function cmdThinking(ctx: Context, userState: UserState, args: string): Promise<void> {\n\tconst chatId = ctx.chat!.id;\n\tconst bridge = userState.bridge;\n\n\tif (!bridge?.isAlive) {\n\t\tawait safeSend(ctx.api, chatId, \"No active session.\");\n\t\treturn;\n\t}\n\n\ttry {\n\t\tif (!args.trim()) {\n\t\t\tconst state = await bridge.getState();\n\t\t\tawait safeSend(ctx.api, chatId, `๐Ÿ’ญ Thinking level: \\`${state?.thinkingLevel || \"unknown\"}\\``);\n\t\t\treturn;\n\t\t}\n\n\t\tconst level = args.trim().toLowerCase();\n\t\tconst valid = [\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"];\n\t\tif (!valid.includes(level)) {\n\t\t\tawait safeSend(ctx.api, chatId, `Invalid level. Options: ${valid.join(\", \")}`);\n\t\t\treturn;\n\t\t}\n\n\t\tawait bridge.setThinkingLevel(level);\n\t\tawait safeSend(ctx.api, chatId, `๐Ÿ’ญ Thinking level set to \\`${level}\\``);\n\t} catch (e) {\n\t\tlog(`[CMD] /thinking error: ${e}`);\n\t\tawait safeSend(ctx.api, chatId, `โŒ ${e}`);\n\t}\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dreb/telegram",
3
- "version": "2.60.1",
3
+ "version": "2.61.1",
4
4
  "description": "Telegram bot frontend for dreb coding agent",
5
5
  "license": "MIT",
6
6
  "type": "module",