@wirecat/max-cli 0.0.0-stage → 0.42.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 +21 -0
- package/README.md +530 -2
- 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 +125 -4
- package/skills/max-cli/SKILL.md +518 -0
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
import { CliError } from "@wirecat/cli-core";
|
|
2
|
+
import { moderationPoints } from "./points.js";
|
|
3
|
+
import { defaultRules, ModerationRules, moderationPathFor } from "./rules.js";
|
|
4
|
+
const INVITE = /max\.ru\/join\//i;
|
|
5
|
+
const LINK = /https?:\/\/\S+/i;
|
|
6
|
+
/** Which action wins when a message breaks several rules; the first rule listed breaks a tie. */
|
|
7
|
+
const STRENGTH = { report: 0, delete: 1, remove: 2 };
|
|
8
|
+
/**
|
|
9
|
+
* What the rules say about what is new. Pure: nothing here talks to MAX. One finding per message —
|
|
10
|
+
* the rule with the strongest action — and one removal per person, whatever else they did.
|
|
11
|
+
*/
|
|
12
|
+
export const judge = ({ rules, messages, joined, answerers, now }) => {
|
|
13
|
+
const trusted = new Set(rules.trusted);
|
|
14
|
+
const blocked = (id, name) => (id !== null && rules.blocked.includes(id)) ||
|
|
15
|
+
(name !== null && rules.blockedNames.some((part) => name.toLocaleLowerCase().includes(part.toLocaleLowerCase())));
|
|
16
|
+
const young = (member) => rules.newAccount.days > 0 &&
|
|
17
|
+
member.registeredAt !== null &&
|
|
18
|
+
now - Date.parse(member.registeredAt) < rules.newAccount.days * 86_400_000;
|
|
19
|
+
const found = [];
|
|
20
|
+
const add = (finding) => {
|
|
21
|
+
if (finding.action === "remove" && found.some((f) => f.action === "remove" && f.personId === finding.personId)) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
found.push(finding);
|
|
25
|
+
};
|
|
26
|
+
for (const member of joined) {
|
|
27
|
+
if (trusted.has(member.id) || answerers.has(member.id))
|
|
28
|
+
continue;
|
|
29
|
+
const person = { kind: "member", personId: member.id, personName: member.name };
|
|
30
|
+
if (blocked(member.id, member.name)) {
|
|
31
|
+
add({ ...person, rule: "blocked", action: rules.blockedPeople === "remove" ? "remove" : "report" });
|
|
32
|
+
}
|
|
33
|
+
else if (young(member)) {
|
|
34
|
+
add({ ...person, rule: "newAccount", action: rules.newAccount.action });
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const flooding = floodOf(messages, rules.flood);
|
|
38
|
+
for (const message of messages) {
|
|
39
|
+
const id = message.senderId;
|
|
40
|
+
if (id === null || message.outgoing === true || answerers.has(id) || trusted.has(id))
|
|
41
|
+
continue;
|
|
42
|
+
if (message.attachments.some((attachment) => attachment.kind === "control"))
|
|
43
|
+
continue;
|
|
44
|
+
const base = { kind: "message", personId: id, personName: message.senderName, messageId: message.id };
|
|
45
|
+
const text = message.text;
|
|
46
|
+
const broken = [];
|
|
47
|
+
if (blocked(id, message.senderName))
|
|
48
|
+
broken.push(["blocked", rules.blockedPeople]);
|
|
49
|
+
if (INVITE.test(text))
|
|
50
|
+
broken.push(["invites", rules.invites]);
|
|
51
|
+
if (LINK.test(text) || message.attachments.some((attachment) => attachment.kind === "share")) {
|
|
52
|
+
broken.push(["links", rules.links]);
|
|
53
|
+
}
|
|
54
|
+
if (message.forwardedFrom !== null)
|
|
55
|
+
broken.push(["forwards", rules.forwards]);
|
|
56
|
+
if (flooding.has(message.id))
|
|
57
|
+
broken.push(["flood", rules.flood.action]);
|
|
58
|
+
const strongest = broken.reduce((best, rule) => (best === undefined || STRENGTH[rule[1]] > STRENGTH[best[1]] ? rule : best), undefined);
|
|
59
|
+
if (strongest)
|
|
60
|
+
add({ ...base, rule: strongest[0], action: strongest[1] });
|
|
61
|
+
}
|
|
62
|
+
return found;
|
|
63
|
+
};
|
|
64
|
+
/** Messages past the limit: more than `messages` from one person within `minutes`. */
|
|
65
|
+
const floodOf = (messages, flood) => {
|
|
66
|
+
const window = flood.minutes * 60_000;
|
|
67
|
+
const over = new Set();
|
|
68
|
+
const bySender = new Map();
|
|
69
|
+
for (const message of messages) {
|
|
70
|
+
if (message.senderId === null)
|
|
71
|
+
continue;
|
|
72
|
+
const times = bySender.get(message.senderId) ?? [];
|
|
73
|
+
const at = Date.parse(message.timestamp);
|
|
74
|
+
times.push(at);
|
|
75
|
+
bySender.set(message.senderId, times);
|
|
76
|
+
if (times.filter((time) => at - time < window).length > flood.messages)
|
|
77
|
+
over.add(message.id);
|
|
78
|
+
}
|
|
79
|
+
return over;
|
|
80
|
+
};
|
|
81
|
+
const CONSENT = {
|
|
82
|
+
delete: "delete",
|
|
83
|
+
remove: "remove",
|
|
84
|
+
};
|
|
85
|
+
/** The personal account: deleting is for everyone, removing leaves messages and cannot ban. */
|
|
86
|
+
export const personal = (client) => ({
|
|
87
|
+
deleteMessage: async (chatId, messageId) => {
|
|
88
|
+
await client.messages.delete(chatId, [messageId], { forEveryone: true });
|
|
89
|
+
},
|
|
90
|
+
removePerson: async (chatId, personId) => {
|
|
91
|
+
await client.chats.members.remove(chatId, [personId]);
|
|
92
|
+
},
|
|
93
|
+
});
|
|
94
|
+
/**
|
|
95
|
+
* Does what the findings ask, as far as consent, the per-run limit and the guard let it. Stops
|
|
96
|
+
* acting at the first hourly-limit refusal: the rest is `skipped`, never tried.
|
|
97
|
+
*/
|
|
98
|
+
export const act = async (moderator, findings, options) => {
|
|
99
|
+
const { chatId, rules, allowDangerous, dryRun, maxActions, confirm } = options;
|
|
100
|
+
const rows = [];
|
|
101
|
+
let acted = 0;
|
|
102
|
+
let stopped;
|
|
103
|
+
for (const finding of findings) {
|
|
104
|
+
if (finding.action === "report") {
|
|
105
|
+
rows.push({ ...finding, outcome: "reported" });
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
const command = commandFor(chatId, finding);
|
|
109
|
+
const level = rules.consent[CONSENT[finding.action]];
|
|
110
|
+
const row = (outcome, reason) => ({
|
|
111
|
+
...finding,
|
|
112
|
+
outcome,
|
|
113
|
+
...(reason ? { reason } : {}),
|
|
114
|
+
...(outcome === "done" ? {} : { command }),
|
|
115
|
+
});
|
|
116
|
+
if (level === "deny") {
|
|
117
|
+
rows.push(row("forbidden", `consent.${CONSENT[finding.action]} is deny`));
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
if (dryRun) {
|
|
121
|
+
rows.push(row("planned", "--dry-run"));
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
if (level === "readonly") {
|
|
125
|
+
rows.push(row("reported", `consent.${CONSENT[finding.action]} is readonly`));
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
if (stopped || acted >= maxActions) {
|
|
129
|
+
rows.push(row("skipped", stopped ?? `over the limit of ${maxActions} actions per check`));
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
if (level === "ask" && !allowDangerous) {
|
|
133
|
+
if (!confirm) {
|
|
134
|
+
rows.push(row("planned", `consent.${CONSENT[finding.action]} is ask, and nobody is there to ask`));
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
if (!(await confirm(finding))) {
|
|
138
|
+
rows.push(row("declined", "not confirmed"));
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
acted += 1;
|
|
143
|
+
try {
|
|
144
|
+
if (finding.action === "delete" && finding.messageId) {
|
|
145
|
+
await moderator.deleteMessage(chatId, finding.messageId);
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
await moderator.removePerson(chatId, finding.personId);
|
|
149
|
+
}
|
|
150
|
+
rows.push(row("done"));
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
const failure = asCliError(error);
|
|
154
|
+
if (failure.code === "rate_limited")
|
|
155
|
+
stopped = failure.message;
|
|
156
|
+
const refused = ["rate_limited", "permission_error", "confirmation_required"].includes(failure.code);
|
|
157
|
+
rows.push(row(refused ? "refused" : "failed", failure.message));
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return rows;
|
|
161
|
+
};
|
|
162
|
+
const asCliError = (error) => error instanceof CliError
|
|
163
|
+
? error
|
|
164
|
+
: new CliError("provider_error", error instanceof Error ? error.message : String(error));
|
|
165
|
+
const who = (finding) => finding.personName ?? finding.personId;
|
|
166
|
+
/** One action in words, for a prompt or a confirmation form. */
|
|
167
|
+
export const describe = (finding) => finding.action === "delete"
|
|
168
|
+
? `delete message ${finding.messageId} from ${who(finding)} for everyone (${finding.rule})`
|
|
169
|
+
: `remove ${who(finding)} from the group (${finding.rule})`;
|
|
170
|
+
/** Whether acting on it waits for the owner's yes. */
|
|
171
|
+
export const needsConfirm = (rules, finding) => (finding.action === "delete" || finding.action === "remove") && rules.consent[finding.action] === "ask";
|
|
172
|
+
const commandFor = (chatId, finding) => {
|
|
173
|
+
switch (finding.action) {
|
|
174
|
+
case "delete":
|
|
175
|
+
return `max messages delete ${chatId} ${finding.messageId} --for-everyone --allow-dangerous`;
|
|
176
|
+
case "remove":
|
|
177
|
+
return `max chats members remove ${chatId} ${finding.personId}`;
|
|
178
|
+
default:
|
|
179
|
+
return "";
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
/**
|
|
183
|
+
* What is new in the group since `since`: its messages, who joined (from the service messages —
|
|
184
|
+
* `add` measured, `joinByLink` assumed to name the joiner or be sent by them), who asks to join,
|
|
185
|
+
* and who the admins are.
|
|
186
|
+
*/
|
|
187
|
+
export const gather = async (client, chatId, since) => {
|
|
188
|
+
const notes = [];
|
|
189
|
+
const { messages, more } = await client.chats.since(chatId, since);
|
|
190
|
+
const joinedIds = new Set(messages.flatMap((message) => message.attachments.flatMap((attachment) => {
|
|
191
|
+
if (attachment.event === "add")
|
|
192
|
+
return attachment.userIds ?? [];
|
|
193
|
+
if (attachment.event === "joinByLink") {
|
|
194
|
+
return attachment.userIds?.length ? attachment.userIds : message.senderId ? [message.senderId] : [];
|
|
195
|
+
}
|
|
196
|
+
return [];
|
|
197
|
+
})));
|
|
198
|
+
const joined = joinedIds.size === 0
|
|
199
|
+
? []
|
|
200
|
+
: (await client.chats.members.list(chatId)).members.filter((member) => joinedIds.has(member.id));
|
|
201
|
+
const admins = await client.chats.adminIds(chatId);
|
|
202
|
+
if (admins === undefined)
|
|
203
|
+
notes.push("the group's admins are not known, so only your own messages are exempt");
|
|
204
|
+
return {
|
|
205
|
+
messages,
|
|
206
|
+
joined,
|
|
207
|
+
answerers: new Set(admins ?? []),
|
|
208
|
+
until: messages.at(-1)?.timestamp ?? null,
|
|
209
|
+
more,
|
|
210
|
+
notes,
|
|
211
|
+
};
|
|
212
|
+
};
|
|
213
|
+
export const MAX_ACTIONS = 10;
|
|
214
|
+
export const sessionPoints = moderationPoints;
|
|
215
|
+
/** A group never checked before is looked at this far back. */
|
|
216
|
+
const FIRST_LOOK_MS = 24 * 3_600_000;
|
|
217
|
+
/** Reads and judges; changes nothing. `since` overrides the group's saved point. */
|
|
218
|
+
export const prepare = async (client, { points, profile, chat, since }) => {
|
|
219
|
+
const group = await client.chats.show(chat);
|
|
220
|
+
const saved = new ModerationRules(moderationPathFor(profile)).read(group.id);
|
|
221
|
+
const rules = saved ?? defaultRules(group.title);
|
|
222
|
+
const point = points.read(group.id);
|
|
223
|
+
const from = since ?? (point === undefined ? Date.now() - FIRST_LOOK_MS : Date.parse(point));
|
|
224
|
+
const found = await gather(client, group.id, from);
|
|
225
|
+
return {
|
|
226
|
+
chatId: group.id,
|
|
227
|
+
title: group.title,
|
|
228
|
+
rules,
|
|
229
|
+
found,
|
|
230
|
+
findings: judge({ ...found, rules, now: Date.now() }),
|
|
231
|
+
explicit: since !== undefined,
|
|
232
|
+
notes: [
|
|
233
|
+
...(saved ? [] : [`${group.title ?? group.id} has no rules yet — the defaults only report`]),
|
|
234
|
+
...found.notes,
|
|
235
|
+
],
|
|
236
|
+
};
|
|
237
|
+
};
|
|
238
|
+
/** Acts on what `prepare` found, moves the group's saved point, and says what is left. */
|
|
239
|
+
export const finish = async (moderator, points, prepared, options) => {
|
|
240
|
+
const { chatId, rules, found, findings, explicit } = prepared;
|
|
241
|
+
const rows = await act(moderator, findings, { ...options, chatId, rules });
|
|
242
|
+
const notes = [...prepared.notes];
|
|
243
|
+
const next = nextPoint(rows, found);
|
|
244
|
+
if (!explicit && !options.dryRun && next !== null) {
|
|
245
|
+
points.write(chatId, next);
|
|
246
|
+
}
|
|
247
|
+
if (next !== found.until && rows.some(undone)) {
|
|
248
|
+
notes.push("some actions are not done — the next check starts at the first of them");
|
|
249
|
+
}
|
|
250
|
+
else if (found.more) {
|
|
251
|
+
notes.push("more history than one check reads — the next check goes on from here");
|
|
252
|
+
}
|
|
253
|
+
return { rows, notes };
|
|
254
|
+
};
|
|
255
|
+
const undone = (row) => ["planned", "skipped", "failed"].includes(row.outcome);
|
|
256
|
+
/**
|
|
257
|
+
* Where the next check starts: after the newest message read, or just before the first message whose
|
|
258
|
+
* action is still undone — so it is judged again, and what came after it is still read. A person
|
|
259
|
+
* who joined and is still undone keeps the point where it was, since the join is not a row's message.
|
|
260
|
+
*/
|
|
261
|
+
const nextPoint = (rows, found) => {
|
|
262
|
+
const waiting = rows.filter(undone);
|
|
263
|
+
if (waiting.some((row) => row.messageId === undefined))
|
|
264
|
+
return null;
|
|
265
|
+
const times = waiting
|
|
266
|
+
.map((row) => found.messages.find((message) => message.id === row.messageId)?.timestamp)
|
|
267
|
+
.filter((time) => time !== undefined)
|
|
268
|
+
.map(Date.parse);
|
|
269
|
+
if (times.length === 0)
|
|
270
|
+
return found.until;
|
|
271
|
+
return new Date(Math.min(...times) - 1).toISOString();
|
|
272
|
+
};
|
|
273
|
+
//# sourceMappingURL=check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/moderation/check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ModerationRules } from "@wirecat/cli-messaging";
|
|
2
|
+
import type { SessionStore } from "../session/store.js";
|
|
3
|
+
export declare const migrateModerationPoints: (store: SessionStore, env?: NodeJS.ProcessEnv) => ModerationRules;
|
|
4
|
+
export declare const moderationPoints: (store: SessionStore, env?: NodeJS.ProcessEnv) => {
|
|
5
|
+
read: (chatId: string) => string | undefined;
|
|
6
|
+
write: (chatId: string, at: string) => void;
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=points.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"points.d.ts","sourceRoot":"","sources":["../../src/moderation/points.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAqB,MAAM,wBAAwB,CAAA;AAE3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAEvD,eAAO,MAAM,uBAAuB,UAAW,YAAY,QAAO,MAAM,CAAC,UAAU,KAAiB,eAenG,CAAA;AAGD,eAAO,MAAM,gBAAgB,UAAW,YAAY,QAAO,MAAM,CAAC,UAAU;IAC1E,IAAI,WAAW,MAAM,KAAG,MAAM,GAAG,SAAS;IAC1C,KAAK,WAAW,MAAM,MAAM,MAAM,KAAG,IAAI;CACzC,CAAA"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { CliError } from "@wirecat/cli-core";
|
|
2
|
+
import { ModerationRules, moderationPathFor } from "@wirecat/cli-messaging";
|
|
3
|
+
import { MAX_APP } from "../app.js";
|
|
4
|
+
export const migrateModerationPoints = (store, env = process.env) => {
|
|
5
|
+
const rules = new ModerationRules(moderationPathFor(MAX_APP, store.profile, env));
|
|
6
|
+
const missing = Object.entries(store.readState().checkedUntil ?? {}).filter(([id]) => rules.checkedUntil(id) === undefined);
|
|
7
|
+
for (const [id, at] of missing) {
|
|
8
|
+
if (!Number.isFinite(Date.parse(at))) {
|
|
9
|
+
throw new CliError("configuration_error", `the saved moderation time for chat ${id} is invalid — fix checkedUntil in the session state`);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
for (const [id, at] of missing)
|
|
13
|
+
rules.markChecked(id, at);
|
|
14
|
+
return rules;
|
|
15
|
+
};
|
|
16
|
+
// Legacy MCP and shared CLI must advance the same point while the MCP surface waits for P7.
|
|
17
|
+
export const moderationPoints = (store, env = process.env) => ({
|
|
18
|
+
read: (chatId) => migrateModerationPoints(store, env).checkedUntil(chatId),
|
|
19
|
+
write: (chatId, at) => migrateModerationPoints(store, env).markChecked(chatId, at),
|
|
20
|
+
});
|
|
21
|
+
//# sourceMappingURL=points.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"points.js","sourceRoot":"","sources":["../../src/moderation/points.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC3E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGnC,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,KAAmB,EAAE,GAAG,GAAsB,OAAO,CAAC,GAAG,EAAmB,EAAE;IACpH,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAA;IACjF,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,MAAM,CACzE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,KAAK,SAAS,CAC/C,CAAA;IACD,KAAK,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,OAAO,EAAE,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YACrC,MAAM,IAAI,QAAQ,CAChB,qBAAqB,EACrB,sCAAsC,EAAE,qDAAqD,CAC9F,CAAA;QACH,CAAC;IACH,CAAC;IACD,KAAK,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,OAAO;QAAE,KAAK,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;IACzD,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAED,4FAA4F;AAC5F,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAmB,EAAE,GAAG,GAAsB,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC9F,IAAI,EAAE,CAAC,MAAc,EAAsB,EAAE,CAAC,uBAAuB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC;IACtG,KAAK,EAAE,CAAC,MAAc,EAAE,EAAU,EAAQ,EAAE,CAAC,uBAAuB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;CACzG,CAAC,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { defaultRules, type GroupRules, ModerationRules } from "@wirecat/cli-messaging";
|
|
2
|
+
export { defaultRules, type GroupRules, ModerationRules };
|
|
3
|
+
export declare const RULE_ACTIONS: readonly ["report", "delete", "remove"];
|
|
4
|
+
export declare const RULE_KEYS: string[];
|
|
5
|
+
export declare const CONSENT_LEVELS: readonly ["deny", "readonly", "ask", "allow"];
|
|
6
|
+
export declare const moderationPathFor: (profile: string, env?: NodeJS.ProcessEnv) => string;
|
|
7
|
+
//# sourceMappingURL=rules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../src/moderation/rules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,KAAK,UAAU,EAAE,eAAe,EAAmC,MAAM,wBAAwB,CAAA;AAIxH,OAAO,EAAE,YAAY,EAAE,KAAK,UAAU,EAAE,eAAe,EAAE,CAAA;AACzD,eAAO,MAAM,YAAY,YAAI,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAU,CAAA;AACnE,eAAO,MAAM,SAAS,UAerB,CAAA;AACD,eAAO,MAAM,cAAc,+CAAS,CAAA;AACpC,eAAO,MAAM,iBAAiB,YAAa,MAAM,QAAO,MAAM,CAAC,UAAU,KAAiB,MACvD,CAAA"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { defaultRules, ModerationRules, moderationPathFor as sharedPath } from "@wirecat/cli-messaging";
|
|
2
|
+
import { LEVELS } from "@wirecat/cli-messaging/sends";
|
|
3
|
+
import { MAX_APP } from "../app.js";
|
|
4
|
+
export { defaultRules, ModerationRules };
|
|
5
|
+
export const RULE_ACTIONS = ["report", "delete", "remove"];
|
|
6
|
+
export const RULE_KEYS = [
|
|
7
|
+
"trusted",
|
|
8
|
+
"blocked",
|
|
9
|
+
"blockedNames",
|
|
10
|
+
"links",
|
|
11
|
+
"invites",
|
|
12
|
+
"forwards",
|
|
13
|
+
"blockedPeople",
|
|
14
|
+
"flood.messages",
|
|
15
|
+
"flood.minutes",
|
|
16
|
+
"flood.action",
|
|
17
|
+
"newAccount.days",
|
|
18
|
+
"newAccount.action",
|
|
19
|
+
"consent.delete",
|
|
20
|
+
"consent.remove",
|
|
21
|
+
];
|
|
22
|
+
export const CONSENT_LEVELS = LEVELS;
|
|
23
|
+
export const moderationPathFor = (profile, env = process.env) => sharedPath(MAX_APP, profile, env);
|
|
24
|
+
//# sourceMappingURL=rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/moderation/rules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAmB,eAAe,EAAE,iBAAiB,IAAI,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACxH,OAAO,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAA;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,OAAO,EAAE,YAAY,EAAmB,eAAe,EAAE,CAAA;AACzD,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAU,CAAA;AACnE,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,SAAS;IACT,SAAS;IACT,cAAc;IACd,OAAO;IACP,SAAS;IACT,UAAU;IACV,eAAe;IACf,gBAAgB;IAChB,eAAe;IACf,cAAc;IACd,iBAAiB;IACjB,mBAAmB;IACnB,gBAAgB;IAChB,gBAAgB;CACjB,CAAA;AACD,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAA;AACpC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,OAAe,EAAE,GAAG,GAAsB,OAAO,CAAC,GAAG,EAAU,EAAE,CACjG,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,CAAA"}
|
package/dist/online.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { MaxClient } from "./client.js";
|
|
2
|
+
export interface Check {
|
|
3
|
+
name: string;
|
|
4
|
+
ok: boolean;
|
|
5
|
+
detail: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* `max doctor --online`: **one login and two reads**, then the MCP server started the way a client
|
|
9
|
+
* starts it. Nothing is sent and nothing is marked read. A failed step is an answer, never a retry —
|
|
10
|
+
* each login counts toward MAX's too-many-logins pause (`MAX-38`).
|
|
11
|
+
*/
|
|
12
|
+
export declare const checkOnline: (client: MaxClient, handshake: () => Promise<number>) => Promise<Check[]>;
|
|
13
|
+
/**
|
|
14
|
+
* Starts `max mcp` as `node <script>` — never `max`, which on Windows is a `.cmd` file Node does not
|
|
15
|
+
* start without a shell — asks for its tools and closes stdin, which is how a client lets it exit.
|
|
16
|
+
* Listing tools does not log in.
|
|
17
|
+
*/
|
|
18
|
+
export declare const mcpHandshake: ({ execPath, scriptPath, env, }: {
|
|
19
|
+
execPath: string;
|
|
20
|
+
scriptPath: string;
|
|
21
|
+
env: NodeJS.ProcessEnv;
|
|
22
|
+
}) => Promise<number>;
|
|
23
|
+
//# sourceMappingURL=online.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"online.d.ts","sourceRoot":"","sources":["../src/online.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAG5C,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,OAAO,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;CACf;AAID;;;;GAIG;AACH,eAAO,MAAM,WAAW,WAAkB,SAAS,aAAa,MAAM,OAAO,CAAC,MAAM,CAAC,KAAG,OAAO,CAAC,KAAK,EAAE,CAoBtG,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,YAAY,mCAItB;IACD,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,GAAG,EAAE,MAAM,CAAC,UAAU,CAAA;CACvB,KAAG,OAAO,CAAC,MAAM,CA6CjB,CAAA"}
|
package/dist/online.js
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { createInterface } from "node:readline";
|
|
3
|
+
import { VERSION } from "./version.js";
|
|
4
|
+
const HANDSHAKE_MS = 20_000;
|
|
5
|
+
/**
|
|
6
|
+
* `max doctor --online`: **one login and two reads**, then the MCP server started the way a client
|
|
7
|
+
* starts it. Nothing is sent and nothing is marked read. A failed step is an answer, never a retry —
|
|
8
|
+
* each login counts toward MAX's too-many-logins pause (`MAX-38`).
|
|
9
|
+
*/
|
|
10
|
+
export const checkOnline = async (client, handshake) => {
|
|
11
|
+
const checks = [];
|
|
12
|
+
const step = async (name, body) => {
|
|
13
|
+
try {
|
|
14
|
+
checks.push({ name, ok: true, detail: await body() });
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
checks.push({ name, ok: false, detail: error instanceof Error ? error.message : String(error) });
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
const loggedIn = await step("login", async () => {
|
|
23
|
+
await client.account.me();
|
|
24
|
+
return "logged in";
|
|
25
|
+
});
|
|
26
|
+
if (loggedIn)
|
|
27
|
+
await step("chats", async () => `${(await client.chats.list({ limit: 1 })).items.length} read`);
|
|
28
|
+
await client.close();
|
|
29
|
+
await step("mcp", async () => `${await handshake()} tools offered`);
|
|
30
|
+
return checks;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Starts `max mcp` as `node <script>` — never `max`, which on Windows is a `.cmd` file Node does not
|
|
34
|
+
* start without a shell — asks for its tools and closes stdin, which is how a client lets it exit.
|
|
35
|
+
* Listing tools does not log in.
|
|
36
|
+
*/
|
|
37
|
+
export const mcpHandshake = async ({ execPath, scriptPath, env, }) => {
|
|
38
|
+
const { LATEST_PROTOCOL_VERSION } = await import("@modelcontextprotocol/server");
|
|
39
|
+
const child = spawn(execPath, [scriptPath, "mcp"], { env, stdio: ["pipe", "pipe", "ignore"] });
|
|
40
|
+
const send = (message) => child.stdin.write(`${JSON.stringify({ jsonrpc: "2.0", ...message })}\n`);
|
|
41
|
+
const lines = createInterface({ input: child.stdout });
|
|
42
|
+
try {
|
|
43
|
+
return await new Promise((resolve, reject) => {
|
|
44
|
+
const timer = setTimeout(() => reject(new Error(`no answer in ${HANDSHAKE_MS / 1000} s`)), HANDSHAKE_MS);
|
|
45
|
+
child.once("error", reject);
|
|
46
|
+
child.once("exit", (code) => reject(new Error(`the server exited with code ${code}`)));
|
|
47
|
+
lines.on("line", (line) => {
|
|
48
|
+
let message;
|
|
49
|
+
try {
|
|
50
|
+
message = JSON.parse(line);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if (message.error)
|
|
56
|
+
reject(new Error(message.error.message ?? "the server answered with an error"));
|
|
57
|
+
else if (message.id === 1) {
|
|
58
|
+
send({ method: "notifications/initialized" });
|
|
59
|
+
send({ id: 2, method: "tools/list" });
|
|
60
|
+
}
|
|
61
|
+
else if (message.id === 2)
|
|
62
|
+
resolve(message.result?.tools?.length ?? 0);
|
|
63
|
+
});
|
|
64
|
+
send({
|
|
65
|
+
id: 1,
|
|
66
|
+
method: "initialize",
|
|
67
|
+
params: {
|
|
68
|
+
protocolVersion: LATEST_PROTOCOL_VERSION,
|
|
69
|
+
capabilities: {},
|
|
70
|
+
clientInfo: { name: "max-doctor", version: VERSION },
|
|
71
|
+
},
|
|
72
|
+
});
|
|
73
|
+
child.once("exit", () => clearTimeout(timer));
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
finally {
|
|
77
|
+
lines.close();
|
|
78
|
+
child.stdin.end();
|
|
79
|
+
if (child.pid !== undefined && child.exitCode === null) {
|
|
80
|
+
const exited = new Promise((resolve) => child.once("exit", resolve));
|
|
81
|
+
const killer = setTimeout(() => child.kill(), 3000);
|
|
82
|
+
await exited;
|
|
83
|
+
clearTimeout(killer);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
//# sourceMappingURL=online.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"online.js","sourceRoot":"","sources":["../src/online.ts"],"names":[],"mappings":"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"}
|
package/dist/output.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA"}
|
package/dist/output.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,aAAa,EAAE,MAAM,wBAAwB,CAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type Asker } from "@wirecat/cli-messaging/sends";
|
|
2
|
+
import type { Command } from "commander";
|
|
3
|
+
import type { Environment } from "./commands/context.js";
|
|
4
|
+
import type { Settings } from "./config.js";
|
|
5
|
+
export declare const permissionScope: <T>(work: () => T) => T;
|
|
6
|
+
export declare const withPermissionApproval: <T>(key: string, work: () => T) => T;
|
|
7
|
+
export declare const currentReadPermission: () => string | undefined;
|
|
8
|
+
export declare const approvePermission: (key: string) => void;
|
|
9
|
+
export declare const permissionApprovals: () => string[];
|
|
10
|
+
export declare const assertReadable: (settings: Pick<Settings, "profile" | "permissions" | "permissionSources">, key: string) => void;
|
|
11
|
+
export declare const commandPermission: (command: Command) => string | null;
|
|
12
|
+
/** `commandPermission` for checking a file's keys: a command it cannot map names no key, rather than throwing. */
|
|
13
|
+
export declare const permissionKeyOf: (command: Command) => string | null | undefined;
|
|
14
|
+
export declare const askerFor: (flags: {
|
|
15
|
+
yes?: boolean;
|
|
16
|
+
allowDangerous?: boolean;
|
|
17
|
+
json?: boolean;
|
|
18
|
+
jsonl?: boolean;
|
|
19
|
+
}, environment?: Environment) => Asker;
|
|
20
|
+
//# sourceMappingURL=permissions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../src/permissions.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,KAAK,EAMX,MAAM,8BAA8B,CAAA;AACrC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAExC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAK3C,eAAO,MAAM,eAAe,GAAI,CAAC,QAAQ,MAAM,CAAC,KAAG,CAC8C,CAAA;AAEjG,eAAO,MAAM,sBAAsB,GAAI,CAAC,OAAO,MAAM,QAAQ,MAAM,CAAC,KAAG,CAMtE,CAAA;AAED,eAAO,MAAM,qBAAqB,QAAO,MAAM,GAAG,SAA0C,CAAA;AAE5F,eAAO,MAAM,iBAAiB,QAAS,MAAM,KAAG,IAE/C,CAAA;AAED,eAAO,MAAM,mBAAmB,QAAO,MAAM,EAAiD,CAAA;AAE9F,eAAO,MAAM,cAAc,aACf,IAAI,CAAC,QAAQ,EAAE,SAAS,GAAG,aAAa,GAAG,mBAAmB,CAAC,OACpE,MAAM,KACV,IAcF,CAAA;AAED,eAAO,MAAM,iBAAiB,YAAa,OAAO,KAAG,MAAM,GAAG,IAiB7D,CAAA;AAED,kHAAkH;AAClH,eAAO,MAAM,eAAe,YAAa,OAAO,KAAG,MAAM,GAAG,IAAI,GAAG,SAMlE,CAAA;AAED,eAAO,MAAM,QAAQ,UAEV;IAAE,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,gBACtE,WAAW,KACvB,KAoBF,CAAA"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
|
+
import { CliError } from "@wirecat/cli-core";
|
|
3
|
+
import { metaOf } from "@wirecat/cli-core/commands";
|
|
4
|
+
import { assertStatsPermissionsCurrent, keyForCommand, levelFor, readKeysForCommand, skipFlagFor, } from "@wirecat/cli-messaging/sends";
|
|
5
|
+
import { BOT_KEYS } from "./bot/permissions.js";
|
|
6
|
+
import { readSecret } from "./session/prompt.js";
|
|
7
|
+
const approvals = new AsyncLocalStorage();
|
|
8
|
+
export const permissionScope = (work) => approvals.getStore() ? work() : approvals.run({ forced: new Set(), approved: new Set() }, work);
|
|
9
|
+
export const withPermissionApproval = (key, work) => {
|
|
10
|
+
const previous = approvals.getStore();
|
|
11
|
+
return approvals.run({ forced: new Set([...(previous?.forced ?? []), key]), approved: new Set([key]), readKey: key }, work);
|
|
12
|
+
};
|
|
13
|
+
export const currentReadPermission = () => approvals.getStore()?.readKey;
|
|
14
|
+
export const approvePermission = (key) => {
|
|
15
|
+
approvals.getStore()?.approved.add(key);
|
|
16
|
+
};
|
|
17
|
+
export const permissionApprovals = () => [...(approvals.getStore()?.approved ?? [])];
|
|
18
|
+
export const assertReadable = (settings, key) => {
|
|
19
|
+
assertStatsPermissionsCurrent(key.split("."), settings.permissions);
|
|
20
|
+
for (const source of readKeysForCommand(key.split("."))) {
|
|
21
|
+
const resolved = levelFor(settings.permissions, source);
|
|
22
|
+
if (resolved.level === "deny")
|
|
23
|
+
throw new CliError("permission_error", `profile ${settings.profile} denies ${source}`, { permission: source });
|
|
24
|
+
}
|
|
25
|
+
const resolved = levelFor(settings.permissions, key);
|
|
26
|
+
if (resolved.level === "deny")
|
|
27
|
+
throw new CliError("permission_error", `profile ${settings.profile} denies ${key} (permissions.${resolved.key}, from ${settings.permissionSources[resolved.key ?? ""] ?? "default"})`, { permission: key });
|
|
28
|
+
};
|
|
29
|
+
export const commandPermission = (command) => {
|
|
30
|
+
const words = [];
|
|
31
|
+
for (let at = command; at?.parent; at = at.parent)
|
|
32
|
+
words.unshift(at.name());
|
|
33
|
+
const operation = metaOf(command).operationId;
|
|
34
|
+
if (words[0] === "bot" && words[1] === "api" && operation)
|
|
35
|
+
return BOT_KEYS[operation] ?? `bot.api.${words.slice(2).join(".")}`;
|
|
36
|
+
if (words[0] === "bot" && words[1] === "comments")
|
|
37
|
+
return `bot.messages.${words.slice(2).join(".")}`;
|
|
38
|
+
const shared = keyForCommand(words);
|
|
39
|
+
if (shared !== undefined)
|
|
40
|
+
return shared;
|
|
41
|
+
if (["setup"].includes(words[0] ?? ""))
|
|
42
|
+
return null;
|
|
43
|
+
if (["messages", "chats", "contacts", "account", "calls", "stickers", "polls", "reactions", "bot"].includes(words[0] ?? ""))
|
|
44
|
+
return words.join(".");
|
|
45
|
+
throw new Error(`unmapped permission path: ${words.join(" ")}`);
|
|
46
|
+
};
|
|
47
|
+
/** `commandPermission` for checking a file's keys: a command it cannot map names no key, rather than throwing. */
|
|
48
|
+
export const permissionKeyOf = (command) => {
|
|
49
|
+
try {
|
|
50
|
+
return commandPermission(command);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
export const askerFor = (flags, environment = {}) => async (key, request) => {
|
|
57
|
+
const flag = skipFlagFor(key);
|
|
58
|
+
if (!approvals.getStore()?.forced.has(key) && !(flag === "--yes" ? flags.yes : flags.allowDangerous)) {
|
|
59
|
+
const question = `${key}${request.chatId === null ? "" : ` in chat ${request.chatId}`}${request.count === undefined ? "" : ` (${request.count} items)`}${request.forEveryone ? " for everyone" : ""} — go ahead? [y/N] `;
|
|
60
|
+
const answer = flags.json || flags.jsonl
|
|
61
|
+
? null
|
|
62
|
+
: environment.answer
|
|
63
|
+
? await environment.answer(question)
|
|
64
|
+
: (environment.interactive ?? (process.stdin.isTTY && process.stderr.isTTY))
|
|
65
|
+
? await (environment.ask
|
|
66
|
+
? environment.ask(question, { secret: false })
|
|
67
|
+
: readSecret(question, { echo: true }))
|
|
68
|
+
: null;
|
|
69
|
+
if (answer === null)
|
|
70
|
+
throw new CliError("confirmation_required", `${key} asks before it acts — add ${flag} to go ahead`);
|
|
71
|
+
if (!/^\s*y(es)?\s*$/i.test(answer))
|
|
72
|
+
throw new CliError("cancelled", `${key}: not done — the answer was no`);
|
|
73
|
+
}
|
|
74
|
+
approvals.getStore()?.approved.add(key);
|
|
75
|
+
};
|
|
76
|
+
//# sourceMappingURL=permissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../src/permissions.ts"],"names":[],"mappings":"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"}
|