@4via6/relay 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/.env.example +50 -0
  2. package/README.md +253 -0
  3. package/dist/auth.d.ts +3 -0
  4. package/dist/auth.js +32 -0
  5. package/dist/auth.js.map +1 -0
  6. package/dist/bot.d.ts +2 -0
  7. package/dist/bot.js +14 -0
  8. package/dist/bot.js.map +1 -0
  9. package/dist/cli.d.ts +2 -0
  10. package/dist/cli.js +3 -0
  11. package/dist/cli.js.map +1 -0
  12. package/dist/commands/admin.d.ts +2 -0
  13. package/dist/commands/admin.js +420 -0
  14. package/dist/commands/admin.js.map +1 -0
  15. package/dist/commands/chat.d.ts +2 -0
  16. package/dist/commands/chat.js +80 -0
  17. package/dist/commands/chat.js.map +1 -0
  18. package/dist/commands/files.d.ts +2 -0
  19. package/dist/commands/files.js +162 -0
  20. package/dist/commands/files.js.map +1 -0
  21. package/dist/commands/history.d.ts +2 -0
  22. package/dist/commands/history.js +152 -0
  23. package/dist/commands/history.js.map +1 -0
  24. package/dist/commands/index.d.ts +2 -0
  25. package/dist/commands/index.js +21 -0
  26. package/dist/commands/index.js.map +1 -0
  27. package/dist/commands/mcp.d.ts +2 -0
  28. package/dist/commands/mcp.js +105 -0
  29. package/dist/commands/mcp.js.map +1 -0
  30. package/dist/commands/media.d.ts +2 -0
  31. package/dist/commands/media.js +248 -0
  32. package/dist/commands/media.js.map +1 -0
  33. package/dist/commands/monitor.d.ts +2 -0
  34. package/dist/commands/monitor.js +136 -0
  35. package/dist/commands/monitor.js.map +1 -0
  36. package/dist/commands/session.d.ts +2 -0
  37. package/dist/commands/session.js +114 -0
  38. package/dist/commands/session.js.map +1 -0
  39. package/dist/commands/shell.d.ts +2 -0
  40. package/dist/commands/shell.js +90 -0
  41. package/dist/commands/shell.js.map +1 -0
  42. package/dist/index.d.ts +1 -0
  43. package/dist/index.js +82 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/providers/claude.d.ts +52 -0
  46. package/dist/providers/claude.js +449 -0
  47. package/dist/providers/claude.js.map +1 -0
  48. package/dist/providers/codex.d.ts +45 -0
  49. package/dist/providers/codex.js +400 -0
  50. package/dist/providers/codex.js.map +1 -0
  51. package/dist/providers/index.d.ts +6 -0
  52. package/dist/providers/index.js +40 -0
  53. package/dist/providers/index.js.map +1 -0
  54. package/dist/providers/opencode.d.ts +40 -0
  55. package/dist/providers/opencode.js +498 -0
  56. package/dist/providers/opencode.js.map +1 -0
  57. package/dist/providers/types.d.ts +173 -0
  58. package/dist/providers/types.js +6 -0
  59. package/dist/providers/types.js.map +1 -0
  60. package/dist/session.d.ts +10 -0
  61. package/dist/session.js +65 -0
  62. package/dist/session.js.map +1 -0
  63. package/dist/utils/chunker.d.ts +1 -0
  64. package/dist/utils/chunker.js +24 -0
  65. package/dist/utils/chunker.js.map +1 -0
  66. package/dist/utils/errors.d.ts +12 -0
  67. package/dist/utils/errors.js +85 -0
  68. package/dist/utils/errors.js.map +1 -0
  69. package/dist/utils/files.d.ts +15 -0
  70. package/dist/utils/files.js +81 -0
  71. package/dist/utils/files.js.map +1 -0
  72. package/dist/utils/html.d.ts +4 -0
  73. package/dist/utils/html.js +10 -0
  74. package/dist/utils/html.js.map +1 -0
  75. package/dist/utils/media.d.ts +15 -0
  76. package/dist/utils/media.js +103 -0
  77. package/dist/utils/media.js.map +1 -0
  78. package/dist/utils/store.d.ts +15 -0
  79. package/dist/utils/store.js +44 -0
  80. package/dist/utils/store.js.map +1 -0
  81. package/dist/utils/stream.d.ts +21 -0
  82. package/dist/utils/stream.js +149 -0
  83. package/dist/utils/stream.js.map +1 -0
  84. package/dist/utils/stt.d.ts +7 -0
  85. package/dist/utils/stt.js +118 -0
  86. package/dist/utils/stt.js.map +1 -0
  87. package/dist/utils/system-prompt.d.ts +5 -0
  88. package/dist/utils/system-prompt.js +64 -0
  89. package/dist/utils/system-prompt.js.map +1 -0
  90. package/dist/utils/timeout.d.ts +2 -0
  91. package/dist/utils/timeout.js +18 -0
  92. package/dist/utils/timeout.js.map +1 -0
  93. package/docs/commands.md +351 -0
  94. package/docs/configuration.md +160 -0
  95. package/docs/features.md +443 -0
  96. package/docs/getting-started.md +102 -0
  97. package/docs/providers.md +236 -0
  98. package/docs/troubleshooting.md +287 -0
  99. package/package.json +54 -0
@@ -0,0 +1,162 @@
1
+ import { InputFile } from "grammy";
2
+ import { getProvider } from "../providers/index.js";
3
+ import { chunkMessage } from "../utils/chunker.js";
4
+ import { formatCatchError } from "../utils/errors.js";
5
+ export function registerFileCommands(bot) {
6
+ bot.command("read", async (ctx) => {
7
+ const filePath = ctx.match?.trim();
8
+ if (!filePath) {
9
+ await ctx.reply("Usage: /read <file-path>");
10
+ return;
11
+ }
12
+ try {
13
+ await ctx.replyWithChatAction("typing");
14
+ const provider = getProvider();
15
+ const content = await provider.readFile(filePath);
16
+ if (content === null) {
17
+ await ctx.reply(`File reading is not directly supported by the ${provider.name} provider.`);
18
+ return;
19
+ }
20
+ const header = `**${filePath}**\n\n`;
21
+ if (content.length > 15000) {
22
+ const buffer = Buffer.from(content, "utf-8");
23
+ const fileName = filePath.split("/").pop() ?? "file.txt";
24
+ await ctx.replyWithDocument(new InputFile(buffer, fileName));
25
+ return;
26
+ }
27
+ const formatted = header + "```\n" + content + "\n```";
28
+ const chunks = chunkMessage(formatted);
29
+ for (const chunk of chunks) {
30
+ try {
31
+ await ctx.reply(chunk, { parse_mode: "Markdown" });
32
+ }
33
+ catch {
34
+ await ctx.reply(chunk);
35
+ }
36
+ }
37
+ }
38
+ catch (err) {
39
+ await ctx.reply(formatCatchError(err, "reading file"), { parse_mode: "HTML" });
40
+ }
41
+ });
42
+ bot.command("search", async (ctx) => {
43
+ const pattern = ctx.match?.trim();
44
+ if (!pattern) {
45
+ await ctx.reply("Usage: /search <pattern>");
46
+ return;
47
+ }
48
+ try {
49
+ await ctx.replyWithChatAction("typing");
50
+ const provider = getProvider();
51
+ const matches = await provider.searchText(pattern);
52
+ if (matches === null) {
53
+ await ctx.reply(`Text search is not directly supported by the ${provider.name} provider.`);
54
+ return;
55
+ }
56
+ if (matches.length === 0) {
57
+ await ctx.reply(`No matches found for: ${pattern}`);
58
+ return;
59
+ }
60
+ const text = matches
61
+ .slice(0, 20)
62
+ .map((m) => `**${m.file}${m.line ? `:${m.line}` : ""}**\n\`${m.text ?? ""}\``)
63
+ .join("\n\n");
64
+ const header = `Found ${matches.length} match(es) for \`${pattern}\`:\n\n`;
65
+ const chunks = chunkMessage(header + text);
66
+ for (const chunk of chunks) {
67
+ try {
68
+ await ctx.reply(chunk, { parse_mode: "Markdown" });
69
+ }
70
+ catch {
71
+ await ctx.reply(chunk);
72
+ }
73
+ }
74
+ }
75
+ catch (err) {
76
+ await ctx.reply(formatCatchError(err, "searching files"), { parse_mode: "HTML" });
77
+ }
78
+ });
79
+ bot.command("find", async (ctx) => {
80
+ const query = ctx.match?.trim();
81
+ if (!query) {
82
+ await ctx.reply("Usage: /find <filename-pattern>");
83
+ return;
84
+ }
85
+ try {
86
+ await ctx.replyWithChatAction("typing");
87
+ const provider = getProvider();
88
+ const files = await provider.findFiles(query);
89
+ if (files === null) {
90
+ await ctx.reply(`File search is not directly supported by the ${provider.name} provider.`);
91
+ return;
92
+ }
93
+ if (files.length === 0) {
94
+ await ctx.reply(`No files found matching: ${query}`);
95
+ return;
96
+ }
97
+ const text = files.slice(0, 50).map((f) => `\`${f}\``).join("\n");
98
+ const header = `Found ${files.length} file(s) matching \`${query}\`:\n\n`;
99
+ const chunks = chunkMessage(header + text);
100
+ for (const chunk of chunks) {
101
+ try {
102
+ await ctx.reply(chunk, { parse_mode: "Markdown" });
103
+ }
104
+ catch {
105
+ await ctx.reply(chunk);
106
+ }
107
+ }
108
+ }
109
+ catch (err) {
110
+ await ctx.reply(formatCatchError(err, "finding files"), { parse_mode: "HTML" });
111
+ }
112
+ });
113
+ bot.command("symbols", async (ctx) => {
114
+ const query = ctx.match?.trim();
115
+ if (!query) {
116
+ await ctx.reply("Usage: /symbols <query>");
117
+ return;
118
+ }
119
+ try {
120
+ const provider = getProvider();
121
+ const symbols = await provider.findSymbols(query);
122
+ if (symbols === null) {
123
+ await ctx.reply(`Symbol search is not supported by the ${provider.name} provider.`);
124
+ return;
125
+ }
126
+ if (symbols.length === 0) {
127
+ await ctx.reply(`No symbols found for: ${query}`);
128
+ return;
129
+ }
130
+ const text = symbols
131
+ .slice(0, 30)
132
+ .map((s) => `\`${s.name}\` in \`${s.location?.path ?? "unknown"}\``)
133
+ .join("\n");
134
+ await ctx.reply(`Found ${symbols.length} symbol(s):\n\n${text}`, { parse_mode: "Markdown" });
135
+ }
136
+ catch (err) {
137
+ await ctx.reply(formatCatchError(err, "searching symbols"), { parse_mode: "HTML" });
138
+ }
139
+ });
140
+ bot.command("status", async (ctx) => {
141
+ try {
142
+ const provider = getProvider();
143
+ const files = await provider.getFileStatus();
144
+ if (files === null) {
145
+ await ctx.reply(`File status is not directly supported by the ${provider.name} provider.`);
146
+ return;
147
+ }
148
+ if (files.length === 0) {
149
+ await ctx.reply("No changed files (clean working tree).");
150
+ return;
151
+ }
152
+ const text = files
153
+ .map((f) => `\`${f.status}\` ${f.path}`)
154
+ .join("\n");
155
+ await ctx.reply(`**File status:**\n\n${text}`, { parse_mode: "Markdown" });
156
+ }
157
+ catch (err) {
158
+ await ctx.reply(formatCatchError(err, "fetching file status"), { parse_mode: "HTML" });
159
+ }
160
+ });
161
+ }
162
+ //# sourceMappingURL=files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/commands/files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { Bot } from "grammy";
2
+ export declare function registerHistoryCommands(bot: Bot): void;
@@ -0,0 +1,152 @@
1
+ import { getProvider } from "../providers/index.js";
2
+ import { getActiveSessionId } from "../session.js";
3
+ import { chunkMessage } from "../utils/chunker.js";
4
+ import { formatCatchError } from "../utils/errors.js";
5
+ export function registerHistoryCommands(bot) {
6
+ bot.command("history", async (ctx) => {
7
+ try {
8
+ const sessionId = getActiveSessionId();
9
+ if (!sessionId) {
10
+ await ctx.reply("No active session. Use /new to create one.");
11
+ return;
12
+ }
13
+ const provider = getProvider();
14
+ const messages = await provider.getHistory(sessionId);
15
+ if (!messages) {
16
+ await ctx.reply(`History is not supported by the ${provider.name} provider.`);
17
+ return;
18
+ }
19
+ if (messages.length === 0) {
20
+ await ctx.reply("No messages in this session.");
21
+ return;
22
+ }
23
+ const text = messages
24
+ .slice(-10)
25
+ .map((m) => {
26
+ const role = m.info?.role ?? m.role ?? "unknown";
27
+ const parts = m.parts ?? m.content ?? [];
28
+ const content = Array.isArray(parts)
29
+ ? parts
30
+ .filter((p) => p.type === "text")
31
+ .map((p) => p.text)
32
+ .join("\n")
33
+ .slice(0, 200)
34
+ : String(parts).slice(0, 200);
35
+ return `**${role}:** ${content || "(no text)"}`;
36
+ })
37
+ .join("\n\n---\n\n");
38
+ const header = `Last ${Math.min(messages.length, 10)} message(s):\n\n`;
39
+ const chunks = chunkMessage(header + text);
40
+ for (const chunk of chunks) {
41
+ try {
42
+ await ctx.reply(chunk, { parse_mode: "Markdown" });
43
+ }
44
+ catch {
45
+ await ctx.reply(chunk);
46
+ }
47
+ }
48
+ }
49
+ catch (err) {
50
+ await ctx.reply(formatCatchError(err, "fetching history"), { parse_mode: "HTML" });
51
+ }
52
+ });
53
+ bot.command("abort", async (ctx) => {
54
+ try {
55
+ const sessionId = getActiveSessionId();
56
+ if (!sessionId) {
57
+ await ctx.reply("No active session.");
58
+ return;
59
+ }
60
+ const provider = getProvider();
61
+ await provider.abort(sessionId);
62
+ await ctx.reply("Operation aborted.");
63
+ }
64
+ catch (err) {
65
+ await ctx.reply(formatCatchError(err, "aborting operation"), { parse_mode: "HTML" });
66
+ }
67
+ });
68
+ bot.command("share", async (ctx) => {
69
+ try {
70
+ const sessionId = getActiveSessionId();
71
+ if (!sessionId) {
72
+ await ctx.reply("No active session.");
73
+ return;
74
+ }
75
+ const provider = getProvider();
76
+ const shareUrl = await provider.share(sessionId);
77
+ if (shareUrl) {
78
+ await ctx.reply(`Session shared: ${shareUrl}`);
79
+ }
80
+ else if (shareUrl === null) {
81
+ await ctx.reply(`Sharing is not supported by the ${provider.name} provider.`);
82
+ }
83
+ else {
84
+ await ctx.reply("Session shared successfully.");
85
+ }
86
+ }
87
+ catch (err) {
88
+ await ctx.reply(formatCatchError(err, "sharing session"), { parse_mode: "HTML" });
89
+ }
90
+ });
91
+ bot.command("revert", async (ctx) => {
92
+ try {
93
+ const sessionId = getActiveSessionId();
94
+ if (!sessionId) {
95
+ await ctx.reply("No active session.");
96
+ return;
97
+ }
98
+ const provider = getProvider();
99
+ const reverted = await provider.revert(sessionId);
100
+ if (!reverted) {
101
+ await ctx.reply(provider.name === "opencode"
102
+ ? "No assistant message to revert."
103
+ : `Revert is not supported by the ${provider.name} provider.`);
104
+ return;
105
+ }
106
+ await ctx.reply("Last change reverted.");
107
+ }
108
+ catch (err) {
109
+ await ctx.reply(formatCatchError(err, "reverting change"), { parse_mode: "HTML" });
110
+ }
111
+ });
112
+ bot.command("unrevert", async (ctx) => {
113
+ try {
114
+ const sessionId = getActiveSessionId();
115
+ if (!sessionId) {
116
+ await ctx.reply("No active session.");
117
+ return;
118
+ }
119
+ const provider = getProvider();
120
+ const ok = await provider.unrevert(sessionId);
121
+ if (!ok) {
122
+ await ctx.reply(`Unrevert is not supported by the ${provider.name} provider.`);
123
+ return;
124
+ }
125
+ await ctx.reply("Revert undone.");
126
+ }
127
+ catch (err) {
128
+ await ctx.reply(formatCatchError(err, "undoing revert"), { parse_mode: "HTML" });
129
+ }
130
+ });
131
+ bot.command("summarize", async (ctx) => {
132
+ try {
133
+ const sessionId = getActiveSessionId();
134
+ if (!sessionId) {
135
+ await ctx.reply("No active session.");
136
+ return;
137
+ }
138
+ await ctx.replyWithChatAction("typing");
139
+ const provider = getProvider();
140
+ const ok = await provider.summarize(sessionId);
141
+ if (!ok) {
142
+ await ctx.reply(`Summarize is not supported by the ${provider.name} provider.`);
143
+ return;
144
+ }
145
+ await ctx.reply("Session summarized.");
146
+ }
147
+ catch (err) {
148
+ await ctx.reply(formatCatchError(err, "summarizing session"), { parse_mode: "HTML" });
149
+ }
150
+ });
151
+ }
152
+ //# sourceMappingURL=history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/commands/history.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,MAAM,UAAU,uBAAuB,CAAC,GAAQ;IAC9C,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACnC,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,kBAAkB,EAAE,CAAC;YACvC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,GAAG,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;gBAC9D,OAAO;YACT,CAAC;YAED,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;YAC/B,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YAEtD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,GAAG,CAAC,KAAK,CACb,mCAAmC,QAAQ,CAAC,IAAI,YAAY,CAC7D,CAAC;gBACF,OAAO;YACT,CAAC;YAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,MAAM,GAAG,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;gBAChD,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,QAAQ;iBAClB,KAAK,CAAC,CAAC,EAAE,CAAC;iBACV,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE;gBACd,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,SAAS,CAAC;gBACjD,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC;gBACzC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;oBAClC,CAAC,CAAC,KAAK;yBACF,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;yBACrC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;yBACvB,IAAI,CAAC,IAAI,CAAC;yBACV,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;oBAClB,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;gBAChC,OAAO,KAAK,IAAI,OAAO,OAAO,IAAI,WAAW,EAAE,CAAC;YAClD,CAAC,CAAC;iBACD,IAAI,CAAC,aAAa,CAAC,CAAC;YAEvB,MAAM,MAAM,GAAG,QAAQ,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,kBAAkB,CAAC;YACvE,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;YAC3C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,IAAI,CAAC;oBACH,MAAM,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC;gBACrD,CAAC;gBAAC,MAAM,CAAC;oBACP,MAAM,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,MAAM,GAAG,CAAC,KAAK,CAAC,gBAAgB,CAAC,GAAG,EAAE,kBAAkB,CAAC,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;QACrF,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACjC,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,kBAAkB,EAAE,CAAC;YACvC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,GAAG,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;gBACtC,OAAO;YACT,CAAC;YAED,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;YAC/B,MAAM,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAChC,MAAM,GAAG,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,MAAM,GAAG,CAAC,KAAK,CAAC,gBAAgB,CAAC,GAAG,EAAE,oBAAoB,CAAC,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;QACvF,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACjC,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,kBAAkB,EAAE,CAAC;YACvC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,GAAG,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;gBACtC,OAAO;YACT,CAAC;YAED,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;YAC/B,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAEjD,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,GAAG,CAAC,KAAK,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;YACjD,CAAC;iBAAM,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;gBAC7B,MAAM,GAAG,CAAC,KAAK,CACb,mCAAmC,QAAQ,CAAC,IAAI,YAAY,CAC7D,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,MAAM,GAAG,CAAC,KAAK,CAAC,gBAAgB,CAAC,GAAG,EAAE,iBAAiB,CAAC,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;QACpF,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAClC,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,kBAAkB,EAAE,CAAC;YACvC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,GAAG,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;gBACtC,OAAO;YACT,CAAC;YAED,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;YAC/B,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAElD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,GAAG,CAAC,KAAK,CACb,QAAQ,CAAC,IAAI,KAAK,UAAU;oBAC1B,CAAC,CAAC,iCAAiC;oBACnC,CAAC,CAAC,kCAAkC,QAAQ,CAAC,IAAI,YAAY,CAChE,CAAC;gBACF,OAAO;YACT,CAAC;YAED,MAAM,GAAG,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,MAAM,GAAG,CAAC,KAAK,CAAC,gBAAgB,CAAC,GAAG,EAAE,kBAAkB,CAAC,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;QACrF,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACpC,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,kBAAkB,EAAE,CAAC;YACvC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,GAAG,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;gBACtC,OAAO;YACT,CAAC;YAED,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;YAC/B,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YAE9C,IAAI,CAAC,EAAE,EAAE,CAAC;gBACR,MAAM,GAAG,CAAC,KAAK,CACb,oCAAoC,QAAQ,CAAC,IAAI,YAAY,CAC9D,CAAC;gBACF,OAAO;YACT,CAAC;YAED,MAAM,GAAG,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,MAAM,GAAG,CAAC,KAAK,CAAC,gBAAgB,CAAC,GAAG,EAAE,gBAAgB,CAAC,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;QACnF,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACrC,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,kBAAkB,EAAE,CAAC;YACvC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,GAAG,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;gBACtC,OAAO;YACT,CAAC;YAED,MAAM,GAAG,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YACxC,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;YAC/B,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAE/C,IAAI,CAAC,EAAE,EAAE,CAAC;gBACR,MAAM,GAAG,CAAC,KAAK,CACb,qCAAqC,QAAQ,CAAC,IAAI,YAAY,CAC/D,CAAC;gBACF,OAAO;YACT,CAAC;YAED,MAAM,GAAG,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,MAAM,GAAG,CAAC,KAAK,CAAC,gBAAgB,CAAC,GAAG,EAAE,qBAAqB,CAAC,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;QACxF,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Bot } from "grammy";
2
+ export declare function registerCommands(bot: Bot): void;
@@ -0,0 +1,21 @@
1
+ import { registerSessionCommands } from "./session.js";
2
+ import { registerMonitorCommands } from "./monitor.js";
3
+ import { registerFileCommands } from "./files.js";
4
+ import { registerShellCommands } from "./shell.js";
5
+ import { registerAdminCommands } from "./admin.js";
6
+ import { registerHistoryCommands } from "./history.js";
7
+ import { registerMediaHandlers } from "./media.js";
8
+ import { registerChat } from "./chat.js";
9
+ import { registerMcpCommands } from "./mcp.js";
10
+ export function registerCommands(bot) {
11
+ registerAdminCommands(bot);
12
+ registerSessionCommands(bot);
13
+ registerMonitorCommands(bot);
14
+ registerFileCommands(bot);
15
+ registerShellCommands(bot);
16
+ registerHistoryCommands(bot);
17
+ registerMcpCommands(bot);
18
+ registerMediaHandlers(bot);
19
+ registerChat(bot);
20
+ }
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAE/C,MAAM,UAAU,gBAAgB,CAAC,GAAQ;IACvC,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAC3B,uBAAuB,CAAC,GAAG,CAAC,CAAC;IAC7B,uBAAuB,CAAC,GAAG,CAAC,CAAC;IAC7B,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAC1B,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAC3B,uBAAuB,CAAC,GAAG,CAAC,CAAC;IAC7B,mBAAmB,CAAC,GAAG,CAAC,CAAC;IACzB,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAC3B,YAAY,CAAC,GAAG,CAAC,CAAC;AACpB,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Bot } from "grammy";
2
+ export declare function registerMcpCommands(bot: Bot): void;
@@ -0,0 +1,105 @@
1
+ import { getProvider } from "../providers/index.js";
2
+ import { formatCatchError } from "../utils/errors.js";
3
+ import { escapeHtml } from "../utils/html.js";
4
+ export function registerMcpCommands(bot) {
5
+ bot.command("mcp", async (ctx) => {
6
+ const provider = getProvider();
7
+ if (!provider.capabilities.mcp) {
8
+ await ctx.reply(`MCP management is not supported by the ${provider.name} provider.`);
9
+ return;
10
+ }
11
+ const input = ctx.match?.trim() ?? "";
12
+ // /mcp add <name> local <command...>
13
+ // /mcp add <name> remote <url>
14
+ if (input.startsWith("add ")) {
15
+ await handleMcpAdd(ctx, input.slice(4).trim());
16
+ return;
17
+ }
18
+ // /mcp remove <name>
19
+ if (input.startsWith("remove ")) {
20
+ await handleMcpRemove(ctx, input.slice(7).trim());
21
+ return;
22
+ }
23
+ // /mcp — show status
24
+ await handleMcpStatus(ctx);
25
+ });
26
+ }
27
+ async function handleMcpStatus(ctx) {
28
+ try {
29
+ const provider = getProvider();
30
+ const servers = await provider.getMcpStatus();
31
+ if (servers === null) {
32
+ await ctx.reply("MCP status is not available.");
33
+ return;
34
+ }
35
+ if (servers.length === 0) {
36
+ await ctx.reply(`<b>MCP Servers</b>\n\nNo MCP servers configured.\n\n` +
37
+ `<i>Use /mcp add &lt;name&gt; local &lt;command&gt; or /mcp add &lt;name&gt; remote &lt;url&gt;</i>`, { parse_mode: "HTML" });
38
+ return;
39
+ }
40
+ let text = `<b>MCP Servers</b> (${servers.length})\n\n`;
41
+ for (const srv of servers) {
42
+ const statusIcon = srv.status === "connected" ? "ok" : srv.status;
43
+ text += `<code>${escapeHtml(srv.name)}</code> ${statusIcon}`;
44
+ if (srv.error) {
45
+ text += `\n <i>${escapeHtml(srv.error)}</i>`;
46
+ }
47
+ text += "\n";
48
+ }
49
+ await ctx.reply(text, { parse_mode: "HTML" });
50
+ }
51
+ catch (err) {
52
+ await ctx.reply(formatCatchError(err, "checking MCP status"), { parse_mode: "HTML" });
53
+ }
54
+ }
55
+ async function handleMcpAdd(ctx, input) {
56
+ // Parse: <name> local <command...> or <name> remote <url>
57
+ const parts = input.split(/\s+/);
58
+ if (parts.length < 3) {
59
+ await ctx.reply(`<b>Usage:</b>\n` +
60
+ `<code>/mcp add name local npx -y @modelcontextprotocol/server-x</code>\n` +
61
+ `<code>/mcp add name remote https://mcp.example.com</code>`, { parse_mode: "HTML" });
62
+ return;
63
+ }
64
+ const name = parts[0];
65
+ const type = parts[1];
66
+ try {
67
+ const provider = getProvider();
68
+ if (type === "local") {
69
+ const command = parts.slice(2);
70
+ await provider.addMcpServer(name, { type: "local", command });
71
+ await ctx.reply(`MCP server <code>${escapeHtml(name)}</code> added (local: <code>${escapeHtml(command.join(" "))}</code>)`, { parse_mode: "HTML" });
72
+ }
73
+ else if (type === "remote") {
74
+ const url = parts[2];
75
+ await provider.addMcpServer(name, { type: "remote", url });
76
+ await ctx.reply(`MCP server <code>${escapeHtml(name)}</code> added (remote: <code>${escapeHtml(url)}</code>)`, { parse_mode: "HTML" });
77
+ }
78
+ else {
79
+ await ctx.reply(`Unknown MCP type: ${escapeHtml(type)}. Use "local" or "remote".`, { parse_mode: "HTML" });
80
+ }
81
+ }
82
+ catch (err) {
83
+ await ctx.reply(formatCatchError(err, "adding MCP server"), { parse_mode: "HTML" });
84
+ }
85
+ }
86
+ async function handleMcpRemove(ctx, name) {
87
+ if (!name) {
88
+ await ctx.reply(`<b>Usage:</b> <code>/mcp remove name</code>`, { parse_mode: "HTML" });
89
+ return;
90
+ }
91
+ try {
92
+ const provider = getProvider();
93
+ const removed = await provider.removeMcpServer(name);
94
+ if (removed) {
95
+ await ctx.reply(`MCP server <code>${escapeHtml(name)}</code> removed.`, { parse_mode: "HTML" });
96
+ }
97
+ else {
98
+ await ctx.reply(`Could not remove MCP server <code>${escapeHtml(name)}</code>.`, { parse_mode: "HTML" });
99
+ }
100
+ }
101
+ catch (err) {
102
+ await ctx.reply(formatCatchError(err, "removing MCP server"), { parse_mode: "HTML" });
103
+ }
104
+ }
105
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { Bot } from "grammy";
2
+ export declare function registerMediaHandlers(bot: Bot): void;