@sidleo3/dsh-chat-feishu 0.0.4
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/client/index.js +1190 -0
- package/cordis.patch.yml +5 -0
- package/host/bridge.mjs +1605 -0
- package/host/config-store.mjs +240 -0
- package/host/controller.mjs +1514 -0
- package/host/index.mjs +227 -0
- package/host/lark-cli.mjs +543 -0
- package/host/lark-gateway.mjs +1362 -0
- package/host/lark-guard.mjs +200 -0
- package/host/panel-card.mjs +681 -0
- package/host/provision.mjs +247 -0
- package/host/state-store.mjs +160 -0
- package/host/turn-presenter.mjs +778 -0
- package/lib/client.js +1132 -0
- package/lib/index.js +132126 -0
- package/package.json +54 -0
package/lib/client.js
ADDED
|
@@ -0,0 +1,1132 @@
|
|
|
1
|
+
window.__ModuleLoader__.load({
|
|
2
|
+
id: "@sidleo3/dsh-chat-feishu",
|
|
3
|
+
factory: (require) => {
|
|
4
|
+
var module = { exports: {} };
|
|
5
|
+
var exports = module.exports;
|
|
6
|
+
var __create = Object.create;
|
|
7
|
+
var __defProp = Object.defineProperty;
|
|
8
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
9
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
10
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
11
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
12
|
+
var __export = (target, all) => {
|
|
13
|
+
for (var name2 in all)
|
|
14
|
+
__defProp(target, name2, { get: all[name2], enumerable: true });
|
|
15
|
+
};
|
|
16
|
+
var __copyProps = (to, from, except, desc) => {
|
|
17
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
18
|
+
for (let key of __getOwnPropNames(from))
|
|
19
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
20
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
21
|
+
}
|
|
22
|
+
return to;
|
|
23
|
+
};
|
|
24
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
25
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
26
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
27
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
28
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
29
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
30
|
+
mod
|
|
31
|
+
));
|
|
32
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
33
|
+
|
|
34
|
+
// packages/dsh-chat-feishu/client/index.js
|
|
35
|
+
var index_exports = {};
|
|
36
|
+
__export(index_exports, {
|
|
37
|
+
BotCard: () => BotCard,
|
|
38
|
+
FeishuOnboard: () => FeishuOnboard,
|
|
39
|
+
FeishuPage: () => FeishuPage,
|
|
40
|
+
apply: () => apply,
|
|
41
|
+
inject: () => inject,
|
|
42
|
+
name: () => name
|
|
43
|
+
});
|
|
44
|
+
module.exports = __toCommonJS(index_exports);
|
|
45
|
+
var React = __toESM(require("react"), 1);
|
|
46
|
+
var name = "dsh-chat-feishu-client";
|
|
47
|
+
var inject = ["slots", "locale", "connection", "chatChannels", "chatUi"];
|
|
48
|
+
var CHANNEL_ID = "feishu";
|
|
49
|
+
var FEISHU_SETUP_HINT = "\u672C\u673A\u8FD8\u6CA1\u6709\u98DE\u4E66\u673A\u5668\u4EBA\u914D\u7F6E\uFF1A\u628A\u98DE\u4E66\u5E94\u7528\u7684\u51ED\u636E\u52A0\u8FDB\u6E20\u9053\u7684 config.json \u540E\u91CD\u542F dsh\uFF08\u65E7\u7248 dsh-im \u7684\u914D\u7F6E\u4F1A\u5728\u542F\u52A8\u65F6\u81EA\u52A8\u5BFC\u5165\uFF09\u3002";
|
|
50
|
+
var PAGE_SLOT = "chat.channel.page";
|
|
51
|
+
var LOCALE_NAMESPACE = "dsh-chat-feishu";
|
|
52
|
+
var zh = {
|
|
53
|
+
"\u5173\u95ED": "\u5173\u95ED",
|
|
54
|
+
"\u5220\u9664": "\u5220\u9664",
|
|
55
|
+
"\u542F\u7528": "\u542F\u7528",
|
|
56
|
+
"\u586B\u5165\u793A\u4F8B": "\u586B\u5165\u793A\u4F8B",
|
|
57
|
+
"\u5907\u6CE8\u540D\uFF08\u53EF\u9009\uFF09": "\u5907\u6CE8\u540D\uFF08\u53EF\u9009\uFF09",
|
|
58
|
+
"\u5F20\u4E09": "\u5F20\u4E09",
|
|
59
|
+
"\u65B0\u589E": "\u65B0\u589E",
|
|
60
|
+
"\u6765\u6E90\u5B57\u6BB5": "\u6765\u6E90\u5B57\u6BB5",
|
|
61
|
+
"\u6E05\u7A7A": "\u6E05\u7A7A",
|
|
62
|
+
"\u8FD8\u6CA1\u6709\u6307\u5B9A\u8BBE\u7F6E\u3002": "\u8FD8\u6CA1\u6709\u6307\u5B9A\u8BBE\u7F6E\u3002",
|
|
63
|
+
"\u4E0A\u4E0B\u6587\u589E\u5F3A": "\u4E0A\u4E0B\u6587\u589E\u5F3A",
|
|
64
|
+
"\u4E0A\u4E0B\u6587\u589E\u5F3A\u8303\u56F4": "\u4E0A\u4E0B\u6587\u589E\u5F3A\u8303\u56F4",
|
|
65
|
+
"\u53E0\u52A0\u5168\u5C40\u63D0\u793A\u8BCD\uFF08\u4E0D\u52FE\u9009\u5219\u53EA\u4F7F\u7528\u4E0A\u9762\u7684\u4E13\u5C5E\u63D0\u793A\u8BCD\uFF09": "\u53E0\u52A0\u5168\u5C40\u63D0\u793A\u8BCD\uFF08\u4E0D\u52FE\u9009\u5219\u53EA\u4F7F\u7528\u4E0A\u9762\u7684\u4E13\u5C5E\u63D0\u793A\u8BCD\uFF09",
|
|
66
|
+
"\u544A\u8BC9\u6A21\u578B\u5982\u4F55\u4F7F\u7528\u6765\u6E90\u5B57\u6BB5\u3002\u53EA\u586B\u6B63\u6587\uFF0C\u63D2\u4EF6\u4F1A\u81EA\u52A8\u5305\u6210\u6765\u6E90\u589E\u5F3A\u5757\u3002": "\u544A\u8BC9\u6A21\u578B\u5982\u4F55\u4F7F\u7528\u6765\u6E90\u5B57\u6BB5\u3002\u53EA\u586B\u6B63\u6587\uFF0C\u63D2\u4EF6\u4F1A\u81EA\u52A8\u5305\u6210\u6765\u6E90\u589E\u5F3A\u5757\u3002",
|
|
67
|
+
"\u589E\u5F3A\u63D0\u793A\u8BCD": "\u589E\u5F3A\u63D0\u793A\u8BCD",
|
|
68
|
+
"\u6765\u6E90\u5B57\u6BB5\u53EA\u5728\u5F53\u524D\u6D88\u606F\u5DF2\u63D0\u4F9B\u65F6\u624D\u4F1A\u53D1\u9001\uFF0C\u4E0D\u4F1A\u989D\u5916\u67E5\u8BE2\u5E73\u53F0\u63A5\u53E3\u3002": "\u6765\u6E90\u5B57\u6BB5\u53EA\u5728\u5F53\u524D\u6D88\u606F\u5DF2\u63D0\u4F9B\u65F6\u624D\u4F1A\u53D1\u9001\uFF0C\u4E0D\u4F1A\u989D\u5916\u67E5\u8BE2\u5E73\u53F0\u63A5\u53E3\u3002",
|
|
69
|
+
"\u4ECE\u4F1A\u8BDD\u91CC\u9009\u2026": "\u4ECE\u4F1A\u8BDD\u91CC\u9009\u2026",
|
|
70
|
+
"\u53BB\u5F00\u901A\u6743\u9650": "\u53BB\u5F00\u901A\u6743\u9650",
|
|
71
|
+
"\u5C5E\u4E3B\u540D\u5355\u662F *\uFF08\u8FD9\u53F0\u673A\u5668\u4EBA\u6CA1\u6709\u5C5E\u4E3B\u7ED5\u8FC7\uFF09\uFF1A\u80FD\u7528\u5B83\u7684\u4EBA\u5B8C\u5168\u7531\u4E0B\u9762\u7684\u300C\u8BBF\u95EE\u7B56\u7565\u300D\u51B3\u5B9A\u3002": "\u5C5E\u4E3B\u540D\u5355\u662F *\uFF08\u8FD9\u53F0\u673A\u5668\u4EBA\u6CA1\u6709\u5C5E\u4E3B\u7ED5\u8FC7\uFF09\uFF1A\u80FD\u7528\u5B83\u7684\u4EBA\u5B8C\u5168\u7531\u4E0B\u9762\u7684\u300C\u8BBF\u95EE\u7B56\u7565\u300D\u51B3\u5B9A\u3002",
|
|
72
|
+
"Agent \u9884\u8BBE": "Agent \u9884\u8BBE",
|
|
73
|
+
"\u6A21\u578B": "\u6A21\u578B",
|
|
74
|
+
"\u9ED8\u8BA4\u6A21\u578B": "\u9ED8\u8BA4\u6A21\u578B",
|
|
75
|
+
"\u63A8\u7406\u7B49\u7EA7": "\u63A8\u7406\u7B49\u7EA7",
|
|
76
|
+
"\u8FD9\u4E2A\u6A21\u578B\u6CA1\u6709\u53EF\u9009\u7684\u63A8\u7406\u7B49\u7EA7\u3002": "\u8FD9\u4E2A\u6A21\u578B\u6CA1\u6709\u53EF\u9009\u7684\u63A8\u7406\u7B49\u7EA7\u3002",
|
|
77
|
+
"\u5148\u9009\u4E00\u4E2A\u6A21\u578B\u3002": "\u5148\u9009\u4E00\u4E2A\u6A21\u578B\u3002",
|
|
78
|
+
"\u6A21\u578B\u9ED8\u8BA4": "\u6A21\u578B\u9ED8\u8BA4",
|
|
79
|
+
"\u90E8\u5206 provider \u8BFB\u53D6\u5931\u8D25\uFF1A": "\u90E8\u5206 provider \u8BFB\u53D6\u5931\u8D25\uFF1A",
|
|
80
|
+
"\u5F53\u524D Host \u8BFB\u4E0D\u5230\u6A21\u578B\u76EE\u5F55\u3002": "\u5F53\u524D Host \u8BFB\u4E0D\u5230\u6A21\u578B\u76EE\u5F55\u3002",
|
|
81
|
+
"\u8FD8\u6CA1\u6709\u4F1A\u8BDD\u65F6\u7528\u54EA\u4E2A\u6A21\u578B\uFF1A\u9009\u5B8C\u5BF9\u4E0B\u4E00\u6761\u6D88\u606F\u65B0\u5EFA\u7684\u4F1A\u8BDD\u751F\u6548\u3002\u4F1A\u8BDD\u5185\u8FD8\u80FD\u5355\u72EC\u6539\uFF08\u9762\u677F\u7684\u6A21\u578B\u4E0B\u62C9\uFF09\u3002": "\u8FD8\u6CA1\u6709\u4F1A\u8BDD\u65F6\u7528\u54EA\u4E2A\u6A21\u578B\uFF1A\u9009\u5B8C\u5BF9\u4E0B\u4E00\u6761\u6D88\u606F\u65B0\u5EFA\u7684\u4F1A\u8BDD\u751F\u6548\u3002\u4F1A\u8BDD\u5185\u8FD8\u80FD\u5355\u72EC\u6539\uFF08\u9762\u677F\u7684\u6A21\u578B\u4E0B\u62C9\uFF09\u3002",
|
|
82
|
+
"\u4E0B\u62C9\u91CC\u662F\u8FD9\u53F0\u673A\u5668\u4EBA\u7528\u8FC7\u7684\u76EE\u5F55\u3002": "\u4E0B\u62C9\u91CC\u662F\u8FD9\u53F0\u673A\u5668\u4EBA\u7528\u8FC7\u7684\u76EE\u5F55\u3002",
|
|
83
|
+
"\u4EC5\u540D\u5355\u5185\u53EF\u7528": "\u4EC5\u540D\u5355\u5185\u53EF\u7528",
|
|
84
|
+
"\u4ECE\u4F1A\u8BDD\u91CC\u9009\u4E00\u4E2A\u4EBA\u8BBE\u4E3A\u5C5E\u4E3B": "\u4ECE\u4F1A\u8BDD\u91CC\u9009\u4E00\u4E2A\u4EBA\u8BBE\u4E3A\u5C5E\u4E3B",
|
|
85
|
+
"\u4EFB\u4F55\u4EBA\u53EF\u7528": "\u4EFB\u4F55\u4EBA\u53EF\u7528",
|
|
86
|
+
"\u5141\u8BB8\u6267\u884C\u547D\u4EE4": "\u5141\u8BB8\u6267\u884C\u547D\u4EE4",
|
|
87
|
+
"\u53EF\u6267\u884C\u547D\u4EE4": "\u53EF\u6267\u884C\u547D\u4EE4",
|
|
88
|
+
"\u540D\u5355\u4E3A\u7A7A\u65F6\u53EA\u6709\u5C5E\u4E3B\u53EF\u7528\u3002": "\u540D\u5355\u4E3A\u7A7A\u65F6\u53EA\u6709\u5C5E\u4E3B\u53EF\u7528\u3002",
|
|
89
|
+
"\u5BF9\u65B9\u7684\u5E73\u53F0 id\uFF0C\u56DE\u8F66\u6DFB\u52A0": "\u5BF9\u65B9\u7684\u5E73\u53F0 id\uFF0C\u56DE\u8F66\u6DFB\u52A0",
|
|
90
|
+
"\u8BFB\u4E0D\u5230\u540D\u5355\u91CC\u7684\u540D\u5B57": "\u8BFB\u4E0D\u5230\u540D\u5355\u91CC\u7684\u540D\u5B57",
|
|
91
|
+
"\u5C5E\u4E3B": "\u5C5E\u4E3B",
|
|
92
|
+
"\u5C5E\u4E3B\u4E0D\u9700\u8981\u8FDB\u767D\u540D\u5355\uFF1A\u6D88\u606F\u4E0E\u547D\u4EE4\u90FD\u76F4\u63A5\u653E\u884C\u3002\u8FD9\u91CC\u6539\u5B8C\u4F1A\u91CD\u8FDE\u4E00\u6B21\uFF0C\u7ACB\u523B\u751F\u6548\u3002": "\u5C5E\u4E3B\u4E0D\u9700\u8981\u8FDB\u767D\u540D\u5355\uFF1A\u6D88\u606F\u4E0E\u547D\u4EE4\u90FD\u76F4\u63A5\u653E\u884C\u3002\u8FD9\u91CC\u6539\u5B8C\u4F1A\u91CD\u8FDE\u4E00\u6B21\uFF0C\u7ACB\u523B\u751F\u6548\u3002",
|
|
93
|
+
"\u5DE5\u4F5C\u533A": "\u5DE5\u4F5C\u533A",
|
|
94
|
+
"\u5F53\u524D Host \u8BFB\u4E0D\u5230 Agent Preset \u5217\u8868\u3002": "\u5F53\u524D Host \u8BFB\u4E0D\u5230 Agent Preset \u5217\u8868\u3002",
|
|
95
|
+
"\u5F53\u524D\u6CA1\u6709\u5C5E\u4E3B\uFF1A\u6CA1\u6709\u4EBA\u7ED5\u8FC7\u8BBF\u95EE\u7B56\u7565\uFF0C\u8C01\u80FD\u7528\u5B8C\u5168\u7531\u4E0B\u9762\u7684\u300C\u8BBF\u95EE\u7B56\u7565\u300D\u51B3\u5B9A\u3002": "\u5F53\u524D\u6CA1\u6709\u5C5E\u4E3B\uFF1A\u6CA1\u6709\u4EBA\u7ED5\u8FC7\u8BBF\u95EE\u7B56\u7565\uFF0C\u8C01\u80FD\u7528\u5B8C\u5168\u7531\u4E0B\u9762\u7684\u300C\u8BBF\u95EE\u7B56\u7565\u300D\u51B3\u5B9A\u3002",
|
|
96
|
+
"\u673A\u5668\u4EBA\u8DD1\u5728\u54EA\u4E2A\u76EE\u5F55\uFF1A\u80FD\u8BFB\u5199\u54EA\u4E9B\u6587\u4EF6\u3001\u7528\u54EA\u4EFD AGENTS.md\u3002\u53EA\u5BF9\u65B0\u5EFA\u4F1A\u8BDD\u751F\u6548\u3002": "\u673A\u5668\u4EBA\u8DD1\u5728\u54EA\u4E2A\u76EE\u5F55\uFF1A\u80FD\u8BFB\u5199\u54EA\u4E9B\u6587\u4EF6\u3001\u7528\u54EA\u4EFD AGENTS.md\u3002\u53EA\u5BF9\u65B0\u5EFA\u4F1A\u8BDD\u751F\u6548\u3002",
|
|
97
|
+
"\u6CA1\u6709\u53EF\u9009\u7684\u4F1A\u8BDD\uFF08\u5148\u548C\u673A\u5668\u4EBA\u804A\u4E00\u6B21\uFF09": "\u6CA1\u6709\u53EF\u9009\u7684\u4F1A\u8BDD\uFF08\u5148\u548C\u673A\u5668\u4EBA\u804A\u4E00\u6B21\uFF09",
|
|
98
|
+
"\u6DFB\u52A0": "\u6DFB\u52A0",
|
|
99
|
+
"\u6E05\u7A7A\u540E\u6CA1\u6709\u4EBA\u7ED5\u8FC7\u8BBF\u95EE\u7B56\u7565": "\u6E05\u7A7A\u540E\u6CA1\u6709\u4EBA\u7ED5\u8FC7\u8BBF\u95EE\u7B56\u7565",
|
|
100
|
+
"\u6E05\u7A7A\uFF08\u65E0\u5C5E\u4E3B\uFF09": "\u6E05\u7A7A\uFF08\u65E0\u5C5E\u4E3B\uFF09",
|
|
101
|
+
"\u76EE\u5F55": "\u76EE\u5F55",
|
|
102
|
+
"\u663E\u793A\u9879": "\u663E\u793A\u9879",
|
|
103
|
+
"\u63A7\u5236\u9762\u677F\u663E\u793A\u9879": "\u63A7\u5236\u9762\u677F\u663E\u793A\u9879",
|
|
104
|
+
"\u53EA\u5F71\u54CD /menu \u53D1\u51FA\u6765\u7684\u90A3\u5F20\u5361\u7247\uFF1A\u5173\u6389\u7684\u9879\u4E0D\u663E\u793A\uFF0C\u529F\u80FD\u7167\u65E7\uFF08\u79C1\u804A\u4E0E\u7FA4\u804A\u5206\u522B\u8BBE\u7F6E\uFF09\u3002": "\u53EA\u5F71\u54CD /menu \u53D1\u51FA\u6765\u7684\u90A3\u5F20\u5361\u7247\uFF1A\u5173\u6389\u7684\u9879\u4E0D\u663E\u793A\uFF0C\u529F\u80FD\u7167\u65E7\uFF08\u79C1\u804A\u4E0E\u7FA4\u804A\u5206\u522B\u8BBE\u7F6E\uFF09\u3002",
|
|
105
|
+
"\u6A21\u578B\u4E0E\u63A8\u7406\u7B49\u7EA7": "\u6A21\u578B\u4E0E\u63A8\u7406\u7B49\u7EA7",
|
|
106
|
+
"\u4F1A\u8BDD": "\u4F1A\u8BDD",
|
|
107
|
+
"Agent \u9884\u8BBE\u4E0E\u5DE5\u4F5C\u533A": "Agent \u9884\u8BBE\u4E0E\u5DE5\u4F5C\u533A",
|
|
108
|
+
"\u4E0A\u4E0B\u6587\u589E\u5F3A\uFF08\u672C\u4F1A\u8BDD\uFF09": "\u4E0A\u4E0B\u6587\u589E\u5F3A\uFF08\u672C\u4F1A\u8BDD\uFF09",
|
|
109
|
+
"\u8BBF\u95EE\u7B56\u7565\uFF08\u672C\u4F1A\u8BDD\uFF09": "\u8BBF\u95EE\u7B56\u7565\uFF08\u672C\u4F1A\u8BDD\uFF09",
|
|
110
|
+
"\u6E20\u9053\u8BBE\u7F6E\uFF08\u4EFB\u52A1\u8FC7\u7A0B\u5C55\u793A\u7B49\uFF09": "\u6E20\u9053\u8BBE\u7F6E\uFF08\u4EFB\u52A1\u8FC7\u7A0B\u5C55\u793A\u7B49\uFF09",
|
|
111
|
+
"\u6E20\u9053\u52A8\u4F5C\u6309\u94AE\uFF08\u91CD\u8FDE\u7B49\uFF09": "\u6E20\u9053\u52A8\u4F5C\u6309\u94AE\uFF08\u91CD\u8FDE\u7B49\uFF09",
|
|
112
|
+
"\u547D\u4EE4\u6309\u94AE\uFF08\u65B0\u4F1A\u8BDD/\u72B6\u6001/\u8BCA\u65AD\u2026\uFF09": "\u547D\u4EE4\u6309\u94AE\uFF08\u65B0\u4F1A\u8BDD/\u72B6\u6001/\u8BCA\u65AD\u2026\uFF09",
|
|
113
|
+
"\u79C1\u804A": "\u79C1\u804A",
|
|
114
|
+
"\u79FB\u9664": "\u79FB\u9664",
|
|
115
|
+
"\u7FA4\u804A": "\u7FA4\u804A",
|
|
116
|
+
"\u8BBE\u4E3A\u5C5E\u4E3B": "\u8BBE\u4E3A\u5C5E\u4E3B",
|
|
117
|
+
"\u8BBF\u95EE\u6A21\u5F0F": "\u8BBF\u95EE\u6A21\u5F0F",
|
|
118
|
+
"\u8BBF\u95EE\u7B56\u7565": "\u8BBF\u95EE\u7B56\u7565",
|
|
119
|
+
"\u8C01\u80FD\u8DDF\u673A\u5668\u4EBA\u8BF4\u8BDD\u3001\u8C01\u80FD\u6267\u884C\u547D\u4EE4\u3002\u6539\u52A8\u7ACB\u5373\u751F\u6548\uFF1B\u5C5E\u4E3B\u59CB\u7EC8\u53EF\u7528\u3002": "\u8C01\u80FD\u8DDF\u673A\u5668\u4EBA\u8BF4\u8BDD\u3001\u8C01\u80FD\u6267\u884C\u547D\u4EE4\u3002\u6539\u52A8\u7ACB\u5373\u751F\u6548\uFF1B\u5C5E\u4E3B\u59CB\u7EC8\u53EF\u7528\u3002",
|
|
120
|
+
"\u8DDF\u968F Host \u9ED8\u8BA4": "\u8DDF\u968F Host \u9ED8\u8BA4",
|
|
121
|
+
"\u8FD9\u4E2A\u673A\u5668\u4EBA\u7528\u54EA\u5957 Agent \u9884\u8BBE\uFF08\u4EBA\u8BBE\u4E0E\u5DE5\u5177\u96C6\uFF09\u3002\u53EA\u5BF9\u65B0\u5EFA\u4F1A\u8BDD\u751F\u6548\u3002": "\u8FD9\u4E2A\u673A\u5668\u4EBA\u7528\u54EA\u5957 Agent \u9884\u8BBE\uFF08\u4EBA\u8BBE\u4E0E\u5DE5\u5177\u96C6\uFF09\u3002\u53EA\u5BF9\u65B0\u5EFA\u4F1A\u8BDD\u751F\u6548\u3002",
|
|
122
|
+
"\u98DE\u4E66": "\u98DE\u4E66",
|
|
123
|
+
"\u627E\u4E0D\u5230\u8FD9\u53F0\u673A\u5668\u4EBA": "\u627E\u4E0D\u5230\u8FD9\u53F0\u673A\u5668\u4EBA",
|
|
124
|
+
"\u5B83\u4E0D\u5728\u5F53\u524D\u6E20\u9053\u7684\u540D\u5355\u91CC\uFF08\u53EF\u80FD\u5DF2\u88AB\u79FB\u9664\uFF0C\u6216 Host \u4E0E\u9875\u9762\u7248\u672C\u4E0D\u4E00\u81F4\uFF09": "\u5B83\u4E0D\u5728\u5F53\u524D\u6E20\u9053\u7684\u540D\u5355\u91CC\uFF08\u53EF\u80FD\u5DF2\u88AB\u79FB\u9664\uFF0C\u6216 Host \u4E0E\u9875\u9762\u7248\u672C\u4E0D\u4E00\u81F4\uFF09",
|
|
125
|
+
"\u98DE\u4E66\u6E20\u9053": "\u98DE\u4E66\u6E20\u9053",
|
|
126
|
+
"\u5DF2\u63A5\u5165\u7684\u673A\u5668\u4EBA": "\u5DF2\u63A5\u5165\u7684\u673A\u5668\u4EBA",
|
|
127
|
+
"\u8BFB\u53D6\u72B6\u6001": "\u8BFB\u53D6\u72B6\u6001",
|
|
128
|
+
"\u8BFB\u53D6\u4E2D\u2026": "\u8BFB\u53D6\u4E2D\u2026",
|
|
129
|
+
"\u91CD\u65B0\u8FDE\u63A5": "\u91CD\u65B0\u8FDE\u63A5",
|
|
130
|
+
"\u79FB\u9664\u63A5\u5165": "\u79FB\u9664\u63A5\u5165",
|
|
131
|
+
"\u786E\u8BA4\u79FB\u9664": "\u786E\u8BA4\u79FB\u9664",
|
|
132
|
+
"\u53D6\u6D88": "\u53D6\u6D88",
|
|
133
|
+
"\u4EFB\u52A1\u8FC7\u7A0B\u5C55\u793A": "\u4EFB\u52A1\u8FC7\u7A0B\u5C55\u793A",
|
|
134
|
+
"\u8BBE\u7F6E\u6267\u884C\u8FC7\u7A0B\u7684\u5448\u73B0\u65B9\u5F0F\uFF1B\u79C1\u804A\u4E0E\u7FA4\u804A\u5206\u522B\u751F\u6548": "\u8BBE\u7F6E\u6267\u884C\u8FC7\u7A0B\u7684\u5448\u73B0\u65B9\u5F0F\uFF1B\u79C1\u804A\u4E0E\u7FA4\u804A\u5206\u522B\u751F\u6548",
|
|
135
|
+
"\u4E0D\u663E\u793A\u8FC7\u7A0B\uFF08\u53EA\u53D1\u9001\u6700\u7EC8\u7B54\u6848\uFF09": "\u4E0D\u663E\u793A\u8FC7\u7A0B\uFF08\u53EA\u53D1\u9001\u6700\u7EC8\u7B54\u6848\uFF09",
|
|
136
|
+
"\u9002\u5408\u65E5\u5E38\u95EE\u7B54\uFF1A\u4E0D\u663E\u793A\u5DE5\u5177\u8C03\u7528\u7B49\u4E2D\u95F4\u6B65\u9AA4\uFF0C\u6700\u7EC8\u7B54\u6848\u4ECD\u7528\u4E00\u5F20\u5361\u7247\u56DE\u590D\uFF0C\u8868\u683C\u4E0E\u4EE3\u7801\u5757\u4FDD\u7559\u683C\u5F0F": "\u9002\u5408\u65E5\u5E38\u95EE\u7B54\uFF1A\u4E0D\u663E\u793A\u5DE5\u5177\u8C03\u7528\u7B49\u4E2D\u95F4\u6B65\u9AA4\uFF0C\u6700\u7EC8\u7B54\u6848\u4ECD\u7528\u4E00\u5F20\u5361\u7247\u56DE\u590D\uFF0C\u8868\u683C\u4E0E\u4EE3\u7801\u5757\u4FDD\u7559\u683C\u5F0F",
|
|
137
|
+
"\u5B9E\u65F6\u8FC7\u7A0B\u5361\uFF08\u5168\u7A0B\u4E00\u5F20\u5361\u7247\u52A8\u6001\u66F4\u65B0\uFF09": "\u5B9E\u65F6\u8FC7\u7A0B\u5361\uFF08\u5168\u7A0B\u4E00\u5F20\u5361\u7247\u52A8\u6001\u66F4\u65B0\uFF09",
|
|
138
|
+
"\u63A8\u8350\u957F\u4EFB\u52A1\u4F7F\u7528\uFF1A\u8FC7\u7A0B\u4E0E\u6700\u7EC8\u7B54\u6848\u90FD\u5728\u540C\u4E00\u5F20\u5361\u7247\u91CC\u5B9E\u65F6\u66F4\u65B0\uFF0C\u4E0D\u5237\u5C4F": "\u63A8\u8350\u957F\u4EFB\u52A1\u4F7F\u7528\uFF1A\u8FC7\u7A0B\u4E0E\u6700\u7EC8\u7B54\u6848\u90FD\u5728\u540C\u4E00\u5F20\u5361\u7247\u91CC\u5B9E\u65F6\u66F4\u65B0\uFF0C\u4E0D\u5237\u5C4F",
|
|
139
|
+
"\u9010\u6B65\u76F4\u64AD\uFF08\u6BCF\u4E00\u6B65\u5355\u72EC\u53D1\u4E00\u6761\u6D88\u606F\uFF09": "\u9010\u6B65\u76F4\u64AD\uFF08\u6BCF\u4E00\u6B65\u5355\u72EC\u53D1\u4E00\u6761\u6D88\u606F\uFF09",
|
|
140
|
+
"\u6BCF\u4E00\u6B65\u90FD\u5355\u72EC\u53D1\u4E00\u6761\u6D88\u606F\uFF08\u542B\u5DE5\u5177\u8C03\u7528\uFF09\uFF1B\u957F\u4EFB\u52A1\u4F1A\u8FDE\u7EED\u53D1\u9001\u8F83\u591A\u6D88\u606F": "\u6BCF\u4E00\u6B65\u90FD\u5355\u72EC\u53D1\u4E00\u6761\u6D88\u606F\uFF08\u542B\u5DE5\u5177\u8C03\u7528\uFF09\uFF1B\u957F\u4EFB\u52A1\u4F1A\u8FDE\u7EED\u53D1\u9001\u8F83\u591A\u6D88\u606F",
|
|
141
|
+
"lark-cli \u8EAB\u4EFD": "lark-cli \u8EAB\u4EFD",
|
|
142
|
+
"\u8FD9\u53F0\u673A\u5668\u4EBA\u8C03 lark-cli \u65F6\u7528\u54EA\u4E2A\u8EAB\u4EFD\uFF1B\u98DE\u4E66\u6E20\u9053\u7684\u6536\u53D1\u4ECD\u8D70\u5B98\u65B9 SDK": "\u8FD9\u53F0\u673A\u5668\u4EBA\u8C03 lark-cli \u65F6\u7528\u54EA\u4E2A\u8EAB\u4EFD\uFF1B\u98DE\u4E66\u6E20\u9053\u7684\u6536\u53D1\u4ECD\u8D70\u5B98\u65B9 SDK",
|
|
143
|
+
"\u8C03\u7528\u8EAB\u4EFD": "\u8C03\u7528\u8EAB\u4EFD",
|
|
144
|
+
"\u53EA\u7528\u5E94\u7528\u8EAB\u4EFD\uFF08bot\uFF09": "\u53EA\u7528\u5E94\u7528\u8EAB\u4EFD\uFF08bot\uFF09",
|
|
145
|
+
"\u5141\u8BB8\u7528\u6237\u8EAB\u4EFD\uFF08--as user\uFF09": "\u5141\u8BB8\u7528\u6237\u8EAB\u4EFD\uFF08--as user\uFF09",
|
|
146
|
+
"\u4EE5\u5E94\u7528\u81EA\u5DF1\u7684\u8EAB\u4EFD\u8C03 lark-cli\uFF0C\u53EA\u80FD\u8BBF\u95EE\u8FD9\u53F0\u673A\u5668\u4EBA\u81EA\u5DF1\u7684\u8D44\u6E90": "\u4EE5\u5E94\u7528\u81EA\u5DF1\u7684\u8EAB\u4EFD\u8C03 lark-cli\uFF0C\u53EA\u80FD\u8BBF\u95EE\u8FD9\u53F0\u673A\u5668\u4EBA\u81EA\u5DF1\u7684\u8D44\u6E90",
|
|
147
|
+
"\u4EE5\u67D0\u4E2A\u4EBA\u7684\u540D\u4E49\u8C03 lark-cli\uFF08\u80FD\u8BFB\u5199\u4ED6\u7684\u4E91\u6587\u6863\u3001\u65E5\u5386\u7B49\u4E2A\u4EBA\u8D44\u6E90\uFF09\uFF1B\u5F00\u542F\u524D\u9700\u8981\u786E\u8BA4\uFF0C\u5E76\u4F1A\u9489\u4F4F\u5F53\u524D\u767B\u5F55\u7684\u4EBA": "\u4EE5\u67D0\u4E2A\u4EBA\u7684\u540D\u4E49\u8C03 lark-cli\uFF08\u80FD\u8BFB\u5199\u4ED6\u7684\u4E91\u6587\u6863\u3001\u65E5\u5386\u7B49\u4E2A\u4EBA\u8D44\u6E90\uFF09\uFF1B\u5F00\u542F\u524D\u9700\u8981\u786E\u8BA4\uFF0C\u5E76\u4F1A\u9489\u4F4F\u5F53\u524D\u767B\u5F55\u7684\u4EBA",
|
|
148
|
+
"lark-cli \u91CC\u7684 profile": "lark-cli \u91CC\u7684 profile",
|
|
149
|
+
"lark-cli \u91CC\u8FD8\u6CA1\u6709\u8FD9\u53F0\u673A\u5668\u4EBA\u7684 profile\uFF08\u771F\u6B63\u8C03\u7528\u65F6\u4F1A\u81EA\u52A8\u521B\u5EFA\uFF09": "lark-cli \u91CC\u8FD8\u6CA1\u6709\u8FD9\u53F0\u673A\u5668\u4EBA\u7684 profile\uFF08\u771F\u6B63\u8C03\u7528\u65F6\u4F1A\u81EA\u52A8\u521B\u5EFA\uFF09",
|
|
150
|
+
"\u8BFB\u53D6 lark-cli \u72B6\u6001\u5931\u8D25\uFF1A": "\u8BFB\u53D6 lark-cli \u72B6\u6001\u5931\u8D25\uFF1A",
|
|
151
|
+
"\u5E94\u7528\u8EAB\u4EFD\uFF1A": "\u5E94\u7528\u8EAB\u4EFD\uFF1A",
|
|
152
|
+
"\u7528\u6237\u8EAB\u4EFD\uFF1A": "\u7528\u6237\u8EAB\u4EFD\uFF1A",
|
|
153
|
+
"\u53EF\u7528": "\u53EF\u7528",
|
|
154
|
+
"\u4E0D\u53EF\u7528": "\u4E0D\u53EF\u7528",
|
|
155
|
+
"\u767B\u5F55\u4EBA\uFF1A": "\u767B\u5F55\u4EBA\uFF1A",
|
|
156
|
+
"\u6CA1\u6709\u7528\u6237\u767B\u5F55": "\u6CA1\u6709\u7528\u6237\u767B\u5F55",
|
|
157
|
+
"\u786E\u8BA4\u5F00\u542F": "\u786E\u8BA4\u5F00\u542F",
|
|
158
|
+
"\u5DF2\u53D6\u6D88\uFF0C\u672A\u505A\u4EFB\u4F55\u6539\u52A8\u3002": "\u5DF2\u53D6\u6D88\uFF0C\u672A\u505A\u4EFB\u4F55\u6539\u52A8\u3002",
|
|
159
|
+
"\u5DF2\u4FDD\u5B58\u3002": "\u5DF2\u4FDD\u5B58\u3002",
|
|
160
|
+
"\u91CD\u8BFB lark-cli \u72B6\u6001": "\u91CD\u8BFB lark-cli \u72B6\u6001",
|
|
161
|
+
"\u5DF2\u5904\u7406\u6D88\u606F": "\u5DF2\u5904\u7406\u6D88\u606F",
|
|
162
|
+
"\u6CA1\u6709\u5DF2\u63A5\u5165\u7684\u98DE\u4E66\u673A\u5668\u4EBA": "\u6CA1\u6709\u5DF2\u63A5\u5165\u7684\u98DE\u4E66\u673A\u5668\u4EBA",
|
|
163
|
+
"\u672C\u673A\u8FD8\u6CA1\u6709\u98DE\u4E66\u673A\u5668\u4EBA\u914D\u7F6E\u3002": "\u672C\u673A\u8FD8\u6CA1\u6709\u98DE\u4E66\u673A\u5668\u4EBA\u914D\u7F6E\u3002",
|
|
164
|
+
"\u72B6\u6001": "\u72B6\u6001",
|
|
165
|
+
"\u542F\u52A8\u4E2D": "\u542F\u52A8\u4E2D",
|
|
166
|
+
"\u8FD0\u884C\u6B63\u5E38": "\u8FD0\u884C\u6B63\u5E38",
|
|
167
|
+
"\u542F\u52A8\u5931\u8D25": "\u542F\u52A8\u5931\u8D25",
|
|
168
|
+
"\u5DF2\u505C\u6B62": "\u5DF2\u505C\u6B62",
|
|
169
|
+
"\u6B63\u5728\u8FD0\u884C": "\u6B63\u5728\u8FD0\u884C",
|
|
170
|
+
// hub 的共享组件(上下文增强编辑器)用本渠道的 t 取文案,因此这些键必须在渠道字典里。
|
|
171
|
+
"\u4FDD\u5B58": "\u4FDD\u5B58",
|
|
172
|
+
"\u4FDD\u5B58\u4E2D\u2026": "\u4FDD\u5B58\u4E2D\u2026",
|
|
173
|
+
"\u65B0\u5EFA\u673A\u5668\u4EBA\u63A5\u5165": "\u65B0\u5EFA\u673A\u5668\u4EBA\u63A5\u5165",
|
|
174
|
+
"\u4E24\u79CD\u65B9\u5F0F\uFF1A\u626B\u7801\u65B0\u5EFA\u4E00\u4E2A\u98DE\u4E66\u673A\u5668\u4EBA\uFF08\u63A8\u8350\uFF0C\u626B\u7801\u7684\u4EBA\u5C31\u662F\u5C5E\u4E3B\uFF09\uFF0C\u6216\u624B\u52A8\u586B\u5DF2\u6709\u673A\u5668\u4EBA\u7684\u51ED\u636E\u3002": "\u4E24\u79CD\u65B9\u5F0F\uFF1A\u626B\u7801\u65B0\u5EFA\u4E00\u4E2A\u98DE\u4E66\u673A\u5668\u4EBA\uFF08\u63A8\u8350\uFF0C\u626B\u7801\u7684\u4EBA\u5C31\u662F\u5C5E\u4E3B\uFF09\uFF0C\u6216\u624B\u52A8\u586B\u5DF2\u6709\u673A\u5668\u4EBA\u7684\u51ED\u636E\u3002",
|
|
175
|
+
"\u626B\u7801\u65B0\u5EFA\u673A\u5668\u4EBA": "\u626B\u7801\u65B0\u5EFA\u673A\u5668\u4EBA",
|
|
176
|
+
"\u70B9\u4E0B\u9762\u7684\u6309\u94AE\u4F1A\u5411\u98DE\u4E66\u7533\u8BF7\u4E00\u4E2A\u4E00\u6B21\u6027\u6388\u6743\u94FE\u63A5\uFF1A\u7528\u98DE\u4E66\u626B\u4E00\u626B\uFF0C\u6216\u5728\u6D4F\u89C8\u5668\u91CC\u6253\u5F00\u5B83\uFF0C\u5C31\u4F1A\u81EA\u52A8\u521B\u5EFA\u5E94\u7528\u5E76\u63A5\u5165\u3002": "\u70B9\u4E0B\u9762\u7684\u6309\u94AE\u4F1A\u5411\u98DE\u4E66\u7533\u8BF7\u4E00\u4E2A\u4E00\u6B21\u6027\u6388\u6743\u94FE\u63A5\uFF1A\u7528\u98DE\u4E66\u626B\u4E00\u626B\uFF0C\u6216\u5728\u6D4F\u89C8\u5668\u91CC\u6253\u5F00\u5B83\uFF0C\u5C31\u4F1A\u81EA\u52A8\u521B\u5EFA\u5E94\u7528\u5E76\u63A5\u5165\u3002",
|
|
177
|
+
"\u624B\u52A8\u63A5\u5165\u5DF2\u6709\u673A\u5668\u4EBA": "\u624B\u52A8\u63A5\u5165\u5DF2\u6709\u673A\u5668\u4EBA",
|
|
178
|
+
"\u6253\u5F00\u6388\u6743\u9875\u9762": "\u6253\u5F00\u6388\u6743\u9875\u9762",
|
|
179
|
+
"\u8FD9\u53F0 Host \u6CA1\u80FD\u751F\u6210\u4E8C\u7EF4\u7801\uFF0C\u8BF7\u70B9\u4E0A\u9762\u7684\u94FE\u63A5\u7EE7\u7EED\u3002": "\u8FD9\u53F0 Host \u6CA1\u80FD\u751F\u6210\u4E8C\u7EF4\u7801\uFF0C\u8BF7\u70B9\u4E0A\u9762\u7684\u94FE\u63A5\u7EE7\u7EED\u3002",
|
|
180
|
+
"\u5269\u4F59": "\u5269\u4F59",
|
|
181
|
+
"\u6B63\u5728\u5411\u98DE\u4E66\u7533\u8BF7\u4E8C\u7EF4\u7801\u2026": "\u6B63\u5728\u5411\u98DE\u4E66\u7533\u8BF7\u4E8C\u7EF4\u7801\u2026",
|
|
182
|
+
"\u5DF2\u6388\u6743\uFF0C\u6B63\u5728\u542F\u52A8\u673A\u5668\u4EBA\u2026": "\u5DF2\u6388\u6743\uFF0C\u6B63\u5728\u542F\u52A8\u673A\u5668\u4EBA\u2026",
|
|
183
|
+
"\u7B49\u5F85\u626B\u7801": "\u7B49\u5F85\u626B\u7801",
|
|
184
|
+
"\u7B49\u5F85\u4F60\u5728\u98DE\u4E66\u91CC\u786E\u8BA4\u2026": "\u7B49\u5F85\u4F60\u5728\u98DE\u4E66\u91CC\u786E\u8BA4\u2026",
|
|
185
|
+
"\u4E8C\u7EF4\u7801\u5DF2\u5931\u6548\uFF0C\u8BF7\u91CD\u65B0\u751F\u6210": "\u4E8C\u7EF4\u7801\u5DF2\u5931\u6548\uFF0C\u8BF7\u91CD\u65B0\u751F\u6210",
|
|
186
|
+
"\u626B\u7801\u63A5\u5165\u5931\u8D25": "\u626B\u7801\u63A5\u5165\u5931\u8D25",
|
|
187
|
+
"\u5DF2\u53D6\u6D88": "\u5DF2\u53D6\u6D88",
|
|
188
|
+
"\u91CD\u65B0\u751F\u6210\u4E8C\u7EF4\u7801": "\u91CD\u65B0\u751F\u6210\u4E8C\u7EF4\u7801",
|
|
189
|
+
"\u586B\u81EA\u5EFA\u5E94\u7528\u7684 App ID \u4E0E App Secret\uFF08\u98DE\u4E66\u5F00\u653E\u5E73\u53F0 \u2192 \u51ED\u8BC1\u4E0E\u57FA\u7840\u4FE1\u606F\uFF09\u3002\u5E94\u7528\u9700\u8981\u5F00\u542F\u673A\u5668\u4EBA\u80FD\u529B\u3002": "\u586B\u81EA\u5EFA\u5E94\u7528\u7684 App ID \u4E0E App Secret\uFF08\u98DE\u4E66\u5F00\u653E\u5E73\u53F0 \u2192 \u51ED\u8BC1\u4E0E\u57FA\u7840\u4FE1\u606F\uFF09\u3002\u5E94\u7528\u9700\u8981\u5F00\u542F\u673A\u5668\u4EBA\u80FD\u529B\u3002",
|
|
190
|
+
"\u5E94\u7528\u51ED\u8BC1\u91CC\u7684 App Secret": "\u5E94\u7528\u51ED\u8BC1\u91CC\u7684 App Secret",
|
|
191
|
+
"\u57DF\u540D": "\u57DF\u540D",
|
|
192
|
+
"\u98DE\u4E66\uFF08open.feishu.cn\uFF09": "\u98DE\u4E66\uFF08open.feishu.cn\uFF09",
|
|
193
|
+
"Lark\uFF08open.larksuite.com\uFF09": "Lark\uFF08open.larksuite.com\uFF09",
|
|
194
|
+
"\u5C5E\u4E3B open_id\uFF08\u53EF\u7559\u7A7A\uFF09": "\u5C5E\u4E3B open_id\uFF08\u53EF\u7559\u7A7A\uFF09",
|
|
195
|
+
"\u5C5E\u4E3B\u7559\u7A7A = \u8FD9\u53F0\u673A\u5668\u4EBA\u6682\u65F6\u6CA1\u6709\u5C5E\u4E3B\uFF1A\u63A5\u5165\u540E\u79C1\u804A\u4F1A\u88AB\u8BBE\u4E3A\u300C\u4EFB\u4F55\u4EBA\u53EF\u7528\u300D\uFF0C\u5C5E\u4E3B\u5148\u8DDF\u5B83\u8BF4\u4E00\u53E5\u8BDD\uFF0C\u518D\u56DE\u5B83\u7684\u8BBE\u7F6E\u91CC\u628A\u81EA\u5DF1\u9009\u6210\u5C5E\u4E3B\u3002": "\u5C5E\u4E3B\u7559\u7A7A = \u8FD9\u53F0\u673A\u5668\u4EBA\u6682\u65F6\u6CA1\u6709\u5C5E\u4E3B\uFF1A\u63A5\u5165\u540E\u79C1\u804A\u4F1A\u88AB\u8BBE\u4E3A\u300C\u4EFB\u4F55\u4EBA\u53EF\u7528\u300D\uFF0C\u5C5E\u4E3B\u5148\u8DDF\u5B83\u8BF4\u4E00\u53E5\u8BDD\uFF0C\u518D\u56DE\u5B83\u7684\u8BBE\u7F6E\u91CC\u628A\u81EA\u5DF1\u9009\u6210\u5C5E\u4E3B\u3002",
|
|
196
|
+
"\u63A5\u5165": "\u63A5\u5165",
|
|
197
|
+
"\u63A5\u5165\u4E2D\u2026": "\u63A5\u5165\u4E2D\u2026",
|
|
198
|
+
"\u79C1\u804A\u8BBF\u95EE\u7B56\u7565\u6CA1\u80FD\u81EA\u52A8\u653E\u5BBD": "\u79C1\u804A\u8BBF\u95EE\u7B56\u7565\u6CA1\u80FD\u81EA\u52A8\u653E\u5BBD",
|
|
199
|
+
"\u5DF2\u63A5\u5165": "\u5DF2\u63A5\u5165",
|
|
200
|
+
"\u70B9\u5DE6\u4E0A\u89D2\u300C\u8FD4\u56DE\u300D\u5C31\u80FD\u5728\u5217\u8868\u91CC\u770B\u5230\u5B83\u3002": "\u70B9\u5DE6\u4E0A\u89D2\u300C\u8FD4\u56DE\u300D\u5C31\u80FD\u5728\u5217\u8868\u91CC\u770B\u5230\u5B83\u3002",
|
|
201
|
+
"\u4FDD\u5B58\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5\u3002": "\u4FDD\u5B58\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5\u3002",
|
|
202
|
+
"\u6700\u8FD1\u4E00\u6B21\u9519\u8BEF": "\u6700\u8FD1\u4E00\u6B21\u9519\u8BEF"
|
|
203
|
+
};
|
|
204
|
+
var en = {
|
|
205
|
+
"\u663E\u793A\u9879": "Section",
|
|
206
|
+
"\u63A7\u5236\u9762\u677F\u663E\u793A\u9879": "Control panel sections",
|
|
207
|
+
"\u53EA\u5F71\u54CD /menu \u53D1\u51FA\u6765\u7684\u90A3\u5F20\u5361\u7247\uFF1A\u5173\u6389\u7684\u9879\u4E0D\u663E\u793A\uFF0C\u529F\u80FD\u7167\u65E7\uFF08\u79C1\u804A\u4E0E\u7FA4\u804A\u5206\u522B\u8BBE\u7F6E\uFF09\u3002": "Only affects the card sent by /menu: hidden items are not drawn, everything keeps working (direct and group are configured separately).",
|
|
208
|
+
"\u6A21\u578B\u4E0E\u63A8\u7406\u7B49\u7EA7": "Model & reasoning",
|
|
209
|
+
"\u4F1A\u8BDD": "Session",
|
|
210
|
+
"Agent \u9884\u8BBE\u4E0E\u5DE5\u4F5C\u533A": "Agent preset & workspace",
|
|
211
|
+
"\u4E0A\u4E0B\u6587\u589E\u5F3A\uFF08\u672C\u4F1A\u8BDD\uFF09": "Context enhancement (this chat)",
|
|
212
|
+
"\u8BBF\u95EE\u7B56\u7565\uFF08\u672C\u4F1A\u8BDD\uFF09": "Access policy (this chat)",
|
|
213
|
+
"\u6E20\u9053\u8BBE\u7F6E\uFF08\u4EFB\u52A1\u8FC7\u7A0B\u5C55\u793A\u7B49\uFF09": "Channel settings (step display etc.)",
|
|
214
|
+
"\u6E20\u9053\u52A8\u4F5C\u6309\u94AE\uFF08\u91CD\u8FDE\u7B49\uFF09": "Channel actions (reconnect etc.)",
|
|
215
|
+
"\u547D\u4EE4\u6309\u94AE\uFF08\u65B0\u4F1A\u8BDD/\u72B6\u6001/\u8BCA\u65AD\u2026\uFF09": "Command buttons (new session/status/diagnostics\u2026)",
|
|
216
|
+
"\u5173\u95ED": "Close",
|
|
217
|
+
"\u5220\u9664": "Delete",
|
|
218
|
+
"\u542F\u7528": "Enabled",
|
|
219
|
+
"\u586B\u5165\u793A\u4F8B": "Fill with example",
|
|
220
|
+
"\u5907\u6CE8\u540D\uFF08\u53EF\u9009\uFF09": "Display name (optional)",
|
|
221
|
+
"\u5F20\u4E09": "Alice",
|
|
222
|
+
"\u65B0\u589E": "Add",
|
|
223
|
+
"\u6765\u6E90\u5B57\u6BB5": "Source fields",
|
|
224
|
+
"\u6E05\u7A7A": "Clear",
|
|
225
|
+
"\u8FD8\u6CA1\u6709\u6307\u5B9A\u8BBE\u7F6E\u3002": "Nothing configured yet.",
|
|
226
|
+
"\u4E0A\u4E0B\u6587\u589E\u5F3A": "Context enhancement",
|
|
227
|
+
"\u4E0A\u4E0B\u6587\u589E\u5F3A\u8303\u56F4": "Context enhancement scope",
|
|
228
|
+
"\u53E0\u52A0\u5168\u5C40\u63D0\u793A\u8BCD\uFF08\u4E0D\u52FE\u9009\u5219\u53EA\u4F7F\u7528\u4E0A\u9762\u7684\u4E13\u5C5E\u63D0\u793A\u8BCD\uFF09": "Also stack the global prompt (unchecked: use only the prompt above)",
|
|
229
|
+
"\u544A\u8BC9\u6A21\u578B\u5982\u4F55\u4F7F\u7528\u6765\u6E90\u5B57\u6BB5\u3002\u53EA\u586B\u6B63\u6587\uFF0C\u63D2\u4EF6\u4F1A\u81EA\u52A8\u5305\u6210\u6765\u6E90\u589E\u5F3A\u5757\u3002": "Tell the model how to use the source fields. Write the body only \u2014 the plugin wraps it into a source block.",
|
|
230
|
+
"\u589E\u5F3A\u63D0\u793A\u8BCD": "Prepended prompt",
|
|
231
|
+
"\u6765\u6E90\u5B57\u6BB5\u53EA\u5728\u5F53\u524D\u6D88\u606F\u5DF2\u63D0\u4F9B\u65F6\u624D\u4F1A\u53D1\u9001\uFF0C\u4E0D\u4F1A\u989D\u5916\u67E5\u8BE2\u5E73\u53F0\u63A5\u53E3\u3002": "Source fields are sent only when the incoming message already carries them; no extra platform calls are made.",
|
|
232
|
+
"\u4ECE\u4F1A\u8BDD\u91CC\u9009\u2026": "Pick a conversation\u2026",
|
|
233
|
+
"\u53BB\u5F00\u901A\u6743\u9650": "Grant the permission",
|
|
234
|
+
"\u5C5E\u4E3B\u540D\u5355\u662F *\uFF08\u8FD9\u53F0\u673A\u5668\u4EBA\u6CA1\u6709\u5C5E\u4E3B\u7ED5\u8FC7\uFF09\uFF1A\u80FD\u7528\u5B83\u7684\u4EBA\u5B8C\u5168\u7531\u4E0B\u9762\u7684\u300C\u8BBF\u95EE\u7B56\u7565\u300D\u51B3\u5B9A\u3002": "The owner list is * (this bot has no owner bypass): who may use it is decided entirely by the access policy below.",
|
|
235
|
+
"Agent \u9884\u8BBE": "Agent preset",
|
|
236
|
+
"\u6A21\u578B": "Model",
|
|
237
|
+
"\u9ED8\u8BA4\u6A21\u578B": "Default model",
|
|
238
|
+
"\u63A8\u7406\u7B49\u7EA7": "Reasoning effort",
|
|
239
|
+
"\u8FD9\u4E2A\u6A21\u578B\u6CA1\u6709\u53EF\u9009\u7684\u63A8\u7406\u7B49\u7EA7\u3002": "This model has no reasoning efforts to choose from.",
|
|
240
|
+
"\u5148\u9009\u4E00\u4E2A\u6A21\u578B\u3002": "Pick a model first.",
|
|
241
|
+
"\u6A21\u578B\u9ED8\u8BA4": "Model default",
|
|
242
|
+
"\u90E8\u5206 provider \u8BFB\u53D6\u5931\u8D25\uFF1A": "Some providers failed to load: ",
|
|
243
|
+
"\u5F53\u524D Host \u8BFB\u4E0D\u5230\u6A21\u578B\u76EE\u5F55\u3002": "The model catalog is unavailable right now.",
|
|
244
|
+
"\u8FD8\u6CA1\u6709\u4F1A\u8BDD\u65F6\u7528\u54EA\u4E2A\u6A21\u578B\uFF1A\u9009\u5B8C\u5BF9\u4E0B\u4E00\u6761\u6D88\u606F\u65B0\u5EFA\u7684\u4F1A\u8BDD\u751F\u6548\u3002\u4F1A\u8BDD\u5185\u8FD8\u80FD\u5355\u72EC\u6539\uFF08\u9762\u677F\u7684\u6A21\u578B\u4E0B\u62C9\uFF09\u3002": "Model used before a conversation exists; it applies to the session created by your next message. You can still change it per conversation from the panel.",
|
|
245
|
+
"\u4E0B\u62C9\u91CC\u662F\u8FD9\u53F0\u673A\u5668\u4EBA\u7528\u8FC7\u7684\u76EE\u5F55\u3002": "The suggestions are directories this bot has used before.",
|
|
246
|
+
"\u4EC5\u540D\u5355\u5185\u53EF\u7528": "Allowlist only",
|
|
247
|
+
"\u4ECE\u4F1A\u8BDD\u91CC\u9009\u4E00\u4E2A\u4EBA\u8BBE\u4E3A\u5C5E\u4E3B": "Pick a person from a conversation to make them the owner",
|
|
248
|
+
"\u4EFB\u4F55\u4EBA\u53EF\u7528": "Anyone",
|
|
249
|
+
"\u5141\u8BB8\u6267\u884C\u547D\u4EE4": "Allow commands",
|
|
250
|
+
"\u53EF\u6267\u884C\u547D\u4EE4": "Allow commands",
|
|
251
|
+
"\u540D\u5355\u4E3A\u7A7A\u65F6\u53EA\u6709\u5C5E\u4E3B\u53EF\u7528\u3002": "An empty allowlist means only the owner can use it.",
|
|
252
|
+
"\u5BF9\u65B9\u7684\u5E73\u53F0 id\uFF0C\u56DE\u8F66\u6DFB\u52A0": "Their platform id \u2014 press Enter to add",
|
|
253
|
+
"\u8BFB\u4E0D\u5230\u540D\u5355\u91CC\u7684\u540D\u5B57": "Could not resolve names for the allowlist",
|
|
254
|
+
"\u5C5E\u4E3B": "Owner",
|
|
255
|
+
"\u5C5E\u4E3B\u4E0D\u9700\u8981\u8FDB\u767D\u540D\u5355\uFF1A\u6D88\u606F\u4E0E\u547D\u4EE4\u90FD\u76F4\u63A5\u653E\u884C\u3002\u8FD9\u91CC\u6539\u5B8C\u4F1A\u91CD\u8FDE\u4E00\u6B21\uFF0C\u7ACB\u523B\u751F\u6548\u3002": "An owner does not need to be on the allowlist: their messages and commands always pass. Saving reconnects this bot once so the change takes effect immediately.",
|
|
256
|
+
"\u5DE5\u4F5C\u533A": "Workspace",
|
|
257
|
+
"\u5F53\u524D Host \u8BFB\u4E0D\u5230 Agent Preset \u5217\u8868\u3002": "This Host does not expose an agent preset list.",
|
|
258
|
+
"\u5F53\u524D\u6CA1\u6709\u5C5E\u4E3B\uFF1A\u6CA1\u6709\u4EBA\u7ED5\u8FC7\u8BBF\u95EE\u7B56\u7565\uFF0C\u8C01\u80FD\u7528\u5B8C\u5168\u7531\u4E0B\u9762\u7684\u300C\u8BBF\u95EE\u7B56\u7565\u300D\u51B3\u5B9A\u3002": "No owner right now: nobody bypasses the access policy, so who may use this bot is decided entirely by the access policy below.",
|
|
259
|
+
"\u673A\u5668\u4EBA\u8DD1\u5728\u54EA\u4E2A\u76EE\u5F55\uFF1A\u80FD\u8BFB\u5199\u54EA\u4E9B\u6587\u4EF6\u3001\u7528\u54EA\u4EFD AGENTS.md\u3002\u53EA\u5BF9\u65B0\u5EFA\u4F1A\u8BDD\u751F\u6548\u3002": "Which directory the bot runs in: which files it may read and write, and which AGENTS.mdapplies. Applies to new conversations only.",
|
|
260
|
+
"\u6CA1\u6709\u53EF\u9009\u7684\u4F1A\u8BDD\uFF08\u5148\u548C\u673A\u5668\u4EBA\u804A\u4E00\u6B21\uFF09": "No conversation to pick yet (talk to the bot once first)",
|
|
261
|
+
"\u6DFB\u52A0": "Add",
|
|
262
|
+
"\u6E05\u7A7A\u540E\u6CA1\u6709\u4EBA\u7ED5\u8FC7\u8BBF\u95EE\u7B56\u7565": "After clearing, nobody bypasses the access policy",
|
|
263
|
+
"\u6E05\u7A7A\uFF08\u65E0\u5C5E\u4E3B\uFF09": "Clear (no owner)",
|
|
264
|
+
"\u76EE\u5F55": "Directory",
|
|
265
|
+
"\u79C1\u804A": "Direct",
|
|
266
|
+
"\u79FB\u9664": "Remove",
|
|
267
|
+
"\u7FA4\u804A": "Group",
|
|
268
|
+
"\u8BBE\u4E3A\u5C5E\u4E3B": "Make owner",
|
|
269
|
+
"\u8BBF\u95EE\u6A21\u5F0F": "Access mode",
|
|
270
|
+
"\u8BBF\u95EE\u7B56\u7565": "Access policy",
|
|
271
|
+
"\u8C01\u80FD\u8DDF\u673A\u5668\u4EBA\u8BF4\u8BDD\u3001\u8C01\u80FD\u6267\u884C\u547D\u4EE4\u3002\u6539\u52A8\u7ACB\u5373\u751F\u6548\uFF1B\u5C5E\u4E3B\u59CB\u7EC8\u53EF\u7528\u3002": "Who may talk to the bot and who may run commands. Changes apply immediately;the owner always has access.",
|
|
272
|
+
"\u8DDF\u968F Host \u9ED8\u8BA4": "Follow the Host default",
|
|
273
|
+
"\u8FD9\u4E2A\u673A\u5668\u4EBA\u7528\u54EA\u5957 Agent \u9884\u8BBE\uFF08\u4EBA\u8BBE\u4E0E\u5DE5\u5177\u96C6\uFF09\u3002\u53EA\u5BF9\u65B0\u5EFA\u4F1A\u8BDD\u751F\u6548\u3002": "Which agent preset this bot uses (persona and tool set). Applies to new conversations only.",
|
|
274
|
+
"\u98DE\u4E66": "Feishu",
|
|
275
|
+
"\u627E\u4E0D\u5230\u8FD9\u53F0\u673A\u5668\u4EBA": "Bot not found",
|
|
276
|
+
"\u5B83\u4E0D\u5728\u5F53\u524D\u6E20\u9053\u7684\u540D\u5355\u91CC\uFF08\u53EF\u80FD\u5DF2\u88AB\u79FB\u9664\uFF0C\u6216 Host \u4E0E\u9875\u9762\u7248\u672C\u4E0D\u4E00\u81F4\uFF09": "It is not in this channel's bot list (it may have been removed, or the Host and the page are on different versions)",
|
|
277
|
+
"\u98DE\u4E66\u6E20\u9053": "Feishu channel",
|
|
278
|
+
"\u5DF2\u63A5\u5165\u7684\u673A\u5668\u4EBA": "Connected bots",
|
|
279
|
+
"\u8BFB\u53D6\u72B6\u6001": "Reload",
|
|
280
|
+
"\u8BFB\u53D6\u4E2D\u2026": "Loading\u2026",
|
|
281
|
+
"\u91CD\u65B0\u8FDE\u63A5": "Reconnect",
|
|
282
|
+
"\u79FB\u9664\u63A5\u5165": "Remove",
|
|
283
|
+
"\u786E\u8BA4\u79FB\u9664": "Confirm removal",
|
|
284
|
+
"\u53D6\u6D88": "Cancel",
|
|
285
|
+
"\u4EFB\u52A1\u8FC7\u7A0B\u5C55\u793A": "Task progress display",
|
|
286
|
+
"\u8BBE\u7F6E\u6267\u884C\u8FC7\u7A0B\u7684\u5448\u73B0\u65B9\u5F0F\uFF1B\u79C1\u804A\u4E0E\u7FA4\u804A\u5206\u522B\u751F\u6548": "Choose how the execution is presented; direct and group chats are configured separately",
|
|
287
|
+
"\u4E0D\u663E\u793A\u8FC7\u7A0B\uFF08\u53EA\u53D1\u9001\u6700\u7EC8\u7B54\u6848\uFF09": "Hide the process (final answer only)",
|
|
288
|
+
"\u9002\u5408\u65E5\u5E38\u95EE\u7B54\uFF1A\u4E0D\u663E\u793A\u5DE5\u5177\u8C03\u7528\u7B49\u4E2D\u95F4\u6B65\u9AA4\uFF0C\u6700\u7EC8\u7B54\u6848\u4ECD\u7528\u4E00\u5F20\u5361\u7247\u56DE\u590D\uFF0C\u8868\u683C\u4E0E\u4EE3\u7801\u5757\u4FDD\u7559\u683C\u5F0F": "For everyday Q&A: interim steps stay hidden; the final answer still arrives as a card, keeping tables and code blocks formatted",
|
|
289
|
+
"\u5B9E\u65F6\u8FC7\u7A0B\u5361\uFF08\u5168\u7A0B\u4E00\u5F20\u5361\u7247\u52A8\u6001\u66F4\u65B0\uFF09": "Live process card (one card updated throughout)",
|
|
290
|
+
"\u63A8\u8350\u957F\u4EFB\u52A1\u4F7F\u7528\uFF1A\u8FC7\u7A0B\u4E0E\u6700\u7EC8\u7B54\u6848\u90FD\u5728\u540C\u4E00\u5F20\u5361\u7247\u91CC\u5B9E\u65F6\u66F4\u65B0\uFF0C\u4E0D\u5237\u5C4F": "Recommended for long tasks: process and answer update in one card without flooding the chat",
|
|
291
|
+
"\u9010\u6B65\u76F4\u64AD\uFF08\u6BCF\u4E00\u6B65\u5355\u72EC\u53D1\u4E00\u6761\u6D88\u606F\uFF09": "Step-by-step feed (one message per step)",
|
|
292
|
+
"\u6BCF\u4E00\u6B65\u90FD\u5355\u72EC\u53D1\u4E00\u6761\u6D88\u606F\uFF08\u542B\u5DE5\u5177\u8C03\u7528\uFF09\uFF1B\u957F\u4EFB\u52A1\u4F1A\u8FDE\u7EED\u53D1\u9001\u8F83\u591A\u6D88\u606F": "Every step is its own message; long tasks send many messages",
|
|
293
|
+
"lark-cli \u8EAB\u4EFD": "lark-cli identity",
|
|
294
|
+
"\u8FD9\u53F0\u673A\u5668\u4EBA\u8C03 lark-cli \u65F6\u7528\u54EA\u4E2A\u8EAB\u4EFD\uFF1B\u98DE\u4E66\u6E20\u9053\u7684\u6536\u53D1\u4ECD\u8D70\u5B98\u65B9 SDK": "Which identity this bot uses when calling lark-cli; message send/receive still goes through the official SDK",
|
|
295
|
+
"\u8C03\u7528\u8EAB\u4EFD": "Identity",
|
|
296
|
+
"\u53EA\u7528\u5E94\u7528\u8EAB\u4EFD\uFF08bot\uFF09": "Application identity only (bot)",
|
|
297
|
+
"\u5141\u8BB8\u7528\u6237\u8EAB\u4EFD\uFF08--as user\uFF09": "Allow user identity (--as user)",
|
|
298
|
+
"\u4EE5\u5E94\u7528\u81EA\u5DF1\u7684\u8EAB\u4EFD\u8C03 lark-cli\uFF0C\u53EA\u80FD\u8BBF\u95EE\u8FD9\u53F0\u673A\u5668\u4EBA\u81EA\u5DF1\u7684\u8D44\u6E90": "Calls lark-cli as the app itself; only this bot own resources are reachable",
|
|
299
|
+
"\u4EE5\u67D0\u4E2A\u4EBA\u7684\u540D\u4E49\u8C03 lark-cli\uFF08\u80FD\u8BFB\u5199\u4ED6\u7684\u4E91\u6587\u6863\u3001\u65E5\u5386\u7B49\u4E2A\u4EBA\u8D44\u6E90\uFF09\uFF1B\u5F00\u542F\u524D\u9700\u8981\u786E\u8BA4\uFF0C\u5E76\u4F1A\u9489\u4F4F\u5F53\u524D\u767B\u5F55\u7684\u4EBA": "Calls lark-cli on behalf of a person (their docs, calendar and other personal resources); enabling needs confirmation and pins the currently signed-in user",
|
|
300
|
+
"lark-cli \u91CC\u7684 profile": "Profile in lark-cli",
|
|
301
|
+
"lark-cli \u91CC\u8FD8\u6CA1\u6709\u8FD9\u53F0\u673A\u5668\u4EBA\u7684 profile\uFF08\u771F\u6B63\u8C03\u7528\u65F6\u4F1A\u81EA\u52A8\u521B\u5EFA\uFF09": "lark-cli has no profile for this bot yet (created automatically on first real call)",
|
|
302
|
+
"\u8BFB\u53D6 lark-cli \u72B6\u6001\u5931\u8D25\uFF1A": "Failed to read lark-cli status: ",
|
|
303
|
+
"\u5E94\u7528\u8EAB\u4EFD\uFF1A": "App identity: ",
|
|
304
|
+
"\u7528\u6237\u8EAB\u4EFD\uFF1A": "User identity: ",
|
|
305
|
+
"\u53EF\u7528": "available",
|
|
306
|
+
"\u4E0D\u53EF\u7528": "not available",
|
|
307
|
+
"\u767B\u5F55\u4EBA\uFF1A": "Signed-in user: ",
|
|
308
|
+
"\u6CA1\u6709\u7528\u6237\u767B\u5F55": "no user signed in",
|
|
309
|
+
"\u786E\u8BA4\u5F00\u542F": "Confirm",
|
|
310
|
+
"\u5DF2\u53D6\u6D88\uFF0C\u672A\u505A\u4EFB\u4F55\u6539\u52A8\u3002": "Cancelled; nothing changed.",
|
|
311
|
+
"\u5DF2\u4FDD\u5B58\u3002": "Saved.",
|
|
312
|
+
"\u91CD\u8BFB lark-cli \u72B6\u6001": "Re-read lark-cli status",
|
|
313
|
+
"\u5DF2\u5904\u7406\u6D88\u606F": "Messages handled",
|
|
314
|
+
"\u6CA1\u6709\u5DF2\u63A5\u5165\u7684\u98DE\u4E66\u673A\u5668\u4EBA": "No Feishu bot connected",
|
|
315
|
+
"\u672C\u673A\u8FD8\u6CA1\u6709\u98DE\u4E66\u673A\u5668\u4EBA\u914D\u7F6E\u3002": "This Host has no Feishu bot configured yet.",
|
|
316
|
+
"\u72B6\u6001": "State",
|
|
317
|
+
"\u542F\u52A8\u4E2D": "Starting",
|
|
318
|
+
"\u8FD0\u884C\u6B63\u5E38": "Connected",
|
|
319
|
+
"\u542F\u52A8\u5931\u8D25": "Failed",
|
|
320
|
+
"\u5DF2\u505C\u6B62": "Stopped",
|
|
321
|
+
"\u6B63\u5728\u8FD0\u884C": "Running",
|
|
322
|
+
"\u4FDD\u5B58": "Save",
|
|
323
|
+
"\u4FDD\u5B58\u4E2D\u2026": "Saving\u2026",
|
|
324
|
+
"\u65B0\u5EFA\u673A\u5668\u4EBA\u63A5\u5165": "Add a bot",
|
|
325
|
+
"\u4E24\u79CD\u65B9\u5F0F\uFF1A\u626B\u7801\u65B0\u5EFA\u4E00\u4E2A\u98DE\u4E66\u673A\u5668\u4EBA\uFF08\u63A8\u8350\uFF0C\u626B\u7801\u7684\u4EBA\u5C31\u662F\u5C5E\u4E3B\uFF09\uFF0C\u6216\u624B\u52A8\u586B\u5DF2\u6709\u673A\u5668\u4EBA\u7684\u51ED\u636E\u3002": "Two ways: scan to create a new Feishu bot (recommended \u2014 whoever scans becomes the owner), or paste the credentials of an existing bot.",
|
|
326
|
+
"\u626B\u7801\u65B0\u5EFA\u673A\u5668\u4EBA": "Scan to create a bot",
|
|
327
|
+
"\u70B9\u4E0B\u9762\u7684\u6309\u94AE\u4F1A\u5411\u98DE\u4E66\u7533\u8BF7\u4E00\u4E2A\u4E00\u6B21\u6027\u6388\u6743\u94FE\u63A5\uFF1A\u7528\u98DE\u4E66\u626B\u4E00\u626B\uFF0C\u6216\u5728\u6D4F\u89C8\u5668\u91CC\u6253\u5F00\u5B83\uFF0C\u5C31\u4F1A\u81EA\u52A8\u521B\u5EFA\u5E94\u7528\u5E76\u63A5\u5165\u3002": "This requests a one-time authorization link from Feishu. Scan it with Feishu (or open it in your browser) and a new app is created and connected automatically.",
|
|
328
|
+
"\u624B\u52A8\u63A5\u5165\u5DF2\u6709\u673A\u5668\u4EBA": "Connect an existing bot manually",
|
|
329
|
+
"\u6253\u5F00\u6388\u6743\u9875\u9762": "Open the authorization page",
|
|
330
|
+
"\u8FD9\u53F0 Host \u6CA1\u80FD\u751F\u6210\u4E8C\u7EF4\u7801\uFF0C\u8BF7\u70B9\u4E0A\u9762\u7684\u94FE\u63A5\u7EE7\u7EED\u3002": "This Host could not render the QR code \u2014 use the link above instead.",
|
|
331
|
+
"\u5269\u4F59": "expires in",
|
|
332
|
+
"\u6B63\u5728\u5411\u98DE\u4E66\u7533\u8BF7\u4E8C\u7EF4\u7801\u2026": "Requesting the QR code from Feishu\u2026",
|
|
333
|
+
"\u5DF2\u6388\u6743\uFF0C\u6B63\u5728\u542F\u52A8\u673A\u5668\u4EBA\u2026": "Authorized \u2014 starting the bot\u2026",
|
|
334
|
+
"\u7B49\u5F85\u626B\u7801": "Waiting for the scan",
|
|
335
|
+
"\u7B49\u5F85\u4F60\u5728\u98DE\u4E66\u91CC\u786E\u8BA4\u2026": "Waiting for you to confirm in Feishu\u2026",
|
|
336
|
+
"\u4E8C\u7EF4\u7801\u5DF2\u5931\u6548\uFF0C\u8BF7\u91CD\u65B0\u751F\u6210": "The link expired \u2014 generate a new one",
|
|
337
|
+
"\u626B\u7801\u63A5\u5165\u5931\u8D25": "Scan-based setup failed",
|
|
338
|
+
"\u5DF2\u53D6\u6D88": "Cancelled",
|
|
339
|
+
"\u91CD\u65B0\u751F\u6210\u4E8C\u7EF4\u7801": "Generate a new QR code",
|
|
340
|
+
"\u586B\u81EA\u5EFA\u5E94\u7528\u7684 App ID \u4E0E App Secret\uFF08\u98DE\u4E66\u5F00\u653E\u5E73\u53F0 \u2192 \u51ED\u8BC1\u4E0E\u57FA\u7840\u4FE1\u606F\uFF09\u3002\u5E94\u7528\u9700\u8981\u5F00\u542F\u673A\u5668\u4EBA\u80FD\u529B\u3002": "Paste the App ID and App Secret of your own app (Feishu Open Platform \u2192 Credentials & Basic Info). The app must have the bot capability enabled.",
|
|
341
|
+
"\u5E94\u7528\u51ED\u8BC1\u91CC\u7684 App Secret": "The App Secret from the app credentials",
|
|
342
|
+
"\u57DF\u540D": "Domain",
|
|
343
|
+
"\u98DE\u4E66\uFF08open.feishu.cn\uFF09": "Feishu (open.feishu.cn)",
|
|
344
|
+
"Lark\uFF08open.larksuite.com\uFF09": "Lark (open.larksuite.com)",
|
|
345
|
+
"\u5C5E\u4E3B open_id\uFF08\u53EF\u7559\u7A7A\uFF09": "Owner open_id (optional)",
|
|
346
|
+
"\u5C5E\u4E3B\u7559\u7A7A = \u8FD9\u53F0\u673A\u5668\u4EBA\u6682\u65F6\u6CA1\u6709\u5C5E\u4E3B\uFF1A\u63A5\u5165\u540E\u79C1\u804A\u4F1A\u88AB\u8BBE\u4E3A\u300C\u4EFB\u4F55\u4EBA\u53EF\u7528\u300D\uFF0C\u5C5E\u4E3B\u5148\u8DDF\u5B83\u8BF4\u4E00\u53E5\u8BDD\uFF0C\u518D\u56DE\u5B83\u7684\u8BBE\u7F6E\u91CC\u628A\u81EA\u5DF1\u9009\u6210\u5C5E\u4E3B\u3002": 'Leave the owner empty and this bot starts with no owner. Direct chats are then set to "anyone" so the owner can say hello first, and pick themselves as owner afterwards in this bot\u2019s settings.',
|
|
347
|
+
"\u63A5\u5165": "Add",
|
|
348
|
+
"\u63A5\u5165\u4E2D\u2026": "Adding\u2026",
|
|
349
|
+
"\u79C1\u804A\u8BBF\u95EE\u7B56\u7565\u6CA1\u80FD\u81EA\u52A8\u653E\u5BBD": "Could not relax the direct-chat access policy",
|
|
350
|
+
"\u5DF2\u63A5\u5165": "Added",
|
|
351
|
+
"\u70B9\u5DE6\u4E0A\u89D2\u300C\u8FD4\u56DE\u300D\u5C31\u80FD\u5728\u5217\u8868\u91CC\u770B\u5230\u5B83\u3002": "Click Back at the top left to see it in the list.",
|
|
352
|
+
"\u4FDD\u5B58\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5\u3002": "Could not save. Try again.",
|
|
353
|
+
"\u6700\u8FD1\u4E00\u6B21\u9519\u8BEF": "Last error"
|
|
354
|
+
};
|
|
355
|
+
var h = React.createElement;
|
|
356
|
+
var STATE_TEXT = {
|
|
357
|
+
starting: "\u542F\u52A8\u4E2D",
|
|
358
|
+
running: "\u8FD0\u884C\u6B63\u5E38",
|
|
359
|
+
failed: "\u542F\u52A8\u5931\u8D25",
|
|
360
|
+
stopped: "\u5DF2\u505C\u6B62"
|
|
361
|
+
};
|
|
362
|
+
var STEP_PUSH_OPTIONS = [
|
|
363
|
+
{
|
|
364
|
+
value: "off",
|
|
365
|
+
label: "\u4E0D\u663E\u793A\u8FC7\u7A0B\uFF08\u53EA\u53D1\u9001\u6700\u7EC8\u7B54\u6848\uFF09",
|
|
366
|
+
help: "\u9002\u5408\u65E5\u5E38\u95EE\u7B54\uFF1A\u4E0D\u663E\u793A\u5DE5\u5177\u8C03\u7528\u7B49\u4E2D\u95F4\u6B65\u9AA4\uFF0C\u6700\u7EC8\u7B54\u6848\u4ECD\u7528\u4E00\u5F20\u5361\u7247\u56DE\u590D\uFF0C\u8868\u683C\u4E0E\u4EE3\u7801\u5757\u4FDD\u7559\u683C\u5F0F"
|
|
367
|
+
},
|
|
368
|
+
{
|
|
369
|
+
value: "streaming_card",
|
|
370
|
+
label: "\u5B9E\u65F6\u8FC7\u7A0B\u5361\uFF08\u5168\u7A0B\u4E00\u5F20\u5361\u7247\u52A8\u6001\u66F4\u65B0\uFF09",
|
|
371
|
+
help: "\u63A8\u8350\u957F\u4EFB\u52A1\u4F7F\u7528\uFF1A\u8FC7\u7A0B\u4E0E\u6700\u7EC8\u7B54\u6848\u90FD\u5728\u540C\u4E00\u5F20\u5361\u7247\u91CC\u5B9E\u65F6\u66F4\u65B0\uFF0C\u4E0D\u5237\u5C4F"
|
|
372
|
+
},
|
|
373
|
+
{
|
|
374
|
+
value: "post",
|
|
375
|
+
label: "\u9010\u6B65\u76F4\u64AD\uFF08\u6BCF\u4E00\u6B65\u5355\u72EC\u53D1\u4E00\u6761\u6D88\u606F\uFF09",
|
|
376
|
+
help: "\u6BCF\u4E00\u6B65\u90FD\u5355\u72EC\u53D1\u4E00\u6761\u6D88\u606F\uFF08\u542B\u5DE5\u5177\u8C03\u7528\uFF09\uFF1B\u957F\u4EFB\u52A1\u4F1A\u8FDE\u7EED\u53D1\u9001\u8F83\u591A\u6D88\u606F"
|
|
377
|
+
}
|
|
378
|
+
];
|
|
379
|
+
var LARK_IDENTITY_OPTIONS = [
|
|
380
|
+
{
|
|
381
|
+
value: "bot-only",
|
|
382
|
+
label: "\u53EA\u7528\u5E94\u7528\u8EAB\u4EFD\uFF08bot\uFF09",
|
|
383
|
+
help: "\u4EE5\u5E94\u7528\u81EA\u5DF1\u7684\u8EAB\u4EFD\u8C03 lark-cli\uFF0C\u53EA\u80FD\u8BBF\u95EE\u8FD9\u53F0\u673A\u5668\u4EBA\u81EA\u5DF1\u7684\u8D44\u6E90"
|
|
384
|
+
},
|
|
385
|
+
{
|
|
386
|
+
value: "user-allowed",
|
|
387
|
+
label: "\u5141\u8BB8\u7528\u6237\u8EAB\u4EFD\uFF08--as user\uFF09",
|
|
388
|
+
help: "\u4EE5\u67D0\u4E2A\u4EBA\u7684\u540D\u4E49\u8C03 lark-cli\uFF08\u80FD\u8BFB\u5199\u4ED6\u7684\u4E91\u6587\u6863\u3001\u65E5\u5386\u7B49\u4E2A\u4EBA\u8D44\u6E90\uFF09\uFF1B\u5F00\u542F\u524D\u9700\u8981\u786E\u8BA4\uFF0C\u5E76\u4F1A\u9489\u4F4F\u5F53\u524D\u767B\u5F55\u7684\u4EBA"
|
|
389
|
+
}
|
|
390
|
+
];
|
|
391
|
+
function LarkIdentityEditor({ botId, value, chatUi, connection, translate, onChanged }) {
|
|
392
|
+
const t = typeof translate === "function" ? translate : (key) => key;
|
|
393
|
+
const { Panel } = chatUi.components;
|
|
394
|
+
const [probe, setProbe] = React.useState({ phase: "loading", value: null, error: null });
|
|
395
|
+
const [pending, setPending] = React.useState(null);
|
|
396
|
+
const [notice, setNotice] = React.useState(null);
|
|
397
|
+
const [error, setError] = React.useState(null);
|
|
398
|
+
const [busy, setBusy] = React.useState(false);
|
|
399
|
+
const load = React.useCallback(async () => {
|
|
400
|
+
try {
|
|
401
|
+
const result = await chatUi.callChannelRpc(connection, CHANNEL_ID, "bot.lark-identity.get", { botId });
|
|
402
|
+
setProbe({ phase: "ready", value: chatUi.unwrapRpc(result), error: null });
|
|
403
|
+
} catch (cause) {
|
|
404
|
+
setProbe({ phase: "failed", value: null, error: cause?.message ?? String(cause) });
|
|
405
|
+
}
|
|
406
|
+
}, [botId, chatUi, connection]);
|
|
407
|
+
React.useEffect(() => {
|
|
408
|
+
void load();
|
|
409
|
+
}, [load]);
|
|
410
|
+
const submit = async (next, { confirm = false } = {}) => {
|
|
411
|
+
setBusy(true);
|
|
412
|
+
setError(null);
|
|
413
|
+
try {
|
|
414
|
+
const result = await chatUi.callChannelRpc(connection, CHANNEL_ID, "bot.lark-identity.set", {
|
|
415
|
+
botId,
|
|
416
|
+
value: next,
|
|
417
|
+
confirm
|
|
418
|
+
});
|
|
419
|
+
const applied = chatUi.unwrapRpc(result);
|
|
420
|
+
if (applied?.requiresConfirm === true) {
|
|
421
|
+
setPending({ value: next, prompt: applied.confirmPrompt ?? applied.message ?? "" });
|
|
422
|
+
setNotice(null);
|
|
423
|
+
return;
|
|
424
|
+
}
|
|
425
|
+
setPending(null);
|
|
426
|
+
setNotice(applied?.message ?? t("\u5DF2\u4FDD\u5B58\u3002"));
|
|
427
|
+
await load();
|
|
428
|
+
await onChanged?.();
|
|
429
|
+
} catch (cause) {
|
|
430
|
+
setError(cause?.message ?? String(cause));
|
|
431
|
+
} finally {
|
|
432
|
+
setBusy(false);
|
|
433
|
+
}
|
|
434
|
+
};
|
|
435
|
+
const mode = value?.mode === "user-allowed" ? "user-allowed" : "bot-only";
|
|
436
|
+
const selected = LARK_IDENTITY_OPTIONS.find((item) => item.value === mode) ?? LARK_IDENTITY_OPTIONS[0];
|
|
437
|
+
const info = probe.value;
|
|
438
|
+
const line = (label, text) => h(
|
|
439
|
+
"div",
|
|
440
|
+
{ className: "dchat-scopeRow" },
|
|
441
|
+
h("span", { className: "dchat-scopeLabel" }, label),
|
|
442
|
+
h("span", { className: "dchat-cardDescription" }, text)
|
|
443
|
+
);
|
|
444
|
+
const identityText = (entry, empty) => {
|
|
445
|
+
if (!entry) return empty;
|
|
446
|
+
if (entry.error) return `${t("\u4E0D\u53EF\u7528")}\uFF08${entry.error.code}\uFF09`;
|
|
447
|
+
if (entry.available === false) return t("\u4E0D\u53EF\u7528");
|
|
448
|
+
return t("\u53EF\u7528");
|
|
449
|
+
};
|
|
450
|
+
return h(
|
|
451
|
+
Panel,
|
|
452
|
+
{
|
|
453
|
+
title: t("lark-cli \u8EAB\u4EFD"),
|
|
454
|
+
description: t("\u8FD9\u53F0\u673A\u5668\u4EBA\u8C03 lark-cli \u65F6\u7528\u54EA\u4E2A\u8EAB\u4EFD\uFF1B\u98DE\u4E66\u6E20\u9053\u7684\u6536\u53D1\u4ECD\u8D70\u5B98\u65B9 SDK"),
|
|
455
|
+
actions: h("button", {
|
|
456
|
+
type: "button",
|
|
457
|
+
className: "dchat-button",
|
|
458
|
+
disabled: busy,
|
|
459
|
+
onClick: () => {
|
|
460
|
+
void load();
|
|
461
|
+
}
|
|
462
|
+
}, t("\u91CD\u8BFB lark-cli \u72B6\u6001"))
|
|
463
|
+
},
|
|
464
|
+
h(
|
|
465
|
+
"div",
|
|
466
|
+
{ className: "dchat-scopeGrid" },
|
|
467
|
+
h(
|
|
468
|
+
"div",
|
|
469
|
+
{ className: "dchat-scopeRow" },
|
|
470
|
+
h("label", {
|
|
471
|
+
className: "dchat-scopeLabel",
|
|
472
|
+
htmlFor: `lark-identity-${botId}`
|
|
473
|
+
}, t("\u8C03\u7528\u8EAB\u4EFD")),
|
|
474
|
+
h("select", {
|
|
475
|
+
id: `lark-identity-${botId}`,
|
|
476
|
+
className: "dchat-select",
|
|
477
|
+
// 布局守门按这个属性核对"控件状态确实来自假数据"。
|
|
478
|
+
"data-lark-identity": mode,
|
|
479
|
+
value: mode,
|
|
480
|
+
disabled: busy,
|
|
481
|
+
onChange: (event) => {
|
|
482
|
+
setPending(null);
|
|
483
|
+
void submit(event.target.value);
|
|
484
|
+
}
|
|
485
|
+
}, LARK_IDENTITY_OPTIONS.map((option) => h("option", {
|
|
486
|
+
key: option.value,
|
|
487
|
+
value: option.value
|
|
488
|
+
}, t(option.label))))
|
|
489
|
+
)
|
|
490
|
+
),
|
|
491
|
+
h("p", { className: "dchat-cardDescription" }, t(selected.help)),
|
|
492
|
+
pending ? h(
|
|
493
|
+
"div",
|
|
494
|
+
{ className: "dchat-warning", role: "alert" },
|
|
495
|
+
h("p", null, pending.prompt),
|
|
496
|
+
h(
|
|
497
|
+
"div",
|
|
498
|
+
{ className: "dchat-actions" },
|
|
499
|
+
h("button", {
|
|
500
|
+
type: "button",
|
|
501
|
+
className: "dchat-button dchat-buttonPrimary",
|
|
502
|
+
disabled: busy,
|
|
503
|
+
onClick: () => {
|
|
504
|
+
void submit(pending.value, { confirm: true });
|
|
505
|
+
}
|
|
506
|
+
}, t("\u786E\u8BA4\u5F00\u542F")),
|
|
507
|
+
h("button", {
|
|
508
|
+
type: "button",
|
|
509
|
+
className: "dchat-button",
|
|
510
|
+
disabled: busy,
|
|
511
|
+
onClick: () => {
|
|
512
|
+
setPending(null);
|
|
513
|
+
setNotice(t("\u5DF2\u53D6\u6D88\uFF0C\u672A\u505A\u4EFB\u4F55\u6539\u52A8\u3002"));
|
|
514
|
+
}
|
|
515
|
+
}, t("\u53D6\u6D88"))
|
|
516
|
+
)
|
|
517
|
+
) : null,
|
|
518
|
+
notice ? h("p", { className: "dchat-cardDescription", role: "status" }, notice) : null,
|
|
519
|
+
error ? h("p", { className: "dchat-error", role: "alert" }, error) : null,
|
|
520
|
+
probe.phase === "failed" ? h("p", { className: "dchat-error", role: "alert" }, `${t("\u8BFB\u53D6 lark-cli \u72B6\u6001\u5931\u8D25\uFF1A")}${probe.error}`) : null,
|
|
521
|
+
probe.phase === "ready" && info ? line(t("lark-cli \u91CC\u7684 profile"), info.profile?.found ? `${info.profile.name ?? "?"}\uFF08${info.profile.appId ?? "?"}\uFF09` : t("lark-cli \u91CC\u8FD8\u6CA1\u6709\u8FD9\u53F0\u673A\u5668\u4EBA\u7684 profile\uFF08\u771F\u6B63\u8C03\u7528\u65F6\u4F1A\u81EA\u52A8\u521B\u5EFA\uFF09")) : null,
|
|
522
|
+
probe.phase === "ready" && info?.identity ? line(t("\u5E94\u7528\u8EAB\u4EFD\uFF1A"), identityText(info.identity.bot, t("\u4E0D\u53EF\u7528"))) : null,
|
|
523
|
+
probe.phase === "ready" && info?.identity ? line(t("\u7528\u6237\u8EAB\u4EFD\uFF1A"), info.identity.user?.onBehalfOf?.openId ? `${t("\u767B\u5F55\u4EBA\uFF1A")}${info.identity.user.onBehalfOf.userName ?? ""} (${info.identity.user.onBehalfOf.openId})` : identityText(info.identity.user, t("\u6CA1\u6709\u7528\u6237\u767B\u5F55"))) : null
|
|
524
|
+
);
|
|
525
|
+
}
|
|
526
|
+
function BotCard({ bot, status, chatUi, connection, translate, onChanged }) {
|
|
527
|
+
const t = typeof translate === "function" ? translate : (key) => key;
|
|
528
|
+
const {
|
|
529
|
+
Panel,
|
|
530
|
+
StatusPill,
|
|
531
|
+
ScopedModeEditor,
|
|
532
|
+
ContextEnhancementEditor,
|
|
533
|
+
DeliveryTargetsEditor,
|
|
534
|
+
WorkspaceEditor,
|
|
535
|
+
PresetEditor,
|
|
536
|
+
ModelEditor,
|
|
537
|
+
AccessPolicyEditor,
|
|
538
|
+
OwnerEditor,
|
|
539
|
+
PanelSectionsEditor
|
|
540
|
+
} = chatUi.components;
|
|
541
|
+
const settings = chatUi.hooks.useBotSettings({
|
|
542
|
+
connection,
|
|
543
|
+
channelId: CHANNEL_ID,
|
|
544
|
+
botId: bot.id
|
|
545
|
+
});
|
|
546
|
+
React.useEffect(() => {
|
|
547
|
+
void settings.loadOptions();
|
|
548
|
+
}, [settings.loadOptions]);
|
|
549
|
+
const sessions = chatUi.hooks.useConversations({
|
|
550
|
+
connection,
|
|
551
|
+
channelId: CHANNEL_ID,
|
|
552
|
+
botId: bot.id
|
|
553
|
+
}).conversations.map((item) => ({
|
|
554
|
+
id: item.kind === "group" ? item.route?.chatId : item.route?.openId,
|
|
555
|
+
name: item.name,
|
|
556
|
+
kind: item.kind
|
|
557
|
+
})).filter((item) => typeof item.id === "string" && item.id);
|
|
558
|
+
const policyIds = React.useMemo(() => {
|
|
559
|
+
const policy = settings.record?.accessPolicy;
|
|
560
|
+
const users = [
|
|
561
|
+
...policy?.direct?.allowlist?.users ?? [],
|
|
562
|
+
...policy?.group?.allowlist?.users ?? []
|
|
563
|
+
];
|
|
564
|
+
return [...new Set(users.map((user) => user?.id).filter((id) => typeof id === "string" && id))];
|
|
565
|
+
}, [settings.record?.accessPolicy]);
|
|
566
|
+
const policyIdsKey = policyIds.join(",");
|
|
567
|
+
const [policyNames, setPolicyNames] = React.useState({ names: null, hint: null });
|
|
568
|
+
React.useEffect(() => {
|
|
569
|
+
if (policyIdsKey === "") {
|
|
570
|
+
setPolicyNames({ names: null, hint: null });
|
|
571
|
+
return void 0;
|
|
572
|
+
}
|
|
573
|
+
let cancelled = false;
|
|
574
|
+
void (async () => {
|
|
575
|
+
try {
|
|
576
|
+
const result = await chatUi.callChannelRpc(connection, CHANNEL_ID, "names.resolve", {
|
|
577
|
+
botId: bot.id,
|
|
578
|
+
ids: policyIdsKey.split(",")
|
|
579
|
+
});
|
|
580
|
+
const value = chatUi.unwrapRpc(result);
|
|
581
|
+
if (!cancelled) setPolicyNames({ names: value?.names ?? {}, hint: value?.hint ?? null });
|
|
582
|
+
} catch (cause) {
|
|
583
|
+
if (!cancelled) setPolicyNames({
|
|
584
|
+
names: null,
|
|
585
|
+
hint: { message: `${t("\u8BFB\u4E0D\u5230\u540D\u5355\u91CC\u7684\u540D\u5B57")}\uFF1A${cause.message}` }
|
|
586
|
+
});
|
|
587
|
+
}
|
|
588
|
+
})();
|
|
589
|
+
return () => {
|
|
590
|
+
cancelled = true;
|
|
591
|
+
};
|
|
592
|
+
}, [chatUi, connection, bot.id, policyIdsKey, t]);
|
|
593
|
+
const saveOwners = async (owners) => {
|
|
594
|
+
const result = await chatUi.callChannelRpc(connection, CHANNEL_ID, "bot.owner.set", {
|
|
595
|
+
botId: bot.id,
|
|
596
|
+
ownerOpenIds: owners
|
|
597
|
+
});
|
|
598
|
+
chatUi.unwrapRpc(result);
|
|
599
|
+
await onChanged?.();
|
|
600
|
+
};
|
|
601
|
+
const shared = {
|
|
602
|
+
workspace: settings.record?.workspace ?? null,
|
|
603
|
+
agentPreset: settings.record?.agentPreset ?? null,
|
|
604
|
+
// 机器人默认模型(还没有会话时用它):与工作区/预设同一条口径,只对新建会话生效。
|
|
605
|
+
model: settings.record?.model ?? null,
|
|
606
|
+
accessPolicy: settings.record?.accessPolicy ?? null,
|
|
607
|
+
// 控制面板卡片的显示项(null = 全显示)。
|
|
608
|
+
panelSections: settings.record?.panelSections ?? null
|
|
609
|
+
};
|
|
610
|
+
const [busy, setBusy] = React.useState(false);
|
|
611
|
+
const [error, setError] = React.useState(null);
|
|
612
|
+
const [confirming, setConfirming] = React.useState(false);
|
|
613
|
+
const run = async (method, payload) => {
|
|
614
|
+
setBusy(true);
|
|
615
|
+
setError(null);
|
|
616
|
+
try {
|
|
617
|
+
const result = await chatUi.callChannelRpc(connection, CHANNEL_ID, method, payload);
|
|
618
|
+
return chatUi.unwrapRpc(result);
|
|
619
|
+
} catch (cause) {
|
|
620
|
+
setError(cause.message);
|
|
621
|
+
throw cause;
|
|
622
|
+
} finally {
|
|
623
|
+
setBusy(false);
|
|
624
|
+
}
|
|
625
|
+
};
|
|
626
|
+
const tone = status.state === "running" ? "success" : status.state === "failed" ? "error" : "warning";
|
|
627
|
+
return h(
|
|
628
|
+
Panel,
|
|
629
|
+
{
|
|
630
|
+
title: bot.name ?? bot.id,
|
|
631
|
+
description: bot.appIdMasked,
|
|
632
|
+
actions: h(
|
|
633
|
+
"div",
|
|
634
|
+
{ className: "dchat-actions" },
|
|
635
|
+
h(StatusPill, { status: status.state, label: t(STATE_TEXT[status.state] ?? "\u72B6\u6001") }),
|
|
636
|
+
h("button", {
|
|
637
|
+
type: "button",
|
|
638
|
+
className: "dchat-button",
|
|
639
|
+
disabled: busy,
|
|
640
|
+
onClick: async () => {
|
|
641
|
+
try {
|
|
642
|
+
await run("bot.reconnect", { botId: bot.id });
|
|
643
|
+
await onChanged?.();
|
|
644
|
+
} catch {
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
}, t("\u91CD\u65B0\u8FDE\u63A5")),
|
|
648
|
+
confirming ? h(
|
|
649
|
+
React.Fragment,
|
|
650
|
+
null,
|
|
651
|
+
h("button", {
|
|
652
|
+
type: "button",
|
|
653
|
+
className: "dchat-button dchat-buttonDangerSolid",
|
|
654
|
+
disabled: busy,
|
|
655
|
+
onClick: async () => {
|
|
656
|
+
try {
|
|
657
|
+
await run("bot.delete", { botId: bot.id, confirm: true });
|
|
658
|
+
setConfirming(false);
|
|
659
|
+
await onChanged?.();
|
|
660
|
+
} catch {
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
}, t("\u786E\u8BA4\u79FB\u9664")),
|
|
664
|
+
h("button", {
|
|
665
|
+
type: "button",
|
|
666
|
+
className: "dchat-button",
|
|
667
|
+
disabled: busy,
|
|
668
|
+
onClick: () => setConfirming(false)
|
|
669
|
+
}, t("\u53D6\u6D88"))
|
|
670
|
+
) : h("button", {
|
|
671
|
+
type: "button",
|
|
672
|
+
className: "dchat-button dchat-buttonDanger",
|
|
673
|
+
disabled: busy,
|
|
674
|
+
onClick: () => setConfirming(true)
|
|
675
|
+
}, t("\u79FB\u9664\u63A5\u5165"))
|
|
676
|
+
)
|
|
677
|
+
},
|
|
678
|
+
status.errorMessage ? h("p", { className: "dchat-error", role: "alert" }, status.errorMessage) : null,
|
|
679
|
+
// 属主名单是 `*`(绑定时没记录属主)时必须说清楚:这台机器人**没有属主绕过**,
|
|
680
|
+
// 一切按访问策略判定,所以 /allow 会回"只有属主",名单要在下面的「访问策略」里改。
|
|
681
|
+
status.ownersWildcard ? h("p", { className: "dchat-cardDescription" }, t("\u5C5E\u4E3B\u540D\u5355\u662F *\uFF08\u8FD9\u53F0\u673A\u5668\u4EBA\u6CA1\u6709\u5C5E\u4E3B\u7ED5\u8FC7\uFF09\uFF1A\u80FD\u7528\u5B83\u7684\u4EBA\u5B8C\u5168\u7531\u4E0B\u9762\u7684\u300C\u8BBF\u95EE\u7B56\u7565\u300D\u51B3\u5B9A\u3002")) : null,
|
|
682
|
+
// 名字拿不到(多为缺权限)时说明原因并给出开通入口:否则用户只能看到一串 id 猜原因。
|
|
683
|
+
status.nameHint ? h(
|
|
684
|
+
"p",
|
|
685
|
+
{ className: "dchat-cardDescription", role: "status" },
|
|
686
|
+
`${status.nameHint.message} `,
|
|
687
|
+
status.nameHint.url ? h("a", { href: status.nameHint.url, target: "_blank", rel: "noreferrer" }, t("\u53BB\u5F00\u901A\u6743\u9650")) : null
|
|
688
|
+
) : null,
|
|
689
|
+
// 处理最近一条消息失败时留下的现场(与终端日志对应)。
|
|
690
|
+
status.lastError ? h(
|
|
691
|
+
"p",
|
|
692
|
+
{ className: "dchat-error", role: "alert" },
|
|
693
|
+
`${t("\u6700\u8FD1\u4E00\u6B21\u9519\u8BEF")}\uFF1A${status.lastError}`
|
|
694
|
+
) : null,
|
|
695
|
+
error ? h("p", { className: "dchat-error", role: "alert" }, error) : null,
|
|
696
|
+
h(
|
|
697
|
+
"div",
|
|
698
|
+
{ className: "dchat-list" },
|
|
699
|
+
h(
|
|
700
|
+
"div",
|
|
701
|
+
{ className: "dchat-listItem" },
|
|
702
|
+
h("span", null, t("\u5DF2\u5904\u7406\u6D88\u606F")),
|
|
703
|
+
h("span", null, String(status.handled ?? 0))
|
|
704
|
+
)
|
|
705
|
+
),
|
|
706
|
+
h(WorkspaceEditor, {
|
|
707
|
+
value: shared.workspace,
|
|
708
|
+
options: settings.options?.workspacePaths ?? [],
|
|
709
|
+
translate: t,
|
|
710
|
+
onSave: settings.saveWorkspace
|
|
711
|
+
}),
|
|
712
|
+
h(PresetEditor, {
|
|
713
|
+
value: shared.agentPreset,
|
|
714
|
+
options: settings.options?.presets ?? [],
|
|
715
|
+
translate: t,
|
|
716
|
+
onSave: settings.saveAgentPreset
|
|
717
|
+
}),
|
|
718
|
+
h(ModelEditor, {
|
|
719
|
+
value: shared.model ?? null,
|
|
720
|
+
options: settings.options?.models ?? [],
|
|
721
|
+
hostDefault: settings.options?.hostDefault ?? null,
|
|
722
|
+
failures: settings.options?.modelFailures ?? [],
|
|
723
|
+
translate: t,
|
|
724
|
+
onSave: settings.saveModel
|
|
725
|
+
}),
|
|
726
|
+
h(OwnerEditor, {
|
|
727
|
+
owners: status.ownerOpenIds ?? [],
|
|
728
|
+
wildcard: status.ownersWildcard === true,
|
|
729
|
+
// 属主只能是人(私聊会话),群不参与。
|
|
730
|
+
candidates: sessions.filter((item) => item.kind === "direct"),
|
|
731
|
+
translate: t,
|
|
732
|
+
onSave: saveOwners
|
|
733
|
+
}),
|
|
734
|
+
h(AccessPolicyEditor, {
|
|
735
|
+
value: shared.accessPolicy,
|
|
736
|
+
// 名单里的 id 换成名字(渠道查的);查不到就只显示 id + 原因。
|
|
737
|
+
names: policyNames.names,
|
|
738
|
+
namesHint: policyNames.hint,
|
|
739
|
+
translate: t,
|
|
740
|
+
onSave: settings.saveAccessPolicy
|
|
741
|
+
}),
|
|
742
|
+
h(PanelSectionsEditor, {
|
|
743
|
+
value: shared.panelSections ?? null,
|
|
744
|
+
disabled: settings.phase !== "ready",
|
|
745
|
+
translate: t,
|
|
746
|
+
onSave: settings.savePanelSections
|
|
747
|
+
}),
|
|
748
|
+
h(ScopedModeEditor, {
|
|
749
|
+
title: t("\u4EFB\u52A1\u8FC7\u7A0B\u5C55\u793A"),
|
|
750
|
+
description: t("\u8BBE\u7F6E\u6267\u884C\u8FC7\u7A0B\u7684\u5448\u73B0\u65B9\u5F0F\uFF1B\u79C1\u804A\u4E0E\u7FA4\u804A\u5206\u522B\u751F\u6548"),
|
|
751
|
+
scopes: [{ key: "direct", label: "\u79C1\u804A" }, { key: "group", label: "\u7FA4\u804A" }],
|
|
752
|
+
options: STEP_PUSH_OPTIONS,
|
|
753
|
+
value: status.stepPush,
|
|
754
|
+
translate: t,
|
|
755
|
+
onSave: async (next) => {
|
|
756
|
+
const result = await chatUi.callChannelRpc(connection, CHANNEL_ID, "bot.step-push.set", {
|
|
757
|
+
botId: bot.id,
|
|
758
|
+
stepPush: next
|
|
759
|
+
});
|
|
760
|
+
chatUi.unwrapRpc(result);
|
|
761
|
+
await onChanged?.();
|
|
762
|
+
}
|
|
763
|
+
}),
|
|
764
|
+
h(LarkIdentityEditor, {
|
|
765
|
+
botId: bot.id,
|
|
766
|
+
value: status.larkIdentity ?? { mode: "bot-only", userOpenId: null },
|
|
767
|
+
chatUi,
|
|
768
|
+
connection,
|
|
769
|
+
translate: t,
|
|
770
|
+
onChanged
|
|
771
|
+
}),
|
|
772
|
+
h(ContextEnhancementEditor, {
|
|
773
|
+
config: settings.record?.contextEnhancement ?? null,
|
|
774
|
+
disabled: settings.phase !== "ready",
|
|
775
|
+
translate: t,
|
|
776
|
+
onSave: settings.saveContextEnhancement,
|
|
777
|
+
// 「指定用户/指定群」用它做"从会话里选",而不是让人填 id。
|
|
778
|
+
conversations: sessions
|
|
779
|
+
}),
|
|
780
|
+
// 渠道无关面板:目标清单与测试发送都由 hub 的共享组件负责。
|
|
781
|
+
h(DeliveryTargetsEditor, {
|
|
782
|
+
chatUi,
|
|
783
|
+
connection,
|
|
784
|
+
channelId: CHANNEL_ID,
|
|
785
|
+
botId: bot.id
|
|
786
|
+
})
|
|
787
|
+
);
|
|
788
|
+
}
|
|
789
|
+
function FeishuOnboard({ chatUi, connection, translate, onAdded }) {
|
|
790
|
+
const t = typeof translate === "function" ? translate : (key) => key;
|
|
791
|
+
const { Panel } = chatUi.components;
|
|
792
|
+
const [form, setForm] = React.useState({ appId: "", appSecret: "", domain: "feishu", owner: "" });
|
|
793
|
+
const [phase, setPhase] = React.useState("idle");
|
|
794
|
+
const [error, setError] = React.useState(null);
|
|
795
|
+
const [added, setAdded] = React.useState(null);
|
|
796
|
+
const [warning, setWarning] = React.useState(null);
|
|
797
|
+
const [scan, setScan] = React.useState({ state: "idle" });
|
|
798
|
+
const aliveRef = React.useRef(true);
|
|
799
|
+
React.useEffect(() => () => {
|
|
800
|
+
aliveRef.current = false;
|
|
801
|
+
}, []);
|
|
802
|
+
const busy = phase === "busy";
|
|
803
|
+
const ready = form.appId.trim().length > 0 && form.appSecret.trim().length > 0;
|
|
804
|
+
const patch = (next) => setForm((current) => ({ ...current, ...next }));
|
|
805
|
+
const SCAN_ACTIVE = ["starting", "qr_ready", "polling", "slow_down", "domain_switched", "saving"];
|
|
806
|
+
const relaxIfOwnerless = async (bot) => {
|
|
807
|
+
if (bot?.ownersWildcard !== true) return;
|
|
808
|
+
const botId = bot?.botId ?? bot?.id ?? null;
|
|
809
|
+
if (!botId) return;
|
|
810
|
+
try {
|
|
811
|
+
await chatUi.callControlRpc(connection, "bot.access-policy.open-scope", {
|
|
812
|
+
channelId: CHANNEL_ID,
|
|
813
|
+
botId,
|
|
814
|
+
conversationType: "direct"
|
|
815
|
+
});
|
|
816
|
+
} catch (cause) {
|
|
817
|
+
setWarning(`${t("\u79C1\u804A\u8BBF\u95EE\u7B56\u7565\u6CA1\u80FD\u81EA\u52A8\u653E\u5BBD")}\uFF1A${cause?.message ?? String(cause)}`);
|
|
818
|
+
}
|
|
819
|
+
};
|
|
820
|
+
const submit = async () => {
|
|
821
|
+
if (!ready || busy) return;
|
|
822
|
+
setPhase("busy");
|
|
823
|
+
setError(null);
|
|
824
|
+
setWarning(null);
|
|
825
|
+
setAdded(null);
|
|
826
|
+
let bot = null;
|
|
827
|
+
try {
|
|
828
|
+
const result = await chatUi.callChannelRpc(connection, CHANNEL_ID, "bot.add", {
|
|
829
|
+
appId: form.appId.trim(),
|
|
830
|
+
appSecret: form.appSecret.trim(),
|
|
831
|
+
domain: form.domain,
|
|
832
|
+
// 属主可以留空(也可以写多个,用空格/逗号分开):留空 = 这台机器人暂时没有属主。
|
|
833
|
+
...form.owner.trim() ? { ownerOpenIds: form.owner.trim().split(/[\s,,]+/).filter(Boolean) } : {}
|
|
834
|
+
});
|
|
835
|
+
bot = chatUi.unwrapRpc(result)?.bot ?? null;
|
|
836
|
+
} catch (cause) {
|
|
837
|
+
setError(cause?.message ?? String(cause));
|
|
838
|
+
setPhase("error");
|
|
839
|
+
return;
|
|
840
|
+
}
|
|
841
|
+
await relaxIfOwnerless(bot);
|
|
842
|
+
setAdded({ id: bot?.botId ?? bot?.id ?? null, name: bot?.name ?? null });
|
|
843
|
+
patch({ appId: "", appSecret: "", owner: "" });
|
|
844
|
+
setPhase("done");
|
|
845
|
+
onAdded?.();
|
|
846
|
+
};
|
|
847
|
+
const beginScan = async () => {
|
|
848
|
+
setError(null);
|
|
849
|
+
setWarning(null);
|
|
850
|
+
setAdded(null);
|
|
851
|
+
try {
|
|
852
|
+
const result = await chatUi.callChannelRpc(connection, CHANNEL_ID, "bot.register.start", {});
|
|
853
|
+
const value = chatUi.unwrapRpc(result);
|
|
854
|
+
if (aliveRef.current) setScan(value);
|
|
855
|
+
} catch (cause) {
|
|
856
|
+
if (aliveRef.current) setError(cause?.message ?? String(cause));
|
|
857
|
+
}
|
|
858
|
+
};
|
|
859
|
+
const cancelScan = async () => {
|
|
860
|
+
try {
|
|
861
|
+
const result = await chatUi.callChannelRpc(connection, CHANNEL_ID, "bot.register.cancel", {});
|
|
862
|
+
const value = chatUi.unwrapRpc(result);
|
|
863
|
+
if (aliveRef.current) setScan(value);
|
|
864
|
+
} catch (cause) {
|
|
865
|
+
if (aliveRef.current) setError(cause?.message ?? String(cause));
|
|
866
|
+
}
|
|
867
|
+
};
|
|
868
|
+
React.useEffect(() => {
|
|
869
|
+
if (!SCAN_ACTIVE.includes(scan.state)) return void 0;
|
|
870
|
+
let stopped = false;
|
|
871
|
+
const tick = async () => {
|
|
872
|
+
try {
|
|
873
|
+
const result = await chatUi.callChannelRpc(connection, CHANNEL_ID, "bot.register.status", {});
|
|
874
|
+
const value = chatUi.unwrapRpc(result);
|
|
875
|
+
if (stopped || !aliveRef.current) return;
|
|
876
|
+
setScan(value);
|
|
877
|
+
if (!SCAN_ACTIVE.includes(value.state)) return;
|
|
878
|
+
} catch (cause) {
|
|
879
|
+
if (!stopped && aliveRef.current) setError(cause?.message ?? String(cause));
|
|
880
|
+
return;
|
|
881
|
+
}
|
|
882
|
+
if (!stopped) timer = setTimeout(tick, 2e3);
|
|
883
|
+
};
|
|
884
|
+
let timer = setTimeout(tick, 1e3);
|
|
885
|
+
return () => {
|
|
886
|
+
stopped = true;
|
|
887
|
+
clearTimeout(timer);
|
|
888
|
+
};
|
|
889
|
+
}, [scan.state, chatUi, connection]);
|
|
890
|
+
React.useEffect(() => {
|
|
891
|
+
if (scan.state !== "succeeded" || !scan.bot) return;
|
|
892
|
+
setAdded({ id: scan.bot.botId ?? scan.bot.id ?? null, name: scan.bot.name ?? null });
|
|
893
|
+
void relaxIfOwnerless(scan.bot);
|
|
894
|
+
onAdded?.();
|
|
895
|
+
}, [scan.state, scan.bot]);
|
|
896
|
+
const field = (key, options) => h(
|
|
897
|
+
"div",
|
|
898
|
+
{ className: "dchat-scopeRow" },
|
|
899
|
+
// `label` 由调用方给:界面文案传 t(…) 的结果,飞书自己的术语(App ID / App Secret)原样传。
|
|
900
|
+
h("label", { className: "dchat-scopeLabel", htmlFor: options.id }, options.label),
|
|
901
|
+
options.select ? h("select", {
|
|
902
|
+
id: options.id,
|
|
903
|
+
className: "dchat-select",
|
|
904
|
+
value: form[key],
|
|
905
|
+
disabled: busy,
|
|
906
|
+
onChange: (event) => patch({ [key]: event.target.value })
|
|
907
|
+
}, options.select.map((item) => h("option", { key: item.value, value: item.value }, t(item.label)))) : h("input", {
|
|
908
|
+
id: options.id,
|
|
909
|
+
className: "dchat-input",
|
|
910
|
+
type: options.type ?? "text",
|
|
911
|
+
value: form[key],
|
|
912
|
+
disabled: busy,
|
|
913
|
+
placeholder: options.placeholder ?? "",
|
|
914
|
+
autoComplete: "off",
|
|
915
|
+
spellCheck: false,
|
|
916
|
+
onChange: (event) => patch({ [key]: event.target.value }),
|
|
917
|
+
onKeyDown: (event) => {
|
|
918
|
+
if (event.key !== "Enter") return;
|
|
919
|
+
event.preventDefault();
|
|
920
|
+
void submit();
|
|
921
|
+
}
|
|
922
|
+
})
|
|
923
|
+
);
|
|
924
|
+
const scanActive = SCAN_ACTIVE.includes(scan.state);
|
|
925
|
+
const scanLabel = scan.state === "starting" ? t("\u6B63\u5728\u5411\u98DE\u4E66\u7533\u8BF7\u4E8C\u7EF4\u7801\u2026") : scan.state === "saving" ? t("\u5DF2\u6388\u6743\uFF0C\u6B63\u5728\u542F\u52A8\u673A\u5668\u4EBA\u2026") : scan.state === "succeeded" ? t("\u5DF2\u63A5\u5165") : scan.state === "expired" ? t("\u4E8C\u7EF4\u7801\u5DF2\u5931\u6548\uFF0C\u8BF7\u91CD\u65B0\u751F\u6210") : scan.state === "cancelled" ? t("\u5DF2\u53D6\u6D88") : scan.state === "error" ? t("\u626B\u7801\u63A5\u5165\u5931\u8D25") : scan.state === "polling" || scan.state === "slow_down" || scan.state === "domain_switched" ? t("\u7B49\u5F85\u4F60\u5728\u98DE\u4E66\u91CC\u786E\u8BA4\u2026") : t("\u7B49\u5F85\u626B\u7801");
|
|
926
|
+
return h(
|
|
927
|
+
Panel,
|
|
928
|
+
{
|
|
929
|
+
title: t("\u65B0\u5EFA\u673A\u5668\u4EBA\u63A5\u5165"),
|
|
930
|
+
description: t("\u4E24\u79CD\u65B9\u5F0F\uFF1A\u626B\u7801\u65B0\u5EFA\u4E00\u4E2A\u98DE\u4E66\u673A\u5668\u4EBA\uFF08\u63A8\u8350\uFF0C\u626B\u7801\u7684\u4EBA\u5C31\u662F\u5C5E\u4E3B\uFF09\uFF0C\u6216\u624B\u52A8\u586B\u5DF2\u6709\u673A\u5668\u4EBA\u7684\u51ED\u636E\u3002"),
|
|
931
|
+
actions: null
|
|
932
|
+
},
|
|
933
|
+
// ① 扫码新建
|
|
934
|
+
h(
|
|
935
|
+
"div",
|
|
936
|
+
{ className: "dchat-onboardSection" },
|
|
937
|
+
h("h4", { className: "dchat-onboardTitle" }, t("\u626B\u7801\u65B0\u5EFA\u673A\u5668\u4EBA")),
|
|
938
|
+
h(
|
|
939
|
+
"p",
|
|
940
|
+
{ className: "dchat-cardDescription" },
|
|
941
|
+
t("\u70B9\u4E0B\u9762\u7684\u6309\u94AE\u4F1A\u5411\u98DE\u4E66\u7533\u8BF7\u4E00\u4E2A\u4E00\u6B21\u6027\u6388\u6743\u94FE\u63A5\uFF1A\u7528\u98DE\u4E66\u626B\u4E00\u626B\uFF0C\u6216\u5728\u6D4F\u89C8\u5668\u91CC\u6253\u5F00\u5B83\uFF0C\u5C31\u4F1A\u81EA\u52A8\u521B\u5EFA\u5E94\u7528\u5E76\u63A5\u5165\u3002")
|
|
942
|
+
),
|
|
943
|
+
h(
|
|
944
|
+
"div",
|
|
945
|
+
{ className: "dchat-actions" },
|
|
946
|
+
h("button", {
|
|
947
|
+
type: "button",
|
|
948
|
+
className: "dchat-button dchat-buttonPrimary",
|
|
949
|
+
disabled: scanActive,
|
|
950
|
+
onClick: () => {
|
|
951
|
+
void beginScan();
|
|
952
|
+
}
|
|
953
|
+
}, scan.state === "idle" || scan.state === "cancelled" || scan.state === "expired" || scan.state === "error" ? t("\u626B\u7801\u65B0\u5EFA\u673A\u5668\u4EBA") : t("\u91CD\u65B0\u751F\u6210\u4E8C\u7EF4\u7801")),
|
|
954
|
+
scanActive ? h("button", {
|
|
955
|
+
type: "button",
|
|
956
|
+
className: "dchat-button",
|
|
957
|
+
onClick: () => {
|
|
958
|
+
void cancelScan();
|
|
959
|
+
}
|
|
960
|
+
}, t("\u53D6\u6D88")) : null
|
|
961
|
+
),
|
|
962
|
+
scan.qrCodeDataUrl ? h("img", {
|
|
963
|
+
className: "dchat-onboardQr",
|
|
964
|
+
src: scan.qrCodeDataUrl,
|
|
965
|
+
alt: t("\u626B\u7801\u65B0\u5EFA\u673A\u5668\u4EBA"),
|
|
966
|
+
width: 200,
|
|
967
|
+
height: 200
|
|
968
|
+
}) : null,
|
|
969
|
+
// Host 没能把链接编码成二维码(缺 qrcode 模块)时**必须说清**,并给一条还能走的路。
|
|
970
|
+
scan.verificationUrl && !scan.qrCodeDataUrl ? h(
|
|
971
|
+
"div",
|
|
972
|
+
null,
|
|
973
|
+
h("a", {
|
|
974
|
+
className: "dchat-onboardLink",
|
|
975
|
+
href: scan.verificationUrl,
|
|
976
|
+
target: "_blank",
|
|
977
|
+
rel: "noreferrer"
|
|
978
|
+
}, t("\u6253\u5F00\u6388\u6743\u9875\u9762")),
|
|
979
|
+
h(
|
|
980
|
+
"p",
|
|
981
|
+
{ className: "dchat-cardDescription" },
|
|
982
|
+
`${t("\u8FD9\u53F0 Host \u6CA1\u80FD\u751F\u6210\u4E8C\u7EF4\u7801\uFF0C\u8BF7\u70B9\u4E0A\u9762\u7684\u94FE\u63A5\u7EE7\u7EED\u3002")}`
|
|
983
|
+
)
|
|
984
|
+
) : null,
|
|
985
|
+
h(
|
|
986
|
+
"p",
|
|
987
|
+
{ className: "dchat-cardDescription", role: "status" },
|
|
988
|
+
scan.remainingSeconds !== null && scan.remainingSeconds !== void 0 && scanActive ? `${scanLabel}\uFF08${t("\u5269\u4F59")} ${scan.remainingSeconds}s\uFF09` : scanLabel
|
|
989
|
+
),
|
|
990
|
+
scan.state === "error" && scan.error ? h("p", { className: "dchat-error", role: "alert" }, `${scan.error.message}\uFF08${scan.error.code}\uFF09`) : null
|
|
991
|
+
),
|
|
992
|
+
h("hr", { className: "dchat-onboardDivider" }),
|
|
993
|
+
// ② 手动接入已有机器人
|
|
994
|
+
h(
|
|
995
|
+
"div",
|
|
996
|
+
{ className: "dchat-onboardSection" },
|
|
997
|
+
h("h4", { className: "dchat-onboardTitle" }, t("\u624B\u52A8\u63A5\u5165\u5DF2\u6709\u673A\u5668\u4EBA")),
|
|
998
|
+
h(
|
|
999
|
+
"p",
|
|
1000
|
+
{ className: "dchat-cardDescription" },
|
|
1001
|
+
t("\u586B\u81EA\u5EFA\u5E94\u7528\u7684 App ID \u4E0E App Secret\uFF08\u98DE\u4E66\u5F00\u653E\u5E73\u53F0 \u2192 \u51ED\u8BC1\u4E0E\u57FA\u7840\u4FE1\u606F\uFF09\u3002\u5E94\u7528\u9700\u8981\u5F00\u542F\u673A\u5668\u4EBA\u80FD\u529B\u3002")
|
|
1002
|
+
),
|
|
1003
|
+
h(
|
|
1004
|
+
"div",
|
|
1005
|
+
{ className: "dchat-scopeGrid" },
|
|
1006
|
+
field("appId", { id: "dchat-onboard-appId", label: "App ID", placeholder: "cli_xxxxxxxxxxxx" }),
|
|
1007
|
+
field("appSecret", {
|
|
1008
|
+
id: "dchat-onboard-appSecret",
|
|
1009
|
+
label: "App Secret",
|
|
1010
|
+
type: "password",
|
|
1011
|
+
placeholder: t("\u5E94\u7528\u51ED\u8BC1\u91CC\u7684 App Secret")
|
|
1012
|
+
}),
|
|
1013
|
+
field("domain", {
|
|
1014
|
+
id: "dchat-onboard-domain",
|
|
1015
|
+
label: t("\u57DF\u540D"),
|
|
1016
|
+
select: [{ value: "feishu", label: "\u98DE\u4E66\uFF08open.feishu.cn\uFF09" }, { value: "lark", label: "Lark\uFF08open.larksuite.com\uFF09" }]
|
|
1017
|
+
}),
|
|
1018
|
+
field("owner", {
|
|
1019
|
+
id: "dchat-onboard-owner",
|
|
1020
|
+
label: t("\u5C5E\u4E3B open_id\uFF08\u53EF\u7559\u7A7A\uFF09"),
|
|
1021
|
+
placeholder: "ou_xxxxxxxxxxxx"
|
|
1022
|
+
}),
|
|
1023
|
+
h(
|
|
1024
|
+
"p",
|
|
1025
|
+
{ className: "dchat-cardDescription" },
|
|
1026
|
+
t("\u5C5E\u4E3B\u7559\u7A7A = \u8FD9\u53F0\u673A\u5668\u4EBA\u6682\u65F6\u6CA1\u6709\u5C5E\u4E3B\uFF1A\u63A5\u5165\u540E\u79C1\u804A\u4F1A\u88AB\u8BBE\u4E3A\u300C\u4EFB\u4F55\u4EBA\u53EF\u7528\u300D\uFF0C\u5C5E\u4E3B\u5148\u8DDF\u5B83\u8BF4\u4E00\u53E5\u8BDD\uFF0C\u518D\u56DE\u5B83\u7684\u8BBE\u7F6E\u91CC\u628A\u81EA\u5DF1\u9009\u6210\u5C5E\u4E3B\u3002")
|
|
1027
|
+
)
|
|
1028
|
+
),
|
|
1029
|
+
h(
|
|
1030
|
+
"div",
|
|
1031
|
+
{ className: "dchat-actions" },
|
|
1032
|
+
h("button", {
|
|
1033
|
+
type: "button",
|
|
1034
|
+
className: "dchat-button dchat-buttonPrimary",
|
|
1035
|
+
disabled: busy || !ready,
|
|
1036
|
+
onClick: () => {
|
|
1037
|
+
void submit();
|
|
1038
|
+
}
|
|
1039
|
+
}, busy ? t("\u63A5\u5165\u4E2D\u2026") : t("\u63A5\u5165"))
|
|
1040
|
+
)
|
|
1041
|
+
),
|
|
1042
|
+
error ? h("p", { className: "dchat-error", role: "alert" }, error) : null,
|
|
1043
|
+
warning ? h("p", { className: "dchat-warning", role: "alert" }, warning) : null,
|
|
1044
|
+
added ? h(
|
|
1045
|
+
"p",
|
|
1046
|
+
{ className: "dchat-cardDescription", role: "status" },
|
|
1047
|
+
`${t("\u5DF2\u63A5\u5165")}${added.name ? ` \u300C${added.name}\u300D` : ""}\u3002` + t("\u70B9\u5DE6\u4E0A\u89D2\u300C\u8FD4\u56DE\u300D\u5C31\u80FD\u5728\u5217\u8868\u91CC\u770B\u5230\u5B83\u3002")
|
|
1048
|
+
) : null
|
|
1049
|
+
);
|
|
1050
|
+
}
|
|
1051
|
+
function FeishuPage(props) {
|
|
1052
|
+
const { chatUi, connection, translate, botId = null } = props;
|
|
1053
|
+
const t = typeof translate === "function" ? translate : (key) => key;
|
|
1054
|
+
const [state, setState] = React.useState({ phase: "idle", value: null, error: null });
|
|
1055
|
+
const load = React.useCallback(async () => {
|
|
1056
|
+
setState((current) => ({ ...current, phase: "loading" }));
|
|
1057
|
+
try {
|
|
1058
|
+
const result = await chatUi.callChannelRpc(connection, CHANNEL_ID, "connection.status", {});
|
|
1059
|
+
setState({ phase: "ready", value: chatUi.unwrapRpc(result), error: null });
|
|
1060
|
+
} catch (error) {
|
|
1061
|
+
setState({ phase: "error", value: null, error });
|
|
1062
|
+
}
|
|
1063
|
+
}, [chatUi, connection]);
|
|
1064
|
+
React.useEffect(() => {
|
|
1065
|
+
void load();
|
|
1066
|
+
}, [load]);
|
|
1067
|
+
const { EmptyState } = chatUi.components;
|
|
1068
|
+
const allBots = state.value?.bots ?? [];
|
|
1069
|
+
const scoped = Boolean(botId);
|
|
1070
|
+
const bots = scoped ? allBots.filter((bot) => (bot?.botId ?? bot?.id ?? null) === botId) : [];
|
|
1071
|
+
const missing = scoped && state.phase === "ready" && bots.length === 0;
|
|
1072
|
+
return h(
|
|
1073
|
+
React.Fragment,
|
|
1074
|
+
null,
|
|
1075
|
+
// 读状态失败照旧要显示:这个页面上不能只留一行日志。
|
|
1076
|
+
state.error ? h("p", { className: "dchat-error", role: "alert" }, state.error.message) : null,
|
|
1077
|
+
scoped ? null : h(FeishuOnboard, { chatUi, connection, translate: t, onAdded: load }),
|
|
1078
|
+
missing ? h(EmptyState, {
|
|
1079
|
+
title: t("\u627E\u4E0D\u5230\u8FD9\u53F0\u673A\u5668\u4EBA"),
|
|
1080
|
+
description: `${t("\u5B83\u4E0D\u5728\u5F53\u524D\u6E20\u9053\u7684\u540D\u5355\u91CC\uFF08\u53EF\u80FD\u5DF2\u88AB\u79FB\u9664\uFF0C\u6216 Host \u4E0E\u9875\u9762\u7248\u672C\u4E0D\u4E00\u81F4\uFF09")}\uFF1A${botId}`
|
|
1081
|
+
}) : null,
|
|
1082
|
+
scoped ? bots.map((bot) => h(BotCard, {
|
|
1083
|
+
key: bot.id,
|
|
1084
|
+
bot,
|
|
1085
|
+
status: bot,
|
|
1086
|
+
chatUi,
|
|
1087
|
+
connection,
|
|
1088
|
+
translate: t,
|
|
1089
|
+
onChanged: load
|
|
1090
|
+
})) : null
|
|
1091
|
+
);
|
|
1092
|
+
}
|
|
1093
|
+
function apply(ctx) {
|
|
1094
|
+
ctx.effect(
|
|
1095
|
+
() => ctx.locale.register(LOCALE_NAMESPACE, { zh, en }),
|
|
1096
|
+
"dsh-chat-feishu: \u53CC\u8BED\u6587\u6848"
|
|
1097
|
+
);
|
|
1098
|
+
const t = typeof ctx.locale?.bind === "function" ? ctx.locale.bind(LOCALE_NAMESPACE) : (key) => zh[key] ?? key;
|
|
1099
|
+
ctx.effect(() => ctx.chatChannels.register({
|
|
1100
|
+
id: CHANNEL_ID,
|
|
1101
|
+
order: 20,
|
|
1102
|
+
label: () => t("\u98DE\u4E66"),
|
|
1103
|
+
// 侧边栏会话行的渠道徽标(飞书品牌蓝)。
|
|
1104
|
+
// 图标:**飞书开放平台官网的矢量标志**(open.feishu.cn 的 favicon-logo.svg,三条 path
|
|
1105
|
+
// 逐字节未改)。相对原件只做两件事:去掉官方文件里那层白色圆角底 `rect`(否则是白底方图),
|
|
1106
|
+
// 并把 viewBox 按官方 48px favicon 的留白比例收到标志外框;出处见 THIRD_PARTY_NOTICES.md。
|
|
1107
|
+
icon: { svg: '<svg viewBox="0.977 0.673 14.655 14.655" width="16" height="16" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M8.5611 8.26287L8.59322 8.23075C8.6141 8.20988 8.63658 8.18739 8.65906 8.16652L8.70402 8.12316L8.8373 7.99148L9.02037 7.81324L9.17613 7.65908L9.32226 7.51456L9.47481 7.36361L9.61452 7.22551L9.81043 7.03281C9.84737 6.99588 9.8859 6.96055 9.92444 6.92522C9.9951 6.86099 10.069 6.79836 10.1428 6.73734C10.2119 6.68274 10.2825 6.62975 10.3548 6.57836C10.456 6.5061 10.5603 6.44026 10.6663 6.37603C10.7707 6.31501 10.8783 6.2572 10.9875 6.2026C11.0903 6.15282 11.1963 6.10625 11.3038 6.0645C11.3633 6.04041 11.4243 6.01954 11.4853 5.99866C11.5158 5.98903 11.5463 5.97779 11.5784 5.96815C11.3071 4.90028 10.8109 3.90468 10.122 3.04556C9.98868 2.88016 9.78634 2.78381 9.57438 2.78381H3.94598C3.88817 2.78381 3.84 2.83038 3.84 2.8898C3.84 2.92352 3.85605 2.95403 3.88335 2.97491C5.80391 4.38321 7.39689 6.19297 8.54826 8.27732L8.5611 8.26287Z" fill="#00D6B9"/> <path d="M6.32424 13.2168C9.23077 13.2168 11.7631 11.6126 13.0831 9.24238C13.1297 9.15887 13.1747 9.07537 13.218 8.99026C13.1522 9.11712 13.0783 9.23917 12.9964 9.35478C12.9675 9.39493 12.9386 9.43508 12.9081 9.47522C12.8696 9.525 12.831 9.57157 12.7909 9.61814C12.7588 9.65507 12.7266 9.6904 12.6929 9.72573C12.6255 9.79638 12.5548 9.86383 12.4809 9.92646C12.4392 9.96178 12.3991 9.99551 12.3557 10.0276C12.3059 10.0662 12.2545 10.1031 12.2031 10.1368C12.171 10.1593 12.1373 10.1802 12.1036 10.2011C12.0699 10.2219 12.0345 10.2428 11.9976 10.2637C11.9253 10.3038 11.8499 10.3424 11.7744 10.3761C11.7085 10.405 11.6411 10.4323 11.5737 10.458C11.4998 10.4853 11.4259 10.5094 11.3488 10.5302C11.2348 10.5624 11.1208 10.5864 11.0036 10.6041C10.9201 10.617 10.8334 10.6266 10.7483 10.633C10.6583 10.6394 10.5668 10.641 10.4753 10.641C10.3741 10.6394 10.2729 10.633 10.1702 10.6218C10.0947 10.6137 10.0192 10.6025 9.94375 10.5897C9.87791 10.5784 9.81208 10.564 9.74624 10.5479C9.71091 10.5399 9.67719 10.5302 9.64186 10.5206C9.54551 10.4949 9.44916 10.4676 9.35281 10.4403C9.30464 10.4259 9.25646 10.413 9.20989 10.3986C9.13763 10.3777 9.06698 10.3552 8.99632 10.3327C8.93851 10.3151 8.8807 10.2958 8.82289 10.2765C8.76829 10.2589 8.71209 10.2412 8.65749 10.2219L8.54508 10.1834C8.50012 10.1673 8.45355 10.1513 8.40859 10.1352L8.31224 10.0999C8.24801 10.0774 8.18378 10.0533 8.12115 10.0292C8.08421 10.0148 8.04728 10.0019 8.01035 9.98748C7.96057 9.96821 7.91239 9.94894 7.86261 9.92967C7.81123 9.90879 7.75823 9.88792 7.70685 9.86704L7.60568 9.82529L7.48043 9.7739L7.38408 9.73376L7.28452 9.6904L7.1978 9.65186L7.11912 9.61653L7.03883 9.5796L6.95693 9.54106L6.85255 9.49288L6.74336 9.4415C6.70482 9.42223 6.66628 9.40456 6.62774 9.38529L6.52978 9.33712C4.80192 8.4748 3.24267 7.31218 1.92269 5.90227C1.88254 5.86052 1.8167 5.85731 1.77335 5.89746C1.75247 5.91673 1.73962 5.94563 1.73962 5.97454L1.74284 10.9413V11.3444C1.74284 11.5788 1.85845 11.7972 2.05276 11.9273C3.31654 12.772 4.80353 13.22 6.32424 13.2168Z" fill="#3370FF"/> <path d="M14.8656 6.21539C13.8844 5.73525 12.7619 5.63248 11.7101 5.92795C11.6652 5.94079 11.6218 5.95364 11.5784 5.96649C11.5479 5.97612 11.5174 5.98576 11.4853 5.997C11.4243 6.01787 11.3633 6.04036 11.3039 6.06284C11.1963 6.10459 11.0919 6.15116 10.9875 6.20094C10.8783 6.25393 10.7707 6.31174 10.6663 6.37276C10.5588 6.43539 10.456 6.50283 10.3548 6.57509C10.2825 6.62648 10.2119 6.67947 10.1428 6.73407C10.0674 6.79509 9.99511 6.85611 9.92445 6.92195C9.88591 6.95728 9.84898 6.99261 9.81044 7.02954L9.61453 7.22224L9.47482 7.36034L9.32227 7.51129L9.17614 7.65581L9.02038 7.80997L8.83892 7.98982L8.70564 8.1215L8.66067 8.16485C8.6398 8.18573 8.61732 8.20821 8.59483 8.22909L8.56272 8.2612L8.51294 8.30777C8.49367 8.32544 8.476 8.34149 8.45673 8.35916C7.97338 8.80397 7.43383 9.18455 6.85413 9.49447L6.9585 9.54265L7.0404 9.58119L7.12069 9.61812L7.19938 9.65345L7.28609 9.69199L7.38565 9.73534L7.482 9.77549L7.60725 9.82688L7.70842 9.86863C7.75981 9.8895 7.8128 9.91038 7.86419 9.93125C7.91236 9.95052 7.96214 9.9698 8.01192 9.98907C8.04886 10.0035 8.08579 10.0164 8.12272 10.0308C8.18696 10.0549 8.25119 10.0774 8.31382 10.1015L8.41016 10.1368C8.45513 10.1529 8.50009 10.1689 8.54666 10.185L8.65907 10.2235C8.71366 10.2412 8.76826 10.2604 8.82447 10.2781C8.88228 10.2974 8.94008 10.315 8.99789 10.3343C9.06855 10.3568 9.14081 10.3777 9.21147 10.4002C9.25964 10.4146 9.30782 10.4291 9.35439 10.4419C9.45073 10.4692 9.54708 10.4965 9.64343 10.5222C9.67876 10.5318 9.71248 10.5399 9.74781 10.5495C9.81365 10.5656 9.87949 10.5784 9.94533 10.5912C10.0208 10.6041 10.0963 10.6153 10.1717 10.6234C10.2745 10.6346 10.3757 10.641 10.4769 10.6426C10.5684 10.6442 10.6599 10.641 10.7498 10.6346C10.8366 10.6282 10.9217 10.6185 11.0052 10.6057C11.1208 10.588 11.2364 10.5623 11.3504 10.5318C11.4259 10.511 11.5014 10.4869 11.5752 10.4596C11.6427 10.4355 11.7101 10.4082 11.776 10.3777C11.8514 10.344 11.9269 10.3054 11.9992 10.2653C12.0345 10.246 12.0698 10.2251 12.1052 10.2026C12.1405 10.1818 12.1726 10.1593 12.2047 10.1384C12.2561 10.1031 12.3075 10.0677 12.3573 10.0292C12.4006 9.99709 12.4424 9.96337 12.4825 9.92804C12.5548 9.86542 12.6254 9.79797 12.6929 9.72732C12.7266 9.69199 12.7587 9.65666 12.7908 9.61973C12.831 9.57316 12.8711 9.52498 12.9081 9.47681C12.9386 9.43827 12.9675 9.39812 12.9964 9.35637C13.0767 9.24075 13.1505 9.12032 13.2164 8.99506L13.2919 8.84572L13.9631 7.50807L13.9711 7.49202C14.1927 7.01348 14.4946 6.58312 14.8656 6.21539Z" fill="#133C9A"/> </svg>' },
|
|
1108
|
+
sessionBadge: { text: "\u98DE", color: "#3370ff" },
|
|
1109
|
+
/**
|
|
1110
|
+
* `capabilities.setup.label` 决定机器人列表头部显不显示这个入口:飞书现在有了——
|
|
1111
|
+
* 打开的是「新建机器人接入」(填自建应用的 App ID + App Secret 就能加机器人),
|
|
1112
|
+
* 不再是当初那个点进去什么都改不了的「渠道设置」空壳。
|
|
1113
|
+
*/
|
|
1114
|
+
capabilities: {
|
|
1115
|
+
groups: true,
|
|
1116
|
+
setup: {
|
|
1117
|
+
label: t("\u65B0\u5EFA\u673A\u5668\u4EBA\u63A5\u5165"),
|
|
1118
|
+
hint: t(FEISHU_SETUP_HINT)
|
|
1119
|
+
}
|
|
1120
|
+
}
|
|
1121
|
+
}), "dsh-chat-feishu: \u6E20\u9053\u5143\u6570\u636E");
|
|
1122
|
+
ctx.effect(() => ctx.slots.inject(PAGE_SLOT, () => ctx.slots.register({
|
|
1123
|
+
name: PAGE_SLOT,
|
|
1124
|
+
key: CHANNEL_ID,
|
|
1125
|
+
locale: LOCALE_NAMESPACE,
|
|
1126
|
+
inject: () => ({ chatUi: ctx.chatUi, connection: ctx.connection, translate: t })
|
|
1127
|
+
}, FeishuPage)), "dsh-chat-feishu: \u6E20\u9053\u8BBE\u7F6E\u9875");
|
|
1128
|
+
}
|
|
1129
|
+
|
|
1130
|
+
return module.exports;
|
|
1131
|
+
}
|
|
1132
|
+
});
|