@leemour/max-cli 0.13.0 → 0.15.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 +92 -14
- package/dist/bot/auth.d.ts +23 -0
- package/dist/bot/auth.d.ts.map +1 -0
- package/dist/bot/auth.js +36 -0
- package/dist/bot/auth.js.map +1 -0
- package/dist/bot/client.d.ts +20 -0
- package/dist/bot/client.d.ts.map +1 -0
- package/dist/bot/client.js +91 -0
- package/dist/bot/client.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 +1232 -0
- package/dist/bot/generated/manifest.js.map +1 -0
- package/dist/bot/generated/schemas.d.ts +271 -0
- package/dist/bot/generated/schemas.d.ts.map +1 -0
- package/dist/bot/generated/schemas.js +869 -0
- package/dist/bot/generated/schemas.js.map +1 -0
- package/dist/bot/generated/types.d.ts +1088 -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/input.d.ts +10 -0
- package/dist/bot/input.d.ts.map +1 -0
- package/dist/bot/input.js +88 -0
- package/dist/bot/input.js.map +1 -0
- package/dist/bot/keep.d.ts +25 -0
- package/dist/bot/keep.d.ts.map +1 -0
- package/dist/bot/keep.js +96 -0
- package/dist/bot/keep.js.map +1 -0
- package/dist/bot/map.d.ts +11 -0
- package/dist/bot/map.d.ts.map +1 -0
- package/dist/bot/map.js +76 -0
- package/dist/bot/map.js.map +1 -0
- package/dist/bot/permissions.d.ts +14 -0
- package/dist/bot/permissions.d.ts.map +1 -0
- package/dist/bot/permissions.js +53 -0
- package/dist/bot/permissions.js.map +1 -0
- package/dist/bot/registry.d.ts +30 -0
- package/dist/bot/registry.d.ts.map +1 -0
- package/dist/bot/registry.js +85 -0
- package/dist/bot/registry.js.map +1 -0
- package/dist/bot/russian-trusted-root.d.ts +8 -0
- package/dist/bot/russian-trusted-root.d.ts.map +1 -0
- package/dist/bot/russian-trusted-root.js +41 -0
- package/dist/bot/russian-trusted-root.js.map +1 -0
- package/dist/bot/transport.d.ts +41 -0
- package/dist/bot/transport.d.ts.map +1 -0
- package/dist/bot/transport.js +200 -0
- package/dist/bot/transport.js.map +1 -0
- package/dist/bot/uploads.d.ts +34 -0
- package/dist/bot/uploads.d.ts.map +1 -0
- package/dist/bot/uploads.js +122 -0
- package/dist/bot/uploads.js.map +1 -0
- package/dist/client.d.ts +39 -3
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +168 -23
- package/dist/client.js.map +1 -1
- package/dist/commands/bot-comments.d.ts +4 -0
- package/dist/commands/bot-comments.d.ts.map +1 -0
- package/dist/commands/bot-comments.js +97 -0
- package/dist/commands/bot-comments.js.map +1 -0
- package/dist/commands/bot-context.d.ts +27 -0
- package/dist/commands/bot-context.d.ts.map +1 -0
- package/dist/commands/bot-context.js +82 -0
- package/dist/commands/bot-context.js.map +1 -0
- package/dist/commands/bot-members.d.ts +12 -0
- package/dist/commands/bot-members.d.ts.map +1 -0
- package/dist/commands/bot-members.js +136 -0
- package/dist/commands/bot-members.js.map +1 -0
- package/dist/commands/bot-reads.d.ts +7 -0
- package/dist/commands/bot-reads.d.ts.map +1 -0
- package/dist/commands/bot-reads.js +145 -0
- package/dist/commands/bot-reads.js.map +1 -0
- package/dist/commands/bot-sends.d.ts +17 -0
- package/dist/commands/bot-sends.d.ts.map +1 -0
- package/dist/commands/bot-sends.js +270 -0
- package/dist/commands/bot-sends.js.map +1 -0
- package/dist/commands/bot-setup.d.ts +5 -0
- package/dist/commands/bot-setup.d.ts.map +1 -0
- package/dist/commands/bot-setup.js +107 -0
- package/dist/commands/bot-setup.js.map +1 -0
- package/dist/commands/bot-updates.d.ts +3 -0
- package/dist/commands/bot-updates.d.ts.map +1 -0
- package/dist/commands/bot-updates.js +182 -0
- package/dist/commands/bot-updates.js.map +1 -0
- package/dist/commands/bot.d.ts +3 -0
- package/dist/commands/bot.d.ts.map +1 -0
- package/dist/commands/bot.js +160 -0
- package/dist/commands/bot.js.map +1 -0
- package/dist/commands/chats.d.ts.map +1 -1
- package/dist/commands/chats.js +79 -2
- package/dist/commands/chats.js.map +1 -1
- package/dist/commands/check.d.ts +8 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +64 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/context.d.ts +15 -1
- package/dist/commands/context.d.ts.map +1 -1
- package/dist/commands/context.js +5 -1
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/hearing.d.ts +25 -0
- package/dist/commands/hearing.d.ts.map +1 -0
- package/dist/commands/hearing.js +41 -0
- package/dist/commands/hearing.js.map +1 -0
- package/dist/commands/inbox.d.ts.map +1 -1
- package/dist/commands/inbox.js +19 -3
- package/dist/commands/inbox.js.map +1 -1
- package/dist/commands/mcp.d.ts +1 -0
- package/dist/commands/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +7 -4
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/messages.d.ts.map +1 -1
- package/dist/commands/messages.js +21 -5
- package/dist/commands/messages.js.map +1 -1
- package/dist/commands/paging.d.ts +3 -1
- package/dist/commands/paging.d.ts.map +1 -1
- package/dist/commands/paging.js +4 -1
- package/dist/commands/paging.js.map +1 -1
- package/dist/commands/review.d.ts.map +1 -1
- package/dist/commands/review.js +22 -8
- package/dist/commands/review.js.map +1 -1
- package/dist/commands/rules.d.ts +7 -0
- package/dist/commands/rules.d.ts.map +1 -0
- package/dist/commands/rules.js +69 -0
- package/dist/commands/rules.js.map +1 -0
- package/dist/domain/map.d.ts +6 -1
- package/dist/domain/map.d.ts.map +1 -1
- package/dist/domain/map.js +34 -1
- package/dist/domain/map.js.map +1 -1
- package/dist/domain/models.d.ts +55 -0
- package/dist/domain/models.d.ts.map +1 -1
- package/dist/domain/models.js.map +1 -1
- package/dist/generated/client.generated.d.ts +1 -0
- package/dist/generated/client.generated.d.ts.map +1 -1
- package/dist/generated/client.generated.js +1 -0
- package/dist/generated/client.generated.js.map +1 -1
- package/dist/generated/opcodes.generated.d.ts +1 -0
- package/dist/generated/opcodes.generated.d.ts.map +1 -1
- package/dist/generated/opcodes.generated.js +1 -0
- package/dist/generated/opcodes.generated.js.map +1 -1
- package/dist/generated/operations.generated.d.ts +16 -1
- package/dist/generated/operations.generated.d.ts.map +1 -1
- package/dist/generated/operations.generated.js +2 -1
- package/dist/generated/operations.generated.js.map +1 -1
- package/dist/mcp/instructions.d.ts +2 -1
- package/dist/mcp/instructions.d.ts.map +1 -1
- package/dist/mcp/instructions.js +2 -1
- package/dist/mcp/instructions.js.map +1 -1
- package/dist/mcp/server.d.ts +2 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +4 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools.d.ts +5 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +160 -13
- package/dist/mcp/tools.js.map +1 -1
- package/dist/moderation/check.d.ts +98 -0
- package/dist/moderation/check.d.ts.map +1 -0
- package/dist/moderation/check.js +306 -0
- package/dist/moderation/check.js.map +1 -0
- package/dist/moderation/rules.d.ts +56 -0
- package/dist/moderation/rules.d.ts.map +1 -0
- package/dist/moderation/rules.js +138 -0
- package/dist/moderation/rules.js.map +1 -0
- package/dist/program.d.ts.map +1 -1
- package/dist/program.js +18 -3
- package/dist/program.js.map +1 -1
- package/dist/protocol/connection.d.ts.map +1 -1
- package/dist/protocol/connection.js +12 -1
- package/dist/protocol/connection.js.map +1 -1
- package/dist/review.d.ts +32 -5
- package/dist/review.d.ts.map +1 -1
- package/dist/review.js +82 -45
- package/dist/review.js.map +1 -1
- package/dist/sends/journal.d.ts +1 -1
- package/dist/sends/journal.d.ts.map +1 -1
- package/dist/session/store.d.ts +2 -0
- package/dist/session/store.d.ts.map +1 -1
- package/dist/session/store.js +2 -0
- package/dist/session/store.js.map +1 -1
- package/dist/spec/index.d.ts.map +1 -1
- package/dist/spec/index.js +2 -1
- package/dist/spec/index.js.map +1 -1
- package/dist/spec/operations/chats.d.ts +4 -1
- package/dist/spec/operations/chats.d.ts.map +1 -1
- package/dist/spec/operations/chats.js +10 -4
- package/dist/spec/operations/chats.js.map +1 -1
- package/dist/spec/operations/messages.d.ts.map +1 -1
- package/dist/spec/operations/messages.js +9 -4
- package/dist/spec/operations/messages.js.map +1 -1
- package/dist/spec/operations/uploads.d.ts +13 -0
- package/dist/spec/operations/uploads.d.ts.map +1 -1
- package/dist/spec/operations/uploads.js +21 -0
- package/dist/spec/operations/uploads.js.map +1 -1
- package/dist/transcribe/index.d.ts +36 -1
- package/dist/transcribe/index.d.ts.map +1 -1
- package/dist/transcribe/index.js +91 -14
- package/dist/transcribe/index.js.map +1 -1
- package/dist/upload.d.ts +3 -0
- package/dist/upload.d.ts.map +1 -1
- package/dist/upload.js +13 -7
- package/dist/upload.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/voice.d.ts +9 -0
- package/dist/voice.d.ts.map +1 -0
- package/dist/voice.js +36 -0
- package/dist/voice.js.map +1 -0
- package/package.json +17 -6
- package/skills/max-cli/SKILL.md +23 -2
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Russian Trusted Root CA, issued by the Ministry of Digital Development. It signs
|
|
3
|
+
* platform-api2.max.ru, and Node's bundled roots do not include it (measured 2026-09-26, FIND-219).
|
|
4
|
+
* SHA-256 D2:6D:2D:02:31:B7:C3:9F:92:CC:73:85:12:BA:54:10:35:19:E4:40:5D:68:B5:BD:70:3E:97:88:CA:8E:CF:31,
|
|
5
|
+
* valid until 2032-02-27. Used for our own bot requests only (owner, NEED-293).
|
|
6
|
+
*/
|
|
7
|
+
export declare const RUSSIAN_TRUSTED_ROOT_CA = "-----BEGIN CERTIFICATE-----\nMIIFwjCCA6qgAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwcDELMAkGA1UEBhMCUlUx\nPzA9BgNVBAoMNlRoZSBNaW5pc3RyeSBvZiBEaWdpdGFsIERldmVsb3BtZW50IGFu\nZCBDb21tdW5pY2F0aW9uczEgMB4GA1UEAwwXUnVzc2lhbiBUcnVzdGVkIFJvb3Qg\nQ0EwHhcNMjIwMzAxMjEwNDE1WhcNMzIwMjI3MjEwNDE1WjBwMQswCQYDVQQGEwJS\nVTE/MD0GA1UECgw2VGhlIE1pbmlzdHJ5IG9mIERpZ2l0YWwgRGV2ZWxvcG1lbnQg\nYW5kIENvbW11bmljYXRpb25zMSAwHgYDVQQDDBdSdXNzaWFuIFRydXN0ZWQgUm9v\ndCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMfFOZ8pUAL3+r2n\nqqE0Zp52selXsKGFYoG0GM5bwz1bSFtCt+AZQMhkWQheI3poZAToYJu69pHLKS6Q\nXBiwBC1cvzYmUYKMYZC7jE5YhEU2bSL0mX7NaMxMDmH2/NwuOVRj8OImVa5s1F4U\nzn4Kv3PFlDBjjSjXKVY9kmjUBsXQrIHeaqmUIsPIlNWUnimXS0I0abExqkbdrXbX\nYwCOXhOO2pDUx3ckmJlCMUGacUTnylyQW2VsJIyIGA8V0xzdaeUXg0VZ6ZmNUr5Y\nBer/EAOLPb8NYpsAhJe2mXjMB/J9HNsoFMBFJ0lLOT/+dQvjbdRZoOT8eqJpWnVD\nU+QL/qEZnz57N88OWM3rabJkRNdU/Z7x5SFIM9FrqtN8xewsiBWBI0K6XFuOBOTD\n4V08o4TzJ8+Ccq5XlCUW2L48pZNCYuBDfBh7FxkB7qDgGDiaftEkZZfApRg2E+M9\nG8wkNKTPLDc4wH0FDTijhgxR3Y4PiS1HL2Zhw7bD3CbslmEGgfnnZojNkJtcLeBH\nBLa52/dSwNU4WWLubaYSiAmA9IUMX1/RpfpxOxd4Ykmhz97oFbUaDJFipIggx5sX\nePAlkTdWnv+RWBxlJwMQ25oEHmRguNYf4Zr/Rxr9cS93Y+mdXIZaBEE0KS2iLRqa\nOiWBki9IMQU4phqPOBAaG7A+eP8PAgMBAAGjZjBkMB0GA1UdDgQWBBTh0YHlzlpf\nBKrS6badZrHF+qwshzAfBgNVHSMEGDAWgBTh0YHlzlpfBKrS6badZrHF+qwshzAS\nBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsF\nAAOCAgEAALIY1wkilt/urfEVM5vKzr6utOeDWCUczmWX/RX4ljpRdgF+5fAIS4vH\ntmXkqpSCOVeWUrJV9QvZn6L227ZwuE15cWi8DCDal3Ue90WgAJJZMfTshN4OI8cq\nW9E4EG9wglbEtMnObHlms8F3CHmrw3k6KmUkWGoa+/ENmcVl68u/cMRl1JbW2bM+\n/3A+SAg2c6iPDlehczKx2oa95QW0SkPPWGuNA/CE8CpyANIhu9XFrj3RQ3EqeRcS\nAQQod1RNuHpfETLU/A2gMmvn/w/sx7TB3W5BPs6rprOA37tutPq9u6FTZOcG1Oqj\nC/B7yTqgI7rbyvox7DEXoX7rIiEqyNNUguTk/u3SZ4VXE2kmxdmSh3TQvybfbnXV\n4JbCZVaqiZraqc7oZMnRoWrXRG3ztbnbes/9qhRGI7PqXqeKJBztxRTEVj8ONs1d\nWN5szTwaPIvhkhO3CO5ErU2rVdUr89wKpNXbBODFKRtgxUT70YpmJ46VVaqdAhOZ\nD9EUUn4YaeLaS8AjSF/h7UkjOibNc4qVDiPP+rkehFWM66PVnP1Msh93tc+taIfC\nEYVMxjh8zNbFuoc7fzvvrFILLe7ifvEIUqSVIC/AzplM/Jxw7buXFeGP1qVCBEHq\n391d/9RAfaZ12zkwFsl+IKwE/OZxW8AHa9i1p4GO0YSNuczzEm4=\n-----END CERTIFICATE-----\n";
|
|
8
|
+
//# sourceMappingURL=russian-trusted-root.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"russian-trusted-root.d.ts","sourceRoot":"","sources":["../../src/bot/russian-trusted-root.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,+iEAiCnC,CAAA"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Russian Trusted Root CA, issued by the Ministry of Digital Development. It signs
|
|
3
|
+
* platform-api2.max.ru, and Node's bundled roots do not include it (measured 2026-09-26, FIND-219).
|
|
4
|
+
* SHA-256 D2:6D:2D:02:31:B7:C3:9F:92:CC:73:85:12:BA:54:10:35:19:E4:40:5D:68:B5:BD:70:3E:97:88:CA:8E:CF:31,
|
|
5
|
+
* valid until 2032-02-27. Used for our own bot requests only (owner, NEED-293).
|
|
6
|
+
*/
|
|
7
|
+
export const RUSSIAN_TRUSTED_ROOT_CA = `-----BEGIN CERTIFICATE-----
|
|
8
|
+
MIIFwjCCA6qgAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwcDELMAkGA1UEBhMCUlUx
|
|
9
|
+
PzA9BgNVBAoMNlRoZSBNaW5pc3RyeSBvZiBEaWdpdGFsIERldmVsb3BtZW50IGFu
|
|
10
|
+
ZCBDb21tdW5pY2F0aW9uczEgMB4GA1UEAwwXUnVzc2lhbiBUcnVzdGVkIFJvb3Qg
|
|
11
|
+
Q0EwHhcNMjIwMzAxMjEwNDE1WhcNMzIwMjI3MjEwNDE1WjBwMQswCQYDVQQGEwJS
|
|
12
|
+
VTE/MD0GA1UECgw2VGhlIE1pbmlzdHJ5IG9mIERpZ2l0YWwgRGV2ZWxvcG1lbnQg
|
|
13
|
+
YW5kIENvbW11bmljYXRpb25zMSAwHgYDVQQDDBdSdXNzaWFuIFRydXN0ZWQgUm9v
|
|
14
|
+
dCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMfFOZ8pUAL3+r2n
|
|
15
|
+
qqE0Zp52selXsKGFYoG0GM5bwz1bSFtCt+AZQMhkWQheI3poZAToYJu69pHLKS6Q
|
|
16
|
+
XBiwBC1cvzYmUYKMYZC7jE5YhEU2bSL0mX7NaMxMDmH2/NwuOVRj8OImVa5s1F4U
|
|
17
|
+
zn4Kv3PFlDBjjSjXKVY9kmjUBsXQrIHeaqmUIsPIlNWUnimXS0I0abExqkbdrXbX
|
|
18
|
+
YwCOXhOO2pDUx3ckmJlCMUGacUTnylyQW2VsJIyIGA8V0xzdaeUXg0VZ6ZmNUr5Y
|
|
19
|
+
Ber/EAOLPb8NYpsAhJe2mXjMB/J9HNsoFMBFJ0lLOT/+dQvjbdRZoOT8eqJpWnVD
|
|
20
|
+
U+QL/qEZnz57N88OWM3rabJkRNdU/Z7x5SFIM9FrqtN8xewsiBWBI0K6XFuOBOTD
|
|
21
|
+
4V08o4TzJ8+Ccq5XlCUW2L48pZNCYuBDfBh7FxkB7qDgGDiaftEkZZfApRg2E+M9
|
|
22
|
+
G8wkNKTPLDc4wH0FDTijhgxR3Y4PiS1HL2Zhw7bD3CbslmEGgfnnZojNkJtcLeBH
|
|
23
|
+
BLa52/dSwNU4WWLubaYSiAmA9IUMX1/RpfpxOxd4Ykmhz97oFbUaDJFipIggx5sX
|
|
24
|
+
ePAlkTdWnv+RWBxlJwMQ25oEHmRguNYf4Zr/Rxr9cS93Y+mdXIZaBEE0KS2iLRqa
|
|
25
|
+
OiWBki9IMQU4phqPOBAaG7A+eP8PAgMBAAGjZjBkMB0GA1UdDgQWBBTh0YHlzlpf
|
|
26
|
+
BKrS6badZrHF+qwshzAfBgNVHSMEGDAWgBTh0YHlzlpfBKrS6badZrHF+qwshzAS
|
|
27
|
+
BgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsF
|
|
28
|
+
AAOCAgEAALIY1wkilt/urfEVM5vKzr6utOeDWCUczmWX/RX4ljpRdgF+5fAIS4vH
|
|
29
|
+
tmXkqpSCOVeWUrJV9QvZn6L227ZwuE15cWi8DCDal3Ue90WgAJJZMfTshN4OI8cq
|
|
30
|
+
W9E4EG9wglbEtMnObHlms8F3CHmrw3k6KmUkWGoa+/ENmcVl68u/cMRl1JbW2bM+
|
|
31
|
+
/3A+SAg2c6iPDlehczKx2oa95QW0SkPPWGuNA/CE8CpyANIhu9XFrj3RQ3EqeRcS
|
|
32
|
+
AQQod1RNuHpfETLU/A2gMmvn/w/sx7TB3W5BPs6rprOA37tutPq9u6FTZOcG1Oqj
|
|
33
|
+
C/B7yTqgI7rbyvox7DEXoX7rIiEqyNNUguTk/u3SZ4VXE2kmxdmSh3TQvybfbnXV
|
|
34
|
+
4JbCZVaqiZraqc7oZMnRoWrXRG3ztbnbes/9qhRGI7PqXqeKJBztxRTEVj8ONs1d
|
|
35
|
+
WN5szTwaPIvhkhO3CO5ErU2rVdUr89wKpNXbBODFKRtgxUT70YpmJ46VVaqdAhOZ
|
|
36
|
+
D9EUUn4YaeLaS8AjSF/h7UkjOibNc4qVDiPP+rkehFWM66PVnP1Msh93tc+taIfC
|
|
37
|
+
EYVMxjh8zNbFuoc7fzvvrFILLe7ifvEIUqSVIC/AzplM/Jxw7buXFeGP1qVCBEHq
|
|
38
|
+
391d/9RAfaZ12zkwFsl+IKwE/OZxW8AHa9i1p4GO0YSNuczzEm4=
|
|
39
|
+
-----END CERTIFICATE-----
|
|
40
|
+
`;
|
|
41
|
+
//# sourceMappingURL=russian-trusted-root.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"russian-trusted-root.js","sourceRoot":"","sources":["../../src/bot/russian-trusted-root.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCtC,CAAA"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { type RetryConfig, type SleepLike } from "@leemour/cli-core";
|
|
2
|
+
import type { ManifestOperation } from "@leemour/cli-core/codegen";
|
|
3
|
+
import { type FetchLike } from "@leemour/cli-core/http";
|
|
4
|
+
export declare const BOT_API_URL = "https://platform-api2.max.ru";
|
|
5
|
+
/**
|
|
6
|
+
* Adds the Минцифры root to this process's trusted roots, and nowhere else (`NEED-293`). Node
|
|
7
|
+
* exposes a process-wide default (22.19+); Bun takes the list per request instead.
|
|
8
|
+
*/
|
|
9
|
+
export declare const botFetch: () => FetchLike;
|
|
10
|
+
export interface CallInput {
|
|
11
|
+
path?: Readonly<Record<string, string>>;
|
|
12
|
+
query?: Readonly<Record<string, string | readonly string[]>>;
|
|
13
|
+
/** JSON text, sent as it is — ids in it must reach MAX as the digits the caller wrote. */
|
|
14
|
+
body?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface TransportOptions {
|
|
17
|
+
token: string;
|
|
18
|
+
baseUrl?: string;
|
|
19
|
+
fetch?: FetchLike;
|
|
20
|
+
timeoutMs?: number;
|
|
21
|
+
retry?: RetryConfig;
|
|
22
|
+
sleep?: SleepLike;
|
|
23
|
+
random?: () => number;
|
|
24
|
+
signal?: AbortSignal;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* The official Bot API over HTTP. Speaks for one token, writes nothing to stdout or stderr, and
|
|
28
|
+
* turns every failure into a `CliError` that never contains the token.
|
|
29
|
+
*/
|
|
30
|
+
export declare class BotTransport {
|
|
31
|
+
#private;
|
|
32
|
+
constructor(options: TransportOptions);
|
|
33
|
+
/** The parsed answer, numbers still lossless; `null` when MAX answered with no body. */
|
|
34
|
+
call(operation: ManifestOperation, input?: CallInput): Promise<unknown>;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* What `max bot api` prints: a number that fits a JS number stays one, and a bigger one becomes
|
|
38
|
+
* its exact digits as a string rather than a rounded different number.
|
|
39
|
+
*/
|
|
40
|
+
export declare const plainJson: (value: unknown) => unknown;
|
|
41
|
+
//# sourceMappingURL=transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/bot/transport.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,WAAW,EAEhB,KAAK,SAAS,EAEf,MAAM,mBAAmB,CAAA;AAC1B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAClE,OAAO,EAAE,KAAK,SAAS,EAAgC,MAAM,wBAAwB,CAAA;AAKrF,eAAO,MAAM,WAAW,iCAAiC,CAAA;AAQzD;;;GAGG;AACH,eAAO,MAAM,QAAQ,QAAO,SAU3B,CAAA;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IACvC,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC,CAAC,CAAA;IAC5D,0FAA0F;IAC1F,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,MAAM,CAAA;IACrB,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAeD;;;GAGG;AACH,qBAAa,YAAY;;IAUvB,YAAY,OAAO,EAAE,gBAAgB,EASpC;IAED,wFAAwF;IAClF,IAAI,CAAC,SAAS,EAAE,iBAAiB,EAAE,KAAK,GAAE,SAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAyBhF;CAwHF;AAED;;;GAGG;AACH,eAAO,MAAM,SAAS,UAAW,OAAO,KAAG,OAKxC,CAAA"}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import tls from "node:tls";
|
|
2
|
+
import { backoffMs, CliError, DEFAULT_RETRY, realSleep, singleLine, } from "@leemour/cli-core";
|
|
3
|
+
import { providerWaitMs, statusToCode } from "@leemour/cli-core/http";
|
|
4
|
+
import { isLosslessNumber, isSafeNumber, parse, stringify } from "lossless-json";
|
|
5
|
+
import { VERSION } from "../version.js";
|
|
6
|
+
import { RUSSIAN_TRUSTED_ROOT_CA } from "./russian-trusted-root.js";
|
|
7
|
+
export const BOT_API_URL = "https://platform-api2.max.ru";
|
|
8
|
+
const DEFAULT_TIMEOUT_MS = 60_000;
|
|
9
|
+
/** `GET /updates` holds the request open for up to its own `timeout`; ours has to outlast it. */
|
|
10
|
+
const LONG_POLL_MARGIN_MS = 15_000;
|
|
11
|
+
let trusted = false;
|
|
12
|
+
/**
|
|
13
|
+
* Adds the Минцифры root to this process's trusted roots, and nowhere else (`NEED-293`). Node
|
|
14
|
+
* exposes a process-wide default (22.19+); Bun takes the list per request instead.
|
|
15
|
+
*/
|
|
16
|
+
export const botFetch = () => {
|
|
17
|
+
if ("Bun" in globalThis) {
|
|
18
|
+
const ca = [...tls.rootCertificates, RUSSIAN_TRUSTED_ROOT_CA];
|
|
19
|
+
return (input, init) => fetch(input, { ...init, tls: { ca } });
|
|
20
|
+
}
|
|
21
|
+
if (!trusted && typeof tls.setDefaultCACertificates === "function") {
|
|
22
|
+
tls.setDefaultCACertificates([...tls.getCACertificates("default"), RUSSIAN_TRUSTED_ROOT_CA]);
|
|
23
|
+
trusted = true;
|
|
24
|
+
}
|
|
25
|
+
return fetch;
|
|
26
|
+
};
|
|
27
|
+
const TLS_FAILURES = new Set([
|
|
28
|
+
"UNABLE_TO_GET_ISSUER_CERT_LOCALLY",
|
|
29
|
+
"UNABLE_TO_VERIFY_LEAF_SIGNATURE",
|
|
30
|
+
"SELF_SIGNED_CERT_IN_CHAIN",
|
|
31
|
+
"CERT_HAS_EXPIRED",
|
|
32
|
+
]);
|
|
33
|
+
const causeCode = (error) => {
|
|
34
|
+
const cause = error?.cause;
|
|
35
|
+
const code = typeof cause?.code === "string" ? cause.code : error?.code;
|
|
36
|
+
return typeof code === "string" ? code : undefined;
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* The official Bot API over HTTP. Speaks for one token, writes nothing to stdout or stderr, and
|
|
40
|
+
* turns every failure into a `CliError` that never contains the token.
|
|
41
|
+
*/
|
|
42
|
+
export class BotTransport {
|
|
43
|
+
#token;
|
|
44
|
+
#baseUrl;
|
|
45
|
+
#fetch;
|
|
46
|
+
#timeoutMs;
|
|
47
|
+
#retry;
|
|
48
|
+
#sleep;
|
|
49
|
+
#random;
|
|
50
|
+
#signal;
|
|
51
|
+
constructor(options) {
|
|
52
|
+
this.#token = options.token;
|
|
53
|
+
this.#baseUrl = (options.baseUrl ?? BOT_API_URL).replace(/\/$/, "");
|
|
54
|
+
this.#fetch = options.fetch ?? botFetch();
|
|
55
|
+
this.#timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
56
|
+
this.#retry = options.retry ?? DEFAULT_RETRY;
|
|
57
|
+
this.#sleep = options.sleep ?? realSleep;
|
|
58
|
+
this.#random = options.random ?? Math.random;
|
|
59
|
+
this.#signal = options.signal;
|
|
60
|
+
}
|
|
61
|
+
/** The parsed answer, numbers still lossless; `null` when MAX answered with no body. */
|
|
62
|
+
async call(operation, input = {}) {
|
|
63
|
+
if (operation.binding.kind !== "http") {
|
|
64
|
+
throw new CliError("configuration_error", `${operation.id} is not an HTTP operation`);
|
|
65
|
+
}
|
|
66
|
+
const url = this.#url(operation.binding.path, input);
|
|
67
|
+
const reads = operation.effect === "read";
|
|
68
|
+
const timeoutMs = this.#timeoutFor(operation, input);
|
|
69
|
+
for (let attempt = 1;; attempt++) {
|
|
70
|
+
try {
|
|
71
|
+
return await this.#once(operation, url, input.body, timeoutMs);
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
if (!(error instanceof CliError))
|
|
75
|
+
throw error;
|
|
76
|
+
if (this.#signal?.aborted)
|
|
77
|
+
throw error;
|
|
78
|
+
const retryable = reads && error.details.retryable === true && attempt <= this.#retry.retries;
|
|
79
|
+
if (!retryable)
|
|
80
|
+
throw error;
|
|
81
|
+
const wait = error.details.retryAfterMs ?? backoffMs(attempt, this.#retry, this.#random);
|
|
82
|
+
if (wait > this.#retry.maxRetryAfterMs)
|
|
83
|
+
throw error;
|
|
84
|
+
try {
|
|
85
|
+
await this.#sleep(wait, this.#signal, "retry");
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
throw error;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
#url(template, input) {
|
|
94
|
+
const path = template.replace(/\{([^}]+)\}/g, (_, name) => {
|
|
95
|
+
const value = input.path?.[name];
|
|
96
|
+
if (value === undefined)
|
|
97
|
+
throw new CliError("validation_error", `missing path parameter ${name}`);
|
|
98
|
+
return encodeURIComponent(value);
|
|
99
|
+
});
|
|
100
|
+
const url = new URL(`${this.#baseUrl}${path}`);
|
|
101
|
+
for (const [name, value] of Object.entries(input.query ?? {})) {
|
|
102
|
+
url.searchParams.set(name, typeof value === "string" ? value : value.join(","));
|
|
103
|
+
}
|
|
104
|
+
return url;
|
|
105
|
+
}
|
|
106
|
+
#timeoutFor(operation, input) {
|
|
107
|
+
const poll = Number(input.query?.timeout);
|
|
108
|
+
return operation.id === "getUpdates" && Number.isFinite(poll)
|
|
109
|
+
? Math.max(this.#timeoutMs, poll * 1000 + LONG_POLL_MARGIN_MS)
|
|
110
|
+
: this.#timeoutMs;
|
|
111
|
+
}
|
|
112
|
+
async #once(operation, url, body, timeoutMs) {
|
|
113
|
+
const signals = [AbortSignal.timeout(timeoutMs), ...(this.#signal ? [this.#signal] : [])];
|
|
114
|
+
const reads = operation.effect === "read";
|
|
115
|
+
let response;
|
|
116
|
+
try {
|
|
117
|
+
response = await this.#fetch(url, {
|
|
118
|
+
method: operation.binding.kind === "http" ? operation.binding.method : "POST",
|
|
119
|
+
headers: {
|
|
120
|
+
Authorization: this.#token,
|
|
121
|
+
"User-Agent": `max-cli/${VERSION}`,
|
|
122
|
+
Accept: "application/json",
|
|
123
|
+
...(body === undefined ? {} : { "Content-Type": "application/json" }),
|
|
124
|
+
},
|
|
125
|
+
...(body === undefined ? {} : { body }),
|
|
126
|
+
signal: AbortSignal.any(signals),
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
throw this.#transportFailure(operation, error, reads, timeoutMs);
|
|
131
|
+
}
|
|
132
|
+
const text = await response.text();
|
|
133
|
+
if (!response.ok)
|
|
134
|
+
throw this.#refusal(operation, response, text);
|
|
135
|
+
if (text.trim() === "")
|
|
136
|
+
return null;
|
|
137
|
+
try {
|
|
138
|
+
return parse(text);
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
throw new CliError("invalid_response", `MAX answered ${operation.id} with something that is not JSON`, {
|
|
142
|
+
operation: operation.id,
|
|
143
|
+
status: response.status,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
#transportFailure(operation, error, reads, timeoutMs) {
|
|
148
|
+
const code = causeCode(error);
|
|
149
|
+
if (code && TLS_FAILURES.has(code)) {
|
|
150
|
+
return new CliError("network_error", `this machine does not trust ${new URL(this.#baseUrl).host}'s certificate (${code}). ` +
|
|
151
|
+
"max-cli adds the Russian Trusted Root CA itself on Node 22.19+ and Bun — update Node, " +
|
|
152
|
+
"or set NODE_EXTRA_CA_CERTS to that certificate", { operation: operation.id, retryable: false });
|
|
153
|
+
}
|
|
154
|
+
if (this.#signal?.aborted) {
|
|
155
|
+
const deadline = this.#signal.reason?.name === "TimeoutError";
|
|
156
|
+
if (!deadline)
|
|
157
|
+
return new CliError("cancelled", `${operation.id} was cancelled`, { operation: operation.id });
|
|
158
|
+
if (!reads) {
|
|
159
|
+
return new CliError("outcome_unknown", `the command's time ran out while ${operation.id} was in flight; MAX may or may not have carried it out`, { operation: operation.id, retryable: false });
|
|
160
|
+
}
|
|
161
|
+
return new CliError("timeout", `the command's time ran out during ${operation.id}`, {
|
|
162
|
+
operation: operation.id,
|
|
163
|
+
retryable: false,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
const timedOut = error?.name === "TimeoutError";
|
|
167
|
+
if (!reads) {
|
|
168
|
+
return new CliError("outcome_unknown", `${operation.id} got no answer${timedOut ? ` within ${timeoutMs} ms` : ""}; MAX may or may not have ` +
|
|
169
|
+
"carried it out — check before repeating it", { operation: operation.id, retryable: false });
|
|
170
|
+
}
|
|
171
|
+
return new CliError(timedOut ? "timeout" : "network_error", timedOut ? `${operation.id} got no answer within ${timeoutMs} ms` : `${operation.id} could not reach MAX`, { operation: operation.id, retryable: true });
|
|
172
|
+
}
|
|
173
|
+
#refusal(operation, response, text) {
|
|
174
|
+
let maxCode;
|
|
175
|
+
let said;
|
|
176
|
+
try {
|
|
177
|
+
const body = parse(text);
|
|
178
|
+
if (typeof body?.code === "string")
|
|
179
|
+
maxCode = body.code;
|
|
180
|
+
said = typeof body?.message === "string" ? body.message : typeof body?.error === "string" ? body.error : undefined;
|
|
181
|
+
}
|
|
182
|
+
catch { }
|
|
183
|
+
const retryable = response.status === 429 || response.status === 502 || response.status === 503;
|
|
184
|
+
const retryAfterMs = providerWaitMs(response.headers, () => new Date());
|
|
185
|
+
const reason = said ? `: ${singleLine(said).replaceAll(this.#token, "<token>").slice(0, 300)}` : "";
|
|
186
|
+
return new CliError(statusToCode(response.status), `MAX refused ${operation.id} (${response.status}${maxCode ? ` ${maxCode}` : ""})${reason}`, {
|
|
187
|
+
operation: operation.id,
|
|
188
|
+
status: response.status,
|
|
189
|
+
retryable,
|
|
190
|
+
...(maxCode ? { maxCode } : {}),
|
|
191
|
+
...(retryAfterMs === undefined ? {} : { retryAfterMs }),
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* What `max bot api` prints: a number that fits a JS number stays one, and a bigger one becomes
|
|
197
|
+
* its exact digits as a string rather than a rounded different number.
|
|
198
|
+
*/
|
|
199
|
+
export const plainJson = (value) => JSON.parse(stringify(value, (_, inner) => isLosslessNumber(inner) && !isSafeNumber(inner.value) ? inner.toString() : inner) ?? "null");
|
|
200
|
+
//# sourceMappingURL=transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/bot/transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { type SleepLike } from "@leemour/cli-core";
|
|
2
|
+
import { type FetchLike } from "@leemour/cli-core/http";
|
|
3
|
+
export declare const UPLOAD_TYPES: readonly ["image", "video", "audio", "file"];
|
|
4
|
+
export type UploadType = (typeof UPLOAD_TYPES)[number];
|
|
5
|
+
export declare const uploadTypeOf: (path: string) => UploadType;
|
|
6
|
+
/** What goes into a message body's `attachments`. */
|
|
7
|
+
export interface Attachment {
|
|
8
|
+
type: UploadType;
|
|
9
|
+
payload: Record<string, unknown>;
|
|
10
|
+
}
|
|
11
|
+
export interface UploadEndpoint {
|
|
12
|
+
url: string;
|
|
13
|
+
token?: string | null;
|
|
14
|
+
}
|
|
15
|
+
export declare const endpointOf: (answer: unknown) => UploadEndpoint;
|
|
16
|
+
/**
|
|
17
|
+
* The second step: the bytes, streamed from disk as multipart field `data`. The upload URL is not
|
|
18
|
+
* the Bot API host and is itself a credential, so it gets no token and never appears in an error.
|
|
19
|
+
* Video and audio answer XML and are named by step one's token; image and file by the answer.
|
|
20
|
+
*/
|
|
21
|
+
export declare const uploadFile: (options: {
|
|
22
|
+
path: string;
|
|
23
|
+
type: UploadType;
|
|
24
|
+
endpoint: UploadEndpoint;
|
|
25
|
+
fetch: FetchLike;
|
|
26
|
+
signal?: AbortSignal;
|
|
27
|
+
timeoutMs?: number;
|
|
28
|
+
}) => Promise<Attachment>;
|
|
29
|
+
/**
|
|
30
|
+
* Repeats a send only while MAX refuses it as not ready — a refusal, so nothing was sent. Any
|
|
31
|
+
* other failure, an unclear outcome above all, goes straight back to the caller.
|
|
32
|
+
*/
|
|
33
|
+
export declare const whenAttachmentReady: <T>(send: () => Promise<T>, signal?: AbortSignal, sleep?: SleepLike) => Promise<T>;
|
|
34
|
+
//# sourceMappingURL=uploads.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uploads.d.ts","sourceRoot":"","sources":["../../src/bot/uploads.ts"],"names":[],"mappings":"AAEA,OAAO,EAAuC,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAA;AACvF,OAAO,EAAE,KAAK,SAAS,EAAgB,MAAM,wBAAwB,CAAA;AAIrE,eAAO,MAAM,YAAY,YAAI,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAU,CAAA;AACxE,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAA;AAwBtD,eAAO,MAAM,YAAY,SAAU,MAAM,KAAG,UAA0E,CAAA;AAEtH,qDAAqD;AACrD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,UAAU,CAAA;IAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACjC;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACtB;AAED,eAAO,MAAM,UAAU,WAAY,OAAO,KAAG,cAQ5C,CAAA;AAID;;;;GAIG;AACH,eAAO,MAAM,UAAU,YAAmB;IACxC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,UAAU,CAAA;IAChB,QAAQ,EAAE,cAAc,CAAA;IACxB,KAAK,EAAE,SAAS,CAAA;IAChB,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,KAAG,OAAO,CAAC,UAAU,CAkDrB,CAAA;AAWD;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAAU,CAAC,QACnC,MAAM,OAAO,CAAC,CAAC,CAAC,WACb,WAAW,UACb,SAAS,KACf,OAAO,CAAC,CAAC,CAUX,CAAA"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { openAsBlob, statSync } from "node:fs";
|
|
2
|
+
import { basename, extname } from "node:path";
|
|
3
|
+
import { CliError, realSleep } from "@leemour/cli-core";
|
|
4
|
+
import { statusToCode } from "@leemour/cli-core/http";
|
|
5
|
+
import { parse } from "lossless-json";
|
|
6
|
+
import { plainJson } from "./transport.js";
|
|
7
|
+
export const UPLOAD_TYPES = ["image", "video", "audio", "file"];
|
|
8
|
+
const BY_EXTENSION = {
|
|
9
|
+
jpg: "image",
|
|
10
|
+
jpeg: "image",
|
|
11
|
+
png: "image",
|
|
12
|
+
gif: "image",
|
|
13
|
+
tif: "image",
|
|
14
|
+
tiff: "image",
|
|
15
|
+
bmp: "image",
|
|
16
|
+
heic: "image",
|
|
17
|
+
mp4: "video",
|
|
18
|
+
mov: "video",
|
|
19
|
+
mkv: "video",
|
|
20
|
+
webm: "video",
|
|
21
|
+
mp3: "audio",
|
|
22
|
+
wav: "audio",
|
|
23
|
+
m4a: "audio",
|
|
24
|
+
ogg: "audio",
|
|
25
|
+
opus: "audio",
|
|
26
|
+
aac: "audio",
|
|
27
|
+
flac: "audio",
|
|
28
|
+
};
|
|
29
|
+
export const uploadTypeOf = (path) => BY_EXTENSION[extname(path).slice(1).toLowerCase()] ?? "file";
|
|
30
|
+
export const endpointOf = (answer) => {
|
|
31
|
+
const endpoint = plainJson(answer);
|
|
32
|
+
if (typeof endpoint?.url !== "string") {
|
|
33
|
+
throw new CliError("invalid_response", "MAX answered getUploadUrl with no upload URL", {
|
|
34
|
+
operation: "getUploadUrl",
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
return { url: endpoint.url, token: endpoint.token ?? null };
|
|
38
|
+
};
|
|
39
|
+
const UPLOAD_TIMEOUT_MS = 10 * 60_000;
|
|
40
|
+
/**
|
|
41
|
+
* The second step: the bytes, streamed from disk as multipart field `data`. The upload URL is not
|
|
42
|
+
* the Bot API host and is itself a credential, so it gets no token and never appears in an error.
|
|
43
|
+
* Video and audio answer XML and are named by step one's token; image and file by the answer.
|
|
44
|
+
*/
|
|
45
|
+
export const uploadFile = async (options) => {
|
|
46
|
+
const { path, type, endpoint } = options;
|
|
47
|
+
const name = basename(path);
|
|
48
|
+
const stat = (() => {
|
|
49
|
+
try {
|
|
50
|
+
return statSync(path);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
})();
|
|
56
|
+
if (!stat?.isFile())
|
|
57
|
+
throw new CliError("not_found", `no file at ${path}`);
|
|
58
|
+
const form = new FormData();
|
|
59
|
+
form.append("data", await openAsBlob(path), name);
|
|
60
|
+
const signals = [
|
|
61
|
+
AbortSignal.timeout(options.timeoutMs ?? UPLOAD_TIMEOUT_MS),
|
|
62
|
+
...(options.signal ? [options.signal] : []),
|
|
63
|
+
];
|
|
64
|
+
let response;
|
|
65
|
+
try {
|
|
66
|
+
response = await options.fetch(endpoint.url, { method: "POST", body: form, signal: AbortSignal.any(signals) });
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
throw new CliError("network_error", `the upload of ${name} did not finish; nothing was sent to the chat`, {
|
|
70
|
+
retryable: false,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
const text = await response.text();
|
|
74
|
+
if (!response.ok) {
|
|
75
|
+
throw new CliError(statusToCode(response.status), `the upload server refused ${name} (${response.status}); nothing was sent to the chat`, { status: response.status });
|
|
76
|
+
}
|
|
77
|
+
if (type === "video" || type === "audio") {
|
|
78
|
+
if (!endpoint.token) {
|
|
79
|
+
throw new CliError("invalid_response", `MAX gave no token for a ${type} upload`, { operation: "getUploadUrl" });
|
|
80
|
+
}
|
|
81
|
+
return { type, payload: { token: endpoint.token } };
|
|
82
|
+
}
|
|
83
|
+
let answer;
|
|
84
|
+
try {
|
|
85
|
+
answer = plainJson(parse(text));
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
throw new CliError("invalid_response", `the upload server answered ${name} with something that is not JSON`);
|
|
89
|
+
}
|
|
90
|
+
if (type === "image" && answer.photos)
|
|
91
|
+
return { type, payload: { photos: answer.photos } };
|
|
92
|
+
if (typeof answer.token !== "string") {
|
|
93
|
+
throw new CliError("invalid_response", `the upload server answered ${name} with no token`);
|
|
94
|
+
}
|
|
95
|
+
return { type, payload: { token: answer.token } };
|
|
96
|
+
};
|
|
97
|
+
/** maxigo-client's `DefaultRetryIntervals` (`options.go`): MAX is still processing the file. */
|
|
98
|
+
const NOT_READY_WAITS_MS = [500, 1000, 2000, 5000];
|
|
99
|
+
const notReady = (error) => {
|
|
100
|
+
const failure = error;
|
|
101
|
+
if (failure.code === "outcome_unknown")
|
|
102
|
+
return false;
|
|
103
|
+
return /not\.ready|not\.processed/.test(`${failure.details?.maxCode ?? ""} ${failure.message ?? ""}`);
|
|
104
|
+
};
|
|
105
|
+
/**
|
|
106
|
+
* Repeats a send only while MAX refuses it as not ready — a refusal, so nothing was sent. Any
|
|
107
|
+
* other failure, an unclear outcome above all, goes straight back to the caller.
|
|
108
|
+
*/
|
|
109
|
+
export const whenAttachmentReady = async (send, signal, sleep = realSleep) => {
|
|
110
|
+
for (let attempt = 0;; attempt++) {
|
|
111
|
+
try {
|
|
112
|
+
return await send();
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
const wait = NOT_READY_WAITS_MS[attempt];
|
|
116
|
+
if (wait === undefined || !notReady(error))
|
|
117
|
+
throw error;
|
|
118
|
+
await sleep(wait, signal, "retry");
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
//# sourceMappingURL=uploads.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uploads.js","sourceRoot":"","sources":["../../src/bot/uploads.ts"],"names":[],"mappings":"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"}
|
package/dist/client.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { CacheStore, PersonOrder, SyncSummary } from "./cache/store.js";
|
|
2
|
-
import type { AccountSession, AttachmentLink, Chat, ChatCard, ChatKind, Contact, ContactImport, Deletion, Folder, GroupCard, GroupSettings, Id, Inbox, Message, MessageChange, MessageHit, Page, PersonCard, Pin, Profile, Reactions, ReadMark, Review, WindowedMessage } from "./domain/models.js";
|
|
2
|
+
import type { AccountSession, AttachmentLink, Chat, ChatCard, ChatEvents, ChatKind, Contact, ContactImport, Deletion, Folder, GroupCard, GroupMember, GroupMembers, GroupSettings, Id, Inbox, Message, MessageChange, MessageHit, Page, PersonCard, Pin, Profile, Reactions, ReadMark, Review, WindowedMessage } from "./domain/models.js";
|
|
3
3
|
import { type Wire } from "./protocol/connection.js";
|
|
4
4
|
import { type Payload } from "./protocol/frame.js";
|
|
5
5
|
import { type DiagnosticEvent } from "./runs/events.js";
|
|
@@ -113,6 +113,28 @@ export declare class MaxClient {
|
|
|
113
113
|
show: (reference: string) => Promise<ChatCard>;
|
|
114
114
|
/** The other person in a one-to-one chat, by the chat's participants; `undefined` for anything else. */
|
|
115
115
|
partner: (chatId: Id) => Promise<Id | undefined>;
|
|
116
|
+
/**
|
|
117
|
+
* The owner and admins of a group, from the chat as the login carried it (`owner`, `admins`,
|
|
118
|
+
* `adminParticipants` — measured 2026-09-24, `FIND-116`). `undefined` when the login did not
|
|
119
|
+
* carry this chat or its admins: the login carries only chats that changed lately, and the rest
|
|
120
|
+
* come from the local copy.
|
|
121
|
+
*/
|
|
122
|
+
adminIds: (chatId: Id) => Promise<Id[] | undefined>;
|
|
123
|
+
/**
|
|
124
|
+
* Who joined, left, was added or removed since a point: the service messages in the chat's
|
|
125
|
+
* history, read forward from `since` without reactions. At most `EVENTS_READ` messages, the oldest.
|
|
126
|
+
*/
|
|
127
|
+
events: (reference: string, { since }?: {
|
|
128
|
+
since?: number;
|
|
129
|
+
}) => Promise<ChatEvents>;
|
|
130
|
+
/**
|
|
131
|
+
* A chat's history after `since`, oldest first and without reactions, at most `EVENTS_READ`
|
|
132
|
+
* messages; `more` when there was more than that.
|
|
133
|
+
*/
|
|
134
|
+
since: (chatId: Id, since: number) => Promise<{
|
|
135
|
+
messages: Message[];
|
|
136
|
+
more: boolean;
|
|
137
|
+
}>;
|
|
116
138
|
/** What a link leads to, without joining it. */
|
|
117
139
|
inspect: (link: string) => Promise<GroupCard>;
|
|
118
140
|
join: (link: string) => Promise<GroupCard>;
|
|
@@ -129,6 +151,12 @@ export declare class MaxClient {
|
|
|
129
151
|
*/
|
|
130
152
|
create: (title: string, people?: string[]) => Promise<GroupCard>;
|
|
131
153
|
members: {
|
|
154
|
+
/**
|
|
155
|
+
* Everyone in a group or channel, from MAX, page by page. Paging follows PyMax: each answer's
|
|
156
|
+
* `marker` asks for the next page, and none means the last. Stops at `MEMBERS_READ`, or when a
|
|
157
|
+
* page repeats its marker or brings nobody new, so a misread marker cannot loop.
|
|
158
|
+
*/
|
|
159
|
+
list: (reference: string) => Promise<GroupMembers>;
|
|
132
160
|
/** No history unless asked (`NEED-272`): what was said before somebody joined is not theirs by default. */
|
|
133
161
|
add: (reference: string, people: string[], { history }?: {
|
|
134
162
|
history?: boolean;
|
|
@@ -140,7 +168,8 @@ export declare class MaxClient {
|
|
|
140
168
|
remove: (reference: string, person: string) => Promise<ChatChange>;
|
|
141
169
|
};
|
|
142
170
|
requests: {
|
|
143
|
-
|
|
171
|
+
/** Each with the age of their account, read like a member's — the answer's `{contact}` is the same shape. */
|
|
172
|
+
list: (reference: string) => Promise<GroupMember[]>;
|
|
144
173
|
accept: (reference: string, people: string[]) => Promise<ChatChange>;
|
|
145
174
|
decline: (reference: string, people: string[]) => Promise<ChatChange>;
|
|
146
175
|
};
|
|
@@ -325,6 +354,10 @@ export declare class MaxClient {
|
|
|
325
354
|
replyTo?: Id;
|
|
326
355
|
markdown?: boolean;
|
|
327
356
|
files?: string[];
|
|
357
|
+
/** Send every file as a plain file, a video included — how a video went before `MAX-23`. */
|
|
358
|
+
asFile?: boolean;
|
|
359
|
+
/** An Ogg Opus file sent as a voice message, alone in its message. */
|
|
360
|
+
voice?: string;
|
|
328
361
|
anyFile?: boolean;
|
|
329
362
|
at?: number;
|
|
330
363
|
}) => Promise<Message>;
|
|
@@ -418,8 +451,9 @@ export declare class MaxClient {
|
|
|
418
451
|
* forward from `since`; a chat with more than `REVIEW_PER_CHAT` in the window is cut short and
|
|
419
452
|
* says so.
|
|
420
453
|
*/
|
|
421
|
-
review: ({ since }: {
|
|
454
|
+
review: ({ since, chatId, }: {
|
|
422
455
|
since: number;
|
|
456
|
+
chatId?: Id;
|
|
423
457
|
}) => Promise<Omit<Review, "complete" | "unheard">>;
|
|
424
458
|
};
|
|
425
459
|
/**
|
|
@@ -522,6 +556,8 @@ export interface PageRequest {
|
|
|
522
556
|
* `undefined` for anything that is not a message id.
|
|
523
557
|
*/
|
|
524
558
|
export declare const timeOfMessageId: (id: Id) => number | undefined;
|
|
559
|
+
/** How far back `chats events` looks without `since`. */
|
|
560
|
+
export declare const EVENTS_DAYS = 7;
|
|
525
561
|
/** What `readLikeTab` sends back to MAX on the next login. */
|
|
526
562
|
export interface TabSync {
|
|
527
563
|
folders: number;
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|