@wirecat/max-cli 0.50.0 → 0.52.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.
- package/README.md +9 -9
- package/dist/adapter/max-adapter.d.ts.map +1 -1
- package/dist/adapter/max-adapter.js +8 -4
- package/dist/adapter/max-adapter.js.map +1 -1
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +2 -0
- package/dist/app.js.map +1 -1
- package/dist/bot/adapter.d.ts.map +1 -1
- package/dist/bot/adapter.js +3 -2
- package/dist/bot/adapter.js.map +1 -1
- package/dist/bot/mcp-tools.d.ts.map +1 -1
- package/dist/bot/mcp-tools.js +3 -3
- package/dist/bot/mcp-tools.js.map +1 -1
- package/dist/bot/transport.d.ts.map +1 -1
- package/dist/bot/transport.js +8 -3
- package/dist/bot/transport.js.map +1 -1
- package/dist/bot/uploads.d.ts +2 -2
- package/dist/bot/uploads.d.ts.map +1 -1
- package/dist/bot/uploads.js +3 -3
- package/dist/bot/uploads.js.map +1 -1
- package/dist/client/account.d.ts +39 -0
- package/dist/client/account.d.ts.map +1 -0
- package/dist/client/account.js +92 -0
- package/dist/client/account.js.map +1 -0
- package/dist/client/chat-members.d.ts +27 -0
- package/dist/client/chat-members.d.ts.map +1 -0
- package/dist/client/chat-members.js +73 -0
- package/dist/client/chat-members.js.map +1 -0
- package/dist/client/chat-reads.d.ts +57 -0
- package/dist/client/chat-reads.d.ts.map +1 -0
- package/dist/client/chat-reads.js +160 -0
- package/dist/client/chat-reads.js.map +1 -0
- package/dist/client/chat-writes.d.ts +111 -0
- package/dist/client/chat-writes.d.ts.map +1 -0
- package/dist/client/chat-writes.js +240 -0
- package/dist/client/chat-writes.js.map +1 -0
- package/dist/client/contacts.d.ts +39 -0
- package/dist/client/contacts.d.ts.map +1 -0
- package/dist/client/contacts.js +93 -0
- package/dist/client/contacts.js.map +1 -0
- package/dist/client/delivery.d.ts +35 -0
- package/dist/client/delivery.d.ts.map +1 -0
- package/dist/client/delivery.js +62 -0
- package/dist/client/delivery.js.map +1 -0
- package/dist/client/folders.d.ts +20 -0
- package/dist/client/folders.d.ts.map +1 -0
- package/dist/client/folders.js +57 -0
- package/dist/client/folders.js.map +1 -0
- package/dist/client/history.d.ts +41 -0
- package/dist/client/history.d.ts.map +1 -0
- package/dist/client/history.js +111 -0
- package/dist/client/history.js.map +1 -0
- package/dist/client/live.d.ts +38 -0
- package/dist/client/live.d.ts.map +1 -0
- package/dist/client/live.js +182 -0
- package/dist/client/live.js.map +1 -0
- package/dist/client/login.d.ts +11 -0
- package/dist/client/login.d.ts.map +1 -0
- package/dist/client/login.js +8 -0
- package/dist/client/login.js.map +1 -0
- package/dist/client/message-reads.d.ts +53 -0
- package/dist/client/message-reads.d.ts.map +1 -0
- package/dist/client/message-reads.js +164 -0
- package/dist/client/message-reads.js.map +1 -0
- package/dist/client/message-writes.d.ts +84 -0
- package/dist/client/message-writes.d.ts.map +1 -0
- package/dist/client/message-writes.js +254 -0
- package/dist/client/message-writes.js.map +1 -0
- package/dist/client/people.d.ts +31 -0
- package/dist/client/people.d.ts.map +1 -0
- package/dist/client/people.js +130 -0
- package/dist/client/people.js.map +1 -0
- package/dist/client/polls.d.ts +53 -0
- package/dist/client/polls.d.ts.map +1 -0
- package/dist/client/polls.js +141 -0
- package/dist/client/polls.js.map +1 -0
- package/dist/client/read-policy.d.ts +2 -0
- package/dist/client/read-policy.d.ts.map +1 -0
- package/dist/client/read-policy.js +34 -0
- package/dist/client/read-policy.js.map +1 -0
- package/dist/client/request.d.ts +21 -0
- package/dist/client/request.d.ts.map +1 -0
- package/dist/client/request.js +69 -0
- package/dist/client/request.js.map +1 -0
- package/dist/client/session.d.ts +50 -0
- package/dist/client/session.d.ts.map +1 -0
- package/dist/client/session.js +293 -0
- package/dist/client/session.js.map +1 -0
- package/dist/client/stickers.d.ts +12 -0
- package/dist/client/stickers.d.ts.map +1 -0
- package/dist/client/stickers.js +29 -0
- package/dist/client/stickers.js.map +1 -0
- package/dist/client/types.d.ts +54 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +2 -0
- package/dist/client/types.js.map +1 -0
- package/dist/client/upload-transport.d.ts +15 -0
- package/dist/client/upload-transport.d.ts.map +1 -0
- package/dist/client/upload-transport.js +49 -0
- package/dist/client/upload-transport.js.map +1 -0
- package/dist/client/uploads.d.ts +15 -0
- package/dist/client/uploads.d.ts.map +1 -0
- package/dist/client/uploads.js +25 -0
- package/dist/client/uploads.js.map +1 -0
- package/dist/client/values.d.ts +120 -0
- package/dist/client/values.d.ts.map +1 -0
- package/dist/client/values.js +186 -0
- package/dist/client/values.js.map +1 -0
- package/dist/client/writes.d.ts +40 -0
- package/dist/client/writes.d.ts.map +1 -0
- package/dist/client/writes.js +186 -0
- package/dist/client/writes.js.map +1 -0
- package/dist/client.d.ts +29 -644
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +267 -2828
- package/dist/client.js.map +1 -1
- package/dist/commands/bot-comments.d.ts.map +1 -1
- package/dist/commands/bot-comments.js +13 -13
- package/dist/commands/bot-comments.js.map +1 -1
- package/dist/commands/bot-context.d.ts.map +1 -1
- package/dist/commands/bot-context.js +11 -3
- package/dist/commands/bot-context.js.map +1 -1
- package/dist/commands/bot-members.d.ts.map +1 -1
- package/dist/commands/bot-members.js +25 -14
- package/dist/commands/bot-members.js.map +1 -1
- package/dist/commands/bot-messenger.d.ts +5 -2
- package/dist/commands/bot-messenger.d.ts.map +1 -1
- package/dist/commands/bot-messenger.js +7 -11
- package/dist/commands/bot-messenger.js.map +1 -1
- package/dist/commands/bot-setup.d.ts.map +1 -1
- package/dist/commands/bot-setup.js +3 -2
- package/dist/commands/bot-setup.js.map +1 -1
- package/dist/commands/bot.d.ts +2 -1
- package/dist/commands/bot.d.ts.map +1 -1
- package/dist/commands/bot.js +6 -6
- package/dist/commands/bot.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +33 -33
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/contacts.d.ts.map +1 -1
- package/dist/commands/contacts.js +4 -5
- package/dist/commands/contacts.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +10 -9
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +13 -13
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/messages.d.ts.map +1 -1
- package/dist/commands/messages.js +12 -4
- package/dist/commands/messages.js.map +1 -1
- package/dist/commands/paging.d.ts +0 -36
- package/dist/commands/paging.d.ts.map +1 -1
- package/dist/commands/paging.js +0 -50
- package/dist/commands/paging.js.map +1 -1
- package/dist/commands/recipients.d.ts.map +1 -1
- package/dist/commands/recipients.js +15 -14
- package/dist/commands/recipients.js.map +1 -1
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +14 -4
- package/dist/commands/serve.js.map +1 -1
- package/dist/commands/session.d.ts.map +1 -1
- package/dist/commands/session.js +8 -7
- package/dist/commands/session.js.map +1 -1
- package/dist/commands/setup.js +2 -2
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/watch.d.ts +4 -2
- package/dist/commands/watch.d.ts.map +1 -1
- package/dist/commands/watch.js +21 -5
- package/dist/commands/watch.js.map +1 -1
- package/dist/config.d.ts +843 -143
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +33 -33
- package/dist/config.js.map +1 -1
- package/dist/mcp/legacy-check.d.ts.map +1 -1
- package/dist/mcp/legacy-check.js +5 -3
- package/dist/mcp/legacy-check.js.map +1 -1
- package/dist/mcp/photo.d.ts.map +1 -1
- package/dist/mcp/photo.js +2 -2
- package/dist/mcp/photo.js.map +1 -1
- package/dist/mcp/prompts.d.ts.map +1 -1
- package/dist/mcp/prompts.js +10 -8
- package/dist/mcp/prompts.js.map +1 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +36 -27
- package/dist/mcp/tools.js.map +1 -1
- package/dist/messenger.d.ts.map +1 -1
- package/dist/messenger.js +11 -1
- package/dist/messenger.js.map +1 -1
- package/dist/permissions.d.ts.map +1 -1
- package/dist/permissions.js +4 -1
- package/dist/permissions.js.map +1 -1
- package/dist/program.d.ts.map +1 -1
- package/dist/program.js +7 -3
- package/dist/program.js.map +1 -1
- package/dist/protocol/connection.d.ts.map +1 -1
- package/dist/protocol/connection.js +44 -12
- package/dist/protocol/connection.js.map +1 -1
- package/dist/sends.d.ts +1 -1
- package/dist/sends.js +1 -1
- package/dist/server/server.d.ts +3 -1
- package/dist/server/server.d.ts.map +1 -1
- package/dist/server/server.js +39 -21
- package/dist/server/server.js.map +1 -1
- package/dist/server/subscribe.d.ts.map +1 -1
- package/dist/server/subscribe.js +30 -4
- package/dist/server/subscribe.js.map +1 -1
- package/dist/server/subscribers.d.ts +18 -0
- package/dist/server/subscribers.d.ts.map +1 -0
- package/dist/server/subscribers.js +146 -0
- package/dist/server/subscribers.js.map +1 -0
- package/dist/upload.d.ts +6 -5
- package/dist/upload.d.ts.map +1 -1
- package/dist/upload.js +16 -11
- package/dist/upload.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +3 -3
- package/skills/max-cli/SKILL.md +79 -59
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
import { CliError } from "@wirecat/cli-base";
|
|
2
|
+
import { toChat, toContact, toProfile } from "../domain/map.js";
|
|
3
|
+
import { asFirstWord } from "../profile.js";
|
|
4
|
+
import { asId } from "../protocol/frame.js";
|
|
5
|
+
import { LOGIN_CHATS, startSession } from "../session/handshake.js";
|
|
6
|
+
import { withLoginRefused, withoutLoginPause } from "../session/store.js";
|
|
7
|
+
import { WEB_USER_AGENT } from "../spec/identity.js";
|
|
8
|
+
import { asArray, asCliError, asMarker, CHATS_PAGE_SEEN, eventTime, reasonOf, record, refuseWhilePaused, } from "./values.js";
|
|
9
|
+
export const createSession = (deps) => {
|
|
10
|
+
let login;
|
|
11
|
+
let chatsCut = false;
|
|
12
|
+
let chatsComplete = false;
|
|
13
|
+
let merged;
|
|
14
|
+
let connecting;
|
|
15
|
+
let closed = false;
|
|
16
|
+
const connect = (options = {}) => {
|
|
17
|
+
if (closed)
|
|
18
|
+
return Promise.reject(new CliError("network_error", "the client is closed"));
|
|
19
|
+
if (!connecting)
|
|
20
|
+
connecting = performConnect(options)
|
|
21
|
+
.catch((error) => {
|
|
22
|
+
login = undefined;
|
|
23
|
+
throw error;
|
|
24
|
+
})
|
|
25
|
+
.finally(() => {
|
|
26
|
+
connecting = undefined;
|
|
27
|
+
});
|
|
28
|
+
return connecting;
|
|
29
|
+
};
|
|
30
|
+
async function performConnect({ token: candidate } = {}) {
|
|
31
|
+
if (deps.offline)
|
|
32
|
+
throw new CliError("validation_error", "`--offline` reads through the shared store; it cannot connect to MAX");
|
|
33
|
+
const token = candidate ?? deps.store.readToken();
|
|
34
|
+
if (!token) {
|
|
35
|
+
const profile = deps.store.profile;
|
|
36
|
+
// cli-base swallows a keyring that will not open, so the state file is the only witness: a
|
|
37
|
+
// profile that has logged in lost its keyring, not its session, and another login would
|
|
38
|
+
// register one more device for nothing (MAX-50, measured from cron 2026-09-25).
|
|
39
|
+
if (deps.store.hasLoggedIn()) {
|
|
40
|
+
throw new CliError("authentication_error", `no token found for profile "${profile}", although it has logged in on this machine — ` +
|
|
41
|
+
`the keyring is probably out of reach (cron, ssh: set XDG_RUNTIME_DIR); ` +
|
|
42
|
+
`\`max ${asFirstWord(profile)}doctor\` shows it. Log in again only if the token was removed`);
|
|
43
|
+
}
|
|
44
|
+
if (deps.store.isBot()) {
|
|
45
|
+
throw new CliError("authentication_error", `profile "${profile}" is a bot — its commands are \`max ${asFirstWord(profile)}bot …\`; ` +
|
|
46
|
+
`\`max ${asFirstWord(profile)}session start\` would add a personal account to it`);
|
|
47
|
+
}
|
|
48
|
+
// The fix has to carry the profile, or it logs the wrong one in: a name nobody has logged
|
|
49
|
+
// in under is the ordinary shape of this failure now that the first word is the profile.
|
|
50
|
+
throw new CliError("authentication_error", `no session for profile "${profile}" — run \`max ${asFirstWord(profile)}setup\` in a local terminal; agents: read \`max skill show\``);
|
|
51
|
+
}
|
|
52
|
+
const state = deps.store.readState();
|
|
53
|
+
refuseWhilePaused(state);
|
|
54
|
+
const sync = deps.fullLogin ? undefined : await loginMarker();
|
|
55
|
+
try {
|
|
56
|
+
await deps.connection.open();
|
|
57
|
+
if (closed)
|
|
58
|
+
throw new CliError("network_error", "the client is closed");
|
|
59
|
+
const answer = await startSession(deps.invoke, {
|
|
60
|
+
token,
|
|
61
|
+
deviceId: state.deviceId,
|
|
62
|
+
...(sync === undefined ? {} : { sync }),
|
|
63
|
+
...(deps.resume ? { resume: deps.resume.login } : {}),
|
|
64
|
+
});
|
|
65
|
+
login = answer;
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
const failure = asCliError(error);
|
|
69
|
+
if (failure.code !== "rate_limited")
|
|
70
|
+
throw failure;
|
|
71
|
+
const paused = withLoginRefused(state);
|
|
72
|
+
deps.store.writeState(paused);
|
|
73
|
+
throw new CliError("rate_limited", `${failure.message} — this profile will not log in again before ${paused.loginPausedUntil}; ` +
|
|
74
|
+
"logging in sooner is what keeps an account locked");
|
|
75
|
+
}
|
|
76
|
+
// MAX has counted this login by now, so its state and rotated token are kept even when the client
|
|
77
|
+
// closed meanwhile; dropping them would make the next run log in again.
|
|
78
|
+
const viewerId = toProfile(record(login.profile) ?? {}).id;
|
|
79
|
+
// **Before `writeState`**, so a login we are about to refuse does not count itself or move
|
|
80
|
+
// `lastLoginAt`. A profile is a person, not a directory name: if this token belongs to someone
|
|
81
|
+
// else, every later command in this process would send as them and nothing would say so.
|
|
82
|
+
// Switching accounts has a door already — `session end` clears the id along with the token.
|
|
83
|
+
if (viewerId && state.viewerId && viewerId !== state.viewerId) {
|
|
84
|
+
throw new CliError("authentication_error", `this token is for a different account than profile "${deps.store.profile}" was set up with — ` +
|
|
85
|
+
`run \`max ${asFirstWord(deps.store.profile)}session end\` first if you meant to switch`);
|
|
86
|
+
}
|
|
87
|
+
deps.store.writeState({
|
|
88
|
+
...withoutLoginPause(state),
|
|
89
|
+
...(viewerId ? { viewerId } : {}),
|
|
90
|
+
logins: state.logins + 1,
|
|
91
|
+
lastLoginAt: new Date(deps.now()).toISOString(),
|
|
92
|
+
});
|
|
93
|
+
keepRotatedToken(token);
|
|
94
|
+
// `max serve` hands this login to any process that asks its socket; none of them needs the token.
|
|
95
|
+
const { token: _, ...withoutToken } = login;
|
|
96
|
+
login = withoutToken;
|
|
97
|
+
if (closed)
|
|
98
|
+
throw new CliError("network_error", "the client is closed");
|
|
99
|
+
if (deps.resume)
|
|
100
|
+
mergeChanged(deps.resume.chats);
|
|
101
|
+
else
|
|
102
|
+
await readRestOfChats();
|
|
103
|
+
await mergeLogin(viewerId);
|
|
104
|
+
if (closed)
|
|
105
|
+
throw new CliError("network_error", "the client is closed");
|
|
106
|
+
}
|
|
107
|
+
async function connectOnce() {
|
|
108
|
+
if (closed)
|
|
109
|
+
throw new CliError("network_error", "the client is closed");
|
|
110
|
+
if (connecting)
|
|
111
|
+
await connecting;
|
|
112
|
+
else if (!login)
|
|
113
|
+
await connect();
|
|
114
|
+
}
|
|
115
|
+
function mergeChanged(before) {
|
|
116
|
+
const session = snapshot();
|
|
117
|
+
const changed = asArray(session.chats);
|
|
118
|
+
const ids = new Set(changed.map((chat) => asId(record(chat)?.id)));
|
|
119
|
+
const kept = before.filter((chat) => !ids.has(asId(chat.id)));
|
|
120
|
+
session.chats = [...changed, ...kept].sort((a, b) => eventTime(b) - eventTime(a));
|
|
121
|
+
}
|
|
122
|
+
async function readRestOfChats() {
|
|
123
|
+
chatsCut = false;
|
|
124
|
+
chatsComplete = false;
|
|
125
|
+
const session = snapshot();
|
|
126
|
+
const chats = asArray(session.chats);
|
|
127
|
+
const marker = record(chats.at(-1))?.lastEventTime;
|
|
128
|
+
if (chats.length < LOGIN_CHATS) {
|
|
129
|
+
chatsComplete = true;
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
if (typeof marker !== "number" && typeof marker !== "bigint")
|
|
133
|
+
return;
|
|
134
|
+
try {
|
|
135
|
+
const answer = await deps.wire.chats.list({ marker: Number(marker) });
|
|
136
|
+
const known = new Set(chats.map((chat) => asId(record(chat)?.id)));
|
|
137
|
+
const rest = asArray(answer.chats).filter((chat) => !known.has(asId(record(chat)?.id)));
|
|
138
|
+
session.chats = [...chats, ...rest];
|
|
139
|
+
chatsCut = rest.length >= CHATS_PAGE_SEEN;
|
|
140
|
+
chatsComplete = !chatsCut;
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
chatsCut = true;
|
|
144
|
+
deps.warnAbout("chats_partial", `only the newest ${chats.length} chats were read: ${reasonOf(error)}`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
function keepRotatedToken(sent) {
|
|
148
|
+
const rotated = snapshot().token;
|
|
149
|
+
if (typeof rotated !== "string" || rotated === "" || rotated === sent)
|
|
150
|
+
return;
|
|
151
|
+
if (fromEnvironment()) {
|
|
152
|
+
deps.warnAbout("token_not_saved", "MAX refreshed the session; the fresh token was not saved, because the one in use came from MAX_TOKEN");
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
try {
|
|
156
|
+
deps.store.writeToken(rotated);
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
deps.warnAbout("token_not_saved", `the refreshed session could not be saved, so the previous one is still in use: ${reasonOf(error)}`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
async function mergeLogin(viewerId) {
|
|
163
|
+
const marker = asMarker(snapshot().time);
|
|
164
|
+
if (!deps.record)
|
|
165
|
+
return;
|
|
166
|
+
const chats = asArray(snapshot().chats);
|
|
167
|
+
const members = new Map();
|
|
168
|
+
for (const raw of chats) {
|
|
169
|
+
const chat = toChat(raw);
|
|
170
|
+
// A channel lists four of its hundred and seventy-eight thousand subscribers, so its
|
|
171
|
+
// `participants` is not a membership — storing it would be storing a wrong answer.
|
|
172
|
+
if (!chat.id || chat.kind === "channel")
|
|
173
|
+
continue;
|
|
174
|
+
const participants = participantsOf(raw, viewerId);
|
|
175
|
+
if (participants !== undefined)
|
|
176
|
+
members.set(chat.id, participants);
|
|
177
|
+
}
|
|
178
|
+
const delta = {
|
|
179
|
+
chats: chats.map(toChat).filter((chat) => chat.id !== ""),
|
|
180
|
+
people: asArray(snapshot().contacts)
|
|
181
|
+
.map(toContact)
|
|
182
|
+
.filter((contact) => contact.id !== ""),
|
|
183
|
+
members,
|
|
184
|
+
};
|
|
185
|
+
// A login `max serve` made answered its own marker, not the record's: what changed before it is not in it.
|
|
186
|
+
const own = deps.server?.journals !== true;
|
|
187
|
+
await keep("login", async (record) => {
|
|
188
|
+
const summary = await record.applyLogin({ ...delta, ...(own && marker !== undefined ? { marker } : {}) });
|
|
189
|
+
merged = summary;
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
async function loginMarker() {
|
|
193
|
+
let marker;
|
|
194
|
+
await keep("marker", async (record) => {
|
|
195
|
+
marker = await record.syncMarker();
|
|
196
|
+
});
|
|
197
|
+
return marker;
|
|
198
|
+
}
|
|
199
|
+
async function keep(what, write) {
|
|
200
|
+
if (!deps.record)
|
|
201
|
+
return;
|
|
202
|
+
try {
|
|
203
|
+
await write(deps.record);
|
|
204
|
+
}
|
|
205
|
+
catch (error) {
|
|
206
|
+
deps.warnAbout("cache_not_written", `the local store did not take the ${what}: ${reasonOf(error)}`);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
function participantsOf(chat, viewerId) {
|
|
210
|
+
const participants = record(chat.participants);
|
|
211
|
+
return participants === undefined ? undefined : Object.keys(participants).filter((id) => id !== viewerId);
|
|
212
|
+
}
|
|
213
|
+
async function logout() {
|
|
214
|
+
if (deps.offline)
|
|
215
|
+
throw new CliError("validation_error", "`--offline` cannot log out on MAX's side");
|
|
216
|
+
await connectOnce();
|
|
217
|
+
await deps.wire.session.logout({});
|
|
218
|
+
}
|
|
219
|
+
async function close() {
|
|
220
|
+
closed = true;
|
|
221
|
+
await deps.connection.close();
|
|
222
|
+
}
|
|
223
|
+
async function beforeLogin(flow) {
|
|
224
|
+
try {
|
|
225
|
+
await deps.connection.open();
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
throw asCliError(error);
|
|
229
|
+
}
|
|
230
|
+
await deps.wire.session.init({ userAgent: WEB_USER_AGENT, deviceId: deps.store.readState().deviceId });
|
|
231
|
+
return await flow();
|
|
232
|
+
}
|
|
233
|
+
function fromEnvironment() {
|
|
234
|
+
try {
|
|
235
|
+
return deps.store.tokenSource() === "environment";
|
|
236
|
+
}
|
|
237
|
+
catch {
|
|
238
|
+
return false;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
function keepSettings(sent, answer) {
|
|
242
|
+
const login = snapshot();
|
|
243
|
+
const config = record(login.config) ?? {};
|
|
244
|
+
login.config = {
|
|
245
|
+
...config,
|
|
246
|
+
...(typeof answer.hash === "string" ? { hash: answer.hash } : {}),
|
|
247
|
+
...(sent.user ? { user: { ...(record(config.user) ?? {}), ...sent.user, ...(record(answer.user) ?? {}) } } : {}),
|
|
248
|
+
...(sent.chats ? { chats: { ...(record(config.chats) ?? {}), ...sent.chats } } : {}),
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
function lastEventOf(chatId) {
|
|
252
|
+
const chat = asArray(snapshot().chats).find((one) => asId(one.id) === chatId);
|
|
253
|
+
return eventTime(chat) || deps.now();
|
|
254
|
+
}
|
|
255
|
+
function snapshot() {
|
|
256
|
+
if (!login)
|
|
257
|
+
throw new CliError("configuration_error", "connect() was never called");
|
|
258
|
+
return login;
|
|
259
|
+
}
|
|
260
|
+
return {
|
|
261
|
+
connect: connect,
|
|
262
|
+
connectOnce: connectOnce,
|
|
263
|
+
keep: keep,
|
|
264
|
+
participantsOf: participantsOf,
|
|
265
|
+
logout: logout,
|
|
266
|
+
close: close,
|
|
267
|
+
beforeLogin: beforeLogin,
|
|
268
|
+
fromEnvironment: fromEnvironment,
|
|
269
|
+
keepSettings: keepSettings,
|
|
270
|
+
lastEventOf: lastEventOf,
|
|
271
|
+
session: () => {
|
|
272
|
+
if (connecting)
|
|
273
|
+
throw new CliError("configuration_error", "the login is still initializing");
|
|
274
|
+
return snapshot();
|
|
275
|
+
},
|
|
276
|
+
get login() {
|
|
277
|
+
return connecting ? undefined : login;
|
|
278
|
+
},
|
|
279
|
+
set login(value) {
|
|
280
|
+
login = value;
|
|
281
|
+
},
|
|
282
|
+
get chatsCut() {
|
|
283
|
+
return chatsCut;
|
|
284
|
+
},
|
|
285
|
+
get chatsComplete() {
|
|
286
|
+
return chatsComplete;
|
|
287
|
+
},
|
|
288
|
+
get merged() {
|
|
289
|
+
return merged;
|
|
290
|
+
},
|
|
291
|
+
};
|
|
292
|
+
};
|
|
293
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/client/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Id, Sticker, StickerSet } from "../domain/models.js";
|
|
2
|
+
import type { wireClient } from "../generated/client.generated.js";
|
|
3
|
+
interface Dependencies {
|
|
4
|
+
connectOnce: () => Promise<void>;
|
|
5
|
+
readonly wire: Pick<ReturnType<typeof wireClient>, "assets">;
|
|
6
|
+
}
|
|
7
|
+
export declare const createStickers: (deps: Dependencies) => {
|
|
8
|
+
sets: () => Promise<StickerSet[]>;
|
|
9
|
+
list: (setId: Id) => Promise<Sticker[]>;
|
|
10
|
+
};
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=stickers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stickers.d.ts","sourceRoot":"","sources":["../../src/client/stickers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAGlE,UAAU,YAAY;IACpB,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAChC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,EAAE,QAAQ,CAAC,CAAA;CAC7D;AAED,eAAO,MAAM,cAAc,SAAU,YAAY;IAqBtC,IAAI,QAnBK,OAAO,CAAC,UAAU,EAAE,CAAC;IAmBT,IAAI,UAXZ,EAAE,KAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CAY9C,CAAA"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { CliError } from "@wirecat/cli-base";
|
|
2
|
+
import { toSticker, toStickerSet } from "../domain/map.js";
|
|
3
|
+
import { asArray, numbers, record } from "./values.js";
|
|
4
|
+
export const createStickers = (deps) => {
|
|
5
|
+
const resource = {
|
|
6
|
+
sets: async () => {
|
|
7
|
+
await deps.connectOnce();
|
|
8
|
+
const sections = asArray((await deps.wire.assets.update({ type: "STICKER", sync: 0 })).sections);
|
|
9
|
+
const ids = [...new Set(sections.flatMap((section) => numbers(record(section)?.stickerSets)))];
|
|
10
|
+
if (ids.length === 0)
|
|
11
|
+
return [];
|
|
12
|
+
const answer = await deps.wire.assets.byIds({ type: "STICKER_SET", ids });
|
|
13
|
+
return asArray(answer.stickerSets).map((raw) => toStickerSet(record(raw) ?? {}));
|
|
14
|
+
},
|
|
15
|
+
list: async (setId) => {
|
|
16
|
+
await deps.connectOnce();
|
|
17
|
+
const [set] = asArray((await deps.wire.assets.byIds({ type: "STICKER_SET", ids: [Number(setId)] })).stickerSets);
|
|
18
|
+
if (set === undefined)
|
|
19
|
+
throw new CliError("not_found", `no sticker set ${setId} — \`stickers list\` names the sets`);
|
|
20
|
+
const ids = numbers(record(set)?.stickers);
|
|
21
|
+
if (ids.length === 0)
|
|
22
|
+
return [];
|
|
23
|
+
const answer = await deps.wire.assets.byIds({ type: "STICKER", ids });
|
|
24
|
+
return asArray(answer.stickers).map((raw) => toSticker(record(raw) ?? {}));
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
return { sets: resource.sets, list: resource.list };
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=stickers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stickers.js","sourceRoot":"","sources":["../../src/client/stickers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAG1D,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAOtD,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,IAAkB,EAAE,EAAE;IACnD,MAAM,QAAQ,GAAG;QACf,IAAI,EAAE,KAAK,IAA2B,EAAE;YACtC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAA;YACxB,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;YAChG,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;YAC9F,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAA;YAC/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC,CAAA;YACzE,OAAO,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;QAClF,CAAC;QACD,IAAI,EAAE,KAAK,EAAE,KAAS,EAAsB,EAAE;YAC5C,MAAM,IAAI,CAAC,WAAW,EAAE,CAAA;YACxB,MAAM,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAA;YAChH,IAAI,GAAG,KAAK,SAAS;gBACnB,MAAM,IAAI,QAAQ,CAAC,WAAW,EAAE,kBAAkB,KAAK,qCAAqC,CAAC,CAAA;YAC/F,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAA;YAC1C,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAA;YAC/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAA;YACrE,OAAO,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;QAC5E,CAAC;KACF,CAAA;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAA;AACrD,CAAC,CAAA"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { SleepLike } from "@wirecat/cli-base";
|
|
2
|
+
import type { DiagnosticEvent } from "@wirecat/cli-core/cli";
|
|
3
|
+
import type { SendGuard } from "@wirecat/cli-core/sends";
|
|
4
|
+
import type { Wire } from "../protocol/connection.js";
|
|
5
|
+
import type { MaxRecord } from "../record.js";
|
|
6
|
+
import type { SessionStore } from "../session/store.js";
|
|
7
|
+
import type { ResumeFrom } from "./values.js";
|
|
8
|
+
export interface Upload {
|
|
9
|
+
path: string;
|
|
10
|
+
body: Blob;
|
|
11
|
+
kind: "photo" | "video" | "file" | "voice";
|
|
12
|
+
voice?: {
|
|
13
|
+
durationMs: number;
|
|
14
|
+
wave: Uint8Array;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export interface MaxClientOptions {
|
|
18
|
+
now?: () => number;
|
|
19
|
+
monotonicNow?: () => number;
|
|
20
|
+
store: SessionStore;
|
|
21
|
+
timeoutMs?: number;
|
|
22
|
+
/** Injected by tests, or one through `max serve`; defaults to a real WebSocket connection. */
|
|
23
|
+
connection?: Wire;
|
|
24
|
+
/**
|
|
25
|
+
* Log in without the saved contact marker, so the answer names every contact. `max serve` needs that: it hands its login to other commands as theirs.
|
|
26
|
+
*/
|
|
27
|
+
fullLogin?: boolean;
|
|
28
|
+
/** The previous connection's login, for logging in again as a web tab does (`MAX-51`). `max serve` only. */
|
|
29
|
+
resume?: ResumeFrom;
|
|
30
|
+
/**
|
|
31
|
+
* Where a protocol note goes. Never stdout: in machine mode that stream carries one JSON value
|
|
32
|
+
* and nothing else.
|
|
33
|
+
*/
|
|
34
|
+
warn?: (message: string) => void;
|
|
35
|
+
/** What the login brings, kept in the shared `messages.db`. */
|
|
36
|
+
record?: MaxRecord;
|
|
37
|
+
/** Refuse network use; the shared services own offline reads. */
|
|
38
|
+
offline?: boolean;
|
|
39
|
+
/**
|
|
40
|
+
* One event per request, for whoever is keeping a diagnostic. Injected the way `warn` is: the
|
|
41
|
+
* client reports what it did and never decides where that goes. Absent means nothing is kept.
|
|
42
|
+
*/
|
|
43
|
+
events?: (event: DiagnosticEvent) => void;
|
|
44
|
+
/**
|
|
45
|
+
* Asked before every send and told its outcome. `"caller"` when whoever holds the client guards
|
|
46
|
+
* its writes instead: the shared services, or `max serve` for each write it forwards.
|
|
47
|
+
* Required, so a client without a guard is a choice somebody wrote and never one they forgot.
|
|
48
|
+
*/
|
|
49
|
+
sends: SendGuard | "caller";
|
|
50
|
+
reads?: (key: string) => void;
|
|
51
|
+
/** The wait between retries; a test passes one that returns at once. */
|
|
52
|
+
sleep?: SleepLike;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,2BAA2B,CAAA;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAE7C,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,IAAI,CAAA;IACV,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,CAAA;IAC1C,KAAK,CAAC,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,UAAU,CAAA;KAAE,CAAA;CACjD;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,MAAM,CAAA;IAC3B,KAAK,EAAE,YAAY,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,8FAA8F;IAC9F,UAAU,CAAC,EAAE,IAAI,CAAA;IACjB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,4GAA4G;IAC5G,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB;;;OAGG;IACH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IAChC,+DAA+D;IAC/D,MAAM,CAAC,EAAE,SAAS,CAAA;IAClB,iEAAiE;IACjE,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB;;;OAGG;IACH,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAA;IACzC;;;;OAIG;IACH,KAAK,EAAE,SAAS,GAAG,QAAQ,CAAA;IAC3B,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAC7B,wEAAwE;IACxE,KAAK,CAAC,EAAE,SAAS,CAAA;CAClB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type Upload as SharedUpload } from "@wirecat/cli-core/sends";
|
|
2
|
+
import type { wireClient } from "../generated/client.generated.js";
|
|
3
|
+
import type { Payload } from "../protocol/frame.js";
|
|
4
|
+
import type { Upload } from "./types.js";
|
|
5
|
+
interface Dependencies {
|
|
6
|
+
readonly wire: Pick<ReturnType<typeof wireClient>, "uploads">;
|
|
7
|
+
}
|
|
8
|
+
export declare const createUploadTransport: (deps: Dependencies) => {
|
|
9
|
+
photoToken: (photo: string | SharedUpload, { profile }: {
|
|
10
|
+
profile: boolean;
|
|
11
|
+
}) => Promise<string>;
|
|
12
|
+
upload: ({ path, body, kind, voice }: Upload) => Promise<Payload>;
|
|
13
|
+
};
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=upload-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload-transport.d.ts","sourceRoot":"","sources":["../../src/client/upload-transport.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,MAAM,IAAI,YAAY,EAAc,MAAM,yBAAyB,CAAA;AACjF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAClE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAEnD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAGxC,UAAU,YAAY;IACpB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,EAAE,SAAS,CAAC,CAAA;CAC9D;AACD,eAAO,MAAM,qBAAqB,SAAU,YAAY;wBAErB,MAAM,GAAG,YAAY,eAAe;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,KAAG,OAAO,CAAC,MAAM,CAAC;0CAaxD,MAAM,KAAG,OAAO,CAAC,OAAO,CAAC;CA0B7E,CAAA"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { CliError } from "@wirecat/cli-base";
|
|
2
|
+
import { uploadBlob } from "@wirecat/cli-core/sends";
|
|
3
|
+
import { isImage, openUpload, uploadFile, uploadMedia, uploadPhoto } from "../upload.js";
|
|
4
|
+
import { asArray, record } from "./values.js";
|
|
5
|
+
export const createUploadTransport = (deps) => {
|
|
6
|
+
/** A group's photo goes up as a message photo does; the web client asks `{count: 1}` for it (2026-10-08). */
|
|
7
|
+
async function photoToken(photo, { profile }) {
|
|
8
|
+
const path = typeof photo === "string" ? photo : photo.name;
|
|
9
|
+
if (!isImage(path))
|
|
10
|
+
throw new CliError("validation_error", `${path} is not an image MAX takes as a photo`);
|
|
11
|
+
const body = typeof photo === "string" ? await openUpload(photo) : await uploadBlob(photo.source);
|
|
12
|
+
const { url } = await deps.wire.uploads.photo({ count: 1, type: 0, uploaderType: 0, profile });
|
|
13
|
+
if (typeof url !== "string")
|
|
14
|
+
throw new CliError("provider_error", "MAX gave no address to upload the photo to");
|
|
15
|
+
return uploadPhoto(url, path, body);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Uploads one file and answers what the message attaches (measured 2026-09-24). An upload is never
|
|
19
|
+
* retried: a failure here happens before `MSG_SEND`, so nothing was sent.
|
|
20
|
+
*/
|
|
21
|
+
async function upload({ path, body, kind, voice }) {
|
|
22
|
+
const request = { count: 1, type: 0, uploaderType: 0, profile: false };
|
|
23
|
+
if (kind === "photo") {
|
|
24
|
+
const { url } = await deps.wire.uploads.photo(request);
|
|
25
|
+
if (typeof url !== "string")
|
|
26
|
+
throw new CliError("provider_error", "MAX gave no address to upload the photo to");
|
|
27
|
+
return { _type: "PHOTO", photoToken: await uploadPhoto(url, path, body) };
|
|
28
|
+
}
|
|
29
|
+
if (kind === "video" || kind === "voice") {
|
|
30
|
+
const slot = voice ? { ...request, type: 2, uploaderType: 1 } : request;
|
|
31
|
+
const info = record(asArray((await deps.wire.uploads.video(slot)).info)[0]) ?? {};
|
|
32
|
+
if (typeof info.url !== "string" || info.videoId === undefined) {
|
|
33
|
+
throw new CliError("provider_error", `MAX gave no address to upload the ${kind} to`);
|
|
34
|
+
}
|
|
35
|
+
await uploadMedia(voice ? "voice message" : "video", info.url, path, body);
|
|
36
|
+
return voice
|
|
37
|
+
? { _type: "AUDIO", audioId: info.videoId, duration: voice.durationMs, wave: voice.wave, token: info.token }
|
|
38
|
+
: { _type: "VIDEO", videoId: info.videoId, token: info.token, videoType: 0 };
|
|
39
|
+
}
|
|
40
|
+
const info = record(asArray((await deps.wire.uploads.file(request)).info)[0]) ?? {};
|
|
41
|
+
if (typeof info.url !== "string" || info.fileId === undefined) {
|
|
42
|
+
throw new CliError("provider_error", "MAX gave no address to upload the file to");
|
|
43
|
+
}
|
|
44
|
+
await uploadFile(info.url, path, body);
|
|
45
|
+
return { _type: "FILE", fileId: info.fileId };
|
|
46
|
+
}
|
|
47
|
+
return { photoToken, upload };
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=upload-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload-transport.js","sourceRoot":"","sources":["../../src/client/upload-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Upload } from "./types.js";
|
|
2
|
+
interface UploadSelection {
|
|
3
|
+
files?: string[];
|
|
4
|
+
uploads?: {
|
|
5
|
+
name: string;
|
|
6
|
+
body: Blob;
|
|
7
|
+
kind: Upload["kind"];
|
|
8
|
+
}[];
|
|
9
|
+
voice?: string;
|
|
10
|
+
asFile?: boolean;
|
|
11
|
+
anyFile?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare const prepareUploads: (options: UploadSelection) => Promise<Upload[]>;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=uploads.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uploads.d.ts","sourceRoot":"","sources":["../../src/client/uploads.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAExC,UAAU,eAAe;IACvB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,OAAO,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;KAAE,EAAE,CAAA;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AASD,eAAO,MAAM,cAAc,YAAmB,eAAe,KAAG,OAAO,CAAC,MAAM,EAAE,CAe/E,CAAA"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { CliError } from "@wirecat/cli-base";
|
|
2
|
+
import { MAX_BUFFERED_UPLOAD_BYTES } from "@wirecat/cli-core/sends";
|
|
3
|
+
import { isImage, isVideo, openUpload } from "../upload.js";
|
|
4
|
+
import { voiceOf } from "../voice.js";
|
|
5
|
+
/** A voice message is decoded for its length and waveform, so it is read whole — and only up to the cap. */
|
|
6
|
+
const voice = async (name, body) => {
|
|
7
|
+
if (body.size > MAX_BUFFERED_UPLOAD_BYTES)
|
|
8
|
+
throw new CliError("validation_error", `${name} is too long for a voice message — nothing was sent`);
|
|
9
|
+
return voiceOf(name, Buffer.from(await body.arrayBuffer()));
|
|
10
|
+
};
|
|
11
|
+
export const prepareUploads = async (options) => {
|
|
12
|
+
const files = await Promise.all((options.files ?? []).map(async (path) => ({
|
|
13
|
+
path,
|
|
14
|
+
body: await openUpload(path, { anyFile: options.anyFile === true }),
|
|
15
|
+
kind: isImage(path) ? "photo" : isVideo(path) && options.asFile !== true ? "video" : "file",
|
|
16
|
+
})));
|
|
17
|
+
for (const { name, body, kind } of options.uploads ?? [])
|
|
18
|
+
files.push({ path: name, body, kind, ...(kind === "voice" ? { voice: await voice(name, body) } : {}) });
|
|
19
|
+
if (options.voice !== undefined) {
|
|
20
|
+
const body = await openUpload(options.voice, { anyFile: options.anyFile === true });
|
|
21
|
+
files.push({ path: options.voice, body, kind: "voice", voice: await voice(options.voice, body) });
|
|
22
|
+
}
|
|
23
|
+
return files;
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=uploads.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uploads.js","sourceRoot":"","sources":["../../src/client/uploads.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAA;AACnE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAWrC,4GAA4G;AAC5G,MAAM,KAAK,GAAG,KAAK,EAAE,IAAY,EAAE,IAAU,EAAE,EAAE;IAC/C,IAAI,IAAI,CAAC,IAAI,GAAG,yBAAyB;QACvC,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,GAAG,IAAI,qDAAqD,CAAC,CAAA;IACtG,OAAO,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;AAC7D,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EAAE,OAAwB,EAAqB,EAAE;IAClF,MAAM,KAAK,GAAa,MAAM,OAAO,CAAC,GAAG,CACvC,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QACzC,IAAI;QACJ,IAAI,EAAE,MAAM,UAAU,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QACnE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;KAC5F,CAAC,CAAC,CACJ,CAAA;IACD,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,OAAO,CAAC,OAAO,IAAI,EAAE;QACtD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;IACzG,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC,CAAA;QACnF,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,CAAA;IACnG,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC,CAAA"}
|