im-hub-pro 0.2.33 → 0.2.37
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 +84 -0
- package/README.md +217 -372
- package/README.zh-CN.md +217 -371
- package/dist/cli.js +144 -21
- package/dist/cli.js.map +1 -1
- package/dist/core/acp-server.js +6 -6
- package/dist/core/acp-server.js.map +1 -1
- package/dist/core/agent-base.d.ts.map +1 -1
- package/dist/core/agent-base.js +12 -13
- package/dist/core/agent-base.js.map +1 -1
- package/dist/core/agent-cwd.js +3 -3
- package/dist/core/agent-cwd.js.map +1 -1
- package/dist/core/agent-cwd.test.js +4 -4
- package/dist/core/agent-cwd.test.js.map +1 -1
- package/dist/core/agent-helper.d.ts +45 -0
- package/dist/core/agent-helper.d.ts.map +1 -0
- package/dist/core/agent-helper.js +124 -0
- package/dist/core/agent-helper.js.map +1 -0
- package/dist/core/approval-bus.d.ts +18 -0
- package/dist/core/approval-bus.d.ts.map +1 -1
- package/dist/core/approval-bus.js +101 -10
- package/dist/core/approval-bus.js.map +1 -1
- package/dist/core/approval-bus.test.js +10 -8
- package/dist/core/approval-bus.test.js.map +1 -1
- package/dist/core/approval-router.d.ts +2 -2
- package/dist/core/approval-router.d.ts.map +1 -1
- package/dist/core/approval-router.js +117 -24
- package/dist/core/approval-router.js.map +1 -1
- package/dist/core/approval-router.test.js +16 -16
- package/dist/core/approval-router.test.js.map +1 -1
- package/dist/core/audit-log.js +2 -2
- package/dist/core/audit-log.js.map +1 -1
- package/dist/core/bgjob-reader.js +6 -6
- package/dist/core/bgjob-reader.js.map +1 -1
- package/dist/core/bgjob-reader.test.js +12 -12
- package/dist/core/bgjob-reader.test.js.map +1 -1
- package/dist/core/commands/approval.test.js +7 -7
- package/dist/core/commands/approval.test.js.map +1 -1
- package/dist/core/commands/audit.js +1 -1
- package/dist/core/commands/audit.js.map +1 -1
- package/dist/core/commands/builtin.d.ts.map +1 -1
- package/dist/core/commands/builtin.js +4 -2
- package/dist/core/commands/builtin.js.map +1 -1
- package/dist/core/commands/job.js +8 -8
- package/dist/core/commands/job.js.map +1 -1
- package/dist/core/commands/model.js +7 -7
- package/dist/core/commands/model.js.map +1 -1
- package/dist/core/commands/plan.js +2 -2
- package/dist/core/commands/plan.js.map +1 -1
- package/dist/core/commands/plan.test.js +3 -3
- package/dist/core/commands/plan.test.js.map +1 -1
- 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/sessions.js +4 -4
- package/dist/core/commands/sessions.js.map +1 -1
- package/dist/core/commands/stats.js +2 -2
- package/dist/core/commands/stats.js.map +1 -1
- package/dist/core/event-bus.d.ts +1 -1
- package/dist/core/event-bus.d.ts.map +1 -1
- package/dist/core/event-bus.js +1 -1
- package/dist/core/event-bus.js.map +1 -1
- package/dist/core/intent-llm.js +1 -1
- package/dist/core/intent-llm.js.map +1 -1
- package/dist/core/job-board.d.ts +1 -3
- package/dist/core/job-board.d.ts.map +1 -1
- package/dist/core/job-board.js +2 -2
- package/dist/core/job-board.js.map +1 -1
- package/dist/core/logger.js +1 -1
- package/dist/core/logger.js.map +1 -1
- package/dist/core/metrics.js +1 -1
- package/dist/core/metrics.js.map +1 -1
- package/dist/core/onboarding.d.ts.map +1 -1
- package/dist/core/onboarding.js +4 -5
- package/dist/core/onboarding.js.map +1 -1
- package/dist/core/onboarding.test.js +1 -1
- package/dist/core/onboarding.test.js.map +1 -1
- 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/registry.d.ts.map +1 -1
- package/dist/core/registry.js +2 -0
- package/dist/core/registry.js.map +1 -1
- 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 +185 -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.map +1 -1
- package/dist/core/router.js +15 -2
- package/dist/core/router.js.map +1 -1
- package/dist/core/schedule.js +3 -3
- package/dist/core/schedule.js.map +1 -1
- package/dist/core/session-subtasks.test.js +6 -6
- package/dist/core/session-subtasks.test.js.map +1 -1
- package/dist/core/session.js +5 -5
- package/dist/core/session.js.map +1 -1
- package/dist/core/sqlite-helper.js +2 -2
- package/dist/core/sqlite-helper.js.map +1 -1
- package/dist/core/transcribe.js +5 -5
- package/dist/core/transcribe.js.map +1 -1
- package/dist/core/transcribe.test.js +3 -3
- package/dist/core/transcribe.test.js.map +1 -1
- package/dist/core/types.d.ts +3 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/plugins/agents/acp/acp-client.d.ts.map +1 -1
- package/dist/plugins/agents/acp/acp-client.js +4 -2
- package/dist/plugins/agents/acp/acp-client.js.map +1 -1
- package/dist/plugins/agents/claude-code/adapter.test.js +10 -10
- package/dist/plugins/agents/claude-code/adapter.test.js.map +1 -1
- package/dist/plugins/agents/claude-code/index.js +5 -5
- package/dist/plugins/agents/claude-code/index.js.map +1 -1
- package/dist/plugins/agents/claude-code/mcp-approval-server.d.ts +12 -0
- package/dist/plugins/agents/claude-code/mcp-approval-server.d.ts.map +1 -1
- package/dist/plugins/agents/claude-code/mcp-approval-server.js +176 -27
- package/dist/plugins/agents/claude-code/mcp-approval-server.js.map +1 -1
- package/dist/plugins/agents/claude-code/mcp-approval-server.test.js +3 -3
- package/dist/plugins/agents/claude-code/mcp-approval-server.test.js.map +1 -1
- package/dist/plugins/agents/codex/adapter.test.js +1 -1
- package/dist/plugins/agents/codex/adapter.test.js.map +1 -1
- package/dist/plugins/agents/codex/index.js +3 -3
- package/dist/plugins/agents/codex/index.js.map +1 -1
- package/dist/plugins/agents/copilot/index.js +3 -3
- package/dist/plugins/agents/copilot/index.js.map +1 -1
- 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/http-adapter.test.js +4 -4
- package/dist/plugins/agents/opencode/http-adapter.test.js.map +1 -1
- package/dist/plugins/agents/opencode/opencode-http-adapter.d.ts +1 -1
- package/dist/plugins/agents/opencode/opencode-http-adapter.d.ts.map +1 -1
- package/dist/plugins/agents/opencode/opencode-http-adapter.js +50 -5
- package/dist/plugins/agents/opencode/opencode-http-adapter.js.map +1 -1
- package/dist/plugins/agents/opencode/opencode-stdio-adapter.d.ts +8 -0
- package/dist/plugins/agents/opencode/opencode-stdio-adapter.d.ts.map +1 -1
- package/dist/plugins/agents/opencode/opencode-stdio-adapter.js +36 -2
- package/dist/plugins/agents/opencode/opencode-stdio-adapter.js.map +1 -1
- package/dist/plugins/agents/opencode/serve-manager.d.ts.map +1 -1
- package/dist/plugins/agents/opencode/serve-manager.js +10 -6
- package/dist/plugins/agents/opencode/serve-manager.js.map +1 -1
- package/dist/plugins/messengers/discord/discord-adapter.d.ts +0 -1
- package/dist/plugins/messengers/discord/discord-adapter.d.ts.map +1 -1
- package/dist/plugins/messengers/discord/discord-adapter.js +3 -6
- package/dist/plugins/messengers/discord/discord-adapter.js.map +1 -1
- package/dist/plugins/messengers/discord/discord-adapter.test.js +9 -9
- package/dist/plugins/messengers/discord/discord-adapter.test.js.map +1 -1
- package/dist/plugins/messengers/email/email-adapter.d.ts +34 -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/feishu-adapter.d.ts +0 -1
- package/dist/plugins/messengers/feishu/feishu-adapter.d.ts.map +1 -1
- package/dist/plugins/messengers/feishu/feishu-adapter.js +4 -7
- package/dist/plugins/messengers/feishu/feishu-adapter.js.map +1 -1
- package/dist/plugins/messengers/feishu/feishu-client.d.ts +0 -1
- package/dist/plugins/messengers/feishu/feishu-client.d.ts.map +1 -1
- package/dist/plugins/messengers/feishu/feishu-client.js +0 -2
- package/dist/plugins/messengers/feishu/feishu-client.js.map +1 -1
- package/dist/plugins/messengers/telegram/markdown-to-html.js +3 -3
- package/dist/plugins/messengers/telegram/markdown-to-html.js.map +1 -1
- package/dist/plugins/messengers/telegram/media-download.js +5 -5
- package/dist/plugins/messengers/telegram/media-download.js.map +1 -1
- package/dist/plugins/messengers/telegram/media-download.test.js +3 -3
- package/dist/plugins/messengers/telegram/media-download.test.js.map +1 -1
- package/dist/plugins/messengers/telegram/telegram-adapter.d.ts +15 -0
- package/dist/plugins/messengers/telegram/telegram-adapter.d.ts.map +1 -1
- package/dist/plugins/messengers/telegram/telegram-adapter.js +165 -8
- package/dist/plugins/messengers/telegram/telegram-adapter.js.map +1 -1
- 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 +10 -0
- package/dist/plugins/messengers/wechat/ilink-adapter.d.ts.map +1 -1
- package/dist/plugins/messengers/wechat/ilink-adapter.js +213 -25
- package/dist/plugins/messengers/wechat/ilink-adapter.js.map +1 -1
- package/dist/plugins/messengers/wechat/ilink-client.d.ts +10 -1
- package/dist/plugins/messengers/wechat/ilink-client.d.ts.map +1 -1
- package/dist/plugins/messengers/wechat/ilink-client.js +42 -0
- package/dist/plugins/messengers/wechat/ilink-client.js.map +1 -1
- package/dist/plugins/messengers/wechat/ilink-types.d.ts +8 -0
- package/dist/plugins/messengers/wechat/ilink-types.d.ts.map +1 -1
- package/dist/plugins/messengers/wechat/ilink-types.js +10 -0
- package/dist/plugins/messengers/wechat/ilink-types.js.map +1 -1
- 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/utils/backoff.js +1 -1
- package/dist/utils/backoff.js.map +1 -1
- package/dist/utils/cross-platform.d.ts +1 -1
- package/dist/utils/cross-platform.d.ts.map +1 -1
- package/dist/utils/cross-platform.js +3 -3
- package/dist/utils/cross-platform.js.map +1 -1
- package/dist/utils/safe-equal.js +1 -1
- package/dist/utils/safe-equal.js.map +1 -1
- package/dist/web/public/_app.js +2 -2
- package/dist/web/public/index.html +13 -13
- package/dist/web/public/login.html +11 -3
- package/dist/web/public/reminders.html +233 -0
- package/dist/web/public/settings.html +20 -20
- package/dist/web/public/tasks.html +76 -76
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +105 -13
- package/dist/web/server.js.map +1 -1
- package/package.json +11 -4
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,90 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
|
|
5
|
+
## [0.2.37] - 2026-05-10 — Reminders + Email + Multi-agent MCP
|
|
6
|
+
|
|
7
|
+
> 设计文档:`docs/architecture/reminders.md`
|
|
8
|
+
|
|
9
|
+
### Added — `/remind` 子系统
|
|
10
|
+
|
|
11
|
+
**核心**
|
|
12
|
+
- `/remind` slash command(一次性 + 定期 + 邮件 + 字面/LLM 模式)
|
|
13
|
+
- 时间解析:中文 NL 时长 / 时点 / 循环表达式(每天 N 点 / 每周 X / 工作日 / 周末 / 每隔 N),英文 / HH:MM / ISO
|
|
14
|
+
- 5 秒 tick 调度器;崩溃恢复(`firing → pending`);7 天 fireAt 上限;50 条 / 用户配额
|
|
15
|
+
|
|
16
|
+
**LLM 增强(默认开启)**
|
|
17
|
+
- **F1 LLM 意图识别**:非 slash 消息走 detector,时间词正则预过滤后调当前 thread 的 active agent 抽 JSON。置信度 ≥ 0.85 弹"要不要为这件事设个提醒?"卡片,y/n 确认。可 `/remind aiwatch off` 关
|
|
18
|
+
- **F2 LLM 投递润色**:fire 时把字面文本作为 prompt 喂给当前 agent 重写成自然投递语(系统约束:"不献媚、不过度幽默、不夸大",≤ 80 字)。20s 超时 fallback 字面。`/remind literal …` 强制字面投递。每 N 分钟(< 1h)+ LLM 模式被拒绝(防止高频 LLM 调用)
|
|
19
|
+
- **Agent context snippet**:每次 agent 调用前在 prompt 前注入 ≤ 5 条 pending 提醒摘要,agent 不用主动 list_reminders 就能看到现状
|
|
20
|
+
|
|
21
|
+
**Agent MCP 工具(提醒兜底创建)**
|
|
22
|
+
- 4 个工具:`create_reminder` / `list_reminders` / `cancel_reminder` / `snooze_reminder`
|
|
23
|
+
- claude-code:复用现有 `--mcp-config` per-spawn 注入
|
|
24
|
+
- opencode (stdio):`prepareCommand` 注入 `IMHUB_RUN_ID` extraEnv,全局 `mcp.imhub` config 自动注册
|
|
25
|
+
- opencode (http):常驻 daemon 共享 MCP server,agent-asserted `_im_context` 兜底(**单用户限定**——agent 可伪造身份)
|
|
26
|
+
- codex:未实施(`codex exec` 不支持外部 MCP)
|
|
27
|
+
|
|
28
|
+
**Web 管理**
|
|
29
|
+
- `/reminders` 页面(dark mode、状态筛选、取消、延后)
|
|
30
|
+
- 3 个 REST endpoint:`GET /api/reminders`、`POST /api/reminders/:id/cancel`、`POST /api/reminders/:id/snooze`
|
|
31
|
+
|
|
32
|
+
### Added — 邮件投递通道
|
|
33
|
+
- 注册为 `email` messenger(`threadId` 即邮箱地址)
|
|
34
|
+
- nodemailer + Gmail / QQ / 163 / 任意 SMTP(env:`IMHUB_SMTP_HOST/PORT/USER/PASS/FROM/SECURE`)
|
|
35
|
+
- `/remind email <addr> <time> <text>` 内联 / `/remind bindemail` 绑定默认 / `/remind email <time> <text>` 走默认
|
|
36
|
+
- 邮件 + 循环 + LLM 润色组合自由
|
|
37
|
+
|
|
38
|
+
### Added — WeChat context_token 持久化
|
|
39
|
+
- iLink Bot API 30 分钟 context_token TTL 之前只存内存,重启即丢,导致循环提醒在 wechat 端高概率失败
|
|
40
|
+
- 新 SQLite 表(`~/.im-hub/wechat-context.db`),收消息时写穿,启动时 warm 内存 Map,cleanup 同步清 DB
|
|
41
|
+
|
|
42
|
+
### Schema migrations
|
|
43
|
+
新建 / 扩展三张表(在 `reminders.db` 内):
|
|
44
|
+
- `reminders` 主表:`recurrence` `last_fired_at` `prompt_mode` 三列追加(idempotent ALTER)
|
|
45
|
+
- `user_email_bindings`
|
|
46
|
+
- `user_aiwatch_settings`
|
|
47
|
+
|
|
48
|
+
新独立 SQLite:`wechat-context.db`
|
|
49
|
+
|
|
50
|
+
### Tests
|
|
51
|
+
新增 7 个测试文件,~50 个新 case:`agent-helper`、`pending-reminder`、`remind-intent`、`reminder-rpc`、`email-adapter`、`wechat-context-store`、扩展的 `reminders.test.ts`。bun test 1033 pass / 34 skip / 0 new fail。
|
|
52
|
+
|
|
53
|
+
### Dependencies
|
|
54
|
+
- `nodemailer ^8.0.7`
|
|
55
|
+
|
|
56
|
+
### Known limitations
|
|
57
|
+
- opencode http 多用户场景不安全(`_im_context` 可伪造);多用户部署应选 stdio 或 claude-code
|
|
58
|
+
- `/api/reminders` 无 per-user owner-scoping(单运营者部署)
|
|
59
|
+
- codex 暂无 MCP reminder 工具(重写需 ~5h,下一轮专项)
|
|
60
|
+
- F1 detector 时区跟随 server `toLocaleString()`
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## [0.2.35] - 2026-05-09
|
|
65
|
+
|
|
66
|
+
### Added — WeChat & Telegram rich media support
|
|
67
|
+
|
|
68
|
+
- **WeChat 图片 / 文件 / 语音 / 视频接收**:`handleIncomingMessage` 现在处理 iLink `item_list` 的全部 5 种类型(TEXT=1, IMAGE=2, VOICE=3, FILE=4, VIDEO=5),此前只处理 TEXT。
|
|
69
|
+
- **图片**:通过 iLink CDN 下载到 `~/.im-hub/media/wechat/<userId>/`,转为 `[图片附件:/path]` 标记传递给 Agent
|
|
70
|
+
- **语音**:优先使用微信自带转写(`voice_item.text`),无转写时下载音频后走 OpenAI Whisper 或 whisper.cpp(复用 `src/core/transcribe.ts`)
|
|
71
|
+
- **文件**:下载并保留原始文件名,显示大小,转为 `[文件附件:/path (name, size)]`
|
|
72
|
+
- **视频**:下载并显示时长和大小,转为 `[视频附件:/path (duration, size)]`
|
|
73
|
+
- **混合消息**:同一条消息中的文本 + 媒体项按顺序拼接
|
|
74
|
+
- **Telegram 图片 / 语音增强**:Telegram 适配器的图片下载和语音转写能力在本轮中同步维护和 bugfix。
|
|
75
|
+
- **新文件**:`src/plugins/messengers/wechat/media-download.ts` — 媒体下载辅助,含路径安全检查(拒绝 `../` / `/`)和 20 MB 大小上限
|
|
76
|
+
- **新类型**:`ilink-types.ts` 新增 `ITEM_TYPE` 常量和 `DownloadMediaRequest`
|
|
77
|
+
- **新方法**:`ILinkClient.downloadMedia(cdnMedia)` — 通过 iLink CDN 端点下载二进制媒体
|
|
78
|
+
|
|
79
|
+
### Tests
|
|
80
|
+
|
|
81
|
+
- 53 个新测试:
|
|
82
|
+
- 31 集成测试(`test/integration/wechat-media-integration.test.ts`)— 端到端验证 `handleIncomingMessage` 对所有媒体类型的处理,含成功 / 失败 / 边界情况
|
|
83
|
+
- 15 单元测试(`test/unit/wechat-media-download.test.ts`)— 下载辅助函数、扩展名推断、CDN 提取、安全防护
|
|
84
|
+
- 8 单元测试(`test/unit/wechat-media-handling.test.ts`)— 类型常量和消息结构验证
|
|
85
|
+
- 全量 950 pass / 0 fail
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
5
89
|
## [0.2.33] - 2026-05-09
|
|
6
90
|
|
|
7
91
|
### Fixed — audit-fixes-7950 follow-up
|