@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,191 @@
|
|
|
1
|
+
import { chmodSync, existsSync, rmSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { CliError, indent } from "@wirecat/cli-core";
|
|
4
|
+
import { annotate } from "@wirecat/cli-core/commands";
|
|
5
|
+
import { qrPng, readSecret, terminalQr } from "@wirecat/cli-messaging";
|
|
6
|
+
import { asFirstWord, commandWords, inputPolicy, refuseCommandName, rememberAccount, rootOf, } from "@wirecat/cli-messaging/cli";
|
|
7
|
+
import { Argument, Command, Option } from "commander";
|
|
8
|
+
import { TG } from "../app.js";
|
|
9
|
+
import { proxiedFetch } from "../bot/proxy.js";
|
|
10
|
+
import { openInBrowser } from "../browser.js";
|
|
11
|
+
import { parseApiHash, parseApiId } from "../telegram/credentials.js";
|
|
12
|
+
import { MY_TELEGRAM, registerApp } from "../telegram/registration.js";
|
|
13
|
+
import { forCommand } from "./context.js";
|
|
14
|
+
/** The app registration, asked for once per profile: by opening the site, or by filling it in for the owner. */
|
|
15
|
+
const appCredentials = async (context, how, ask, phone, signal) => {
|
|
16
|
+
if (how === "auto") {
|
|
17
|
+
let app;
|
|
18
|
+
const through = context.proxy();
|
|
19
|
+
const fetch = through ? proxiedFetch(through.proxy) : undefined;
|
|
20
|
+
try {
|
|
21
|
+
app = await registerApp({
|
|
22
|
+
phone,
|
|
23
|
+
code: () => ask("code from Telegram for my.telegram.org (app registration): ", true),
|
|
24
|
+
note: context.renderer.note,
|
|
25
|
+
}, { ...(signal === undefined ? {} : { signal }), ...(fetch ? { fetch } : {}) });
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
context.renderer.note(`The Telegram application step did not finish. Get your app keys in the browser with ` +
|
|
29
|
+
`\`tg ${asFirstWord(context.profile)}session start --app browser\`, then rerun setup.`);
|
|
30
|
+
throw error;
|
|
31
|
+
}
|
|
32
|
+
context.renderer.note(app.created ? "registered a new app on my.telegram.org" : "found the app already registered on my.telegram.org");
|
|
33
|
+
return { id: app.id, hash: app.hash };
|
|
34
|
+
}
|
|
35
|
+
const url = `${MY_TELEGRAM}/apps`;
|
|
36
|
+
const opened = openInBrowser(url);
|
|
37
|
+
context.renderer.note(`${opened ? "opened" : "open"} ${url}\n` +
|
|
38
|
+
"1. Log in with your phone number; the site sends its code in the Telegram app.\n" +
|
|
39
|
+
"2. Open API development tools. If no app exists, fill App title and Short name, choose Desktop, and create it.\n" +
|
|
40
|
+
"3. Copy App api_id and App api_hash into this terminal. The hash is hidden as you type.\n" +
|
|
41
|
+
"Or rerun with --app auto to have the application step done for you.");
|
|
42
|
+
return {
|
|
43
|
+
id: parseApiId(await ask("App api_id: ", true)),
|
|
44
|
+
hash: parseApiHash(await ask("App api_hash (not shown): ", false)),
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
const KEYS_IN = {
|
|
48
|
+
environment: "from TG_API_ID and TG_API_HASH",
|
|
49
|
+
keyring: "in the keyring",
|
|
50
|
+
file: "in a file beside the config, where there is no keyring",
|
|
51
|
+
};
|
|
52
|
+
const loggedIn = ({ profile, account, session, appKeys, alreadyLoggedIn, }, env) => {
|
|
53
|
+
const who = [account.username ? `@${account.username}` : undefined, `id ${account.id}`].filter(Boolean).join(", ");
|
|
54
|
+
const home = (env.HOME ?? env.USERPROFILE)?.replaceAll("\\", "/");
|
|
55
|
+
const portable = session.replaceAll("\\", "/");
|
|
56
|
+
const shown = home && portable.startsWith(`${home}/`) ? `~${portable.slice(home.length)}` : session;
|
|
57
|
+
return [
|
|
58
|
+
alreadyLoggedIn
|
|
59
|
+
? `Already logged in as ${account.name ?? "you"} (${who}) — profile ${profile}; nothing was asked. ` +
|
|
60
|
+
`\`tg ${asFirstWord(profile)}session end\` first to log in again.`
|
|
61
|
+
: `Logged in as ${account.name ?? "you"} (${who}) — profile ${profile}.`,
|
|
62
|
+
`Session: ${shown}`,
|
|
63
|
+
`App keys: ${appKeys ? KEYS_IN[appKeys] : "not stored"}`,
|
|
64
|
+
`Next: tg chats list · tg server install to keep the archive current`,
|
|
65
|
+
].join("\n");
|
|
66
|
+
};
|
|
67
|
+
export const startSession = async (context, { method, app, qrFile, sms, command = "tg session start", progress, signal, indent: pad = 0 }) => {
|
|
68
|
+
if (qrFile !== undefined && method !== "qr")
|
|
69
|
+
throw new CliError("validation_error", "--qr-file is for a QR login");
|
|
70
|
+
if (sms && method !== "phone")
|
|
71
|
+
throw new CliError("validation_error", "--sms is for a phone login");
|
|
72
|
+
const input = context.stdin;
|
|
73
|
+
// With the QR in a file, a login with a stored app and no 2FA asks nothing, so an agent can run it.
|
|
74
|
+
if ((!input.isTTY || inputPolicy(input).noInput) && qrFile === undefined)
|
|
75
|
+
throw new CliError("validation_error", `${command} asks questions — run it in a terminal`);
|
|
76
|
+
const ask = (prompt, echo) => {
|
|
77
|
+
signal?.throwIfAborted();
|
|
78
|
+
if (!input.isTTY || inputPolicy(input).noInput) {
|
|
79
|
+
throw new CliError("validation_error", `\`${command}\` needs a terminal to ask for the ${prompt.trim()}`);
|
|
80
|
+
}
|
|
81
|
+
return readSecret(`${" ".repeat(pad)}${prompt}`, { input, echo, ...(signal === undefined ? {} : { signal }) });
|
|
82
|
+
};
|
|
83
|
+
const qrPath = qrFile === undefined ? undefined : resolve(qrFile);
|
|
84
|
+
let typedPhone;
|
|
85
|
+
// Telegram accepts a session that is still logged in without a question; then nothing here is asked.
|
|
86
|
+
let asked = false;
|
|
87
|
+
const phone = async () => {
|
|
88
|
+
asked = true;
|
|
89
|
+
typedPhone ??= await ask("phone number, international format: ", true);
|
|
90
|
+
return typedPhone;
|
|
91
|
+
};
|
|
92
|
+
const stored = context.credentials.read();
|
|
93
|
+
progress?.("app");
|
|
94
|
+
const typed = stored ? undefined : await appCredentials(context, app, ask, phone, signal);
|
|
95
|
+
progress?.("login");
|
|
96
|
+
const telegram = await context.open(stored ?? typed);
|
|
97
|
+
context.track(telegram);
|
|
98
|
+
try {
|
|
99
|
+
const account = await telegram.login({
|
|
100
|
+
method,
|
|
101
|
+
...(sms ? { forceSms: true } : {}),
|
|
102
|
+
showQr: (url, expires) => {
|
|
103
|
+
asked = true;
|
|
104
|
+
context.renderer.note(`scan in Telegram → Settings → Devices → Link Desktop Device (valid until ${expires.toLocaleTimeString()})`);
|
|
105
|
+
if (!qrPath) {
|
|
106
|
+
context.streams.diagnostic(`\n${indent(terminalQr(url).text, pad + 2)}`);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
writeFileSync(qrPath, qrPng(url), { mode: 0o600 });
|
|
110
|
+
chmodSync(qrPath, 0o600);
|
|
111
|
+
context.renderer.note(`the QR code is in ${qrPath} — it is replaced when Telegram renews it`);
|
|
112
|
+
},
|
|
113
|
+
phone,
|
|
114
|
+
code: () => {
|
|
115
|
+
asked = true;
|
|
116
|
+
return ask("login code: ", true);
|
|
117
|
+
},
|
|
118
|
+
password: () => {
|
|
119
|
+
asked = true;
|
|
120
|
+
return ask("2FA password (not shown): ", false);
|
|
121
|
+
},
|
|
122
|
+
note: context.renderer.note,
|
|
123
|
+
});
|
|
124
|
+
signal?.throwIfAborted();
|
|
125
|
+
// Stored only once Telegram has accepted them: a keyring entry cannot be read back to check it.
|
|
126
|
+
if (typed)
|
|
127
|
+
context.credentials.write(typed);
|
|
128
|
+
rememberAccount(TG, context.profile, account.id, context.env);
|
|
129
|
+
const appKeys = context.credentials.source() ?? null;
|
|
130
|
+
return { profile: context.profile, account, session: context.sessionPath, appKeys, alreadyLoggedIn: !asked };
|
|
131
|
+
}
|
|
132
|
+
finally {
|
|
133
|
+
// The image is a login token for as long as it is valid; it does not outlive the login.
|
|
134
|
+
if (qrPath)
|
|
135
|
+
rmSync(qrPath, { force: true });
|
|
136
|
+
await telegram.close();
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
export const sessionCommand = () => {
|
|
140
|
+
const session = new Command("session").description("log this profile in to Telegram, or out");
|
|
141
|
+
session
|
|
142
|
+
.command("start")
|
|
143
|
+
.description("log in by QR code (default) or by phone number, code and 2FA password")
|
|
144
|
+
.addArgument(new Argument("[method]", "how to log in").choices(["qr", "phone"]).default("qr"))
|
|
145
|
+
.addOption(new Option("--app <how>", "the first time only: how to get this profile's app from my.telegram.org")
|
|
146
|
+
.choices(["browser", "auto"])
|
|
147
|
+
.default("browser"))
|
|
148
|
+
.option("--qr-file <png>", "write the QR code to this PNG instead of drawing it, for an agent to pass on")
|
|
149
|
+
.option("--sms", "phone login: ask Telegram to send the code by SMS, not to the app; Telegram may still refuse")
|
|
150
|
+
.addHelpText("after", "\nFirst time? Use `tg setup` for login, a check of five chats and an agent skill.\n" +
|
|
151
|
+
"\nExamples:\n" +
|
|
152
|
+
" tg session start QR login; app registration opens in your browser\n" +
|
|
153
|
+
" tg session start --app auto Obtain app ID/hash automatically\n" +
|
|
154
|
+
" tg session start phone Phone number, login code and optional 2FA password\n" +
|
|
155
|
+
" tg session start phone --sms The same, with the code by SMS if Telegram agrees\n" +
|
|
156
|
+
" tg work session start Log in to the work profile\n" +
|
|
157
|
+
"\nScan in Telegram: Settings > Devices > Link Desktop Device.\n" +
|
|
158
|
+
"For an interrupted or expired session, finish this login, then rerun `tg setup`.\n" +
|
|
159
|
+
"Agents: read `tg skill show`; --qr-file needs stored app keys and no 2FA input\n" +
|
|
160
|
+
"when running without a terminal. The temporary image is removed after login.\n")
|
|
161
|
+
.action(async function (method) {
|
|
162
|
+
const context = forCommand(this);
|
|
163
|
+
refuseCommandName(context.profile, commandWords(rootOf(this)), "tg");
|
|
164
|
+
const { app, qrFile, sms } = this.opts();
|
|
165
|
+
const answer = await startSession(context, {
|
|
166
|
+
method,
|
|
167
|
+
app,
|
|
168
|
+
...(qrFile === undefined ? {} : { qrFile }),
|
|
169
|
+
...(sms ? { sms } : {}),
|
|
170
|
+
});
|
|
171
|
+
if (context.format !== "pretty")
|
|
172
|
+
context.renderer.result(answer);
|
|
173
|
+
else
|
|
174
|
+
context.streams.data(loggedIn(answer, context.env));
|
|
175
|
+
});
|
|
176
|
+
annotate(session.command("end"), { mutates: true })
|
|
177
|
+
.description("log this profile out on Telegram's side and forget the session here")
|
|
178
|
+
.action(async function () {
|
|
179
|
+
const context = forCommand(this);
|
|
180
|
+
if (!existsSync(context.sessionPath)) {
|
|
181
|
+
context.renderer.result({ profile: context.profile, ended: false });
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
await context.withTelegram((telegram) => telegram.logout());
|
|
185
|
+
for (const suffix of ["", "-wal", "-shm"])
|
|
186
|
+
rmSync(`${context.sessionPath}${suffix}`, { force: true });
|
|
187
|
+
context.renderer.result({ profile: context.profile, ended: true });
|
|
188
|
+
});
|
|
189
|
+
return session;
|
|
190
|
+
};
|
|
191
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/commands/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAA;AA8D3C,eAAO,MAAM,YAAY,eAsLnB,CAAA"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { accessSync, constants, existsSync, mkdirSync } from "node:fs";
|
|
2
|
+
import { CliError, indent, renderPretty } from "@wirecat/cli-core";
|
|
3
|
+
import { annotate } from "@wirecat/cli-core/commands";
|
|
4
|
+
import { installSkill } from "@wirecat/cli-core/skill";
|
|
5
|
+
import { readSecret } from "@wirecat/cli-messaging";
|
|
6
|
+
import { asFirstWord, commandWords, environmentOf, inputPolicy, refuseCommandName, rootOf, runtime, withDeadline, } from "@wirecat/cli-messaging/cli";
|
|
7
|
+
import { levelFor } from "@wirecat/cli-messaging/sends";
|
|
8
|
+
import { Command, Option } from "commander";
|
|
9
|
+
import { TG } from "../app.js";
|
|
10
|
+
import { pathsFor } from "../paths.js";
|
|
11
|
+
import { installer } from "../update.js";
|
|
12
|
+
import { forCommand, SKILL } from "./context.js";
|
|
13
|
+
import { startSession } from "./session.js";
|
|
14
|
+
const AGENTS = ["none", "codex", "cursor", "claude", "gemini", "all"];
|
|
15
|
+
const STEPS = 5;
|
|
16
|
+
const chatCount = (count) => `${count} ${count === 1 ? "chat" : "chats"}`;
|
|
17
|
+
const DETAIL = 6;
|
|
18
|
+
/**
|
|
19
|
+
* A person sees each step as a heading with its details indented under it. `--quiet` hides both, as it
|
|
20
|
+
* hides notes; a machine mode keeps the plain notes it always had, since stderr there is a log.
|
|
21
|
+
*/
|
|
22
|
+
const screenFor = (context, quiet) => {
|
|
23
|
+
const person = context.format === "pretty";
|
|
24
|
+
const say = (text) => {
|
|
25
|
+
if (!quiet)
|
|
26
|
+
context.streams.diagnostic(text);
|
|
27
|
+
};
|
|
28
|
+
return {
|
|
29
|
+
step: (index, title) => person ? say(`\n[${index}/${STEPS}] ${title}`) : context.renderer.note(`${index}/${STEPS} — ${title}`),
|
|
30
|
+
detail: (text) => (person ? say(indent(text, DETAIL)) : context.renderer.note(text)),
|
|
31
|
+
title: (text) => (person ? say(text) : context.renderer.note(text)),
|
|
32
|
+
indent: person ? DETAIL : 0,
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
const agentFor = async (context, given, pad, signal) => {
|
|
36
|
+
if (given)
|
|
37
|
+
return given;
|
|
38
|
+
if (context.format !== "pretty" || !context.stdin.isTTY || inputPolicy(context.stdin).noInput)
|
|
39
|
+
return "none";
|
|
40
|
+
const answer = (await readSecret(`${" ".repeat(pad)}Agent [codex/cursor/claude/gemini/all/none] (none): `, {
|
|
41
|
+
input: context.stdin,
|
|
42
|
+
echo: true,
|
|
43
|
+
...(signal === undefined ? {} : { signal }),
|
|
44
|
+
}))
|
|
45
|
+
.trim()
|
|
46
|
+
.toLowerCase() || "none";
|
|
47
|
+
if (!AGENTS.includes(answer))
|
|
48
|
+
throw new CliError("validation_error", `unknown agent — choose ${AGENTS.join(", ")} with --agent`);
|
|
49
|
+
return answer;
|
|
50
|
+
};
|
|
51
|
+
export const setupCommand = () => annotate(new Command("setup"), { mutates: true })
|
|
52
|
+
.description("set up Telegram and connect your agent")
|
|
53
|
+
.configureHelp({ showGlobalOptions: true })
|
|
54
|
+
.addHelpText("after", "\nExamples:\n" +
|
|
55
|
+
" tg setup Guided setup in your local terminal\n" +
|
|
56
|
+
" tg setup --agent codex Install the skill for Codex\n" +
|
|
57
|
+
" tg work setup --agent claude Set up a separate work profile\n" +
|
|
58
|
+
" tg setup --app browser Get app ID/hash through my.telegram.org\n" +
|
|
59
|
+
" tg setup --method phone Use a phone login instead of QR\n" +
|
|
60
|
+
"\nAllow about 5 minutes. App registration and account login are separate steps.\n" +
|
|
61
|
+
"Scan the QR in Telegram: Settings > Devices > Link Desktop Device.\n" +
|
|
62
|
+
"Enter codes, app hashes and passwords only in the terminal.\n" +
|
|
63
|
+
"\nAgents: read `tg skill show` first. First login needs a local terminal.\n" +
|
|
64
|
+
"With stored app keys and no 2FA input, an agent can use:\n" +
|
|
65
|
+
" tg setup --qr-file login.png --agent codex --json\n" +
|
|
66
|
+
"The QR image is removed when login ends. Machine mode skips agent installation\n" +
|
|
67
|
+
"unless --agent is given. Existing sessions are checked without another login.\n" +
|
|
68
|
+
"\nSetup checks five chats. Choose a chat and an amount of history before:\n" +
|
|
69
|
+
" tg store fetch <chat> --last 100\n" +
|
|
70
|
+
"\nWindows: use tg.cmd or npm.cmd if PowerShell blocks scripts. Without PATH:\n" +
|
|
71
|
+
" npm.cmd exec --yes --package=@wirecat/tg-cli -- tg setup\n")
|
|
72
|
+
.addOption(new Option("--agent <agent>", "install the skill for this agent; asks at a terminal, otherwise none").choices(AGENTS))
|
|
73
|
+
.addOption(new Option("--app <how>", "how to get your Telegram app credentials the first time")
|
|
74
|
+
.choices(["auto", "browser"])
|
|
75
|
+
.default("auto"))
|
|
76
|
+
.addOption(new Option("--method <method>", "how to log in when there is no session").choices(["qr", "phone"]).default("qr"))
|
|
77
|
+
.option("--qr-file <png>", "write a temporary login QR image for an agent; needs stored app credentials without a terminal")
|
|
78
|
+
.action(async function () {
|
|
79
|
+
const context = forCommand(this);
|
|
80
|
+
refuseCommandName(context.profile, commandWords(rootOf(this)), "tg");
|
|
81
|
+
const options = this.opts();
|
|
82
|
+
if (context.settings.offline)
|
|
83
|
+
throw new CliError("validation_error", "tg setup verifies Telegram — remove --offline");
|
|
84
|
+
if (options.qrFile && options.method !== "qr")
|
|
85
|
+
throw new CliError("validation_error", "--qr-file is for a QR login");
|
|
86
|
+
for (const permission of ["account.show", "chats.list"]) {
|
|
87
|
+
if (levelFor(context.settings.permissions, permission).level === "deny")
|
|
88
|
+
throw new CliError("permission_error", `profile ${context.profile} denies ${permission} — setup cannot verify it`, { permission });
|
|
89
|
+
}
|
|
90
|
+
const reused = existsSync(context.sessionPath);
|
|
91
|
+
if (!reused && !context.stdin.isTTY && !options.qrFile)
|
|
92
|
+
throw new CliError("validation_error", "tg setup needs a terminal for the first login — run it locally; use --qr-file only with stored app credentials");
|
|
93
|
+
const prefix = `tg ${asFirstWord(context.profile)}`;
|
|
94
|
+
const command = installer(environmentOf(this).update) === "npx"
|
|
95
|
+
? `npm${process.platform === "win32" ? ".cmd" : ""} exec --yes --package=@wirecat/tg-cli -- ${prefix}`
|
|
96
|
+
: prefix;
|
|
97
|
+
const cancellation = new AbortController();
|
|
98
|
+
const closeables = [
|
|
99
|
+
{
|
|
100
|
+
close: async () => {
|
|
101
|
+
cancellation.abort();
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
];
|
|
105
|
+
const screen = screenFor(context, this.optsWithGlobals().quiet === true);
|
|
106
|
+
const loginContext = {
|
|
107
|
+
...context,
|
|
108
|
+
renderer: { ...context.renderer, note: screen.detail },
|
|
109
|
+
open: async (credentials) => {
|
|
110
|
+
cancellation.signal.throwIfAborted();
|
|
111
|
+
const telegram = await context.open(credentials);
|
|
112
|
+
if (cancellation.signal.aborted) {
|
|
113
|
+
await telegram.close();
|
|
114
|
+
cancellation.signal.throwIfAborted();
|
|
115
|
+
}
|
|
116
|
+
closeables.push(telegram);
|
|
117
|
+
return telegram;
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
const answer = await withDeadline(context.settings.commandTimeoutMs, closeables, async () => {
|
|
121
|
+
screen.title(`Telegram setup — profile ${context.profile}. Allow about 5 minutes; downloading chat history is a separate step.`);
|
|
122
|
+
screen.step(1, "This computer");
|
|
123
|
+
const paths = pathsFor(context.env);
|
|
124
|
+
for (const path of [paths.config, paths.state, paths.cache]) {
|
|
125
|
+
mkdirSync(path, { recursive: true });
|
|
126
|
+
accessSync(path, constants.W_OK);
|
|
127
|
+
}
|
|
128
|
+
screen.detail("✓ local directories ready");
|
|
129
|
+
if (process.platform === "win32")
|
|
130
|
+
screen.detail("Windows: use tg.cmd or npm.cmd if PowerShell blocks scripts. Open a new terminal after installing Node.js.");
|
|
131
|
+
if (reused) {
|
|
132
|
+
screen.step(2, "Telegram app ID and hash");
|
|
133
|
+
screen.detail("✓ stored credentials");
|
|
134
|
+
screen.step(3, "Log in");
|
|
135
|
+
screen.detail("✓ existing session, no new login");
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
await context.run(async () => {
|
|
139
|
+
await startSession(loginContext, {
|
|
140
|
+
signal: cancellation.signal,
|
|
141
|
+
method: options.method,
|
|
142
|
+
app: options.app,
|
|
143
|
+
...(options.qrFile === undefined ? {} : { qrFile: options.qrFile }),
|
|
144
|
+
command: `${prefix}setup`,
|
|
145
|
+
indent: screen.indent,
|
|
146
|
+
progress: (step) => step === "app"
|
|
147
|
+
? screen.step(2, "Telegram app ID and hash")
|
|
148
|
+
: screen.step(3, "Log in: scan the QR code or enter the login code"),
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
screen.step(4, "Account");
|
|
153
|
+
const { account, chats } = await context.withTelegram(async (telegram) => {
|
|
154
|
+
closeables.push(telegram);
|
|
155
|
+
cancellation.signal.throwIfAborted();
|
|
156
|
+
if (!telegram.chats)
|
|
157
|
+
throw new CliError("provider_error", "Telegram connection cannot list chats");
|
|
158
|
+
return { account: await telegram.me(), chats: await telegram.chats({ limit: 5, offset: 0 }) };
|
|
159
|
+
});
|
|
160
|
+
screen.detail(`✓ verified, ${chatCount(chats.items.length)} read`);
|
|
161
|
+
screen.step(5, "Agent");
|
|
162
|
+
const agent = await agentFor(context, options.agent, screen.indent, cancellation.signal);
|
|
163
|
+
screen.detail(agent === "none" ? "✓ no agent skill installed" : `✓ ${agent}`);
|
|
164
|
+
const targets = agent === "all" ? ["claude", "agents"] : [agent === "claude" ? "claude" : "agents"];
|
|
165
|
+
cancellation.signal.throwIfAborted();
|
|
166
|
+
const written = agent === "none" ? [] : installSkill(TG, SKILL, { targets, env: context.env });
|
|
167
|
+
const next = {
|
|
168
|
+
instructions: `${command}skill show`,
|
|
169
|
+
inbox: `${command}inbox --limit 5`,
|
|
170
|
+
chats: `${command}chats list --limit 5`,
|
|
171
|
+
history: `${command}store fetch <chat> --last 100`,
|
|
172
|
+
historyStatus: `${command}store status`,
|
|
173
|
+
...(agent === "none" ? { skill: `${command}skill install`, mcp: `${command}mcp config` } : {}),
|
|
174
|
+
};
|
|
175
|
+
const answer = {
|
|
176
|
+
profile: context.profile,
|
|
177
|
+
runtime: runtime(),
|
|
178
|
+
paths,
|
|
179
|
+
session: { path: context.sessionPath, reused },
|
|
180
|
+
account: { id: account.id, name: account.name, username: account.username },
|
|
181
|
+
chats: { checked: chats.items.length, hasMore: chats.hasMore },
|
|
182
|
+
agent: { name: agent, written },
|
|
183
|
+
next,
|
|
184
|
+
};
|
|
185
|
+
return answer;
|
|
186
|
+
});
|
|
187
|
+
const { agent, next, chats } = answer;
|
|
188
|
+
if (context.format !== "pretty")
|
|
189
|
+
context.renderer.result(answer);
|
|
190
|
+
else {
|
|
191
|
+
const rows = {
|
|
192
|
+
"Try now": next.inbox,
|
|
193
|
+
History: `${next.history} (choose the chat and the amount first)`,
|
|
194
|
+
"Agent skill": agent.name === "none"
|
|
195
|
+
? `skipped — install later: ${next.skill}`
|
|
196
|
+
: `installed for ${agent.name}; start a new agent session if it is not found`,
|
|
197
|
+
"For an agent": next.instructions,
|
|
198
|
+
};
|
|
199
|
+
context.streams.data(`\n✓ Telegram is ready — profile ${context.profile}, ${chatCount(chats.checked)} checked\n\n` +
|
|
200
|
+
indent(renderPretty(rows, { color: context.color }), 2));
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,cAAc,mCAYvB,CAAA"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { environmentOf, outputFor, servingProfiles, upgradeCommand as sharedUpgradeCommand, usableProfileName, } from "@wirecat/cli-messaging/cli";
|
|
2
|
+
import { TG } from "../app.js";
|
|
3
|
+
import { installer, latest, PACKAGE, restartServer, runUpdate } from "../update.js";
|
|
4
|
+
export const upgradeCommand = () => sharedUpgradeCommand(TG, PACKAGE, (command) => {
|
|
5
|
+
const context = environmentOf(command);
|
|
6
|
+
const environment = context.update ?? {};
|
|
7
|
+
const env = context.env ?? process.env;
|
|
8
|
+
return {
|
|
9
|
+
...outputFor(command),
|
|
10
|
+
installer: () => installer(environment),
|
|
11
|
+
latest: () => latest(environment),
|
|
12
|
+
install: (argv) => runUpdate(argv, environment),
|
|
13
|
+
afterUpdate: () => restartServers(env, environment),
|
|
14
|
+
};
|
|
15
|
+
});
|
|
16
|
+
/**
|
|
17
|
+
* A running serve keeps the code it started with; the update replaced the files under it. Each is
|
|
18
|
+
* restarted by the new tg — `server restart` refuses a serve started by hand, which is then named.
|
|
19
|
+
*/
|
|
20
|
+
const restartServers = (env, environment) => {
|
|
21
|
+
const restarted = [];
|
|
22
|
+
const left = [];
|
|
23
|
+
for (const profile of servingProfiles(TG, env)) {
|
|
24
|
+
try {
|
|
25
|
+
usableProfileName(profile);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
const code = restartServer(profile, env, environment);
|
|
31
|
+
(code === 0 ? restarted : left).push(profile);
|
|
32
|
+
}
|
|
33
|
+
return { restarted, left };
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,SAAS,EACT,eAAe,EACf,cAAc,IAAI,oBAAoB,EACtC,iBAAiB,GAClB,MAAM,4BAA4B,CAAA;AACnC,OAAO,EAAE,EAAE,EAAE,MAAM,WAAW,CAAA;AAC9B,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,EAA0B,MAAM,cAAc,CAAA;AAG3G,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,EAAE,CACjC,oBAAoB,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE;IAC5C,MAAM,OAAO,GAAG,aAAa,CAAc,OAAO,CAAC,CAAA;IACnD,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,IAAI,EAAE,CAAA;IACxC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAA;IACtC,OAAO;QACL,GAAG,SAAS,CAAC,OAAO,CAAC;QACrB,SAAS,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,WAAW,CAAC;QACvC,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC;QACjC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,WAAW,CAAC;QAC/C,WAAW,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,GAAG,EAAE,WAAW,CAAC;KACpD,CAAA;AACH,CAAC,CAAC,CAAA;AAEJ;;;GAGG;AACH,MAAM,cAAc,GAAG,CAAC,GAAsB,EAAE,WAA8B,EAAE,EAAE;IAChF,MAAM,SAAS,GAAa,EAAE,CAAA;IAC9B,MAAM,IAAI,GAAa,EAAE,CAAA;IACzB,KAAK,MAAM,OAAO,IAAI,eAAe,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC;QAC/C,IAAI,CAAC;YACH,iBAAiB,CAAC,OAAO,CAAC,CAAA;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,SAAQ;QACV,CAAC;QACD,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,EAAE,GAAG,EAAE,WAAW,CAAC,CACpD;QAAA,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAChD,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAA;AAC5B,CAAC,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare const completeGlobalInstall: ({ env, platform, packageRoot, repair, note, }?: {
|
|
2
|
+
env?: NodeJS.ProcessEnv | undefined;
|
|
3
|
+
note?: ((message: string) => boolean) | undefined;
|
|
4
|
+
packageRoot?: string | undefined;
|
|
5
|
+
platform?: NodeJS.Platform | undefined;
|
|
6
|
+
repair?: ((prefix: string) => void) | undefined;
|
|
7
|
+
}) => void;
|
|
8
|
+
//# sourceMappingURL=postinstall.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postinstall.d.ts","sourceRoot":"","sources":["../../src/install/postinstall.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,qBAAqB;;sBA+Bf,MAAM;;;uBA3BL,MAAM;MA4BjB,IA4BR,CAAA"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import { dirname, join, resolve } from "node:path";
|
|
3
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
4
|
+
import { installSkill } from "@wirecat/cli-core/skill";
|
|
5
|
+
import { VERSION } from "../version.js";
|
|
6
|
+
const root = resolve(dirname(fileURLToPath(import.meta.url)), "../..");
|
|
7
|
+
export const completeGlobalInstall = ({ env = process.env, platform = process.platform, packageRoot = root, repair = (prefix) => {
|
|
8
|
+
const child = spawnSync("powershell.exe", [
|
|
9
|
+
"-NoProfile",
|
|
10
|
+
"-NonInteractive",
|
|
11
|
+
"-ExecutionPolicy",
|
|
12
|
+
"Bypass",
|
|
13
|
+
"-EncodedCommand",
|
|
14
|
+
Buffer.from("& $env:TG_INSTALL_SCRIPT -RepairOnly -Prefix $env:TG_INSTALL_PREFIX -NodeDirectory $env:TG_INSTALL_NODE -Json", "utf16le").toString("base64"),
|
|
15
|
+
], {
|
|
16
|
+
encoding: "utf8",
|
|
17
|
+
env: {
|
|
18
|
+
...env,
|
|
19
|
+
TG_INSTALL_SCRIPT: resolve(packageRoot, "install/windows.ps1"),
|
|
20
|
+
TG_INSTALL_PREFIX: prefix,
|
|
21
|
+
TG_INSTALL_NODE: dirname(process.execPath),
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
if (child.error || child.status !== 0)
|
|
25
|
+
throw new Error("Windows PATH setup failed; run the Windows installer from the installation guide");
|
|
26
|
+
}, note = (message) => process.stderr.write(`${message}\n`), } = {}) => {
|
|
27
|
+
if (env.npm_config_global !== "true")
|
|
28
|
+
return;
|
|
29
|
+
if (platform === "win32") {
|
|
30
|
+
const prefix = env.npm_config_prefix;
|
|
31
|
+
if (!prefix)
|
|
32
|
+
throw new Error("npm did not provide its global prefix; use the Windows installer");
|
|
33
|
+
repair(prefix);
|
|
34
|
+
note("tg: Windows user PATH updated; new terminals can run tg directly.");
|
|
35
|
+
}
|
|
36
|
+
if (env.TG_INSTALL_AGENT === "none") {
|
|
37
|
+
note("tg: agent skill skipped by TG_INSTALL_AGENT=none; install with tg skill install --for all.");
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
const agent = env.TG_INSTALL_AGENT ?? "all";
|
|
41
|
+
if (!["all", "codex", "cursor", "claude", "gemini"].includes(agent))
|
|
42
|
+
throw new Error("TG_INSTALL_AGENT must be all, codex, cursor, claude, gemini or none");
|
|
43
|
+
const targets = agent === "all"
|
|
44
|
+
? ["claude", "agents"]
|
|
45
|
+
: agent === "claude"
|
|
46
|
+
? ["claude"]
|
|
47
|
+
: ["agents"];
|
|
48
|
+
installSkill({ command: "tg", appName: "tg-cli", version: VERSION }, pathToFileURL(join(packageRoot, "skills/tg-cli/SKILL.md")), { env, targets });
|
|
49
|
+
note("tg: agent skill installed. Agent: read tg skill show before login; verify the installed skill is loaded.");
|
|
50
|
+
}
|
|
51
|
+
note("tg: guided account login: tg setup. Allow about five minutes; history downloads are separate.");
|
|
52
|
+
};
|
|
53
|
+
if (process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {
|
|
54
|
+
try {
|
|
55
|
+
completeGlobalInstall();
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
process.stderr.write(`tg installation incomplete: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
59
|
+
process.exitCode = 1;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=postinstall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postinstall.js","sourceRoot":"","sources":["../../src/install/postinstall.ts"],"names":[],"mappings":"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"}
|
package/dist/paths.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type Paths } from "@wirecat/cli-core";
|
|
2
|
+
export declare const APP: string;
|
|
3
|
+
export declare const pathsFor: (env?: NodeJS.ProcessEnv) => Paths;
|
|
4
|
+
/** A throwaway config directory must not share the real keyring entry (cli-core `isolated`). */
|
|
5
|
+
export declare const isolated: (env?: NodeJS.ProcessEnv) => boolean;
|
|
6
|
+
/** The MTProto session: an auth key, which is a credential as good as a password. */
|
|
7
|
+
export declare const sessionFile: (profile: string, env?: NodeJS.ProcessEnv) => string;
|
|
8
|
+
export declare const botSessionFile: (profile: string, botId: string, env?: NodeJS.ProcessEnv) => string;
|
|
9
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,KAAK,EAAoC,MAAM,mBAAmB,CAAA;AAGhF,eAAO,MAAM,GAAG,QAAa,CAAA;AAE7B,eAAO,MAAM,QAAQ,SAAS,MAAM,CAAC,UAAU,KAAiB,KACE,CAAA;AAElE,gGAAgG;AAChG,eAAO,MAAM,QAAQ,SAAS,MAAM,CAAC,UAAU,YACyB,CAAA;AAExE,qFAAqF;AACrF,eAAO,MAAM,WAAW,YAAa,MAAM,QAAO,MAAM,CAAC,UAAU,KAAiB,MACvB,CAAA;AAE7D,eAAO,MAAM,cAAc,YAAa,MAAM,SAAS,MAAM,QAAO,MAAM,CAAC,UAAU,KAAiB,MAC9B,CAAA"}
|
package/dist/paths.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { pathsAreOverridden, resolvePaths } from "@wirecat/cli-core";
|
|
3
|
+
import { TG } from "./app.js";
|
|
4
|
+
export const APP = TG.appName;
|
|
5
|
+
export const pathsFor = (env = process.env) => resolvePaths({ appName: TG.appName, prefix: TG.envPrefix, env });
|
|
6
|
+
/** A throwaway config directory must not share the real keyring entry (cli-core `isolated`). */
|
|
7
|
+
export const isolated = (env = process.env) => pathsAreOverridden({ appName: TG.appName, prefix: TG.envPrefix, env });
|
|
8
|
+
/** The MTProto session: an auth key, which is a credential as good as a password. */
|
|
9
|
+
export const sessionFile = (profile, env = process.env) => join(pathsFor(env).state, "sessions", `${profile}.session`);
|
|
10
|
+
export const botSessionFile = (profile, botId, env = process.env) => join(pathsFor(env).state, "bots", profile, `mtproto-${botId}.session`);
|
|
11
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAc,kBAAkB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChF,OAAO,EAAE,EAAE,EAAE,MAAM,UAAU,CAAA;AAE7B,MAAM,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAA;AAE7B,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,GAAG,GAAsB,OAAO,CAAC,GAAG,EAAS,EAAE,CACtE,YAAY,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAA;AAElE,gGAAgG;AAChG,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,GAAG,GAAsB,OAAO,CAAC,GAAG,EAAE,EAAE,CAC/D,kBAAkB,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAA;AAExE,qFAAqF;AACrF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,OAAe,EAAE,GAAG,GAAsB,OAAO,CAAC,GAAG,EAAU,EAAE,CAC3F,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,OAAO,UAAU,CAAC,CAAA;AAE7D,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAe,EAAE,KAAa,EAAE,GAAG,GAAsB,OAAO,CAAC,GAAG,EAAU,EAAE,CAC7G,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,KAAK,UAAU,CAAC,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
import { type Environment } from "./commands/context.js";
|
|
3
|
+
/** A revoked or missing login fails the same on every retry; serve reports a locked keyring with another code. */
|
|
4
|
+
export declare const NO_RESTART_ON: number[];
|
|
5
|
+
export declare const createProgram: () => Command;
|
|
6
|
+
/** Never throws: every outcome is an exit code, and a failure is said once, on stderr. */
|
|
7
|
+
export declare const run: (argv: string[], environment?: Environment) => Promise<number>;
|
|
8
|
+
//# sourceMappingURL=program.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"AAyCA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAIxC,OAAO,EAAE,KAAK,WAAW,EAAmB,MAAM,uBAAuB,CAAA;AAOzE,kHAAkH;AAClH,eAAO,MAAM,aAAa,UAAwC,CAAA;AAyFlE,eAAO,MAAM,aAAa,QAAO,OAA6B,CAAA;AAE9D,0FAA0F;AAC1F,eAAO,MAAM,GAAG,SAAgB,MAAM,EAAE,gBAAe,WAAW,KAAQ,OAAO,CAAC,MAAM,CAcvF,CAAA"}
|