agim-cli 1.0.1
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/CHANGELOG.md +1234 -0
- package/LICENSE +21 -0
- package/README.md +422 -0
- package/README.zh-CN.md +414 -0
- package/dist/cli-ui/cmd-handlers.d.ts +11 -0
- package/dist/cli-ui/cmd-handlers.d.ts.map +1 -0
- package/dist/cli-ui/cmd-handlers.js +240 -0
- package/dist/cli-ui/cmd-handlers.js.map +1 -0
- package/dist/cli-ui/config-wizard.d.ts +3 -0
- package/dist/cli-ui/config-wizard.d.ts.map +1 -0
- package/dist/cli-ui/config-wizard.js +851 -0
- package/dist/cli-ui/config-wizard.js.map +1 -0
- package/dist/cli-ui/entry-menu.d.ts +28 -0
- package/dist/cli-ui/entry-menu.d.ts.map +1 -0
- package/dist/cli-ui/entry-menu.js +50 -0
- package/dist/cli-ui/entry-menu.js.map +1 -0
- package/dist/cli-ui/env-file.d.ts +35 -0
- package/dist/cli-ui/env-file.d.ts.map +1 -0
- package/dist/cli-ui/env-file.js +163 -0
- package/dist/cli-ui/env-file.js.map +1 -0
- package/dist/cli-ui/i18n.d.ts +204 -0
- package/dist/cli-ui/i18n.d.ts.map +1 -0
- package/dist/cli-ui/i18n.js +455 -0
- package/dist/cli-ui/i18n.js.map +1 -0
- package/dist/cli-ui/lang-picker.d.ts +10 -0
- package/dist/cli-ui/lang-picker.d.ts.map +1 -0
- package/dist/cli-ui/lang-picker.js +33 -0
- package/dist/cli-ui/lang-picker.js.map +1 -0
- package/dist/cli-ui/paths.d.ts +4 -0
- package/dist/cli-ui/paths.d.ts.map +1 -0
- package/dist/cli-ui/paths.js +11 -0
- package/dist/cli-ui/paths.js.map +1 -0
- package/dist/cli-ui/prompts.d.ts +65 -0
- package/dist/cli-ui/prompts.d.ts.map +1 -0
- package/dist/cli-ui/prompts.js +125 -0
- package/dist/cli-ui/prompts.js.map +1 -0
- package/dist/cli-ui/service.d.ts +41 -0
- package/dist/cli-ui/service.d.ts.map +1 -0
- package/dist/cli-ui/service.js +241 -0
- package/dist/cli-ui/service.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +1143 -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 +373 -0
- package/dist/core/agent-base.js.map +1 -0
- package/dist/core/agent-cwd.d.ts +48 -0
- package/dist/core/agent-cwd.d.ts.map +1 -0
- package/dist/core/agent-cwd.js +181 -0
- package/dist/core/agent-cwd.js.map +1 -0
- package/dist/core/agent-helper.d.ts +65 -0
- package/dist/core/agent-helper.d.ts.map +1 -0
- package/dist/core/agent-helper.js +150 -0
- package/dist/core/agent-helper.js.map +1 -0
- package/dist/core/agim-paths.d.ts +10 -0
- package/dist/core/agim-paths.d.ts.map +1 -0
- package/dist/core/agim-paths.js +64 -0
- package/dist/core/agim-paths.js.map +1 -0
- package/dist/core/approval-bus.d.ts +300 -0
- package/dist/core/approval-bus.d.ts.map +1 -0
- package/dist/core/approval-bus.js +990 -0
- package/dist/core/approval-bus.js.map +1 -0
- package/dist/core/approval-router.d.ts +101 -0
- package/dist/core/approval-router.d.ts.map +1 -0
- package/dist/core/approval-router.js +540 -0
- package/dist/core/approval-router.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/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 +40 -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 +85 -0
- package/dist/core/commands/approval.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 +304 -0
- package/dist/core/commands/builtin.js.map +1 -0
- package/dist/core/commands/cron.d.ts +3 -0
- package/dist/core/commands/cron.d.ts.map +1 -0
- package/dist/core/commands/cron.js +128 -0
- package/dist/core/commands/cron.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/memo.d.ts +3 -0
- package/dist/core/commands/memo.d.ts.map +1 -0
- package/dist/core/commands/memo.js +151 -0
- package/dist/core/commands/memo.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/remind.d.ts +3 -0
- package/dist/core/commands/remind.d.ts.map +1 -0
- package/dist/core/commands/remind.js +271 -0
- package/dist/core/commands/remind.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/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 +60 -0
- package/dist/core/config-schema.d.ts.map +1 -0
- package/dist/core/config-schema.js +75 -0
- package/dist/core/config-schema.js.map +1 -0
- package/dist/core/coord-systems.d.ts +65 -0
- package/dist/core/coord-systems.d.ts.map +1 -0
- package/dist/core/coord-systems.js +229 -0
- package/dist/core/coord-systems.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 +82 -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/location-context.d.ts +32 -0
- package/dist/core/location-context.d.ts.map +1 -0
- package/dist/core/location-context.js +69 -0
- package/dist/core/location-context.js.map +1 -0
- package/dist/core/location-token.d.ts +57 -0
- package/dist/core/location-token.d.ts.map +1 -0
- package/dist/core/location-token.js +128 -0
- package/dist/core/location-token.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/memo-rpc.d.ts +13 -0
- package/dist/core/memo-rpc.d.ts.map +1 -0
- package/dist/core/memo-rpc.js +288 -0
- package/dist/core/memo-rpc.js.map +1 -0
- package/dist/core/memos.d.ts +163 -0
- package/dist/core/memos.d.ts.map +1 -0
- package/dist/core/memos.js +502 -0
- package/dist/core/memos.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 +99 -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/pending-reminder.d.ts +25 -0
- package/dist/core/pending-reminder.d.ts.map +1 -0
- package/dist/core/pending-reminder.js +53 -0
- package/dist/core/pending-reminder.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 +126 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/remind-intent.d.ts +25 -0
- package/dist/core/remind-intent.d.ts.map +1 -0
- package/dist/core/remind-intent.js +196 -0
- package/dist/core/remind-intent.js.map +1 -0
- package/dist/core/reminder-rpc.d.ts +17 -0
- package/dist/core/reminder-rpc.d.ts.map +1 -0
- package/dist/core/reminder-rpc.js +169 -0
- package/dist/core/reminder-rpc.js.map +1 -0
- package/dist/core/reminders.d.ts +159 -0
- package/dist/core/reminders.d.ts.map +1 -0
- package/dist/core/reminders.js +977 -0
- package/dist/core/reminders.js.map +1 -0
- package/dist/core/router.d.ts +55 -0
- package/dist/core/router.d.ts.map +1 -0
- package/dist/core/router.js +497 -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 +323 -0
- package/dist/core/schedule.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 +807 -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/types.d.ts +360 -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 +177 -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 +111 -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/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 +59 -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 +645 -0
- package/dist/plugins/agents/claude-code/mcp-approval-server.js.map +1 -0
- package/dist/plugins/agents/codex/build-mcp-cli-args.d.ts +28 -0
- package/dist/plugins/agents/codex/build-mcp-cli-args.d.ts.map +1 -0
- package/dist/plugins/agents/codex/build-mcp-cli-args.js +74 -0
- package/dist/plugins/agents/codex/build-mcp-cli-args.js.map +1 -0
- package/dist/plugins/agents/codex/index.d.ts +53 -0
- package/dist/plugins/agents/codex/index.d.ts.map +1 -0
- package/dist/plugins/agents/codex/index.js +341 -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/ensure-mcp-config.d.ts +11 -0
- package/dist/plugins/agents/opencode/ensure-mcp-config.d.ts.map +1 -0
- package/dist/plugins/agents/opencode/ensure-mcp-config.js +100 -0
- package/dist/plugins/agents/opencode/ensure-mcp-config.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 +166 -0
- package/dist/plugins/agents/opencode/opencode-http-adapter.d.ts.map +1 -0
- package/dist/plugins/agents/opencode/opencode-http-adapter.js +682 -0
- package/dist/plugins/agents/opencode/opencode-http-adapter.js.map +1 -0
- package/dist/plugins/agents/opencode/opencode-stdio-adapter.d.ts +32 -0
- package/dist/plugins/agents/opencode/opencode-stdio-adapter.d.ts.map +1 -0
- package/dist/plugins/agents/opencode/opencode-stdio-adapter.js +137 -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 +194 -0
- package/dist/plugins/agents/opencode/serve-manager.js.map +1 -0
- package/dist/plugins/messengers/dingtalk/dingtalk-adapter.d.ts +57 -0
- package/dist/plugins/messengers/dingtalk/dingtalk-adapter.d.ts.map +1 -0
- package/dist/plugins/messengers/dingtalk/dingtalk-adapter.js +409 -0
- package/dist/plugins/messengers/dingtalk/dingtalk-adapter.js.map +1 -0
- package/dist/plugins/messengers/dingtalk/dingtalk-client.d.ts +48 -0
- package/dist/plugins/messengers/dingtalk/dingtalk-client.d.ts.map +1 -0
- package/dist/plugins/messengers/dingtalk/dingtalk-client.js +236 -0
- package/dist/plugins/messengers/dingtalk/dingtalk-client.js.map +1 -0
- package/dist/plugins/messengers/dingtalk/index.d.ts +3 -0
- package/dist/plugins/messengers/dingtalk/index.d.ts.map +1 -0
- package/dist/plugins/messengers/dingtalk/index.js +3 -0
- package/dist/plugins/messengers/dingtalk/index.js.map +1 -0
- package/dist/plugins/messengers/dingtalk/link-coords.d.ts +23 -0
- package/dist/plugins/messengers/dingtalk/link-coords.d.ts.map +1 -0
- package/dist/plugins/messengers/dingtalk/link-coords.js +89 -0
- package/dist/plugins/messengers/dingtalk/link-coords.js.map +1 -0
- package/dist/plugins/messengers/dingtalk/media-store.d.ts +16 -0
- package/dist/plugins/messengers/dingtalk/media-store.d.ts.map +1 -0
- package/dist/plugins/messengers/dingtalk/media-store.js +77 -0
- package/dist/plugins/messengers/dingtalk/media-store.js.map +1 -0
- package/dist/plugins/messengers/dingtalk/types.d.ts +82 -0
- package/dist/plugins/messengers/dingtalk/types.d.ts.map +1 -0
- package/dist/plugins/messengers/dingtalk/types.js +14 -0
- package/dist/plugins/messengers/dingtalk/types.js.map +1 -0
- package/dist/plugins/messengers/discord/discord-adapter.d.ts +21 -0
- package/dist/plugins/messengers/discord/discord-adapter.d.ts.map +1 -0
- package/dist/plugins/messengers/discord/discord-adapter.js +238 -0
- package/dist/plugins/messengers/discord/discord-adapter.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/email/email-adapter.d.ts +33 -0
- package/dist/plugins/messengers/email/email-adapter.d.ts.map +1 -0
- package/dist/plugins/messengers/email/email-adapter.js +137 -0
- package/dist/plugins/messengers/email/email-adapter.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 +23 -0
- package/dist/plugins/messengers/feishu/feishu-adapter.d.ts.map +1 -0
- package/dist/plugins/messengers/feishu/feishu-adapter.js +250 -0
- package/dist/plugins/messengers/feishu/feishu-adapter.js.map +1 -0
- package/dist/plugins/messengers/feishu/feishu-client.d.ts +43 -0
- package/dist/plugins/messengers/feishu/feishu-client.d.ts.map +1 -0
- package/dist/plugins/messengers/feishu/feishu-client.js +118 -0
- package/dist/plugins/messengers/feishu/feishu-client.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 +59 -0
- package/dist/plugins/messengers/telegram/media-download.d.ts.map +1 -0
- package/dist/plugins/messengers/telegram/media-download.js +228 -0
- package/dist/plugins/messengers/telegram/media-download.js.map +1 -0
- package/dist/plugins/messengers/telegram/telegram-adapter.d.ts +77 -0
- package/dist/plugins/messengers/telegram/telegram-adapter.d.ts.map +1 -0
- package/dist/plugins/messengers/telegram/telegram-adapter.js +880 -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/context-store.d.ts +18 -0
- package/dist/plugins/messengers/wechat/context-store.d.ts.map +1 -0
- package/dist/plugins/messengers/wechat/context-store.js +105 -0
- package/dist/plugins/messengers/wechat/context-store.js.map +1 -0
- package/dist/plugins/messengers/wechat/ilink-adapter.d.ts +71 -0
- package/dist/plugins/messengers/wechat/ilink-adapter.d.ts.map +1 -0
- package/dist/plugins/messengers/wechat/ilink-adapter.js +664 -0
- package/dist/plugins/messengers/wechat/ilink-adapter.js.map +1 -0
- package/dist/plugins/messengers/wechat/ilink-client.d.ts +75 -0
- package/dist/plugins/messengers/wechat/ilink-client.d.ts.map +1 -0
- package/dist/plugins/messengers/wechat/ilink-client.js +331 -0
- package/dist/plugins/messengers/wechat/ilink-client.js.map +1 -0
- package/dist/plugins/messengers/wechat/ilink-types.d.ts +181 -0
- package/dist/plugins/messengers/wechat/ilink-types.d.ts.map +1 -0
- package/dist/plugins/messengers/wechat/ilink-types.js +22 -0
- package/dist/plugins/messengers/wechat/ilink-types.js.map +1 -0
- package/dist/plugins/messengers/wechat/media-download.d.ts +32 -0
- package/dist/plugins/messengers/wechat/media-download.d.ts.map +1 -0
- package/dist/plugins/messengers/wechat/media-download.js +78 -0
- package/dist/plugins/messengers/wechat/media-download.js.map +1 -0
- package/dist/scripts/migrate-gcj02-to-wgs84.d.ts +3 -0
- package/dist/scripts/migrate-gcj02-to-wgs84.d.ts.map +1 -0
- package/dist/scripts/migrate-gcj02-to-wgs84.js +52 -0
- package/dist/scripts/migrate-gcj02-to-wgs84.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 +936 -0
- package/dist/web/public/loc.html +305 -0
- package/dist/web/public/login.html +106 -0
- package/dist/web/public/memos.html +271 -0
- package/dist/web/public/reminders.html +234 -0
- package/dist/web/public/settings.html +1355 -0
- package/dist/web/public/tasks.html +1835 -0
- package/dist/web/server.d.ts +12 -0
- package/dist/web/server.d.ts.map +1 -0
- package/dist/web/server.js +2399 -0
- package/dist/web/server.js.map +1 -0
- package/package.json +92 -0
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
// GitHub Copilot CLI agent adapter
|
|
2
|
+
// Supports multiple installation methods:
|
|
3
|
+
// 1. GitHub CLI extension: `gh copilot` (recommended)
|
|
4
|
+
// 2. Standalone npm: `copilot` command
|
|
5
|
+
// 3. VS Code extension: bundled copilot CLI
|
|
6
|
+
// 4. Homebrew (macOS): `brew install copilot-cli`
|
|
7
|
+
// 5. WinGet (Windows): `winget install GitHub.Copilot`
|
|
8
|
+
import { access, constants, readdir } from 'node:fs/promises';
|
|
9
|
+
import { homedir } from 'node:os';
|
|
10
|
+
import { join } from 'node:path';
|
|
11
|
+
import { AgentBase } from '../../../core/agent-base.js';
|
|
12
|
+
import { crossSpawn, isWindows, isMac } from '../../../utils/cross-platform.js';
|
|
13
|
+
import { logger as rootLogger } from '../../../core/logger.js';
|
|
14
|
+
/** Check if a command exists and can be executed */
|
|
15
|
+
async function commandExists(cmd) {
|
|
16
|
+
return new Promise((resolve) => {
|
|
17
|
+
const proc = crossSpawn(cmd, ['--version'], { stdio: 'ignore' });
|
|
18
|
+
proc.on('error', () => resolve(false));
|
|
19
|
+
proc.on('close', (code) => resolve(code === 0));
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
async function checkGHCopilot() {
|
|
23
|
+
if (!(await commandExists('gh')))
|
|
24
|
+
return null;
|
|
25
|
+
return new Promise((resolve) => {
|
|
26
|
+
const proc = crossSpawn('gh', ['copilot', '--version'], { stdio: 'ignore' });
|
|
27
|
+
proc.on('error', () => resolve(null));
|
|
28
|
+
proc.on('close', (code) => {
|
|
29
|
+
if (code === 0) {
|
|
30
|
+
resolve({ type: 'gh-ext', command: 'gh', argsPrefix: ['copilot'] });
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
resolve(null);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
async function checkStandaloneCopilot() {
|
|
39
|
+
if (await commandExists('copilot')) {
|
|
40
|
+
return { type: 'standalone', command: 'copilot', argsPrefix: [] };
|
|
41
|
+
}
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
async function findVSCodeCopilot() {
|
|
45
|
+
if (isMac) {
|
|
46
|
+
const macPath = join(homedir(), 'Library/Application Support/Code/User/globalStorage/github.copilot-chat/copilotCli/copilot');
|
|
47
|
+
try {
|
|
48
|
+
await access(macPath, constants.X_OK);
|
|
49
|
+
return { type: 'vscode', command: macPath, argsPrefix: [] };
|
|
50
|
+
}
|
|
51
|
+
catch { /* fall through */ }
|
|
52
|
+
}
|
|
53
|
+
if (isWindows) {
|
|
54
|
+
const extensionsDir = join(homedir(), '.vscode', 'extensions');
|
|
55
|
+
try {
|
|
56
|
+
const entries = await readdir(extensionsDir, { withFileTypes: true });
|
|
57
|
+
const copilotDir = entries.find((entry) => entry.isDirectory() && entry.name.startsWith('github.copilot-chat-'));
|
|
58
|
+
if (copilotDir) {
|
|
59
|
+
const copilotBin = join(extensionsDir, copilotDir.name, 'copilotCli', 'copilot.exe');
|
|
60
|
+
try {
|
|
61
|
+
await access(copilotBin, constants.X_OK);
|
|
62
|
+
return { type: 'vscode', command: copilotBin, argsPrefix: [] };
|
|
63
|
+
}
|
|
64
|
+
catch { /* fall through */ }
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch { /* ignore readdir errors */ }
|
|
68
|
+
}
|
|
69
|
+
const linuxPath = join(homedir(), '.vscode/extensions/github.copilot-chat/copilotCli/copilot');
|
|
70
|
+
try {
|
|
71
|
+
await access(linuxPath, constants.X_OK);
|
|
72
|
+
return { type: 'vscode', command: linuxPath, argsPrefix: [] };
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/** TTL'd installation cache so a fresh install is picked up within 2min. */
|
|
79
|
+
const INSTALL_CACHE_TTL = 2 * 60 * 1000;
|
|
80
|
+
let cachedInstall = null;
|
|
81
|
+
let cachedAt = 0;
|
|
82
|
+
async function detectCopilotInstall() {
|
|
83
|
+
if (cachedInstall && Date.now() - cachedAt < INSTALL_CACHE_TTL)
|
|
84
|
+
return cachedInstall;
|
|
85
|
+
cachedInstall =
|
|
86
|
+
(await checkGHCopilot()) ||
|
|
87
|
+
(await checkStandaloneCopilot()) ||
|
|
88
|
+
(await findVSCodeCopilot());
|
|
89
|
+
cachedAt = Date.now();
|
|
90
|
+
return cachedInstall;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Copilot adapter built on AgentBase. Differs from the other CLI agents
|
|
94
|
+
* in two ways:
|
|
95
|
+
* 1. The binary path is discovered async (gh / standalone / VSCode)
|
|
96
|
+
* 2. The CLI is not JSONL — its stdout is plain text
|
|
97
|
+
*
|
|
98
|
+
* AgentBase already handles plain text via the JSON.parse fallback (yields
|
|
99
|
+
* the line verbatim). We override commandName/buildArgs/extractText after
|
|
100
|
+
* resolving the install, and use isAvailable() to short-circuit when no
|
|
101
|
+
* install was found.
|
|
102
|
+
*/
|
|
103
|
+
class CopilotAdapter extends AgentBase {
|
|
104
|
+
name = 'copilot';
|
|
105
|
+
aliases = ['gh', 'github', 'copilotcli', 'ghcp'];
|
|
106
|
+
/** Resolved install, populated by isAvailable() and reused by spawn calls. */
|
|
107
|
+
resolvedInstall = null;
|
|
108
|
+
get commandName() {
|
|
109
|
+
if (!this.resolvedInstall) {
|
|
110
|
+
// Should never happen — sendPrompt awaits isAvailable() first. But if
|
|
111
|
+
// someone calls spawnAndCollect directly we degrade by using a
|
|
112
|
+
// sentinel that the spawn will fail on, surfaced via handleError.
|
|
113
|
+
return 'copilot';
|
|
114
|
+
}
|
|
115
|
+
return this.resolvedInstall.command;
|
|
116
|
+
}
|
|
117
|
+
buildArgs(prompt) {
|
|
118
|
+
const install = this.resolvedInstall;
|
|
119
|
+
if (!install)
|
|
120
|
+
return ['-p', prompt, '-s'];
|
|
121
|
+
if (install.type === 'gh-ext') {
|
|
122
|
+
return [...install.argsPrefix, 'suggest', prompt, '--prompt-only'];
|
|
123
|
+
}
|
|
124
|
+
return [...install.argsPrefix, '-p', prompt, '-s'];
|
|
125
|
+
}
|
|
126
|
+
extractText(event) {
|
|
127
|
+
// Copilot CLI is not JSONL; AgentBase's fallback already yields the
|
|
128
|
+
// raw line. extractText is only consulted on successfully-parsed JSON,
|
|
129
|
+
// which Copilot never emits.
|
|
130
|
+
if (event && typeof event === 'object') {
|
|
131
|
+
const e = event;
|
|
132
|
+
if (typeof e.content === 'string')
|
|
133
|
+
return e.content;
|
|
134
|
+
if (typeof e.text === 'string')
|
|
135
|
+
return e.text;
|
|
136
|
+
}
|
|
137
|
+
return '';
|
|
138
|
+
}
|
|
139
|
+
async isAvailable() {
|
|
140
|
+
this.resolvedInstall = await detectCopilotInstall();
|
|
141
|
+
return this.resolvedInstall !== null;
|
|
142
|
+
}
|
|
143
|
+
async healthCheck() {
|
|
144
|
+
const start = Date.now();
|
|
145
|
+
const ok = await this.isAvailable();
|
|
146
|
+
return { ok, latencyMs: Date.now() - start };
|
|
147
|
+
}
|
|
148
|
+
handleError(_code, stderr, _errorMessage) {
|
|
149
|
+
if (stderr.includes('402') || stderr.includes('no quota') || stderr.includes('insufficient')) {
|
|
150
|
+
return `❌ Copilot 额度不足,请检查您的 GitHub Copilot 订阅。
|
|
151
|
+
|
|
152
|
+
💡 可以使用以下命令切换到其他 Agent:
|
|
153
|
+
• /claude - 切换到 Claude Code
|
|
154
|
+
• /codex - 切换到 OpenAI Codex
|
|
155
|
+
• /agents - 查看所有可用 Agent`;
|
|
156
|
+
}
|
|
157
|
+
return null;
|
|
158
|
+
}
|
|
159
|
+
notAvailableMessage() {
|
|
160
|
+
return `❌ Copilot CLI 未找到。
|
|
161
|
+
|
|
162
|
+
安装方式 (选择其一):
|
|
163
|
+
npm i -g @github/copilot
|
|
164
|
+
gh extension install github/gh-copilot
|
|
165
|
+
brew install copilot-cli (macOS)
|
|
166
|
+
winget install GitHub.Copilot (Windows)
|
|
167
|
+
|
|
168
|
+
或安装 VS Code Copilot Chat 扩展。`;
|
|
169
|
+
}
|
|
170
|
+
// Override sendPrompt to short-circuit when not installed — gives a
|
|
171
|
+
// friendlier message than spawnStream would after spawn failure.
|
|
172
|
+
async *sendPrompt(sessionId, prompt, history, _opts) {
|
|
173
|
+
if (!(await this.isAvailable())) {
|
|
174
|
+
yield this.notAvailableMessage();
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
rootLogger.info({ component: `agent.${this.name}`, agent: this.name, install: this.resolvedInstall?.type }, '[copilot] sendPrompt');
|
|
178
|
+
yield* super.sendPrompt(sessionId, prompt, history, _opts);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
export const copilotAdapter = new CopilotAdapter();
|
|
182
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/plugins/agents/copilot/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Idempotently register the imhub MCP server in opencode's global config.
|
|
3
|
+
* Returns true when a write actually happened (config changed), false when
|
|
4
|
+
* the config was already in the desired state.
|
|
5
|
+
*
|
|
6
|
+
* Failures (file unreadable, JSON malformed, write rejected) are logged
|
|
7
|
+
* and swallowed — opencode users still keep working without reminder
|
|
8
|
+
* tools, the same way they did before this feature.
|
|
9
|
+
*/
|
|
10
|
+
export declare function ensureOpencodeMcpRegistered(): Promise<boolean>;
|
|
11
|
+
//# sourceMappingURL=ensure-mcp-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ensure-mcp-config.d.ts","sourceRoot":"","sources":["../../../../src/plugins/agents/opencode/ensure-mcp-config.ts"],"names":[],"mappings":"AA6CA;;;;;;;;GAQG;AACH,wBAAsB,2BAA2B,IAAI,OAAO,CAAC,OAAO,CAAC,CAkEpE"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
// ensure-mcp-config.ts — register the imhub MCP sidecar into opencode's
|
|
2
|
+
// global config so the reminder tools are visible to opencode runs.
|
|
3
|
+
//
|
|
4
|
+
// Why modify global config:
|
|
5
|
+
//
|
|
6
|
+
// opencode loads MCP servers from `~/.config/opencode/opencode.json` at
|
|
7
|
+
// startup and inherits parent process env when spawning each server's
|
|
8
|
+
// stdio. We can't just "pass --mcp-config" per spawn — opencode has no
|
|
9
|
+
// such flag. The next-best knob is the global config file.
|
|
10
|
+
//
|
|
11
|
+
// We do an additive update: read the JSON if it exists, set
|
|
12
|
+
// `mcp.imhub.local.{command,enabled}`, write back. Other keys (provider,
|
|
13
|
+
// theme, etc.) are preserved unchanged. Idempotent — repeated calls are
|
|
14
|
+
// no-ops once the desired entry is in place.
|
|
15
|
+
//
|
|
16
|
+
// Per-spawn IM context (which thread / user is calling) flows through
|
|
17
|
+
// process.env: opencode-stdio-adapter sets IMHUB_APPROVAL_SOCK +
|
|
18
|
+
// IMHUB_RUN_ID on each spawn, opencode forwards them to the MCP server
|
|
19
|
+
// (per opencode/src/mcp/index.ts:384, env: { ...process.env, ... }).
|
|
20
|
+
import { homedir } from 'node:os';
|
|
21
|
+
import { join, dirname } from 'node:path';
|
|
22
|
+
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
23
|
+
import { fileURLToPath } from 'node:url';
|
|
24
|
+
import { logger as rootLogger } from '../../../core/logger.js';
|
|
25
|
+
const log = rootLogger.child({ component: 'opencode-mcp-config' });
|
|
26
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
27
|
+
const __dirname = dirname(__filename);
|
|
28
|
+
// Sidecar lives next to claude-code's MCP entry — same JS, opencode just
|
|
29
|
+
// reaches it through a different MCP transport.
|
|
30
|
+
const SIDECAR_PATH = join(__dirname, '..', 'claude-code', 'mcp-approval-server.js');
|
|
31
|
+
/**
|
|
32
|
+
* Idempotently register the imhub MCP server in opencode's global config.
|
|
33
|
+
* Returns true when a write actually happened (config changed), false when
|
|
34
|
+
* the config was already in the desired state.
|
|
35
|
+
*
|
|
36
|
+
* Failures (file unreadable, JSON malformed, write rejected) are logged
|
|
37
|
+
* and swallowed — opencode users still keep working without reminder
|
|
38
|
+
* tools, the same way they did before this feature.
|
|
39
|
+
*/
|
|
40
|
+
export async function ensureOpencodeMcpRegistered() {
|
|
41
|
+
const configPath = process.env.OPENCODE_CONFIG_PATH
|
|
42
|
+
?? join(homedir(), '.config', 'opencode', 'opencode.json');
|
|
43
|
+
let config = {};
|
|
44
|
+
try {
|
|
45
|
+
const buf = await readFile(configPath, 'utf8');
|
|
46
|
+
config = JSON.parse(buf);
|
|
47
|
+
if (typeof config !== 'object' || config === null || Array.isArray(config)) {
|
|
48
|
+
log.warn({ event: 'opencode.mcp.bad_config', configPath }, 'opencode config is not a JSON object — skipping MCP registration');
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
const code = err.code;
|
|
54
|
+
if (code !== 'ENOENT') {
|
|
55
|
+
log.warn({
|
|
56
|
+
event: 'opencode.mcp.read_failed', configPath,
|
|
57
|
+
err: err instanceof Error ? err.message : String(err),
|
|
58
|
+
}, 'opencode config read failed — skipping MCP registration');
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
// No config yet — start fresh.
|
|
62
|
+
config = {};
|
|
63
|
+
}
|
|
64
|
+
if (!config.mcp || typeof config.mcp !== 'object' || Array.isArray(config.mcp)) {
|
|
65
|
+
config.mcp = {};
|
|
66
|
+
}
|
|
67
|
+
const mcp = config.mcp;
|
|
68
|
+
const desired = {
|
|
69
|
+
type: 'local',
|
|
70
|
+
command: [process.execPath, SIDECAR_PATH],
|
|
71
|
+
enabled: true,
|
|
72
|
+
};
|
|
73
|
+
// Compare existing entry; bail if already correct.
|
|
74
|
+
const existing = mcp.imhub;
|
|
75
|
+
if (existing
|
|
76
|
+
&& typeof existing === 'object'
|
|
77
|
+
&& !Array.isArray(existing)
|
|
78
|
+
&& JSON.stringify(existing) === JSON.stringify(desired)) {
|
|
79
|
+
log.debug({ event: 'opencode.mcp.already_registered', configPath });
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
mcp.imhub = desired;
|
|
83
|
+
try {
|
|
84
|
+
await mkdir(dirname(configPath), { recursive: true });
|
|
85
|
+
await writeFile(configPath, `${JSON.stringify(config, null, 2)}\n`, 'utf8');
|
|
86
|
+
log.info({
|
|
87
|
+
event: 'opencode.mcp.registered',
|
|
88
|
+
configPath, sidecar: SIDECAR_PATH,
|
|
89
|
+
}, 'imhub MCP server registered in opencode global config');
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
log.warn({
|
|
94
|
+
event: 'opencode.mcp.write_failed', configPath,
|
|
95
|
+
err: err instanceof Error ? err.message : String(err),
|
|
96
|
+
}, 'opencode config write failed — opencode will not see imhub MCP tools');
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=ensure-mcp-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ensure-mcp-config.js","sourceRoot":"","sources":["../../../../src/plugins/agents/opencode/ensure-mcp-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { OpenCodeAdapter } from './opencode-stdio-adapter.js';
|
|
2
|
+
export { OpenCodeAdapter } from './opencode-stdio-adapter.js';
|
|
3
|
+
export { OpenCodeHttpAdapter } from './opencode-http-adapter.js';
|
|
4
|
+
export declare const opencodeAdapter: OpenCodeAdapter;
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/plugins/agents/opencode/index.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAG7D,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAgBhE,eAAO,MAAM,eAAe,iBAA0B,CAAA"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// OpenCode adapter plugin entry — re-exports + driver factory.
|
|
2
|
+
//
|
|
3
|
+
// Two drivers coexist:
|
|
4
|
+
// • stdio (default): opencode-stdio-adapter.ts — `opencode run --format json`
|
|
5
|
+
// • http: opencode-http-adapter.ts — `opencode serve` + REST + SSE (P1.5+)
|
|
6
|
+
//
|
|
7
|
+
// Selection: env IMHUB_OPENCODE_DRIVER=http picks the HTTP driver. Anything
|
|
8
|
+
// else (incl unset, empty string, unrecognized value) keeps stdio. Default is
|
|
9
|
+
// preserved as stdio so this PR is a no-op until ops flip the env.
|
|
10
|
+
//
|
|
11
|
+
// Why a runtime env switch instead of config: lets us A/B inside a single
|
|
12
|
+
// systemd unit by restarting with the env set, with zero config-file edits.
|
|
13
|
+
// Once HTTP is proven we promote it to default and can drop the switch.
|
|
14
|
+
import { logger } from '../../../core/logger.js';
|
|
15
|
+
import { OpenCodeAdapter } from './opencode-stdio-adapter.js';
|
|
16
|
+
import { OpenCodeHttpAdapter } from './opencode-http-adapter.js';
|
|
17
|
+
export { OpenCodeAdapter } from './opencode-stdio-adapter.js';
|
|
18
|
+
export { OpenCodeHttpAdapter } from './opencode-http-adapter.js';
|
|
19
|
+
function createOpencodeAdapter() {
|
|
20
|
+
const driver = (process.env.IMHUB_OPENCODE_DRIVER || '').toLowerCase();
|
|
21
|
+
if (driver === 'http') {
|
|
22
|
+
return new OpenCodeHttpAdapter();
|
|
23
|
+
}
|
|
24
|
+
if (driver && driver !== 'stdio') {
|
|
25
|
+
logger.warn({ component: 'agent.opencode', requestedDriver: driver, fallback: 'stdio' }, `[opencode] unknown IMHUB_OPENCODE_DRIVER=${driver}, falling back to stdio`);
|
|
26
|
+
}
|
|
27
|
+
return new OpenCodeAdapter();
|
|
28
|
+
}
|
|
29
|
+
export const opencodeAdapter = createOpencodeAdapter();
|
|
30
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/plugins/agents/opencode/index.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,EAAE;AACF,uBAAuB;AACvB,gFAAgF;AAChF,6EAA6E;AAC7E,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,mEAAmE;AACnE,EAAE;AACF,0EAA0E;AAC1E,4EAA4E;AAC5E,wEAAwE;AAExE,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAEhE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAEhE,SAAS,qBAAqB;IAC5B,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;IACtE,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,IAAI,mBAAmB,EAAE,CAAA;IAClC,CAAC;IACD,IAAI,MAAM,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACjC,MAAM,CAAC,IAAI,CACT,EAAE,SAAS,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,EAC3E,4CAA4C,MAAM,yBAAyB,CAC5E,CAAA;IACH,CAAC;IACD,OAAO,IAAI,eAAe,EAAE,CAAA;AAC9B,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,qBAAqB,EAAE,CAAA"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { OpenCodeAdapter } from './opencode-stdio-adapter.js';
|
|
2
|
+
import type { AgentSendOpts, ChatMessage } from '../../../core/types.js';
|
|
3
|
+
import { type OpencodeServeManager } from './serve-manager.js';
|
|
4
|
+
import { type ApprovalBus } from '../../../core/approval-bus.js';
|
|
5
|
+
/** Shape of an event arriving on opencode's /event SSE stream. Every field
|
|
6
|
+
* is optional because we are deliberately conservative — opencode's bus is
|
|
7
|
+
* shared across many event types and we touch only the slice we need. */
|
|
8
|
+
interface OpencodePart {
|
|
9
|
+
id?: string;
|
|
10
|
+
type?: string;
|
|
11
|
+
text?: string;
|
|
12
|
+
tokens?: {
|
|
13
|
+
input?: number;
|
|
14
|
+
output?: number;
|
|
15
|
+
total?: number;
|
|
16
|
+
reasoning?: number;
|
|
17
|
+
};
|
|
18
|
+
cost?: number;
|
|
19
|
+
time?: {
|
|
20
|
+
start?: number;
|
|
21
|
+
end?: number;
|
|
22
|
+
};
|
|
23
|
+
sessionID?: string;
|
|
24
|
+
}
|
|
25
|
+
/** Shape returned by POST /session/:id/message on opencode 1.14.45+ where the
|
|
26
|
+
* /event SSE stream silently drops bus events. The endpoint blocks until the
|
|
27
|
+
* assistant message is complete and returns the full message body. We use it
|
|
28
|
+
* as the authoritative source of text + usage when SSE yields nothing. */
|
|
29
|
+
interface OpencodeMessageResponse {
|
|
30
|
+
info?: {
|
|
31
|
+
id?: string;
|
|
32
|
+
sessionID?: string;
|
|
33
|
+
cost?: number;
|
|
34
|
+
tokens?: {
|
|
35
|
+
input?: number;
|
|
36
|
+
output?: number;
|
|
37
|
+
total?: number;
|
|
38
|
+
reasoning?: number;
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
parts?: OpencodePart[];
|
|
42
|
+
}
|
|
43
|
+
interface OpencodeEvent {
|
|
44
|
+
type: string;
|
|
45
|
+
properties?: {
|
|
46
|
+
sessionID?: string;
|
|
47
|
+
info?: {
|
|
48
|
+
id?: string;
|
|
49
|
+
status?: {
|
|
50
|
+
type?: string;
|
|
51
|
+
};
|
|
52
|
+
sessionID?: string;
|
|
53
|
+
};
|
|
54
|
+
part?: OpencodePart;
|
|
55
|
+
status?: {
|
|
56
|
+
type?: string;
|
|
57
|
+
};
|
|
58
|
+
error?: unknown;
|
|
59
|
+
/** permission.asked carries an id at properties.id (Permission.Request). */
|
|
60
|
+
id?: string;
|
|
61
|
+
/** Permission name on permission.asked, e.g. "external_directory" / "bash". */
|
|
62
|
+
permission?: string;
|
|
63
|
+
/** Patterns the agent wants to access. */
|
|
64
|
+
patterns?: string[];
|
|
65
|
+
/** Tool-specific metadata that may help the user decide. */
|
|
66
|
+
metadata?: Record<string, unknown>;
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
export interface HttpAdapterOptions {
|
|
70
|
+
/** Override the singleton serve manager. Tests inject a mock. */
|
|
71
|
+
serve?: OpencodeServeManager;
|
|
72
|
+
/** Override fetch. Tests inject a mock. */
|
|
73
|
+
fetchImpl?: typeof fetch;
|
|
74
|
+
/** Override the IM approval bus. Defaults to the process singleton; pass
|
|
75
|
+
* `null` to disable the bridge entirely (used by tests that want to lock
|
|
76
|
+
* in the no-bus fallback path). */
|
|
77
|
+
approvalBus?: ApprovalBus | null;
|
|
78
|
+
}
|
|
79
|
+
export declare class OpenCodeHttpAdapter extends OpenCodeAdapter {
|
|
80
|
+
private readonly serve;
|
|
81
|
+
private readonly fetchImpl;
|
|
82
|
+
/** null when the bridge is intentionally disabled. */
|
|
83
|
+
private readonly approvalBus;
|
|
84
|
+
/** Set of opencode session ids whose ruleset we've already PATCHed in this
|
|
85
|
+
* process lifetime. Lets us re-apply the gate policy when an im-hub
|
|
86
|
+
* restart resurfaces an old session, without duplicating rules every
|
|
87
|
+
* turn. Cleared only by im-hub restart — that's fine since the rules
|
|
88
|
+
* the previous run wrote are still in opencode's session DB. */
|
|
89
|
+
private readonly rulesetApplied;
|
|
90
|
+
constructor(opts?: HttpAdapterOptions);
|
|
91
|
+
/**
|
|
92
|
+
* Translate a single SSE event into adapter-side effects:
|
|
93
|
+
* - sessionID capture → opts.onAgentSessionId
|
|
94
|
+
* - step-finish cost/tokens → opts.onUsage
|
|
95
|
+
* - text-part with finished `time.end` → returned as a chunk (with
|
|
96
|
+
* part id when known, so the caller can dedupe against the POST-body
|
|
97
|
+
* fallback for SSE-broken builds — see drainResponseBody).
|
|
98
|
+
* Pure: tests drive this directly without spinning up a daemon.
|
|
99
|
+
*/
|
|
100
|
+
inspectHttpEvent(event: OpencodeEvent, sessionID: string, opts: AgentSendOpts): {
|
|
101
|
+
text?: string;
|
|
102
|
+
partId?: string;
|
|
103
|
+
};
|
|
104
|
+
/**
|
|
105
|
+
* `session.status` event with status.type === 'idle' for our session is
|
|
106
|
+
* the canonical "stop" signal in opencode (cf. run.ts:532).
|
|
107
|
+
*/
|
|
108
|
+
isIdleEvent(event: OpencodeEvent, sessionID: string): boolean;
|
|
109
|
+
isErrorEvent(event: OpencodeEvent, sessionID: string): {
|
|
110
|
+
error: string;
|
|
111
|
+
} | null;
|
|
112
|
+
buildHttpContextualPrompt(prompt: string, history?: ChatMessage[]): string;
|
|
113
|
+
sendPrompt(_sessionId: string, prompt: string, history?: ChatMessage[], opts?: AgentSendOpts): AsyncGenerator<string>;
|
|
114
|
+
/**
|
|
115
|
+
* Extract assistant text + usage from the POST /session/:id/message response
|
|
116
|
+
* body, skipping any text part already emitted via SSE (matched by part id).
|
|
117
|
+
* Used as a fallback for opencode builds whose /event stream is broken.
|
|
118
|
+
*/
|
|
119
|
+
drainResponseBody(body: OpencodeMessageResponse, alreadyYielded: Set<string>, opts: AgentSendOpts): string[];
|
|
120
|
+
/**
|
|
121
|
+
* Decide how to handle a `permission.asked` SSE event:
|
|
122
|
+
* - If `this.approvalBus` is set AND has a notifier installed AND the
|
|
123
|
+
* call carries enough IM context (threadId + platform) → register a
|
|
124
|
+
* synthetic pending so the user gets an IM card; the bus's resolve
|
|
125
|
+
* callback POSTs the decision back to opencode via /permission/.../reply.
|
|
126
|
+
* - Otherwise → fall back to `once`. Without an IM channel there's no
|
|
127
|
+
* human to ask, and a plain `reject` would surface as a tool-call
|
|
128
|
+
* failure mid-conversation which is worse UX than allowing.
|
|
129
|
+
*
|
|
130
|
+
* Fire-and-forget: the SSE loop must keep draining other events while the
|
|
131
|
+
* bridge waits for the user. The bus enforces its own timeout (5 min by
|
|
132
|
+
* default) so we never deadlock the SSE loop.
|
|
133
|
+
*/
|
|
134
|
+
private routeAsk;
|
|
135
|
+
/**
|
|
136
|
+
* Build the session-level permission ruleset to append to opencode's
|
|
137
|
+
* agent defaults. See createSession's docstring for policy rationale.
|
|
138
|
+
*
|
|
139
|
+
* The returned rules are flat `{permission, pattern, action}` objects
|
|
140
|
+
* matching opencode's `Permission.Rule` schema.
|
|
141
|
+
*/
|
|
142
|
+
private buildSessionRuleset;
|
|
143
|
+
/**
|
|
144
|
+
* PATCH a resumed session with our gate ruleset so subsequent tool calls
|
|
145
|
+
* surface as `permission.asked` events for the bridge. opencode's update
|
|
146
|
+
* endpoint merges (current + payload) — payload comes last and wins under
|
|
147
|
+
* findLast semantics. Idempotent across im-hub restarts but NOT within a
|
|
148
|
+
* single process: the caller (sendPrompt) gates on rulesetApplied.
|
|
149
|
+
*/
|
|
150
|
+
private applyRuleset;
|
|
151
|
+
private createSession;
|
|
152
|
+
private postPrompt;
|
|
153
|
+
private replyPermission;
|
|
154
|
+
private openEventStream;
|
|
155
|
+
}
|
|
156
|
+
export declare class EventStream implements AsyncIterable<OpencodeEvent> {
|
|
157
|
+
private reader;
|
|
158
|
+
private decoder;
|
|
159
|
+
private buf;
|
|
160
|
+
private closed;
|
|
161
|
+
constructor(body: NonNullable<Response['body']>);
|
|
162
|
+
close(): void;
|
|
163
|
+
[Symbol.asyncIterator](): AsyncIterator<OpencodeEvent>;
|
|
164
|
+
}
|
|
165
|
+
export type { OpencodeEvent };
|
|
166
|
+
//# sourceMappingURL=opencode-http-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode-http-adapter.d.ts","sourceRoot":"","sources":["../../../../src/plugins/agents/opencode/opencode-http-adapter.ts"],"names":[],"mappings":"AA0CA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAGxE,OAAO,EAAE,KAAK,oBAAoB,EAAiC,MAAM,oBAAoB,CAAA;AAC7F,OAAO,EAAqC,KAAK,WAAW,EAAiB,MAAM,+BAA+B,CAAA;AAMlH;;0EAE0E;AAC1E,UAAU,YAAY;IACpB,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAChF,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IACvC,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;;2EAG2E;AAC3E,UAAU,uBAAuB;IAC/B,IAAI,CAAC,EAAE;QACL,EAAE,CAAC,EAAE,MAAM,CAAA;QACX,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,MAAM,CAAC,EAAE;YAAE,KAAK,CAAC,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAC;YAAC,SAAS,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KACjF,CAAA;IACD,KAAK,CAAC,EAAE,YAAY,EAAE,CAAA;CACvB;AAED,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,CAAC,EAAE;QACX,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,IAAI,CAAC,EAAE;YAAE,EAAE,CAAC,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE;gBAAE,IAAI,CAAC,EAAE,MAAM,CAAA;aAAE,CAAC;YAAC,SAAS,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;QACtE,IAAI,CAAC,EAAE,YAAY,CAAA;QACnB,MAAM,CAAC,EAAE;YAAE,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;QAC1B,KAAK,CAAC,EAAE,OAAO,CAAA;QACf,4EAA4E;QAC5E,EAAE,CAAC,EAAE,MAAM,CAAA;QACX,+EAA+E;QAC/E,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,0CAA0C;QAC1C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;QACnB,4DAA4D;QAC5D,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KACnC,CAAA;CACF;AAED,MAAM,WAAW,kBAAkB;IACjC,iEAAiE;IACjE,KAAK,CAAC,EAAE,oBAAoB,CAAA;IAC5B,2CAA2C;IAC3C,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;IACxB;;wCAEoC;IACpC,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI,CAAA;CACjC;AAED,qBAAa,mBAAoB,SAAQ,eAAe;IACtD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAsB;IAC5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;IACxC,sDAAsD;IACtD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoB;IAChD;;;;qEAIiE;IACjE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAoB;gBAEvC,IAAI,GAAE,kBAAuB;IAWzC;;;;;;;;OAQG;IACH,gBAAgB,CAAC,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;IA0ClH;;;OAGG;IACH,WAAW,CAAC,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO;IAQ7D,YAAY,CAAC,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAc/E,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,EAAE,GAAG,MAAM;IAQ1D,UAAU,CACxB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,WAAW,EAAE,EACvB,IAAI,CAAC,EAAE,aAAa,GACnB,cAAc,CAAC,MAAM,CAAC;IA4JzB;;;;OAIG;IACH,iBAAiB,CACf,IAAI,EAAE,uBAAuB,EAC7B,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,EAC3B,IAAI,EAAE,aAAa,GAClB,MAAM,EAAE;IA4BX;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,QAAQ;IAmDhB;;;;;;OAMG;IACH,OAAO,CAAC,mBAAmB;IAS3B;;;;;;OAMG;YACW,YAAY;YAkBZ,aAAa;YA2Db,UAAU;YAiCV,eAAe;YAkBf,eAAe;CAS9B;AA4FD,qBAAa,WAAY,YAAW,aAAa,CAAC,aAAa,CAAC;IAC9D,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,GAAG,CAAK;IAChB,OAAO,CAAC,MAAM,CAAQ;gBAEV,IAAI,EAAE,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAI/C,KAAK,IAAI,IAAI;IAMN,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,aAAa,CAAC;CAgB9D;AAiBD,YAAY,EAAE,aAAa,EAAE,CAAA"}
|