im-hub-pro 0.2.29
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 +497 -0
- package/README.zh-CN.md +496 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +921 -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 +374 -0
- package/dist/core/agent-base.js.map +1 -0
- package/dist/core/agent-cwd.d.ts +45 -0
- package/dist/core/agent-cwd.d.ts.map +1 -0
- package/dist/core/agent-cwd.js +178 -0
- package/dist/core/agent-cwd.js.map +1 -0
- package/dist/core/agent-cwd.test.d.ts +2 -0
- package/dist/core/agent-cwd.test.d.ts.map +1 -0
- package/dist/core/agent-cwd.test.js +149 -0
- package/dist/core/agent-cwd.test.js.map +1 -0
- package/dist/core/approval-bus.d.ts +232 -0
- package/dist/core/approval-bus.d.ts.map +1 -0
- package/dist/core/approval-bus.js +703 -0
- package/dist/core/approval-bus.js.map +1 -0
- package/dist/core/approval-bus.synthetic.test.d.ts +2 -0
- package/dist/core/approval-bus.synthetic.test.d.ts.map +1 -0
- package/dist/core/approval-bus.synthetic.test.js +182 -0
- package/dist/core/approval-bus.synthetic.test.js.map +1 -0
- package/dist/core/approval-bus.test.d.ts +2 -0
- package/dist/core/approval-bus.test.d.ts.map +1 -0
- package/dist/core/approval-bus.test.js +537 -0
- package/dist/core/approval-bus.test.js.map +1 -0
- package/dist/core/approval-router.d.ts +95 -0
- package/dist/core/approval-router.d.ts.map +1 -0
- package/dist/core/approval-router.js +450 -0
- package/dist/core/approval-router.js.map +1 -0
- package/dist/core/approval-router.test.d.ts +2 -0
- package/dist/core/approval-router.test.d.ts.map +1 -0
- package/dist/core/approval-router.test.js +413 -0
- package/dist/core/approval-router.test.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/bgjob-reader.test.d.ts +2 -0
- package/dist/core/bgjob-reader.test.d.ts.map +1 -0
- package/dist/core/bgjob-reader.test.js +178 -0
- package/dist/core/bgjob-reader.test.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 +21 -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 +44 -0
- package/dist/core/commands/approval.js.map +1 -0
- package/dist/core/commands/approval.test.d.ts +2 -0
- package/dist/core/commands/approval.test.d.ts.map +1 -0
- package/dist/core/commands/approval.test.js +85 -0
- package/dist/core/commands/approval.test.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 +26 -0
- package/dist/core/commands/builtin.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/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/plan.test.d.ts +2 -0
- package/dist/core/commands/plan.test.d.ts.map +1 -0
- package/dist/core/commands/plan.test.js +122 -0
- package/dist/core/commands/plan.test.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/schedule.d.ts +3 -0
- package/dist/core/commands/schedule.d.ts.map +1 -0
- package/dist/core/commands/schedule.js +123 -0
- package/dist/core/commands/schedule.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 +58 -0
- package/dist/core/config-schema.d.ts.map +1 -0
- package/dist/core/config-schema.js +63 -0
- package/dist/core/config-schema.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 +84 -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/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/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 +94 -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/onboarding.test.d.ts +2 -0
- package/dist/core/onboarding.test.d.ts.map +1 -0
- package/dist/core/onboarding.test.js +112 -0
- package/dist/core/onboarding.test.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 +122 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/router.d.ts +41 -0
- package/dist/core/router.d.ts.map +1 -0
- package/dist/core/router.js +431 -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 +316 -0
- package/dist/core/schedule.js.map +1 -0
- package/dist/core/session-subtasks.test.d.ts +2 -0
- package/dist/core/session-subtasks.test.d.ts.map +1 -0
- package/dist/core/session-subtasks.test.js +88 -0
- package/dist/core/session-subtasks.test.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 +774 -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/transcribe.test.d.ts +2 -0
- package/dist/core/transcribe.test.d.ts.map +1 -0
- package/dist/core/transcribe.test.js +163 -0
- package/dist/core/transcribe.test.js.map +1 -0
- package/dist/core/types.d.ts +352 -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 +175 -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 +109 -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/adapter.test.d.ts +2 -0
- package/dist/plugins/agents/claude-code/adapter.test.d.ts.map +1 -0
- package/dist/plugins/agents/claude-code/adapter.test.js +195 -0
- package/dist/plugins/agents/claude-code/adapter.test.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 +42 -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 +235 -0
- package/dist/plugins/agents/claude-code/mcp-approval-server.js.map +1 -0
- package/dist/plugins/agents/claude-code/mcp-approval-server.test.d.ts +2 -0
- package/dist/plugins/agents/claude-code/mcp-approval-server.test.d.ts.map +1 -0
- package/dist/plugins/agents/claude-code/mcp-approval-server.test.js +188 -0
- package/dist/plugins/agents/claude-code/mcp-approval-server.test.js.map +1 -0
- package/dist/plugins/agents/codex/adapter.test.d.ts +2 -0
- package/dist/plugins/agents/codex/adapter.test.d.ts.map +1 -0
- package/dist/plugins/agents/codex/adapter.test.js +192 -0
- package/dist/plugins/agents/codex/adapter.test.js.map +1 -0
- package/dist/plugins/agents/codex/index.d.ts +37 -0
- package/dist/plugins/agents/codex/index.d.ts.map +1 -0
- package/dist/plugins/agents/codex/index.js +254 -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/adapter.test.d.ts +2 -0
- package/dist/plugins/agents/opencode/adapter.test.d.ts.map +1 -0
- package/dist/plugins/agents/opencode/adapter.test.js +139 -0
- package/dist/plugins/agents/opencode/adapter.test.js.map +1 -0
- package/dist/plugins/agents/opencode/http-adapter.test.d.ts +2 -0
- package/dist/plugins/agents/opencode/http-adapter.test.d.ts.map +1 -0
- package/dist/plugins/agents/opencode/http-adapter.test.js +492 -0
- package/dist/plugins/agents/opencode/http-adapter.test.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 +138 -0
- package/dist/plugins/agents/opencode/opencode-http-adapter.d.ts.map +1 -0
- package/dist/plugins/agents/opencode/opencode-http-adapter.js +549 -0
- package/dist/plugins/agents/opencode/opencode-http-adapter.js.map +1 -0
- package/dist/plugins/agents/opencode/opencode-stdio-adapter.d.ts +24 -0
- package/dist/plugins/agents/opencode/opencode-stdio-adapter.d.ts.map +1 -0
- package/dist/plugins/agents/opencode/opencode-stdio-adapter.js +103 -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 +190 -0
- package/dist/plugins/agents/opencode/serve-manager.js.map +1 -0
- package/dist/plugins/messengers/discord/discord-adapter.d.ts +22 -0
- package/dist/plugins/messengers/discord/discord-adapter.d.ts.map +1 -0
- package/dist/plugins/messengers/discord/discord-adapter.js +241 -0
- package/dist/plugins/messengers/discord/discord-adapter.js.map +1 -0
- package/dist/plugins/messengers/discord/discord-adapter.test.d.ts +2 -0
- package/dist/plugins/messengers/discord/discord-adapter.test.d.ts.map +1 -0
- package/dist/plugins/messengers/discord/discord-adapter.test.js +332 -0
- package/dist/plugins/messengers/discord/discord-adapter.test.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/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 +33 -0
- package/dist/plugins/messengers/feishu/feishu-adapter.d.ts.map +1 -0
- package/dist/plugins/messengers/feishu/feishu-adapter.js +195 -0
- package/dist/plugins/messengers/feishu/feishu-adapter.js.map +1 -0
- package/dist/plugins/messengers/feishu/feishu-client.d.ts +44 -0
- package/dist/plugins/messengers/feishu/feishu-client.d.ts.map +1 -0
- package/dist/plugins/messengers/feishu/feishu-client.js +120 -0
- package/dist/plugins/messengers/feishu/feishu-client.js.map +1 -0
- package/dist/plugins/messengers/feishu/feishu-dedup.test.d.ts +2 -0
- package/dist/plugins/messengers/feishu/feishu-dedup.test.d.ts.map +1 -0
- package/dist/plugins/messengers/feishu/feishu-dedup.test.js +70 -0
- package/dist/plugins/messengers/feishu/feishu-dedup.test.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 +51 -0
- package/dist/plugins/messengers/telegram/media-download.d.ts.map +1 -0
- package/dist/plugins/messengers/telegram/media-download.js +224 -0
- package/dist/plugins/messengers/telegram/media-download.js.map +1 -0
- package/dist/plugins/messengers/telegram/media-download.test.d.ts +2 -0
- package/dist/plugins/messengers/telegram/media-download.test.d.ts.map +1 -0
- package/dist/plugins/messengers/telegram/media-download.test.js +125 -0
- package/dist/plugins/messengers/telegram/media-download.test.js.map +1 -0
- package/dist/plugins/messengers/telegram/telegram-adapter.d.ts +62 -0
- package/dist/plugins/messengers/telegram/telegram-adapter.d.ts.map +1 -0
- package/dist/plugins/messengers/telegram/telegram-adapter.js +653 -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/ilink-adapter.d.ts +68 -0
- package/dist/plugins/messengers/wechat/ilink-adapter.d.ts.map +1 -0
- package/dist/plugins/messengers/wechat/ilink-adapter.js +483 -0
- package/dist/plugins/messengers/wechat/ilink-adapter.js.map +1 -0
- package/dist/plugins/messengers/wechat/ilink-client.d.ts +66 -0
- package/dist/plugins/messengers/wechat/ilink-client.d.ts.map +1 -0
- package/dist/plugins/messengers/wechat/ilink-client.js +288 -0
- package/dist/plugins/messengers/wechat/ilink-client.js.map +1 -0
- package/dist/plugins/messengers/wechat/ilink-types.d.ts +173 -0
- package/dist/plugins/messengers/wechat/ilink-types.d.ts.map +1 -0
- package/dist/plugins/messengers/wechat/ilink-types.js +12 -0
- package/dist/plugins/messengers/wechat/ilink-types.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 +935 -0
- package/dist/web/public/settings.html +1181 -0
- package/dist/web/public/tasks.html +1827 -0
- package/dist/web/server.d.ts +11 -0
- package/dist/web/server.d.ts.map +1 -0
- package/dist/web/server.js +1820 -0
- package/dist/web/server.js.map +1 -0
- package/package.json +73 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telegram-adapter.js","sourceRoot":"","sources":["../../../../src/plugins/messengers/telegram/telegram-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export interface TelegramConfig {
|
|
2
|
+
botToken: string;
|
|
3
|
+
channelId?: string;
|
|
4
|
+
/** HTTP proxy URL (e.g., http://127.0.0.1:7890) for regions where Telegram is blocked */
|
|
5
|
+
proxy?: string;
|
|
6
|
+
/** When set + non-empty, only Telegram user IDs in this list may resolve
|
|
7
|
+
* approvals via inline-button callbacks. Stringified user_id (TG numeric).
|
|
8
|
+
* If absent or empty, button taps from anyone in the chat are accepted —
|
|
9
|
+
* matches the existing text-reply path's permissiveness, fine for 1:1
|
|
10
|
+
* bots but a real risk in shared groups.
|
|
11
|
+
*
|
|
12
|
+
* Note: this gates BUTTONS only. y/n text replies remain unrestricted to
|
|
13
|
+
* preserve existing behavior; tighten there separately if needed. */
|
|
14
|
+
approvalAllowlist?: string[];
|
|
15
|
+
}
|
|
16
|
+
export interface SendMessageResult {
|
|
17
|
+
message_id: number;
|
|
18
|
+
chat: {
|
|
19
|
+
id: number;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export interface TelegramMessageUpdate {
|
|
23
|
+
update_id: number;
|
|
24
|
+
message?: {
|
|
25
|
+
message_id: number;
|
|
26
|
+
from?: {
|
|
27
|
+
id: number;
|
|
28
|
+
is_bot: boolean;
|
|
29
|
+
first_name: string;
|
|
30
|
+
username?: string;
|
|
31
|
+
};
|
|
32
|
+
chat: {
|
|
33
|
+
id: number;
|
|
34
|
+
type: 'private' | 'group' | 'supergroup' | 'channel';
|
|
35
|
+
title?: string;
|
|
36
|
+
username?: string;
|
|
37
|
+
};
|
|
38
|
+
date: number;
|
|
39
|
+
text?: string;
|
|
40
|
+
entities?: Array<{
|
|
41
|
+
type: string;
|
|
42
|
+
offset: number;
|
|
43
|
+
length: number;
|
|
44
|
+
}>;
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/plugins/messengers/telegram/types.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,yFAAyF;IACzF,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;;;;;;;0EAOsE;IACtE,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAA;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE;QACJ,EAAE,EAAE,MAAM,CAAA;KACX,CAAA;CACF;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE;QACR,UAAU,EAAE,MAAM,CAAA;QAClB,IAAI,CAAC,EAAE;YACL,EAAE,EAAE,MAAM,CAAA;YACV,MAAM,EAAE,OAAO,CAAA;YACf,UAAU,EAAE,MAAM,CAAA;YAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;SAClB,CAAA;QACD,IAAI,EAAE;YACJ,EAAE,EAAE,MAAM,CAAA;YACV,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,YAAY,GAAG,SAAS,CAAA;YACpD,KAAK,CAAC,EAAE,MAAM,CAAA;YACd,QAAQ,CAAC,EAAE,MAAM,CAAA;SAClB,CAAA;QACD,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,QAAQ,CAAC,EAAE,KAAK,CAAC;YACf,IAAI,EAAE,MAAM,CAAA;YACZ,MAAM,EAAE,MAAM,CAAA;YACd,MAAM,EAAE,MAAM,CAAA;SACf,CAAC,CAAA;KACH,CAAA;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/plugins/messengers/telegram/types.ts"],"names":[],"mappings":"AAAA,yBAAyB"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { MessengerAdapter, MessageContext } from '../../../core/types.js';
|
|
2
|
+
import type { Credentials } from './ilink-types.js';
|
|
3
|
+
export declare class ILinkWeChatAdapter implements MessengerAdapter {
|
|
4
|
+
readonly name = "wechat-ilink";
|
|
5
|
+
private client;
|
|
6
|
+
private messageHandler?;
|
|
7
|
+
private isRunning;
|
|
8
|
+
private pollState;
|
|
9
|
+
private contextTokens;
|
|
10
|
+
private typingTickets;
|
|
11
|
+
private processedMessages;
|
|
12
|
+
constructor();
|
|
13
|
+
start(): Promise<void>;
|
|
14
|
+
stop(): Promise<void>;
|
|
15
|
+
onMessage(handler: (ctx: MessageContext) => Promise<void>): void;
|
|
16
|
+
sendMessage(threadId: string, text: string): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Send a "thinking" placeholder. iLink doesn't expose a server-side message
|
|
19
|
+
* recall API, so the placeholder lingers in the chat after the real
|
|
20
|
+
* response arrives — but at least the user gets immediate feedback that
|
|
21
|
+
* the bot received their message and is working on it.
|
|
22
|
+
*/
|
|
23
|
+
sendThinking(threadId: string, text: string): Promise<undefined>;
|
|
24
|
+
sendTyping(threadId: string, isTyping: boolean): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Start QR code login flow
|
|
27
|
+
* Returns QR code URL and token for polling
|
|
28
|
+
*/
|
|
29
|
+
startQRLogin(): Promise<{
|
|
30
|
+
qrUrl: string;
|
|
31
|
+
qrToken: string;
|
|
32
|
+
}>;
|
|
33
|
+
/**
|
|
34
|
+
* Poll QR code status until confirmed or expired
|
|
35
|
+
*/
|
|
36
|
+
waitForQRLogin(qrToken: string, onStatus?: (status: string) => void): Promise<Credentials | null>;
|
|
37
|
+
private startPolling;
|
|
38
|
+
private pollLoop;
|
|
39
|
+
/**
|
|
40
|
+
* Attempt to recover from SESSION_EXPIRED. Tries a fresh getUpdates
|
|
41
|
+
* up to 3 times with linear backoff so a single network blip during
|
|
42
|
+
* recovery doesn't tear down the whole adapter (W-3).
|
|
43
|
+
*/
|
|
44
|
+
private tryRefreshSession;
|
|
45
|
+
/**
|
|
46
|
+
* Periodic keep-alive: probe getconfig instead of getUpdates so we don't
|
|
47
|
+
* race the polling loop on the same long-poll cursor (W-1).
|
|
48
|
+
*/
|
|
49
|
+
private sendHeartbeat;
|
|
50
|
+
private handleIncomingMessage;
|
|
51
|
+
private getContextToken;
|
|
52
|
+
private setContextToken;
|
|
53
|
+
private cleanupProcessedMessages;
|
|
54
|
+
/**
|
|
55
|
+
* L14: drop expired context-token entries. The original implementation
|
|
56
|
+
* only removed an entry on read (`getContextToken` checked TTL), so a
|
|
57
|
+
* userId that messaged once and never came back left its row in the
|
|
58
|
+
* Map indefinitely. Called from the polling loop at the same cadence
|
|
59
|
+
* as cleanupProcessedMessages so memory stays bounded under big group
|
|
60
|
+
* sizes / churning user populations.
|
|
61
|
+
*/
|
|
62
|
+
private cleanupExpiredContextTokens;
|
|
63
|
+
private loadCredentials;
|
|
64
|
+
private saveCredentials;
|
|
65
|
+
private splitMessage;
|
|
66
|
+
}
|
|
67
|
+
export declare const ilinkWeChatAdapter: ILinkWeChatAdapter;
|
|
68
|
+
//# sourceMappingURL=ilink-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ilink-adapter.d.ts","sourceRoot":"","sources":["../../../../src/plugins/messengers/wechat/ilink-adapter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAW,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAEvF,OAAO,KAAK,EAAE,WAAW,EAAoC,MAAM,kBAAkB,CAAA;AAgBrF,qBAAa,kBAAmB,YAAW,gBAAgB;IACzD,QAAQ,CAAC,IAAI,kBAAiB;IAC9B,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,cAAc,CAAC,CAAwC;IAC/D,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,SAAS,CAIhB;IACD,OAAO,CAAC,aAAa,CAAuC;IAC5D,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,iBAAiB,CAA4B;;IAU/C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAU3B,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAI1D,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiChE;;;;;OAKG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAShE,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAoCpE;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAQjE;;OAEG;IACG,cAAc,CAClB,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAClC,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAoD9B,OAAO,CAAC,YAAY;YAON,QAAQ;IAqFtB;;;;OAIG;YACW,iBAAiB;IA6B/B;;;OAGG;YACW,aAAa;YAUb,qBAAqB;IAwEnC,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,wBAAwB;IAShC;;;;;;;OAOG;IACH,OAAO,CAAC,2BAA2B;YAarB,eAAe;YAsBf,eAAe;IAe7B,OAAO,CAAC,YAAY;CAgCrB;AAGD,eAAO,MAAM,kBAAkB,oBAA2B,CAAA"}
|
|
@@ -0,0 +1,483 @@
|
|
|
1
|
+
// WeChat iLink Bot API Adapter
|
|
2
|
+
// Implements MessengerAdapter using the iLink HTTP API
|
|
3
|
+
import { ILinkClient } from './ilink-client.js';
|
|
4
|
+
import { ILINK_ERRORS } from './ilink-types.js';
|
|
5
|
+
import { homedir } from 'os';
|
|
6
|
+
import { join } from 'path';
|
|
7
|
+
import { readFile, writeFile, mkdir, stat } from 'fs/promises';
|
|
8
|
+
import { logger as rootLogger } from '../../../core/logger.js';
|
|
9
|
+
import { Backoff } from '../../../utils/backoff.js';
|
|
10
|
+
const log = rootLogger.child({ component: 'wechat-ilink' });
|
|
11
|
+
const CREDENTIALS_FILE = join(homedir(), '.im-hub', 'wechat-credentials.json');
|
|
12
|
+
const POLL_TIMEOUT = 30000; // 30 seconds
|
|
13
|
+
const CONTEXT_TOKEN_TTL = 30 * 60 * 1000; // 30 minutes
|
|
14
|
+
const PROCESSED_MESSAGES_TTL = 60 * 1000; // 1 minute
|
|
15
|
+
export class ILinkWeChatAdapter {
|
|
16
|
+
name = 'wechat-ilink';
|
|
17
|
+
client;
|
|
18
|
+
messageHandler;
|
|
19
|
+
isRunning = false;
|
|
20
|
+
pollState = {
|
|
21
|
+
getUpdatesBuf: '',
|
|
22
|
+
isPolling: false,
|
|
23
|
+
lastPollTime: 0,
|
|
24
|
+
};
|
|
25
|
+
contextTokens = new Map();
|
|
26
|
+
typingTickets = new Map();
|
|
27
|
+
processedMessages = new Map(); // message_id -> timestamp
|
|
28
|
+
constructor() {
|
|
29
|
+
this.client = new ILinkClient();
|
|
30
|
+
}
|
|
31
|
+
// ============================================
|
|
32
|
+
// Lifecycle
|
|
33
|
+
// ============================================
|
|
34
|
+
async start() {
|
|
35
|
+
// Load saved credentials
|
|
36
|
+
const credentials = await this.loadCredentials();
|
|
37
|
+
if (credentials) {
|
|
38
|
+
this.client.setCredentials(credentials);
|
|
39
|
+
log.info('Credentials loaded from cache');
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
throw new Error('No WeChat credentials found. Run "im-hub config wechat" first.');
|
|
43
|
+
}
|
|
44
|
+
this.isRunning = true;
|
|
45
|
+
log.info('WeChat iLink adapter started');
|
|
46
|
+
// Start polling in background
|
|
47
|
+
this.startPolling();
|
|
48
|
+
}
|
|
49
|
+
async stop() {
|
|
50
|
+
this.isRunning = false;
|
|
51
|
+
this.client.clearCredentials();
|
|
52
|
+
log.info('WeChat iLink adapter stopped');
|
|
53
|
+
}
|
|
54
|
+
// ============================================
|
|
55
|
+
// Message Handling
|
|
56
|
+
// ============================================
|
|
57
|
+
onMessage(handler) {
|
|
58
|
+
this.messageHandler = handler;
|
|
59
|
+
}
|
|
60
|
+
async sendMessage(threadId, text) {
|
|
61
|
+
if (!this.client.hasCredentials()) {
|
|
62
|
+
throw new Error('WeChat adapter not authenticated');
|
|
63
|
+
}
|
|
64
|
+
// Extract user ID from threadId (format: user:xxx or room:xxx)
|
|
65
|
+
const userId = threadId.replace(/^(user|room):/, '');
|
|
66
|
+
// Get context token for this user
|
|
67
|
+
const contextToken = this.getContextToken(userId);
|
|
68
|
+
if (!contextToken) {
|
|
69
|
+
throw new Error('No context token available for this user');
|
|
70
|
+
}
|
|
71
|
+
// Split long messages
|
|
72
|
+
const chunks = this.splitMessage(text);
|
|
73
|
+
for (const chunk of chunks) {
|
|
74
|
+
const response = await this.client.sendMessage(userId, chunk, contextToken);
|
|
75
|
+
if (response.ret !== 0 && response.ret !== undefined) {
|
|
76
|
+
if (response.ret === ILINK_ERRORS.SESSION_EXPIRED) {
|
|
77
|
+
throw new Error('WeChat session expired. Please re-login.');
|
|
78
|
+
}
|
|
79
|
+
throw new Error(`Failed to send message: ${response.errmsg || response.ret}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// ============================================
|
|
84
|
+
// Typing Indicator
|
|
85
|
+
// ============================================
|
|
86
|
+
/**
|
|
87
|
+
* Send a "thinking" placeholder. iLink doesn't expose a server-side message
|
|
88
|
+
* recall API, so the placeholder lingers in the chat after the real
|
|
89
|
+
* response arrives — but at least the user gets immediate feedback that
|
|
90
|
+
* the bot received their message and is working on it.
|
|
91
|
+
*/
|
|
92
|
+
async sendThinking(threadId, text) {
|
|
93
|
+
try {
|
|
94
|
+
await this.sendMessage(threadId, text);
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
log.debug({ err: String(err) }, 'Failed to send thinking placeholder');
|
|
98
|
+
}
|
|
99
|
+
return undefined; // no dismiss — recall not supported on iLink
|
|
100
|
+
}
|
|
101
|
+
async sendTyping(threadId, isTyping) {
|
|
102
|
+
if (!this.client.hasCredentials()) {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
// Extract user ID from threadId (format: user:xxx or room:xxx)
|
|
106
|
+
const userId = threadId.replace(/^(user|room):/, '');
|
|
107
|
+
// Get or fetch typing ticket
|
|
108
|
+
let typingTicket = this.typingTickets.get(userId);
|
|
109
|
+
if (!typingTicket) {
|
|
110
|
+
const contextToken = this.getContextToken(userId);
|
|
111
|
+
const ticket = await this.client.getTypingTicket(userId, contextToken ?? undefined);
|
|
112
|
+
if (!ticket) {
|
|
113
|
+
log.warn({ userId }, 'Could not get typing ticket');
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
typingTicket = ticket;
|
|
117
|
+
this.typingTickets.set(userId, ticket);
|
|
118
|
+
}
|
|
119
|
+
// Send typing status (1 = start, 2 = stop)
|
|
120
|
+
const status = isTyping ? 1 : 2;
|
|
121
|
+
const success = await this.client.sendTyping(userId, typingTicket, status);
|
|
122
|
+
if (!success) {
|
|
123
|
+
// Ticket might be expired, clear it for next attempt
|
|
124
|
+
this.typingTickets.delete(userId);
|
|
125
|
+
log.warn({ userId }, 'Failed to send typing indicator, cleared ticket');
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// ============================================
|
|
129
|
+
// QR Code Login
|
|
130
|
+
// ============================================
|
|
131
|
+
/**
|
|
132
|
+
* Start QR code login flow
|
|
133
|
+
* Returns QR code URL and token for polling
|
|
134
|
+
*/
|
|
135
|
+
async startQRLogin() {
|
|
136
|
+
const response = await this.client.getQRCode();
|
|
137
|
+
return {
|
|
138
|
+
qrUrl: response.qrcode_img_content,
|
|
139
|
+
qrToken: response.qrcode,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Poll QR code status until confirmed or expired
|
|
144
|
+
*/
|
|
145
|
+
async waitForQRLogin(qrToken, onStatus) {
|
|
146
|
+
const maxAttempts = 120; // 2 minutes with 1s interval
|
|
147
|
+
let attempts = 0;
|
|
148
|
+
while (attempts < maxAttempts) {
|
|
149
|
+
const status = await this.client.getQRCodeStatus(qrToken);
|
|
150
|
+
switch (status.status) {
|
|
151
|
+
case 'wait':
|
|
152
|
+
onStatus?.('Waiting for scan...');
|
|
153
|
+
break;
|
|
154
|
+
case 'scaned':
|
|
155
|
+
onStatus?.('QR code scanned! Waiting for confirmation...');
|
|
156
|
+
break;
|
|
157
|
+
case 'confirmed':
|
|
158
|
+
if (status.bot_token && status.ilink_bot_id && status.ilink_user_id) {
|
|
159
|
+
const credentials = {
|
|
160
|
+
bot_token: status.bot_token,
|
|
161
|
+
baseUrl: status.baseurl || 'https://ilinkai.weixin.qq.com',
|
|
162
|
+
accountId: status.ilink_bot_id,
|
|
163
|
+
userId: status.ilink_user_id,
|
|
164
|
+
savedAt: new Date().toISOString(),
|
|
165
|
+
};
|
|
166
|
+
// Save credentials
|
|
167
|
+
await this.saveCredentials(credentials);
|
|
168
|
+
this.client.setCredentials(credentials);
|
|
169
|
+
onStatus?.('Login successful!');
|
|
170
|
+
return credentials;
|
|
171
|
+
}
|
|
172
|
+
break;
|
|
173
|
+
case 'expired':
|
|
174
|
+
onStatus?.('QR code expired');
|
|
175
|
+
return null;
|
|
176
|
+
}
|
|
177
|
+
// Wait 1 second before next poll
|
|
178
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
179
|
+
attempts++;
|
|
180
|
+
}
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
// ============================================
|
|
184
|
+
// Polling
|
|
185
|
+
// ============================================
|
|
186
|
+
startPolling() {
|
|
187
|
+
if (this.pollState.isPolling)
|
|
188
|
+
return;
|
|
189
|
+
this.pollState.isPolling = true;
|
|
190
|
+
this.pollLoop();
|
|
191
|
+
}
|
|
192
|
+
async pollLoop() {
|
|
193
|
+
log.info('Polling started');
|
|
194
|
+
let consecutiveFailures = 0;
|
|
195
|
+
let lastHeartbeatTime = Date.now();
|
|
196
|
+
const HEARTBEAT_INTERVAL_MS = 60 * 1000; // 60 seconds
|
|
197
|
+
// M9: shared exponential-with-jitter helper. The previous inline
|
|
198
|
+
// `1000 * Math.pow(2, n - 1)` was deterministic, so a fleet of im-hub
|
|
199
|
+
// instances recovering from a shared network event would all
|
|
200
|
+
// reconnect in lock-step. Backoff(jitter=0.5) spreads the storm
|
|
201
|
+
// across a ±50% window without changing the underlying cadence.
|
|
202
|
+
// Base 2_000 / cap 30_000 preserves the prior schedule's ballpark
|
|
203
|
+
// (2s, 4s, 8s, 16s, 30s capped) — first failure still has no
|
|
204
|
+
// extra wait via the `consecutiveFailures > 1` gate below.
|
|
205
|
+
const backoff = new Backoff({ baseMs: 2_000, capMs: 30_000, jitter: 0.5 });
|
|
206
|
+
while (this.isRunning) {
|
|
207
|
+
try {
|
|
208
|
+
const response = await this.client.getUpdates(this.pollState.getUpdatesBuf);
|
|
209
|
+
// Success — reset failure counter and backoff
|
|
210
|
+
consecutiveFailures = 0;
|
|
211
|
+
backoff.reset();
|
|
212
|
+
if (response.msgs?.length) {
|
|
213
|
+
log.debug({ count: response.msgs.length }, 'Received messages');
|
|
214
|
+
}
|
|
215
|
+
const isSuccess = response.ret === 0 || response.ret === undefined;
|
|
216
|
+
if (isSuccess) {
|
|
217
|
+
this.pollState.getUpdatesBuf = response.get_updates_buf;
|
|
218
|
+
if (response.msgs) {
|
|
219
|
+
for (const msg of response.msgs) {
|
|
220
|
+
this.handleIncomingMessage(msg).catch(err => log.error({ err: err instanceof Error ? err.message : String(err) }, 'Message handler error'));
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
else if (response.ret === ILINK_ERRORS.SESSION_EXPIRED) {
|
|
225
|
+
log.warn('WeChat session expired, attempting recovery...');
|
|
226
|
+
const recovered = await this.tryRefreshSession();
|
|
227
|
+
if (!recovered) {
|
|
228
|
+
log.error('WeChat session expired. Token refresh failed after retries — polling stopped.');
|
|
229
|
+
this.isRunning = false;
|
|
230
|
+
break;
|
|
231
|
+
}
|
|
232
|
+
log.info('Token refreshed successfully, resuming polling');
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
log.warn({ ret: response.ret }, 'Unexpected getUpdates response code');
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
catch (err) {
|
|
239
|
+
const errMsg = err instanceof Error ? err.message : String(err);
|
|
240
|
+
consecutiveFailures++;
|
|
241
|
+
log.error({ err: errMsg, consecutiveFailures }, 'Poll error');
|
|
242
|
+
// First failure: no extra wait, just the regular 1s tail sleep.
|
|
243
|
+
// From the second consecutive failure on, draw the next delay
|
|
244
|
+
// from the jittered exponential schedule (2s/4s/8s/16s/30s ±50%).
|
|
245
|
+
if (consecutiveFailures > 1) {
|
|
246
|
+
const delayMs = backoff.nextDelayMs();
|
|
247
|
+
log.warn({ delayMs }, `Backing off after ${consecutiveFailures} consecutive failures`);
|
|
248
|
+
await new Promise((resolve) => setTimeout(resolve, delayMs));
|
|
249
|
+
continue;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
// Periodic heartbeat: getconfig probe (no side effect on the
|
|
253
|
+
// long-poll cursor, so it's safe to run alongside the loop).
|
|
254
|
+
if (Date.now() - lastHeartbeatTime >= HEARTBEAT_INTERVAL_MS) {
|
|
255
|
+
lastHeartbeatTime = Date.now();
|
|
256
|
+
this.sendHeartbeat().catch(err => log.warn({ err: err instanceof Error ? err.message : String(err) }, 'Heartbeat error'));
|
|
257
|
+
// L14: piggyback context-token sweep on the heartbeat tick (1/min).
|
|
258
|
+
// Cheap full scan — bounded by active user count.
|
|
259
|
+
this.cleanupExpiredContextTokens();
|
|
260
|
+
}
|
|
261
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
262
|
+
}
|
|
263
|
+
this.pollState.isPolling = false;
|
|
264
|
+
log.info('Polling stopped');
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Attempt to recover from SESSION_EXPIRED. Tries a fresh getUpdates
|
|
268
|
+
* up to 3 times with linear backoff so a single network blip during
|
|
269
|
+
* recovery doesn't tear down the whole adapter (W-3).
|
|
270
|
+
*/
|
|
271
|
+
async tryRefreshSession() {
|
|
272
|
+
const MAX_ATTEMPTS = 3;
|
|
273
|
+
for (let attempt = 1; attempt <= MAX_ATTEMPTS; attempt++) {
|
|
274
|
+
try {
|
|
275
|
+
const response = await this.client.getUpdates('');
|
|
276
|
+
if (response.ret === 0 || response.ret === undefined) {
|
|
277
|
+
this.pollState.getUpdatesBuf = response.get_updates_buf;
|
|
278
|
+
if (response.msgs) {
|
|
279
|
+
for (const msg of response.msgs) {
|
|
280
|
+
if (msg.from_user_id && msg.context_token) {
|
|
281
|
+
this.setContextToken(msg.from_user_id, msg.context_token);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
log.info({ attempt }, 'Session recovered after SESSION_EXPIRED');
|
|
286
|
+
return true;
|
|
287
|
+
}
|
|
288
|
+
log.warn({ attempt, ret: response.ret }, 'Session refresh attempt returned error');
|
|
289
|
+
}
|
|
290
|
+
catch (err) {
|
|
291
|
+
log.warn({ attempt, err: err instanceof Error ? err.message : String(err) }, 'Session refresh attempt threw');
|
|
292
|
+
}
|
|
293
|
+
if (attempt < MAX_ATTEMPTS) {
|
|
294
|
+
await new Promise((resolve) => setTimeout(resolve, attempt * 5_000)); // 5s, 10s
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
return false;
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Periodic keep-alive: probe getconfig instead of getUpdates so we don't
|
|
301
|
+
* race the polling loop on the same long-poll cursor (W-1).
|
|
302
|
+
*/
|
|
303
|
+
async sendHeartbeat() {
|
|
304
|
+
if (!this.client.hasCredentials())
|
|
305
|
+
return;
|
|
306
|
+
const ok = await this.client.pingConfig();
|
|
307
|
+
if (ok) {
|
|
308
|
+
log.debug('Heartbeat OK');
|
|
309
|
+
}
|
|
310
|
+
else {
|
|
311
|
+
log.warn('Heartbeat failed (getconfig returned non-OK)');
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
async handleIncomingMessage(msg) {
|
|
315
|
+
log.debug({ messageId: msg.message_id, type: msg.message_type }, 'handleIncomingMessage');
|
|
316
|
+
if (!this.messageHandler) {
|
|
317
|
+
log.warn('No message handler registered');
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
if (msg.message_type === 2) {
|
|
321
|
+
log.debug('Skipping bot message');
|
|
322
|
+
return;
|
|
323
|
+
}
|
|
324
|
+
const msgId = String(msg.message_id);
|
|
325
|
+
if (msgId && this.processedMessages.has(msgId)) {
|
|
326
|
+
log.debug({ messageId: msgId }, 'Skipping duplicate message');
|
|
327
|
+
return;
|
|
328
|
+
}
|
|
329
|
+
if (msgId) {
|
|
330
|
+
this.processedMessages.set(msgId, Date.now());
|
|
331
|
+
this.cleanupProcessedMessages();
|
|
332
|
+
}
|
|
333
|
+
if (!msg.item_list?.length) {
|
|
334
|
+
log.debug('No item_list in message');
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
const textItems = msg.item_list.filter((item) => item.type === 1 && item.text_item?.text);
|
|
338
|
+
if (!textItems.length) {
|
|
339
|
+
log.debug('No text items found');
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
const text = textItems.map((item) => item.text_item.text).join('\n');
|
|
343
|
+
log.debug({
|
|
344
|
+
text,
|
|
345
|
+
fromUserId: msg.from_user_id,
|
|
346
|
+
contextToken: msg.context_token ? 'present' : 'missing',
|
|
347
|
+
}, 'Extracted message');
|
|
348
|
+
// Store context token for replies
|
|
349
|
+
if (msg.from_user_id && msg.context_token) {
|
|
350
|
+
this.setContextToken(msg.from_user_id, msg.context_token);
|
|
351
|
+
}
|
|
352
|
+
// Build message object - use accountId as channelId
|
|
353
|
+
const message = {
|
|
354
|
+
id: String(msg.message_id || Date.now()),
|
|
355
|
+
threadId: msg.group_id ? `room:${msg.group_id}` : `user:${msg.from_user_id}`,
|
|
356
|
+
userId: msg.from_user_id || 'unknown',
|
|
357
|
+
text,
|
|
358
|
+
timestamp: new Date(msg.create_time_ms || Date.now()),
|
|
359
|
+
channelId: this.client.getCredentials()?.accountId || 'default',
|
|
360
|
+
};
|
|
361
|
+
const ctx = {
|
|
362
|
+
message,
|
|
363
|
+
platform: 'wechat',
|
|
364
|
+
channelId: this.client.getCredentials()?.accountId || 'default',
|
|
365
|
+
};
|
|
366
|
+
log.debug('Calling message handler');
|
|
367
|
+
await this.messageHandler(ctx);
|
|
368
|
+
log.debug('Message handler completed');
|
|
369
|
+
}
|
|
370
|
+
// ============================================
|
|
371
|
+
// Context Token Management
|
|
372
|
+
// ============================================
|
|
373
|
+
getContextToken(userId) {
|
|
374
|
+
const cached = this.contextTokens.get(userId);
|
|
375
|
+
if (!cached)
|
|
376
|
+
return null;
|
|
377
|
+
// Check if expired
|
|
378
|
+
if (Date.now() - cached.timestamp > CONTEXT_TOKEN_TTL) {
|
|
379
|
+
this.contextTokens.delete(userId);
|
|
380
|
+
return null;
|
|
381
|
+
}
|
|
382
|
+
return cached.contextToken;
|
|
383
|
+
}
|
|
384
|
+
setContextToken(userId, token) {
|
|
385
|
+
this.contextTokens.set(userId, {
|
|
386
|
+
userId,
|
|
387
|
+
contextToken: token,
|
|
388
|
+
timestamp: Date.now(),
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
cleanupProcessedMessages() {
|
|
392
|
+
const now = Date.now();
|
|
393
|
+
for (const [msgId, timestamp] of this.processedMessages) {
|
|
394
|
+
if (now - timestamp > PROCESSED_MESSAGES_TTL) {
|
|
395
|
+
this.processedMessages.delete(msgId);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* L14: drop expired context-token entries. The original implementation
|
|
401
|
+
* only removed an entry on read (`getContextToken` checked TTL), so a
|
|
402
|
+
* userId that messaged once and never came back left its row in the
|
|
403
|
+
* Map indefinitely. Called from the polling loop at the same cadence
|
|
404
|
+
* as cleanupProcessedMessages so memory stays bounded under big group
|
|
405
|
+
* sizes / churning user populations.
|
|
406
|
+
*/
|
|
407
|
+
cleanupExpiredContextTokens() {
|
|
408
|
+
const now = Date.now();
|
|
409
|
+
for (const [userId, cached] of this.contextTokens) {
|
|
410
|
+
if (now - cached.timestamp > CONTEXT_TOKEN_TTL) {
|
|
411
|
+
this.contextTokens.delete(userId);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
// ============================================
|
|
416
|
+
// Credentials Persistence
|
|
417
|
+
// ============================================
|
|
418
|
+
async loadCredentials() {
|
|
419
|
+
try {
|
|
420
|
+
const data = await readFile(CREDENTIALS_FILE, 'utf-8');
|
|
421
|
+
// Defense in depth: nag in logs if the file isn't 0o600. We can't
|
|
422
|
+
// safely chmod it on the user's behalf at load time (concurrent ops,
|
|
423
|
+
// odd ownership) but the warning prompts an operator to fix legacy
|
|
424
|
+
// credentials files written before H9.
|
|
425
|
+
try {
|
|
426
|
+
const st = await stat(CREDENTIALS_FILE);
|
|
427
|
+
if (process.platform !== 'win32' && (st.mode & 0o077) !== 0) {
|
|
428
|
+
log.warn({
|
|
429
|
+
file: CREDENTIALS_FILE,
|
|
430
|
+
mode: (st.mode & 0o777).toString(8),
|
|
431
|
+
}, 'Credentials file is group/world readable — chmod 600 recommended');
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
catch { /* stat failure is non-fatal */ }
|
|
435
|
+
return JSON.parse(data);
|
|
436
|
+
}
|
|
437
|
+
catch {
|
|
438
|
+
return null;
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
async saveCredentials(credentials) {
|
|
442
|
+
const dir = join(CREDENTIALS_FILE, '..');
|
|
443
|
+
// Restrict the parent dir to the current user. recursive:true is a no-op
|
|
444
|
+
// when the dir already exists with looser perms — accept that compromise
|
|
445
|
+
// (we don't want to chmod existing dirs out from under the operator) and
|
|
446
|
+
// rely on the file-level 0o600 below as the primary line of defense.
|
|
447
|
+
await mkdir(dir, { recursive: true, mode: 0o700 });
|
|
448
|
+
await writeFile(CREDENTIALS_FILE, JSON.stringify(credentials, null, 2), { mode: 0o600 });
|
|
449
|
+
log.info({ file: CREDENTIALS_FILE }, 'Credentials saved');
|
|
450
|
+
}
|
|
451
|
+
// ============================================
|
|
452
|
+
// Utilities
|
|
453
|
+
// ============================================
|
|
454
|
+
splitMessage(text, maxLength = 2000) {
|
|
455
|
+
if (text.length <= maxLength) {
|
|
456
|
+
return [text];
|
|
457
|
+
}
|
|
458
|
+
const chunks = [];
|
|
459
|
+
let remaining = text;
|
|
460
|
+
while (remaining.length > maxLength) {
|
|
461
|
+
// Try to split at newline
|
|
462
|
+
let splitPoint = remaining.lastIndexOf('\n', maxLength);
|
|
463
|
+
if (splitPoint < maxLength / 2) {
|
|
464
|
+
splitPoint = maxLength;
|
|
465
|
+
}
|
|
466
|
+
chunks.push(remaining.slice(0, splitPoint));
|
|
467
|
+
remaining = remaining.slice(splitPoint).trim();
|
|
468
|
+
}
|
|
469
|
+
if (remaining) {
|
|
470
|
+
chunks.push(remaining);
|
|
471
|
+
}
|
|
472
|
+
// Add continuation markers
|
|
473
|
+
if (chunks.length > 1) {
|
|
474
|
+
for (let i = 0; i < chunks.length - 1; i++) {
|
|
475
|
+
chunks[i] += '\n\n[continued...]';
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
return chunks;
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
// Singleton instance
|
|
482
|
+
export const ilinkWeChatAdapter = new ILinkWeChatAdapter();
|
|
483
|
+
//# sourceMappingURL=ilink-adapter.js.map
|