@wirecat/max-cli 0.0.0 → 0.43.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/LICENSE +204 -0
- package/README.md +531 -0
- package/dist/adapter/max-adapter.d.ts +17 -0
- package/dist/adapter/max-adapter.d.ts.map +1 -0
- package/dist/adapter/max-adapter.js +364 -0
- package/dist/adapter/max-adapter.js.map +1 -0
- package/dist/app.d.ts +3 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +9 -0
- package/dist/app.js.map +1 -0
- package/dist/bin/max.d.ts +3 -0
- package/dist/bin/max.d.ts.map +1 -0
- package/dist/bin/max.js +20 -0
- package/dist/bin/max.js.map +1 -0
- package/dist/bot/adapter.d.ts +25 -0
- package/dist/bot/adapter.d.ts.map +1 -0
- package/dist/bot/adapter.js +404 -0
- package/dist/bot/adapter.js.map +1 -0
- package/dist/bot/auth.d.ts +13 -0
- package/dist/bot/auth.d.ts.map +1 -0
- package/dist/bot/auth.js +9 -0
- package/dist/bot/auth.js.map +1 -0
- package/dist/bot/client.d.ts +26 -0
- package/dist/bot/client.d.ts.map +1 -0
- package/dist/bot/client.js +105 -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 +6 -0
- package/dist/bot/input.d.ts.map +1 -0
- package/dist/bot/input.js +6 -0
- package/dist/bot/input.js.map +1 -0
- package/dist/bot/joins.d.ts +26 -0
- package/dist/bot/joins.d.ts.map +1 -0
- package/dist/bot/joins.js +56 -0
- package/dist/bot/joins.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 +98 -0
- package/dist/bot/keep.js.map +1 -0
- package/dist/bot/map.d.ts +14 -0
- package/dist/bot/map.d.ts.map +1 -0
- package/dist/bot/map.js +101 -0
- package/dist/bot/map.js.map +1 -0
- package/dist/bot/mcp-tools.d.ts +4 -0
- package/dist/bot/mcp-tools.d.ts.map +1 -0
- package/dist/bot/mcp-tools.js +78 -0
- package/dist/bot/mcp-tools.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 +88 -0
- package/dist/bot/permissions.js.map +1 -0
- package/dist/bot/registry.d.ts +11 -0
- package/dist/bot/registry.d.ts.map +1 -0
- package/dist/bot/registry.js +13 -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 +46 -0
- package/dist/bot/transport.d.ts.map +1 -0
- package/dist/bot/transport.js +252 -0
- package/dist/bot/transport.js.map +1 -0
- package/dist/bot/uploads.d.ts +42 -0
- package/dist/bot/uploads.d.ts.map +1 -0
- package/dist/bot/uploads.js +145 -0
- package/dist/bot/uploads.js.map +1 -0
- package/dist/client.d.ts +650 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +2836 -0
- package/dist/client.js.map +1 -0
- package/dist/commands/account.d.ts +3 -0
- package/dist/commands/account.d.ts.map +1 -0
- package/dist/commands/account.js +4 -0
- package/dist/commands/account.js.map +1 -0
- package/dist/commands/bot-comments.d.ts +3 -0
- package/dist/commands/bot-comments.d.ts.map +1 -0
- package/dist/commands/bot-comments.js +74 -0
- package/dist/commands/bot-comments.js.map +1 -0
- package/dist/commands/bot-context.d.ts +38 -0
- package/dist/commands/bot-context.d.ts.map +1 -0
- package/dist/commands/bot-context.js +121 -0
- package/dist/commands/bot-context.js.map +1 -0
- package/dist/commands/bot-members.d.ts +14 -0
- package/dist/commands/bot-members.d.ts.map +1 -0
- package/dist/commands/bot-members.js +64 -0
- package/dist/commands/bot-members.js.map +1 -0
- package/dist/commands/bot-messenger.d.ts +10 -0
- package/dist/commands/bot-messenger.d.ts.map +1 -0
- package/dist/commands/bot-messenger.js +101 -0
- package/dist/commands/bot-messenger.js.map +1 -0
- package/dist/commands/bot-reads.d.ts +4 -0
- package/dist/commands/bot-reads.d.ts.map +1 -0
- package/dist/commands/bot-reads.js +13 -0
- package/dist/commands/bot-reads.js.map +1 -0
- package/dist/commands/bot-sends.d.ts +13 -0
- package/dist/commands/bot-sends.d.ts.map +1 -0
- package/dist/commands/bot-sends.js +103 -0
- package/dist/commands/bot-sends.js.map +1 -0
- package/dist/commands/bot-setup.d.ts +3 -0
- package/dist/commands/bot-setup.d.ts.map +1 -0
- package/dist/commands/bot-setup.js +20 -0
- package/dist/commands/bot-setup.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 +60 -0
- package/dist/commands/bot.js.map +1 -0
- package/dist/commands/calls.d.ts +3 -0
- package/dist/commands/calls.d.ts.map +1 -0
- package/dist/commands/calls.js +4 -0
- package/dist/commands/calls.js.map +1 -0
- package/dist/commands/chats.d.ts +3 -0
- package/dist/commands/chats.d.ts.map +1 -0
- package/dist/commands/chats.js +46 -0
- package/dist/commands/chats.js.map +1 -0
- package/dist/commands/commands.d.ts +2 -0
- package/dist/commands/commands.d.ts.map +1 -0
- package/dist/commands/commands.js +4 -0
- package/dist/commands/commands.js.map +1 -0
- package/dist/commands/complete.d.ts +2 -0
- package/dist/commands/complete.d.ts.map +1 -0
- package/dist/commands/complete.js +34 -0
- package/dist/commands/complete.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +170 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/contacts.d.ts +10 -0
- package/dist/commands/contacts.d.ts.map +1 -0
- package/dist/commands/contacts.js +80 -0
- package/dist/commands/contacts.js.map +1 -0
- package/dist/commands/context.d.ts +126 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +137 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/doctor.d.ts +24 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +308 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/mcp.d.ts +36 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +214 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/messages.d.ts +3 -0
- package/dist/commands/messages.d.ts.map +1 -0
- package/dist/commands/messages.js +105 -0
- package/dist/commands/messages.js.map +1 -0
- package/dist/commands/models.d.ts +3 -0
- package/dist/commands/models.d.ts.map +1 -0
- package/dist/commands/models.js +4 -0
- package/dist/commands/models.js.map +1 -0
- package/dist/commands/paging.d.ts +59 -0
- package/dist/commands/paging.d.ts.map +1 -0
- package/dist/commands/paging.js +77 -0
- package/dist/commands/paging.js.map +1 -0
- package/dist/commands/recipients.d.ts +9 -0
- package/dist/commands/recipients.d.ts.map +1 -0
- package/dist/commands/recipients.js +74 -0
- package/dist/commands/recipients.js.map +1 -0
- package/dist/commands/runs.d.ts +2 -0
- package/dist/commands/runs.d.ts.map +1 -0
- package/dist/commands/runs.js +4 -0
- package/dist/commands/runs.js.map +1 -0
- package/dist/commands/sends.d.ts +3 -0
- package/dist/commands/sends.d.ts.map +1 -0
- package/dist/commands/sends.js +4 -0
- package/dist/commands/sends.js.map +1 -0
- package/dist/commands/serve-members.d.ts +14 -0
- package/dist/commands/serve-members.d.ts.map +1 -0
- package/dist/commands/serve-members.js +54 -0
- package/dist/commands/serve-members.js.map +1 -0
- package/dist/commands/serve-stems.d.ts +9 -0
- package/dist/commands/serve-stems.d.ts.map +1 -0
- package/dist/commands/serve-stems.js +26 -0
- package/dist/commands/serve-stems.js.map +1 -0
- package/dist/commands/serve.d.ts +10 -0
- package/dist/commands/serve.d.ts.map +1 -0
- package/dist/commands/serve.js +79 -0
- package/dist/commands/serve.js.map +1 -0
- package/dist/commands/server.d.ts +16 -0
- package/dist/commands/server.d.ts.map +1 -0
- package/dist/commands/server.js +51 -0
- package/dist/commands/server.js.map +1 -0
- package/dist/commands/session.d.ts +15 -0
- package/dist/commands/session.d.ts.map +1 -0
- package/dist/commands/session.js +169 -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 +168 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/skill.d.ts +3 -0
- package/dist/commands/skill.d.ts.map +1 -0
- package/dist/commands/skill.js +7 -0
- package/dist/commands/skill.js.map +1 -0
- package/dist/commands/stickers.d.ts +3 -0
- package/dist/commands/stickers.d.ts.map +1 -0
- package/dist/commands/stickers.js +4 -0
- package/dist/commands/stickers.js.map +1 -0
- package/dist/commands/upgrade.d.ts +2 -0
- package/dist/commands/upgrade.d.ts.map +1 -0
- package/dist/commands/upgrade.js +14 -0
- package/dist/commands/upgrade.js.map +1 -0
- package/dist/commands/watch.d.ts +27 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +105 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/config.d.ts +385 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +372 -0
- package/dist/config.js.map +1 -0
- package/dist/deadline.d.ts +2 -0
- package/dist/deadline.d.ts.map +1 -0
- package/dist/deadline.js +2 -0
- package/dist/deadline.js.map +1 -0
- package/dist/diagnose.d.ts +143 -0
- package/dist/diagnose.d.ts.map +1 -0
- package/dist/diagnose.js +183 -0
- package/dist/diagnose.js.map +1 -0
- package/dist/domain/map.d.ts +65 -0
- package/dist/domain/map.d.ts.map +1 -0
- package/dist/domain/map.js +431 -0
- package/dist/domain/map.js.map +1 -0
- package/dist/domain/models.d.ts +238 -0
- package/dist/domain/models.d.ts.map +1 -0
- package/dist/domain/models.js +17 -0
- package/dist/domain/models.js.map +1 -0
- package/dist/download.d.ts +38 -0
- package/dist/download.d.ts.map +1 -0
- package/dist/download.js +199 -0
- package/dist/download.js.map +1 -0
- package/dist/format-markdown.d.ts +13 -0
- package/dist/format-markdown.d.ts.map +1 -0
- package/dist/format-markdown.js +241 -0
- package/dist/format-markdown.js.map +1 -0
- package/dist/generated/client.generated.d.ts +95 -0
- package/dist/generated/client.generated.d.ts.map +1 -0
- package/dist/generated/client.generated.js +91 -0
- package/dist/generated/client.generated.js.map +1 -0
- package/dist/generated/opcodes.generated.d.ts +76 -0
- package/dist/generated/opcodes.generated.d.ts.map +1 -0
- package/dist/generated/opcodes.generated.js +76 -0
- package/dist/generated/opcodes.generated.js.map +1 -0
- package/dist/generated/operations.generated.d.ts +502 -0
- package/dist/generated/operations.generated.d.ts.map +1 -0
- package/dist/generated/operations.generated.js +72 -0
- package/dist/generated/operations.generated.js.map +1 -0
- package/dist/inbox-point.d.ts +3 -0
- package/dist/inbox-point.d.ts.map +1 -0
- package/dist/inbox-point.js +17 -0
- package/dist/inbox-point.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/install.d.ts +43 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +142 -0
- package/dist/install.js.map +1 -0
- package/dist/markdown.d.ts +13 -0
- package/dist/markdown.d.ts.map +1 -0
- package/dist/markdown.js +6 -0
- package/dist/markdown.js.map +1 -0
- package/dist/mcp/instructions.d.ts +13 -0
- package/dist/mcp/instructions.d.ts.map +1 -0
- package/dist/mcp/instructions.js +16 -0
- package/dist/mcp/instructions.js.map +1 -0
- package/dist/mcp/legacy-check.d.ts +12 -0
- package/dist/mcp/legacy-check.d.ts.map +1 -0
- package/dist/mcp/legacy-check.js +44 -0
- package/dist/mcp/legacy-check.js.map +1 -0
- package/dist/mcp/photo.d.ts +9 -0
- package/dist/mcp/photo.d.ts.map +1 -0
- package/dist/mcp/photo.js +38 -0
- package/dist/mcp/photo.js.map +1 -0
- package/dist/mcp/prompts.d.ts +7 -0
- package/dist/mcp/prompts.d.ts.map +1 -0
- package/dist/mcp/prompts.js +100 -0
- package/dist/mcp/prompts.js.map +1 -0
- package/dist/mcp/resources.d.ts +15 -0
- package/dist/mcp/resources.d.ts.map +1 -0
- package/dist/mcp/resources.js +56 -0
- package/dist/mcp/resources.js.map +1 -0
- package/dist/mcp/server.d.ts +31 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +116 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/session.d.ts +30 -0
- package/dist/mcp/session.d.ts.map +1 -0
- package/dist/mcp/session.js +109 -0
- package/dist/mcp/session.js.map +1 -0
- package/dist/mcp/shared.d.ts +14 -0
- package/dist/mcp/shared.d.ts.map +1 -0
- package/dist/mcp/shared.js +46 -0
- package/dist/mcp/shared.js.map +1 -0
- package/dist/mcp/tools.d.ts +30 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +248 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/messenger.d.ts +15 -0
- package/dist/messenger.d.ts.map +1 -0
- package/dist/messenger.js +149 -0
- package/dist/messenger.js.map +1 -0
- package/dist/moderation/check.d.ts +103 -0
- package/dist/moderation/check.d.ts.map +1 -0
- package/dist/moderation/check.js +273 -0
- package/dist/moderation/check.js.map +1 -0
- package/dist/moderation/points.d.ts +8 -0
- package/dist/moderation/points.d.ts.map +1 -0
- package/dist/moderation/points.js +21 -0
- package/dist/moderation/points.js.map +1 -0
- package/dist/moderation/rules.d.ts +7 -0
- package/dist/moderation/rules.d.ts.map +1 -0
- package/dist/moderation/rules.js +24 -0
- package/dist/moderation/rules.js.map +1 -0
- package/dist/online.d.ts +23 -0
- package/dist/online.d.ts.map +1 -0
- package/dist/online.js +87 -0
- package/dist/online.js.map +1 -0
- package/dist/output.d.ts +2 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +2 -0
- package/dist/output.js.map +1 -0
- package/dist/permissions.d.ts +20 -0
- package/dist/permissions.d.ts.map +1 -0
- package/dist/permissions.js +76 -0
- package/dist/permissions.js.map +1 -0
- package/dist/profile.d.ts +33 -0
- package/dist/profile.d.ts.map +1 -0
- package/dist/profile.js +60 -0
- package/dist/profile.js.map +1 -0
- package/dist/program.d.ts +10 -0
- package/dist/program.d.ts.map +1 -0
- package/dist/program.js +172 -0
- package/dist/program.js.map +1 -0
- package/dist/protocol/connection.d.ts +83 -0
- package/dist/protocol/connection.d.ts.map +1 -0
- package/dist/protocol/connection.js +301 -0
- package/dist/protocol/connection.js.map +1 -0
- package/dist/protocol/frame.d.ts +55 -0
- package/dist/protocol/frame.d.ts.map +1 -0
- package/dist/protocol/frame.js +149 -0
- package/dist/protocol/frame.js.map +1 -0
- package/dist/protocol/lz4.d.ts +15 -0
- package/dist/protocol/lz4.d.ts.map +1 -0
- package/dist/protocol/lz4.js +157 -0
- package/dist/protocol/lz4.js.map +1 -0
- package/dist/record.d.ts +41 -0
- package/dist/record.d.ts.map +1 -0
- package/dist/record.js +104 -0
- package/dist/record.js.map +1 -0
- package/dist/rendering/messages.d.ts +24 -0
- package/dist/rendering/messages.d.ts.map +1 -0
- package/dist/rendering/messages.js +172 -0
- package/dist/rendering/messages.js.map +1 -0
- package/dist/report.d.ts +43 -0
- package/dist/report.d.ts.map +1 -0
- package/dist/report.js +104 -0
- package/dist/report.js.map +1 -0
- package/dist/resolve.d.ts +6 -0
- package/dist/resolve.d.ts.map +1 -0
- package/dist/resolve.js +5 -0
- package/dist/resolve.js.map +1 -0
- package/dist/sends.d.ts +17 -0
- package/dist/sends.d.ts.map +1 -0
- package/dist/sends.js +97 -0
- package/dist/sends.js.map +1 -0
- package/dist/server/lines.d.ts +23 -0
- package/dist/server/lines.d.ts.map +1 -0
- package/dist/server/lines.js +56 -0
- package/dist/server/lines.js.map +1 -0
- package/dist/server/replies.d.ts +31 -0
- package/dist/server/replies.d.ts.map +1 -0
- package/dist/server/replies.js +95 -0
- package/dist/server/replies.js.map +1 -0
- package/dist/server/server-connection.d.ts +55 -0
- package/dist/server/server-connection.d.ts.map +1 -0
- package/dist/server/server-connection.js +245 -0
- package/dist/server/server-connection.js.map +1 -0
- package/dist/server/server.d.ts +88 -0
- package/dist/server/server.d.ts.map +1 -0
- package/dist/server/server.js +634 -0
- package/dist/server/server.js.map +1 -0
- package/dist/server/start.d.ts +37 -0
- package/dist/server/start.d.ts.map +1 -0
- package/dist/server/start.js +102 -0
- package/dist/server/start.js.map +1 -0
- package/dist/server/subscribe.d.ts +9 -0
- package/dist/server/subscribe.d.ts.map +1 -0
- package/dist/server/subscribe.js +26 -0
- package/dist/server/subscribe.js.map +1 -0
- package/dist/session/adopt.d.ts +22 -0
- package/dist/session/adopt.d.ts.map +1 -0
- package/dist/session/adopt.js +34 -0
- package/dist/session/adopt.js.map +1 -0
- package/dist/session/browser.d.ts +55 -0
- package/dist/session/browser.d.ts.map +1 -0
- package/dist/session/browser.js +321 -0
- package/dist/session/browser.js.map +1 -0
- package/dist/session/handshake.d.ts +57 -0
- package/dist/session/handshake.d.ts.map +1 -0
- package/dist/session/handshake.js +40 -0
- package/dist/session/handshake.js.map +1 -0
- package/dist/session/login.d.ts +20 -0
- package/dist/session/login.d.ts.map +1 -0
- package/dist/session/login.js +66 -0
- package/dist/session/login.js.map +1 -0
- package/dist/session/prompt.d.ts +2 -0
- package/dist/session/prompt.d.ts.map +1 -0
- package/dist/session/prompt.js +2 -0
- package/dist/session/prompt.js.map +1 -0
- package/dist/session/qr-terminal.d.ts +9 -0
- package/dist/session/qr-terminal.d.ts.map +1 -0
- package/dist/session/qr-terminal.js +34 -0
- package/dist/session/qr-terminal.js.map +1 -0
- package/dist/session/store.d.ts +76 -0
- package/dist/session/store.d.ts.map +1 -0
- package/dist/session/store.js +134 -0
- package/dist/session/store.js.map +1 -0
- package/dist/skill.d.ts +7 -0
- package/dist/skill.d.ts.map +1 -0
- package/dist/skill.js +8 -0
- package/dist/skill.js.map +1 -0
- package/dist/spec/check.d.ts +16 -0
- package/dist/spec/check.d.ts.map +1 -0
- package/dist/spec/check.js +44 -0
- package/dist/spec/check.js.map +1 -0
- package/dist/spec/define.d.ts +108 -0
- package/dist/spec/define.d.ts.map +1 -0
- package/dist/spec/define.js +47 -0
- package/dist/spec/define.js.map +1 -0
- package/dist/spec/guards.d.ts +16 -0
- package/dist/spec/guards.d.ts.map +1 -0
- package/dist/spec/guards.js +30 -0
- package/dist/spec/guards.js.map +1 -0
- package/dist/spec/identity.d.ts +57 -0
- package/dist/spec/identity.d.ts.map +1 -0
- package/dist/spec/identity.js +53 -0
- package/dist/spec/identity.js.map +1 -0
- package/dist/spec/index.d.ts +15 -0
- package/dist/spec/index.d.ts.map +1 -0
- package/dist/spec/index.js +84 -0
- package/dist/spec/index.js.map +1 -0
- package/dist/spec/operations/account.d.ts +39 -0
- package/dist/spec/operations/account.d.ts.map +1 -0
- package/dist/spec/operations/account.js +103 -0
- package/dist/spec/operations/account.js.map +1 -0
- package/dist/spec/operations/assets.d.ts +17 -0
- package/dist/spec/operations/assets.d.ts.map +1 -0
- package/dist/spec/operations/assets.js +43 -0
- package/dist/spec/operations/assets.js.map +1 -0
- package/dist/spec/operations/attachments.d.ts +15 -0
- package/dist/spec/operations/attachments.d.ts.map +1 -0
- package/dist/spec/operations/attachments.js +40 -0
- package/dist/spec/operations/attachments.js.map +1 -0
- package/dist/spec/operations/banners.d.ts +7 -0
- package/dist/spec/operations/banners.d.ts.map +1 -0
- package/dist/spec/operations/banners.js +16 -0
- package/dist/spec/operations/banners.js.map +1 -0
- package/dist/spec/operations/calls.d.ts +8 -0
- package/dist/spec/operations/calls.d.ts.map +1 -0
- package/dist/spec/operations/calls.js +25 -0
- package/dist/spec/operations/calls.js.map +1 -0
- package/dist/spec/operations/chats.d.ts +115 -0
- package/dist/spec/operations/chats.d.ts.map +1 -0
- package/dist/spec/operations/chats.js +331 -0
- package/dist/spec/operations/chats.js.map +1 -0
- package/dist/spec/operations/contacts.d.ts +39 -0
- package/dist/spec/operations/contacts.d.ts.map +1 -0
- package/dist/spec/operations/contacts.js +135 -0
- package/dist/spec/operations/contacts.js.map +1 -0
- package/dist/spec/operations/folders.d.ts +31 -0
- package/dist/spec/operations/folders.d.ts.map +1 -0
- package/dist/spec/operations/folders.js +94 -0
- package/dist/spec/operations/folders.js.map +1 -0
- package/dist/spec/operations/login.d.ts +64 -0
- package/dist/spec/operations/login.d.ts.map +1 -0
- package/dist/spec/operations/login.js +105 -0
- package/dist/spec/operations/login.js.map +1 -0
- package/dist/spec/operations/messages.d.ts +142 -0
- package/dist/spec/operations/messages.d.ts.map +1 -0
- package/dist/spec/operations/messages.js +347 -0
- package/dist/spec/operations/messages.js.map +1 -0
- package/dist/spec/operations/session.d.ts +120 -0
- package/dist/spec/operations/session.d.ts.map +1 -0
- package/dist/spec/operations/session.js +202 -0
- package/dist/spec/operations/session.js.map +1 -0
- package/dist/spec/operations/uploads.d.ts +31 -0
- package/dist/spec/operations/uploads.d.ts.map +1 -0
- package/dist/spec/operations/uploads.js +59 -0
- package/dist/spec/operations/uploads.js.map +1 -0
- package/dist/spec/scalars.d.ts +17 -0
- package/dist/spec/scalars.d.ts.map +1 -0
- package/dist/spec/scalars.js +33 -0
- package/dist/spec/scalars.js.map +1 -0
- package/dist/transcribe/index.d.ts +70 -0
- package/dist/transcribe/index.d.ts.map +1 -0
- package/dist/transcribe/index.js +127 -0
- package/dist/transcribe/index.js.map +1 -0
- package/dist/transcribe/install.d.ts +2 -0
- package/dist/transcribe/install.d.ts.map +1 -0
- package/dist/transcribe/install.js +2 -0
- package/dist/transcribe/install.js.map +1 -0
- package/dist/transcribe/models.d.ts +5 -0
- package/dist/transcribe/models.d.ts.map +1 -0
- package/dist/transcribe/models.js +6 -0
- package/dist/transcribe/models.js.map +1 -0
- package/dist/transcribe/speech.d.ts +25 -0
- package/dist/transcribe/speech.d.ts.map +1 -0
- package/dist/transcribe/speech.js +107 -0
- package/dist/transcribe/speech.js.map +1 -0
- package/dist/update.d.ts +31 -0
- package/dist/update.d.ts.map +1 -0
- package/dist/update.js +69 -0
- package/dist/update.js.map +1 -0
- package/dist/upload.d.ts +15 -0
- package/dist/upload.d.ts.map +1 -0
- package/dist/upload.js +97 -0
- package/dist/upload.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/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/dist/wire-events.d.ts +23 -0
- package/dist/wire-events.d.ts.map +1 -0
- package/dist/wire-events.js +47 -0
- package/dist/wire-events.js.map +1 -0
- package/install/postinstall.mjs +3 -0
- package/install/windows.ps1 +160 -0
- package/package.json +120 -3
- package/skills/max-cli/SKILL.md +523 -0
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { randomBytes } from "node:crypto";
|
|
3
|
+
import { existsSync, mkdtempSync, realpathSync, rmSync } from "node:fs";
|
|
4
|
+
import { createServer } from "node:http";
|
|
5
|
+
import { tmpdir } from "node:os";
|
|
6
|
+
import { delimiter, join } from "node:path";
|
|
7
|
+
import { setTimeout as delay } from "node:timers/promises";
|
|
8
|
+
import { CliError } from "@wirecat/cli-core";
|
|
9
|
+
import qrcode from "qrcode-generator";
|
|
10
|
+
export const realBrowser = {
|
|
11
|
+
open: (url) => openUrl(url),
|
|
12
|
+
chromiumToken: (options) => tokenFromChromium(options),
|
|
13
|
+
};
|
|
14
|
+
const WEB_MAX = "https://web.max.ru/";
|
|
15
|
+
const AUTH_KEY = "__oneme_auth";
|
|
16
|
+
/**
|
|
17
|
+
* The QR page, served from `127.0.0.1` rather than written to a file: a browser installed as a
|
|
18
|
+
* snap cannot read our temporary directory, and a file would leave the link on disk. The path is
|
|
19
|
+
* random, so another local user guessing the port finds nothing.
|
|
20
|
+
*/
|
|
21
|
+
export const serveQrPage = async (link) => {
|
|
22
|
+
const path = `/${randomBytes(16).toString("hex")}`;
|
|
23
|
+
const code = qrcode(0, "M");
|
|
24
|
+
code.addData(link);
|
|
25
|
+
code.make();
|
|
26
|
+
const page = qrHtml(code.createSvgTag({ cellSize: 8, margin: 4, scalable: true }));
|
|
27
|
+
const server = createServer((request, response) => {
|
|
28
|
+
if (request.url !== path) {
|
|
29
|
+
response.writeHead(404).end();
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
response
|
|
33
|
+
.writeHead(200, {
|
|
34
|
+
"content-type": "text/html; charset=utf-8",
|
|
35
|
+
"cache-control": "no-store",
|
|
36
|
+
"referrer-policy": "no-referrer",
|
|
37
|
+
})
|
|
38
|
+
.end(page);
|
|
39
|
+
});
|
|
40
|
+
await new Promise((resolve, reject) => {
|
|
41
|
+
server.once("error", reject);
|
|
42
|
+
server.listen(0, "127.0.0.1", resolve);
|
|
43
|
+
});
|
|
44
|
+
const { port } = server.address();
|
|
45
|
+
return {
|
|
46
|
+
url: `http://127.0.0.1:${port}${path}`,
|
|
47
|
+
close: () => new Promise((resolve) => {
|
|
48
|
+
server.closeAllConnections();
|
|
49
|
+
server.close(() => resolve());
|
|
50
|
+
}),
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
const qrHtml = (svg) => `<!doctype html>
|
|
54
|
+
<html lang="ru"><head><meta charset="utf-8"><title>MAX — вход</title>
|
|
55
|
+
<style>body{font-family:system-ui,sans-serif;display:grid;place-items:center;min-height:100vh;margin:0;background:#fff;color:#111}
|
|
56
|
+
main{text-align:center;max-width:22rem}svg{width:18rem;height:18rem}</style></head>
|
|
57
|
+
<body><main>${svg}<p>Отсканируйте код приложением MAX на телефоне. Код действует около двух минут.</p>
|
|
58
|
+
<p>После входа эту вкладку можно закрыть.</p></main></body></html>`;
|
|
59
|
+
export const openUrl = async (url) => {
|
|
60
|
+
refuseInTests();
|
|
61
|
+
const [command, args] = process.platform === "darwin"
|
|
62
|
+
? ["open", [url]]
|
|
63
|
+
: process.platform === "win32"
|
|
64
|
+
? ["cmd", ["/c", "start", "", url]]
|
|
65
|
+
: ["xdg-open", [url]];
|
|
66
|
+
await new Promise((resolve, reject) => {
|
|
67
|
+
const child = spawn(command, args, { stdio: "ignore", detached: true, windowsHide: true });
|
|
68
|
+
child.once("error", () => reject(new CliError("configuration_error", "no browser could be opened here — use `session start token`")));
|
|
69
|
+
child.once("spawn", () => {
|
|
70
|
+
child.unref();
|
|
71
|
+
resolve();
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* Chrome, Chromium, Edge or Brave — any browser that speaks the DevTools protocol. `MAX_BROWSER`
|
|
77
|
+
* names another. A snap build is skipped: it keeps its own `/tmp`, so the profile we hand it would
|
|
78
|
+
* land where we cannot delete it.
|
|
79
|
+
*/
|
|
80
|
+
export const findChromium = () => {
|
|
81
|
+
const named = process.env.MAX_BROWSER;
|
|
82
|
+
if (named)
|
|
83
|
+
return named;
|
|
84
|
+
if (process.platform === "darwin") {
|
|
85
|
+
return [
|
|
86
|
+
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
|
|
87
|
+
"/Applications/Chromium.app/Contents/MacOS/Chromium",
|
|
88
|
+
"/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge",
|
|
89
|
+
"/Applications/Brave Browser.app/Contents/MacOS/Brave Browser",
|
|
90
|
+
].find((path) => existsSync(path));
|
|
91
|
+
}
|
|
92
|
+
if (process.platform === "win32") {
|
|
93
|
+
const roots = [process.env.PROGRAMFILES, process.env["PROGRAMFILES(X86)"], process.env.LOCALAPPDATA];
|
|
94
|
+
const apps = [
|
|
95
|
+
"Google\\Chrome\\Application\\chrome.exe",
|
|
96
|
+
"Microsoft\\Edge\\Application\\msedge.exe",
|
|
97
|
+
"BraveSoftware\\Brave-Browser\\Application\\brave.exe",
|
|
98
|
+
];
|
|
99
|
+
return apps
|
|
100
|
+
.flatMap((app) => roots.filter((root) => root !== undefined).map((root) => join(root, app)))
|
|
101
|
+
.find(existsSync);
|
|
102
|
+
}
|
|
103
|
+
const names = [
|
|
104
|
+
"google-chrome",
|
|
105
|
+
"google-chrome-stable",
|
|
106
|
+
"chromium",
|
|
107
|
+
"chromium-browser",
|
|
108
|
+
"microsoft-edge",
|
|
109
|
+
"microsoft-edge-stable",
|
|
110
|
+
"brave-browser",
|
|
111
|
+
];
|
|
112
|
+
const dirs = (process.env.PATH ?? "").split(delimiter).filter(Boolean);
|
|
113
|
+
for (const name of names) {
|
|
114
|
+
for (const dir of dirs) {
|
|
115
|
+
const path = join(dir, name);
|
|
116
|
+
if (existsSync(path) && !realpathSync(path).startsWith("/snap/"))
|
|
117
|
+
return path;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return undefined;
|
|
121
|
+
};
|
|
122
|
+
/**
|
|
123
|
+
* web.max.ru logs itself in — it asks MAX for the QR code, or sends the SMS — in a real browser with
|
|
124
|
+
* a profile of its own, and we read the token it stores once it has one. MAX sees its own web
|
|
125
|
+
* client do the login, not our socket.
|
|
126
|
+
*
|
|
127
|
+
* ⚠ The profile holds a live session, so it is deleted on every way out: success, a closed window,
|
|
128
|
+
* `--timeout`, Ctrl-C.
|
|
129
|
+
*/
|
|
130
|
+
export const tokenFromChromium = async ({ track, waitMs, }) => {
|
|
131
|
+
refuseInTests();
|
|
132
|
+
const binary = findChromium();
|
|
133
|
+
if (!binary) {
|
|
134
|
+
throw new CliError("configuration_error", "no Chrome, Chromium, Edge or Brave found — set MAX_BROWSER to one, or use `session start qr`");
|
|
135
|
+
}
|
|
136
|
+
const profile = mkdtempSync(join(tmpdir(), "max-login-"));
|
|
137
|
+
// A pipe, not `--remote-debugging-port`: a port on 127.0.0.1 lets any local user read the token
|
|
138
|
+
// while the window is open. Chrome reads commands on fd 3 and answers on fd 4.
|
|
139
|
+
const child = spawn(binary, [`--user-data-dir=${profile}`, "--remote-debugging-pipe", "--no-first-run", "--no-default-browser-check", WEB_MAX], { stdio: ["ignore", "ignore", "ignore", "pipe", "pipe"] });
|
|
140
|
+
const browser = new ChromiumSession(child, profile);
|
|
141
|
+
track(browser);
|
|
142
|
+
const stopSignals = closeOnSignal(browser);
|
|
143
|
+
try {
|
|
144
|
+
return await browser.waitForToken(waitMs);
|
|
145
|
+
}
|
|
146
|
+
finally {
|
|
147
|
+
stopSignals();
|
|
148
|
+
await browser.close();
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
export class ChromiumSession {
|
|
152
|
+
#child;
|
|
153
|
+
#profile;
|
|
154
|
+
#devtools;
|
|
155
|
+
#exited;
|
|
156
|
+
#graceMs;
|
|
157
|
+
#pollMs;
|
|
158
|
+
#page;
|
|
159
|
+
#closing;
|
|
160
|
+
constructor(child, profile, graceMs = 5_000, pollMs = 1_000) {
|
|
161
|
+
this.#child = child;
|
|
162
|
+
this.#profile = profile;
|
|
163
|
+
this.#graceMs = graceMs;
|
|
164
|
+
this.#pollMs = pollMs;
|
|
165
|
+
this.#devtools = new DevToolsPipe(child);
|
|
166
|
+
this.#exited = new Promise((resolve) => {
|
|
167
|
+
child.once("exit", () => resolve());
|
|
168
|
+
child.once("error", () => resolve());
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
async waitForToken(waitMs) {
|
|
172
|
+
const deadline = Date.now() + waitMs;
|
|
173
|
+
let running = true;
|
|
174
|
+
void this.#exited.then(() => {
|
|
175
|
+
running = false;
|
|
176
|
+
});
|
|
177
|
+
while (Date.now() < deadline) {
|
|
178
|
+
if (!running)
|
|
179
|
+
throw new CliError("cancelled", "the browser was closed before the login finished");
|
|
180
|
+
const token = await this.#storedToken().catch(() => undefined);
|
|
181
|
+
if (token)
|
|
182
|
+
return token;
|
|
183
|
+
await delay(this.#pollMs);
|
|
184
|
+
}
|
|
185
|
+
throw new CliError("timeout", `nobody logged in within ${Math.round(waitMs / 60_000)} minutes`);
|
|
186
|
+
}
|
|
187
|
+
close() {
|
|
188
|
+
this.#closing ??= this.#shutdown();
|
|
189
|
+
return this.#closing;
|
|
190
|
+
}
|
|
191
|
+
async #shutdown() {
|
|
192
|
+
// Chrome writes to the profile while it shuts down; removing it first leaves half of it behind.
|
|
193
|
+
await this.#devtools.send("Browser.close").catch(() => undefined);
|
|
194
|
+
const exited = await Promise.race([this.#exited.then(() => true), delay(this.#graceMs).then(() => false)]);
|
|
195
|
+
if (!exited && this.#child.pid !== undefined) {
|
|
196
|
+
this.#child.kill();
|
|
197
|
+
await Promise.race([this.#exited, delay(2_000)]);
|
|
198
|
+
}
|
|
199
|
+
rmSync(this.#profile, { recursive: true, force: true, maxRetries: 3 });
|
|
200
|
+
}
|
|
201
|
+
async #storedToken() {
|
|
202
|
+
const { targetInfos } = await this.#devtools.send("Target.getTargets");
|
|
203
|
+
const page = (Array.isArray(targetInfos) ? targetInfos : []).find((target) => target?.type === "page" && typeof target.url === "string" && target.url.startsWith(WEB_MAX));
|
|
204
|
+
if (typeof page?.targetId !== "string")
|
|
205
|
+
return undefined;
|
|
206
|
+
if (this.#page?.targetId !== page.targetId) {
|
|
207
|
+
const { sessionId } = await this.#devtools.send("Target.attachToTarget", {
|
|
208
|
+
targetId: page.targetId,
|
|
209
|
+
flatten: true,
|
|
210
|
+
});
|
|
211
|
+
this.#page = { targetId: page.targetId, sessionId };
|
|
212
|
+
}
|
|
213
|
+
const sessionId = this.#page?.sessionId;
|
|
214
|
+
if (typeof sessionId !== "string")
|
|
215
|
+
return undefined;
|
|
216
|
+
const result = await this.#devtools.send("Runtime.evaluate", { expression: `localStorage.getItem(${JSON.stringify(AUTH_KEY)})`, returnByValue: true }, sessionId);
|
|
217
|
+
const stored = result?.result?.value;
|
|
218
|
+
return typeof stored === "string" ? tokenIn(stored) : undefined;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/** The DevTools protocol over Chrome's pipe: JSON messages, each ended by a NUL byte. */
|
|
222
|
+
class DevToolsPipe {
|
|
223
|
+
#input;
|
|
224
|
+
#waiting = new Map();
|
|
225
|
+
#next = 0;
|
|
226
|
+
#buffer = "";
|
|
227
|
+
constructor(child) {
|
|
228
|
+
this.#input = child.stdio[3];
|
|
229
|
+
const output = child.stdio[4];
|
|
230
|
+
// A pipe that breaks with no listener kills the process (HANDOFF bite 16).
|
|
231
|
+
this.#input?.on("error", () => { });
|
|
232
|
+
output?.on("error", () => { });
|
|
233
|
+
output?.setEncoding("utf8");
|
|
234
|
+
output?.on("data", (chunk) => {
|
|
235
|
+
this.#buffer += chunk;
|
|
236
|
+
for (let end = this.#buffer.indexOf("\0"); end >= 0; end = this.#buffer.indexOf("\0")) {
|
|
237
|
+
this.#receive(this.#buffer.slice(0, end));
|
|
238
|
+
this.#buffer = this.#buffer.slice(end + 1);
|
|
239
|
+
}
|
|
240
|
+
});
|
|
241
|
+
child.once("exit", () => this.#failAll(new Error("the browser exited")));
|
|
242
|
+
}
|
|
243
|
+
// biome-ignore lint/suspicious/noExplicitAny: see above.
|
|
244
|
+
send(method, params = {}, sessionId) {
|
|
245
|
+
const input = this.#input;
|
|
246
|
+
if (!input || input.destroyed)
|
|
247
|
+
return Promise.reject(new Error("the browser has no DevTools pipe"));
|
|
248
|
+
const id = ++this.#next;
|
|
249
|
+
return new Promise((resolve, reject) => {
|
|
250
|
+
const timer = setTimeout(() => {
|
|
251
|
+
this.#waiting.delete(id);
|
|
252
|
+
reject(new Error("the browser did not answer"));
|
|
253
|
+
}, 5_000);
|
|
254
|
+
this.#waiting.set(id, { resolve, reject, timer });
|
|
255
|
+
input.write(`${JSON.stringify({ id, method, params, ...(sessionId ? { sessionId } : {}) })}\0`);
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
#receive(raw) {
|
|
259
|
+
let message;
|
|
260
|
+
try {
|
|
261
|
+
message = JSON.parse(raw);
|
|
262
|
+
}
|
|
263
|
+
catch {
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
const waiting = typeof message.id === "number" ? this.#waiting.get(message.id) : undefined;
|
|
267
|
+
if (!waiting)
|
|
268
|
+
return;
|
|
269
|
+
clearTimeout(waiting.timer);
|
|
270
|
+
this.#waiting.delete(message.id);
|
|
271
|
+
if (message.error)
|
|
272
|
+
waiting.reject(new Error(String(message.error.message ?? "DevTools refused")));
|
|
273
|
+
else
|
|
274
|
+
waiting.resolve(message.result ?? {});
|
|
275
|
+
}
|
|
276
|
+
#failAll(error) {
|
|
277
|
+
for (const { reject, timer } of this.#waiting.values()) {
|
|
278
|
+
clearTimeout(timer);
|
|
279
|
+
reject(error);
|
|
280
|
+
}
|
|
281
|
+
this.#waiting.clear();
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* The stored value is JSON holding the token, or the token itself — which one is not measured yet.
|
|
286
|
+
* Either way nothing here prints it.
|
|
287
|
+
*/
|
|
288
|
+
export const tokenIn = (stored) => {
|
|
289
|
+
try {
|
|
290
|
+
const parsed = JSON.parse(stored);
|
|
291
|
+
if (typeof parsed === "object" && parsed !== null && "token" in parsed) {
|
|
292
|
+
const token = parsed.token;
|
|
293
|
+
return typeof token === "string" && token !== "" ? token : undefined;
|
|
294
|
+
}
|
|
295
|
+
return typeof parsed === "string" && parsed !== "" ? parsed : undefined;
|
|
296
|
+
}
|
|
297
|
+
catch {
|
|
298
|
+
return stored === "" ? undefined : stored;
|
|
299
|
+
}
|
|
300
|
+
};
|
|
301
|
+
/**
|
|
302
|
+
* Node's default Ctrl-C exits without running a `finally`, which would leave the browser open and
|
|
303
|
+
* its logged-in profile on disk. Returns the function that removes the handlers again.
|
|
304
|
+
*/
|
|
305
|
+
const closeOnSignal = (closeable) => {
|
|
306
|
+
const onSignal = () => {
|
|
307
|
+
void closeable.close().finally(() => process.exit(130));
|
|
308
|
+
};
|
|
309
|
+
// `on`, not `once`: a second Ctrl-C during the shutdown would otherwise exit before the profile goes.
|
|
310
|
+
process.on("SIGINT", onSignal);
|
|
311
|
+
process.on("SIGTERM", onSignal);
|
|
312
|
+
return () => {
|
|
313
|
+
process.off("SIGINT", onSignal);
|
|
314
|
+
process.off("SIGTERM", onSignal);
|
|
315
|
+
};
|
|
316
|
+
};
|
|
317
|
+
const refuseInTests = () => {
|
|
318
|
+
if (process.env.MAX_TEST_SANDBOX)
|
|
319
|
+
throw new Error("a test reached the real browser — inject BrowserDoors");
|
|
320
|
+
};
|
|
321
|
+
//# sourceMappingURL=browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/session/browser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { Invoke } from "../generated/client.generated.js";
|
|
2
|
+
import type { Payload } from "../protocol/frame.js";
|
|
3
|
+
export interface SessionOptions {
|
|
4
|
+
token: string;
|
|
5
|
+
deviceId: string;
|
|
6
|
+
/** How many chats LOGIN should return with the profile. The specification caps it at 100. */
|
|
7
|
+
chatsCount?: number;
|
|
8
|
+
/**
|
|
9
|
+
* The `time` the previous login answered with, or `0` for "send me everything".
|
|
10
|
+
*
|
|
11
|
+
* **The four markers are moments, not flags** — measured 2026-09-20. MAX returns only what
|
|
12
|
+
* changed in each collection since the one given, so a stored marker is the difference between
|
|
13
|
+
* re-fetching every chat and every contact on every invocation and receiving the handful that
|
|
14
|
+
* moved. Where it is kept, and why the merge and the marker share a transaction, is
|
|
15
|
+
* `docs/dev/architecture/session.md`.
|
|
16
|
+
*
|
|
17
|
+
* **Only `contactsSync` carries it** — correction 2026-09-25: this said all four carry the same
|
|
18
|
+
* value, measured harmless over JSON (`NEED-103`). Over the binary protocol MAX refused a login
|
|
19
|
+
* with the time in all four (`proto.payload`, `FIND-162`), and web.max.ru sends a 64-bit time in
|
|
20
|
+
* `contactsSync` alone, small numbers in the other three. We send 0 there.
|
|
21
|
+
*/
|
|
22
|
+
sync?: number;
|
|
23
|
+
/**
|
|
24
|
+
* What a web tab sends when the same page logs in again (`MAX-51`, recorded 2026-09-25): the
|
|
25
|
+
* previous login's `time`, its `config.hash`, and in `chatsSync` the newest chat event it has
|
|
26
|
+
* seen. MAX then answers only the chats that changed. `max serve` alone logs in again.
|
|
27
|
+
*/
|
|
28
|
+
resume?: Resume;
|
|
29
|
+
}
|
|
30
|
+
export interface Resume {
|
|
31
|
+
lastLogin: number;
|
|
32
|
+
chatsSync: number;
|
|
33
|
+
configHash: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* How many chats LOGIN is asked for — the web tab's 15, with the rest read by one `CHATS_LIST`
|
|
37
|
+
* right after (`MAX-53`, captured 2026-09-25). MAX answers the newest that many, newest first (`FIND-80`).
|
|
38
|
+
*/
|
|
39
|
+
export declare const LOGIN_CHATS = 15;
|
|
40
|
+
/**
|
|
41
|
+
* INIT then LOGIN, in that order, before anything else will be answered
|
|
42
|
+
* (`max-api-docs/protocol/auth.md`).
|
|
43
|
+
*
|
|
44
|
+
* **Handwritten, and staying that way** (`REQUIREMENTS.md` §9): a socket problem has to be
|
|
45
|
+
* debuggable without reading a generator. What the specification supplies is the two payloads, so
|
|
46
|
+
* the field names have one home rather than two.
|
|
47
|
+
*
|
|
48
|
+
* It lives here rather than under `protocol/` because it is not transport: the transport moves
|
|
49
|
+
* frames and does not care who is asking. Establishing a session is this layer's job.
|
|
50
|
+
*
|
|
51
|
+
* **It is handed the client's own `invoke` rather than the socket**, so INIT and LOGIN are built,
|
|
52
|
+
* checked and reported exactly like every other request. They were not, until 2026-09-20: a
|
|
53
|
+
* diagnostic hook in `MaxClient` saw nothing of the two requests every single invocation makes,
|
|
54
|
+
* and `max chats list` answers from the LOGIN response without sending anything else.
|
|
55
|
+
*/
|
|
56
|
+
export declare const startSession: (invoke: Invoke, { token, deviceId, chatsCount, sync, resume }: SessionOptions) => Promise<Payload>;
|
|
57
|
+
//# sourceMappingURL=handshake.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handshake.d.ts","sourceRoot":"","sources":["../../src/session/handshake.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAA;AAC9D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAInD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,6FAA6F;IAC7F,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;;;;;;;;;;;OAaG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;IACb;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,MAAM;IACrB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED;;;GAGG;AACH,eAAO,MAAM,WAAW,KAAK,CAAA;AAE7B;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,YAAY,WACf,MAAM,iDACmD,cAAc,KAC9E,OAAO,CAAC,OAAO,CAgBjB,CAAA"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { WEB_USER_AGENT } from "../spec/identity.js";
|
|
2
|
+
import { sessionInit, sessionLogin } from "../spec/operations/session.js";
|
|
3
|
+
/**
|
|
4
|
+
* How many chats LOGIN is asked for — the web tab's 15, with the rest read by one `CHATS_LIST`
|
|
5
|
+
* right after (`MAX-53`, captured 2026-09-25). MAX answers the newest that many, newest first (`FIND-80`).
|
|
6
|
+
*/
|
|
7
|
+
export const LOGIN_CHATS = 15;
|
|
8
|
+
/**
|
|
9
|
+
* INIT then LOGIN, in that order, before anything else will be answered
|
|
10
|
+
* (`max-api-docs/protocol/auth.md`).
|
|
11
|
+
*
|
|
12
|
+
* **Handwritten, and staying that way** (`REQUIREMENTS.md` §9): a socket problem has to be
|
|
13
|
+
* debuggable without reading a generator. What the specification supplies is the two payloads, so
|
|
14
|
+
* the field names have one home rather than two.
|
|
15
|
+
*
|
|
16
|
+
* It lives here rather than under `protocol/` because it is not transport: the transport moves
|
|
17
|
+
* frames and does not care who is asking. Establishing a session is this layer's job.
|
|
18
|
+
*
|
|
19
|
+
* **It is handed the client's own `invoke` rather than the socket**, so INIT and LOGIN are built,
|
|
20
|
+
* checked and reported exactly like every other request. They were not, until 2026-09-20: a
|
|
21
|
+
* diagnostic hook in `MaxClient` saw nothing of the two requests every single invocation makes,
|
|
22
|
+
* and `max chats list` answers from the LOGIN response without sending anything else.
|
|
23
|
+
*/
|
|
24
|
+
export const startSession = async (invoke, { token, deviceId, chatsCount = LOGIN_CHATS, sync = 0, resume }) => {
|
|
25
|
+
await invoke(sessionInit, { userAgent: WEB_USER_AGENT, deviceId });
|
|
26
|
+
return await invoke(sessionLogin, {
|
|
27
|
+
token,
|
|
28
|
+
// A script reading is not a person looking; see the specification for why this is never true.
|
|
29
|
+
interactive: false,
|
|
30
|
+
chatsCount,
|
|
31
|
+
...(resume ? { lastLogin: resume.lastLogin } : {}),
|
|
32
|
+
chatsSync: resume?.chatsSync ?? 0,
|
|
33
|
+
contactsSync: sync,
|
|
34
|
+
// -1 as the tab sends it; presence pushes (132) follow, and nothing here answers them, as the tab does not.
|
|
35
|
+
presenceSync: -1,
|
|
36
|
+
draftsSync: 0,
|
|
37
|
+
...(resume ? { configHash: resume.configHash } : {}),
|
|
38
|
+
});
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=handshake.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handshake.js","sourceRoot":"","sources":["../../src/session/handshake.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AAoCzE;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,EAAE,CAAA;AAE7B;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAC/B,MAAc,EACd,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,GAAG,WAAW,EAAE,IAAI,GAAG,CAAC,EAAE,MAAM,EAAkB,EAC7D,EAAE;IACpB,MAAM,MAAM,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,CAAA;IAElE,OAAO,MAAM,MAAM,CAAC,YAAY,EAAE;QAChC,KAAK;QACL,8FAA8F;QAC9F,WAAW,EAAE,KAAK;QAClB,UAAU;QACV,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClD,SAAS,EAAE,MAAM,EAAE,SAAS,IAAI,CAAC;QACjC,YAAY,EAAE,IAAI;QAClB,4GAA4G;QAC5G,YAAY,EAAE,CAAC,CAAC;QAChB,UAAU,EAAE,CAAC;QACb,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACrD,CAAC,CAAA;AACJ,CAAC,CAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { WireClient } from "../generated/client.generated.js";
|
|
2
|
+
export interface SecondFactor {
|
|
3
|
+
/** Asked only when the account has a cloud password; `again` after a wrong one. */
|
|
4
|
+
askPassword: (hint: string | undefined, again: boolean) => Promise<string>;
|
|
5
|
+
}
|
|
6
|
+
export interface QrLogin extends SecondFactor {
|
|
7
|
+
/** Put the code where a phone can scan it. Resolves once it is shown, not once it is scanned. */
|
|
8
|
+
show: (link: string) => Promise<void>;
|
|
9
|
+
now?: () => number;
|
|
10
|
+
sleep?: (ms: number) => Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* The login MAX's web client does itself when it shows a QR code: ask for a code, wait until a phone
|
|
14
|
+
* approves it, then exchange it for a token. Shapes from PyMax 2.4.1 (`auth/qr.py`), not measured.
|
|
15
|
+
*
|
|
16
|
+
* One code per run: an expired one is an error rather than a fresh code, so a person who walked
|
|
17
|
+
* away does not come back to a loop that has been asking MAX for codes all along.
|
|
18
|
+
*/
|
|
19
|
+
export declare const tokenByQr: (wire: WireClient, { show, askPassword, now, sleep }: QrLogin) => Promise<string>;
|
|
20
|
+
//# sourceMappingURL=login.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/session/login.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAGlE,MAAM,WAAW,YAAY;IAC3B,mFAAmF;IACnF,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;CAC3E;AAED,MAAM,WAAW,OAAQ,SAAQ,YAAY;IAC3C,iGAAiG;IACjG,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACrC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CACtC;AAED;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,SACd,UAAU,qCACsC,OAAO,KAC5D,OAAO,CAAC,MAAM,CAiBhB,CAAA"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { setTimeout as delay } from "node:timers/promises";
|
|
2
|
+
import { CliError } from "@wirecat/cli-core";
|
|
3
|
+
/**
|
|
4
|
+
* The login MAX's web client does itself when it shows a QR code: ask for a code, wait until a phone
|
|
5
|
+
* approves it, then exchange it for a token. Shapes from PyMax 2.4.1 (`auth/qr.py`), not measured.
|
|
6
|
+
*
|
|
7
|
+
* One code per run: an expired one is an error rather than a fresh code, so a person who walked
|
|
8
|
+
* away does not come back to a loop that has been asking MAX for codes all along.
|
|
9
|
+
*/
|
|
10
|
+
export const tokenByQr = async (wire, { show, askPassword, now = Date.now, sleep = delay }) => {
|
|
11
|
+
const code = await wire.login.qrRequest({});
|
|
12
|
+
const trackId = text(code.trackId, "trackId");
|
|
13
|
+
const expiresAt = typeof code.expiresAt === "number" ? code.expiresAt : now() + 120_000;
|
|
14
|
+
const interval = typeof code.pollingInterval === "number" ? code.pollingInterval : 5_000;
|
|
15
|
+
await show(text(code.qrLink, "qrLink"));
|
|
16
|
+
while (now() < expiresAt) {
|
|
17
|
+
const answer = await wire.login.qrStatus({ trackId });
|
|
18
|
+
if (record(answer.status)?.loginAvailable === true) {
|
|
19
|
+
return await tokenFrom(wire, await wire.login.byQr({ trackId }), askPassword);
|
|
20
|
+
}
|
|
21
|
+
await sleep(interval);
|
|
22
|
+
}
|
|
23
|
+
throw new CliError("timeout", "the QR code expired before it was scanned — run the command again");
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* A few attempts, not PyMax's endless loop, and not one: a mistyped password would otherwise cost a
|
|
27
|
+
* fresh QR code. Only a person at a terminal gets here, so asking again cannot hang a script.
|
|
28
|
+
*/
|
|
29
|
+
const tokenFrom = async (wire, answer, askPassword) => {
|
|
30
|
+
const issued = loginToken(answer);
|
|
31
|
+
if (issued)
|
|
32
|
+
return issued;
|
|
33
|
+
const challenge = record(answer.passwordChallenge);
|
|
34
|
+
if (!challenge)
|
|
35
|
+
throw new CliError("authentication_error", "MAX confirmed the login but sent no token");
|
|
36
|
+
const trackId = text(challenge.trackId, "trackId");
|
|
37
|
+
const hint = typeof challenge.hint === "string" && challenge.hint !== "" ? challenge.hint : undefined;
|
|
38
|
+
for (let attempt = 1; attempt <= PASSWORD_ATTEMPTS; attempt++) {
|
|
39
|
+
const password = await askPassword(hint, attempt > 1);
|
|
40
|
+
if (!password)
|
|
41
|
+
throw new CliError("validation_error", "no password given");
|
|
42
|
+
const checked = await wire.login.password({ trackId, password }).catch((error) => {
|
|
43
|
+
if (wrongPassword(error))
|
|
44
|
+
return undefined;
|
|
45
|
+
throw error;
|
|
46
|
+
});
|
|
47
|
+
const token = checked && loginToken(checked);
|
|
48
|
+
if (token)
|
|
49
|
+
return token;
|
|
50
|
+
}
|
|
51
|
+
throw new CliError("authentication_error", `the password was wrong ${PASSWORD_ATTEMPTS} times — run the command again`);
|
|
52
|
+
};
|
|
53
|
+
const PASSWORD_ATTEMPTS = 3;
|
|
54
|
+
// Measured 2026-09-24: a wrong cloud password is refused as `password2fa.wrong`.
|
|
55
|
+
const wrongPassword = (error) => error instanceof CliError && /password2fa\.wrong/.test(error.message);
|
|
56
|
+
const loginToken = (answer) => {
|
|
57
|
+
const token = record(record(answer.tokenAttrs)?.LOGIN)?.token;
|
|
58
|
+
return typeof token === "string" && token !== "" ? token : undefined;
|
|
59
|
+
};
|
|
60
|
+
const text = (value, field) => {
|
|
61
|
+
if (typeof value === "string" && value !== "")
|
|
62
|
+
return value;
|
|
63
|
+
throw new CliError("provider_error", `MAX's answer had no ${field}`);
|
|
64
|
+
};
|
|
65
|
+
const record = (value) => typeof value === "object" && value !== null && !Array.isArray(value) ? value : undefined;
|
|
66
|
+
//# sourceMappingURL=login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/session/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/session/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,WAAW,EAAE,MAAM,wBAAwB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/session/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAoB,MAAM,wBAAwB,CAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A QR code as text, two modules per character cell with half blocks, so it fits a terminal
|
|
3
|
+
* without being twice as tall as it is wide. `width` is in columns, for deciding whether it fits.
|
|
4
|
+
*/
|
|
5
|
+
export declare const terminalQr: (link: string) => {
|
|
6
|
+
text: string;
|
|
7
|
+
width: number;
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=qr-terminal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qr-terminal.d.ts","sourceRoot":"","sources":["../../src/session/qr-terminal.ts"],"names":[],"mappings":"AAQA;;;GAGG;AACH,eAAO,MAAM,UAAU,SAAU,MAAM,KAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAwBtE,CAAA"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import qrcode from "qrcode-generator";
|
|
2
|
+
const QUIET_ZONE = 4;
|
|
3
|
+
// Dark modules on a light ground whatever the terminal's theme: a phone camera reads an inverted
|
|
4
|
+
// code unreliably, so the colours are forced even under NO_COLOR.
|
|
5
|
+
const BLACK_ON_WHITE = "\x1b[30;107m";
|
|
6
|
+
const RESET = "\x1b[0m";
|
|
7
|
+
/**
|
|
8
|
+
* A QR code as text, two modules per character cell with half blocks, so it fits a terminal
|
|
9
|
+
* without being twice as tall as it is wide. `width` is in columns, for deciding whether it fits.
|
|
10
|
+
*/
|
|
11
|
+
export const terminalQr = (link) => {
|
|
12
|
+
const code = qrcode(0, "M");
|
|
13
|
+
code.addData(link);
|
|
14
|
+
code.make();
|
|
15
|
+
const count = code.getModuleCount();
|
|
16
|
+
const size = count + QUIET_ZONE * 2;
|
|
17
|
+
const dark = (row, col) => {
|
|
18
|
+
const r = row - QUIET_ZONE;
|
|
19
|
+
const c = col - QUIET_ZONE;
|
|
20
|
+
return r >= 0 && c >= 0 && r < count && c < count && code.isDark(r, c);
|
|
21
|
+
};
|
|
22
|
+
const lines = [];
|
|
23
|
+
for (let row = 0; row < size; row += 2) {
|
|
24
|
+
let line = "";
|
|
25
|
+
for (let col = 0; col < size; col++) {
|
|
26
|
+
const top = dark(row, col);
|
|
27
|
+
const bottom = row + 1 < size && dark(row + 1, col);
|
|
28
|
+
line += top && bottom ? "█" : top ? "▀" : bottom ? "▄" : " ";
|
|
29
|
+
}
|
|
30
|
+
lines.push(`${BLACK_ON_WHITE}${line}${RESET}`);
|
|
31
|
+
}
|
|
32
|
+
return { text: lines.join("\n"), width: size };
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=qr-terminal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qr-terminal.js","sourceRoot":"","sources":["../../src/session/qr-terminal.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,kBAAkB,CAAA;AAErC,MAAM,UAAU,GAAG,CAAC,CAAA;AACpB,iGAAiG;AACjG,kEAAkE;AAClE,MAAM,cAAc,GAAG,cAAc,CAAA;AACrC,MAAM,KAAK,GAAG,SAAS,CAAA;AAEvB;;;GAGG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAY,EAAmC,EAAE;IAC1E,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAC3B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAClB,IAAI,CAAC,IAAI,EAAE,CAAA;IAEX,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,EAAE,CAAA;IACnC,MAAM,IAAI,GAAG,KAAK,GAAG,UAAU,GAAG,CAAC,CAAA;IACnC,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,GAAW,EAAE,EAAE;QACxC,MAAM,CAAC,GAAG,GAAG,GAAG,UAAU,CAAA;QAC1B,MAAM,CAAC,GAAG,GAAG,GAAG,UAAU,CAAA;QAC1B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACxE,CAAC,CAAA;IAED,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QACvC,IAAI,IAAI,GAAG,EAAE,CAAA;QACb,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC;YACpC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;YAC1B,MAAM,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,GAAG,GAAG,CAAC,EAAE,GAAG,CAAC,CAAA;YACnD,IAAI,IAAI,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAA;QAC9D,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,GAAG,cAAc,GAAG,IAAI,GAAG,KAAK,EAAE,CAAC,CAAA;IAChD,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;AAChD,CAAC,CAAA"}
|