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,549 @@
|
|
|
1
|
+
// OpenCode HTTP driver.
|
|
2
|
+
//
|
|
3
|
+
// Why this exists:
|
|
4
|
+
// `opencode run --format json` (the stdio driver in opencode-stdio-adapter.ts)
|
|
5
|
+
// does NOT emit `permission.asked` events on its stdout stream, and its
|
|
6
|
+
// inline auto-reject logic occasionally fails to release the prompt
|
|
7
|
+
// deferred — the process then hangs until im-hub's 30-min hard SIGTERM.
|
|
8
|
+
// Audit confirmed this on 2026-05-04 (rows id=283/284, exact 1,800,000 ms).
|
|
9
|
+
//
|
|
10
|
+
// What this driver does instead:
|
|
11
|
+
// 1. Lazily starts a long-lived `opencode serve` daemon on 127.0.0.1
|
|
12
|
+
// (via OpencodeServeManager). Probes-and-reuses any healthy daemon
|
|
13
|
+
// already on the configured port so back-to-back im-hub restarts
|
|
14
|
+
// don't bind-fail on a still-running child.
|
|
15
|
+
// 2. Subscribes to /event SSE so the adapter — not the run-CLI — owns the
|
|
16
|
+
// authoritative event stream.
|
|
17
|
+
// 3. Creates sessions via POST /session and submits prompts via
|
|
18
|
+
// POST /session/:id/message. Resumes existing sessions when
|
|
19
|
+
// opts.agentSessionId is set; on first turn of a resumed session this
|
|
20
|
+
// process lifetime, PATCHes the session ruleset to apply the current
|
|
21
|
+
// gate policy.
|
|
22
|
+
// 4. Routes `permission.asked` SSE events through the IM approval bus
|
|
23
|
+
// when an IM context (threadId + platform) and notifier are both
|
|
24
|
+
// available. Decisions translate: allow → opencode `once`, deny →
|
|
25
|
+
// opencode `reject` (with optional message). Without an IM channel
|
|
26
|
+
// the adapter falls back to auto-`once` so non-IM call paths (web,
|
|
27
|
+
// scheduler) keep working.
|
|
28
|
+
// 5. Exits cleanly on `session.status: idle` for the right session,
|
|
29
|
+
// surfaces `session.error`, and is bounded by OPENCODE_TIMEOUT_MS
|
|
30
|
+
// (default 30 min).
|
|
31
|
+
//
|
|
32
|
+
// Selection: env IMHUB_OPENCODE_DRIVER=http picks this; anything else (incl
|
|
33
|
+
// unset) picks the stdio adapter. See ./index.ts factory.
|
|
34
|
+
//
|
|
35
|
+
// Gate policy: env IMHUB_OPENCODE_GATE controls which permissions surface
|
|
36
|
+
// as IM cards. See buildSessionRuleset() for the strict / medium / loose /
|
|
37
|
+
// none levels — medium is the default and gates edit / write / patch.
|
|
38
|
+
//
|
|
39
|
+
// Compatibility: extends OpenCodeAdapter so registry / tests that probe
|
|
40
|
+
// `instanceof OpenCodeAdapter` stay green. The base class's spawnStream is
|
|
41
|
+
// not used — sendPrompt is overridden end-to-end.
|
|
42
|
+
import { OpenCodeAdapter } from './opencode-stdio-adapter.js';
|
|
43
|
+
import { resolveAgentCwd } from '../../../core/agent-cwd.js';
|
|
44
|
+
import { logger as rootLogger } from '../../../core/logger.js';
|
|
45
|
+
import { opencodeServe as defaultServe } from './serve-manager.js';
|
|
46
|
+
import { approvalBus as defaultApprovalBus } from '../../../core/approval-bus.js';
|
|
47
|
+
const log = rootLogger.child({ component: 'agent.opencode.http' });
|
|
48
|
+
const DEFAULT_TIMEOUT_MS = 30 * 60 * 1000;
|
|
49
|
+
export class OpenCodeHttpAdapter extends OpenCodeAdapter {
|
|
50
|
+
serve;
|
|
51
|
+
fetchImpl;
|
|
52
|
+
/** null when the bridge is intentionally disabled. */
|
|
53
|
+
approvalBus;
|
|
54
|
+
/** Set of opencode session ids whose ruleset we've already PATCHed in this
|
|
55
|
+
* process lifetime. Lets us re-apply the gate policy when an im-hub
|
|
56
|
+
* restart resurfaces an old session, without duplicating rules every
|
|
57
|
+
* turn. Cleared only by im-hub restart — that's fine since the rules
|
|
58
|
+
* the previous run wrote are still in opencode's session DB. */
|
|
59
|
+
rulesetApplied = new Set();
|
|
60
|
+
constructor(opts = {}) {
|
|
61
|
+
super();
|
|
62
|
+
this.serve = opts.serve ?? defaultServe;
|
|
63
|
+
this.fetchImpl = opts.fetchImpl ?? fetch;
|
|
64
|
+
this.approvalBus = opts.approvalBus === null
|
|
65
|
+
? null
|
|
66
|
+
: (opts.approvalBus ?? defaultApprovalBus);
|
|
67
|
+
log.info({ event: 'opencode.http.driver_selected', bridge: this.approvalBus !== null }, '[opencode] HTTP driver active (real serve + SSE; IM approval bridge when bus has notifier)');
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Translate a single SSE event into adapter-side effects:
|
|
71
|
+
* - sessionID capture → opts.onAgentSessionId
|
|
72
|
+
* - step-finish cost/tokens → opts.onUsage
|
|
73
|
+
* - text-part with finished `time.end` → returned as a chunk
|
|
74
|
+
* Pure: tests drive this directly without spinning up a daemon.
|
|
75
|
+
*/
|
|
76
|
+
inspectHttpEvent(event, sessionID, opts) {
|
|
77
|
+
const props = event.properties ?? {};
|
|
78
|
+
const part = props.part;
|
|
79
|
+
// sessionID can appear on the event root, on properties, on properties.info
|
|
80
|
+
// or inside part. Bubble up the first one we see — setOpencodeSessionId
|
|
81
|
+
// (the receiver) is idempotent.
|
|
82
|
+
const sid = props.sessionID || part?.sessionID || props.info?.sessionID;
|
|
83
|
+
if (sid && opts.onAgentSessionId) {
|
|
84
|
+
try {
|
|
85
|
+
opts.onAgentSessionId(sid);
|
|
86
|
+
}
|
|
87
|
+
catch { /* don't let userland callbacks kill the stream */ }
|
|
88
|
+
}
|
|
89
|
+
if (event.type === 'message.part.updated' && part) {
|
|
90
|
+
if (part.type === 'step-finish') {
|
|
91
|
+
const delta = {};
|
|
92
|
+
if (typeof part.cost === 'number' && Number.isFinite(part.cost))
|
|
93
|
+
delta.costUsd = part.cost;
|
|
94
|
+
if (typeof part.tokens?.input === 'number')
|
|
95
|
+
delta.tokensInput = part.tokens.input;
|
|
96
|
+
if (typeof part.tokens?.output === 'number')
|
|
97
|
+
delta.tokensOutput = part.tokens.output;
|
|
98
|
+
if (delta.costUsd !== undefined || delta.tokensInput !== undefined || delta.tokensOutput !== undefined) {
|
|
99
|
+
if (opts.onUsage) {
|
|
100
|
+
try {
|
|
101
|
+
opts.onUsage(delta);
|
|
102
|
+
}
|
|
103
|
+
catch { /* same — user callback safety */ }
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// Match the stdio adapter: only yield text once the part is fully
|
|
108
|
+
// emitted (time.end set). Avoids streaming partial fragments and keeps
|
|
109
|
+
// /stats response_len aligned across drivers.
|
|
110
|
+
const eventSid = props.sessionID || props.info?.sessionID || part.sessionID;
|
|
111
|
+
if (part.type === 'text' &&
|
|
112
|
+
part.text &&
|
|
113
|
+
part.time?.end &&
|
|
114
|
+
eventSid === sessionID) {
|
|
115
|
+
return { text: part.text };
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return {};
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* `session.status` event with status.type === 'idle' for our session is
|
|
122
|
+
* the canonical "stop" signal in opencode (cf. run.ts:532).
|
|
123
|
+
*/
|
|
124
|
+
isIdleEvent(event, sessionID) {
|
|
125
|
+
if (event.type !== 'session.status')
|
|
126
|
+
return false;
|
|
127
|
+
const props = event.properties ?? {};
|
|
128
|
+
const sid = props.sessionID || props.info?.sessionID;
|
|
129
|
+
if (sid !== sessionID)
|
|
130
|
+
return false;
|
|
131
|
+
return props.status?.type === 'idle' || props.info?.status?.type === 'idle';
|
|
132
|
+
}
|
|
133
|
+
isErrorEvent(event, sessionID) {
|
|
134
|
+
if (event.type !== 'session.error')
|
|
135
|
+
return null;
|
|
136
|
+
const props = event.properties ?? {};
|
|
137
|
+
if (props.sessionID !== sessionID)
|
|
138
|
+
return null;
|
|
139
|
+
const e = props.error;
|
|
140
|
+
let msg = 'session error';
|
|
141
|
+
if (e && typeof e === 'object') {
|
|
142
|
+
if (typeof e.name === 'string')
|
|
143
|
+
msg = e.name;
|
|
144
|
+
const data = e.data;
|
|
145
|
+
if (data && typeof data.message === 'string')
|
|
146
|
+
msg = data.message;
|
|
147
|
+
}
|
|
148
|
+
return { error: msg };
|
|
149
|
+
}
|
|
150
|
+
buildHttpContextualPrompt(prompt, history) {
|
|
151
|
+
if (!history || history.length === 0)
|
|
152
|
+
return prompt;
|
|
153
|
+
const historyText = history
|
|
154
|
+
.map(msg => `[${msg.role === 'user' ? 'User' : 'Assistant'}]: ${msg.content}`)
|
|
155
|
+
.join('\n\n');
|
|
156
|
+
return `Previous conversation context:\n${historyText}\n\nCurrent request: ${prompt}`;
|
|
157
|
+
}
|
|
158
|
+
async *sendPrompt(_sessionId, prompt, history, opts) {
|
|
159
|
+
const callOpts = opts ?? {};
|
|
160
|
+
const baseUrl = await this.serve.ensureRunning();
|
|
161
|
+
let sessionID = callOpts.agentSessionId;
|
|
162
|
+
if (!sessionID) {
|
|
163
|
+
sessionID = await this.createSession(baseUrl, callOpts);
|
|
164
|
+
if (callOpts.onAgentSessionId) {
|
|
165
|
+
try {
|
|
166
|
+
callOpts.onAgentSessionId(sessionID);
|
|
167
|
+
}
|
|
168
|
+
catch { /* ignore */ }
|
|
169
|
+
}
|
|
170
|
+
// Newly-created sessions already received the ruleset in createSession's
|
|
171
|
+
// POST body — no need to PATCH again. Mark applied so we skip the dup.
|
|
172
|
+
this.rulesetApplied.add(sessionID);
|
|
173
|
+
}
|
|
174
|
+
else if (callOpts.planMode) {
|
|
175
|
+
// Plan mode: opencode's `plan` primary agent already ships with its own
|
|
176
|
+
// stricter ruleset (edit denied except .opencode/plans/*.md). Stacking
|
|
177
|
+
// the medium-gate edit/write/patch=ask rules on top would just create
|
|
178
|
+
// redundant ask prompts during read-only planning. Skip the PATCH and
|
|
179
|
+
// let plan agent's defaults govern this turn. We intentionally do NOT
|
|
180
|
+
// mark rulesetApplied — once the user /plan off's and we resume normal
|
|
181
|
+
// turns, the next non-plan turn should re-apply the medium gate.
|
|
182
|
+
}
|
|
183
|
+
else if (!this.rulesetApplied.has(sessionID)) {
|
|
184
|
+
// Resumed session: opencode loaded its previously-stored ruleset,
|
|
185
|
+
// which may predate the current gate policy (older sessions were
|
|
186
|
+
// created with no override at all). PATCH the gate ruleset onto it
|
|
187
|
+
// so edit/write/patch correctly route through the IM bridge for the
|
|
188
|
+
// rest of this process's lifetime.
|
|
189
|
+
//
|
|
190
|
+
// Claim the slot synchronously so concurrent prompts on the same
|
|
191
|
+
// session don't fire duplicate PATCHes; remove on failure so the
|
|
192
|
+
// next turn retries instead of leaving the session permanently
|
|
193
|
+
// unguarded if this attempt fails transiently.
|
|
194
|
+
const targetSession = sessionID;
|
|
195
|
+
this.rulesetApplied.add(targetSession);
|
|
196
|
+
this.applyRuleset(baseUrl, targetSession).catch((err) => {
|
|
197
|
+
this.rulesetApplied.delete(targetSession);
|
|
198
|
+
log.warn({ event: 'opencode.http.apply_ruleset_failed', err: String(err), sessionID: targetSession });
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
log.info({ event: 'opencode.http.send', sessionID, historyLen: history?.length || 0, hasResume: !!callOpts.agentSessionResume }, 'sendPrompt');
|
|
202
|
+
// When resuming, opencode already has the conversation in its DB — feeding
|
|
203
|
+
// history again would duplicate every prior turn. (Same invariant as the
|
|
204
|
+
// stdio driver — see router.callAgentWithHistory zeroing effectiveHistory.)
|
|
205
|
+
const contextualPrompt = callOpts.agentSessionResume
|
|
206
|
+
? prompt
|
|
207
|
+
: this.buildHttpContextualPrompt(prompt, history);
|
|
208
|
+
// Subscribe BEFORE posting so we don't miss early events.
|
|
209
|
+
const sse = await this.openEventStream(baseUrl);
|
|
210
|
+
const promptPromise = this.postPrompt(baseUrl, sessionID, contextualPrompt, callOpts)
|
|
211
|
+
.catch((err) => ({ error: err instanceof Error ? err : new Error(String(err)) }));
|
|
212
|
+
const timeoutMs = resolveTimeout();
|
|
213
|
+
const timeoutAt = Date.now() + timeoutMs;
|
|
214
|
+
let surfacedError = null;
|
|
215
|
+
try {
|
|
216
|
+
for await (const event of sse) {
|
|
217
|
+
if (Date.now() > timeoutAt) {
|
|
218
|
+
log.warn({ event: 'opencode.http.timeout', sessionID, timeoutMs }, 'http adapter timed out');
|
|
219
|
+
yield `\n\n⚠️ 处理超时(已超过 ${Math.round(timeoutMs / 60000)} 分钟)`;
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
if (event.type === 'permission.asked') {
|
|
223
|
+
this.routeAsk(event, baseUrl, sessionID, callOpts);
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
const errEvent = this.isErrorEvent(event, sessionID);
|
|
227
|
+
if (errEvent) {
|
|
228
|
+
surfacedError = errEvent.error;
|
|
229
|
+
continue;
|
|
230
|
+
}
|
|
231
|
+
const { text } = this.inspectHttpEvent(event, sessionID, callOpts);
|
|
232
|
+
if (text)
|
|
233
|
+
yield text;
|
|
234
|
+
if (this.isIdleEvent(event, sessionID)) {
|
|
235
|
+
break;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
finally {
|
|
240
|
+
sse.close();
|
|
241
|
+
}
|
|
242
|
+
const result = await promptPromise;
|
|
243
|
+
if (result && typeof result === 'object' && 'error' in result) {
|
|
244
|
+
log.warn({ event: 'opencode.http.prompt_failed', err: String(result.error) }, 'prompt POST failed');
|
|
245
|
+
yield `opencode failed: ${result.error.message}`;
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
if (surfacedError) {
|
|
249
|
+
yield `opencode session error: ${surfacedError}`;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
// ─── permission bridge ────────────────────────────────────────────────
|
|
253
|
+
/**
|
|
254
|
+
* Decide how to handle a `permission.asked` SSE event:
|
|
255
|
+
* - If `this.approvalBus` is set AND has a notifier installed AND the
|
|
256
|
+
* call carries enough IM context (threadId + platform) → register a
|
|
257
|
+
* synthetic pending so the user gets an IM card; the bus's resolve
|
|
258
|
+
* callback POSTs the decision back to opencode via /permission/.../reply.
|
|
259
|
+
* - Otherwise → fall back to `once`. Without an IM channel there's no
|
|
260
|
+
* human to ask, and a plain `reject` would surface as a tool-call
|
|
261
|
+
* failure mid-conversation which is worse UX than allowing.
|
|
262
|
+
*
|
|
263
|
+
* Fire-and-forget: the SSE loop must keep draining other events while the
|
|
264
|
+
* bridge waits for the user. The bus enforces its own timeout (5 min by
|
|
265
|
+
* default) so we never deadlock the SSE loop.
|
|
266
|
+
*/
|
|
267
|
+
routeAsk(event, baseUrl, ocSessionID, opts) {
|
|
268
|
+
const props = event.properties ?? {};
|
|
269
|
+
const reqId = props.id;
|
|
270
|
+
if (typeof reqId !== 'string')
|
|
271
|
+
return;
|
|
272
|
+
const fallback = () => {
|
|
273
|
+
this.replyPermission(baseUrl, reqId, 'once').catch((err) => {
|
|
274
|
+
log.warn({ event: 'opencode.http.ask_fallback_failed', err: String(err), reqId });
|
|
275
|
+
});
|
|
276
|
+
};
|
|
277
|
+
const bus = this.approvalBus;
|
|
278
|
+
const canBridge = bus !== null && bus.hasNotifier()
|
|
279
|
+
&& typeof opts.threadId === 'string' && opts.threadId.length > 0
|
|
280
|
+
&& typeof opts.platform === 'string' && opts.platform.length > 0;
|
|
281
|
+
if (!canBridge) {
|
|
282
|
+
fallback();
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
const ctx = {
|
|
286
|
+
threadId: opts.threadId,
|
|
287
|
+
platform: opts.platform,
|
|
288
|
+
userId: opts.userId ?? '',
|
|
289
|
+
channelId: opts.channelId ?? '',
|
|
290
|
+
};
|
|
291
|
+
const dispatch = (decision) => {
|
|
292
|
+
const wire = decisionToOpencodeReply(decision);
|
|
293
|
+
this.replyPermission(baseUrl, reqId, wire.reply, wire.message).catch((err) => {
|
|
294
|
+
log.warn({ event: 'opencode.http.ask_reply_failed', err: String(err), reqId });
|
|
295
|
+
});
|
|
296
|
+
};
|
|
297
|
+
bus.registerSyntheticPending({
|
|
298
|
+
runId: ocSessionID, // opencode session id IS the run id from the bus's POV
|
|
299
|
+
reqId,
|
|
300
|
+
toolName: typeof props.permission === 'string' ? props.permission : 'permission',
|
|
301
|
+
input: {
|
|
302
|
+
...(Array.isArray(props.patterns) ? { patterns: props.patterns } : {}),
|
|
303
|
+
...(props.metadata && typeof props.metadata === 'object' ? props.metadata : {}),
|
|
304
|
+
},
|
|
305
|
+
ctx,
|
|
306
|
+
dispatch,
|
|
307
|
+
}).catch((err) => {
|
|
308
|
+
// Bus rejected (e.g. notifier removed mid-flight). Safety: fall back.
|
|
309
|
+
log.warn({ event: 'opencode.http.bridge_register_failed', err: String(err), reqId });
|
|
310
|
+
fallback();
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Build the session-level permission ruleset to append to opencode's
|
|
315
|
+
* agent defaults. See createSession's docstring for policy rationale.
|
|
316
|
+
*
|
|
317
|
+
* The returned rules are flat `{permission, pattern, action}` objects
|
|
318
|
+
* matching opencode's `Permission.Rule` schema.
|
|
319
|
+
*/
|
|
320
|
+
buildSessionRuleset() {
|
|
321
|
+
const gate = (process.env.IMHUB_OPENCODE_GATE || 'medium').toLowerCase();
|
|
322
|
+
const ask = (permission) => ({ permission, pattern: '*', action: 'ask' });
|
|
323
|
+
if (gate === 'none')
|
|
324
|
+
return [];
|
|
325
|
+
if (gate === 'strict')
|
|
326
|
+
return [ask('edit'), ask('write'), ask('patch'), ask('bash')];
|
|
327
|
+
if (gate === 'loose')
|
|
328
|
+
return [ask('edit'), ask('write')];
|
|
329
|
+
return [ask('edit'), ask('write'), ask('patch')]; // medium (default)
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* PATCH a resumed session with our gate ruleset so subsequent tool calls
|
|
333
|
+
* surface as `permission.asked` events for the bridge. opencode's update
|
|
334
|
+
* endpoint merges (current + payload) — payload comes last and wins under
|
|
335
|
+
* findLast semantics. Idempotent across im-hub restarts but NOT within a
|
|
336
|
+
* single process: the caller (sendPrompt) gates on rulesetApplied.
|
|
337
|
+
*/
|
|
338
|
+
async applyRuleset(baseUrl, sessionID) {
|
|
339
|
+
const ruleset = this.buildSessionRuleset();
|
|
340
|
+
if (ruleset.length === 0)
|
|
341
|
+
return; // gate=none
|
|
342
|
+
const res = await this.fetchImpl(`${baseUrl}/session/${sessionID}`, {
|
|
343
|
+
method: 'PATCH',
|
|
344
|
+
headers: { 'Content-Type': 'application/json' },
|
|
345
|
+
body: JSON.stringify({ permission: ruleset }),
|
|
346
|
+
});
|
|
347
|
+
if (!res.ok) {
|
|
348
|
+
throw new Error(`opencode session update failed: HTTP ${res.status}`);
|
|
349
|
+
}
|
|
350
|
+
await res.text().catch(() => '');
|
|
351
|
+
log.info({ event: 'opencode.http.ruleset_applied', sessionID, gate: process.env.IMHUB_OPENCODE_GATE || 'medium' }, 'applied gate ruleset to resumed session');
|
|
352
|
+
}
|
|
353
|
+
// ─── HTTP plumbing ──────────────────────────────────────────────────────
|
|
354
|
+
async createSession(baseUrl, opts) {
|
|
355
|
+
// Session-level permission overrides for IM-launched runs.
|
|
356
|
+
//
|
|
357
|
+
// Why we override at all:
|
|
358
|
+
// opencode's built-in `build` agent ships with a `*: allow` catch-all
|
|
359
|
+
// (agent.ts:86-103 in the upstream repo). With findLast semantics,
|
|
360
|
+
// that swallows mutating tools like edit/write/patch unless we
|
|
361
|
+
// *append* stricter rules whose specificity wins.
|
|
362
|
+
//
|
|
363
|
+
// The "medium" policy (default):
|
|
364
|
+
// - edit / write / patch → ask: any time the assistant wants to
|
|
365
|
+
// mutate files, surface an IM card. These are the operations a
|
|
366
|
+
// user wants to "拍板".
|
|
367
|
+
// - bash is intentionally NOT gated: IM-driven exploration involves
|
|
368
|
+
// a flood of `ls` / `cat` / `git status` and asking on every one
|
|
369
|
+
// would drown the user. Mutations the LLM does via bash (rm,
|
|
370
|
+
// npm install, git commit) aren't caught here — that's a known
|
|
371
|
+
// gap; revisit if it bites in practice.
|
|
372
|
+
// - external_directory is already `ask` by default for paths
|
|
373
|
+
// outside the cwd / skill whitelist; we don't need to repeat it
|
|
374
|
+
// and it would be surprising to override.
|
|
375
|
+
//
|
|
376
|
+
// Override path: env IMHUB_OPENCODE_GATE=strict|loose|none flips this
|
|
377
|
+
// policy without redeploy:
|
|
378
|
+
// strict → bash also asks
|
|
379
|
+
// loose → only write+edit (drop patch)
|
|
380
|
+
// none → no override (mostly for debugging)
|
|
381
|
+
const body = {
|
|
382
|
+
title: 'im-hub session',
|
|
383
|
+
};
|
|
384
|
+
// Plan mode: route through opencode's built-in `plan` agent and skip our
|
|
385
|
+
// medium-gate ruleset entirely (plan agent's edit-deny-except-plans
|
|
386
|
+
// policy is already stricter than the IM gate would impose).
|
|
387
|
+
if (opts.planMode) {
|
|
388
|
+
body.agent = 'plan';
|
|
389
|
+
}
|
|
390
|
+
else {
|
|
391
|
+
body.permission = this.buildSessionRuleset();
|
|
392
|
+
}
|
|
393
|
+
const res = await this.fetchImpl(`${baseUrl}/session`, {
|
|
394
|
+
method: 'POST',
|
|
395
|
+
headers: { 'Content-Type': 'application/json' },
|
|
396
|
+
body: JSON.stringify(body),
|
|
397
|
+
});
|
|
398
|
+
if (!res.ok) {
|
|
399
|
+
throw new Error(`opencode session create failed: HTTP ${res.status} ${await safeText(res)}`);
|
|
400
|
+
}
|
|
401
|
+
const json = await res.json();
|
|
402
|
+
if (!json.id)
|
|
403
|
+
throw new Error('opencode session create returned no id');
|
|
404
|
+
log.info({
|
|
405
|
+
event: 'opencode.http.session_created',
|
|
406
|
+
sessionID: json.id,
|
|
407
|
+
cwd: resolveAgentCwd('opencode', opts),
|
|
408
|
+
}, 'session created');
|
|
409
|
+
return json.id;
|
|
410
|
+
}
|
|
411
|
+
async postPrompt(baseUrl, sessionID, prompt, opts) {
|
|
412
|
+
const body = {
|
|
413
|
+
parts: [{ type: 'text', text: prompt }],
|
|
414
|
+
};
|
|
415
|
+
if (opts.model)
|
|
416
|
+
body.model = opts.model;
|
|
417
|
+
if (opts.variant)
|
|
418
|
+
body.variant = opts.variant;
|
|
419
|
+
// planMode forces the plan agent on every turn, including resumed sessions
|
|
420
|
+
// that were originally created under build. opencode's per-message `agent`
|
|
421
|
+
// field overrides the session's default agent for this single turn.
|
|
422
|
+
if (opts.planMode)
|
|
423
|
+
body.agent = 'plan';
|
|
424
|
+
const res = await this.fetchImpl(`${baseUrl}/session/${sessionID}/message`, {
|
|
425
|
+
method: 'POST',
|
|
426
|
+
headers: { 'Content-Type': 'application/json' },
|
|
427
|
+
body: JSON.stringify(body),
|
|
428
|
+
});
|
|
429
|
+
if (!res.ok) {
|
|
430
|
+
throw new Error(`opencode prompt failed: HTTP ${res.status} ${await safeText(res)}`);
|
|
431
|
+
}
|
|
432
|
+
// Drain the body to free the connection slot — events stream via SSE.
|
|
433
|
+
await res.text().catch(() => '');
|
|
434
|
+
}
|
|
435
|
+
async replyPermission(baseUrl, requestId, reply, message) {
|
|
436
|
+
const body = { reply };
|
|
437
|
+
if (reply === 'reject' && message)
|
|
438
|
+
body.message = message;
|
|
439
|
+
const res = await this.fetchImpl(`${baseUrl}/permission/${requestId}/reply`, {
|
|
440
|
+
method: 'POST',
|
|
441
|
+
headers: { 'Content-Type': 'application/json' },
|
|
442
|
+
body: JSON.stringify(body),
|
|
443
|
+
});
|
|
444
|
+
if (!res.ok) {
|
|
445
|
+
throw new Error(`opencode permission reply HTTP ${res.status}`);
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
async openEventStream(baseUrl) {
|
|
449
|
+
const res = await this.fetchImpl(`${baseUrl}/event`, {
|
|
450
|
+
headers: { Accept: 'text/event-stream' },
|
|
451
|
+
});
|
|
452
|
+
if (!res.ok || !res.body) {
|
|
453
|
+
throw new Error(`opencode event stream failed: HTTP ${res.status}`);
|
|
454
|
+
}
|
|
455
|
+
return new EventStream(res.body);
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
/**
|
|
459
|
+
* Map a bus Decision to opencode's permission.reply schema.
|
|
460
|
+
*
|
|
461
|
+
* Mapping rules:
|
|
462
|
+
* - allow → once (one-shot grant; matches what TUI sends)
|
|
463
|
+
* - allow + autoAllowFurther → once on the wire; the bus has already
|
|
464
|
+
* registered an im-side auto-allow rule by side effect (see
|
|
465
|
+
* ApprovalBus.cancelPending). We deliberately do NOT promote to
|
|
466
|
+
* opencode's `always` because that would persist a ruleset addition on
|
|
467
|
+
* the opencode session, which is heavier scope than the IM rule.
|
|
468
|
+
* - deny + message → reject (+ message). opencode surfaces this as a
|
|
469
|
+
* CorrectedError ("user rejected … with feedback"), giving the LLM a
|
|
470
|
+
* useful hint instead of a bare reject.
|
|
471
|
+
* - deny → reject
|
|
472
|
+
*/
|
|
473
|
+
function decisionToOpencodeReply(decision) {
|
|
474
|
+
if (decision.behavior === 'allow')
|
|
475
|
+
return { reply: 'once' };
|
|
476
|
+
return decision.message
|
|
477
|
+
? { reply: 'reject', message: decision.message }
|
|
478
|
+
: { reply: 'reject' };
|
|
479
|
+
}
|
|
480
|
+
function resolveTimeout() {
|
|
481
|
+
const raw = process.env.OPENCODE_TIMEOUT_MS;
|
|
482
|
+
if (raw) {
|
|
483
|
+
const n = parseInt(raw, 10);
|
|
484
|
+
if (Number.isFinite(n) && n > 0)
|
|
485
|
+
return n;
|
|
486
|
+
}
|
|
487
|
+
return DEFAULT_TIMEOUT_MS;
|
|
488
|
+
}
|
|
489
|
+
async function safeText(res) {
|
|
490
|
+
try {
|
|
491
|
+
return (await res.text()).slice(0, 500);
|
|
492
|
+
}
|
|
493
|
+
catch {
|
|
494
|
+
return '';
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
export class EventStream {
|
|
498
|
+
reader;
|
|
499
|
+
decoder = new TextDecoder('utf-8');
|
|
500
|
+
buf = '';
|
|
501
|
+
closed = false;
|
|
502
|
+
constructor(body) {
|
|
503
|
+
this.reader = body.getReader();
|
|
504
|
+
}
|
|
505
|
+
close() {
|
|
506
|
+
if (this.closed)
|
|
507
|
+
return;
|
|
508
|
+
this.closed = true;
|
|
509
|
+
try {
|
|
510
|
+
void this.reader.cancel();
|
|
511
|
+
}
|
|
512
|
+
catch { /* ignore */ }
|
|
513
|
+
}
|
|
514
|
+
async *[Symbol.asyncIterator]() {
|
|
515
|
+
while (!this.closed) {
|
|
516
|
+
const { value, done } = await this.reader.read();
|
|
517
|
+
if (done)
|
|
518
|
+
return;
|
|
519
|
+
if (!value)
|
|
520
|
+
continue;
|
|
521
|
+
this.buf += this.decoder.decode(value, { stream: true });
|
|
522
|
+
let idx;
|
|
523
|
+
while ((idx = this.buf.indexOf('\n\n')) !== -1) {
|
|
524
|
+
const frame = this.buf.slice(0, idx);
|
|
525
|
+
this.buf = this.buf.slice(idx + 2);
|
|
526
|
+
const evt = parseSseFrame(frame);
|
|
527
|
+
if (evt)
|
|
528
|
+
yield evt;
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
function parseSseFrame(frame) {
|
|
534
|
+
let payload = '';
|
|
535
|
+
for (const line of frame.split('\n')) {
|
|
536
|
+
if (line.startsWith('data:')) {
|
|
537
|
+
payload += line.slice(5).trimStart();
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
if (!payload)
|
|
541
|
+
return null;
|
|
542
|
+
try {
|
|
543
|
+
return JSON.parse(payload);
|
|
544
|
+
}
|
|
545
|
+
catch {
|
|
546
|
+
return null;
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
//# sourceMappingURL=opencode-http-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode-http-adapter.js","sourceRoot":"","sources":["../../../../src/plugins/agents/opencode/opencode-http-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { AgentBase, type SpawnPlan } from '../../../core/agent-base.js';
|
|
2
|
+
import type { AgentSendOpts } from '../../../core/types.js';
|
|
3
|
+
export declare class OpenCodeAdapter extends AgentBase {
|
|
4
|
+
readonly name = "opencode";
|
|
5
|
+
readonly aliases: string[];
|
|
6
|
+
protected buildArgs(prompt: string, opts: AgentSendOpts): string[];
|
|
7
|
+
/**
|
|
8
|
+
* opencode keys its per-project AGENTS.md and memory off the spawn cwd,
|
|
9
|
+
* so for IM calls we pin to ~/.im-hub-workspaces/opencode/. Non-IM calls
|
|
10
|
+
* (web/scheduler) keep cwd undefined and inherit im-hub's cwd, preserving
|
|
11
|
+
* the prior behavior. See agent-cwd.ts for full rationale.
|
|
12
|
+
*/
|
|
13
|
+
protected prepareCommand(prompt: string, opts: AgentSendOpts): Promise<SpawnPlan>;
|
|
14
|
+
protected extractText(event: unknown): string;
|
|
15
|
+
/**
|
|
16
|
+
* Pull metadata out of every event:
|
|
17
|
+
* - `sessionID` on any event → bubble up via opts.onAgentSessionId so cli
|
|
18
|
+
* can persist it. Idempotent (the callback handles dedup).
|
|
19
|
+
* - `cost` / `tokens` on `step_finish` → bubble up via opts.onUsage so
|
|
20
|
+
* callAgentWithHistory can roll into /stats.
|
|
21
|
+
*/
|
|
22
|
+
protected inspectEvent(event: unknown, opts: AgentSendOpts): void;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=opencode-stdio-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode-stdio-adapter.d.ts","sourceRoot":"","sources":["../../../../src/plugins/agents/opencode/opencode-stdio-adapter.ts"],"names":[],"mappings":"AA0BA,OAAO,EAAE,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,6BAA6B,CAAA;AACvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAuB3D,qBAAa,eAAgB,SAAQ,SAAS;IAC5C,QAAQ,CAAC,IAAI,cAAa;IAC1B,QAAQ,CAAC,OAAO,WAAuB;IAEvC,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,MAAM,EAAE;IAelE;;;;;OAKG;cACa,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC;IAOvF,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM;IAO7C;;;;;;OAMG;IACH,SAAS,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI;CAiBlE"}
|