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,352 @@
|
|
|
1
|
+
import type { Logger } from 'pino';
|
|
2
|
+
/**
|
|
3
|
+
* Message received from a messenger platform
|
|
4
|
+
*/
|
|
5
|
+
export interface Message {
|
|
6
|
+
id: string;
|
|
7
|
+
threadId: string;
|
|
8
|
+
userId: string;
|
|
9
|
+
text: string;
|
|
10
|
+
timestamp: Date;
|
|
11
|
+
channelId: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Chat message for conversation history
|
|
15
|
+
*/
|
|
16
|
+
export interface ChatMessage {
|
|
17
|
+
role: 'user' | 'assistant';
|
|
18
|
+
content: string;
|
|
19
|
+
timestamp: Date;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Discriminated union for parsed messages
|
|
23
|
+
* Each variant has a unique `type` field for type-safe pattern matching
|
|
24
|
+
*/
|
|
25
|
+
export type ParsedMessage = {
|
|
26
|
+
type: 'default';
|
|
27
|
+
prompt: string;
|
|
28
|
+
} | {
|
|
29
|
+
type: 'command';
|
|
30
|
+
command: 'start' | 'status' | 'help' | 'agents' | 'new';
|
|
31
|
+
} | {
|
|
32
|
+
type: 'agentCommand';
|
|
33
|
+
command: string;
|
|
34
|
+
prompt: string;
|
|
35
|
+
} | {
|
|
36
|
+
type: 'agent';
|
|
37
|
+
agent: string;
|
|
38
|
+
prompt: string;
|
|
39
|
+
} | {
|
|
40
|
+
type: 'audit';
|
|
41
|
+
args: string;
|
|
42
|
+
} | {
|
|
43
|
+
type: 'router';
|
|
44
|
+
args: string;
|
|
45
|
+
} | {
|
|
46
|
+
type: 'workspaces';
|
|
47
|
+
args: string;
|
|
48
|
+
} | {
|
|
49
|
+
type: 'schedule';
|
|
50
|
+
args: string;
|
|
51
|
+
} | {
|
|
52
|
+
type: 'job';
|
|
53
|
+
args: string;
|
|
54
|
+
} | {
|
|
55
|
+
type: 'model';
|
|
56
|
+
args: string;
|
|
57
|
+
} | {
|
|
58
|
+
type: 'think';
|
|
59
|
+
args: string;
|
|
60
|
+
} | {
|
|
61
|
+
type: 'stats';
|
|
62
|
+
args: string;
|
|
63
|
+
} | {
|
|
64
|
+
type: 'sessions';
|
|
65
|
+
args: string;
|
|
66
|
+
} | {
|
|
67
|
+
type: 'approval';
|
|
68
|
+
args: string;
|
|
69
|
+
} | {
|
|
70
|
+
type: 'plan';
|
|
71
|
+
args: string;
|
|
72
|
+
} | {
|
|
73
|
+
type: 'error';
|
|
74
|
+
prompt: string;
|
|
75
|
+
error: string;
|
|
76
|
+
};
|
|
77
|
+
/**
|
|
78
|
+
* Message context passed through the processing pipeline
|
|
79
|
+
*/
|
|
80
|
+
export interface MessageContext {
|
|
81
|
+
message: Message;
|
|
82
|
+
platform: string;
|
|
83
|
+
channelId: string;
|
|
84
|
+
agent?: string;
|
|
85
|
+
session?: Session;
|
|
86
|
+
/** Unique trace id generated at message ingestion */
|
|
87
|
+
traceId?: string;
|
|
88
|
+
/** Child logger bound to this request's traceId */
|
|
89
|
+
logger?: Logger;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Session state for a conversation
|
|
93
|
+
* Keyed by `${platform}:${channelId}:${threadId}` for uniqueness
|
|
94
|
+
*/
|
|
95
|
+
export interface Session {
|
|
96
|
+
id: string;
|
|
97
|
+
channelId: string;
|
|
98
|
+
threadId: string;
|
|
99
|
+
platform: string;
|
|
100
|
+
agent: string;
|
|
101
|
+
createdAt: Date;
|
|
102
|
+
lastActivity: Date;
|
|
103
|
+
ttl: number;
|
|
104
|
+
messages: ChatMessage[];
|
|
105
|
+
/** Current model (provider/model format) */
|
|
106
|
+
model?: string;
|
|
107
|
+
/** Thinking depth variant */
|
|
108
|
+
variant?: string;
|
|
109
|
+
/** Per-session usage roll-up. Updated by callAgentWithHistory after every
|
|
110
|
+
* successful agent invocation. Persisted with the session metadata so
|
|
111
|
+
* /stats survives restart. */
|
|
112
|
+
usage?: SessionUsage;
|
|
113
|
+
/** Active subtask id for /switch routing */
|
|
114
|
+
activeSubtaskId?: number | null;
|
|
115
|
+
subtasks?: SubtaskMeta[];
|
|
116
|
+
subtaskCounter?: number;
|
|
117
|
+
/** UUID we pre-allocate for the claude-code adapter so multiple turns in
|
|
118
|
+
* the same im-hub conversation share one resumable claude session
|
|
119
|
+
* (`claude --resume <uuid>`). Persists across restarts. */
|
|
120
|
+
claudeSessionId?: string;
|
|
121
|
+
/** Set to true after the first successful claude-code run on this session.
|
|
122
|
+
* cli uses it to decide between `--session-id` (fresh, allowed once) and
|
|
123
|
+
* `--resume` (subsequent turns). Cleared by /new. */
|
|
124
|
+
claudeSessionPrimed?: boolean;
|
|
125
|
+
/** opencode session id (`ses_…`) discovered from opencode's first JSON event
|
|
126
|
+
* on a fresh run. Subsequent turns pass `--session <id>` so opencode
|
|
127
|
+
* resumes the same conversation from its own DB and im-hub no longer needs
|
|
128
|
+
* to stitch the history into the prompt. Cleared by /new. */
|
|
129
|
+
opencodeSessionId?: string;
|
|
130
|
+
/** codex thread id (UUID) discovered from codex's `thread.started` event on
|
|
131
|
+
* a fresh run. Subsequent turns spawn `codex exec resume <id> …` so codex
|
|
132
|
+
* continues the same session from its own ~/.codex/sessions store. Cleared
|
|
133
|
+
* by /new. */
|
|
134
|
+
codexSessionId?: string;
|
|
135
|
+
/** Plan mode flag — toggled by /plan on / /plan off. When true:
|
|
136
|
+
* • claude-code adapter spawns with `--permission-mode plan` and bypasses
|
|
137
|
+
* the IM approval bus (plan mode is read-only, no mutations to gate).
|
|
138
|
+
* • opencode adapter routes through the built-in `plan` agent and skips
|
|
139
|
+
* the medium-gate ruleset PATCH (plan agent's deny-edit policy is
|
|
140
|
+
* already stricter than the IM gate).
|
|
141
|
+
* Persists across turns and `/oc`↔`/cc` agent switches; cleared by /new. */
|
|
142
|
+
planMode?: boolean;
|
|
143
|
+
}
|
|
144
|
+
export interface SessionUsage {
|
|
145
|
+
turns: number;
|
|
146
|
+
costUsd: number;
|
|
147
|
+
promptChars: number;
|
|
148
|
+
responseChars: number;
|
|
149
|
+
durationMsTotal: number;
|
|
150
|
+
/** ISO string of first invocation */
|
|
151
|
+
startedAt: string;
|
|
152
|
+
}
|
|
153
|
+
/** Lightweight subtask metadata stored in parent session */
|
|
154
|
+
export interface SubtaskMeta {
|
|
155
|
+
id: number;
|
|
156
|
+
agent: string;
|
|
157
|
+
prompt: string;
|
|
158
|
+
status: 'pending' | 'running' | 'completed' | 'failed' | 'cancelled';
|
|
159
|
+
result?: string;
|
|
160
|
+
createdAt: Date;
|
|
161
|
+
completedAt?: Date;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Adapter interface for messenger platforms (WeChat, Feishu, Telegram)
|
|
165
|
+
*/
|
|
166
|
+
export interface MessengerAdapter {
|
|
167
|
+
readonly name: string;
|
|
168
|
+
start(): Promise<void>;
|
|
169
|
+
stop(): Promise<void>;
|
|
170
|
+
onMessage(handler: (ctx: MessageContext) => Promise<void>): void;
|
|
171
|
+
sendMessage(threadId: string, text: string): Promise<void>;
|
|
172
|
+
/**
|
|
173
|
+
* Send typing indicator to show the bot is processing
|
|
174
|
+
* @param threadId - The conversation thread ID
|
|
175
|
+
* @param isTyping - true to start typing indicator, false to stop
|
|
176
|
+
*/
|
|
177
|
+
sendTyping?(threadId: string, isTyping: boolean): Promise<void>;
|
|
178
|
+
/**
|
|
179
|
+
* Send an interactive card (Feishu only)
|
|
180
|
+
* @param threadId - The conversation thread ID
|
|
181
|
+
* @param card - The card JSON object
|
|
182
|
+
*/
|
|
183
|
+
sendCard?(threadId: string, card: unknown): Promise<void>;
|
|
184
|
+
/**
|
|
185
|
+
* Send a "thinking" placeholder message (e.g. 🤔 思考中…) and return a
|
|
186
|
+
* dismiss handle. Adapters that can delete or update their own messages
|
|
187
|
+
* (Feishu) should return a callable that removes the placeholder before
|
|
188
|
+
* the real response is sent. Adapters that cannot recall (WeChat iLink)
|
|
189
|
+
* should still send the placeholder and return undefined — the placeholder
|
|
190
|
+
* lingers in the chat but at least gives the user immediate feedback.
|
|
191
|
+
* Adapters that prefer their native typing indicator can omit this method.
|
|
192
|
+
*/
|
|
193
|
+
sendThinking?(threadId: string, text: string): Promise<ThinkingHandle | undefined>;
|
|
194
|
+
/**
|
|
195
|
+
* Subscribe to inline-button (callback_query) events. Adapters that support
|
|
196
|
+
* native interactive buttons (Telegram inline keyboard, Feishu card actions
|
|
197
|
+
* once we wire them) call the handler when a user taps a button. Adapters
|
|
198
|
+
* without native button support simply omit this method — approval-router
|
|
199
|
+
* falls back to its text/y-n flow.
|
|
200
|
+
*
|
|
201
|
+
* Idempotent: re-registering replaces the previous handler.
|
|
202
|
+
*/
|
|
203
|
+
onButtonCallback?(handler: (cb: ButtonCallback) => Promise<void>): void;
|
|
204
|
+
/**
|
|
205
|
+
* Send an approval prompt as a rich card with action buttons. When this
|
|
206
|
+
* method is implemented, approval-router prefers it over plain
|
|
207
|
+
* sendMessage. The returned messageId is later passed to editApprovalCard
|
|
208
|
+
* so the card can be replaced with the outcome (✅ / ❌ / ⏱).
|
|
209
|
+
*
|
|
210
|
+
* Adapters that don't implement this fall back to sendMessage(text) — the
|
|
211
|
+
* text path remains the canonical approval channel for Feishu / WeChat /
|
|
212
|
+
* any IM that doesn't have native button support.
|
|
213
|
+
*/
|
|
214
|
+
sendApprovalCard?(threadId: string, prompt: ApprovalCardPrompt): Promise<{
|
|
215
|
+
messageId: string;
|
|
216
|
+
}>;
|
|
217
|
+
/**
|
|
218
|
+
* Replace the body of an approval card after the request has been resolved
|
|
219
|
+
* (allowed / denied / timed out). Best-effort: failure is logged and
|
|
220
|
+
* swallowed by the router, since the underlying approval has already
|
|
221
|
+
* resolved on the bus side.
|
|
222
|
+
*/
|
|
223
|
+
editApprovalCard?(threadId: string, messageId: string, outcome: ApprovalCardOutcome): Promise<void>;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Inline-button tap event surfaced by adapters that implement
|
|
227
|
+
* onButtonCallback. The data field is opaque to the adapter; consumers
|
|
228
|
+
* (approval-router, future button consumers) parse it.
|
|
229
|
+
*
|
|
230
|
+
* ack MUST be called within ~1s on Telegram or the client shows a stuck
|
|
231
|
+
* "loading" spinner — adapters wrap their platform-native ack so callers
|
|
232
|
+
* can stay platform-agnostic.
|
|
233
|
+
*/
|
|
234
|
+
export interface ButtonCallback {
|
|
235
|
+
/** Raw callback_data string (Telegram caps at 64 bytes UTF-8). */
|
|
236
|
+
data: string;
|
|
237
|
+
threadId: string;
|
|
238
|
+
userId: string;
|
|
239
|
+
/** Display name for the user who tapped (e.g. "@benking" or first_name).
|
|
240
|
+
* Used for "已批准 by @benking" rendering. Optional — adapters that
|
|
241
|
+
* can't easily resolve a display name should leave it undefined. */
|
|
242
|
+
userDisplay?: string;
|
|
243
|
+
/** ID of the message that owned the button — passed back to
|
|
244
|
+
* editApprovalCard for in-place updates. */
|
|
245
|
+
messageId: string;
|
|
246
|
+
/** Acknowledge the button tap to the platform. Optional toast text
|
|
247
|
+
* (Telegram shows it briefly above the chat). Errors are swallowed. */
|
|
248
|
+
ack: (text?: string) => Promise<void>;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Payload handed to sendApprovalCard. inputJson is already truncated to a
|
|
252
|
+
* display-safe length by the caller (router) — adapters should render it
|
|
253
|
+
* as-is in a code block.
|
|
254
|
+
*/
|
|
255
|
+
export interface ApprovalCardPrompt {
|
|
256
|
+
/** Bus-side request id; embedded in callback_data so the button click
|
|
257
|
+
* knows which approval to resolve. Adapters must not depend on its
|
|
258
|
+
* internal format. */
|
|
259
|
+
reqId: string;
|
|
260
|
+
toolName: string;
|
|
261
|
+
/** Stringified input, already length-capped. May contain newlines. */
|
|
262
|
+
inputJson: string;
|
|
263
|
+
/** 'normal' = ask user; 'auto-allow' = grace window before automatic
|
|
264
|
+
* allow (only the deny button is meaningful). */
|
|
265
|
+
mode: 'normal' | 'auto-allow';
|
|
266
|
+
/** Auto-allow grace window in seconds, present iff mode === 'auto-allow'. */
|
|
267
|
+
graceSeconds?: number;
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Outcome rendered into a card after the approval is resolved. The card's
|
|
271
|
+
* action buttons are removed during this edit so the user can no longer
|
|
272
|
+
* tap a stale button.
|
|
273
|
+
*/
|
|
274
|
+
export interface ApprovalCardOutcome {
|
|
275
|
+
decision: 'allowed' | 'allowed-pinned' | 'denied' | 'denied-revoked' | 'expired';
|
|
276
|
+
/** "@user" or first name of the human who decided, if known. */
|
|
277
|
+
byUserDisplay?: string;
|
|
278
|
+
atDate: Date;
|
|
279
|
+
}
|
|
280
|
+
/** Optional callback returned by sendThinking; invoked once the real response
|
|
281
|
+
* is ready, to remove or otherwise hide the placeholder. */
|
|
282
|
+
export type ThinkingHandle = () => Promise<void>;
|
|
283
|
+
/**
|
|
284
|
+
* Optional per-call context piped from the IM router into the agent. Lets
|
|
285
|
+
* adapters (e.g. ClaudeCodeAdapter) route side-channel events back to the
|
|
286
|
+
* originating IM conversation — for instance, permission prompts surfaced
|
|
287
|
+
* via approval-bus.
|
|
288
|
+
*
|
|
289
|
+
* All fields optional so non-IM call sites (web, scheduler, intent-llm) can
|
|
290
|
+
* keep calling sendPrompt without adornment.
|
|
291
|
+
*/
|
|
292
|
+
export interface AgentSendOpts {
|
|
293
|
+
model?: string;
|
|
294
|
+
variant?: string;
|
|
295
|
+
threadId?: string;
|
|
296
|
+
platform?: string;
|
|
297
|
+
userId?: string;
|
|
298
|
+
channelId?: string;
|
|
299
|
+
/** Optional UUID to bind to the agent's own resumable-session concept.
|
|
300
|
+
* Currently honoured by the claude-code adapter (passed as
|
|
301
|
+
* `--session-id` for first call, `--resume` for subsequent calls) so
|
|
302
|
+
* multi-turn IM conversations share one resumable claude session and
|
|
303
|
+
* the user can later `claude --resume <uuid>` to continue from their
|
|
304
|
+
* terminal. Other adapters ignore this. */
|
|
305
|
+
agentSessionId?: string;
|
|
306
|
+
/** When true, the adapter should resume an existing session under
|
|
307
|
+
* `agentSessionId` rather than create a new one. claude-code translates
|
|
308
|
+
* this to `--resume <uuid>` instead of `--session-id <uuid>`. */
|
|
309
|
+
agentSessionResume?: boolean;
|
|
310
|
+
/** Optional one-shot callback for adapters whose CLI generates the session
|
|
311
|
+
* id itself (rather than letting im-hub pre-allocate). opencode emits
|
|
312
|
+
* `sessionID` in every JSON event; the adapter calls this when it sees
|
|
313
|
+
* the id so cli can persist it on the im-hub session row for next turn.
|
|
314
|
+
* Idempotent: same id may fire multiple times per spawn. */
|
|
315
|
+
onAgentSessionId?: (id: string) => void;
|
|
316
|
+
/** Optional callback for adapters that surface usage data inline (cost +
|
|
317
|
+
* tokens). opencode's `step_finish` event carries this; cli accumulates
|
|
318
|
+
* the deltas to feed `recordUsage` so /stats reflects opencode cost. */
|
|
319
|
+
onUsage?: (delta: {
|
|
320
|
+
costUsd?: number;
|
|
321
|
+
tokensInput?: number;
|
|
322
|
+
tokensOutput?: number;
|
|
323
|
+
}) => void;
|
|
324
|
+
/** When true, the adapter should run the agent in plan / read-only mode.
|
|
325
|
+
* claude-code translates this to `--permission-mode plan`; opencode
|
|
326
|
+
* translates it to `--agent plan` (stdio) or `agent: 'plan'` in the HTTP
|
|
327
|
+
* body. Other adapters ignore this. See Session.planMode for lifecycle. */
|
|
328
|
+
planMode?: boolean;
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Adapter interface for AI coding agents (Claude Code, Codex, Copilot)
|
|
332
|
+
*
|
|
333
|
+
* sendPrompt returns an AsyncGenerator for streaming responses.
|
|
334
|
+
* Each yielded string is a complete message chunk.
|
|
335
|
+
* The generator throws on error — caller catches and handles.
|
|
336
|
+
*/
|
|
337
|
+
export interface AgentAdapter {
|
|
338
|
+
readonly name: string;
|
|
339
|
+
readonly aliases: string[];
|
|
340
|
+
sendPrompt(sessionId: string, prompt: string, history?: ChatMessage[], opts?: AgentSendOpts): AsyncGenerator<string>;
|
|
341
|
+
isAvailable(): Promise<boolean>;
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Configuration for the im-hub instance
|
|
345
|
+
*/
|
|
346
|
+
export interface Config {
|
|
347
|
+
messengers: string[];
|
|
348
|
+
agents: string[];
|
|
349
|
+
defaultAgent: string;
|
|
350
|
+
[key: string]: unknown;
|
|
351
|
+
}
|
|
352
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,oBAAoB"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { RateLimiter } from './rate-limiter.js';
|
|
2
|
+
export interface WorkspaceConfig {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
agents: string[];
|
|
6
|
+
rateLimit?: {
|
|
7
|
+
rate: number;
|
|
8
|
+
intervalSec: number;
|
|
9
|
+
burst: number;
|
|
10
|
+
};
|
|
11
|
+
members?: string[];
|
|
12
|
+
}
|
|
13
|
+
export declare class Workspace {
|
|
14
|
+
readonly id: string;
|
|
15
|
+
readonly name: string;
|
|
16
|
+
readonly agentWhitelist: Set<string>;
|
|
17
|
+
readonly limiter: RateLimiter;
|
|
18
|
+
readonly memberSet: Set<string> | null;
|
|
19
|
+
constructor(cfg: WorkspaceConfig);
|
|
20
|
+
hasAgent(agent: string): boolean;
|
|
21
|
+
hasMember(userId: string): boolean;
|
|
22
|
+
allow(userKey: string): boolean;
|
|
23
|
+
}
|
|
24
|
+
export declare class WorkspaceRegistry {
|
|
25
|
+
private workspaces;
|
|
26
|
+
private defaultWorkspace;
|
|
27
|
+
constructor();
|
|
28
|
+
add(cfg: WorkspaceConfig): void;
|
|
29
|
+
/**
|
|
30
|
+
* Remove a workspace by id. Returns true on success, false if the id
|
|
31
|
+
* doesn't exist or refers to the default workspace (which is created
|
|
32
|
+
* by the constructor and used as a fallback — removing it would break
|
|
33
|
+
* `resolve()` for users without an explicit assignment).
|
|
34
|
+
*/
|
|
35
|
+
remove(id: string): boolean;
|
|
36
|
+
get(id: string): Workspace | undefined;
|
|
37
|
+
/** Resolve workspace for a user. Prioritizes named workspaces over default. */
|
|
38
|
+
resolve(userId: string): Workspace;
|
|
39
|
+
/** Load from config */
|
|
40
|
+
load(config: {
|
|
41
|
+
workspaces?: WorkspaceConfig[];
|
|
42
|
+
}): void;
|
|
43
|
+
/**
|
|
44
|
+
* Return summaries of every registered workspace, including the default.
|
|
45
|
+
* Used by `/workspaces` and the Web settings UI.
|
|
46
|
+
*/
|
|
47
|
+
list(): Array<{
|
|
48
|
+
id: string;
|
|
49
|
+
name: string;
|
|
50
|
+
agents: string[];
|
|
51
|
+
members: number | null;
|
|
52
|
+
rateLimit: {
|
|
53
|
+
rate: number;
|
|
54
|
+
intervalSec: number;
|
|
55
|
+
burst: number;
|
|
56
|
+
};
|
|
57
|
+
}>;
|
|
58
|
+
/**
|
|
59
|
+
* Full config snapshot for the settings UI, including the original
|
|
60
|
+
* member list. Distinct from `list()`'s summary shape (which exposes
|
|
61
|
+
* only a member count to preserve callers that don't need the IDs).
|
|
62
|
+
*/
|
|
63
|
+
listFull(): WorkspaceConfig[];
|
|
64
|
+
get default(): Workspace;
|
|
65
|
+
}
|
|
66
|
+
export declare const workspaceRegistry: WorkspaceRegistry;
|
|
67
|
+
//# sourceMappingURL=workspace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../src/core/workspace.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE/C,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,SAAS,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;IAChE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,qBAAa,SAAS;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACpC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAA;IAC7B,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAA;gBAE1B,GAAG,EAAE,eAAe;IAYhC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAMhC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAKlC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;CAGhC;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,gBAAgB,CAAW;;IAcnC,GAAG,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI;IAI/B;;;;;OAKG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAK3B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAItC,+EAA+E;IAC/E,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS;IAQlC,uBAAuB;IACvB,IAAI,CAAC,MAAM,EAAE;QAAE,UAAU,CAAC,EAAE,eAAe,EAAE,CAAA;KAAE,GAAG,IAAI;IAQtD;;;OAGG;IACH,IAAI,IAAI,KAAK,CAAC;QACZ,EAAE,EAAE,MAAM,CAAA;QACV,IAAI,EAAE,MAAM,CAAA;QACZ,MAAM,EAAE,MAAM,EAAE,CAAA;QAChB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;QACtB,SAAS,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAA;KAChE,CAAC;IAUF;;;;OAIG;IACH,QAAQ,IAAI,eAAe,EAAE;IAU7B,IAAI,OAAO,IAAI,SAAS,CAAiC;CAC1D;AAED,eAAO,MAAM,iBAAiB,mBAA0B,CAAA"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
// Multi-tenant workspace registry
|
|
2
|
+
//
|
|
3
|
+
// Each workspace has its own agent whitelist, rate limits, and config.
|
|
4
|
+
// The default workspace handles existing single-tenant deployments.
|
|
5
|
+
import { RateLimiter } from './rate-limiter.js';
|
|
6
|
+
export class Workspace {
|
|
7
|
+
id;
|
|
8
|
+
name;
|
|
9
|
+
agentWhitelist;
|
|
10
|
+
limiter;
|
|
11
|
+
memberSet; // null = open
|
|
12
|
+
constructor(cfg) {
|
|
13
|
+
this.id = cfg.id;
|
|
14
|
+
this.name = cfg.name;
|
|
15
|
+
this.agentWhitelist = new Set(cfg.agents);
|
|
16
|
+
this.limiter = new RateLimiter(cfg.rateLimit?.rate ?? 10, (cfg.rateLimit?.intervalSec ?? 60) * 1000, cfg.rateLimit?.burst ?? 15);
|
|
17
|
+
this.memberSet = cfg.members?.length ? new Set(cfg.members) : null;
|
|
18
|
+
}
|
|
19
|
+
hasAgent(agent) {
|
|
20
|
+
// Empty whitelist = unrestricted. Named whitelist enforces membership.
|
|
21
|
+
if (this.agentWhitelist.size === 0)
|
|
22
|
+
return true;
|
|
23
|
+
return this.agentWhitelist.has(agent);
|
|
24
|
+
}
|
|
25
|
+
hasMember(userId) {
|
|
26
|
+
if (!this.memberSet)
|
|
27
|
+
return true; // open workspace
|
|
28
|
+
return this.memberSet.has(userId);
|
|
29
|
+
}
|
|
30
|
+
allow(userKey) {
|
|
31
|
+
return this.limiter.allow(userKey);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export class WorkspaceRegistry {
|
|
35
|
+
workspaces = new Map();
|
|
36
|
+
defaultWorkspace;
|
|
37
|
+
constructor() {
|
|
38
|
+
// Default workspace is unrestricted (empty whitelist) so any registered
|
|
39
|
+
// agent — including ACP-added custom agents — is reachable without
|
|
40
|
+
// explicit workspace configuration.
|
|
41
|
+
this.defaultWorkspace = new Workspace({
|
|
42
|
+
id: 'default',
|
|
43
|
+
name: 'Default',
|
|
44
|
+
agents: [],
|
|
45
|
+
});
|
|
46
|
+
this.workspaces.set('default', this.defaultWorkspace);
|
|
47
|
+
}
|
|
48
|
+
add(cfg) {
|
|
49
|
+
this.workspaces.set(cfg.id, new Workspace(cfg));
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Remove a workspace by id. Returns true on success, false if the id
|
|
53
|
+
* doesn't exist or refers to the default workspace (which is created
|
|
54
|
+
* by the constructor and used as a fallback — removing it would break
|
|
55
|
+
* `resolve()` for users without an explicit assignment).
|
|
56
|
+
*/
|
|
57
|
+
remove(id) {
|
|
58
|
+
if (id === 'default')
|
|
59
|
+
return false;
|
|
60
|
+
return this.workspaces.delete(id);
|
|
61
|
+
}
|
|
62
|
+
get(id) {
|
|
63
|
+
return this.workspaces.get(id);
|
|
64
|
+
}
|
|
65
|
+
/** Resolve workspace for a user. Prioritizes named workspaces over default. */
|
|
66
|
+
resolve(userId) {
|
|
67
|
+
for (const ws of this.workspaces.values()) {
|
|
68
|
+
if (ws.id === 'default')
|
|
69
|
+
continue; // default matches last
|
|
70
|
+
if (ws.hasMember(userId))
|
|
71
|
+
return ws;
|
|
72
|
+
}
|
|
73
|
+
return this.defaultWorkspace;
|
|
74
|
+
}
|
|
75
|
+
/** Load from config */
|
|
76
|
+
load(config) {
|
|
77
|
+
if (config.workspaces) {
|
|
78
|
+
for (const cfg of config.workspaces) {
|
|
79
|
+
this.add(cfg);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Return summaries of every registered workspace, including the default.
|
|
85
|
+
* Used by `/workspaces` and the Web settings UI.
|
|
86
|
+
*/
|
|
87
|
+
list() {
|
|
88
|
+
return Array.from(this.workspaces.values()).map((ws) => ({
|
|
89
|
+
id: ws.id,
|
|
90
|
+
name: ws.name,
|
|
91
|
+
agents: Array.from(ws.agentWhitelist),
|
|
92
|
+
members: ws.memberSet ? ws.memberSet.size : null,
|
|
93
|
+
rateLimit: ws.limiter.config(),
|
|
94
|
+
}));
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Full config snapshot for the settings UI, including the original
|
|
98
|
+
* member list. Distinct from `list()`'s summary shape (which exposes
|
|
99
|
+
* only a member count to preserve callers that don't need the IDs).
|
|
100
|
+
*/
|
|
101
|
+
listFull() {
|
|
102
|
+
return Array.from(this.workspaces.values()).map((ws) => ({
|
|
103
|
+
id: ws.id,
|
|
104
|
+
name: ws.name,
|
|
105
|
+
agents: Array.from(ws.agentWhitelist),
|
|
106
|
+
members: ws.memberSet ? Array.from(ws.memberSet) : [],
|
|
107
|
+
rateLimit: ws.limiter.config(),
|
|
108
|
+
}));
|
|
109
|
+
}
|
|
110
|
+
get default() { return this.defaultWorkspace; }
|
|
111
|
+
}
|
|
112
|
+
export const workspaceRegistry = new WorkspaceRegistry();
|
|
113
|
+
//# sourceMappingURL=workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/core/workspace.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,cAAc,iBAAiB,CAAA;AAC/B,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAE1B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { AgentAdapter, ChatMessage } from '../../../core/types.js';
|
|
2
|
+
import type { ACPAgentConfig, ACPManifest } from './types.js';
|
|
3
|
+
export declare class ACPAdapter implements AgentAdapter {
|
|
4
|
+
readonly name: string;
|
|
5
|
+
readonly aliases: string[];
|
|
6
|
+
private client;
|
|
7
|
+
constructor(config: ACPAgentConfig);
|
|
8
|
+
isAvailable(): Promise<boolean>;
|
|
9
|
+
sendPrompt(sessionId: string, prompt: string, history?: ChatMessage[], _opts?: {
|
|
10
|
+
model?: string;
|
|
11
|
+
variant?: string;
|
|
12
|
+
}): AsyncGenerator<string>;
|
|
13
|
+
/** Get the agent manifest for display (not part of AgentAdapter interface) */
|
|
14
|
+
getManifest(): Promise<ACPManifest | undefined>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=acp-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acp-adapter.d.ts","sourceRoot":"","sources":["../../../../src/plugins/agents/acp/acp-adapter.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAM7D,qBAAa,UAAW,YAAW,YAAY;IAC7C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAA;IAC1B,OAAO,CAAC,MAAM,CAAW;gBAEb,MAAM,EAAE,cAAc;IAM5B,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAI9B,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,EAAE,EAAE,KAAK,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,cAAc,CAAC,MAAM,CAAC;IAiBnJ,8EAA8E;IACxE,WAAW,IAAI,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;CAOtD"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// ACPAdapter — bridges ACP protocol to IM-Hub's AgentAdapter interface.
|
|
2
|
+
//
|
|
3
|
+
// P2-C: sessionId is now forwarded to the remote agent in the request body
|
|
4
|
+
// (as `session_id`) so multi-turn conversations preserve context across
|
|
5
|
+
// HTTP calls. Remote agents that don't recognize the field simply ignore
|
|
6
|
+
// it; this is a forward-compatible spec extension.
|
|
7
|
+
import { ACPClient } from './acp-client.js';
|
|
8
|
+
import { logger as rootLogger } from '../../../core/logger.js';
|
|
9
|
+
const log = rootLogger.child({ component: 'acp-adapter' });
|
|
10
|
+
export class ACPAdapter {
|
|
11
|
+
name;
|
|
12
|
+
aliases;
|
|
13
|
+
client;
|
|
14
|
+
constructor(config) {
|
|
15
|
+
this.name = config.name;
|
|
16
|
+
this.aliases = config.aliases || [];
|
|
17
|
+
this.client = new ACPClient(config);
|
|
18
|
+
}
|
|
19
|
+
async isAvailable() {
|
|
20
|
+
return this.client.healthCheck();
|
|
21
|
+
}
|
|
22
|
+
async *sendPrompt(sessionId, prompt, history, _opts) {
|
|
23
|
+
// Try streaming first, fall back to sync.
|
|
24
|
+
// NOTE: Fallback creates a new task; if the streaming task was partially
|
|
25
|
+
// processed, the agent may repeat work. Acceptable for v1.
|
|
26
|
+
try {
|
|
27
|
+
for await (const chunk of this.client.streamPrompt(prompt, history, sessionId)) {
|
|
28
|
+
yield chunk;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
catch (streamError) {
|
|
32
|
+
const errMsg = streamError instanceof Error ? streamError.message : String(streamError);
|
|
33
|
+
log.warn({ agent: this.name, error: errMsg, sessionId }, 'ACP streaming failed, falling back to sync');
|
|
34
|
+
const response = await this.client.sendPromptSync(prompt, history, sessionId);
|
|
35
|
+
if (response)
|
|
36
|
+
yield response;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/** Get the agent manifest for display (not part of AgentAdapter interface) */
|
|
40
|
+
async getManifest() {
|
|
41
|
+
try {
|
|
42
|
+
return await this.client.fetchManifest();
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=acp-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acp-adapter.js","sourceRoot":"","sources":["../../../../src/plugins/agents/acp/acp-adapter.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,EAAE;AACF,2EAA2E;AAC3E,wEAAwE;AACxE,yEAAyE;AACzE,mDAAmD;AAInD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAE9D,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC,CAAA;AAE1D,MAAM,OAAO,UAAU;IACZ,IAAI,CAAQ;IACZ,OAAO,CAAU;IAClB,MAAM,CAAW;IAEzB,YAAY,MAAsB;QAChC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAA;QACvB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAA;QACnC,IAAI,CAAC,MAAM,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAA;IACrC,CAAC;IAED,KAAK,CAAC,WAAW;QACf,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAA;IAClC,CAAC;IAED,KAAK,CAAC,CAAC,UAAU,CAAC,SAAiB,EAAE,MAAc,EAAE,OAAuB,EAAE,KAA4C;QACxH,0CAA0C;QAC1C,yEAAyE;QACzE,2DAA2D;QAC3D,IAAI,CAAC;YACH,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC;gBAC/E,MAAM,KAAK,CAAA;YACb,CAAC;QACH,CAAC;QAAC,OAAO,WAAW,EAAE,CAAC;YACrB,MAAM,MAAM,GAAG,WAAW,YAAY,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;YACvF,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,EACrD,4CAA4C,CAAC,CAAA;YAC/C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAA;YAC7E,IAAI,QAAQ;gBAAE,MAAM,QAAQ,CAAA;QAC9B,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,KAAK,CAAC,WAAW;QACf,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAA;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAA;QAClB,CAAC;IACH,CAAC;CACF"}
|