@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,24 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { type Diagnosis } from "../diagnose.js";
|
|
3
|
+
/**
|
|
4
|
+
* The state every other command depends on, read from disk and **never from MAX**.
|
|
5
|
+
*
|
|
6
|
+
* ⚠ **It must answer when everything is broken**, because that is the only time anybody runs it.
|
|
7
|
+
* No session, no configuration file, an unreadable message store, a keyring that will not
|
|
8
|
+
* open — each is a field in the answer and none is an exception. A diagnosis that fails with
|
|
9
|
+
* `authentication_error` when asked "do I have a session" is worth nothing.
|
|
10
|
+
*
|
|
11
|
+
* It is a thin shell over `diagnose` on purpose: the gathering is worth asserting on field by
|
|
12
|
+
* field, and a command body is a worse place to do that from than a function that takes its
|
|
13
|
+
* environment as arguments.
|
|
14
|
+
*
|
|
15
|
+
* `max config show` is the neighbouring half and does not overlap: that one reads what was
|
|
16
|
+
* configured, this one reads what exists.
|
|
17
|
+
*/
|
|
18
|
+
export declare const doctorCommand: () => Command;
|
|
19
|
+
/**
|
|
20
|
+
* What is wrong with how `max` is installed, and the exact command that fixes it. The fix is for
|
|
21
|
+
* this platform's shell only: PowerShell on Windows, sh elsewhere.
|
|
22
|
+
*/
|
|
23
|
+
export declare const installNotes: ({ install, native }: Diagnosis, note: (message: string) => void) => void;
|
|
24
|
+
//# sourceMappingURL=doctor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAInC,OAAO,EAAE,KAAK,SAAS,EAAY,MAAM,gBAAgB,CAAA;AASzD;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,aAAa,QAAO,OA8FhC,CAAA;AAkLD;;;GAGG;AACH,eAAO,MAAM,YAAY,wBAAyB,SAAS,QAAQ,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,KAAG,IAqB9F,CAAA"}
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
import { resolve } from "node:path";
|
|
2
|
+
import { CliError, writeSecurely } from "@wirecat/cli-core";
|
|
3
|
+
import { runsDirFor } from "@wirecat/cli-messaging/cli";
|
|
4
|
+
import { SendJournal } from "@wirecat/cli-messaging/sends";
|
|
5
|
+
import { Command } from "commander";
|
|
6
|
+
import { MAX_APP } from "../app.js";
|
|
7
|
+
import { BotTokenStore } from "../bot/auth.js";
|
|
8
|
+
import { BotApiClient } from "../bot/client.js";
|
|
9
|
+
import { diagnose } from "../diagnose.js";
|
|
10
|
+
import { ownScript } from "../install.js";
|
|
11
|
+
import { checkOnline, mcpHandshake } from "../online.js";
|
|
12
|
+
import { asFirstWord } from "../profile.js";
|
|
13
|
+
import { buildReport, issueUrlFor, REPORT_URL, reportFileName } from "../report.js";
|
|
14
|
+
import { sendsPathFor } from "../sends.js";
|
|
15
|
+
import { SessionStore } from "../session/store.js";
|
|
16
|
+
import { environmentOf, forCommand } from "./context.js";
|
|
17
|
+
/**
|
|
18
|
+
* The state every other command depends on, read from disk and **never from MAX**.
|
|
19
|
+
*
|
|
20
|
+
* ⚠ **It must answer when everything is broken**, because that is the only time anybody runs it.
|
|
21
|
+
* No session, no configuration file, an unreadable message store, a keyring that will not
|
|
22
|
+
* open — each is a field in the answer and none is an exception. A diagnosis that fails with
|
|
23
|
+
* `authentication_error` when asked "do I have a session" is worth nothing.
|
|
24
|
+
*
|
|
25
|
+
* It is a thin shell over `diagnose` on purpose: the gathering is worth asserting on field by
|
|
26
|
+
* field, and a command body is a worse place to do that from than a function that takes its
|
|
27
|
+
* environment as arguments.
|
|
28
|
+
*
|
|
29
|
+
* `max config show` is the neighbouring half and does not overlap: that one reads what was
|
|
30
|
+
* configured, this one reads what exists.
|
|
31
|
+
*/
|
|
32
|
+
export const doctorCommand = () => {
|
|
33
|
+
const command = new Command("doctor")
|
|
34
|
+
.description("the state this installation is in, without contacting MAX unless --online")
|
|
35
|
+
.option("--online", "also log in once, read one chat and start the MCP server; sends nothing");
|
|
36
|
+
command.action(async function () {
|
|
37
|
+
const { online } = this.opts();
|
|
38
|
+
const { renderer, settings, format, run, store, createClient } = forCommand(this);
|
|
39
|
+
const botStore = botStoreFor(this);
|
|
40
|
+
await run("doctor", async (events) => {
|
|
41
|
+
const report = await diagnoseProfile(settings, store, botStore, sessionStoreFor(this));
|
|
42
|
+
const personal = online && report.token.present
|
|
43
|
+
? await checkOnline(createClient({ events }), () => mcpHandshake({
|
|
44
|
+
execPath: process.execPath,
|
|
45
|
+
scriptPath: ownScript(),
|
|
46
|
+
env: { ...process.env, MAX_PROFILE: settings.profile },
|
|
47
|
+
}))
|
|
48
|
+
: [];
|
|
49
|
+
const bot = online && report.bot.token.present ? [await checkBot(this, botStore(settings.profile))] : [];
|
|
50
|
+
const checks = online ? [...personal, ...bot] : undefined;
|
|
51
|
+
renderer.result(format === "pretty"
|
|
52
|
+
? { ...forPerson(report, settings.profile), ...(checks ? checksForPerson(checks) : {}) }
|
|
53
|
+
: { ...report, ...(checks ? { online: checks } : {}) });
|
|
54
|
+
installNotes(report, renderer.note.bind(renderer));
|
|
55
|
+
// ⚠ Said whenever the environment moved the keyring, because this is the one failure with no
|
|
56
|
+
// other symptom: the profile is there, the login happened, and the answer is "no session".
|
|
57
|
+
if (report.keyring.movedByEnvironment) {
|
|
58
|
+
renderer.note("MAX_CONFIG_DIR, MAX_STATE_DIR or MAX_CACHE_DIR is set, which changes the keyring entry — " +
|
|
59
|
+
"a login done without them is invisible here, and the other way round");
|
|
60
|
+
}
|
|
61
|
+
if (report.client.stale) {
|
|
62
|
+
renderer.note(`the web client version max presents (${report.client.appVersion}) was read ${report.client.ageDays} days ago — ` +
|
|
63
|
+
"MAX may refuse it; update max, or report it if this is the latest");
|
|
64
|
+
}
|
|
65
|
+
if ("error" in report.store && report.store.error)
|
|
66
|
+
renderer.note(`the message store could not be read: ${report.store.error}`);
|
|
67
|
+
if ("writable" in report.store && report.store.writable === false) {
|
|
68
|
+
renderer.note(`the message store needs a newer max (schema ${report.store.schema}, this one speaks ${report.store.speaks})`);
|
|
69
|
+
}
|
|
70
|
+
if (report.legacyCache.exists) {
|
|
71
|
+
renderer.note(`the old local copy ${report.legacyCache.file} is no longer used by shared reads — you can remove it; use \`max store fetch\` to fetch history again`);
|
|
72
|
+
}
|
|
73
|
+
if (report.session.loginPausedUntil) {
|
|
74
|
+
renderer.note(`MAX refused the last login for too many attempts — no login before ${report.session.loginPausedUntil}; wait`);
|
|
75
|
+
}
|
|
76
|
+
const words = asFirstWord(settings.profile);
|
|
77
|
+
if (!report.token.present && ((report.session.logins ?? 0) > 0 || report.session.viewerId)) {
|
|
78
|
+
renderer.note("no token, although this profile has logged in here — the keyring is probably out of reach " +
|
|
79
|
+
"(cron, ssh: set XDG_RUNTIME_DIR). Log in again only if the token was removed");
|
|
80
|
+
}
|
|
81
|
+
else if (!report.token.present && report.bot.token.present) {
|
|
82
|
+
renderer.note(`this profile is a bot — its commands are \`max ${words}bot …\`; ` +
|
|
83
|
+
`\`max ${words}session start\` would add a personal account to it`);
|
|
84
|
+
}
|
|
85
|
+
else if (!report.token.present && report.bot.registry.exists) {
|
|
86
|
+
renderer.note(`this profile was a bot, and its token is gone — \`max ${words}bot auth set\` stores one`);
|
|
87
|
+
}
|
|
88
|
+
else if (!report.token.present) {
|
|
89
|
+
renderer.note(`no token for this profile — \`max ${words}session start\` for a personal account, ` +
|
|
90
|
+
`\`max ${words}bot auth set\` for a bot`);
|
|
91
|
+
}
|
|
92
|
+
const failed = checks?.filter((check) => !check.ok).map((check) => check.name) ?? [];
|
|
93
|
+
if (failed.length > 0)
|
|
94
|
+
throw new CliError("provider_error", `the online check failed: ${failed.join(", ")}`);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
command.addCommand(reportCommand());
|
|
98
|
+
return command;
|
|
99
|
+
};
|
|
100
|
+
const botStoreFor = (command) => {
|
|
101
|
+
const environment = environmentOf(command);
|
|
102
|
+
return (profile) => environment.botStore?.(profile) ?? new BotTokenStore({ profile });
|
|
103
|
+
};
|
|
104
|
+
const sessionStoreFor = (command) => {
|
|
105
|
+
const environment = environmentOf(command);
|
|
106
|
+
return (profile) => environment.store?.(profile) ?? new SessionStore({ profile });
|
|
107
|
+
};
|
|
108
|
+
// Reading the keyring is the one thing here that can prompt or hang on a locked keyring, so its
|
|
109
|
+
// failure is "no token found" rather than a failed command.
|
|
110
|
+
const storedIn = (source) => {
|
|
111
|
+
try {
|
|
112
|
+
const found = source();
|
|
113
|
+
return found === "keyring" || found === "file" ? found : undefined;
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
return undefined;
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
const diagnoseProfile = (settings, store, botStore, sessionStore) => diagnose({
|
|
120
|
+
profile: settings.profile,
|
|
121
|
+
configured: settings.configuredProfiles,
|
|
122
|
+
...(settings.transcribeModel === undefined ? {} : { speechModel: settings.transcribeModel }),
|
|
123
|
+
storedToken: (profile) => storedIn(() => (profile === settings.profile ? store : sessionStore(profile)).tokenSource()),
|
|
124
|
+
storedBotToken: (profile) => storedIn(() => botStore(profile).read()?.source),
|
|
125
|
+
});
|
|
126
|
+
/** One `getMyInfo`: whose token it is. Nothing is sent. */
|
|
127
|
+
const checkBot = async (command, store) => {
|
|
128
|
+
const environment = environmentOf(command);
|
|
129
|
+
try {
|
|
130
|
+
const stored = store.read();
|
|
131
|
+
if (!stored)
|
|
132
|
+
return { name: "bot", ok: false, detail: "no bot token" };
|
|
133
|
+
const bot = await new BotApiClient({
|
|
134
|
+
token: stored.token,
|
|
135
|
+
...(environment.botFetch ? { fetch: environment.botFetch } : {}),
|
|
136
|
+
...(environment.botUrl ? { baseUrl: environment.botUrl } : {}),
|
|
137
|
+
}).me();
|
|
138
|
+
return { name: "bot", ok: true, detail: `${bot.username ? `@${bot.username}` : bot.first_name}, id ${bot.user_id}` };
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
return { name: "bot", ok: false, detail: error instanceof Error ? error.message : String(error) };
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
const INCLUDES = [
|
|
145
|
+
"версия max, среда (node или bun) и система",
|
|
146
|
+
"то же, что показывает `max doctor`; домашний каталог заменён на ~",
|
|
147
|
+
"последний запуск, который кончился ошибкой: команда, запросы к MAX, коды ошибок, время",
|
|
148
|
+
"последние 20 действий-записей (отправки, реакции, удаления): исход, без текста",
|
|
149
|
+
"вместо номеров чатов и сообщений — метки: одинаковые внутри отчёта и разные в каждом новом",
|
|
150
|
+
];
|
|
151
|
+
const EXCLUDES = ["текстов сообщений", "названий чатов", "имён", "номеров телефонов", "токена"];
|
|
152
|
+
/**
|
|
153
|
+
* **A report is posted by the person, not by `max`**: there is no server of ours, and `max` holds
|
|
154
|
+
* no GitHub credentials. So `create` writes a file and prints a pre-filled new-issue link and the
|
|
155
|
+
* steps (`NEED-267`).
|
|
156
|
+
*/
|
|
157
|
+
const reportCommand = () => {
|
|
158
|
+
const report = new Command("report").description("what a problem report holds and where it goes; writes nothing");
|
|
159
|
+
report.action(async function () {
|
|
160
|
+
const { renderer, format, streams, run } = forCommand(this);
|
|
161
|
+
await run("doctor report", async () => explain(renderer, format, streams));
|
|
162
|
+
});
|
|
163
|
+
report
|
|
164
|
+
.command("create")
|
|
165
|
+
.description("write a problem report to a file, and print how to send it")
|
|
166
|
+
.option("--run <id>", "the run the report is about; the newest failed one if not given")
|
|
167
|
+
.option("--output <file>", "where to write it; a new file in this directory if not given")
|
|
168
|
+
.action(async function () {
|
|
169
|
+
const options = this.opts();
|
|
170
|
+
const { renderer, settings, format, streams, run, store } = forCommand(this);
|
|
171
|
+
await run("doctor report create", async () => {
|
|
172
|
+
const now = new Date();
|
|
173
|
+
const built = buildReport({
|
|
174
|
+
profile: settings.profile,
|
|
175
|
+
doctor: await diagnoseProfile(settings, store, botStoreFor(this), sessionStoreFor(this)),
|
|
176
|
+
runsDir: runsDirFor(MAX_APP),
|
|
177
|
+
...(options.run === undefined ? {} : { runId: options.run }),
|
|
178
|
+
sends: new SendJournal(sendsPathFor(settings.profile)).entries(),
|
|
179
|
+
now,
|
|
180
|
+
});
|
|
181
|
+
const path = resolve(options.output ?? reportFileName(now));
|
|
182
|
+
writeSecurely(path, `${JSON.stringify(built, null, 2)}\n`, 0o600);
|
|
183
|
+
const issue = issueUrlFor(built, path);
|
|
184
|
+
const steps = [
|
|
185
|
+
`Откройте ссылку: GitHub откроет новую задачу с заголовком и заготовкой текста. Нужен аккаунт на GitHub.`,
|
|
186
|
+
`Перетащите в поле текста файл ${path} — GitHub приложит его.`,
|
|
187
|
+
"Напишите, что делали, что ожидали и что случилось.",
|
|
188
|
+
"Нажмите «Submit new issue». Задача будет видна всем.",
|
|
189
|
+
];
|
|
190
|
+
const noRun = built.run
|
|
191
|
+
? undefined
|
|
192
|
+
: "Неудачных запусков не записано. Если проблема повторяется, повторите команду, которая не работает, и создайте отчёт снова: неудачный запуск сохранится сам.";
|
|
193
|
+
if (format !== "pretty") {
|
|
194
|
+
renderer.result({ path, sendTo: REPORT_URL, issue, run: built.run?.metadata.runId ?? null, steps });
|
|
195
|
+
if (noRun)
|
|
196
|
+
renderer.note(noRun);
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
streams.data([
|
|
200
|
+
`Отчёт записан: ${path}`,
|
|
201
|
+
...(built.run ? [`Запуск в отчёте: ${built.run.metadata.runId} (${built.run.metadata.command})`] : [noRun]),
|
|
202
|
+
"",
|
|
203
|
+
"Что сделать:",
|
|
204
|
+
`1. ${steps[0]}`,
|
|
205
|
+
` ${issue}`,
|
|
206
|
+
...steps.slice(1).map((step, index) => `${index + 2}. ${step}`),
|
|
207
|
+
"",
|
|
208
|
+
"Перед отправкой файл можно открыть и посмотреть: в нём нет текстов сообщений, а вместо номеров чатов и",
|
|
209
|
+
"сообщений — метки.",
|
|
210
|
+
].join("\n"));
|
|
211
|
+
});
|
|
212
|
+
});
|
|
213
|
+
return report;
|
|
214
|
+
};
|
|
215
|
+
const explain = (renderer, format, streams) => {
|
|
216
|
+
if (format !== "pretty") {
|
|
217
|
+
renderer.result({
|
|
218
|
+
sendTo: REPORT_URL,
|
|
219
|
+
includes: INCLUDES,
|
|
220
|
+
excludes: EXCLUDES,
|
|
221
|
+
create: "max doctor report create",
|
|
222
|
+
});
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
streams.data([
|
|
226
|
+
"Отчёт о проблеме — один файл для автора max. Он прикладывается к новой задаче на GitHub.",
|
|
227
|
+
"",
|
|
228
|
+
"В файле:",
|
|
229
|
+
...INCLUDES.map((line, index) => `- ${line}${index === INCLUDES.length - 1 ? "." : ";"}`),
|
|
230
|
+
"",
|
|
231
|
+
`В файле нет: ${EXCLUDES.join(", ")}.`,
|
|
232
|
+
"Задачи на GitHub видны всем — и приложенный файл тоже.",
|
|
233
|
+
"",
|
|
234
|
+
"Создать отчёт: max doctor report create",
|
|
235
|
+
"Про определённый запуск: max doctor report create --run <id> (номера — max runs list)",
|
|
236
|
+
].join("\n"));
|
|
237
|
+
};
|
|
238
|
+
const profileLine = ({ name, personal, bot }) => `${name} (${[personal ? "personal" : "", bot ? "bot" : ""].filter(Boolean).join(" + ") || "not logged in"})`;
|
|
239
|
+
const BOT_TOKEN_FROM = {
|
|
240
|
+
environment: "MAX_BOT_TOKEN",
|
|
241
|
+
keyring: "the keyring",
|
|
242
|
+
file: "credentials.json — there is no keyring here",
|
|
243
|
+
none: "nowhere",
|
|
244
|
+
};
|
|
245
|
+
const TOKEN_FROM = {
|
|
246
|
+
environment: "MAX_TOKEN",
|
|
247
|
+
keyring: "the keyring",
|
|
248
|
+
file: "credentials.json — there is no keyring here",
|
|
249
|
+
none: "nowhere",
|
|
250
|
+
};
|
|
251
|
+
/**
|
|
252
|
+
* What is wrong with how `max` is installed, and the exact command that fixes it. The fix is for
|
|
253
|
+
* this platform's shell only: PowerShell on Windows, sh elsewhere.
|
|
254
|
+
*/
|
|
255
|
+
export const installNotes = ({ install, native }, note) => {
|
|
256
|
+
if (install.fix.length > 0) {
|
|
257
|
+
note(`the max command is in ${install.binDir}, which is not on PATH — a new terminal will not find it. Run:\n` +
|
|
258
|
+
install.fix.map((line) => ` ${line}`).join("\n") +
|
|
259
|
+
(install.fix.length > 1
|
|
260
|
+
? "\nThe first line fixes this window, the second every new one; then open a new terminal"
|
|
261
|
+
: "\nand add that line to your shell's startup file (~/.zshrc or ~/.bashrc)"));
|
|
262
|
+
}
|
|
263
|
+
if (install.onPath !== null && install.isMaxCli === false) {
|
|
264
|
+
note(`\`max\` on PATH is ${install.onPath}, another program — call this one by its full path, or put it first`);
|
|
265
|
+
}
|
|
266
|
+
if (install.installer === "npx" && install.onPath === null) {
|
|
267
|
+
note("running through npx, and there is no `max` command on PATH — `npm install -g @wirecat/max-cli` installs " +
|
|
268
|
+
"one; if `max` is still not found after that, `npm prefix -g` names the folder PATH needs");
|
|
269
|
+
}
|
|
270
|
+
if (native.keyring !== "ok")
|
|
271
|
+
note(`the keyring module does not load (${native.keyring}) — the token goes into a file`);
|
|
272
|
+
if (native.sqlite !== "ok")
|
|
273
|
+
note(`SQLite does not open (${native.sqlite}) — max needs Node 22 or newer, or Bun 1.3`);
|
|
274
|
+
};
|
|
275
|
+
const checksForPerson = (checks) => Object.fromEntries(checks.map(({ name, ok, detail }) => [`online: ${name}`, `${ok ? "ok" : "FAILED"} — ${detail}`]));
|
|
276
|
+
/** One line per row: the pretty renderer prints a flat object and does not descend into one. */
|
|
277
|
+
const forPerson = (report, profile) => ({
|
|
278
|
+
profile,
|
|
279
|
+
token: report.token.present ? `yes, from ${TOKEN_FROM[report.token.from]}` : "none",
|
|
280
|
+
keyring: report.keyring.movedByEnvironment
|
|
281
|
+
? `${report.keyring.service} (moved by the environment)`
|
|
282
|
+
: report.keyring.service,
|
|
283
|
+
"logged in": report.session.exists
|
|
284
|
+
? `${report.session.logins ?? 0} time(s)${report.session.lastLoginAt ? `, last ${report.session.lastLoginAt}` : ""}`
|
|
285
|
+
: "never on this machine",
|
|
286
|
+
"account known": report.session.viewerId,
|
|
287
|
+
...(report.session.loginPausedUntil ? { "login paused until": report.session.loginPausedUntil } : {}),
|
|
288
|
+
"presents as": `web client ${report.client.appVersion}, ${report.client.chrome}, read ${report.client.readOn} (${report.client.ageDays} days ago)`,
|
|
289
|
+
"bot token": report.bot.token.present ? `yes, from ${BOT_TOKEN_FROM[report.bot.token.from]}` : "none",
|
|
290
|
+
...(report.bot.registry.exists ? { "bot chats seen": `${report.bot.registry.chats}` } : {}),
|
|
291
|
+
profiles: report.profiles.length === 0 ? "none" : report.profiles.map(profileLine).join(", "),
|
|
292
|
+
"message store": storeLine(report.store),
|
|
293
|
+
runs: `${report.runs.kept} kept in ${report.runs.directory}`,
|
|
294
|
+
runtime: `${report.install.runtime.version}, ${report.install.runtime.path}`,
|
|
295
|
+
"installed by": report.install.installer,
|
|
296
|
+
"max on PATH": report.install.onPath === null
|
|
297
|
+
? "not found"
|
|
298
|
+
: `${report.install.onPath}${report.install.isMaxCli === false ? " — another program" : ""}`,
|
|
299
|
+
"speech model": `${report.speech.model}, ${report.speech.downloaded ? "downloaded" : "not downloaded"}`,
|
|
300
|
+
});
|
|
301
|
+
const storeLine = (store) => {
|
|
302
|
+
if ("error" in store && store.error)
|
|
303
|
+
return `${store.error} (${store.path})`;
|
|
304
|
+
if ("schema" in store)
|
|
305
|
+
return `schema ${store.schema}, ${store.chats ?? 0} chats, ${store.messages ?? 0} messages in ${store.path}`;
|
|
306
|
+
return `not created yet (${store.path})`;
|
|
307
|
+
};
|
|
308
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
interface Flags {
|
|
3
|
+
yes?: boolean;
|
|
4
|
+
allowDangerous?: boolean;
|
|
5
|
+
allowSend?: boolean;
|
|
6
|
+
confirmSend?: boolean;
|
|
7
|
+
allowMarkRead?: boolean;
|
|
8
|
+
allowDelete?: boolean;
|
|
9
|
+
allowModerate?: boolean;
|
|
10
|
+
permission?: string[];
|
|
11
|
+
httpConfirmation?: string;
|
|
12
|
+
http?: boolean;
|
|
13
|
+
port?: string;
|
|
14
|
+
publicUrl?: string;
|
|
15
|
+
revoke?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export declare const mcpCommand: () => Command;
|
|
18
|
+
/**
|
|
19
|
+
* `node` and the script by full path, on every platform: a client started from the desktop does
|
|
20
|
+
* not see the PATH a terminal has, and on Windows `max` is a `.cmd` file that a client which starts
|
|
21
|
+
* programs without a shell cannot run. `MAX_TOKEN` is never copied — the server reads the keyring.
|
|
22
|
+
*/
|
|
23
|
+
export declare const serverEntry: ({ profile, flags, execPath, scriptPath, env, }: {
|
|
24
|
+
profile: string;
|
|
25
|
+
flags: Flags;
|
|
26
|
+
execPath: string;
|
|
27
|
+
scriptPath: string;
|
|
28
|
+
env: NodeJS.ProcessEnv;
|
|
29
|
+
}) => {
|
|
30
|
+
config: {
|
|
31
|
+
mcpServers: Record<string, object>;
|
|
32
|
+
};
|
|
33
|
+
warning?: string;
|
|
34
|
+
};
|
|
35
|
+
export {};
|
|
36
|
+
//# sourceMappingURL=mcp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAKnC,UAAU,KAAK;IACb,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AA6CD,eAAO,MAAM,UAAU,QAAO,OA8I7B,CAAA;AAoBD;;;;GAIG;AACH,eAAO,MAAM,WAAW,mDAMrB;IACD,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,KAAK,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,GAAG,EAAE,MAAM,CAAC,UAAU,CAAA;CACvB,KAAG;IAAE,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CA4BrE,CAAA"}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { CliError } from "@wirecat/cli-core";
|
|
2
|
+
import { annotate } from "@wirecat/cli-core/commands";
|
|
3
|
+
import { installerOf } from "@wirecat/cli-core/update";
|
|
4
|
+
import { httpTokenFile, revokeAll } from "@wirecat/cli-messaging/cli";
|
|
5
|
+
import { Command } from "commander";
|
|
6
|
+
import { MAX_APP } from "../app.js";
|
|
7
|
+
import { ownScript } from "../install.js";
|
|
8
|
+
import { forCommand } from "./context.js";
|
|
9
|
+
const DEFAULT_PORT = 8765;
|
|
10
|
+
const publicUrlOf = (given) => {
|
|
11
|
+
const example = "--public-url https://<name>.ts.net";
|
|
12
|
+
if (!given)
|
|
13
|
+
throw new CliError("configuration_error", `--http needs the tunnel's address: ${example}`);
|
|
14
|
+
let url;
|
|
15
|
+
try {
|
|
16
|
+
url = new URL(given);
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
throw new CliError("validation_error", `--public-url is not an address: ${example}`);
|
|
20
|
+
}
|
|
21
|
+
const local = url.protocol === "http:" && ["localhost", "127.0.0.1"].includes(url.hostname);
|
|
22
|
+
if (url.protocol !== "https:" && !local)
|
|
23
|
+
throw new CliError("validation_error", "--public-url must be https — the browser apps reach max through it");
|
|
24
|
+
if (url.pathname !== "/" || url.search || url.hash)
|
|
25
|
+
throw new CliError("validation_error", `--public-url is the tunnel's address only, without a path: ${example}`);
|
|
26
|
+
return url;
|
|
27
|
+
};
|
|
28
|
+
const portOf = (given) => {
|
|
29
|
+
if (given === undefined)
|
|
30
|
+
return DEFAULT_PORT;
|
|
31
|
+
const port = Number(given);
|
|
32
|
+
if (!Number.isInteger(port) || port < 1 || port > 65535)
|
|
33
|
+
throw new CliError("validation_error", "--port takes 1–65535");
|
|
34
|
+
return port;
|
|
35
|
+
};
|
|
36
|
+
const withFlags = (command) => command
|
|
37
|
+
.option("--permission <key=level>", "override a permission for this server only; repeat for more keys", (value, previous = []) => [...previous, value])
|
|
38
|
+
.option("--allow-dangerous", "no longer used — writes show no form; the profile's permissions decide")
|
|
39
|
+
.option("--allow-send", "deprecated: use permissions.messages.send in config; does not grant access")
|
|
40
|
+
.option("--confirm-send", "no longer used — writes show no form; the profile's permissions decide")
|
|
41
|
+
.option("--allow-mark-read", "deprecated: use permissions.chats.mark-read in config; does not grant access")
|
|
42
|
+
.option("--allow-delete", "deprecated: use permissions.messages.delete in config; does not grant access")
|
|
43
|
+
.option("--allow-moderate", "deprecated: use permissions.chats.moderate and group rules; does not grant access");
|
|
44
|
+
const checked = (flags, _mcpTools) => flags;
|
|
45
|
+
export const mcpCommand = () => {
|
|
46
|
+
const command = withFlags(new Command("mcp").description("serve this profile to an agent over MCP, on stdin and stdout — `claude mcp add max -- max mcp`"))
|
|
47
|
+
.option("--http", "serve over HTTP on 127.0.0.1 for ChatGPT and Claude in the browser, behind your tunnel; the profile's permissions decide")
|
|
48
|
+
.option("--http-confirmation <mode>", "no longer used — writes show no form; the profile's permissions decide")
|
|
49
|
+
.option("--port <port>", `the local port for --http (default ${DEFAULT_PORT})`)
|
|
50
|
+
.option("--public-url <url>", "the tunnel's https address the browser apps use, e.g. https://<name>.ts.net")
|
|
51
|
+
.option("--revoke", "forget every login given to a browser app; each must log in again");
|
|
52
|
+
command.action(async function () {
|
|
53
|
+
const own = this.optsWithGlobals();
|
|
54
|
+
const context = forCommand(this);
|
|
55
|
+
const tokenFile = httpTokenFile(MAX_APP, context.settings.profile, process.env);
|
|
56
|
+
if (own.revoke) {
|
|
57
|
+
revokeAll(tokenFile);
|
|
58
|
+
context.renderer.result({ revoked: true, profile: context.settings.profile });
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
const { allowSend, confirmSend, allowMarkRead, allowDelete, allowModerate } = checked(this.opts(), context.settings.mcpTools);
|
|
62
|
+
for (const flag of [
|
|
63
|
+
"allowSend",
|
|
64
|
+
"allowMarkRead",
|
|
65
|
+
"allowDelete",
|
|
66
|
+
"allowModerate",
|
|
67
|
+
"confirmSend",
|
|
68
|
+
"allowDangerous",
|
|
69
|
+
"httpConfirmation",
|
|
70
|
+
])
|
|
71
|
+
if (this.opts()[flag])
|
|
72
|
+
context.renderer.note(`${flag} no longer changes MCP access or confirmation — use permissions in config`);
|
|
73
|
+
if (own.http) {
|
|
74
|
+
const publicUrl = publicUrlOf(own.publicUrl);
|
|
75
|
+
const { serveOverHttpUntilStopped } = await import("../mcp/server.js");
|
|
76
|
+
await serveOverHttpUntilStopped(context, {}, { publicUrl, port: portOf(own.port), tokenFile });
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
// Loaded here, not at the top: every other command would otherwise pay for the SDK and zod.
|
|
80
|
+
const { serveOverStdio } = await import("../mcp/server.js");
|
|
81
|
+
await serveOverStdio(context, {
|
|
82
|
+
allowSend: allowSend === true,
|
|
83
|
+
yes: this.optsWithGlobals().yes === true,
|
|
84
|
+
allowDangerous: this.optsWithGlobals().allowDangerous === true,
|
|
85
|
+
confirmSend: confirmSend === true,
|
|
86
|
+
allowMarkRead: allowMarkRead === true,
|
|
87
|
+
allowDelete: allowDelete === true,
|
|
88
|
+
allowModerate: allowModerate === true,
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
command.addCommand(withFlags(new Command("config").description("print the mcpServers entry for Claude Desktop, Cursor and others, with full paths; writes nothing")).action(async function () {
|
|
92
|
+
const { renderer, settings, format, streams, run } = forCommand(this);
|
|
93
|
+
const flags = checked(this.optsWithGlobals(), settings.mcpTools);
|
|
94
|
+
await run("mcp config", async () => {
|
|
95
|
+
const entry = serverEntry({
|
|
96
|
+
profile: settings.profile,
|
|
97
|
+
flags,
|
|
98
|
+
execPath: process.execPath,
|
|
99
|
+
scriptPath: ownScript(),
|
|
100
|
+
env: process.env,
|
|
101
|
+
});
|
|
102
|
+
// Pasted into a file, so a person gets the same JSON a script does, only indented.
|
|
103
|
+
if (format === "pretty")
|
|
104
|
+
streams.data(JSON.stringify(entry.config, null, 2));
|
|
105
|
+
else
|
|
106
|
+
renderer.result(entry.config);
|
|
107
|
+
if (entry.warning)
|
|
108
|
+
renderer.note(entry.warning);
|
|
109
|
+
});
|
|
110
|
+
}));
|
|
111
|
+
command.addCommand(withFlags(annotate(new Command("setup"), { mutates: true, local: true })
|
|
112
|
+
.description("add this profile's local MCP server to Codex or Claude Code")
|
|
113
|
+
.argument("<client>", "codex or claude-code")
|
|
114
|
+
.option("--allow-writes", "acknowledge that this profile offers writing tools")).action(async function (client) {
|
|
115
|
+
if (client !== "codex" && client !== "claude-code")
|
|
116
|
+
throw new CliError("validation_error", "choose codex or claude-code");
|
|
117
|
+
const { renderer, settings } = forCommand(this);
|
|
118
|
+
const entry = serverEntry({
|
|
119
|
+
profile: settings.profile,
|
|
120
|
+
flags: checked(this.optsWithGlobals(), settings.mcpTools),
|
|
121
|
+
execPath: process.execPath,
|
|
122
|
+
scriptPath: ownScript(),
|
|
123
|
+
env: process.env,
|
|
124
|
+
});
|
|
125
|
+
const [name, server] = Object.entries(entry.config.mcpServers)[0] ?? [];
|
|
126
|
+
if (!name || !server)
|
|
127
|
+
throw new CliError("validation_error", "the MCP entry is empty");
|
|
128
|
+
const { installStdioEntry, probeStdio } = await import("@wirecat/cli-core/mcp");
|
|
129
|
+
try {
|
|
130
|
+
const configuration = server;
|
|
131
|
+
const { potentialWrites } = await probeStdio(configuration);
|
|
132
|
+
if (potentialWrites.length > 0 && this.opts().allowWrites !== true)
|
|
133
|
+
throw new Error(`this profile offers ${potentialWrites.length} tools that may write; review its permissions, then pass --allow-writes to install it`);
|
|
134
|
+
renderer.result({ ...installStdioEntry(client, name, configuration), potentialWrites: potentialWrites.length });
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
throw new CliError("validation_error", error instanceof Error ? error.message : "MCP setup failed");
|
|
138
|
+
}
|
|
139
|
+
}));
|
|
140
|
+
command.addCommand(withFlags(new Command("doctor").description("check this profile's local MCP handshake and tool list")).action(async function () {
|
|
141
|
+
const { renderer, settings } = forCommand(this);
|
|
142
|
+
const entry = serverEntry({
|
|
143
|
+
profile: settings.profile,
|
|
144
|
+
flags: checked(this.optsWithGlobals(), settings.mcpTools),
|
|
145
|
+
execPath: process.execPath,
|
|
146
|
+
scriptPath: ownScript(),
|
|
147
|
+
env: process.env,
|
|
148
|
+
});
|
|
149
|
+
const server = Object.values(entry.config.mcpServers)[0];
|
|
150
|
+
if (!server)
|
|
151
|
+
throw new CliError("validation_error", "the MCP entry is empty");
|
|
152
|
+
const { probeStdio } = await import("@wirecat/cli-core/mcp");
|
|
153
|
+
try {
|
|
154
|
+
const { tools, potentialWrites } = await probeStdio(server);
|
|
155
|
+
renderer.result({
|
|
156
|
+
healthy: true,
|
|
157
|
+
profile: settings.profile,
|
|
158
|
+
tools: tools.length,
|
|
159
|
+
potentialWrites: potentialWrites.length,
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
throw new CliError("validation_error", error instanceof Error ? error.message : "MCP doctor failed");
|
|
164
|
+
}
|
|
165
|
+
}));
|
|
166
|
+
return command;
|
|
167
|
+
};
|
|
168
|
+
const FLAG_ARGS = [
|
|
169
|
+
["allowSend", "--allow-send"],
|
|
170
|
+
["confirmSend", "--confirm-send"],
|
|
171
|
+
["yes", "--yes"],
|
|
172
|
+
["allowDangerous", "--allow-dangerous"],
|
|
173
|
+
["allowMarkRead", "--allow-mark-read"],
|
|
174
|
+
["allowDelete", "--allow-delete"],
|
|
175
|
+
["allowModerate", "--allow-moderate"],
|
|
176
|
+
];
|
|
177
|
+
/**
|
|
178
|
+
* They choose the keyring entry and the store, so a server without them would answer "no session" or search
|
|
179
|
+
* another store. `XDG_RUNTIME_DIR` reaches the keyring, and a client that trims the environment drops it.
|
|
180
|
+
*/
|
|
181
|
+
const DIRECTORIES = ["MAX_CONFIG_DIR", "MAX_STATE_DIR", "MAX_CACHE_DIR", "MESSAGING_STORE", "XDG_RUNTIME_DIR"];
|
|
182
|
+
const VERSION_MANAGER = /[\\/](\.nvm|nvm|\.fnm|fnm|fnm_multishells|\.volta|volta|\.asdf|mise)[\\/]/i;
|
|
183
|
+
/**
|
|
184
|
+
* `node` and the script by full path, on every platform: a client started from the desktop does
|
|
185
|
+
* not see the PATH a terminal has, and on Windows `max` is a `.cmd` file that a client which starts
|
|
186
|
+
* programs without a shell cannot run. `MAX_TOKEN` is never copied — the server reads the keyring.
|
|
187
|
+
*/
|
|
188
|
+
export const serverEntry = ({ profile, flags, execPath, scriptPath, env, }) => {
|
|
189
|
+
if (installerOf(scriptPath) === "npx") {
|
|
190
|
+
throw new CliError("validation_error", "this max runs from npx's cache, which gets cleared, and the path would stop working — " +
|
|
191
|
+
"`npm install -g @wirecat/max-cli`, then run `max mcp config` again");
|
|
192
|
+
}
|
|
193
|
+
const args = [
|
|
194
|
+
scriptPath,
|
|
195
|
+
...(profile === "default" ? [] : [profile]),
|
|
196
|
+
"mcp",
|
|
197
|
+
...(flags.permission ?? []).flatMap((entry) => ["--permission", entry]),
|
|
198
|
+
...FLAG_ARGS.filter(([key]) => flags[key] === true).map(([, flag]) => flag),
|
|
199
|
+
];
|
|
200
|
+
const directories = Object.fromEntries(DIRECTORIES.flatMap((name) => (env[name] ? [[name, env[name]]] : [])));
|
|
201
|
+
const server = {
|
|
202
|
+
type: "stdio",
|
|
203
|
+
command: execPath,
|
|
204
|
+
args,
|
|
205
|
+
...(Object.keys(directories).length > 0 ? { env: directories } : {}),
|
|
206
|
+
};
|
|
207
|
+
return {
|
|
208
|
+
config: { mcpServers: { [profile === "default" ? "max" : `max-${profile}`]: server } },
|
|
209
|
+
...(VERSION_MANAGER.test(execPath)
|
|
210
|
+
? { warning: `${execPath} belongs to one Node version — after switching or upgrading Node, run this again` }
|
|
211
|
+
: {}),
|
|
212
|
+
};
|
|
213
|
+
};
|
|
214
|
+
//# sourceMappingURL=mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"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"}
|