agim-cli 1.0.1
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/CHANGELOG.md +1234 -0
- package/LICENSE +21 -0
- package/README.md +422 -0
- package/README.zh-CN.md +414 -0
- package/dist/cli-ui/cmd-handlers.d.ts +11 -0
- package/dist/cli-ui/cmd-handlers.d.ts.map +1 -0
- package/dist/cli-ui/cmd-handlers.js +240 -0
- package/dist/cli-ui/cmd-handlers.js.map +1 -0
- package/dist/cli-ui/config-wizard.d.ts +3 -0
- package/dist/cli-ui/config-wizard.d.ts.map +1 -0
- package/dist/cli-ui/config-wizard.js +851 -0
- package/dist/cli-ui/config-wizard.js.map +1 -0
- package/dist/cli-ui/entry-menu.d.ts +28 -0
- package/dist/cli-ui/entry-menu.d.ts.map +1 -0
- package/dist/cli-ui/entry-menu.js +50 -0
- package/dist/cli-ui/entry-menu.js.map +1 -0
- package/dist/cli-ui/env-file.d.ts +35 -0
- package/dist/cli-ui/env-file.d.ts.map +1 -0
- package/dist/cli-ui/env-file.js +163 -0
- package/dist/cli-ui/env-file.js.map +1 -0
- package/dist/cli-ui/i18n.d.ts +204 -0
- package/dist/cli-ui/i18n.d.ts.map +1 -0
- package/dist/cli-ui/i18n.js +455 -0
- package/dist/cli-ui/i18n.js.map +1 -0
- package/dist/cli-ui/lang-picker.d.ts +10 -0
- package/dist/cli-ui/lang-picker.d.ts.map +1 -0
- package/dist/cli-ui/lang-picker.js +33 -0
- package/dist/cli-ui/lang-picker.js.map +1 -0
- package/dist/cli-ui/paths.d.ts +4 -0
- package/dist/cli-ui/paths.d.ts.map +1 -0
- package/dist/cli-ui/paths.js +11 -0
- package/dist/cli-ui/paths.js.map +1 -0
- package/dist/cli-ui/prompts.d.ts +65 -0
- package/dist/cli-ui/prompts.d.ts.map +1 -0
- package/dist/cli-ui/prompts.js +125 -0
- package/dist/cli-ui/prompts.js.map +1 -0
- package/dist/cli-ui/service.d.ts +41 -0
- package/dist/cli-ui/service.d.ts.map +1 -0
- package/dist/cli-ui/service.js +241 -0
- package/dist/cli-ui/service.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +1143 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/acp-server.d.ts +8 -0
- package/dist/core/acp-server.d.ts.map +1 -0
- package/dist/core/acp-server.js +266 -0
- package/dist/core/acp-server.js.map +1 -0
- package/dist/core/agent-base.d.ts +94 -0
- package/dist/core/agent-base.d.ts.map +1 -0
- package/dist/core/agent-base.js +373 -0
- package/dist/core/agent-base.js.map +1 -0
- package/dist/core/agent-cwd.d.ts +48 -0
- package/dist/core/agent-cwd.d.ts.map +1 -0
- package/dist/core/agent-cwd.js +181 -0
- package/dist/core/agent-cwd.js.map +1 -0
- package/dist/core/agent-helper.d.ts +65 -0
- package/dist/core/agent-helper.d.ts.map +1 -0
- package/dist/core/agent-helper.js +150 -0
- package/dist/core/agent-helper.js.map +1 -0
- package/dist/core/agim-paths.d.ts +10 -0
- package/dist/core/agim-paths.d.ts.map +1 -0
- package/dist/core/agim-paths.js +64 -0
- package/dist/core/agim-paths.js.map +1 -0
- package/dist/core/approval-bus.d.ts +300 -0
- package/dist/core/approval-bus.d.ts.map +1 -0
- package/dist/core/approval-bus.js +990 -0
- package/dist/core/approval-bus.js.map +1 -0
- package/dist/core/approval-router.d.ts +101 -0
- package/dist/core/approval-router.d.ts.map +1 -0
- package/dist/core/approval-router.js +540 -0
- package/dist/core/approval-router.js.map +1 -0
- package/dist/core/audit-log.d.ts +55 -0
- package/dist/core/audit-log.d.ts.map +1 -0
- package/dist/core/audit-log.js +203 -0
- package/dist/core/audit-log.js.map +1 -0
- package/dist/core/bgjob-reader.d.ts +65 -0
- package/dist/core/bgjob-reader.d.ts.map +1 -0
- package/dist/core/bgjob-reader.js +212 -0
- package/dist/core/bgjob-reader.js.map +1 -0
- package/dist/core/circuit-breaker.d.ts +37 -0
- package/dist/core/circuit-breaker.d.ts.map +1 -0
- package/dist/core/circuit-breaker.js +115 -0
- package/dist/core/circuit-breaker.js.map +1 -0
- package/dist/core/commands/agent.d.ts +4 -0
- package/dist/core/commands/agent.d.ts.map +1 -0
- package/dist/core/commands/agent.js +40 -0
- package/dist/core/commands/agent.js.map +1 -0
- package/dist/core/commands/approval.d.ts +3 -0
- package/dist/core/commands/approval.d.ts.map +1 -0
- package/dist/core/commands/approval.js +85 -0
- package/dist/core/commands/approval.js.map +1 -0
- package/dist/core/commands/audit.d.ts +3 -0
- package/dist/core/commands/audit.d.ts.map +1 -0
- package/dist/core/commands/audit.js +84 -0
- package/dist/core/commands/audit.js.map +1 -0
- package/dist/core/commands/builtin.d.ts +3 -0
- package/dist/core/commands/builtin.d.ts.map +1 -0
- package/dist/core/commands/builtin.js +304 -0
- package/dist/core/commands/builtin.js.map +1 -0
- package/dist/core/commands/cron.d.ts +3 -0
- package/dist/core/commands/cron.d.ts.map +1 -0
- package/dist/core/commands/cron.js +128 -0
- package/dist/core/commands/cron.js.map +1 -0
- package/dist/core/commands/job.d.ts +3 -0
- package/dist/core/commands/job.d.ts.map +1 -0
- package/dist/core/commands/job.js +195 -0
- package/dist/core/commands/job.js.map +1 -0
- package/dist/core/commands/memo.d.ts +3 -0
- package/dist/core/commands/memo.d.ts.map +1 -0
- package/dist/core/commands/memo.js +151 -0
- package/dist/core/commands/memo.js.map +1 -0
- package/dist/core/commands/model.d.ts +9 -0
- package/dist/core/commands/model.d.ts.map +1 -0
- package/dist/core/commands/model.js +183 -0
- package/dist/core/commands/model.js.map +1 -0
- package/dist/core/commands/plan.d.ts +3 -0
- package/dist/core/commands/plan.d.ts.map +1 -0
- package/dist/core/commands/plan.js +75 -0
- package/dist/core/commands/plan.js.map +1 -0
- package/dist/core/commands/remind.d.ts +3 -0
- package/dist/core/commands/remind.d.ts.map +1 -0
- package/dist/core/commands/remind.js +271 -0
- package/dist/core/commands/remind.js.map +1 -0
- package/dist/core/commands/router.d.ts +3 -0
- package/dist/core/commands/router.d.ts.map +1 -0
- package/dist/core/commands/router.js +71 -0
- package/dist/core/commands/router.js.map +1 -0
- package/dist/core/commands/sessions.d.ts +3 -0
- package/dist/core/commands/sessions.d.ts.map +1 -0
- package/dist/core/commands/sessions.js +88 -0
- package/dist/core/commands/sessions.js.map +1 -0
- package/dist/core/commands/stats.d.ts +3 -0
- package/dist/core/commands/stats.d.ts.map +1 -0
- package/dist/core/commands/stats.js +73 -0
- package/dist/core/commands/stats.js.map +1 -0
- package/dist/core/commands/think.d.ts +3 -0
- package/dist/core/commands/think.d.ts.map +1 -0
- package/dist/core/commands/think.js +28 -0
- package/dist/core/commands/think.js.map +1 -0
- package/dist/core/commands/workspaces.d.ts +3 -0
- package/dist/core/commands/workspaces.d.ts.map +1 -0
- package/dist/core/commands/workspaces.js +47 -0
- package/dist/core/commands/workspaces.js.map +1 -0
- package/dist/core/config-schema.d.ts +60 -0
- package/dist/core/config-schema.d.ts.map +1 -0
- package/dist/core/config-schema.js +75 -0
- package/dist/core/config-schema.js.map +1 -0
- package/dist/core/coord-systems.d.ts +65 -0
- package/dist/core/coord-systems.d.ts.map +1 -0
- package/dist/core/coord-systems.js +229 -0
- package/dist/core/coord-systems.js.map +1 -0
- package/dist/core/cron.d.ts +29 -0
- package/dist/core/cron.d.ts.map +1 -0
- package/dist/core/cron.js +184 -0
- package/dist/core/cron.js.map +1 -0
- package/dist/core/event-bus.d.ts +80 -0
- package/dist/core/event-bus.d.ts.map +1 -0
- package/dist/core/event-bus.js +62 -0
- package/dist/core/event-bus.js.map +1 -0
- package/dist/core/intent-llm.d.ts +27 -0
- package/dist/core/intent-llm.d.ts.map +1 -0
- package/dist/core/intent-llm.js +170 -0
- package/dist/core/intent-llm.js.map +1 -0
- package/dist/core/intent.d.ts +12 -0
- package/dist/core/intent.d.ts.map +1 -0
- package/dist/core/intent.js +187 -0
- package/dist/core/intent.js.map +1 -0
- package/dist/core/job-board.d.ts +82 -0
- package/dist/core/job-board.d.ts.map +1 -0
- package/dist/core/job-board.js +379 -0
- package/dist/core/job-board.js.map +1 -0
- package/dist/core/location-context.d.ts +32 -0
- package/dist/core/location-context.d.ts.map +1 -0
- package/dist/core/location-context.js +69 -0
- package/dist/core/location-context.js.map +1 -0
- package/dist/core/location-token.d.ts +57 -0
- package/dist/core/location-token.d.ts.map +1 -0
- package/dist/core/location-token.js +128 -0
- package/dist/core/location-token.js.map +1 -0
- package/dist/core/logger.d.ts +6 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +54 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/memo-rpc.d.ts +13 -0
- package/dist/core/memo-rpc.d.ts.map +1 -0
- package/dist/core/memo-rpc.js +288 -0
- package/dist/core/memo-rpc.js.map +1 -0
- package/dist/core/memos.d.ts +163 -0
- package/dist/core/memos.d.ts.map +1 -0
- package/dist/core/memos.js +502 -0
- package/dist/core/memos.js.map +1 -0
- package/dist/core/metrics.d.ts +55 -0
- package/dist/core/metrics.d.ts.map +1 -0
- package/dist/core/metrics.js +291 -0
- package/dist/core/metrics.js.map +1 -0
- package/dist/core/onboarding.d.ts +99 -0
- package/dist/core/onboarding.d.ts.map +1 -0
- package/dist/core/onboarding.js +426 -0
- package/dist/core/onboarding.js.map +1 -0
- package/dist/core/pending-reminder.d.ts +25 -0
- package/dist/core/pending-reminder.d.ts.map +1 -0
- package/dist/core/pending-reminder.js +53 -0
- package/dist/core/pending-reminder.js.map +1 -0
- package/dist/core/rate-limiter.d.ts +44 -0
- package/dist/core/rate-limiter.d.ts.map +1 -0
- package/dist/core/rate-limiter.js +115 -0
- package/dist/core/rate-limiter.js.map +1 -0
- package/dist/core/registry.d.ts +32 -0
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/core/registry.js +126 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/remind-intent.d.ts +25 -0
- package/dist/core/remind-intent.d.ts.map +1 -0
- package/dist/core/remind-intent.js +196 -0
- package/dist/core/remind-intent.js.map +1 -0
- package/dist/core/reminder-rpc.d.ts +17 -0
- package/dist/core/reminder-rpc.d.ts.map +1 -0
- package/dist/core/reminder-rpc.js +169 -0
- package/dist/core/reminder-rpc.js.map +1 -0
- package/dist/core/reminders.d.ts +159 -0
- package/dist/core/reminders.d.ts.map +1 -0
- package/dist/core/reminders.js +977 -0
- package/dist/core/reminders.js.map +1 -0
- package/dist/core/router.d.ts +55 -0
- package/dist/core/router.d.ts.map +1 -0
- package/dist/core/router.js +497 -0
- package/dist/core/router.js.map +1 -0
- package/dist/core/schedule.d.ts +65 -0
- package/dist/core/schedule.d.ts.map +1 -0
- package/dist/core/schedule.js +323 -0
- package/dist/core/schedule.js.map +1 -0
- package/dist/core/session.d.ts +182 -0
- package/dist/core/session.d.ts.map +1 -0
- package/dist/core/session.js +807 -0
- package/dist/core/session.js.map +1 -0
- package/dist/core/sqlite-helper.d.ts +37 -0
- package/dist/core/sqlite-helper.d.ts.map +1 -0
- package/dist/core/sqlite-helper.js +79 -0
- package/dist/core/sqlite-helper.js.map +1 -0
- package/dist/core/transcribe.d.ts +25 -0
- package/dist/core/transcribe.d.ts.map +1 -0
- package/dist/core/transcribe.js +217 -0
- package/dist/core/transcribe.js.map +1 -0
- package/dist/core/types.d.ts +360 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +3 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/workspace.d.ts +67 -0
- package/dist/core/workspace.d.ts.map +1 -0
- package/dist/core/workspace.js +113 -0
- package/dist/core/workspace.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/plugins/agents/acp/acp-adapter.d.ts +16 -0
- package/dist/plugins/agents/acp/acp-adapter.d.ts.map +1 -0
- package/dist/plugins/agents/acp/acp-adapter.js +49 -0
- package/dist/plugins/agents/acp/acp-adapter.js.map +1 -0
- package/dist/plugins/agents/acp/acp-client.d.ts +32 -0
- package/dist/plugins/agents/acp/acp-client.d.ts.map +1 -0
- package/dist/plugins/agents/acp/acp-client.js +177 -0
- package/dist/plugins/agents/acp/acp-client.js.map +1 -0
- package/dist/plugins/agents/acp/discovery.d.ts +19 -0
- package/dist/plugins/agents/acp/discovery.d.ts.map +1 -0
- package/dist/plugins/agents/acp/discovery.js +111 -0
- package/dist/plugins/agents/acp/discovery.js.map +1 -0
- package/dist/plugins/agents/acp/index.d.ts +4 -0
- package/dist/plugins/agents/acp/index.d.ts.map +1 -0
- package/dist/plugins/agents/acp/index.js +4 -0
- package/dist/plugins/agents/acp/index.js.map +1 -0
- package/dist/plugins/agents/acp/types.d.ts +62 -0
- package/dist/plugins/agents/acp/types.d.ts.map +1 -0
- package/dist/plugins/agents/acp/types.js +5 -0
- package/dist/plugins/agents/acp/types.js.map +1 -0
- package/dist/plugins/agents/claude-code/index.d.ts +25 -0
- package/dist/plugins/agents/claude-code/index.d.ts.map +1 -0
- package/dist/plugins/agents/claude-code/index.js +184 -0
- package/dist/plugins/agents/claude-code/index.js.map +1 -0
- package/dist/plugins/agents/claude-code/mcp-approval-server.d.ts +59 -0
- package/dist/plugins/agents/claude-code/mcp-approval-server.d.ts.map +1 -0
- package/dist/plugins/agents/claude-code/mcp-approval-server.js +645 -0
- package/dist/plugins/agents/claude-code/mcp-approval-server.js.map +1 -0
- package/dist/plugins/agents/codex/build-mcp-cli-args.d.ts +28 -0
- package/dist/plugins/agents/codex/build-mcp-cli-args.d.ts.map +1 -0
- package/dist/plugins/agents/codex/build-mcp-cli-args.js +74 -0
- package/dist/plugins/agents/codex/build-mcp-cli-args.js.map +1 -0
- package/dist/plugins/agents/codex/index.d.ts +53 -0
- package/dist/plugins/agents/codex/index.d.ts.map +1 -0
- package/dist/plugins/agents/codex/index.js +341 -0
- package/dist/plugins/agents/codex/index.js.map +1 -0
- package/dist/plugins/agents/copilot/index.d.ts +35 -0
- package/dist/plugins/agents/copilot/index.d.ts.map +1 -0
- package/dist/plugins/agents/copilot/index.js +182 -0
- package/dist/plugins/agents/copilot/index.js.map +1 -0
- package/dist/plugins/agents/opencode/ensure-mcp-config.d.ts +11 -0
- package/dist/plugins/agents/opencode/ensure-mcp-config.d.ts.map +1 -0
- package/dist/plugins/agents/opencode/ensure-mcp-config.js +100 -0
- package/dist/plugins/agents/opencode/ensure-mcp-config.js.map +1 -0
- package/dist/plugins/agents/opencode/index.d.ts +5 -0
- package/dist/plugins/agents/opencode/index.d.ts.map +1 -0
- package/dist/plugins/agents/opencode/index.js +30 -0
- package/dist/plugins/agents/opencode/index.js.map +1 -0
- package/dist/plugins/agents/opencode/opencode-http-adapter.d.ts +166 -0
- package/dist/plugins/agents/opencode/opencode-http-adapter.d.ts.map +1 -0
- package/dist/plugins/agents/opencode/opencode-http-adapter.js +682 -0
- package/dist/plugins/agents/opencode/opencode-http-adapter.js.map +1 -0
- package/dist/plugins/agents/opencode/opencode-stdio-adapter.d.ts +32 -0
- package/dist/plugins/agents/opencode/opencode-stdio-adapter.d.ts.map +1 -0
- package/dist/plugins/agents/opencode/opencode-stdio-adapter.js +137 -0
- package/dist/plugins/agents/opencode/opencode-stdio-adapter.js.map +1 -0
- package/dist/plugins/agents/opencode/serve-manager.d.ts +27 -0
- package/dist/plugins/agents/opencode/serve-manager.d.ts.map +1 -0
- package/dist/plugins/agents/opencode/serve-manager.js +194 -0
- package/dist/plugins/agents/opencode/serve-manager.js.map +1 -0
- package/dist/plugins/messengers/dingtalk/dingtalk-adapter.d.ts +57 -0
- package/dist/plugins/messengers/dingtalk/dingtalk-adapter.d.ts.map +1 -0
- package/dist/plugins/messengers/dingtalk/dingtalk-adapter.js +409 -0
- package/dist/plugins/messengers/dingtalk/dingtalk-adapter.js.map +1 -0
- package/dist/plugins/messengers/dingtalk/dingtalk-client.d.ts +48 -0
- package/dist/plugins/messengers/dingtalk/dingtalk-client.d.ts.map +1 -0
- package/dist/plugins/messengers/dingtalk/dingtalk-client.js +236 -0
- package/dist/plugins/messengers/dingtalk/dingtalk-client.js.map +1 -0
- package/dist/plugins/messengers/dingtalk/index.d.ts +3 -0
- package/dist/plugins/messengers/dingtalk/index.d.ts.map +1 -0
- package/dist/plugins/messengers/dingtalk/index.js +3 -0
- package/dist/plugins/messengers/dingtalk/index.js.map +1 -0
- package/dist/plugins/messengers/dingtalk/link-coords.d.ts +23 -0
- package/dist/plugins/messengers/dingtalk/link-coords.d.ts.map +1 -0
- package/dist/plugins/messengers/dingtalk/link-coords.js +89 -0
- package/dist/plugins/messengers/dingtalk/link-coords.js.map +1 -0
- package/dist/plugins/messengers/dingtalk/media-store.d.ts +16 -0
- package/dist/plugins/messengers/dingtalk/media-store.d.ts.map +1 -0
- package/dist/plugins/messengers/dingtalk/media-store.js +77 -0
- package/dist/plugins/messengers/dingtalk/media-store.js.map +1 -0
- package/dist/plugins/messengers/dingtalk/types.d.ts +82 -0
- package/dist/plugins/messengers/dingtalk/types.d.ts.map +1 -0
- package/dist/plugins/messengers/dingtalk/types.js +14 -0
- package/dist/plugins/messengers/dingtalk/types.js.map +1 -0
- package/dist/plugins/messengers/discord/discord-adapter.d.ts +21 -0
- package/dist/plugins/messengers/discord/discord-adapter.d.ts.map +1 -0
- package/dist/plugins/messengers/discord/discord-adapter.js +238 -0
- package/dist/plugins/messengers/discord/discord-adapter.js.map +1 -0
- package/dist/plugins/messengers/discord/index.d.ts +4 -0
- package/dist/plugins/messengers/discord/index.d.ts.map +1 -0
- package/dist/plugins/messengers/discord/index.js +4 -0
- package/dist/plugins/messengers/discord/index.js.map +1 -0
- package/dist/plugins/messengers/discord/markdown-to-discord.d.ts +11 -0
- package/dist/plugins/messengers/discord/markdown-to-discord.d.ts.map +1 -0
- package/dist/plugins/messengers/discord/markdown-to-discord.js +59 -0
- package/dist/plugins/messengers/discord/markdown-to-discord.js.map +1 -0
- package/dist/plugins/messengers/discord/types.d.ts +9 -0
- package/dist/plugins/messengers/discord/types.d.ts.map +1 -0
- package/dist/plugins/messengers/discord/types.js +3 -0
- package/dist/plugins/messengers/discord/types.js.map +1 -0
- package/dist/plugins/messengers/email/email-adapter.d.ts +33 -0
- package/dist/plugins/messengers/email/email-adapter.d.ts.map +1 -0
- package/dist/plugins/messengers/email/email-adapter.js +137 -0
- package/dist/plugins/messengers/email/email-adapter.js.map +1 -0
- package/dist/plugins/messengers/feishu/card-builder.d.ts +23 -0
- package/dist/plugins/messengers/feishu/card-builder.d.ts.map +1 -0
- package/dist/plugins/messengers/feishu/card-builder.js +89 -0
- package/dist/plugins/messengers/feishu/card-builder.js.map +1 -0
- package/dist/plugins/messengers/feishu/feishu-adapter.d.ts +23 -0
- package/dist/plugins/messengers/feishu/feishu-adapter.d.ts.map +1 -0
- package/dist/plugins/messengers/feishu/feishu-adapter.js +250 -0
- package/dist/plugins/messengers/feishu/feishu-adapter.js.map +1 -0
- package/dist/plugins/messengers/feishu/feishu-client.d.ts +43 -0
- package/dist/plugins/messengers/feishu/feishu-client.d.ts.map +1 -0
- package/dist/plugins/messengers/feishu/feishu-client.js +118 -0
- package/dist/plugins/messengers/feishu/feishu-client.js.map +1 -0
- package/dist/plugins/messengers/feishu/index.d.ts +4 -0
- package/dist/plugins/messengers/feishu/index.d.ts.map +1 -0
- package/dist/plugins/messengers/feishu/index.js +4 -0
- package/dist/plugins/messengers/feishu/index.js.map +1 -0
- package/dist/plugins/messengers/feishu/types.d.ts +113 -0
- package/dist/plugins/messengers/feishu/types.d.ts.map +1 -0
- package/dist/plugins/messengers/feishu/types.js +4 -0
- package/dist/plugins/messengers/feishu/types.js.map +1 -0
- package/dist/plugins/messengers/telegram/index.d.ts +4 -0
- package/dist/plugins/messengers/telegram/index.d.ts.map +1 -0
- package/dist/plugins/messengers/telegram/index.js +4 -0
- package/dist/plugins/messengers/telegram/index.js.map +1 -0
- package/dist/plugins/messengers/telegram/markdown-to-html.d.ts +5 -0
- package/dist/plugins/messengers/telegram/markdown-to-html.d.ts.map +1 -0
- package/dist/plugins/messengers/telegram/markdown-to-html.js +186 -0
- package/dist/plugins/messengers/telegram/markdown-to-html.js.map +1 -0
- package/dist/plugins/messengers/telegram/media-download.d.ts +59 -0
- package/dist/plugins/messengers/telegram/media-download.d.ts.map +1 -0
- package/dist/plugins/messengers/telegram/media-download.js +228 -0
- package/dist/plugins/messengers/telegram/media-download.js.map +1 -0
- package/dist/plugins/messengers/telegram/telegram-adapter.d.ts +77 -0
- package/dist/plugins/messengers/telegram/telegram-adapter.d.ts.map +1 -0
- package/dist/plugins/messengers/telegram/telegram-adapter.js +880 -0
- package/dist/plugins/messengers/telegram/telegram-adapter.js.map +1 -0
- package/dist/plugins/messengers/telegram/types.d.ts +47 -0
- package/dist/plugins/messengers/telegram/types.d.ts.map +1 -0
- package/dist/plugins/messengers/telegram/types.js +3 -0
- package/dist/plugins/messengers/telegram/types.js.map +1 -0
- package/dist/plugins/messengers/wechat/context-store.d.ts +18 -0
- package/dist/plugins/messengers/wechat/context-store.d.ts.map +1 -0
- package/dist/plugins/messengers/wechat/context-store.js +105 -0
- package/dist/plugins/messengers/wechat/context-store.js.map +1 -0
- package/dist/plugins/messengers/wechat/ilink-adapter.d.ts +71 -0
- package/dist/plugins/messengers/wechat/ilink-adapter.d.ts.map +1 -0
- package/dist/plugins/messengers/wechat/ilink-adapter.js +664 -0
- package/dist/plugins/messengers/wechat/ilink-adapter.js.map +1 -0
- package/dist/plugins/messengers/wechat/ilink-client.d.ts +75 -0
- package/dist/plugins/messengers/wechat/ilink-client.d.ts.map +1 -0
- package/dist/plugins/messengers/wechat/ilink-client.js +331 -0
- package/dist/plugins/messengers/wechat/ilink-client.js.map +1 -0
- package/dist/plugins/messengers/wechat/ilink-types.d.ts +181 -0
- package/dist/plugins/messengers/wechat/ilink-types.d.ts.map +1 -0
- package/dist/plugins/messengers/wechat/ilink-types.js +22 -0
- package/dist/plugins/messengers/wechat/ilink-types.js.map +1 -0
- package/dist/plugins/messengers/wechat/media-download.d.ts +32 -0
- package/dist/plugins/messengers/wechat/media-download.d.ts.map +1 -0
- package/dist/plugins/messengers/wechat/media-download.js +78 -0
- package/dist/plugins/messengers/wechat/media-download.js.map +1 -0
- package/dist/scripts/migrate-gcj02-to-wgs84.d.ts +3 -0
- package/dist/scripts/migrate-gcj02-to-wgs84.d.ts.map +1 -0
- package/dist/scripts/migrate-gcj02-to-wgs84.js +52 -0
- package/dist/scripts/migrate-gcj02-to-wgs84.js.map +1 -0
- package/dist/utils/backoff.d.ts +35 -0
- package/dist/utils/backoff.d.ts.map +1 -0
- package/dist/utils/backoff.js +59 -0
- package/dist/utils/backoff.js.map +1 -0
- package/dist/utils/cross-platform.d.ts +26 -0
- package/dist/utils/cross-platform.d.ts.map +1 -0
- package/dist/utils/cross-platform.js +58 -0
- package/dist/utils/cross-platform.js.map +1 -0
- package/dist/utils/message-split.d.ts +14 -0
- package/dist/utils/message-split.d.ts.map +1 -0
- package/dist/utils/message-split.js +65 -0
- package/dist/utils/message-split.js.map +1 -0
- package/dist/utils/safe-equal.d.ts +2 -0
- package/dist/utils/safe-equal.d.ts.map +1 -0
- package/dist/utils/safe-equal.js +11 -0
- package/dist/utils/safe-equal.js.map +1 -0
- package/dist/web/public/_app.js +196 -0
- package/dist/web/public/index.html +936 -0
- package/dist/web/public/loc.html +305 -0
- package/dist/web/public/login.html +106 -0
- package/dist/web/public/memos.html +271 -0
- package/dist/web/public/reminders.html +234 -0
- package/dist/web/public/settings.html +1355 -0
- package/dist/web/public/tasks.html +1835 -0
- package/dist/web/server.d.ts +12 -0
- package/dist/web/server.d.ts.map +1 -0
- package/dist/web/server.js +2399 -0
- package/dist/web/server.js.map +1 -0
- package/package.json +92 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// WeChat iLink Bot API Types
|
|
2
|
+
// Based on: https://github.com/epiral/weixin-bot/blob/main/docs/protocol-spec.md
|
|
3
|
+
// ============================================
|
|
4
|
+
// Media Item Type Constants
|
|
5
|
+
// ============================================
|
|
6
|
+
export const ITEM_TYPE = {
|
|
7
|
+
TEXT: 1,
|
|
8
|
+
IMAGE: 2,
|
|
9
|
+
VOICE: 3,
|
|
10
|
+
FILE: 4,
|
|
11
|
+
VIDEO: 5,
|
|
12
|
+
};
|
|
13
|
+
// ============================================
|
|
14
|
+
// Error Codes
|
|
15
|
+
// ============================================
|
|
16
|
+
export const ILINK_ERRORS = {
|
|
17
|
+
SESSION_EXPIRED: -14, // Need to re-login
|
|
18
|
+
NETWORK_ERROR: -1,
|
|
19
|
+
INVALID_PARAMS: -2,
|
|
20
|
+
RATE_LIMITED: -3,
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=ilink-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ilink-types.js","sourceRoot":"","sources":["../../../../src/plugins/messengers/wechat/ilink-types.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,iFAAiF;AAiMjF,+CAA+C;AAC/C,4BAA4B;AAC5B,+CAA+C;AAE/C,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;IACR,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACA,CAAA;AAEV,+CAA+C;AAC/C,cAAc;AACd,+CAA+C;AAE/C,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,eAAe,EAAE,CAAC,EAAE,EAAE,mBAAmB;IACzC,aAAa,EAAE,CAAC,CAAC;IACjB,cAAc,EAAE,CAAC,CAAC;IAClB,YAAY,EAAE,CAAC,CAAC;CACR,CAAA"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { CDNMedia, ImageItem, VoiceItem, FileItem, VideoItem } from './ilink-types.js';
|
|
2
|
+
import type { ILinkClient } from './ilink-client.js';
|
|
3
|
+
export declare const MEDIA_ROOT: string;
|
|
4
|
+
export declare const MAX_BYTES: number;
|
|
5
|
+
export interface WechatDownloadResult {
|
|
6
|
+
path: string;
|
|
7
|
+
bytes: number;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Download a CDN media blob via the iLink client and write it to
|
|
11
|
+
* `MEDIA_ROOT/wechat/<subdir>/<filename>`. Returns the absolute path.
|
|
12
|
+
* The AES key is read from `cdnMedia.aes_key` (base64 of an ASCII hex string).
|
|
13
|
+
*/
|
|
14
|
+
export declare function downloadWechatMedia(client: ILinkClient, cdnMedia: CDNMedia, subdir: string, filename: string): Promise<WechatDownloadResult>;
|
|
15
|
+
/**
|
|
16
|
+
* Pick a file extension based on the media item contents. Falls back to a
|
|
17
|
+
* generic extension when nothing more specific can be inferred.
|
|
18
|
+
*/
|
|
19
|
+
export declare function pickExtensionForImage(item: ImageItem): string;
|
|
20
|
+
export declare function pickExtensionForVoice(item: VoiceItem): string;
|
|
21
|
+
export declare function pickExtensionForFile(item: FileItem): string;
|
|
22
|
+
export declare function pickExtensionForVideo(_item: VideoItem): string;
|
|
23
|
+
/**
|
|
24
|
+
* Resolve the CDNMedia reference from a media item. Returns null when the
|
|
25
|
+
* item lacks the signed CDN URL or its AES key. The bot fetches
|
|
26
|
+
* `media.full_url` directly and decrypts with `media.aes_key` (no iLink-side
|
|
27
|
+
* download endpoint exists).
|
|
28
|
+
*/
|
|
29
|
+
export declare function extractCdnMedia(item: {
|
|
30
|
+
media?: CDNMedia;
|
|
31
|
+
}): CDNMedia | null;
|
|
32
|
+
//# sourceMappingURL=media-download.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-download.d.ts","sourceRoot":"","sources":["../../../../src/plugins/messengers/wechat/media-download.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC3F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAIpD,eAAO,MAAM,UAAU,EAAE,MAExB,CAAA;AAED,eAAO,MAAM,SAAS,QAAmB,CAAA;AAEzC,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;CACd;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,oBAAoB,CAAC,CAqB/B;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAM7D;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAG7D;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAM3D;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAE9D;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,QAAQ,CAAA;CAAE,GACzB,QAAQ,GAAG,IAAI,CAGjB"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
// WeChat media download helper.
|
|
2
|
+
//
|
|
3
|
+
// Downloads image / voice / file / video attachments received via iLink to
|
|
4
|
+
// ~/.im-hub/media/wechat/<userId>/<msgId>.<ext> so downstream agents can
|
|
5
|
+
// read them by path (same convention as the Telegram adapter).
|
|
6
|
+
//
|
|
7
|
+
// Cleanup: shares MEDIA_ROOT and the same TTL-based sweep as
|
|
8
|
+
// telegram/media-download.ts (both write into the same root dir).
|
|
9
|
+
import { mkdir, writeFile } from 'node:fs/promises';
|
|
10
|
+
import { join, resolve } from 'node:path';
|
|
11
|
+
import { logger as rootLogger } from '../../../core/logger.js';
|
|
12
|
+
import { AGIM_HOME } from '../../../core/agim-paths.js';
|
|
13
|
+
const log = rootLogger.child({ component: 'wechat.media' });
|
|
14
|
+
export const MEDIA_ROOT = resolve(process.env.IMHUB_MEDIA_ROOT ?? join(AGIM_HOME, 'media'));
|
|
15
|
+
export const MAX_BYTES = 20 * 1024 * 1024;
|
|
16
|
+
/**
|
|
17
|
+
* Download a CDN media blob via the iLink client and write it to
|
|
18
|
+
* `MEDIA_ROOT/wechat/<subdir>/<filename>`. Returns the absolute path.
|
|
19
|
+
* The AES key is read from `cdnMedia.aes_key` (base64 of an ASCII hex string).
|
|
20
|
+
*/
|
|
21
|
+
export async function downloadWechatMedia(client, cdnMedia, subdir, filename) {
|
|
22
|
+
if (filename.includes('/') || filename.includes('\\') || filename.includes('..')) {
|
|
23
|
+
throw new Error(`unsafe filename: ${filename}`);
|
|
24
|
+
}
|
|
25
|
+
const dir = resolve(MEDIA_ROOT, 'wechat', subdir);
|
|
26
|
+
const filePath = resolve(dir, filename);
|
|
27
|
+
if (!filePath.startsWith(`${MEDIA_ROOT}/`)) {
|
|
28
|
+
throw new Error(`destination escapes MEDIA_ROOT: ${filePath}`);
|
|
29
|
+
}
|
|
30
|
+
const buf = await client.downloadMedia(cdnMedia);
|
|
31
|
+
if (buf.length > MAX_BYTES) {
|
|
32
|
+
throw new Error(`payload exceeds ${MAX_BYTES} bytes (got ${buf.length})`);
|
|
33
|
+
}
|
|
34
|
+
await mkdir(dir, { recursive: true });
|
|
35
|
+
await writeFile(filePath, buf);
|
|
36
|
+
log.info({ event: 'wechat.media.downloaded', path: filePath, bytes: buf.length });
|
|
37
|
+
return { path: filePath, bytes: buf.length };
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Pick a file extension based on the media item contents. Falls back to a
|
|
41
|
+
* generic extension when nothing more specific can be inferred.
|
|
42
|
+
*/
|
|
43
|
+
export function pickExtensionForImage(item) {
|
|
44
|
+
if (item.url) {
|
|
45
|
+
const m = /\.([a-z0-9]+)$/i.exec(item.url.split('?')[0]);
|
|
46
|
+
if (m)
|
|
47
|
+
return m[1].toLowerCase();
|
|
48
|
+
}
|
|
49
|
+
return 'jpg';
|
|
50
|
+
}
|
|
51
|
+
export function pickExtensionForVoice(item) {
|
|
52
|
+
if (item.encode_type === 6)
|
|
53
|
+
return 'silk';
|
|
54
|
+
return 'amr';
|
|
55
|
+
}
|
|
56
|
+
export function pickExtensionForFile(item) {
|
|
57
|
+
if (item.file_name) {
|
|
58
|
+
const m = /\.([a-z0-9]+)$/i.exec(item.file_name);
|
|
59
|
+
if (m)
|
|
60
|
+
return m[1].toLowerCase();
|
|
61
|
+
}
|
|
62
|
+
return 'bin';
|
|
63
|
+
}
|
|
64
|
+
export function pickExtensionForVideo(_item) {
|
|
65
|
+
return 'mp4';
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Resolve the CDNMedia reference from a media item. Returns null when the
|
|
69
|
+
* item lacks the signed CDN URL or its AES key. The bot fetches
|
|
70
|
+
* `media.full_url` directly and decrypts with `media.aes_key` (no iLink-side
|
|
71
|
+
* download endpoint exists).
|
|
72
|
+
*/
|
|
73
|
+
export function extractCdnMedia(item) {
|
|
74
|
+
if (!item.media?.full_url || !item.media?.aes_key)
|
|
75
|
+
return null;
|
|
76
|
+
return item.media;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=media-download.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-download.js","sourceRoot":"","sources":["../../../../src/plugins/messengers/wechat/media-download.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate-gcj02-to-wgs84.d.ts","sourceRoot":"","sources":["../../src/scripts/migrate-gcj02-to-wgs84.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// One-shot migration: rewrite memo rows whose stored coords are actually
|
|
3
|
+
// GCJ-02 (because they came from a Telegram pin or H5 navigator.geolocation
|
|
4
|
+
// on an Apple/Google device in China — Apple/Google apply the offset before
|
|
5
|
+
// the JS API returns).
|
|
6
|
+
//
|
|
7
|
+
// AFTER 2026-05-11 the ingestion paths now reverse the offset at write
|
|
8
|
+
// time. This script is for the rows created BEFORE that fix lands.
|
|
9
|
+
//
|
|
10
|
+
// Usage:
|
|
11
|
+
// node dist/scripts/migrate-gcj02-to-wgs84.js [--dry-run]
|
|
12
|
+
//
|
|
13
|
+
// Safety:
|
|
14
|
+
// - Only rows with where_lat IS NOT NULL are touched.
|
|
15
|
+
// - Rows outside the China bbox are skipped (gcj02ToWgs84 no-ops there).
|
|
16
|
+
// - Run with --dry-run first to preview.
|
|
17
|
+
import Database from 'better-sqlite3';
|
|
18
|
+
import { join } from 'node:path';
|
|
19
|
+
import { gcj02ToWgs84 } from '../core/memos.js';
|
|
20
|
+
import { AGIM_HOME } from '../core/agim-paths.js';
|
|
21
|
+
const DRY = process.argv.includes('--dry-run');
|
|
22
|
+
const DB_FILE = process.env.IMHUB_MEMOS_DB || join(AGIM_HOME, 'memos.db');
|
|
23
|
+
const db = new Database(DB_FILE);
|
|
24
|
+
const rows = db.prepare('SELECT id, what, where_lat, where_lng FROM memos WHERE where_lat IS NOT NULL').all();
|
|
25
|
+
console.log(`Loaded ${rows.length} memo rows with coords from ${DB_FILE}`);
|
|
26
|
+
console.log(`Mode: ${DRY ? 'DRY-RUN' : 'WRITE'}`);
|
|
27
|
+
console.log();
|
|
28
|
+
const update = db.prepare('UPDATE memos SET where_lat = ?, where_lng = ?, updated_at = ? WHERE id = ?');
|
|
29
|
+
const now = new Date(Date.now() + 8 * 3600_000).toISOString().slice(0, 19).replace('T', ' ');
|
|
30
|
+
let touched = 0;
|
|
31
|
+
let skipped = 0;
|
|
32
|
+
for (const row of rows) {
|
|
33
|
+
const wgs = gcj02ToWgs84(row.where_lat, row.where_lng);
|
|
34
|
+
const latDiff = Math.abs(wgs.lat - row.where_lat);
|
|
35
|
+
const lngDiff = Math.abs(wgs.lng - row.where_lng);
|
|
36
|
+
if (latDiff < 1e-7 && lngDiff < 1e-7) {
|
|
37
|
+
console.log(` #${row.id} [${row.what}]: no shift (out of China) — skipped`);
|
|
38
|
+
skipped++;
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
console.log(` #${row.id} [${row.what}]: ${row.where_lat.toFixed(6)},${row.where_lng.toFixed(6)} → ${wgs.lat.toFixed(6)},${wgs.lng.toFixed(6)}`);
|
|
42
|
+
if (!DRY) {
|
|
43
|
+
update.run(wgs.lat, wgs.lng, now, row.id);
|
|
44
|
+
}
|
|
45
|
+
touched++;
|
|
46
|
+
}
|
|
47
|
+
console.log();
|
|
48
|
+
console.log(`Touched: ${touched} | Skipped (out of China): ${skipped} | Total: ${rows.length}`);
|
|
49
|
+
if (DRY)
|
|
50
|
+
console.log('Re-run without --dry-run to apply.');
|
|
51
|
+
db.close();
|
|
52
|
+
//# sourceMappingURL=migrate-gcj02-to-wgs84.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate-gcj02-to-wgs84.js","sourceRoot":"","sources":["../../src/scripts/migrate-gcj02-to-wgs84.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export interface BackoffOptions {
|
|
2
|
+
/** Initial delay in ms. Doubles each attempt up to capMs. Default 1000. */
|
|
3
|
+
baseMs?: number;
|
|
4
|
+
/** Maximum delay in ms before jitter. Default 60_000. */
|
|
5
|
+
capMs?: number;
|
|
6
|
+
/** Multiplicative jitter range in [0, 1]. The actual delay is sampled
|
|
7
|
+
* uniformly from `[exp * (1 - jitter), exp * (1 + jitter)]`. Set to 0
|
|
8
|
+
* for deterministic delays (testing). Default 0.5. */
|
|
9
|
+
jitter?: number;
|
|
10
|
+
/** Pluggable RNG for deterministic tests. Defaults to Math.random. */
|
|
11
|
+
random?: () => number;
|
|
12
|
+
}
|
|
13
|
+
export declare class Backoff {
|
|
14
|
+
private attempt;
|
|
15
|
+
private readonly baseMs;
|
|
16
|
+
private readonly capMs;
|
|
17
|
+
private readonly jitter;
|
|
18
|
+
private readonly random;
|
|
19
|
+
constructor(opts?: BackoffOptions);
|
|
20
|
+
/**
|
|
21
|
+
* Compute the next delay in ms and increment the attempt counter.
|
|
22
|
+
*
|
|
23
|
+
* - First call: ~baseMs (jittered)
|
|
24
|
+
* - Each call doubles the unjittered exponent until it hits capMs
|
|
25
|
+
* - Then every subsequent call returns ~capMs (jittered)
|
|
26
|
+
*
|
|
27
|
+
* Returns a non-negative integer.
|
|
28
|
+
*/
|
|
29
|
+
nextDelayMs(): number;
|
|
30
|
+
/** Reset attempt counter — call after a successful operation. */
|
|
31
|
+
reset(): void;
|
|
32
|
+
/** Diagnostic: current attempt count without bumping. */
|
|
33
|
+
currentAttempt(): number;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=backoff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backoff.d.ts","sourceRoot":"","sources":["../../src/utils/backoff.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,cAAc;IAC7B,2EAA2E;IAC3E,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;;2DAEuD;IACvD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,sEAAsE;IACtE,MAAM,CAAC,EAAE,MAAM,MAAM,CAAA;CACtB;AAMD,qBAAa,OAAO;IAClB,OAAO,CAAC,OAAO,CAAI;IACnB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;gBAEzB,IAAI,GAAE,cAAmB;IAOrC;;;;;;;;OAQG;IACH,WAAW,IAAI,MAAM;IASrB,iEAAiE;IACjE,KAAK,IAAI,IAAI;IAIb,yDAAyD;IACzD,cAAc,IAAI,MAAM;CAGzB"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// Exponential backoff with jitter — used by IM adapter reconnect loops.
|
|
2
|
+
//
|
|
3
|
+
// Why: when an IM platform throws (auth revoked, network blip, server
|
|
4
|
+
// outage) the adapter retries. With fixed delays we have three problems:
|
|
5
|
+
//
|
|
6
|
+
// 1. Auth revoked → infinite fast hammering of the IM API at the same
|
|
7
|
+
// cadence; with backoff the cadence relaxes to capMs.
|
|
8
|
+
// 2. Multi-instance fleet recovering from a network event reconnects
|
|
9
|
+
// in lock-step at the same fixed delay — thundering herd hits the
|
|
10
|
+
// IM platform's load balancer; jitter spreads the storm.
|
|
11
|
+
// 3. Flaky network → CPU spent in tight reconnect loop; longer waits
|
|
12
|
+
// between attempts dampen this.
|
|
13
|
+
//
|
|
14
|
+
// Used by:
|
|
15
|
+
// - telegram-adapter runPollingLoop (was fixed 2s/5s delays)
|
|
16
|
+
// - wechat ilink-adapter polling loop (had exp backoff but no jitter)
|
|
17
|
+
const DEFAULT_BASE_MS = 1_000;
|
|
18
|
+
const DEFAULT_CAP_MS = 60_000;
|
|
19
|
+
const DEFAULT_JITTER = 0.5;
|
|
20
|
+
export class Backoff {
|
|
21
|
+
attempt = 0;
|
|
22
|
+
baseMs;
|
|
23
|
+
capMs;
|
|
24
|
+
jitter;
|
|
25
|
+
random;
|
|
26
|
+
constructor(opts = {}) {
|
|
27
|
+
this.baseMs = Math.max(0, opts.baseMs ?? DEFAULT_BASE_MS);
|
|
28
|
+
this.capMs = Math.max(this.baseMs, opts.capMs ?? DEFAULT_CAP_MS);
|
|
29
|
+
this.jitter = Math.max(0, Math.min(1, opts.jitter ?? DEFAULT_JITTER));
|
|
30
|
+
this.random = opts.random ?? Math.random;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Compute the next delay in ms and increment the attempt counter.
|
|
34
|
+
*
|
|
35
|
+
* - First call: ~baseMs (jittered)
|
|
36
|
+
* - Each call doubles the unjittered exponent until it hits capMs
|
|
37
|
+
* - Then every subsequent call returns ~capMs (jittered)
|
|
38
|
+
*
|
|
39
|
+
* Returns a non-negative integer.
|
|
40
|
+
*/
|
|
41
|
+
nextDelayMs() {
|
|
42
|
+
const exp = Math.min(this.capMs, this.baseMs * 2 ** this.attempt);
|
|
43
|
+
this.attempt += 1;
|
|
44
|
+
if (this.jitter === 0)
|
|
45
|
+
return Math.floor(exp);
|
|
46
|
+
// Multiplicative jitter: factor ∈ [1 - jitter, 1 + jitter]
|
|
47
|
+
const factor = 1 + (this.random() * 2 - 1) * this.jitter;
|
|
48
|
+
return Math.max(0, Math.floor(exp * factor));
|
|
49
|
+
}
|
|
50
|
+
/** Reset attempt counter — call after a successful operation. */
|
|
51
|
+
reset() {
|
|
52
|
+
this.attempt = 0;
|
|
53
|
+
}
|
|
54
|
+
/** Diagnostic: current attempt count without bumping. */
|
|
55
|
+
currentAttempt() {
|
|
56
|
+
return this.attempt;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=backoff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backoff.js","sourceRoot":"","sources":["../../src/utils/backoff.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,EAAE;AACF,sEAAsE;AACtE,yEAAyE;AACzE,EAAE;AACF,wEAAwE;AACxE,2DAA2D;AAC3D,uEAAuE;AACvE,uEAAuE;AACvE,8DAA8D;AAC9D,uEAAuE;AACvE,qCAAqC;AACrC,EAAE;AACF,WAAW;AACX,+DAA+D;AAC/D,wEAAwE;AAexE,MAAM,eAAe,GAAG,KAAK,CAAA;AAC7B,MAAM,cAAc,GAAG,MAAM,CAAA;AAC7B,MAAM,cAAc,GAAG,GAAG,CAAA;AAE1B,MAAM,OAAO,OAAO;IACV,OAAO,GAAG,CAAC,CAAA;IACF,MAAM,CAAQ;IACd,KAAK,CAAQ;IACb,MAAM,CAAQ;IACd,MAAM,CAAc;IAErC,YAAY,OAAuB,EAAE;QACnC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,IAAI,eAAe,CAAC,CAAA;QACzD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,IAAI,cAAc,CAAC,CAAA;QAChE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,IAAI,cAAc,CAAC,CAAC,CAAA;QACrE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAA;IAC1C,CAAC;IAED;;;;;;;;OAQG;IACH,WAAW;QACT,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,CAAA;QACjE,IAAI,CAAC,OAAO,IAAI,CAAC,CAAA;QACjB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAC7C,2DAA2D;QAC3D,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAA;QACxD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,MAAM,CAAC,CAAC,CAAA;IAC9C,CAAC;IAED,iEAAiE;IACjE,KAAK;QACH,IAAI,CAAC,OAAO,GAAG,CAAC,CAAA;IAClB,CAAC;IAED,yDAAyD;IACzD,cAAc;QACZ,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;CACF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type SpawnOptions, type ChildProcess } from 'node:child_process';
|
|
2
|
+
export declare const isWindows: boolean;
|
|
3
|
+
export declare const isMac: boolean;
|
|
4
|
+
export declare const isLinux: boolean;
|
|
5
|
+
/**
|
|
6
|
+
* Cross-platform spawn wrapper that automatically handles Windows compatibility.
|
|
7
|
+
* On Windows, it sets shell: true to enable command execution.
|
|
8
|
+
*
|
|
9
|
+
* Note: When using stdio: ['ignore', 'pipe', 'pipe'], stdout and stderr are guaranteed to be non-null.
|
|
10
|
+
*/
|
|
11
|
+
export declare function crossSpawn(command: string, args?: string[], options?: SpawnOptions): ChildProcess;
|
|
12
|
+
/**
|
|
13
|
+
* Get Copilot CLI binary path based on the current platform.
|
|
14
|
+
* Copilot CLI is installed by VS Code extension in different locations per OS.
|
|
15
|
+
*/
|
|
16
|
+
export declare function getCopilotBinPath(): string;
|
|
17
|
+
/**
|
|
18
|
+
* Check if a command exists in PATH.
|
|
19
|
+
* Uses 'where' on Windows, 'which' on Unix.
|
|
20
|
+
*/
|
|
21
|
+
export declare function commandExists(command: string): Promise<boolean>;
|
|
22
|
+
/**
|
|
23
|
+
* Get the correct newline character for the current platform.
|
|
24
|
+
*/
|
|
25
|
+
export declare const EOL: string;
|
|
26
|
+
//# sourceMappingURL=cross-platform.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cross-platform.d.ts","sourceRoot":"","sources":["../../src/utils/cross-platform.ts"],"names":[],"mappings":"AAEA,OAAO,EAAS,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAIhF,eAAO,MAAM,SAAS,SAAyB,CAAA;AAC/C,eAAO,MAAM,KAAK,SAA0B,CAAA;AAC5C,eAAO,MAAM,OAAO,SAAyB,CAAA;AAE7C;;;;;GAKG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,MAAM,EAAO,EACnB,OAAO,GAAE,YAAiB,GACzB,YAAY,CAQd;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAuB1C;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO/D;AAED;;GAEG;AACH,eAAO,MAAM,GAAG,QAA4B,CAAA"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// Cross-platform utilities for Windows compatibility
|
|
2
|
+
import { spawn } from 'node:child_process';
|
|
3
|
+
import { platform, homedir } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
export const isWindows = platform() === 'win32';
|
|
6
|
+
export const isMac = platform() === 'darwin';
|
|
7
|
+
export const isLinux = platform() === 'linux';
|
|
8
|
+
/**
|
|
9
|
+
* Cross-platform spawn wrapper that automatically handles Windows compatibility.
|
|
10
|
+
* On Windows, it sets shell: true to enable command execution.
|
|
11
|
+
*
|
|
12
|
+
* Note: When using stdio: ['ignore', 'pipe', 'pipe'], stdout and stderr are guaranteed to be non-null.
|
|
13
|
+
*/
|
|
14
|
+
export function crossSpawn(command, args = [], options = {}) {
|
|
15
|
+
const spawnOptions = {
|
|
16
|
+
...options,
|
|
17
|
+
// On Windows, we need shell: true for commands like 'claude', 'opencode', etc.
|
|
18
|
+
// to be found in PATH and executed properly.
|
|
19
|
+
shell: isWindows ? (options.shell ?? true) : options.shell,
|
|
20
|
+
};
|
|
21
|
+
return spawn(command, args, spawnOptions);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Get Copilot CLI binary path based on the current platform.
|
|
25
|
+
* Copilot CLI is installed by VS Code extension in different locations per OS.
|
|
26
|
+
*/
|
|
27
|
+
export function getCopilotBinPath() {
|
|
28
|
+
if (isWindows) {
|
|
29
|
+
// Windows: VS Code extensions are in %USERPROFILE%\.vscode\extensions
|
|
30
|
+
// The copilot CLI should be in the global storage
|
|
31
|
+
return join(homedir(), '.vscode', 'extensions', 'github.copilot-chat-*/copilotCli/copilot.exe');
|
|
32
|
+
}
|
|
33
|
+
else if (isMac) {
|
|
34
|
+
// macOS
|
|
35
|
+
return join(homedir(), 'Library/Application Support/Code/User/globalStorage/github.copilot-chat/copilotCli/copilot');
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
// Linux
|
|
39
|
+
return join(homedir(), '.vscode/extensions/github.copilot-chat/copilotCli/copilot');
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Check if a command exists in PATH.
|
|
44
|
+
* Uses 'where' on Windows, 'which' on Unix.
|
|
45
|
+
*/
|
|
46
|
+
export function commandExists(command) {
|
|
47
|
+
return new Promise((resolve) => {
|
|
48
|
+
const checkCmd = isWindows ? 'where' : 'which';
|
|
49
|
+
const proc = crossSpawn(checkCmd, [command], { stdio: 'ignore' });
|
|
50
|
+
proc.on('close', (code) => resolve(code === 0));
|
|
51
|
+
proc.on('error', () => resolve(false));
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Get the correct newline character for the current platform.
|
|
56
|
+
*/
|
|
57
|
+
export const EOL = isWindows ? '\r\n' : '\n';
|
|
58
|
+
//# sourceMappingURL=cross-platform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cross-platform.js","sourceRoot":"","sources":["../../src/utils/cross-platform.ts"],"names":[],"mappings":"AAAA,qDAAqD;AAErD,OAAO,EAAE,KAAK,EAAwC,MAAM,oBAAoB,CAAA;AAChF,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,MAAM,CAAC,MAAM,SAAS,GAAG,QAAQ,EAAE,KAAK,OAAO,CAAA;AAC/C,MAAM,CAAC,MAAM,KAAK,GAAG,QAAQ,EAAE,KAAK,QAAQ,CAAA;AAC5C,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,EAAE,KAAK,OAAO,CAAA;AAE7C;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CACxB,OAAe,EACf,OAAiB,EAAE,EACnB,UAAwB,EAAE;IAE1B,MAAM,YAAY,GAAiB;QACjC,GAAG,OAAO;QACV,+EAA+E;QAC/E,6CAA6C;QAC7C,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK;KAC3D,CAAA;IACD,OAAO,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,YAAY,CAAC,CAAA;AAC3C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAC/B,IAAI,SAAS,EAAE,CAAC;QACd,sEAAsE;QACtE,kDAAkD;QAClD,OAAO,IAAI,CACT,OAAO,EAAE,EACT,SAAS,EACT,YAAY,EACZ,8CAA8C,CAC/C,CAAA;IACH,CAAC;SAAM,IAAI,KAAK,EAAE,CAAC;QACjB,QAAQ;QACR,OAAO,IAAI,CACT,OAAO,EAAE,EACT,4FAA4F,CAC7F,CAAA;IACH,CAAC;SAAM,CAAC;QACN,QAAQ;QACR,OAAO,IAAI,CACT,OAAO,EAAE,EACT,2DAA2D,CAC5D,CAAA;IACH,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAA;QAC9C,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;QACjE,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAA;QAC/C,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAA"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface SplitOptions {
|
|
2
|
+
/** Maximum characters per chunk */
|
|
3
|
+
maxLength?: number;
|
|
4
|
+
/** Add continuation marker to split messages */
|
|
5
|
+
addContinuationMarker?: boolean;
|
|
6
|
+
/** Continuation marker text */
|
|
7
|
+
continuationMarker?: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Split a long message into chunks that fit within messenger limits.
|
|
11
|
+
* Tries to split at natural boundaries (code blocks, paragraphs, lines).
|
|
12
|
+
*/
|
|
13
|
+
export declare function splitMessage(text: string, options?: SplitOptions): string[];
|
|
14
|
+
//# sourceMappingURL=message-split.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-split.d.ts","sourceRoot":"","sources":["../../src/utils/message-split.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,YAAY;IAC3B,mCAAmC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,gDAAgD;IAChD,qBAAqB,CAAC,EAAE,OAAO,CAAA;IAC/B,+BAA+B;IAC/B,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC5B;AAmBD;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,YAAiB,GACzB,MAAM,EAAE,CAkDV"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
// Shared message splitting utility
|
|
2
|
+
// Used by WeChat, Telegram, and other messengers with character limits
|
|
3
|
+
/**
|
|
4
|
+
* If `idx` falls between a UTF-16 surrogate pair, step back by 1 so the
|
|
5
|
+
* pair stays whole. JavaScript strings are UTF-16; characters in plane 1+
|
|
6
|
+
* (most emoji, e.g. 😀 U+1F600) are encoded as a high-surrogate +
|
|
7
|
+
* low-surrogate pair (2 code units). Slicing through the boundary yields
|
|
8
|
+
* an orphan surrogate that renders as `â–¡` (or worse, breaks Telegram's
|
|
9
|
+
* HTML parser when the orphan happens to be inside a tag value).
|
|
10
|
+
*
|
|
11
|
+
* Returns the safe split point. Idempotent on already-safe boundaries.
|
|
12
|
+
*/
|
|
13
|
+
function safeSplitPoint(s, idx) {
|
|
14
|
+
if (idx <= 0 || idx >= s.length)
|
|
15
|
+
return idx;
|
|
16
|
+
const code = s.charCodeAt(idx - 1);
|
|
17
|
+
if (code >= 0xD800 && code <= 0xDBFF)
|
|
18
|
+
return idx - 1;
|
|
19
|
+
return idx;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Split a long message into chunks that fit within messenger limits.
|
|
23
|
+
* Tries to split at natural boundaries (code blocks, paragraphs, lines).
|
|
24
|
+
*/
|
|
25
|
+
export function splitMessage(text, options = {}) {
|
|
26
|
+
const { maxLength = 2000, addContinuationMarker = true, continuationMarker = '\n\n[continued...]', } = options;
|
|
27
|
+
if (text.length <= maxLength) {
|
|
28
|
+
return [text];
|
|
29
|
+
}
|
|
30
|
+
const chunks = [];
|
|
31
|
+
let remaining = text;
|
|
32
|
+
while (remaining.length > maxLength) {
|
|
33
|
+
// Try to split at code block boundary first
|
|
34
|
+
let splitPoint = remaining.lastIndexOf('\n```\n', maxLength);
|
|
35
|
+
if (splitPoint < maxLength / 2) {
|
|
36
|
+
// Try paragraph break
|
|
37
|
+
splitPoint = remaining.lastIndexOf('\n\n', maxLength);
|
|
38
|
+
}
|
|
39
|
+
if (splitPoint < maxLength / 2) {
|
|
40
|
+
// Try line break
|
|
41
|
+
splitPoint = remaining.lastIndexOf('\n', maxLength);
|
|
42
|
+
}
|
|
43
|
+
if (splitPoint < maxLength / 2) {
|
|
44
|
+
// Force split at maxLength
|
|
45
|
+
splitPoint = maxLength;
|
|
46
|
+
}
|
|
47
|
+
// M10: surrogate-pair safety. The natural-boundary searches land on
|
|
48
|
+
// ASCII bytes (newline, backtick) so they're already safe; the forced
|
|
49
|
+
// split at maxLength is the only path that could land mid-pair.
|
|
50
|
+
splitPoint = safeSplitPoint(remaining, splitPoint);
|
|
51
|
+
chunks.push(remaining.slice(0, splitPoint).trim());
|
|
52
|
+
remaining = remaining.slice(splitPoint).trim();
|
|
53
|
+
}
|
|
54
|
+
if (remaining) {
|
|
55
|
+
chunks.push(remaining);
|
|
56
|
+
}
|
|
57
|
+
// Add continuation markers
|
|
58
|
+
if (addContinuationMarker && chunks.length > 1) {
|
|
59
|
+
for (let i = 0; i < chunks.length - 1; i++) {
|
|
60
|
+
chunks[i] += continuationMarker;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return chunks;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=message-split.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-split.js","sourceRoot":"","sources":["../../src/utils/message-split.ts"],"names":[],"mappings":"AAAA,mCAAmC;AACnC,uEAAuE;AAWvE;;;;;;;;;GASG;AACH,SAAS,cAAc,CAAC,CAAS,EAAE,GAAW;IAC5C,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,MAAM;QAAE,OAAO,GAAG,CAAA;IAC3C,MAAM,IAAI,GAAG,CAAC,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,CAAA;IAClC,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM;QAAE,OAAO,GAAG,GAAG,CAAC,CAAA;IACpD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAC1B,IAAY,EACZ,UAAwB,EAAE;IAE1B,MAAM,EACJ,SAAS,GAAG,IAAI,EAChB,qBAAqB,GAAG,IAAI,EAC5B,kBAAkB,GAAG,oBAAoB,GAC1C,GAAG,OAAO,CAAA;IAEX,IAAI,IAAI,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC,CAAA;IACf,CAAC;IAED,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,IAAI,SAAS,GAAG,IAAI,CAAA;IAEpB,OAAO,SAAS,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;QACpC,4CAA4C;QAC5C,IAAI,UAAU,GAAG,SAAS,CAAC,WAAW,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;QAC5D,IAAI,UAAU,GAAG,SAAS,GAAG,CAAC,EAAE,CAAC;YAC/B,sBAAsB;YACtB,UAAU,GAAG,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;QACvD,CAAC;QACD,IAAI,UAAU,GAAG,SAAS,GAAG,CAAC,EAAE,CAAC;YAC/B,iBAAiB;YACjB,UAAU,GAAG,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;QACrD,CAAC;QACD,IAAI,UAAU,GAAG,SAAS,GAAG,CAAC,EAAE,CAAC;YAC/B,2BAA2B;YAC3B,UAAU,GAAG,SAAS,CAAA;QACxB,CAAC;QACD,oEAAoE;QACpE,sEAAsE;QACtE,gEAAgE;QAChE,UAAU,GAAG,cAAc,CAAC,SAAS,EAAE,UAAU,CAAC,CAAA;QAElD,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;QAClD,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,CAAA;IAChD,CAAC;IAED,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACxB,CAAC;IAED,2BAA2B;IAC3B,IAAI,qBAAqB,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,MAAM,CAAC,CAAC,CAAC,IAAI,kBAAkB,CAAA;QACjC,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safe-equal.d.ts","sourceRoot":"","sources":["../../src/utils/safe-equal.ts"],"names":[],"mappings":"AAKA,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAKvD"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// Constant-time string compare for auth-token comparison.
|
|
2
|
+
// Returns false when lengths differ, otherwise defers to crypto.timingSafeEqual.
|
|
3
|
+
import { timingSafeEqual } from 'node:crypto';
|
|
4
|
+
export function safeEqual(a, b) {
|
|
5
|
+
const bufA = Buffer.from(a);
|
|
6
|
+
const bufB = Buffer.from(b);
|
|
7
|
+
if (bufA.length !== bufB.length)
|
|
8
|
+
return false;
|
|
9
|
+
return timingSafeEqual(bufA, bufB);
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=safe-equal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safe-equal.js","sourceRoot":"","sources":["../../src/utils/safe-equal.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,iFAAiF;AAEjF,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAE7C,MAAM,UAAU,SAAS,CAAC,CAAS,EAAE,CAAS;IAC5C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC3B,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAA;IAC7C,OAAO,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;AACpC,CAAC"}
|