@ycodium-ai/plugin-im 0.2.2962 → 0.2.2968

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/locales/en.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "settings": {
3
3
  "title": "Chat",
4
- "description": "Connect chat bots to Ycodium. One row per bot: create the bot on its platform, paste its credentials, and list the people allowed to use it. For Lark, Connect a Lark bot above does all of that with one scan. Those people message the bot (or add it to a group), pick a project in the chat, and can start work.",
4
+ "description": "Connect chat bots to Ycodium. One row per bot: create the bot on its platform, paste its credentials, and pick an access mode (allowlist / open). In allowlist mode, list the people allowed to use it. For Lark, Connect a Lark bot above does all of that with one scan. Admitted people message the bot (or add it to a group), pick a project in the chat, and can start work.",
5
5
  "bots": "Bots",
6
6
  "language": {
7
7
  "label": "Reply language",
@@ -19,12 +19,53 @@
19
19
  "always": "Only when it is mentioned",
20
20
  "never": "Every message",
21
21
  "ambient": "Every message, except ones aimed at someone else"
22
+ },
23
+ "deliveryHttp": {
24
+ "enabled": {
25
+ "label": "Enable proactive delivery HTTP",
26
+ "description": "Off by default. When on, listens only on 127.0.0.1 so local scripts can POST botId+targetId text. Do not expose publicly; set a Bearer token when other local processes might call it."
27
+ },
28
+ "port": {
29
+ "label": "Delivery HTTP port",
30
+ "description": "Bound to 127.0.0.1 only. Default 3847."
31
+ },
32
+ "token": {
33
+ "label": "Delivery HTTP token",
34
+ "description": "Optional. When set, requests must send Authorization: Bearer <token>."
35
+ }
36
+ },
37
+ "deliveryTargets": {
38
+ "label": "Delivery targets",
39
+ "description": "Callers store only botId (settings row id) and targetId. Keep platform chat ids here; do not send them on each request."
40
+ },
41
+ "deliveryKind": {
42
+ "chat": "Chat",
43
+ "user": "User / DM",
44
+ "group": "Group"
45
+ },
46
+ "queueMode": {
47
+ "queue": "Queue (default)",
48
+ "steer": "Steer (auto-join the running turn)"
49
+ },
50
+ "onOff": {
51
+ "on": "On",
52
+ "off": "Off"
53
+ },
54
+ "larkPanelMode": {
55
+ "default": "Default (all commands)",
56
+ "minimal": "Minimal"
57
+ },
58
+ "accessMode": {
59
+ "allowlist": "Allowlist only (default)",
60
+ "open": "Allow everyone"
22
61
  }
23
62
  },
24
63
  "platform": {
25
64
  "lark": "Lark",
26
65
  "telegram": "Telegram",
27
- "wecom": "WeCom"
66
+ "wecom": "WeCom",
67
+ "wecom-app": "WeCom App",
68
+ "wechat": "WeChat (experimental)"
28
69
  },
29
70
  "column": {
30
71
  "displayName": {
@@ -52,7 +93,7 @@
52
93
  },
53
94
  "allowedSenders": {
54
95
  "label": "Allowed people",
55
- "description": "Comma-separated user ids from that platform. Only these people can make the agent work on this machine; while the list is empty, nobody can. Message the bot and it tells you your own id."
96
+ "description": "Comma-separated user ids from that platform. Used only in allowlist mode; while the list is empty, nobody can. Message the bot and it tells you your own id."
56
97
  },
57
98
  "proxy": {
58
99
  "label": "Proxy",
@@ -60,11 +101,86 @@
60
101
  },
61
102
  "runtimeMode": {
62
103
  "label": "What a chat message may do",
63
- "description": "People on the allow list start turns from chat, so this is deliberately not full access by default. Whichever mode asks, the request lands in the chat."
104
+ "description": "Admitted people start turns from chat, so this is deliberately not full access by default. Whichever mode asks, the request lands in the chat."
64
105
  },
65
106
  "groupMention": {
66
107
  "label": "In groups, answer",
67
108
  "description": "When the bot answers in a group (unset means only when it is mentioned); direct chats always count. WeCom only delivers messages that mention the bot, so this changes nothing there."
109
+ },
110
+ "deliveryBotId": {
111
+ "label": "Bot ID",
112
+ "description": "The settings-table row id for that bot (opaque).",
113
+ "placeholder": "bot row id"
114
+ },
115
+ "deliveryTargetId": {
116
+ "label": "Target ID",
117
+ "description": "Caller alias unique under that bot; immutable after save.",
118
+ "placeholder": "release-alerts"
119
+ },
120
+ "deliveryName": {
121
+ "label": "Display name",
122
+ "placeholder": "Release alerts"
123
+ },
124
+ "deliveryKind": {
125
+ "label": "Kind"
126
+ },
127
+ "deliveryPlatformChatId": {
128
+ "label": "Platform chat ID",
129
+ "description": "Lark open_id/chat_id, Telegram chat id, WeCom user/group id, etc.",
130
+ "placeholder": "oc_… / ou_… / -100…"
131
+ },
132
+ "queueMode": {
133
+ "label": "New messages while busy",
134
+ "description": "When a turn is already running, how to handle new plain-text messages. Queue waits for the current turn (Steer is still a button); Steer auto-joins the running turn."
135
+ },
136
+ "larkPanelMode": {
137
+ "label": "Command panel",
138
+ "description": "Which commands /panel (or typing /) lists. Minimal hides low-frequency system items; typing the same command still works."
139
+ },
140
+ "wecomNumberedHints": {
141
+ "label": "Numbered-reply hints",
142
+ "description": "WeCom has no buttons; approvals and questions use reply numbers. When on, include fuller usage hints."
143
+ },
144
+ "wecomAppCorpId": {
145
+ "label": "Corp ID",
146
+ "placeholder": "ww…"
147
+ },
148
+ "wecomAppAgentId": {
149
+ "label": "AgentId",
150
+ "placeholder": "1000002"
151
+ },
152
+ "wecomAppSecret": {
153
+ "label": "App Secret"
154
+ },
155
+ "wecomAppToken": {
156
+ "label": "Callback Token"
157
+ },
158
+ "wecomAppEncodingAESKey": {
159
+ "label": "EncodingAESKey",
160
+ "placeholder": "43 alphanumeric chars"
161
+ },
162
+ "wecomAppCallbackBaseUrl": {
163
+ "label": "Public callback base URL (optional)",
164
+ "description": "When set, logs print the full callback URL to paste into WeCom “Receive messages → API receive”. Default listener is 127.0.0.1; use a reverse proxy or tunnel.",
165
+ "placeholder": "https://im.example.com or http://IP:30987"
166
+ },
167
+ "wecomAppApiBaseUrl": {
168
+ "label": "API proxy base (optional)",
169
+ "description": "Base URL for WeCom API calls (tokens, messages, images and files). Leave empty for qyapi.weixin.qq.com. The outbound IP must be on the app's trusted IP list.",
170
+ "placeholder": "https://qyapi.weixin.qq.com"
171
+ },
172
+ "wecomAppListenPort": {
173
+ "label": "Local callback port (optional)",
174
+ "description": "Defaults to 30987 on 127.0.0.1. Shared across self-built apps.",
175
+ "placeholder": "30987"
176
+ },
177
+ "wechatBotToken": {
178
+ "label": "WeChat bot token",
179
+ "description": "bot_token from QR binding. Live iLink login is gated by proposal 0069; filling this in does not connect yet."
180
+ },
181
+ "accessMode": {
182
+ "label": "Access mode",
183
+ "description": "Allowlist admits only \"Allowed people\"; open admits any identifiable sender. New bots default to allowlist."
68
184
  }
69
185
  },
70
186
  "reply": {
@@ -73,6 +189,10 @@
73
189
  "projectArchived": "Project \"{{title}}\" is archived. Restore it, or send /repo to pick another project, then message again.",
74
190
  "projectMissing": "The project this chat was working on is no longer on this machine (it may have been deleted), so a thread cannot be started. Send /repo to pick another one.",
75
191
  "threadGone": "The earlier session was deleted or archived, so this chat now starts a new one.",
192
+ "turnFailed": "This turn didn't finish: {{detail}}\nReference {{ref}}. Send the message again; if it keeps failing, send /new to start a new conversation.",
193
+ "turnFailedNoDetail": "This turn didn't finish. Reference {{ref}}. Send the message again; if it keeps failing, send /new to start a new conversation.",
194
+ "turnFailedBrief": "This turn didn't finish: {{detail}}\nSend the message again; if it keeps failing, send /new to start a new conversation.",
195
+ "turnFailedBriefNoDetail": "This turn didn't finish. Send the message again; if it keeps failing, send /new to start a new conversation.",
76
196
  "teamGone": "The team this chat was sending to no longer exists, so messages go to a normal session again.",
77
197
  "attachmentReceived": "Got {{names}} ({{count}} waiting). Tell me what to do with them.",
78
198
  "attachmentFailed": "Could not take {{name}}: {{reason}}.",
@@ -93,7 +213,8 @@
93
213
  "allow": "Allow",
94
214
  "deny": "Deny",
95
215
  "alreadyHandled": "Already handled",
96
- "replyHint": "Reply with the number."
216
+ "replyHint": "Reply with the number, or reply approve/deny.",
217
+ "replyHintFull": "Reply with the number. You can also reply approve/deny; for multi-select questions, comma-separate numbers."
97
218
  },
98
219
  "question": {
99
220
  "title": "❓ Question",
@@ -186,7 +307,8 @@
186
307
  "plan": "· /plan — toggle plan mode (the agent proposes a plan instead of acting); /plan on, /plan off set it",
187
308
  "panel": "Send /panel to open the command panel with a button for every command.",
188
309
  "repo": "· /repo — pick the project this chat works on; /repo number or /repo name picks directly",
189
- "group": "· /group name — Lark only: the bot creates a group and adds you (bots on other platforms cannot)"
310
+ "group": "· /group name — Lark only: the bot creates a group and adds you (bots on other platforms cannot)",
311
+ "syncNote": "· After a private chat attaches a session, web user text and final assistant text sync here (groups never sync)."
190
312
  },
191
313
  "sessions": {
192
314
  "title": "Sessions this bot opened for this chat's project ({{count}}):",
@@ -198,7 +320,8 @@
198
320
  "badge": {
199
321
  "current": "★ current",
200
322
  "running": "● running",
201
- "elsewhere": "in another chat"
323
+ "elsewhere": "in another chat",
324
+ "web": "web"
202
325
  },
203
326
  "age": {
204
327
  "justNow": "just now",
@@ -213,7 +336,10 @@
213
336
  "already": "This chat is already on that session.",
214
337
  "gone": "That session was deleted or archived, so it cannot be resumed.",
215
338
  "runningElsewhere": "That session is running a turn in another chat — stop it there first.",
216
- "done": "Switched to \"{{title}}\". Send a message to keep going from there."
339
+ "done": "Switched to \"{{title}}\". Send a message to keep going from there.",
340
+ "confirmWeb": "\"{{title}}\" was opened on the web. Send /resume with the same number again (or /resume confirm) to attach; /resume cancel to abort.",
341
+ "cancelled": "Attach cancelled.",
342
+ "nothingPending": "No web session is waiting for confirm. Use /sessions to see the list."
217
343
  },
218
344
  "model": {
219
345
  "current": "Model: {{model}}",
@@ -415,5 +541,43 @@
415
541
  "unsupported": "Bots on this platform cannot create groups. Create the group in the app and add the bot to it.",
416
542
  "noSender": "I cannot tell who you are on this platform, so I cannot add you to a new group.",
417
543
  "failed": "Could not create the group. Check that the app is allowed to create groups and add members, then try again."
544
+ },
545
+ "sync": {
546
+ "webUser": "Web: {{text}}"
547
+ },
548
+ "rowAction": {
549
+ "checkConnection": {
550
+ "label": "Check connection",
551
+ "description": "Verify platform credentials still work; does not open a session or call a model.",
552
+ "running": "Checking {{rowId}}…",
553
+ "done": "Connection OK",
554
+ "failed": "Connection failed (ref {{ref}})",
555
+ "notSaved": "Save this row first (credentials are read from saved config only)."
556
+ },
557
+ "copyDiagnostics": {
558
+ "label": "Copy diagnostics",
559
+ "description": "Run a connection probe and produce copy-paste diagnostics (no secrets).",
560
+ "running": "Building diagnostics for {{rowId}}…",
561
+ "done": "Diagnostics ready — see details below",
562
+ "failed": "Diagnostics failed (ref {{ref}})",
563
+ "notSaved": "Save this row first before copying diagnostics."
564
+ },
565
+ "diagnostic": {
566
+ "ref": "Ref {{ref}}\n{{detail}}"
567
+ },
568
+ "larkRepair": {
569
+ "label": "Repair scopes",
570
+ "description": "Verify the Lark app can still mint a token and list scope / publish steps.",
571
+ "step": {
572
+ "scopes": "Confirm message / resource / panel scopes",
573
+ "events": "Confirm long connection and event subscriptions",
574
+ "publish": "Publish if scopes were added",
575
+ "verify": "Verify the app can still mint a tenant token"
576
+ },
577
+ "done": "Credentials work; add any missing scopes in the Feishu console and publish",
578
+ "hint": "Ref {{ref}}\n{{detail}}\nIf scopes are missing, request them on the Feishu open platform and publish; a chat /repair command will follow.",
579
+ "failed": "Could not verify the Lark app (ref {{ref}})",
580
+ "notLark": "This row is not a saved Lark bot."
581
+ }
418
582
  }
419
583
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "settings": {
3
3
  "title": "聊天",
4
- "description": "把聊天机器人接到 Ycodium。一行一个机器人:先在对应平台建好机器人、把凭据填进来,再把允许使用它的人填进「允许的人」。飞书可以用上面的「连接飞书机器人」,扫一次码全部配好。名单里的人私聊机器人(或把它拉进群)、在聊天里选好项目,就能派活。",
4
+ "description": "把聊天机器人接到 Ycodium。一行一个机器人:先在对应平台建好机器人、把凭据填进来,再选访问模式(仅白名单/允许所有人)。仅白名单时把允许使用它的人填进「允许的人」。飞书可以用上面的「连接飞书机器人」,扫一次码全部配好。获准的人私聊机器人(或把它拉进群)、在聊天里选好项目,就能派活。",
5
5
  "bots": "机器人",
6
6
  "language": {
7
7
  "label": "回话语言",
@@ -19,12 +19,53 @@
19
19
  "always": "被 @ 才理",
20
20
  "never": "每句都理",
21
21
  "ambient": "每句都理,明显对别人说的除外"
22
+ },
23
+ "deliveryHttp": {
24
+ "enabled": {
25
+ "label": "开启主动投递 HTTP",
26
+ "description": "默认关闭。开启后只在本机 127.0.0.1 监听,供脚本用 botId+targetId 推文字。不要暴露到公网;需要时可再配 Bearer token。"
27
+ },
28
+ "port": {
29
+ "label": "投递 HTTP 端口",
30
+ "description": "只听 127.0.0.1。默认 3847。"
31
+ },
32
+ "token": {
33
+ "label": "投递 HTTP Token",
34
+ "description": "可选。填了则请求必须带 Authorization: Bearer <token>。同机其它进程也能打 loopback,建议生产开启。"
35
+ }
36
+ },
37
+ "deliveryTargets": {
38
+ "label": "投递目标",
39
+ "description": "调用方只保存 botId(机器人行 id)与 targetId。平台原生聊天 id 写在这里,不要随每次请求提交。"
40
+ },
41
+ "deliveryKind": {
42
+ "chat": "聊天",
43
+ "user": "用户/私聊",
44
+ "group": "群"
45
+ },
46
+ "queueMode": {
47
+ "queue": "排队(默认)",
48
+ "steer": "插话(自动并入当前轮)"
49
+ },
50
+ "onOff": {
51
+ "on": "开",
52
+ "off": "关"
53
+ },
54
+ "larkPanelMode": {
55
+ "default": "默认(全部命令)",
56
+ "minimal": "精简"
57
+ },
58
+ "accessMode": {
59
+ "allowlist": "仅白名单(默认)",
60
+ "open": "允许所有人"
22
61
  }
23
62
  },
24
63
  "platform": {
25
64
  "lark": "飞书",
26
65
  "telegram": "Telegram",
27
- "wecom": "企业微信"
66
+ "wecom": "企业微信",
67
+ "wecom-app": "企业微信应用",
68
+ "wechat": "微信(实验)"
28
69
  },
29
70
  "column": {
30
71
  "displayName": {
@@ -52,7 +93,7 @@
52
93
  },
53
94
  "allowedSenders": {
54
95
  "label": "允许的人",
55
- "description": "该平台的用户 id,逗号分隔。只有名单里的人能让 agent 在这台机器上干活,留空则谁都不能。给机器人发一句话,它会告诉你自己的 id。"
96
+ "description": "该平台的用户 id,逗号分隔。仅在「仅白名单」模式下生效;留空则谁都不能。给机器人发一句话,它会告诉你自己的 id。"
56
97
  },
57
98
  "proxy": {
58
99
  "label": "代理",
@@ -60,11 +101,86 @@
60
101
  },
61
102
  "runtimeMode": {
62
103
  "label": "聊天消息能做什么",
63
- "description": "名单里的人都能从聊天里开一轮,所以默认故意不给满权限。不论选哪一档,要拍板的事都会摆到聊天里。"
104
+ "description": "获准的人都能从聊天里开一轮,所以默认故意不给满权限。不论选哪一档,要拍板的事都会摆到聊天里。"
64
105
  },
65
106
  "groupMention": {
66
107
  "label": "群里什么时候理它",
67
108
  "description": "机器人在群里什么时候回应(不选就是被 @ 才理);单聊永远理。企业微信只把 @ 到机器人的群消息推过来,这一项对它没有效果。"
109
+ },
110
+ "deliveryBotId": {
111
+ "label": "Bot ID",
112
+ "description": "设置表里该机器人那一行的 id(不透明字符串)。",
113
+ "placeholder": "机器人行 id"
114
+ },
115
+ "deliveryTargetId": {
116
+ "label": "Target ID",
117
+ "description": "同一机器人下唯一的别名;保存后勿改。",
118
+ "placeholder": "release-alerts"
119
+ },
120
+ "deliveryName": {
121
+ "label": "显示名",
122
+ "placeholder": "发布告警群"
123
+ },
124
+ "deliveryKind": {
125
+ "label": "类型"
126
+ },
127
+ "deliveryPlatformChatId": {
128
+ "label": "平台聊天 ID",
129
+ "description": "飞书 open_id/chat_id、Telegram chat id、企微用户/群 id 等。",
130
+ "placeholder": "oc_… / ou_… / -100…"
131
+ },
132
+ "queueMode": {
133
+ "label": "忙时新消息",
134
+ "description": "当前任务还在跑时,新来的普通文字怎么处理。排队会等当前轮结束(可点插话);插话则自动并入当前轮,无需每次点按钮。"
135
+ },
136
+ "larkPanelMode": {
137
+ "label": "指令面板",
138
+ "description": "聊天里 /panel 或打 / 时列出的命令范围。精简隐藏低频系统项;手动输入同一命令仍可用。"
139
+ },
140
+ "wecomNumberedHints": {
141
+ "label": "编号应答提示",
142
+ "description": "企微没有按钮,审批与提问靠回编号。开启时附带更完整的用法说明。"
143
+ },
144
+ "wecomAppCorpId": {
145
+ "label": "企业 ID(CorpID)",
146
+ "placeholder": "ww…"
147
+ },
148
+ "wecomAppAgentId": {
149
+ "label": "应用 AgentId",
150
+ "placeholder": "1000002"
151
+ },
152
+ "wecomAppSecret": {
153
+ "label": "应用 Secret"
154
+ },
155
+ "wecomAppToken": {
156
+ "label": "回调 Token"
157
+ },
158
+ "wecomAppEncodingAESKey": {
159
+ "label": "EncodingAESKey",
160
+ "placeholder": "43 位字母或数字"
161
+ },
162
+ "wecomAppCallbackBaseUrl": {
163
+ "label": "公网回调基址(可选)",
164
+ "description": "填公网可达的 http(s) 基址后,日志会打印完整回调 URL,把它贴进企微「接收消息 → 设置 API 接收」。不填只显示本机路径。默认监听 127.0.0.1,需反代或隧道。",
165
+ "placeholder": "https://im.example.com 或 http://IP:30987"
166
+ },
167
+ "wecomAppApiBaseUrl": {
168
+ "label": "API 代理地址(可选)",
169
+ "description": "企业微信接口的基址(换 token、发消息、收发图片和文件)。留空就直连 qyapi.weixin.qq.com。出站 IP 要在这个应用的企业可信 IP 里。",
170
+ "placeholder": "https://qyapi.weixin.qq.com"
171
+ },
172
+ "wecomAppListenPort": {
173
+ "label": "本机回调端口(可选)",
174
+ "description": "默认 30987,只听 127.0.0.1。多台自建应用共用一个端口。",
175
+ "placeholder": "30987"
176
+ },
177
+ "wechatBotToken": {
178
+ "label": "微信机器人令牌",
179
+ "description": "扫码绑定后得到的 bot_token。真登录尚未开放:填了也不会连上 iLink,见提案 0069 安全评审。"
180
+ },
181
+ "accessMode": {
182
+ "label": "访问模式",
183
+ "description": "仅白名单=只有「允许的人」能触发;允许所有人=平台能识别的发送者均可。新机器人默认仅白名单。"
68
184
  }
69
185
  },
70
186
  "reply": {
@@ -73,6 +189,10 @@
73
189
  "projectArchived": "项目「{{title}}」已归档。恢复它,或发 /repo 换个项目,再发消息。",
74
190
  "projectMissing": "这个聊天原来做的项目已经不在这台机器上了(可能被删了),开不了会话。发 /repo 重新选一个。",
75
191
  "threadGone": "之前那条会话已被删除或归档,这个聊天改为开一条新会话。",
192
+ "turnFailed": "这一轮没能完成:{{detail}}\n参考号 {{ref}}。可以直接再发一次;一直不行就发 /new 开个新会话。",
193
+ "turnFailedNoDetail": "这一轮没能完成。参考号 {{ref}}。可以直接再发一次;一直不行就发 /new 开个新会话。",
194
+ "turnFailedBrief": "这一轮没能完成:{{detail}}\n可以直接再发一次;一直不行就发 /new 开个新会话。",
195
+ "turnFailedBriefNoDetail": "这一轮没能完成。可以直接再发一次;一直不行就发 /new 开个新会话。",
76
196
  "teamGone": "这个聊天原来派给的队已经不在了,接下来改回普通会话。",
77
197
  "attachmentReceived": "收到 {{names}}(现有 {{count}} 个待处理)。说一句想让我怎么处理。",
78
198
  "attachmentFailed": "没能收下 {{name}}:{{reason}}。",
@@ -93,7 +213,8 @@
93
213
  "allow": "允许",
94
214
  "deny": "拒绝",
95
215
  "alreadyHandled": "已处理",
96
- "replyHint": "回复编号即可。"
216
+ "replyHint": "回复编号,或回复「批准」/「拒绝」。",
217
+ "replyHintFull": "回复编号即可。也可回复「批准」/「拒绝」;多选提问用逗号分隔编号。"
97
218
  },
98
219
  "question": {
99
220
  "title": "❓ 提问",
@@ -186,7 +307,8 @@
186
307
  "plan": "· /plan —— 开关计划模式(agent 先出计划、不动手);/plan on、/plan off 明确设定",
187
308
  "panel": "发 /panel 打开可点的命令面板。",
188
309
  "repo": "· /repo —— 选这个聊天做哪个项目;/repo 编号 或 /repo 项目名 直接选",
189
- "group": "· /group 群名 —— 仅飞书:机器人建一个群并把你拉进去(别的平台的机器人建不了群)"
310
+ "group": "· /group 群名 —— 仅飞书:机器人建一个群并把你拉进去(别的平台的机器人建不了群)",
311
+ "syncNote": "· 私聊附着会话后,网页上的用户文字与终态助手文字会同步到此(群聊不同步)。"
190
312
  },
191
313
  "sessions": {
192
314
  "title": "本机器人为这个聊天的项目开过的会话({{count}} 条):",
@@ -198,7 +320,8 @@
198
320
  "badge": {
199
321
  "current": "★ 当前",
200
322
  "running": "● 在跑",
201
- "elsewhere": "接在别的聊天"
323
+ "elsewhere": "接在别的聊天",
324
+ "web": "网页"
202
325
  },
203
326
  "age": {
204
327
  "justNow": "刚刚",
@@ -213,7 +336,10 @@
213
336
  "already": "这个聊天已经在那条会话里了。",
214
337
  "gone": "那条会话已被删除或归档,接不上了。",
215
338
  "runningElsewhere": "那条会话正在别的聊天里跑着一轮——先到那边停掉它。",
216
- "done": "已切到「{{title}}」。发一句话就从那里接着聊。"
339
+ "done": "已切到「{{title}}」。发一句话就从那里接着聊。",
340
+ "confirmWeb": "「{{title}}」是网页开的会话。再发一次 /resume 同一编号(或 /resume confirm)确认附着;/resume cancel 取消。",
341
+ "cancelled": "已取消附着。",
342
+ "nothingPending": "没有待确认的网页会话。用 /sessions 看看有哪些。"
217
343
  },
218
344
  "model": {
219
345
  "current": "模型:{{model}}",
@@ -415,5 +541,43 @@
415
541
  "unsupported": "这个平台的机器人建不了群。请在 App 里自己建群,再把机器人拉进去。",
416
542
  "noSender": "我认不出你在这个平台上是谁,没法把你拉进新群。",
417
543
  "failed": "没能建群。请确认这个应用有建群和拉人的权限,再试一次。"
544
+ },
545
+ "sync": {
546
+ "webUser": "网页:{{text}}"
547
+ },
548
+ "rowAction": {
549
+ "checkConnection": {
550
+ "label": "检查连接",
551
+ "description": "验证平台凭据是否仍可用;不会开会话,也不会调模型。",
552
+ "running": "正在检查 {{rowId}} …",
553
+ "done": "连接正常",
554
+ "failed": "连接失败(参考号 {{ref}})",
555
+ "notSaved": "请先保存这一行再检查连接(凭据只从已保存配置读取)。"
556
+ },
557
+ "copyDiagnostics": {
558
+ "label": "复制诊断",
559
+ "description": "跑一次连接探测,生成可复制的诊断文本(不含密钥)。",
560
+ "running": "正在生成诊断 {{rowId}} …",
561
+ "done": "诊断已生成,见下方详情",
562
+ "failed": "诊断失败(参考号 {{ref}})",
563
+ "notSaved": "请先保存这一行再复制诊断。"
564
+ },
565
+ "diagnostic": {
566
+ "ref": "参考号 {{ref}}\n{{detail}}"
567
+ },
568
+ "larkRepair": {
569
+ "label": "补全权限",
570
+ "description": "核对飞书应用仍能换 token,并提示需要补的权限与发布步骤。",
571
+ "step": {
572
+ "scopes": "确认消息 / 资源 / 面板等权限",
573
+ "events": "确认长连接与事件订阅",
574
+ "publish": "如有增量权限,完成发布审批",
575
+ "verify": "验证应用仍可换取 tenant token"
576
+ },
577
+ "done": "凭据可用;若权限不足请按飞书控制台补齐后发布",
578
+ "hint": "参考号 {{ref}}\n{{detail}}\n缺权限时可在飞书开放平台对该应用增量申请并发布;聊天侧 /repair 命令后续补齐。",
579
+ "failed": "无法验证飞书应用(参考号 {{ref}})",
580
+ "notLark": "这一行不是已保存的飞书机器人。"
581
+ }
418
582
  }
419
583
  }
package/package.json CHANGED
@@ -1,12 +1,14 @@
1
1
  {
2
2
  "name": "@ycodium-ai/plugin-im",
3
- "version": "0.2.2962",
4
- "description": "Talk to your agents from Telegram, WeCom or Lark.",
3
+ "version": "0.2.2968",
4
+ "description": "Talk to your agents from Telegram, WeCom, Lark, or WeChat (experimental).",
5
5
  "keywords": [
6
6
  "im",
7
7
  "lark",
8
8
  "telegram",
9
+ "wechat",
9
10
  "wecom",
11
+ "wecom-app",
10
12
  "ycodium",
11
13
  "ycodium-plugin"
12
14
  ],
@@ -27,14 +29,20 @@
27
29
  "esbuild": "0.28.1",
28
30
  "markdown-it": "^15.0.2",
29
31
  "vite-plus": "0.2.2",
30
- "@ycodium-ai/plugin-api": "0.2.2962"
32
+ "@ycodium-ai/plugin-api": "0.2.2968"
31
33
  },
32
34
  "ycodium": {
33
35
  "plugin": "./dist/index.js",
34
36
  "displayName": "Chat bridge",
35
- "description": "Talk to your agents from Telegram, WeCom or Lark.",
37
+ "description": "Talk to your agents from Telegram, WeCom, Lark, or WeChat (experimental).",
36
38
  "icon": "messageCircle",
37
39
  "permissions": [
40
+ {
41
+ "kind": "sessionProjection"
42
+ },
43
+ {
44
+ "kind": "threads.user"
45
+ },
38
46
  {
39
47
  "kind": "workspace.read"
40
48
  },