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
package/README.zh-CN.md
ADDED
|
@@ -0,0 +1,496 @@
|
|
|
1
|
+
# im-hub-pro
|
|
2
|
+
|
|
3
|
+
[English](README.md)
|
|
4
|
+
|
|
5
|
+
**IM 到 AI Agent 的万能桥梁** — 将微信 / 飞书 / Telegram / **Discord** 接入 Claude Code / Codex / Copilot / OpenCode,**或通过 ACP 接入任意自定义 Agent**。单 Node.js 进程,无需 Docker / Redis;自带浏览器仪表盘、持久化任务、多租户工作区,IM 端真正的"工具调用人审"。
|
|
6
|
+
|
|
7
|
+
> 原 [`im-hub`](https://www.npmjs.com/package/im-hub) 包的产品化分支。落盘配置(`~/.im-hub/`)、环境变量(`IMHUB_*`)、HTTP 头(`X-IM-Hub-Token`)保持不变 —— 老部署可以无缝切换,详见下方[迁移指南](#从-im-hub-迁移)。
|
|
8
|
+
|
|
9
|
+
## 0.2.13 → 0.2.23 主要升级
|
|
10
|
+
|
|
11
|
+
- **Discord 适配器**(基于 `discord.js` 的 Gateway WebSocket)
|
|
12
|
+
- **工具调用人审(HITL)** — Claude 调工具时自动暂停,IM 同一会话回复 `y`/`n` 即可,**或在 Web 对话界面点弹出的审批卡**
|
|
13
|
+
- **任务仪表盘** `/tasks`,标签覆盖 **Jobs · Background · Subtasks · Schedules · Approvals · Health · Files · Audit**(每个 tab 支持 agent 过滤、Jobs 多选批量、SSE 实时刷新)
|
|
14
|
+
- **多租户 Workspace** — 每个工作区独立的 Agent 白名单 + 限流,**Settings 页加完整 CRUD UI**;`/job` `/schedule` `/audit` 命令也按 creator/workspace 隔离(每个用户只看到自己的)
|
|
15
|
+
- **ACP Server 模式** — im-hub-pro 自身作为 ACP 兼容 Agent(`POST /tasks`,sync + SSE)
|
|
16
|
+
- **持久化 Job Board** + Cron 调度器(SQLite 落地,重启不丢,30 天自动修剪)
|
|
17
|
+
- **智能路由**:意图分类(中英文)、断路器、Sticky 会话
|
|
18
|
+
- **结构化日志**(`pino`)+ 全链路 `traceId` + 审计日志 + Prometheus `/api/metrics`
|
|
19
|
+
- **三态主题**(浅色 / 深色 / 跟随系统),所有页面在首屏前同步应用,无闪烁
|
|
20
|
+
- **v0.2.16 — 安全收口(P0 + P1)**:REST/WS token 常量时比较、Schedule `notify_url` SSRF 防护、日志级别 secret redact、approval socket 路径熵 + 权限校验、`Session.addMessage` per-key 互斥
|
|
21
|
+
- **v0.2.17 — 可观测 + IM 文本边界(P2 + P3)**:静态页 CSP / `X-Frame-Options` / `X-Content-Type-Options`,WebSocket 连接上限 + 背压,Prometheus 标签基数白名单,新增 counter(`im_hub_audit_prune_failed_total` / `im_hub_agent_cleanup_failed_total` / `im_hub_approval_*`),UTF-16 代理对安全切分,auto-allow 指纹 5 → 10 字符,SIGINT 关停时 SQLite WAL 干净 checkpoint
|
|
22
|
+
- **v0.2.18 — IM 重连退避(M9)**:抽公共 `Backoff` 助手(指数 + ±50% jitter),替换 Telegram + WeChat polling 的固定 2s / 5s 重连间隔;多实例从同一次网络抖动恢复时不再锁步打 IM 平台
|
|
23
|
+
- **v0.2.19 — Codex sandbox + Dashboard 过滤 / Audit tab**:codex 接入 `session.planMode`(默认 sandbox 改为显式 `-s workspace-write`,关闭 auto-approval);Jobs/Subtasks/Schedules tab 加 agent 过滤;新增 Audit tab 把 SQLite 审计日志拉到 UI
|
|
24
|
+
- **v0.2.20 — Web 控制台 PR-A**:三态主题管理 + 全局错误边界 + 对话内审批卡(在 Web 聊天界面直接 Allow / Deny / Allow + Auto)
|
|
25
|
+
- **v0.2.21 — Web 控制台 PR-B**:Health tab(每个 agent 的 breaker / 限流余量 / p50/95/99 / sparkline)+ Approvals tab(浏览并解决所有 pending HITL 审批)
|
|
26
|
+
- **v0.2.22 — Web 控制台 PR-C**:SSE 事件流(`/events`)替代轮询,audit / approval / job / metrics 实时推送;Settings 页加 Workspace 完整 CRUD UI
|
|
27
|
+
- **v0.2.23 — Web 控制台 PR-D**:Files tab 只读浏览 `~/.im-hub-workspaces/<agent>/`;Jobs tab 多选 + 批量取消/重跑;Settings 页 header / 容器重新调整布局
|
|
28
|
+
|
|
29
|
+
完整变更见 [CHANGELOG.md](CHANGELOG.md)。
|
|
30
|
+
|
|
31
|
+
## Web 对话与任务仪表盘
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
im-hub-pro start # 启动后访问 http://localhost:3000
|
|
35
|
+
# / 对话(支持对话内审批卡)
|
|
36
|
+
# /tasks jobs · background · subtasks · schedules
|
|
37
|
+
# · approvals · health · files · audit
|
|
38
|
+
# /settings Agent · 通道 · ACP · 工作区
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
- WebSocket 实时流式响应;**仪表盘走 SSE `/events`** 推送(audit / approval / job / metrics)
|
|
42
|
+
- Agent 切换与对话历史
|
|
43
|
+
- **三态主题**(浅色 / 深色 / 跟随系统),按 tab 持久化 + 全局错误边界
|
|
44
|
+
- 中英双语界面,自动检测浏览器语言
|
|
45
|
+
- `/tasks` 同时展示持久化任务、cron 调度、**`~/.claude/bgjobs`** + **`~/.config/opencode/bgjobs`** + **`~/.codex/bgjobs`** 的后台任务(可用 `IMHUB_BGJOB_ROOTS` 覆盖)、所有会话的 subtask 平铺、agent 健康(breaker · 限流 · p50/95/99 · sparkline)、待审批列表(浏览器直接处理)以及 `~/.im-hub-workspaces/<agent>/` 的只读文件浏览器
|
|
46
|
+
|
|
47
|
+
## 核心特性
|
|
48
|
+
|
|
49
|
+
- **多路复用** — 一个实例同时对接多个 IM 与多个 Agent
|
|
50
|
+
- **自定义 Agent 接入** — 通过 [ACP 协议](https://agentcommunicationprotocol.dev) 接入任何 HTTP 端点;支持 `/.well-known/acp` 自动发现
|
|
51
|
+
- **内置 IM 通道** — 微信(iLink)、飞书(WebSocket 长连接)、Telegram(grammy)、**Discord**(discord.js)
|
|
52
|
+
- **内置 Agent** — Claude Code、Codex、Copilot、OpenCode(统一 `AgentBase` 适配)
|
|
53
|
+
- **插件架构** — 轻松扩展新 IM / Agent
|
|
54
|
+
- **原生 TypeScript** — 无需 Go / Docker / Redis
|
|
55
|
+
- **JSONL 流式输出** — 真实流式 + 多字节 UTF-8 安全
|
|
56
|
+
|
|
57
|
+
## 安装
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
npm install -g im-hub-pro
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
需要 **Node.js ≥ 18**(生产推荐 ≥ 22 LTS,详见 [`docs/deployment.md`](docs/deployment.md))。
|
|
64
|
+
|
|
65
|
+
### 从 `im-hub` 迁移
|
|
66
|
+
|
|
67
|
+
`~/.im-hub/` 配置目录、`IMHUB_*` 环境变量、`X-IM-Hub-Token` 请求头、ACP 协议标识(`im-hub-gateway`)全部保持不变 —— 这是纯品牌改名。
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
npm uninstall -g im-hub
|
|
71
|
+
npm install -g im-hub-pro
|
|
72
|
+
im-hub-pro start
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## 快速开始
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
# 1. 配置至少一个 IM
|
|
79
|
+
im-hub-pro config wechat # 扫码登录
|
|
80
|
+
im-hub-pro config feishu # 飞书 App ID + Secret,无需 webhook
|
|
81
|
+
im-hub-pro config telegram # @BotFather 拿 Token
|
|
82
|
+
im-hub-pro config discord # Bot Token,详见 docs/discord-setup.md
|
|
83
|
+
|
|
84
|
+
# 2. (可选)配置 Agent CLI,多数能自动检测
|
|
85
|
+
im-hub-pro config claude
|
|
86
|
+
|
|
87
|
+
# 3. (可选)通过 ACP 接入远端自定义 Agent
|
|
88
|
+
im-hub-pro config agent
|
|
89
|
+
|
|
90
|
+
# 4. 启动
|
|
91
|
+
im-hub-pro start
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### 飞书(WebSocket 长连接)
|
|
95
|
+
|
|
96
|
+
- ✅ 无需 webhook
|
|
97
|
+
- ✅ 无需公网 IP / 域名
|
|
98
|
+
- ✅ 无需 ngrok 内网穿透
|
|
99
|
+
- ✅ 直接从本地启动
|
|
100
|
+
|
|
101
|
+
### Discord
|
|
102
|
+
|
|
103
|
+
完整流程(创建 Bot、Intents、OAuth 邀请)见 [`docs/discord-setup.md`](docs/discord-setup.md)。
|
|
104
|
+
|
|
105
|
+
### 接入你自己的 Agent
|
|
106
|
+
|
|
107
|
+
im-hub-pro 支持 **ACP(Agent Communication Protocol)**,只要你的 Agent 暴露一个标准 HTTP 端点就能接入——业务机器人、内部工具、云服务,皆可。
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
im-hub-pro config agent
|
|
111
|
+
# 交互式:名称、端点、认证(无 / Bearer / API Key),自动验证连接 + /.well-known/acp 自动发现
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
接入后用法和内置 Agent 一致:
|
|
115
|
+
|
|
116
|
+
```
|
|
117
|
+
/myagent 分析一下一季度的销售报告
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### 把 im-hub-pro 当作 Agent 用
|
|
121
|
+
|
|
122
|
+
im-hub-pro 同时暴露 ACP 服务端,任何 ACP 客户端都可以以 `POST http://localhost:3000/tasks`(同步)或加 `?mode=stream`(SSE)调用,鉴权同 Web Token:`Authorization: Bearer <token>`。
|
|
123
|
+
|
|
124
|
+
## CLI 命令
|
|
125
|
+
|
|
126
|
+
```
|
|
127
|
+
im-hub-pro # 等同 start
|
|
128
|
+
im-hub-pro start # 启动桥接 + Web UI
|
|
129
|
+
im-hub-pro config wechat # 配置微信
|
|
130
|
+
im-hub-pro config feishu # 配置飞书
|
|
131
|
+
im-hub-pro config telegram # 配置 Telegram
|
|
132
|
+
im-hub-pro config discord # 配置 Discord
|
|
133
|
+
im-hub-pro config claude # 配置 Claude Code
|
|
134
|
+
im-hub-pro config agent # 接入自定义 ACP Agent
|
|
135
|
+
im-hub-pro agents # 列出可用 Agent
|
|
136
|
+
im-hub-pro messengers # 列出可用 IM
|
|
137
|
+
im-hub-pro help
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## 聊天命令
|
|
141
|
+
|
|
142
|
+
直接在 IM 里发,回包流式回到同一 thread。
|
|
143
|
+
|
|
144
|
+
| 命令 | 含义 |
|
|
145
|
+
|---|---|
|
|
146
|
+
| 任意文本 | 路由到 Agent(Sticky 会话 + 意图分类) |
|
|
147
|
+
| `/<agent> <内容>` | 切换 Agent 并发送(如 `/cc 解释这段代码`、`/oc`、`/cx`、`/co`) |
|
|
148
|
+
| `/help` | 帮助 |
|
|
149
|
+
| `/agents` | 列出可用 Agent |
|
|
150
|
+
| `/status` | 连接状态 |
|
|
151
|
+
| `/new` | 开新会话(清空历史) |
|
|
152
|
+
| `/router status\|policy\|explain\|reset` | 查看路由策略 / 预测某条消息会去哪 |
|
|
153
|
+
| `/audit [n]` | 最近的调用审计 |
|
|
154
|
+
| `/job ...` | 查看 / 取消持久化任务 |
|
|
155
|
+
| `/schedule ...` | 列出 / 添加 / 删除 cron 调度 |
|
|
156
|
+
| `/sessions` | 列出本 thread 最近的会话 |
|
|
157
|
+
| `/model [provider/model]` | 查看或切换会话模型 |
|
|
158
|
+
| `/models` | 列出当前 Agent 可用模型 |
|
|
159
|
+
| `/think on\|off\|...` | 切换"深度思考"模式 |
|
|
160
|
+
| `/stats` | Agent 调用 / 延迟 / 错误统计 |
|
|
161
|
+
| `y` / `n` / `批准` / `拒绝` | 同意 / 拒绝 Claude 工具调用(HITL) |
|
|
162
|
+
|
|
163
|
+
## 工具调用人审(Human-in-the-loop)
|
|
164
|
+
|
|
165
|
+
当你从 IM 启动的 Claude 任务尝试调用工具时,im-hub-pro 会暂停它,并在同一 IM 会话发送审批卡片:
|
|
166
|
+
|
|
167
|
+
```
|
|
168
|
+
🔐 工具调用审批请求
|
|
169
|
+
工具:Bash
|
|
170
|
+
入参:{"command":"rm -rf node_modules"}
|
|
171
|
+
回复 y 批准 / n 拒绝(5 分钟内未操作将自动拒绝)
|
|
172
|
+
req: a3f1c0d2
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
回复 `y` / `n` / `批准` / `拒绝`,决策通过 MCP sidecar 回到 Claude,对应继续或中止执行。同一审批链路在微信 / Telegram / 飞书 / Discord 上零差异工作。可用 `IMHUB_APPROVAL_DISABLED=1` 关闭。
|
|
176
|
+
|
|
177
|
+
## 架构
|
|
178
|
+
|
|
179
|
+
```
|
|
180
|
+
┌─── 外部触发 ────┐
|
|
181
|
+
│ cron 30s tick │
|
|
182
|
+
│ webhook → /api/notify
|
|
183
|
+
│ REST → /api/invoke
|
|
184
|
+
│ ACP → /tasks (sync/SSE)
|
|
185
|
+
└────────────┬─────┘
|
|
186
|
+
┌─ IM 入口 ────────────────────────┼─────────────────────┐
|
|
187
|
+
│ 微信 iLink (长轮询 + 心跳) │
|
|
188
|
+
│ Telegram (grammy) │
|
|
189
|
+
│ 飞书 (Lark SDK WebSocket) │
|
|
190
|
+
│ Discord (discord.js Gateway) │
|
|
191
|
+
│ Web Chat (浏览器 WebSocket) │
|
|
192
|
+
└────────────────────────────────┬──────────────────────┘
|
|
193
|
+
│ MessageContext
|
|
194
|
+
▼
|
|
195
|
+
┌── 路由前置 gates ─────────────────┐
|
|
196
|
+
│ workspace.resolve(userId) │
|
|
197
|
+
│ rateLimiter.allow(userKey) │
|
|
198
|
+
│ traceId + pino 子 logger │
|
|
199
|
+
└────────────────┬───────────────────┘
|
|
200
|
+
▼
|
|
201
|
+
┌── parseMessage + 意图分类 ───────┐
|
|
202
|
+
│ /<cmd> → 内置子命令 │
|
|
203
|
+
│ /<agent> → 显式切换 │
|
|
204
|
+
│ default → classifyIntent │
|
|
205
|
+
│ ├ 主题正则(中英) │
|
|
206
|
+
│ ├ 关键词画像 │
|
|
207
|
+
│ ├ Sticky 会话偏置 │
|
|
208
|
+
│ └ LLM 兜底(按需) │
|
|
209
|
+
└────────────────┬───────────────────┘
|
|
210
|
+
▼
|
|
211
|
+
┌── Agent 调用 ─────────────────────┐
|
|
212
|
+
│ workspace 白名单 + 断路器 │
|
|
213
|
+
│ + 可用性 TTL 缓存 │
|
|
214
|
+
│ AgentBase.sendPrompt → spawnStream│
|
|
215
|
+
│ (LineBuffer · 真流式 · │
|
|
216
|
+
│ abort/timeout · UTF-8 安全) │
|
|
217
|
+
└────────────────┬───────────────────┘
|
|
218
|
+
┌──────┬───────┼────────┬─────────┐
|
|
219
|
+
▼ ▼ ▼ ▼ ▼
|
|
220
|
+
opencode claude codex copilot ACP 远端
|
|
221
|
+
│
|
|
222
|
+
▼ (工具需要审批时)
|
|
223
|
+
MCP sidecar ─ unix socket ─ approvalBus
|
|
224
|
+
└─ approvalRouter → IM 会话
|
|
225
|
+
|
|
226
|
+
┌─ Cross-cutting ───────────────────────────────────────┐
|
|
227
|
+
│ audit-log (SQLite,30 天保留) │
|
|
228
|
+
│ job-board (SQLite 持久化 + AbortController) │
|
|
229
|
+
│ scheduler (30s tick → cron → 入队) │
|
|
230
|
+
│ workspaces (按租户隔离 Agent 白名单 / 限流) │
|
|
231
|
+
│ metrics (Prometheus 文本,/api/metrics) │
|
|
232
|
+
│ session (~/.im-hub/sessions/,append-only JSONL) │
|
|
233
|
+
│ pino (traceId 全链路,生产 JSON) │
|
|
234
|
+
└───────────────────────────────────────────────────────┘
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
单进程、单实例:SQLite 三件套(`audit.db` / `jobs.db` / `schedules.db`)+ 会话文件树就是全部持久化层,不依赖 Redis / MQ。
|
|
238
|
+
|
|
239
|
+
更深入的架构剖析见 [`docs/architecture/current.md`](docs/architecture/current.md)。
|
|
240
|
+
|
|
241
|
+
## 项目结构
|
|
242
|
+
|
|
243
|
+
```
|
|
244
|
+
im-hub-pro/
|
|
245
|
+
├── src/
|
|
246
|
+
│ ├── core/
|
|
247
|
+
│ │ ├── types.ts # 插件接口
|
|
248
|
+
│ │ ├── registry.ts # 插件注册
|
|
249
|
+
│ │ ├── router.ts # 消息路由
|
|
250
|
+
│ │ ├── session.ts # 会话管理(append-only JSONL)
|
|
251
|
+
│ │ ├── workspace.ts # 多租户工作区
|
|
252
|
+
│ │ ├── intent.ts # 意图分类
|
|
253
|
+
│ │ ├── intent-llm.ts # LLM 兜底(LRU 缓存)
|
|
254
|
+
│ │ ├── circuit-breaker.ts # 单 Agent 断路器
|
|
255
|
+
│ │ ├── rate-limiter.ts # Token bucket 限流
|
|
256
|
+
│ │ ├── job-board.ts # 持久化任务 + 取消
|
|
257
|
+
│ │ ├── schedule.ts # cron tick → 入队
|
|
258
|
+
│ │ ├── audit-log.ts # SQLite 审计
|
|
259
|
+
│ │ ├── metrics.ts # Prometheus 分位
|
|
260
|
+
│ │ ├── acp-server.ts # /tasks ACP 服务端
|
|
261
|
+
│ │ ├── approval-bus.ts # 工具审批 pub/sub
|
|
262
|
+
│ │ ├── approval-router.ts # 审批 ↔ IM 桥
|
|
263
|
+
│ │ ├── bgjob-reader.ts # ~/.claude + ~/.config/opencode bgjobs
|
|
264
|
+
│ │ ├── agent-base.ts # CLI Agent 共享 spawn/stream
|
|
265
|
+
│ │ ├── config-schema.ts # zod schema
|
|
266
|
+
│ │ ├── logger.ts # pino + traceId
|
|
267
|
+
│ │ ├── sqlite-helper.ts # 共享 prepare / PRAGMA 缓存
|
|
268
|
+
│ │ └── commands/ # /audit /router /job /schedule /model …
|
|
269
|
+
│ ├── plugins/
|
|
270
|
+
│ │ ├── messengers/
|
|
271
|
+
│ │ │ ├── wechat/ # iLink 长轮询
|
|
272
|
+
│ │ │ ├── feishu/ # Lark SDK WebSocket
|
|
273
|
+
│ │ │ ├── telegram/ # grammy
|
|
274
|
+
│ │ │ └── discord/ # discord.js
|
|
275
|
+
│ │ └── agents/
|
|
276
|
+
│ │ ├── claude-code/ # 含 MCP 审批 sidecar
|
|
277
|
+
│ │ ├── codex/
|
|
278
|
+
│ │ ├── copilot/
|
|
279
|
+
│ │ ├── opencode/
|
|
280
|
+
│ │ └── acp/ # ACP 客户端 + /.well-known 发现
|
|
281
|
+
│ ├── index.ts
|
|
282
|
+
│ ├── cli.ts
|
|
283
|
+
│ └── web/
|
|
284
|
+
│ ├── server.ts # HTTP + WS + REST + ACP server
|
|
285
|
+
│ └── public/
|
|
286
|
+
│ ├── index.html # 对话界面
|
|
287
|
+
│ ├── tasks.html # 任务仪表盘
|
|
288
|
+
│ └── settings.html # 设置界面
|
|
289
|
+
├── docs/
|
|
290
|
+
│ ├── architecture/{current,target}.md
|
|
291
|
+
│ ├── adr/{0001,0002,0003}-*.md
|
|
292
|
+
│ ├── deployment.md
|
|
293
|
+
│ ├── discord-setup.md
|
|
294
|
+
│ └── upgrade-plan.md
|
|
295
|
+
├── package.json
|
|
296
|
+
├── tsconfig.json
|
|
297
|
+
└── README.md
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
## 配置
|
|
301
|
+
|
|
302
|
+
配置文件:`~/.im-hub/config.json`
|
|
303
|
+
|
|
304
|
+
```json
|
|
305
|
+
{
|
|
306
|
+
"messengers": ["wechat", "discord"],
|
|
307
|
+
"agents": ["claude-code", "opencode"],
|
|
308
|
+
"defaultAgent": "claude-code",
|
|
309
|
+
"discord": {
|
|
310
|
+
"botToken": "***",
|
|
311
|
+
"allowedGuilds": [],
|
|
312
|
+
"allowedChannels": []
|
|
313
|
+
},
|
|
314
|
+
"acpAgents": [
|
|
315
|
+
{
|
|
316
|
+
"name": "my-agent",
|
|
317
|
+
"aliases": ["ma"],
|
|
318
|
+
"endpoint": "https://api.example.com",
|
|
319
|
+
"auth": { "type": "bearer", "token": "***" },
|
|
320
|
+
"enabled": true
|
|
321
|
+
}
|
|
322
|
+
],
|
|
323
|
+
"workspaces": [
|
|
324
|
+
{
|
|
325
|
+
"id": "team-data",
|
|
326
|
+
"name": "数据团队",
|
|
327
|
+
"agents": ["opencode", "my-agent"],
|
|
328
|
+
"members": ["user-123"],
|
|
329
|
+
"rateLimit": { "rate": 30, "intervalSec": 60, "burst": 60 }
|
|
330
|
+
}
|
|
331
|
+
]
|
|
332
|
+
}
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
由 `zod` 在启动时与每次 PUT `/api/config` 时校验,配置错误会立即报错而不是带病运行。
|
|
336
|
+
|
|
337
|
+
## 环境要求
|
|
338
|
+
|
|
339
|
+
- **Node.js 18+**(生产建议 22 LTS+)
|
|
340
|
+
- **至少一个 Agent CLI**(或 ACP 远端):
|
|
341
|
+
- `npm i -g @anthropic-ai/claude-code`
|
|
342
|
+
- `npm i -g @openai/codex`
|
|
343
|
+
- `npm i -g @github/copilot`
|
|
344
|
+
- `npm i -g opencode-ai`
|
|
345
|
+
|
|
346
|
+
## 开发
|
|
347
|
+
|
|
348
|
+
```bash
|
|
349
|
+
git clone https://github.com/benking007/imhub.git
|
|
350
|
+
cd imhub
|
|
351
|
+
npm install
|
|
352
|
+
npm run build # tsc + 拷贝 public/
|
|
353
|
+
npm run dev # tsc --watch
|
|
354
|
+
npm test # bun test
|
|
355
|
+
npm run typecheck # tsc --noEmit(src + 测试)
|
|
356
|
+
npm start
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
## 路线图
|
|
360
|
+
|
|
361
|
+
### v0.1.x(MVP)
|
|
362
|
+
- [x] 微信扫码登录
|
|
363
|
+
- [x] Claude Code、Codex、Copilot、OpenCode Agent
|
|
364
|
+
- [x] 基础命令路由
|
|
365
|
+
|
|
366
|
+
### v0.2.0 — 多 IM
|
|
367
|
+
- [x] 飞书适配器
|
|
368
|
+
- [x] Telegram 适配器
|
|
369
|
+
- [x] 会话持久化与对话历史
|
|
370
|
+
- [x] ACP 自定义 Agent 接入
|
|
371
|
+
|
|
372
|
+
### v0.2.x — Web & UI
|
|
373
|
+
- [x] Web 对话界面(流式)
|
|
374
|
+
- [x] 设置页面
|
|
375
|
+
- [x] 双语界面(EN / 中文)
|
|
376
|
+
|
|
377
|
+
### v0.2.13 — 基础设施
|
|
378
|
+
- [x] 结构化日志(pino)+ traceId
|
|
379
|
+
- [x] zod 配置 schema 校验
|
|
380
|
+
- [x] AgentBase 抽象 + 可用性缓存
|
|
381
|
+
- [x] 审计日志(SQLite)+ `/audit`
|
|
382
|
+
- [x] 意图分类 + 断路器 + 限流
|
|
383
|
+
- [x] ACP server 模式(`POST /tasks`,sync + SSE)
|
|
384
|
+
- [x] `/.well-known/acp` 自动发现
|
|
385
|
+
- [x] 多租户 Workspace + Agent 白名单
|
|
386
|
+
- [x] 持久化 Job Board + cron 调度
|
|
387
|
+
- [x] Web `/tasks` 面板 + REST API
|
|
388
|
+
- [x] Prometheus 指标
|
|
389
|
+
|
|
390
|
+
### v0.2.14 — 工具审批
|
|
391
|
+
- [x] IM 端的工具调用人审(HITL)
|
|
392
|
+
- [x] MCP 审批 sidecar(claude-code adapter)
|
|
393
|
+
|
|
394
|
+
### v0.2.15 — Discord & 仪表盘
|
|
395
|
+
- [x] Discord IM 适配器
|
|
396
|
+
- [x] 任务面板接入 Claude / opencode bgjobs
|
|
397
|
+
- [x] Subtask 平铺列表
|
|
398
|
+
|
|
399
|
+
### v0.2.16 — 安全收口(P0 + P1)
|
|
400
|
+
- [x] REST + WS token 常量时比较(共享 `safe-equal`)
|
|
401
|
+
- [x] Schedule `notify_url` SSRF 防护(仅 http(s);屏蔽 RFC1918 / loopback / IPv6 ULA)+ 10s fetch 超时 + `redirect:'manual'`
|
|
402
|
+
- [x] HTML 注入 token:用 `JSON.stringify` 取代单引号拼接
|
|
403
|
+
- [x] Telegram bot token 日志脱敏(pino `redact.paths` + adapter 级 scrub)
|
|
404
|
+
- [x] WeChat 凭证文件 `0o600`、父目录 `0o700`
|
|
405
|
+
- [x] Approval socket 路径用 128-bit 随机 + listen 后 `chmod 0o600` + stat 校验
|
|
406
|
+
- [x] Job 结果大小上限(`IMHUB_JOB_RESULT_MAX_BYTES`,默认 1 MiB)+ UTF-8 / JSON 安全截断
|
|
407
|
+
- [x] Job Board 30 天保留 + 6h 修剪 + `creator_id` / `workspace_id` 库内迁移
|
|
408
|
+
- [x] `/job` `/schedule` `/audit` 命令按 creator/workspace 隔离(老库 ownerless 行仍对所有人可见,平稳升级)
|
|
409
|
+
- [x] Workspace 白名单从路由层下沉到命令层
|
|
410
|
+
- [x] 限流器机会式自清扫(不引 setInterval)
|
|
411
|
+
- [x] `Session.addMessage` per-key 互斥(修读改写并发竞态)
|
|
412
|
+
|
|
413
|
+
### v0.2.17 — 可观测 + IM 文本边界(P2 + P3)
|
|
414
|
+
- [x] 静态页安全响应头(`X-Frame-Options` / `X-Content-Type-Options` / `Referrer-Policy` / CSP)
|
|
415
|
+
- [x] `/api/health` 公开(k8s liveness 友好)
|
|
416
|
+
- [x] WebSocket 连接上限(`IMHUB_MAX_WS_CLIENTS`,默认 100)+ `bufferedAmount` 背压(4 MiB highwater)
|
|
417
|
+
- [x] Prometheus 标签基数白名单(`intent` / `platform` 命中外归 `'other'`)
|
|
418
|
+
- [x] 新增 counter:`im_hub_audit_prune_failed_total`、`im_hub_agent_cleanup_failed_total`、`im_hub_approval_pending` / `im_hub_approval_requests_total` / `im_hub_approval_resolved_total{result=allow|deny|timeout}`
|
|
419
|
+
- [x] `intent-llm` 缓存键 SHA-256 + prompt 截 256 字符(防 LRU 内存膨胀)
|
|
420
|
+
- [x] auto-allow 指纹长度 5 → 10(`git status` ≠ `git stash` ≠ `git submo`)
|
|
421
|
+
- [x] UTF-16 代理对安全切分(emoji 在切点上不再渲染成 `□`)
|
|
422
|
+
- [x] Telegram HTML 转义补 `'` / `"`(approval-card `<a href="...">` 防御)
|
|
423
|
+
- [x] approval-bus 缓冲溢出回 `{type:"fatal"}` 而非静默 destroy
|
|
424
|
+
- [x] SIGINT 关停时 SQLite WAL 干净 checkpoint
|
|
425
|
+
- [x] traceId 12 hex → 16 hex(`~2^48` → `~2^64`)
|
|
426
|
+
- [x] WeChat ilink-client 剩余 4 处 fetch 加超时
|
|
427
|
+
- [x] Discord 输入提示 interval 配 `AbortController`(不再与 `client.destroy()` 抢 channel)
|
|
428
|
+
- [x] WeChat `contextTokens` 在心跳 tick 上周期清扫
|
|
429
|
+
- [x] CI 锁文件修复(腾讯镜像 URL → `https://registry.npmjs.org/`)
|
|
430
|
+
|
|
431
|
+
### v0.2.18 — IM 重连退避(M9)
|
|
432
|
+
- [x] 抽公共 `Backoff` 助手(指数 + ±jitter,RNG 可注入做确定性测试)
|
|
433
|
+
- [x] Telegram `runPollingLoop`:固定 2s / 5s setTimeout → `Backoff(2s, 60s, 0.5)`;30s 健康运行阈值会重置 backoff
|
|
434
|
+
- [x] WeChat ilink `pollLoop`:内联 `Math.pow(2,n-1)` → `Backoff(2s, 30s, 0.5)`;getUpdates 成功路径调用 reset
|
|
435
|
+
|
|
436
|
+
### v0.2.19 — Codex sandbox + Dashboard 过滤 / Audit tab
|
|
437
|
+
- [x] Codex 接入 `session.planMode`;默认 sandbox 从 `--full-auto` 改为显式 `-s workspace-write`
|
|
438
|
+
- [x] Jobs / Subtasks / Schedules 三个 tab 加 agent 下拉过滤(`OwnerOpts.agent` 全链路下沉)
|
|
439
|
+
- [x] 新增 Audit tab,把 SQLite 审计日志拉到 UI;`GET /api/audit?agent=&days=&user=&intent=`
|
|
440
|
+
|
|
441
|
+
### v0.2.20 — Web 控制台 PR-A:主题 + 错误边界 + 对话内审批
|
|
442
|
+
- [x] 三态主题(浅色 / 深色 / 跟随系统),`<head>` 同步应用避免闪烁
|
|
443
|
+
- [x] `_app.js` 共享工具:`window.imhub.{theme,i18n,api,showError}` + 自动安装的错误边界
|
|
444
|
+
- [x] `/` 对话内审批卡(Allow / Deny / Allow + Auto),点击走 WS `approval-action` 回 `approvalBus.resolvePending()`,跟 Telegram inline-button 同一条路径
|
|
445
|
+
- [x] `approval-router` 导出 `bindButtonHandlerForPlatform(platform)`,给延迟注册的 messenger(web 是其中之一)调用,避免 install-before-register 时序问题
|
|
446
|
+
|
|
447
|
+
### v0.2.21 — Web 控制台 PR-B:Health + Approvals tab
|
|
448
|
+
- [x] Health tab:每个 agent 的 breaker 状态(closed/open/half-open)、限流余量、p50/95/99 延迟、调用次数 / 成功率 / 成本 / 冷却 + 60 次轮询的 p95 sparkline
|
|
449
|
+
- [x] Approvals tab:列出所有 pending HITL 审批(reqId / threadId / tool / 等待时长 / registeredAt),浏览器侧直接 Allow / Deny / Allow + Auto
|
|
450
|
+
- [x] 后端:`GET /api/agent-health` / `GET /api/approvals` / `POST /api/approvals/:reqId/resolve`
|
|
451
|
+
- [x] `approval-bus.PendingApproval` 增 `input` + `registeredAt`;register / cancel 时 emit `'approval'` 事件给 SSE 用
|
|
452
|
+
|
|
453
|
+
### v0.2.22 — Web 控制台 PR-C:SSE 事件流 + Workspace CRUD UI
|
|
454
|
+
- [x] `src/core/event-bus.ts` — 类型化 publish/subscribe(audit / approval / job / metrics)+ 200 条 ring buffer
|
|
455
|
+
- [x] `GET /events` SSE 端点 — token 走 `?token=`,25s 心跳,listener 错误吞掉
|
|
456
|
+
- [x] Dashboard 接 `EventSource('/events?token=...')`,事件触发只刷可见 tab;轮询保留作为 fallback;`approval requested` 事件让 Approvals tab 标签闪一下高亮
|
|
457
|
+
- [x] Settings 页 Workspace 卡 — 列表 + 新增 / 编辑 / 删除(编辑时 id 锁定,default 行不可编辑/删除)
|
|
458
|
+
- [x] 后端 `GET/POST/PATCH/DELETE /api/workspaces` + `WorkspaceRegistry.{remove(id), listFull()}`;mutation persist 回 `~/.im-hub/config.json`
|
|
459
|
+
|
|
460
|
+
### v0.2.23 — Web 控制台 PR-D:Files tab + Jobs 批量 + Settings 美化
|
|
461
|
+
- [x] Files tab — 只读浏览 `~/.im-hub-workspaces/<agent>/`,左目录树 / 右内容窗,1 MiB 上限,NUL byte 探测二进制 → base64
|
|
462
|
+
- [x] 路径 traversal 防御:agent 名必须在 `registry.listAgents()` 白名单;resolve 后路径必须等于或位于 `defaultAgentCwd(agent)` base 之下
|
|
463
|
+
- [x] Jobs tab 多选 + 全选 + 隐藏式批量工具栏;选中态跨刷新保留
|
|
464
|
+
- [x] `POST /api/jobs/batch-cancel` / `batch-run` 接受 `{ ids: number[] }`(最多 100),per-id 失败不互相阻断
|
|
465
|
+
- [x] Settings header 重写(`.brand` + `.controls` 双分组)— 修复语言 `<select>` 拉伸成满屏宽问题;容器 720→880,header sticky,toast / `.btn-danger:hover` 改主题变量
|
|
466
|
+
|
|
467
|
+
### v0.3.0
|
|
468
|
+
- [ ] 钉钉适配器
|
|
469
|
+
- [ ] Slack 适配器
|
|
470
|
+
- [ ] 飞书 / Discord 卡片按钮版审批(替代纯文本)
|
|
471
|
+
- [ ] Cron `nextOccurrence` 内部 UTC 化(DST 安全,CR-2026-05-06 的 M5)
|
|
472
|
+
- [ ] 多实例事件总线(Redis Streams / NATS)让 SSE 在多副本间也能跨进程
|
|
473
|
+
- [ ] Workspace 成员选择 UI(当前 CSV 输入对运维好用但易错)
|
|
474
|
+
|
|
475
|
+
## 社区 <a name="wechat-group"></a>
|
|
476
|
+
|
|
477
|
+
有问题?欢迎在 [X](https://x.com/lijieisme) 或 Discord 上交流。
|
|
478
|
+
|
|
479
|
+
<p align="center">
|
|
480
|
+
<a href="https://discord.gg/R83CXYz5">
|
|
481
|
+
<img src="https://img.shields.io/badge/加入_Discord-5865F2?style=for-the-badge&logo=discord&logoColor=white" alt="Join Discord">
|
|
482
|
+
</a>
|
|
483
|
+
|
|
484
|
+
<a href="https://x.com/lijieisme">
|
|
485
|
+
<img src="https://img.shields.io/badge/关注_X-000000?style=for-the-badge&logo=x&logoColor=white" alt="X">
|
|
486
|
+
</a>
|
|
487
|
+
</p>
|
|
488
|
+
|
|
489
|
+
<p align="center">
|
|
490
|
+
<img src="assets/wechat-group" alt="原作者微信" width="180"><br>
|
|
491
|
+
<sub><i>原作者联系方式</i></sub>
|
|
492
|
+
</p>
|
|
493
|
+
|
|
494
|
+
## 许可证
|
|
495
|
+
|
|
496
|
+
MIT
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|