@wirecat/tg-cli 0.0.0 → 0.43.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.
- package/LICENSE +204 -0
- package/README.md +527 -0
- package/THIRD_PARTY_NOTICES +55 -0
- package/dist/app.d.ts +11 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +16 -0
- package/dist/app.js.map +1 -0
- package/dist/bin/tg.d.ts +3 -0
- package/dist/bin/tg.d.ts.map +1 -0
- package/dist/bin/tg.js +18 -0
- package/dist/bin/tg.js.map +1 -0
- package/dist/bot/adapter.d.ts +9 -0
- package/dist/bot/adapter.d.ts.map +1 -0
- package/dist/bot/adapter.js +171 -0
- package/dist/bot/adapter.js.map +1 -0
- package/dist/bot/generated/definitions.d.ts +3 -0
- package/dist/bot/generated/definitions.d.ts.map +1 -0
- package/dist/bot/generated/definitions.js +19104 -0
- package/dist/bot/generated/definitions.js.map +1 -0
- package/dist/bot/generated/manifest.d.ts +3 -0
- package/dist/bot/generated/manifest.d.ts.map +1 -0
- package/dist/bot/generated/manifest.js +15354 -0
- package/dist/bot/generated/manifest.js.map +1 -0
- package/dist/bot/generated/schemas.d.ts +1407 -0
- package/dist/bot/generated/schemas.d.ts.map +1 -0
- package/dist/bot/generated/schemas.js +5118 -0
- package/dist/bot/generated/schemas.js.map +1 -0
- package/dist/bot/generated/types.d.ts +6884 -0
- package/dist/bot/generated/types.d.ts.map +1 -0
- package/dist/bot/generated/types.js +5 -0
- package/dist/bot/generated/types.js.map +1 -0
- package/dist/bot/map.d.ts +122 -0
- package/dist/bot/map.d.ts.map +1 -0
- package/dist/bot/map.js +193 -0
- package/dist/bot/map.js.map +1 -0
- package/dist/bot/proxy.d.ts +15 -0
- package/dist/bot/proxy.d.ts.map +1 -0
- package/dist/bot/proxy.js +64 -0
- package/dist/bot/proxy.js.map +1 -0
- package/dist/bot/transport.d.ts +42 -0
- package/dist/bot/transport.d.ts.map +1 -0
- package/dist/bot/transport.js +158 -0
- package/dist/bot/transport.js.map +1 -0
- package/dist/browser.d.ts +6 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +18 -0
- package/dist/browser.js.map +1 -0
- package/dist/commands/bot-api.d.ts +3 -0
- package/dist/commands/bot-api.d.ts.map +1 -0
- package/dist/commands/bot-api.js +112 -0
- package/dist/commands/bot-api.js.map +1 -0
- package/dist/commands/bot.d.ts +7 -0
- package/dist/commands/bot.d.ts.map +1 -0
- package/dist/commands/bot.js +99 -0
- package/dist/commands/bot.js.map +1 -0
- package/dist/commands/context.d.ts +59 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +176 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/proxy-config.d.ts +9 -0
- package/dist/commands/proxy-config.d.ts.map +1 -0
- package/dist/commands/proxy-config.js +63 -0
- package/dist/commands/proxy-config.js.map +1 -0
- package/dist/commands/session.d.ts +22 -0
- package/dist/commands/session.d.ts.map +1 -0
- package/dist/commands/session.js +191 -0
- package/dist/commands/session.js.map +1 -0
- package/dist/commands/setup.d.ts +3 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +203 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/update.d.ts +2 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +35 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/install/postinstall.d.ts +8 -0
- package/dist/install/postinstall.d.ts.map +1 -0
- package/dist/install/postinstall.js +62 -0
- package/dist/install/postinstall.js.map +1 -0
- package/dist/paths.d.ts +9 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +11 -0
- package/dist/paths.js.map +1 -0
- package/dist/program.d.ts +8 -0
- package/dist/program.d.ts.map +1 -0
- package/dist/program.js +138 -0
- package/dist/program.js.map +1 -0
- package/dist/proxy.d.ts +31 -0
- package/dist/proxy.d.ts.map +1 -0
- package/dist/proxy.js +99 -0
- package/dist/proxy.js.map +1 -0
- package/dist/telegram/adapter.d.ts +432 -0
- package/dist/telegram/adapter.d.ts.map +1 -0
- package/dist/telegram/adapter.js +1898 -0
- package/dist/telegram/adapter.js.map +1 -0
- package/dist/telegram/bot-history.d.ts +18 -0
- package/dist/telegram/bot-history.d.ts.map +1 -0
- package/dist/telegram/bot-history.js +145 -0
- package/dist/telegram/bot-history.js.map +1 -0
- package/dist/telegram/comments.d.ts +18 -0
- package/dist/telegram/comments.d.ts.map +1 -0
- package/dist/telegram/comments.js +48 -0
- package/dist/telegram/comments.js.map +1 -0
- package/dist/telegram/credentials.d.ts +22 -0
- package/dist/telegram/credentials.d.ts.map +1 -0
- package/dist/telegram/credentials.js +49 -0
- package/dist/telegram/credentials.js.map +1 -0
- package/dist/telegram/errors.d.ts +6 -0
- package/dist/telegram/errors.d.ts.map +1 -0
- package/dist/telegram/errors.js +186 -0
- package/dist/telegram/errors.js.map +1 -0
- package/dist/telegram/folder-rules.d.ts +14 -0
- package/dist/telegram/folder-rules.d.ts.map +1 -0
- package/dist/telegram/folder-rules.js +23 -0
- package/dist/telegram/folder-rules.js.map +1 -0
- package/dist/telegram/format-html.d.ts +4 -0
- package/dist/telegram/format-html.d.ts.map +1 -0
- package/dist/telegram/format-html.js +29 -0
- package/dist/telegram/format-html.js.map +1 -0
- package/dist/telegram/format-markdown.d.ts +3 -0
- package/dist/telegram/format-markdown.d.ts.map +1 -0
- package/dist/telegram/format-markdown.js +160 -0
- package/dist/telegram/format-markdown.js.map +1 -0
- package/dist/telegram/join-requests.d.ts +15 -0
- package/dist/telegram/join-requests.d.ts.map +1 -0
- package/dist/telegram/join-requests.js +35 -0
- package/dist/telegram/join-requests.js.map +1 -0
- package/dist/telegram/map.d.ts +92 -0
- package/dist/telegram/map.d.ts.map +1 -0
- package/dist/telegram/map.js +471 -0
- package/dist/telegram/map.js.map +1 -0
- package/dist/telegram/poll-voters.d.ts +15 -0
- package/dist/telegram/poll-voters.d.ts.map +1 -0
- package/dist/telegram/poll-voters.js +31 -0
- package/dist/telegram/poll-voters.js.map +1 -0
- package/dist/telegram/polls.d.ts +5 -0
- package/dist/telegram/polls.d.ts.map +1 -0
- package/dist/telegram/polls.js +20 -0
- package/dist/telegram/polls.js.map +1 -0
- package/dist/telegram/profile.d.ts +9 -0
- package/dist/telegram/profile.d.ts.map +1 -0
- package/dist/telegram/profile.js +175 -0
- package/dist/telegram/profile.js.map +1 -0
- package/dist/telegram/proxy.d.ts +48 -0
- package/dist/telegram/proxy.d.ts.map +1 -0
- package/dist/telegram/proxy.js +108 -0
- package/dist/telegram/proxy.js.map +1 -0
- package/dist/telegram/registration.d.ts +31 -0
- package/dist/telegram/registration.d.ts.map +1 -0
- package/dist/telegram/registration.js +95 -0
- package/dist/telegram/registration.js.map +1 -0
- package/dist/telegram/send-as.d.ts +17 -0
- package/dist/telegram/send-as.d.ts.map +1 -0
- package/dist/telegram/send-as.js +67 -0
- package/dist/telegram/send-as.js.map +1 -0
- package/dist/telegram/stats.d.ts +13 -0
- package/dist/telegram/stats.d.ts.map +1 -0
- package/dist/telegram/stats.js +135 -0
- package/dist/telegram/stats.js.map +1 -0
- package/dist/telegram/storage.d.ts +4 -0
- package/dist/telegram/storage.d.ts.map +1 -0
- package/dist/telegram/storage.js +68 -0
- package/dist/telegram/storage.js.map +1 -0
- package/dist/telegram/upload.d.ts +9 -0
- package/dist/telegram/upload.d.ts.map +1 -0
- package/dist/telegram/upload.js +29 -0
- package/dist/telegram/upload.js.map +1 -0
- package/dist/update.d.ts +28 -0
- package/dist/update.d.ts.map +1 -0
- package/dist/update.js +56 -0
- package/dist/update.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- package/install/postinstall.mjs +3 -0
- package/install/windows.ps1 +161 -0
- package/package.json +72 -3
- package/skills/tg-cli/SKILL.md +489 -0
- package/spec/bot/LICENSE +21 -0
- package/spec/bot/README.md +16 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { readFileSync, statSync } from "node:fs";
|
|
2
|
+
import { basename } from "node:path";
|
|
3
|
+
import { CliError } from "@wirecat/cli-core";
|
|
4
|
+
import { apiPlainJson, BotTokenStore, botContext, ChatRegistry, checkApiBody, checkApiParameter, generatedApiCommand, prepareRpcApiBody, } from "@wirecat/cli-messaging/cli";
|
|
5
|
+
import { DEFAULT_PERMISSIONS, guardedWrite, levelFor, newOperationId } from "@wirecat/cli-messaging/sends";
|
|
6
|
+
import { definitions } from "../bot/generated/definitions.js";
|
|
7
|
+
import { operations } from "../bot/generated/manifest.js";
|
|
8
|
+
import { schemas } from "../bot/generated/schemas.js";
|
|
9
|
+
import { TELEGRAM_BOT } from "./bot.js";
|
|
10
|
+
const defaults = {
|
|
11
|
+
...DEFAULT_PERMISSIONS,
|
|
12
|
+
...Object.fromEntries(operations
|
|
13
|
+
.filter((operation) => operation.effect === "destructive")
|
|
14
|
+
.map((operation) => [`bot.api.${operation.command}`, "ask"])),
|
|
15
|
+
};
|
|
16
|
+
const keyOf = (operation) => `bot.api.${operation.command}`;
|
|
17
|
+
const contextOf = (command) => botContext(command.parent ?? command, TELEGRAM_BOT);
|
|
18
|
+
export const telegramBotApiCommand = () => generatedApiCommand({
|
|
19
|
+
operations,
|
|
20
|
+
checkParameter: (name, schema, raw) => checkApiParameter(name, schema, raw, schemas),
|
|
21
|
+
before: (command, operation) => {
|
|
22
|
+
const context = contextOf(command);
|
|
23
|
+
if (context.settings.offline)
|
|
24
|
+
throw new CliError("validation_error", "bot api needs the messenger; --offline reads only the local copy");
|
|
25
|
+
const { level } = levelFor(context.settings.permissions, keyOf(operation), defaults);
|
|
26
|
+
if (level === "deny" || (operation.effect !== "read" && level === "readonly"))
|
|
27
|
+
throw new CliError("permission_error", "this bot API operation is not allowed by this profile's permissions");
|
|
28
|
+
},
|
|
29
|
+
execute: async (command, operation, input) => {
|
|
30
|
+
const context = contextOf(command);
|
|
31
|
+
const prepared = prepareRpcApiBody(operation, input, definitions);
|
|
32
|
+
checkApiBody(operation, prepared.text, schemas);
|
|
33
|
+
if (prepared.secrets.length && input.bodySource === "file" && process.platform !== "win32") {
|
|
34
|
+
const path = command.opts().bodyFile;
|
|
35
|
+
if (!path || (statSync(path).mode & 0o077) !== 0)
|
|
36
|
+
throw new CliError("validation_error", "a request containing credentials needs a file readable only by its owner, or stdin");
|
|
37
|
+
}
|
|
38
|
+
await context.run(async (events) => {
|
|
39
|
+
const adapter = await context.authenticated({ events });
|
|
40
|
+
try {
|
|
41
|
+
if (!adapter.api)
|
|
42
|
+
throw new CliError("configuration_error", "the bot adapter has no native API transport");
|
|
43
|
+
let target;
|
|
44
|
+
if (operation.response?.sensitive) {
|
|
45
|
+
const profile = input.tokenProfile;
|
|
46
|
+
const id = String(prepared.value.user_id ?? "");
|
|
47
|
+
if (!profile || !/^\d+$/.test(id))
|
|
48
|
+
throw new CliError("validation_error", "a credential destination and managed bot id are required");
|
|
49
|
+
const tokens = TELEGRAM_BOT.tokenStore?.(command, profile) ??
|
|
50
|
+
new BotTokenStore({ app: TELEGRAM_BOT.app, profile, env: context.env });
|
|
51
|
+
const registry = new ChatRegistry(TELEGRAM_BOT.app, profile, context.env);
|
|
52
|
+
const oldToken = tokens.readStored()?.secret;
|
|
53
|
+
const knownId = registry.botId();
|
|
54
|
+
if (knownId && knownId !== id)
|
|
55
|
+
throw new CliError("authentication_error", "the destination profile belongs to a different bot");
|
|
56
|
+
if (oldToken) {
|
|
57
|
+
const existing = await context.connect(oldToken, { events });
|
|
58
|
+
try {
|
|
59
|
+
if ((await existing.me()).id !== id)
|
|
60
|
+
throw new CliError("authentication_error", "the destination profile's credential belongs to a different bot");
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
await existing.close();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
target = { tokens, registry, id };
|
|
67
|
+
}
|
|
68
|
+
const call = async () => {
|
|
69
|
+
const files = prepared.files.map((file) => ({
|
|
70
|
+
field: file.field,
|
|
71
|
+
name: basename(file.path),
|
|
72
|
+
bytes: readFileSync(file.path),
|
|
73
|
+
}));
|
|
74
|
+
const wait = prepared.value.timeout;
|
|
75
|
+
const seconds = wait === undefined ? undefined : Number(String(wait));
|
|
76
|
+
const result = await adapter.api?.(operation.id, { ...(prepared.text === undefined ? {} : { body: prepared.text }), files, secrets: prepared.secrets }, {
|
|
77
|
+
reads: operation.effect === "read",
|
|
78
|
+
...(seconds === undefined ? {} : { timeoutMs: (seconds + 15) * 1000 }),
|
|
79
|
+
});
|
|
80
|
+
if (!target)
|
|
81
|
+
return apiPlainJson(result);
|
|
82
|
+
if (typeof result !== "string" || !result || result.split(":", 1)[0] !== target.id)
|
|
83
|
+
throw new CliError("invalid_response", "Telegram returned an invalid managed bot credential");
|
|
84
|
+
const verified = await context.connect(result, { events });
|
|
85
|
+
try {
|
|
86
|
+
if ((await verified.me()).id !== target.id)
|
|
87
|
+
throw new CliError("authentication_error", "the returned credential belongs to a different bot");
|
|
88
|
+
}
|
|
89
|
+
finally {
|
|
90
|
+
await verified.close();
|
|
91
|
+
}
|
|
92
|
+
target.tokens.writeKeyring(result);
|
|
93
|
+
target.registry.rememberBot(target.id);
|
|
94
|
+
return { profile: input.tokenProfile, stored: "keyring", id: target.id };
|
|
95
|
+
};
|
|
96
|
+
const result = operation.effect === "read"
|
|
97
|
+
? await call()
|
|
98
|
+
: await guardedWrite(context.guard(defaults), {
|
|
99
|
+
operationId: newOperationId(),
|
|
100
|
+
key: keyOf(operation),
|
|
101
|
+
kind: "message",
|
|
102
|
+
chatId: prepared.value.chat_id === undefined ? null : String(prepared.value.chat_id),
|
|
103
|
+
}, call);
|
|
104
|
+
context.renderer.result(result);
|
|
105
|
+
}
|
|
106
|
+
finally {
|
|
107
|
+
await adapter.close();
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
},
|
|
111
|
+
});
|
|
112
|
+
//# sourceMappingURL=bot-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bot-api.js","sourceRoot":"","sources":["../../src/commands/bot-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type BotMessenger, type RunBotCommand } from "@wirecat/cli-messaging/cli";
|
|
2
|
+
import { type Environment } from "./context.js";
|
|
3
|
+
/** tg's `run` as the shared bot MCP server calls it; a test adds its keyring and Bot API stand-in as `extra`. */
|
|
4
|
+
export declare const botMcpRun: (extra?: Environment) => Promise<RunBotCommand>;
|
|
5
|
+
/** What the shared `bot` commands need from tg: a Telegram Bot API client, and the keyring a test hands in. */
|
|
6
|
+
export declare const TELEGRAM_BOT: BotMessenger;
|
|
7
|
+
//# sourceMappingURL=bot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../../src/commands/bot.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,YAAY,EAIjB,KAAK,aAAa,EACnB,MAAM,4BAA4B,CAAA;AAWnC,OAAO,EAAgB,KAAK,WAAW,EAAsB,MAAM,cAAc,CAAA;AAEjF,iHAAiH;AACjH,eAAO,MAAM,SAAS,WAAiB,WAAW,KAAQ,OAAO,CAAC,aAAa,CAI9E,CAAA;AAED,+GAA+G;AAC/G,eAAO,MAAM,YAAY,EAAE,YA4E1B,CAAA"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { CliError } from "@wirecat/cli-core";
|
|
3
|
+
import { BotTokenStore, botCopy, environmentOf, } from "@wirecat/cli-messaging/cli";
|
|
4
|
+
import { resolveSettings, TG } from "../app.js";
|
|
5
|
+
import { telegramBotAdapter } from "../bot/adapter.js";
|
|
6
|
+
import { BOT_ADMIN_RIGHTS } from "../bot/map.js";
|
|
7
|
+
import { proxiedFetch } from "../bot/proxy.js";
|
|
8
|
+
import { TelegramBotTransport } from "../bot/transport.js";
|
|
9
|
+
import { botSessionFile, sessionFile } from "../paths.js";
|
|
10
|
+
import { TelegramAdapter } from "../telegram/adapter.js";
|
|
11
|
+
import { openBotHistory } from "../telegram/bot-history.js";
|
|
12
|
+
import { apiCredentials } from "../telegram/credentials.js";
|
|
13
|
+
import { resolveProxy } from "../telegram/proxy.js";
|
|
14
|
+
import { proxyOption, SKILL } from "./context.js";
|
|
15
|
+
/** tg's `run` as the shared bot MCP server calls it; a test adds its keyring and Bot API stand-in as `extra`. */
|
|
16
|
+
export const botMcpRun = async (extra = {}) => {
|
|
17
|
+
// Loaded when the server starts: the program imports this file.
|
|
18
|
+
const { run } = await import("../program.js");
|
|
19
|
+
return (argv, environment) => run(argv, { ...extra, ...environment });
|
|
20
|
+
};
|
|
21
|
+
/** What the shared `bot` commands need from tg: a Telegram Bot API client, and the keyring a test hands in. */
|
|
22
|
+
export const TELEGRAM_BOT = {
|
|
23
|
+
app: TG,
|
|
24
|
+
provider: "telegram-bot",
|
|
25
|
+
name: "Telegram",
|
|
26
|
+
identity: true,
|
|
27
|
+
adminRights: BOT_ADMIN_RIGHTS,
|
|
28
|
+
resolveSettings,
|
|
29
|
+
fetching: {
|
|
30
|
+
page: 100,
|
|
31
|
+
pause: "1s",
|
|
32
|
+
maxPages: 10,
|
|
33
|
+
orderBy: "id",
|
|
34
|
+
from: "start at this message link, inclusive; otherwise use the newest message already known",
|
|
35
|
+
},
|
|
36
|
+
connect: async (command, token, { stop, events, history, track } = {}) => {
|
|
37
|
+
const environment = environmentOf(command);
|
|
38
|
+
const env = environment.env ?? process.env;
|
|
39
|
+
const settings = resolveSettings(command.optsWithGlobals(), { env, kind: "bot" });
|
|
40
|
+
const through = resolveProxy(settings, { env, ...(environment.keyring ? { keyring: environment.keyring } : {}) });
|
|
41
|
+
const fetch = environment.botFetch ?? (through ? proxiedFetch(through.proxy) : undefined);
|
|
42
|
+
const adapter = telegramBotAdapter(new TelegramBotTransport({
|
|
43
|
+
token,
|
|
44
|
+
...(fetch ? { fetch } : {}),
|
|
45
|
+
...(stop ? { signal: stop } : {}),
|
|
46
|
+
...(events ? { events } : {}),
|
|
47
|
+
}));
|
|
48
|
+
if (!history)
|
|
49
|
+
return adapter;
|
|
50
|
+
const { profile } = settings;
|
|
51
|
+
const readCredentials = (profile) => apiCredentials({ profile, env, ...(environment.keyring ? { keyring: environment.keyring } : {}) }).read();
|
|
52
|
+
const credentials = readCredentials(profile) ?? readCredentials("default");
|
|
53
|
+
if (!credentials)
|
|
54
|
+
throw new CliError("authentication_error", "bot store fetch needs Telegram app credentials — run `tg session start` first, or set TG_API_ID and TG_API_HASH");
|
|
55
|
+
const botId = token.split(":", 1)[0] ?? "";
|
|
56
|
+
if (!/^\d+$/.test(botId))
|
|
57
|
+
throw new CliError("authentication_error", "the bot token has no valid bot id");
|
|
58
|
+
const reader = await (environment.botHistory ?? openBotHistory)({
|
|
59
|
+
credentials,
|
|
60
|
+
sessionPath: botSessionFile(profile, botId, env),
|
|
61
|
+
token,
|
|
62
|
+
...history,
|
|
63
|
+
...proxyOption(through),
|
|
64
|
+
...(stop ? { stop } : {}),
|
|
65
|
+
...(events ? { events } : {}),
|
|
66
|
+
...(track ? { track } : {}),
|
|
67
|
+
newest: async (chat) => {
|
|
68
|
+
const copy = botCopy("telegram-bot");
|
|
69
|
+
const known = await copy.read((store) => store.messages(copy.accountOf(botId), chat, { limit: 1 }));
|
|
70
|
+
if (known.items[0])
|
|
71
|
+
return known.items[0].id;
|
|
72
|
+
const personalPath = sessionFile("default", env);
|
|
73
|
+
if (!existsSync(personalPath) && !environment.adapter)
|
|
74
|
+
return undefined;
|
|
75
|
+
let personal;
|
|
76
|
+
try {
|
|
77
|
+
personal = environment.adapter
|
|
78
|
+
? await environment.adapter({ credentials, sessionPath: personalPath })
|
|
79
|
+
: await TelegramAdapter.open({ credentials, sessionPath: personalPath, ...proxyOption(through) });
|
|
80
|
+
track?.(personal);
|
|
81
|
+
return (await personal.history?.(chat, { limit: 1 }))?.items[0]?.id;
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return undefined;
|
|
85
|
+
}
|
|
86
|
+
finally {
|
|
87
|
+
await personal?.close();
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
return { ...adapter, historyBefore: reader.historyBefore, close: reader.close };
|
|
92
|
+
},
|
|
93
|
+
tokenStore: (command, profile) => {
|
|
94
|
+
const { keyring, env } = environmentOf(command);
|
|
95
|
+
return new BotTokenStore({ app: TG, profile, ...(env ? { env } : {}), ...(keyring ? { keyring } : {}) });
|
|
96
|
+
},
|
|
97
|
+
mcp: { program: () => botMcpRun(), skill: SKILL },
|
|
98
|
+
};
|
|
99
|
+
//# sourceMappingURL=bot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bot.js","sourceRoot":"","sources":["../../src/commands/bot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { type KeyringStore } from "@wirecat/cli-core";
|
|
2
|
+
import { type BaseEnvironment, type ConnectOptions, type Messenger, type MessengerAdapter, type MessengerContext, type ServerSystem } from "@wirecat/cli-messaging/cli";
|
|
3
|
+
import type { Command } from "commander";
|
|
4
|
+
import type { FetchLike } from "../bot/transport.js";
|
|
5
|
+
import { TelegramAdapter } from "../telegram/adapter.js";
|
|
6
|
+
import type { BotHistoryOptions, BotHistoryReader } from "../telegram/bot-history.js";
|
|
7
|
+
import { type ApiCredentials, apiCredentials } from "../telegram/credentials.js";
|
|
8
|
+
import { resolveProxy } from "../telegram/proxy.js";
|
|
9
|
+
import type { UpdateEnvironment } from "../update.js";
|
|
10
|
+
export interface Environment extends BaseEnvironment {
|
|
11
|
+
keyring?: KeyringStore;
|
|
12
|
+
update?: UpdateEnvironment;
|
|
13
|
+
/** Tests hand in a scripted Telegram. */
|
|
14
|
+
adapter?: (options: {
|
|
15
|
+
credentials: ApiCredentials;
|
|
16
|
+
sessionPath: string;
|
|
17
|
+
} & ConnectOptions) => Adapter | Promise<Adapter>;
|
|
18
|
+
/** Tests hand in a machine for `service`, so no test runs systemctl or launchctl. */
|
|
19
|
+
system?: ServerSystem;
|
|
20
|
+
/** Tests hand in a stand-in for Telegram's Bot API. */
|
|
21
|
+
botFetch?: FetchLike;
|
|
22
|
+
botHistory?: (options: BotHistoryOptions) => Promise<BotHistoryReader>;
|
|
23
|
+
}
|
|
24
|
+
export type Adapter = MessengerAdapter & Pick<TelegramAdapter, "login">;
|
|
25
|
+
export interface CommandContext extends MessengerContext {
|
|
26
|
+
sessionPath: string;
|
|
27
|
+
credentials: ReturnType<typeof apiCredentials>;
|
|
28
|
+
open: (credentials?: ApiCredentials) => Promise<Adapter>;
|
|
29
|
+
proxy: () => ReturnType<typeof resolveProxy>;
|
|
30
|
+
withTelegram: MessengerContext["withMessenger"];
|
|
31
|
+
}
|
|
32
|
+
/** Shipped beside `dist/`; this file compiles to `dist/commands/context.js`. */
|
|
33
|
+
export declare const SKILL: import("url").URL;
|
|
34
|
+
export declare const TELEGRAM: Messenger;
|
|
35
|
+
export declare const forCommand: (command: Command) => CommandContext;
|
|
36
|
+
/**
|
|
37
|
+
* The session is a login as good as a password: it, SQLite's -wal and -shm beside it, and its folder
|
|
38
|
+
* are the owner's alone. Only `stat`, so `doctor` never opens it; the fix is printed, never applied.
|
|
39
|
+
*/
|
|
40
|
+
export declare const sessionModes: (sessionPath: string, platform?: NodeJS.Platform) => {
|
|
41
|
+
checked: boolean;
|
|
42
|
+
reason: string;
|
|
43
|
+
ok?: undefined;
|
|
44
|
+
problems?: undefined;
|
|
45
|
+
} | {
|
|
46
|
+
reason?: undefined;
|
|
47
|
+
checked: boolean;
|
|
48
|
+
ok: boolean;
|
|
49
|
+
problems: {
|
|
50
|
+
path: string;
|
|
51
|
+
mode: string;
|
|
52
|
+
want: string;
|
|
53
|
+
fix: string;
|
|
54
|
+
}[];
|
|
55
|
+
};
|
|
56
|
+
export declare const proxyOption: (through: ReturnType<typeof resolveProxy>) => {
|
|
57
|
+
proxy: import("../proxy.js").ProxyServer;
|
|
58
|
+
} | {};
|
|
59
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AAEA,OAAO,EAAY,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAC/D,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,cAAc,EAEnB,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EAErB,KAAK,YAAY,EAClB,MAAM,4BAA4B,CAAA;AACnC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAExC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAGpD,OAAO,EAAgC,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACtF,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AACrF,OAAO,EAAE,KAAK,cAAc,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAErD,MAAM,WAAW,WAAY,SAAQ,eAAe;IAClD,OAAO,CAAC,EAAE,YAAY,CAAA;IACtB,MAAM,CAAC,EAAE,iBAAiB,CAAA;IAC1B,yCAAyC;IACzC,OAAO,CAAC,EAAE,CACR,OAAO,EAAE;QAAE,WAAW,EAAE,cAAc,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,GAAG,cAAc,KAC3E,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC/B,qFAAqF;IACrF,MAAM,CAAC,EAAE,YAAY,CAAA;IACrB,uDAAuD;IACvD,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAA;CACvE;AAED,MAAM,MAAM,OAAO,GAAG,gBAAgB,GAAG,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,CAAA;AAEvE,MAAM,WAAW,cAAe,SAAQ,gBAAgB;IACtD,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAA;IAC9C,IAAI,EAAE,CAAC,WAAW,CAAC,EAAE,cAAc,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IACxD,KAAK,EAAE,MAAM,UAAU,CAAC,OAAO,YAAY,CAAC,CAAA;IAC5C,YAAY,EAAE,gBAAgB,CAAC,eAAe,CAAC,CAAA;CAChD;AA4DD,gFAAgF;AAChF,eAAO,MAAM,KAAK,mBAA2D,CAAA;AAK7E,eAAO,MAAM,QAAQ,EAAE,SA6CtB,CAAA;AAED,eAAO,MAAM,UAAU,YAAa,OAAO,KAAG,cAW7C,CAAA;AAID;;;GAGG;AACH,eAAO,MAAM,YAAY,gBAAiB,MAAM,aAAY,MAAM,CAAC,QAAQ;;;;;;;;;;;;;;;CAoB1E,CAAA;AAYD,eAAO,MAAM,WAAW,YAAa,UAAU,CAAC,OAAO,YAAY,CAAC;;MAA8C,CAAA"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { existsSync, statSync } from "node:fs";
|
|
2
|
+
import { dirname } from "node:path";
|
|
3
|
+
import { CliError } from "@wirecat/cli-core";
|
|
4
|
+
import { asFirstWord, environmentOf, messengerContext, } from "@wirecat/cli-messaging/cli";
|
|
5
|
+
import { resolveSettings, TG } from "../app.js";
|
|
6
|
+
import { isolated, sessionFile } from "../paths.js";
|
|
7
|
+
import { proxyLabel } from "../proxy.js";
|
|
8
|
+
import { ADMIN_RIGHTS, GROUP_SETTINGS, TelegramAdapter } from "../telegram/adapter.js";
|
|
9
|
+
import { apiCredentials } from "../telegram/credentials.js";
|
|
10
|
+
import { resolveProxy } from "../telegram/proxy.js";
|
|
11
|
+
/** What only Telegram has: app credentials, a session file, and how to log in. */
|
|
12
|
+
const telegramOf = (command, base) => {
|
|
13
|
+
const environment = environmentOf(command);
|
|
14
|
+
const { profile } = base.settings;
|
|
15
|
+
const sessionPath = sessionFile(profile, base.env);
|
|
16
|
+
const credentials = apiCredentials({
|
|
17
|
+
profile,
|
|
18
|
+
env: base.env,
|
|
19
|
+
warn: base.renderer.warn,
|
|
20
|
+
...(environment.keyring ? { keyring: environment.keyring } : {}),
|
|
21
|
+
});
|
|
22
|
+
const proxy = () => resolveProxy(base.settings, { env: base.env, ...(environment.keyring ? { keyring: environment.keyring } : {}) });
|
|
23
|
+
const login = `\`tg ${asFirstWord(profile)}session start\``;
|
|
24
|
+
const setup = `\`tg ${asFirstWord(profile)}setup\``;
|
|
25
|
+
const open = async (given, connecting = {}) => {
|
|
26
|
+
const resolved = given ?? credentials.read();
|
|
27
|
+
if (!resolved) {
|
|
28
|
+
const loggedIn = existsSync(sessionPath);
|
|
29
|
+
// A service can start before the login keyring unlocks; its unit restarts on this code, not on 4.
|
|
30
|
+
const unreachable = loggedIn && command.name() === "serve" ? "provider_unavailable" : "authentication_error";
|
|
31
|
+
// Logging in again would register another device, and the same environment would lose it again.
|
|
32
|
+
throw new CliError(unreachable, loggedIn
|
|
33
|
+
? `no Telegram app credentials found for profile "${profile}", although it has logged in on this machine — ` +
|
|
34
|
+
"the keyring is probably out of reach (cron, ssh, an MCP client that trims the environment: set " +
|
|
35
|
+
`XDG_RUNTIME_DIR); \`tg ${asFirstWord(profile)}doctor\` shows it. Log in again only if they were removed`
|
|
36
|
+
: `no Telegram app credentials for profile "${profile}" — run ${setup} in a local terminal first; agents: read \`tg skill show\``);
|
|
37
|
+
}
|
|
38
|
+
const options = { credentials: resolved, sessionPath, ...connecting };
|
|
39
|
+
return environment.adapter
|
|
40
|
+
? await environment.adapter(options)
|
|
41
|
+
: await TelegramAdapter.open({
|
|
42
|
+
...options,
|
|
43
|
+
...proxyOption(proxy()),
|
|
44
|
+
diagnostic: (line) => base.streams.diagnostic(line),
|
|
45
|
+
note: (line) => base.renderer.warn(line),
|
|
46
|
+
verbose: base.settings.trace,
|
|
47
|
+
login,
|
|
48
|
+
});
|
|
49
|
+
};
|
|
50
|
+
const connect = async (options = {}) => {
|
|
51
|
+
if (!environment.adapter && !existsSync(sessionPath)) {
|
|
52
|
+
throw new CliError("authentication_error", `no session for profile "${profile}" — run ${setup} in a local terminal`);
|
|
53
|
+
}
|
|
54
|
+
return open(undefined, options);
|
|
55
|
+
};
|
|
56
|
+
return { environment, sessionPath, credentials, open, connect, proxy };
|
|
57
|
+
};
|
|
58
|
+
/** Shipped beside `dist/`; this file compiles to `dist/commands/context.js`. */
|
|
59
|
+
export const SKILL = new URL("../../skills/tg-cli/SKILL.md", import.meta.url);
|
|
60
|
+
/** Channels and supergroups number their own messages, so an id alone there names another message. */
|
|
61
|
+
const OWN_NUMBERING = ["channel", "supergroup", "gigagroup", "monoforum"];
|
|
62
|
+
export const TELEGRAM = {
|
|
63
|
+
app: TG,
|
|
64
|
+
provider: "telegram",
|
|
65
|
+
counterFields: ["views", "reactions", "comments"],
|
|
66
|
+
name: "Telegram",
|
|
67
|
+
resolveSettings,
|
|
68
|
+
connect: (command, base, options) => telegramOf(command, base).connect(options),
|
|
69
|
+
chatArgument: "a chat: its title or part of it, its id, @username, or `me` for Saved Messages",
|
|
70
|
+
groupSettings: GROUP_SETTINGS,
|
|
71
|
+
mediaOptions: ["spoiler", "captionAbove", "fileName"],
|
|
72
|
+
pollQuiz: true,
|
|
73
|
+
pollVoters: true,
|
|
74
|
+
topicShow: true,
|
|
75
|
+
forwardTopic: true,
|
|
76
|
+
// mtcute's InputMedia.poll documents 5–600 seconds.
|
|
77
|
+
pollCloseSeconds: [5, 600],
|
|
78
|
+
inviteLinkUpdate: true,
|
|
79
|
+
html: true,
|
|
80
|
+
folderRules: true,
|
|
81
|
+
addsWithHistory: false,
|
|
82
|
+
officialStats: true,
|
|
83
|
+
serverSearch: true,
|
|
84
|
+
knowsAccountAge: false,
|
|
85
|
+
adminRights: ADMIN_RIGHTS,
|
|
86
|
+
// Saved Messages is the chat with yourself, so its id is the account's.
|
|
87
|
+
savedChatId: (account) => account.account,
|
|
88
|
+
diagnose: async (command, base) => {
|
|
89
|
+
const { sessionPath, credentials, proxy } = telegramOf(command, base);
|
|
90
|
+
return {
|
|
91
|
+
session: { path: sessionPath, exists: existsSync(sessionPath), files: sessionModes(sessionPath) },
|
|
92
|
+
proxy: proxyState(proxy),
|
|
93
|
+
appCredentials: appCredentialsState(() => credentials.read(), base.env),
|
|
94
|
+
// The one failure with no other symptom: a login made without these variables is invisible with them.
|
|
95
|
+
keyringMovedByEnvironment: isolated(base.env),
|
|
96
|
+
};
|
|
97
|
+
},
|
|
98
|
+
// In Telegram a one-to-one chat's id is the other person's id.
|
|
99
|
+
partnerOf: (chat) => (chat.kind === "dialog" ? chat.id : undefined),
|
|
100
|
+
// Telegram names a deletion without its chat only where ids count per account. A chat stored by
|
|
101
|
+
// its id alone has no kind yet, but `-100…` marks a channel's or a supergroup's.
|
|
102
|
+
deletedWithoutChat: (chat) => chat.kind !== "channel" &&
|
|
103
|
+
!(chat.kind === "unknown" && chat.id.startsWith("-100")) &&
|
|
104
|
+
!OWN_NUMBERING.includes(String(chat.providerMetadata?.chatType ?? "")),
|
|
105
|
+
skill: SKILL,
|
|
106
|
+
};
|
|
107
|
+
export const forCommand = (command) => {
|
|
108
|
+
const context = messengerContext(command, TELEGRAM);
|
|
109
|
+
const { sessionPath, credentials, open, proxy } = telegramOf(command, context);
|
|
110
|
+
return {
|
|
111
|
+
...context,
|
|
112
|
+
sessionPath,
|
|
113
|
+
credentials,
|
|
114
|
+
open,
|
|
115
|
+
proxy,
|
|
116
|
+
withTelegram: context.withMessenger,
|
|
117
|
+
};
|
|
118
|
+
};
|
|
119
|
+
const octal = (mode) => `0${mode.toString(8)}`;
|
|
120
|
+
/**
|
|
121
|
+
* The session is a login as good as a password: it, SQLite's -wal and -shm beside it, and its folder
|
|
122
|
+
* are the owner's alone. Only `stat`, so `doctor` never opens it; the fix is printed, never applied.
|
|
123
|
+
*/
|
|
124
|
+
export const sessionModes = (sessionPath, platform = process.platform) => {
|
|
125
|
+
if (platform === "win32")
|
|
126
|
+
return { checked: false, reason: "Windows has no Unix file modes" };
|
|
127
|
+
const wanted = [
|
|
128
|
+
...[sessionPath, `${sessionPath}-wal`, `${sessionPath}-shm`].map((path) => [path, 0o600]),
|
|
129
|
+
[dirname(sessionPath), 0o700],
|
|
130
|
+
];
|
|
131
|
+
const problems = wanted.flatMap(([path, want]) => {
|
|
132
|
+
if (!existsSync(path))
|
|
133
|
+
return [];
|
|
134
|
+
const mode = statSync(path).mode & 0o777;
|
|
135
|
+
if ((mode & 0o077) === 0)
|
|
136
|
+
return [];
|
|
137
|
+
return [
|
|
138
|
+
{
|
|
139
|
+
path,
|
|
140
|
+
mode: octal(mode),
|
|
141
|
+
want: octal(want),
|
|
142
|
+
fix: `chmod ${want.toString(8)} '${path.replaceAll("'", `'\\''`)}'`,
|
|
143
|
+
},
|
|
144
|
+
];
|
|
145
|
+
});
|
|
146
|
+
return { checked: true, ok: problems.length === 0, problems };
|
|
147
|
+
};
|
|
148
|
+
/** Whether app credentials exist and where from — never the values. */
|
|
149
|
+
const appCredentialsState = (read, env) => {
|
|
150
|
+
try {
|
|
151
|
+
if (!read())
|
|
152
|
+
return "missing";
|
|
153
|
+
return env.TG_API_ID ? "from TG_API_ID and TG_API_HASH" : "stored";
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
return "unreadable";
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
export const proxyOption = (through) => (through ? { proxy: through.proxy } : {});
|
|
160
|
+
/** The proxy in use without its password or secret, and whether the Bot API can follow it. */
|
|
161
|
+
const proxyState = (resolve) => {
|
|
162
|
+
try {
|
|
163
|
+
const through = resolve();
|
|
164
|
+
if (!through)
|
|
165
|
+
return null;
|
|
166
|
+
return {
|
|
167
|
+
url: proxyLabel(through.proxy),
|
|
168
|
+
from: through.from,
|
|
169
|
+
botApi: through.proxy.kind === "mtproxy" ? "direct: an MTProxy carries only Telegram's own protocol" : "through it",
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
return { error: error instanceof Error ? error.message : String(error) };
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
/**
|
|
3
|
+
* `config set proxy` and `config unset proxy` around the shared command: the password or MTProxy
|
|
4
|
+
* secret goes to the OS keyring, and only the URL without it reaches the file — and the shared
|
|
5
|
+
* command's own messages, which quote the value. A URL with a secret comes from `-`, typed or
|
|
6
|
+
* piped, never from argv, where `ps` and shell history would keep it.
|
|
7
|
+
*/
|
|
8
|
+
export declare const withProxySecrets: (config: Command) => Command;
|
|
9
|
+
//# sourceMappingURL=proxy-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy-config.d.ts","sourceRoot":"","sources":["../../src/commands/proxy-config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAMxC;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,WAAY,OAAO,KAAG,OAiDlD,CAAA"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { CliError, isCliError } from "@wirecat/cli-core";
|
|
2
|
+
import { readSecret } from "@wirecat/cli-messaging";
|
|
3
|
+
import { environmentOf } from "@wirecat/cli-messaging/cli";
|
|
4
|
+
import { CONFIG } from "../app.js";
|
|
5
|
+
import { parseProxy, proxyLabel } from "../proxy.js";
|
|
6
|
+
import { checkProxy, proxySecrets } from "../telegram/proxy.js";
|
|
7
|
+
/**
|
|
8
|
+
* `config set proxy` and `config unset proxy` around the shared command: the password or MTProxy
|
|
9
|
+
* secret goes to the OS keyring, and only the URL without it reaches the file — and the shared
|
|
10
|
+
* command's own messages, which quote the value. A URL with a secret comes from `-`, typed or
|
|
11
|
+
* piped, never from argv, where `ps` and shell history would keep it.
|
|
12
|
+
*/
|
|
13
|
+
export const withProxySecrets = (config) => {
|
|
14
|
+
let pending;
|
|
15
|
+
config.hook("preAction", async (_self, action) => {
|
|
16
|
+
pending = undefined;
|
|
17
|
+
const [setting, value] = action.processedArgs;
|
|
18
|
+
if (setting !== "proxy" || !["set", "unset"].includes(action.name()))
|
|
19
|
+
return;
|
|
20
|
+
const { bot, personal } = action.opts();
|
|
21
|
+
if (bot || personal)
|
|
22
|
+
throw new CliError("validation_error", "proxy is one setting for the profile's account and its bot alike — drop --bot and --personal");
|
|
23
|
+
const { env = process.env, keyring, stdin = process.stdin } = environmentOf(action);
|
|
24
|
+
const secrets = proxySecrets({ env, ...(keyring ? { keyring } : {}) });
|
|
25
|
+
const scope = action.opts().defaults
|
|
26
|
+
? undefined
|
|
27
|
+
: CONFIG.resolveSettings(action.optsWithGlobals(), { env }).profile;
|
|
28
|
+
if (action.name() === "unset") {
|
|
29
|
+
pending = () => secrets.remove(scope);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const typed = value === "-";
|
|
33
|
+
const text = typed ? await readSecret("proxy URL, hidden as you type: ", { input: stdin }) : String(value);
|
|
34
|
+
const proxy = asValidation(() => parseProxy(text, "proxy"));
|
|
35
|
+
if (!typed && proxy.secret !== undefined)
|
|
36
|
+
throw new CliError("validation_error", "a proxy password or MTProxy secret never goes on the command line — run `tg config set proxy -` and paste the URL");
|
|
37
|
+
if (proxy.kind === "mtproxy" && proxy.secret === undefined)
|
|
38
|
+
throw new CliError("validation_error", "an MTProxy link needs its secret — run `tg config set proxy -` and paste the whole link");
|
|
39
|
+
asValidation(() => checkProxy(proxy));
|
|
40
|
+
const label = proxyLabel(proxy);
|
|
41
|
+
action.processedArgs[1] = label;
|
|
42
|
+
pending = () => {
|
|
43
|
+
if (proxy.secret === undefined)
|
|
44
|
+
secrets.remove(scope);
|
|
45
|
+
else
|
|
46
|
+
secrets.write(scope, proxy.secret);
|
|
47
|
+
};
|
|
48
|
+
});
|
|
49
|
+
config.hook("postAction", () => {
|
|
50
|
+
pending?.();
|
|
51
|
+
pending = undefined;
|
|
52
|
+
});
|
|
53
|
+
return config;
|
|
54
|
+
};
|
|
55
|
+
const asValidation = (work) => {
|
|
56
|
+
try {
|
|
57
|
+
return work();
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
throw isCliError(error) ? new CliError("validation_error", error.message) : error;
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=proxy-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy-config.js","sourceRoot":"","sources":["../../src/commands/proxy-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { type CommandContext } from "./context.js";
|
|
3
|
+
export interface StartSessionOptions {
|
|
4
|
+
method: "qr" | "phone";
|
|
5
|
+
app: "browser" | "auto";
|
|
6
|
+
qrFile?: string;
|
|
7
|
+
sms?: boolean;
|
|
8
|
+
command?: string;
|
|
9
|
+
progress?: (step: "app" | "login") => void;
|
|
10
|
+
signal?: AbortSignal;
|
|
11
|
+
/** How far the questions sit right, to line up under a setup step. */
|
|
12
|
+
indent?: number;
|
|
13
|
+
}
|
|
14
|
+
export declare const startSession: (context: CommandContext, { method, app, qrFile, sms, command, progress, signal, indent: pad }: StartSessionOptions) => Promise<{
|
|
15
|
+
profile: string;
|
|
16
|
+
account: import("../telegram/map.js").Account;
|
|
17
|
+
session: string;
|
|
18
|
+
appKeys: "environment" | "file" | "keyring" | null;
|
|
19
|
+
alreadyLoggedIn: boolean;
|
|
20
|
+
}>;
|
|
21
|
+
export declare const sessionCommand: () => Command;
|
|
22
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/commands/session.ts"],"names":[],"mappings":"AAaA,OAAO,EAAY,OAAO,EAAU,MAAM,WAAW,CAAA;AAMrD,OAAO,EAAE,KAAK,cAAc,EAAc,MAAM,cAAc,CAAA;AA0F9D,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,IAAI,GAAG,OAAO,CAAA;IACtB,GAAG,EAAE,SAAS,GAAG,MAAM,CAAA;IACvB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,GAAG,OAAO,KAAK,IAAI,CAAA;IAC1C,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,sEAAsE;IACtE,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,eAAO,MAAM,YAAY,YACd,cAAc,wEACwE,mBAAmB;;;;;;EAuEnH,CAAA;AAED,eAAO,MAAM,cAAc,eAwD1B,CAAA"}
|