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,431 @@
|
|
|
1
|
+
// Message router — parses commands and routes to agents
|
|
2
|
+
import { registry } from './registry.js';
|
|
3
|
+
import { sessionManager } from './session.js';
|
|
4
|
+
import { isAgentAvailableCached, formatAgentNotAvailableError } from './onboarding.js';
|
|
5
|
+
import { handleBuiltInCommand } from './commands/builtin.js';
|
|
6
|
+
import { handleAgentCommand } from './commands/agent.js';
|
|
7
|
+
import { handleAuditCommand } from './commands/audit.js';
|
|
8
|
+
import { handleRouterCommand } from './commands/router.js';
|
|
9
|
+
import { handleJobCommand } from './commands/job.js';
|
|
10
|
+
import { handleModelCommand } from './commands/model.js';
|
|
11
|
+
import { handleThinkCommand } from './commands/think.js';
|
|
12
|
+
import { handleStatsCommand } from './commands/stats.js';
|
|
13
|
+
import { handleSessionsCommand } from './commands/sessions.js';
|
|
14
|
+
import { handleWorkspacesCommand } from './commands/workspaces.js';
|
|
15
|
+
import { handleScheduleCommand } from './commands/schedule.js';
|
|
16
|
+
import { handleApprovalCommand } from './commands/approval.js';
|
|
17
|
+
import { handlePlanCommand } from './commands/plan.js';
|
|
18
|
+
import { logInvocation } from './audit-log.js';
|
|
19
|
+
import { circuitBreaker } from './circuit-breaker.js';
|
|
20
|
+
import { classifyIntent } from './intent.js';
|
|
21
|
+
import { classifyWithLLM, getLLMJudge } from './intent-llm.js';
|
|
22
|
+
import { userLimiter } from './rate-limiter.js';
|
|
23
|
+
import { workspaceRegistry } from './workspace.js';
|
|
24
|
+
import { getJob } from './job-board.js';
|
|
25
|
+
/** Built-in coding agent commands forwarded to the active agent */
|
|
26
|
+
const AGENT_COMMANDS = new Set(['test', 'review', 'commit', 'push', 'diff', 'shell', 'bug', 'explain']);
|
|
27
|
+
/**
|
|
28
|
+
* Build the rate-limit user-facing error string. Picks the effective
|
|
29
|
+
* limiter (workspace's own limiter for named workspaces, otherwise the
|
|
30
|
+
* shared userLimiter) so the wait estimate matches the bucket that
|
|
31
|
+
* actually rejected the request.
|
|
32
|
+
*/
|
|
33
|
+
function formatRateLimitError(ws, key) {
|
|
34
|
+
const limiter = ws.id === 'default' ? userLimiter : ws.limiter;
|
|
35
|
+
const s = limiter.status(key);
|
|
36
|
+
const waitSec = Math.max(0, Math.ceil((limiter.nextAllowAt(key) - Date.now()) / 1000));
|
|
37
|
+
const tail = waitSec > 0 ? `,请在约 ${waitSec} 秒后重试` : '';
|
|
38
|
+
return `⏱️ 请求过于频繁(${s.rate} 次/${s.intervalSec}秒,剩余 ${s.remaining})${tail}`;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Parse a message to determine how to route it
|
|
42
|
+
*
|
|
43
|
+
* Command format: /alias prompt... or /agent-name prompt...
|
|
44
|
+
* Built-in commands: /status, /help, /agents
|
|
45
|
+
*/
|
|
46
|
+
export function parseMessage(text) {
|
|
47
|
+
const trimmed = text.trim();
|
|
48
|
+
// Empty string → default agent with empty prompt
|
|
49
|
+
if (!trimmed) {
|
|
50
|
+
return { type: 'default', prompt: '' };
|
|
51
|
+
}
|
|
52
|
+
// Check for command prefix
|
|
53
|
+
const match = trimmed.match(/^\/(\S+)\s*(.*)/);
|
|
54
|
+
if (!match) {
|
|
55
|
+
// No command prefix → default agent
|
|
56
|
+
return { type: 'default', prompt: trimmed };
|
|
57
|
+
}
|
|
58
|
+
const [, cmd, rest] = match;
|
|
59
|
+
// Built-in commands
|
|
60
|
+
if (cmd === 'start')
|
|
61
|
+
return { type: 'command', command: 'start' };
|
|
62
|
+
if (cmd === 'status')
|
|
63
|
+
return { type: 'command', command: 'status' };
|
|
64
|
+
if (cmd === 'help')
|
|
65
|
+
return { type: 'command', command: 'help' };
|
|
66
|
+
if (cmd === 'agents')
|
|
67
|
+
return { type: 'command', command: 'agents' };
|
|
68
|
+
if (cmd === 'new')
|
|
69
|
+
return { type: 'command', command: 'new' };
|
|
70
|
+
if (cmd === 'audit')
|
|
71
|
+
return { type: 'audit', args: rest };
|
|
72
|
+
if (cmd === 'router')
|
|
73
|
+
return { type: 'router', args: rest };
|
|
74
|
+
if (cmd === 'workspaces' || cmd === 'ws')
|
|
75
|
+
return { type: 'workspaces', args: rest };
|
|
76
|
+
if (cmd === 'schedule' || cmd === 'cron')
|
|
77
|
+
return { type: 'schedule', args: rest };
|
|
78
|
+
if (cmd === 'job' || cmd === 'task')
|
|
79
|
+
return { type: 'job', args: rest };
|
|
80
|
+
if (cmd === 'tasks')
|
|
81
|
+
return { type: 'job', args: 'list' };
|
|
82
|
+
if (cmd === 'check')
|
|
83
|
+
return { type: 'job', args: `check ${rest}` };
|
|
84
|
+
if (cmd === 'cancel')
|
|
85
|
+
return { type: 'job', args: `cancel ${rest}` };
|
|
86
|
+
if (cmd === 'switch')
|
|
87
|
+
return { type: 'job', args: `switch ${rest}` };
|
|
88
|
+
if (cmd === 'collect')
|
|
89
|
+
return { type: 'job', args: `collect ${rest}` };
|
|
90
|
+
// Model / think / stats / sessions commands
|
|
91
|
+
if (cmd === 'models')
|
|
92
|
+
return { type: 'model', args: rest ? `list ${rest}` : 'list' };
|
|
93
|
+
if (cmd === 'model' || cmd === 'mode')
|
|
94
|
+
return { type: 'model', args: rest };
|
|
95
|
+
if (cmd === 'think')
|
|
96
|
+
return { type: 'think', args: rest };
|
|
97
|
+
if (cmd === 'stats' || cmd === 'usage' || cmd === 'cost')
|
|
98
|
+
return { type: 'stats', args: rest };
|
|
99
|
+
if (cmd === 'sessions')
|
|
100
|
+
return { type: 'sessions', args: rest };
|
|
101
|
+
if (cmd === 'approval' || cmd === 'auto')
|
|
102
|
+
return { type: 'approval', args: rest };
|
|
103
|
+
if (cmd === 'plan')
|
|
104
|
+
return { type: 'plan', args: rest };
|
|
105
|
+
// Convenience aliases that map to /plan on|off without typing the subcommand.
|
|
106
|
+
if (cmd === 'plan-on' || cmd === 'planon')
|
|
107
|
+
return { type: 'plan', args: 'on' };
|
|
108
|
+
if (cmd === 'plan-off' || cmd === 'planoff')
|
|
109
|
+
return { type: 'plan', args: 'off' };
|
|
110
|
+
// Check if it's an agent alias (registered agents take priority over generic commands)
|
|
111
|
+
const agent = registry.findAgent(cmd);
|
|
112
|
+
if (agent) {
|
|
113
|
+
return { type: 'agent', agent: agent.name, prompt: rest };
|
|
114
|
+
}
|
|
115
|
+
// Agent built-in commands (only if no registered agent matches)
|
|
116
|
+
if (AGENT_COMMANDS.has(cmd)) {
|
|
117
|
+
return { type: 'agentCommand', command: cmd, prompt: rest };
|
|
118
|
+
}
|
|
119
|
+
// Unknown command
|
|
120
|
+
return { type: 'error', prompt: trimmed, error: `Unknown command: ${cmd}` };
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Route a parsed message to the appropriate handler
|
|
124
|
+
*/
|
|
125
|
+
export async function routeMessage(parsed, ctx) {
|
|
126
|
+
switch (parsed.type) {
|
|
127
|
+
case 'command': {
|
|
128
|
+
return handleBuiltInCommand(parsed.command, ctx);
|
|
129
|
+
}
|
|
130
|
+
case 'agentCommand': {
|
|
131
|
+
return handleAgentCommand(parsed.command, parsed.prompt, ctx);
|
|
132
|
+
}
|
|
133
|
+
case 'audit': {
|
|
134
|
+
return handleAuditCommand(parsed.args, ctx);
|
|
135
|
+
}
|
|
136
|
+
case 'router': {
|
|
137
|
+
return handleRouterCommand(parsed.args, ctx);
|
|
138
|
+
}
|
|
139
|
+
case 'workspaces': {
|
|
140
|
+
return handleWorkspacesCommand(parsed.args, ctx);
|
|
141
|
+
}
|
|
142
|
+
case 'schedule': {
|
|
143
|
+
return handleScheduleCommand(parsed.args, ctx);
|
|
144
|
+
}
|
|
145
|
+
case 'job': {
|
|
146
|
+
return handleJobCommand(parsed.args, ctx);
|
|
147
|
+
}
|
|
148
|
+
case 'model': {
|
|
149
|
+
return handleModelCommand(parsed.args, ctx);
|
|
150
|
+
}
|
|
151
|
+
case 'think': {
|
|
152
|
+
return handleThinkCommand(parsed.args, ctx);
|
|
153
|
+
}
|
|
154
|
+
case 'stats': {
|
|
155
|
+
return handleStatsCommand(parsed.args, ctx);
|
|
156
|
+
}
|
|
157
|
+
case 'sessions': {
|
|
158
|
+
return handleSessionsCommand(parsed.args, ctx);
|
|
159
|
+
}
|
|
160
|
+
case 'approval': {
|
|
161
|
+
return handleApprovalCommand(parsed.args, ctx);
|
|
162
|
+
}
|
|
163
|
+
case 'plan': {
|
|
164
|
+
return handlePlanCommand(parsed.args, ctx);
|
|
165
|
+
}
|
|
166
|
+
case 'agent': {
|
|
167
|
+
const agent = registry.findAgent(parsed.agent);
|
|
168
|
+
if (!agent) {
|
|
169
|
+
return `❌ Agent "${parsed.agent}" not found. Use /agents to see available agents.`;
|
|
170
|
+
}
|
|
171
|
+
// Workspace whitelist must apply to explicit /<agent> too — otherwise
|
|
172
|
+
// a named workspace with `agents: ['oc']` cannot stop a member from
|
|
173
|
+
// bypassing it via /cc directly.
|
|
174
|
+
const wsAgent = workspaceRegistry.resolve(ctx.userId || 'unknown');
|
|
175
|
+
if (!wsAgent.hasAgent(agent.name)) {
|
|
176
|
+
return `🚫 Agent "${agent.name}" is not available in your workspace.\n\nTry /agents to see available agents.`;
|
|
177
|
+
}
|
|
178
|
+
// Per-workspace rate limit (falls back to userLimiter for default
|
|
179
|
+
// workspace which has no explicit limiter override).
|
|
180
|
+
const limitKeyAgent = `${ctx.platform}:${ctx.userId || 'unknown'}`;
|
|
181
|
+
const allowedAgent = wsAgent.id === 'default'
|
|
182
|
+
? userLimiter.allow(limitKeyAgent)
|
|
183
|
+
: wsAgent.allow(limitKeyAgent);
|
|
184
|
+
if (!allowedAgent) {
|
|
185
|
+
return formatRateLimitError(wsAgent, limitKeyAgent);
|
|
186
|
+
}
|
|
187
|
+
if (circuitBreaker.isOpen(agent.name)) {
|
|
188
|
+
return `⛔ ${agent.name} is temporarily unavailable (too many consecutive failures). Try again in a few minutes, or use another agent.`;
|
|
189
|
+
}
|
|
190
|
+
if (!(await isAgentAvailableCached(agent.name))) {
|
|
191
|
+
return formatAgentNotAvailableError(agent.name);
|
|
192
|
+
}
|
|
193
|
+
await sessionManager.switchAgent(ctx.platform, ctx.channelId, ctx.threadId, agent.name);
|
|
194
|
+
if (!parsed.prompt) {
|
|
195
|
+
return `✅ Switched to ${agent.name}`;
|
|
196
|
+
}
|
|
197
|
+
const session = await sessionManager.getOrCreateSession(ctx.platform, ctx.channelId, ctx.threadId, agent.name);
|
|
198
|
+
ctx.intent = 'explicit';
|
|
199
|
+
return callAgentWithHistory(agent, session.id, parsed.prompt, session.messages, ctx, session.model, session.variant, session.planMode);
|
|
200
|
+
}
|
|
201
|
+
case 'error': {
|
|
202
|
+
return `❓ ${parsed.error}\n\nUse /help to see available commands.`;
|
|
203
|
+
}
|
|
204
|
+
case 'default': {
|
|
205
|
+
// Resolve workspace upfront so rate-limit & whitelist share the same
|
|
206
|
+
// tenant context.
|
|
207
|
+
const ws = workspaceRegistry.resolve(ctx.userId || 'unknown');
|
|
208
|
+
const limitKey = `${ctx.platform}:${ctx.userId || 'unknown'}`;
|
|
209
|
+
const allowed = ws.id === 'default'
|
|
210
|
+
? userLimiter.allow(limitKey)
|
|
211
|
+
: ws.allow(limitKey);
|
|
212
|
+
if (!allowed) {
|
|
213
|
+
return formatRateLimitError(ws, limitKey);
|
|
214
|
+
}
|
|
215
|
+
const existingSession = await sessionManager.getExistingSession(ctx.platform, ctx.channelId, ctx.threadId);
|
|
216
|
+
// If active subtask, route message to subtask's independent session
|
|
217
|
+
if (existingSession?.activeSubtaskId) {
|
|
218
|
+
const tid = existingSession.activeSubtaskId;
|
|
219
|
+
const job = getJob(tid);
|
|
220
|
+
if (!job) {
|
|
221
|
+
return `❌ 任务 #${tid} 已不存在。使用 /job switch main 返回主会话。`;
|
|
222
|
+
}
|
|
223
|
+
const tAgent = registry.findAgent(job.agent);
|
|
224
|
+
if (!tAgent) {
|
|
225
|
+
return `❌ 任务 #${tid} 的 Agent "${job.agent}" 不可用。`;
|
|
226
|
+
}
|
|
227
|
+
const subSession = await sessionManager.getOrCreateSubSession(ctx.platform, ctx.channelId, ctx.threadId, tid, job.agent);
|
|
228
|
+
if (!parsed.prompt) {
|
|
229
|
+
return `💬 继续对话(任务 #${tid}, ${job.agent})`;
|
|
230
|
+
}
|
|
231
|
+
// Use sub-session for this turn
|
|
232
|
+
await sessionManager.addMessage(ctx.platform, ctx.channelId, `${ctx.threadId}:sub:${tid}`, {
|
|
233
|
+
role: 'user', content: parsed.prompt, timestamp: new Date()
|
|
234
|
+
});
|
|
235
|
+
return callAgentWithHistory(tAgent, subSession.id, parsed.prompt, subSession.messages, ctx, subSession.model, subSession.variant, subSession.planMode);
|
|
236
|
+
}
|
|
237
|
+
// Use intent classifier to pick best agent
|
|
238
|
+
const stickyAgent = existingSession?.agent;
|
|
239
|
+
let agentName;
|
|
240
|
+
let intent = 'fallback';
|
|
241
|
+
let ruleScore = 0;
|
|
242
|
+
try {
|
|
243
|
+
const classification = classifyIntent(parsed.prompt, stickyAgent, ctx.logger);
|
|
244
|
+
agentName = classification.agent;
|
|
245
|
+
intent = classification.triggeredBy;
|
|
246
|
+
ruleScore = classification.score;
|
|
247
|
+
ctx.logger.info({ event: 'router.intent', agent: agentName, intent, score: classification.score, reason: classification.reason });
|
|
248
|
+
}
|
|
249
|
+
catch (err) {
|
|
250
|
+
// L12: don't swallow the error silently — operators tracking down
|
|
251
|
+
// an intent-classifier bug otherwise see a `router.intent.failed`
|
|
252
|
+
// line with no signal about which input or which line threw.
|
|
253
|
+
agentName = stickyAgent || ctx.defaultAgent;
|
|
254
|
+
ctx.logger.warn({
|
|
255
|
+
event: 'router.intent.failed',
|
|
256
|
+
fallback: agentName,
|
|
257
|
+
err: err instanceof Error ? err.message : String(err),
|
|
258
|
+
stack: err instanceof Error ? err.stack : undefined,
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
// P2-H: when the rule-based classifier produced a low-confidence
|
|
262
|
+
// pick (no topic/keyword match) and an LLM judge is configured,
|
|
263
|
+
// ask the judge. We only consider it for *non-sticky* requests so
|
|
264
|
+
// active conversations stay deterministic.
|
|
265
|
+
const judge = getLLMJudge();
|
|
266
|
+
if (judge && intent === 'fallback' && ruleScore < (judge.threshold ?? 1.0) && !stickyAgent) {
|
|
267
|
+
const candidates = workspaceRegistry.resolve(ctx.userId || 'unknown').agentWhitelist.size === 0
|
|
268
|
+
? registry.listAgents().filter((a) => !circuitBreaker.isOpen(a))
|
|
269
|
+
: registry.listAgents().filter((a) => !circuitBreaker.isOpen(a) &&
|
|
270
|
+
workspaceRegistry.resolve(ctx.userId || 'unknown').hasAgent(a));
|
|
271
|
+
const picked = await classifyWithLLM(parsed.prompt, candidates, (n) => registry.findAgent(n));
|
|
272
|
+
if (picked) {
|
|
273
|
+
agentName = picked.agent;
|
|
274
|
+
intent = 'llm';
|
|
275
|
+
ctx.logger.info({ event: 'router.intent.llm', agent: agentName, reason: picked.reason });
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
// Stash on ctx so callAgentWithHistory writes it into the audit row.
|
|
279
|
+
ctx.intent = intent;
|
|
280
|
+
const agent = registry.findAgent(agentName);
|
|
281
|
+
if (!agent) {
|
|
282
|
+
return `❌ Agent "${agentName}" not configured.`;
|
|
283
|
+
}
|
|
284
|
+
if (circuitBreaker.isOpen(agent.name)) {
|
|
285
|
+
const openAgents = circuitBreaker.listOpen().join(', ');
|
|
286
|
+
return `⛔ ${agent.name} is temporarily unavailable (circuit breaker open).\nCurrently blocked: ${openAgents || 'none'}\n\nTry /agents to see available agents, or wait a few minutes.`;
|
|
287
|
+
}
|
|
288
|
+
// Workspace already resolved above — check the whitelist before
|
|
289
|
+
// exposing the agent to the message.
|
|
290
|
+
if (!ws.hasAgent(agent.name)) {
|
|
291
|
+
return `🚫 Agent "${agent.name}" is not available in your workspace.\n\nTry /agents to see available agents.`;
|
|
292
|
+
}
|
|
293
|
+
if (!(await isAgentAvailableCached(agent.name))) {
|
|
294
|
+
return formatAgentNotAvailableError(agent.name);
|
|
295
|
+
}
|
|
296
|
+
if (!parsed.prompt) {
|
|
297
|
+
return '💬 Send a message to chat with the agent.';
|
|
298
|
+
}
|
|
299
|
+
// Switch session agent if intent picked a different one
|
|
300
|
+
if (agentName !== stickyAgent) {
|
|
301
|
+
await sessionManager.switchAgent(ctx.platform, ctx.channelId, ctx.threadId, agentName);
|
|
302
|
+
}
|
|
303
|
+
const session = await sessionManager.getOrCreateSession(ctx.platform, ctx.channelId, ctx.threadId, agentName);
|
|
304
|
+
return callAgentWithHistory(agent, session.id, parsed.prompt, session.messages, ctx, session.model, session.variant, session.planMode);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Call agent with conversation history and save messages.
|
|
310
|
+
* Exported so command handlers (commands/*.ts) can reuse it.
|
|
311
|
+
*/
|
|
312
|
+
export async function callAgentWithHistory(agent, sessionId, prompt, history, ctx, model, variant, planMode) {
|
|
313
|
+
await sessionManager.addMessage(ctx.platform, ctx.channelId, ctx.threadId, {
|
|
314
|
+
role: 'user',
|
|
315
|
+
content: prompt,
|
|
316
|
+
timestamp: new Date()
|
|
317
|
+
});
|
|
318
|
+
const startTime = Date.now();
|
|
319
|
+
ctx.logger.info({ event: 'agent.invoke.start', agent: agent.name, promptLen: prompt.length, historyLen: history.length });
|
|
320
|
+
// When we're resuming an existing claude session, claude already has the
|
|
321
|
+
// conversation log on disk — feeding history again would duplicate every
|
|
322
|
+
// prior turn in the model's view. Pass an empty history in that case so
|
|
323
|
+
// claude relies purely on its native session memory.
|
|
324
|
+
const effectiveHistory = ctx.agentSessionResume ? [] : history;
|
|
325
|
+
// Per-call accumulators for adapters that surface usage / session-id
|
|
326
|
+
// inline (currently opencode). Closure-bound so concurrent runs can't
|
|
327
|
+
// race each other.
|
|
328
|
+
let usageAcc = 0;
|
|
329
|
+
const onAgentSessionId = (id) => {
|
|
330
|
+
// Persist the adapter-reported id on first sighting so the next turn can
|
|
331
|
+
// pass it back via --session / exec resume. Setters are idempotent.
|
|
332
|
+
// Routed by agent name so each adapter writes to its own session column.
|
|
333
|
+
const name = agent.name;
|
|
334
|
+
if (name === 'opencode') {
|
|
335
|
+
void sessionManager.setOpencodeSessionId(ctx.platform, ctx.channelId, ctx.threadId, id)
|
|
336
|
+
.catch((err) => ctx.logger.debug({ err: String(err) }, 'setOpencodeSessionId failed'));
|
|
337
|
+
}
|
|
338
|
+
else if (name === 'codex') {
|
|
339
|
+
void sessionManager.setCodexSessionId(ctx.platform, ctx.channelId, ctx.threadId, id)
|
|
340
|
+
.catch((err) => ctx.logger.debug({ err: String(err) }, 'setCodexSessionId failed'));
|
|
341
|
+
}
|
|
342
|
+
// claude-code pre-allocates its own UUID in cli.ts, never calls back here.
|
|
343
|
+
};
|
|
344
|
+
const onUsage = (delta) => {
|
|
345
|
+
if (typeof delta.costUsd === 'number' && Number.isFinite(delta.costUsd))
|
|
346
|
+
usageAcc += delta.costUsd;
|
|
347
|
+
};
|
|
348
|
+
// Plan mode kill-switch: ops can flip IMHUB_DISABLE_PLAN_MODE=1 to ignore
|
|
349
|
+
// every session's planMode flag without redeploying. Matches the same env
|
|
350
|
+
// var that short-circuits the /plan command itself.
|
|
351
|
+
const effectivePlanMode = planMode === true && process.env.IMHUB_DISABLE_PLAN_MODE !== '1';
|
|
352
|
+
const generator = agent.sendPrompt(sessionId, prompt, effectiveHistory, {
|
|
353
|
+
model,
|
|
354
|
+
variant,
|
|
355
|
+
threadId: ctx.threadId,
|
|
356
|
+
platform: ctx.platform,
|
|
357
|
+
userId: ctx.userId,
|
|
358
|
+
channelId: ctx.channelId,
|
|
359
|
+
agentSessionId: ctx.agentSessionId,
|
|
360
|
+
agentSessionResume: ctx.agentSessionResume,
|
|
361
|
+
onAgentSessionId,
|
|
362
|
+
onUsage,
|
|
363
|
+
planMode: effectivePlanMode || undefined,
|
|
364
|
+
});
|
|
365
|
+
return (async function* () {
|
|
366
|
+
let fullResponse = '';
|
|
367
|
+
let invocationError;
|
|
368
|
+
try {
|
|
369
|
+
for await (const chunk of generator) {
|
|
370
|
+
fullResponse += chunk;
|
|
371
|
+
yield chunk;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
catch (err) {
|
|
375
|
+
invocationError = err instanceof Error ? err.message : String(err);
|
|
376
|
+
throw err;
|
|
377
|
+
}
|
|
378
|
+
finally {
|
|
379
|
+
const durationMs = Date.now() - startTime;
|
|
380
|
+
if (fullResponse.trim()) {
|
|
381
|
+
await sessionManager.addMessage(ctx.platform, ctx.channelId, ctx.threadId, {
|
|
382
|
+
role: 'assistant',
|
|
383
|
+
content: fullResponse,
|
|
384
|
+
timestamp: new Date()
|
|
385
|
+
});
|
|
386
|
+
}
|
|
387
|
+
ctx.logger.info({
|
|
388
|
+
event: 'agent.invoke.end',
|
|
389
|
+
agent: agent.name,
|
|
390
|
+
durationMs,
|
|
391
|
+
responseLen: fullResponse.length,
|
|
392
|
+
});
|
|
393
|
+
// Cost: prefer the inline usage accumulator (opencode emits this in
|
|
394
|
+
// step_finish events), fall back to legacy `getLastCost` for any
|
|
395
|
+
// adapter that still uses it. Adapters with no usage path default
|
|
396
|
+
// to 0.
|
|
397
|
+
const costFn = agent?.getLastCost;
|
|
398
|
+
const legacyCost = typeof costFn === 'function' ? Number(costFn.call(agent)) || 0 : 0;
|
|
399
|
+
const cost = usageAcc > 0 ? usageAcc : legacyCost;
|
|
400
|
+
logInvocation({
|
|
401
|
+
traceId: ctx.traceId,
|
|
402
|
+
userId: ctx.userId || 'unknown',
|
|
403
|
+
platform: ctx.platform,
|
|
404
|
+
agent: agent.name,
|
|
405
|
+
// Carry the intent the router picked (or 'explicit' for /<agent>
|
|
406
|
+
// commands which set ctx.intent='explicit' upstream).
|
|
407
|
+
intent: ctx.intent || 'default',
|
|
408
|
+
promptLen: prompt.length,
|
|
409
|
+
responseLen: fullResponse.length,
|
|
410
|
+
durationMs,
|
|
411
|
+
cost,
|
|
412
|
+
success: !invocationError,
|
|
413
|
+
error: invocationError,
|
|
414
|
+
});
|
|
415
|
+
if (invocationError) {
|
|
416
|
+
circuitBreaker.recordFailure(agent.name);
|
|
417
|
+
}
|
|
418
|
+
else {
|
|
419
|
+
circuitBreaker.recordSuccess(agent.name);
|
|
420
|
+
// Roll up into the session-level usage so /stats reflects reality.
|
|
421
|
+
await sessionManager.recordUsage(ctx.platform, ctx.channelId, ctx.threadId, {
|
|
422
|
+
costUsd: cost,
|
|
423
|
+
promptChars: prompt.length,
|
|
424
|
+
responseChars: fullResponse.length,
|
|
425
|
+
durationMs,
|
|
426
|
+
});
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
})();
|
|
430
|
+
}
|
|
431
|
+
//# sourceMappingURL=router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/core/router.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validate a user-supplied webhook URL before the scheduler POSTs to it.
|
|
3
|
+
* Defends against accidental misconfig and basic SSRF: no protocols other
|
|
4
|
+
* than http(s); no loopback / RFC1918 / link-local destinations unless the
|
|
5
|
+
* operator explicitly opts in via IMHUB_ALLOW_PRIVATE_WEBHOOKS=1.
|
|
6
|
+
*
|
|
7
|
+
* Note: this is a lexical check (IP literals + "localhost"). DNS-rebinding
|
|
8
|
+
* mitigation requires an at-fetch-time guard; tracked separately.
|
|
9
|
+
*/
|
|
10
|
+
export declare function validateWebhookUrl(raw: string): {
|
|
11
|
+
ok: true;
|
|
12
|
+
url: URL;
|
|
13
|
+
} | {
|
|
14
|
+
ok: false;
|
|
15
|
+
reason: string;
|
|
16
|
+
};
|
|
17
|
+
export interface Schedule {
|
|
18
|
+
id: number;
|
|
19
|
+
name: string;
|
|
20
|
+
agent: string;
|
|
21
|
+
prompt: string;
|
|
22
|
+
cron: string;
|
|
23
|
+
enabled: number;
|
|
24
|
+
next_run: string;
|
|
25
|
+
last_run: string | null;
|
|
26
|
+
notify_url: string | null;
|
|
27
|
+
created_at: string;
|
|
28
|
+
/** IM userId of the originating caller, or '' for legacy / system rows. */
|
|
29
|
+
creator_id: string;
|
|
30
|
+
/** Workspace this schedule was created under, or '' if unknown. */
|
|
31
|
+
workspace_id: string;
|
|
32
|
+
}
|
|
33
|
+
/** Filter / scoping options for owner-sensitive schedule APIs. Identical
|
|
34
|
+
* semantics to {@link OwnerOpts} on job-board.ts. */
|
|
35
|
+
export interface OwnerOpts {
|
|
36
|
+
creatorId?: string;
|
|
37
|
+
/** Optional agent-name filter, mirrors job-board.OwnerOpts.agent. */
|
|
38
|
+
agent?: string;
|
|
39
|
+
}
|
|
40
|
+
export interface CreateScheduleInput {
|
|
41
|
+
name: string;
|
|
42
|
+
agent: string;
|
|
43
|
+
prompt: string;
|
|
44
|
+
cron: string;
|
|
45
|
+
notifyUrl?: string;
|
|
46
|
+
enabled?: boolean;
|
|
47
|
+
/** IM userId of the originating caller. Empty / undefined → '' (legacy). */
|
|
48
|
+
creatorId?: string;
|
|
49
|
+
/** Workspace this schedule was created under. */
|
|
50
|
+
workspaceId?: string;
|
|
51
|
+
}
|
|
52
|
+
export declare function createSchedule(input: CreateScheduleInput): number;
|
|
53
|
+
export declare function listSchedules(limit?: number, opts?: OwnerOpts): Schedule[];
|
|
54
|
+
export declare function getSchedule(id: number, opts?: OwnerOpts): Schedule | null;
|
|
55
|
+
export declare function deleteSchedule(id: number, opts?: OwnerOpts): boolean;
|
|
56
|
+
export declare function setEnabled(id: number, enabled: boolean, opts?: OwnerOpts): boolean;
|
|
57
|
+
/** Run one tick — exposed for tests so they don't have to wait for setInterval. */
|
|
58
|
+
export declare function tick(now?: Date): Promise<number>;
|
|
59
|
+
/** Start the periodic ticker. Idempotent. */
|
|
60
|
+
export declare function startScheduler(): void;
|
|
61
|
+
export declare function stopScheduler(): void;
|
|
62
|
+
/** Close the underlying SQLite handle. Called by cli.ts on graceful
|
|
63
|
+
* shutdown so the WAL is checkpointed before exit (L2). */
|
|
64
|
+
export declare function closeScheduleDb(): void;
|
|
65
|
+
//# sourceMappingURL=schedule.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schedule.d.ts","sourceRoot":"","sources":["../../src/core/schedule.ts"],"names":[],"mappings":"AA6BA;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,GAAG,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAqCtG;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,UAAU,EAAE,MAAM,CAAA;IAClB,2EAA2E;IAC3E,UAAU,EAAE,MAAM,CAAA;IAClB,mEAAmE;IACnE,YAAY,EAAE,MAAM,CAAA;CACrB;AAED;sDACsD;AACtD,MAAM,WAAW,SAAS;IACxB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AA+CD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,4EAA4E;IAC5E,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iDAAiD;IACjD,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,MAAM,CAgBjE;AAED,wBAAgB,aAAa,CAAC,KAAK,SAAK,EAAE,IAAI,GAAE,SAAc,GAAG,QAAQ,EAAE,CAa1E;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,GAAE,SAAc,GAAG,QAAQ,GAAG,IAAI,CAQ7E;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,GAAE,SAAc,GAAG,OAAO,CAQxE;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,GAAE,SAAc,GAAG,OAAO,CAUtF;AAwGD,mFAAmF;AACnF,wBAAsB,IAAI,CAAC,GAAG,GAAE,IAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAWlE;AAED,6CAA6C;AAC7C,wBAAgB,cAAc,IAAI,IAAI,CAOrC;AAED,wBAAgB,aAAa,IAAI,IAAI,CAKpC;AAED;4DAC4D;AAC5D,wBAAgB,eAAe,IAAI,IAAI,CAEtC"}
|