ylib-wecom-openclaw-plugin 2026.4.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +596 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +99 -0
- package/dist/src/accounts.d.ts +57 -0
- package/dist/src/accounts.js +247 -0
- package/dist/src/agent/api-client.d.ts +95 -0
- package/dist/src/agent/api-client.js +425 -0
- package/dist/src/agent/handler.d.ts +64 -0
- package/dist/src/agent/handler.js +731 -0
- package/dist/src/agent/index.d.ts +5 -0
- package/dist/src/agent/index.js +21 -0
- package/dist/src/agent/webhook.d.ts +25 -0
- package/dist/src/agent/webhook.js +294 -0
- package/dist/src/agent/xml.d.ts +21 -0
- package/dist/src/agent/xml.js +43 -0
- package/dist/src/channel.d.ts +5 -0
- package/dist/src/channel.js +815 -0
- package/dist/src/chat-queue.d.ts +31 -0
- package/dist/src/chat-queue.js +53 -0
- package/dist/src/config-schema.d.ts +587 -0
- package/dist/src/config-schema.js +146 -0
- package/dist/src/const.d.ts +128 -0
- package/dist/src/const.js +168 -0
- package/dist/src/dm-policy.d.ts +29 -0
- package/dist/src/dm-policy.js +146 -0
- package/dist/src/dynamic-agent.d.ts +37 -0
- package/dist/src/dynamic-agent.js +67 -0
- package/dist/src/dynamic-routing.d.ts +65 -0
- package/dist/src/dynamic-routing.js +62 -0
- package/dist/src/endpoint-dispatch.d.ts +54 -0
- package/dist/src/endpoint-dispatch.js +967 -0
- package/dist/src/endpoint-event-adapter.d.ts +15 -0
- package/dist/src/endpoint-event-adapter.js +427 -0
- package/dist/src/group-policy.d.ts +30 -0
- package/dist/src/group-policy.js +126 -0
- package/dist/src/http.d.ts +27 -0
- package/dist/src/http.js +168 -0
- package/dist/src/im-runtime-telemetry.d.ts +25 -0
- package/dist/src/im-runtime-telemetry.js +68 -0
- package/dist/src/interface.d.ts +192 -0
- package/dist/src/interface.js +5 -0
- package/dist/src/markdown-chunk.d.ts +1 -0
- package/dist/src/markdown-chunk.js +396 -0
- package/dist/src/mcp/index.d.ts +6 -0
- package/dist/src/mcp/index.js +28 -0
- package/dist/src/mcp/interceptors/biz-error.d.ts +11 -0
- package/dist/src/mcp/interceptors/biz-error.js +73 -0
- package/dist/src/mcp/interceptors/doc-auth-error.d.ts +10 -0
- package/dist/src/mcp/interceptors/doc-auth-error.js +235 -0
- package/dist/src/mcp/interceptors/index.d.ts +35 -0
- package/dist/src/mcp/interceptors/index.js +143 -0
- package/dist/src/mcp/interceptors/msg-media.d.ts +11 -0
- package/dist/src/mcp/interceptors/msg-media.js +201 -0
- package/dist/src/mcp/interceptors/smartpage-create.d.ts +30 -0
- package/dist/src/mcp/interceptors/smartpage-create.js +252 -0
- package/dist/src/mcp/interceptors/smartpage-export.d.ts +17 -0
- package/dist/src/mcp/interceptors/smartpage-export.js +135 -0
- package/dist/src/mcp/interceptors/smartsheet-upload.d.ts +22 -0
- package/dist/src/mcp/interceptors/smartsheet-upload.js +388 -0
- package/dist/src/mcp/interceptors/types.d.ts +64 -0
- package/dist/src/mcp/interceptors/types.js +8 -0
- package/dist/src/mcp/schema.d.ts +11 -0
- package/dist/src/mcp/schema.js +115 -0
- package/dist/src/mcp/tool.d.ts +63 -0
- package/dist/src/mcp/tool.js +318 -0
- package/dist/src/mcp/transport.d.ts +94 -0
- package/dist/src/mcp/transport.js +702 -0
- package/dist/src/media-handler.d.ts +55 -0
- package/dist/src/media-handler.js +306 -0
- package/dist/src/media-uploader.d.ts +142 -0
- package/dist/src/media-uploader.js +446 -0
- package/dist/src/message-parser.d.ts +104 -0
- package/dist/src/message-parser.js +232 -0
- package/dist/src/message-sender.d.ts +54 -0
- package/dist/src/message-sender.js +210 -0
- package/dist/src/monitor.d.ts +69 -0
- package/dist/src/monitor.js +1846 -0
- package/dist/src/onboarding.d.ts +8 -0
- package/dist/src/onboarding.js +248 -0
- package/dist/src/openclaw-compat.d.ts +148 -0
- package/dist/src/openclaw-compat.js +839 -0
- package/dist/src/proactive-markdown-send.d.ts +14 -0
- package/dist/src/proactive-markdown-send.js +205 -0
- package/dist/src/reqid-store.d.ts +23 -0
- package/dist/src/reqid-store.js +136 -0
- package/dist/src/runtime.d.ts +2 -0
- package/dist/src/runtime.js +7 -0
- package/dist/src/shared/command-auth.d.ts +23 -0
- package/dist/src/shared/command-auth.js +112 -0
- package/dist/src/shared/xml-parser.d.ts +46 -0
- package/dist/src/shared/xml-parser.js +228 -0
- package/dist/src/state-dir-resolve.d.ts +2 -0
- package/dist/src/state-dir-resolve.js +33 -0
- package/dist/src/state-manager.d.ts +115 -0
- package/dist/src/state-manager.js +413 -0
- package/dist/src/target.d.ts +35 -0
- package/dist/src/target.js +71 -0
- package/dist/src/template-card-manager.d.ts +55 -0
- package/dist/src/template-card-manager.js +316 -0
- package/dist/src/template-card-parser.d.ts +37 -0
- package/dist/src/template-card-parser.js +672 -0
- package/dist/src/timeout.d.ts +20 -0
- package/dist/src/timeout.js +57 -0
- package/dist/src/types/account.d.ts +29 -0
- package/dist/src/types/account.js +5 -0
- package/dist/src/types/config.d.ts +98 -0
- package/dist/src/types/config.js +8 -0
- package/dist/src/types/constants.d.ts +42 -0
- package/dist/src/types/constants.js +45 -0
- package/dist/src/types/index.d.ts +7 -0
- package/dist/src/types/index.js +17 -0
- package/dist/src/types/message.d.ts +238 -0
- package/dist/src/types/message.js +6 -0
- package/dist/src/utils.d.ts +148 -0
- package/dist/src/utils.js +92 -0
- package/dist/src/version.d.ts +2 -0
- package/dist/src/version.js +28 -0
- package/dist/src/webhook/command-auth.d.ts +47 -0
- package/dist/src/webhook/command-auth.js +137 -0
- package/dist/src/webhook/gateway.d.ts +36 -0
- package/dist/src/webhook/gateway.js +297 -0
- package/dist/src/webhook/handler.d.ts +19 -0
- package/dist/src/webhook/handler.js +481 -0
- package/dist/src/webhook/helpers.d.ts +157 -0
- package/dist/src/webhook/helpers.js +936 -0
- package/dist/src/webhook/http.d.ts +27 -0
- package/dist/src/webhook/http.js +168 -0
- package/dist/src/webhook/index.d.ts +11 -0
- package/dist/src/webhook/index.js +43 -0
- package/dist/src/webhook/media.d.ts +30 -0
- package/dist/src/webhook/media.js +152 -0
- package/dist/src/webhook/monitor.d.ts +59 -0
- package/dist/src/webhook/monitor.js +1672 -0
- package/dist/src/webhook/state.d.ts +220 -0
- package/dist/src/webhook/state.js +568 -0
- package/dist/src/webhook/target.d.ts +41 -0
- package/dist/src/webhook/target.js +165 -0
- package/dist/src/webhook/types.d.ts +348 -0
- package/dist/src/webhook/types.js +36 -0
- package/dist/src/webhook/video-frame.d.ts +13 -0
- package/dist/src/webhook/video-frame.js +108 -0
- package/openclaw.plugin.json +19 -0
- package/package.json +96 -0
- package/schema.json +534 -0
- package/scripts/generate-schema.mjs +33 -0
- package/skills/wecom-contact/SKILL.md +162 -0
- package/skills/wecom-doc/SKILL.md +162 -0
- package/skills/wecom-doc/references/create-doc.md +56 -0
- package/skills/wecom-doc/references/edit-doc-content.md +68 -0
- package/skills/wecom-doc/references/get-doc-content.md +88 -0
- package/skills/wecom-doc/references/smartpage-create.md +125 -0
- package/skills/wecom-doc/references/smartpage-export.md +160 -0
- package/skills/wecom-meeting/SKILL.md +441 -0
- package/skills/wecom-meeting/references/example-full.md +30 -0
- package/skills/wecom-meeting/references/example-reminder.md +46 -0
- package/skills/wecom-meeting/references/example-security.md +22 -0
- package/skills/wecom-meeting/references/response-get-meeting-info.md +148 -0
- package/skills/wecom-msg/SKILL.md +157 -0
- package/skills/wecom-msg/references/api-get-messages.md +93 -0
- package/skills/wecom-msg/references/api-get-msg-chat-list.md +58 -0
- package/skills/wecom-msg/references/api-get-msg-media.md +44 -0
- package/skills/wecom-msg/references/api-send-message.md +39 -0
- package/skills/wecom-preflight/SKILL.md +141 -0
- package/skills/wecom-schedule/SKILL.md +161 -0
- package/skills/wecom-schedule/references/api-check-availability.md +56 -0
- package/skills/wecom-schedule/references/api-create-schedule.md +38 -0
- package/skills/wecom-schedule/references/api-get-schedule-detail.md +81 -0
- package/skills/wecom-schedule/references/api-update-schedule.md +32 -0
- package/skills/wecom-schedule/references/ref-reminders.md +24 -0
- package/skills/wecom-send-media/SKILL.md +68 -0
- package/skills/wecom-send-template-card/SKILL.md +157 -0
- package/skills/wecom-send-template-card/references/api-template-card-types.md +358 -0
- package/skills/wecom-smartsheet/SKILL.md +164 -0
- package/skills/wecom-smartsheet/references/smartsheet-cell-value-formats.md +163 -0
- package/skills/wecom-smartsheet/references/smartsheet-field-types.md +44 -0
- package/skills/wecom-smartsheet/references/smartsheet-get-records.md +96 -0
- package/skills/wecom-smartsheet/references/webhook-examples.md +185 -0
- package/skills/wecom-smartsheet/references/webhook-fallback.md +184 -0
- package/skills/wecom-todo/SKILL.md +392 -0
- package/skills/wecom-todo/examples/workflows.md +163 -0
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 模板卡片管理器
|
|
4
|
+
*
|
|
5
|
+
* 负责:
|
|
6
|
+
* - 模板卡片缓存管理(内存级,带 TTL 和大小限制)
|
|
7
|
+
* - 卡片交互事件处理(更新卡片 UI 状态)
|
|
8
|
+
* - 模板卡片发送(通过 wsClient.sendMessage 主动推送)
|
|
9
|
+
* - 从 LLM 回复中检测并处理模板卡片
|
|
10
|
+
*/
|
|
11
|
+
var __assign = (this && this.__assign) || function () {
|
|
12
|
+
__assign = Object.assign || function(t) {
|
|
13
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
14
|
+
s = arguments[i];
|
|
15
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
16
|
+
t[p] = s[p];
|
|
17
|
+
}
|
|
18
|
+
return t;
|
|
19
|
+
};
|
|
20
|
+
return __assign.apply(this, arguments);
|
|
21
|
+
};
|
|
22
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
23
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
24
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
25
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
26
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
27
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
28
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
29
|
+
});
|
|
30
|
+
};
|
|
31
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
32
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
33
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
34
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
35
|
+
function step(op) {
|
|
36
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
37
|
+
while (_) try {
|
|
38
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
39
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
40
|
+
switch (op[0]) {
|
|
41
|
+
case 0: case 1: t = op; break;
|
|
42
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
43
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
44
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
45
|
+
default:
|
|
46
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
47
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
48
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
49
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
50
|
+
if (t[2]) _.ops.pop();
|
|
51
|
+
_.trys.pop(); continue;
|
|
52
|
+
}
|
|
53
|
+
op = body.call(thisArg, _);
|
|
54
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
55
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
var __spreadArrays = (this && this.__spreadArrays) || function () {
|
|
59
|
+
for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
|
|
60
|
+
for (var r = Array(s), k = 0, i = 0; i < il; i++)
|
|
61
|
+
for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
|
|
62
|
+
r[k] = a[j];
|
|
63
|
+
return r;
|
|
64
|
+
};
|
|
65
|
+
exports.__esModule = true;
|
|
66
|
+
exports.processTemplateCardsIfNeeded = exports.sendTemplateCards = exports.updateTemplateCardOnEvent = exports.getTemplateCardFromCache = exports.saveTemplateCardToCache = void 0;
|
|
67
|
+
var template_card_parser_js_1 = require("./template-card-parser.js");
|
|
68
|
+
var const_js_1 = require("./const.js");
|
|
69
|
+
var sentTemplateCardByTaskId = new Map();
|
|
70
|
+
function getTemplateCardCacheKey(accountId, taskId) {
|
|
71
|
+
return accountId + ":" + taskId;
|
|
72
|
+
}
|
|
73
|
+
function pruneTemplateCardCache() {
|
|
74
|
+
var now = Date.now();
|
|
75
|
+
for (var _i = 0, sentTemplateCardByTaskId_1 = sentTemplateCardByTaskId; _i < sentTemplateCardByTaskId_1.length; _i++) {
|
|
76
|
+
var _a = sentTemplateCardByTaskId_1[_i], key = _a[0], entry = _a[1];
|
|
77
|
+
if (now - entry.createdAt >= const_js_1.TEMPLATE_CARD_CACHE_TTL_MS) {
|
|
78
|
+
sentTemplateCardByTaskId["delete"](key);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
if (sentTemplateCardByTaskId.size <= const_js_1.TEMPLATE_CARD_CACHE_MAX_SIZE) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
var sortedEntries = __spreadArrays(sentTemplateCardByTaskId.entries()).sort(function (a, b) { return a[1].createdAt - b[1].createdAt; });
|
|
85
|
+
var removeCount = sentTemplateCardByTaskId.size - const_js_1.TEMPLATE_CARD_CACHE_MAX_SIZE;
|
|
86
|
+
for (var _b = 0, _c = sortedEntries.slice(0, removeCount); _b < _c.length; _b++) {
|
|
87
|
+
var key = _c[_b][0];
|
|
88
|
+
sentTemplateCardByTaskId["delete"](key);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
function cloneTemplateCard(card) {
|
|
92
|
+
return JSON.parse(JSON.stringify(card));
|
|
93
|
+
}
|
|
94
|
+
function saveTemplateCardToCache(params) {
|
|
95
|
+
var _a;
|
|
96
|
+
var accountId = params.accountId, templateCard = params.templateCard, runtime = params.runtime;
|
|
97
|
+
var taskId = templateCard.task_id;
|
|
98
|
+
if (!taskId) {
|
|
99
|
+
(_a = runtime.log) === null || _a === void 0 ? void 0 : _a.call(runtime, "[wecom][template-card] Skip cache: template card has no task_id");
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
sentTemplateCardByTaskId.set(getTemplateCardCacheKey(accountId, taskId), {
|
|
103
|
+
templateCard: cloneTemplateCard(templateCard),
|
|
104
|
+
createdAt: Date.now()
|
|
105
|
+
});
|
|
106
|
+
pruneTemplateCardCache();
|
|
107
|
+
}
|
|
108
|
+
exports.saveTemplateCardToCache = saveTemplateCardToCache;
|
|
109
|
+
function getTemplateCardFromCache(accountId, taskId) {
|
|
110
|
+
pruneTemplateCardCache();
|
|
111
|
+
var cached = sentTemplateCardByTaskId.get(getTemplateCardCacheKey(accountId, taskId));
|
|
112
|
+
if (!cached) {
|
|
113
|
+
return undefined;
|
|
114
|
+
}
|
|
115
|
+
return cloneTemplateCard(cached.templateCard);
|
|
116
|
+
}
|
|
117
|
+
exports.getTemplateCardFromCache = getTemplateCardFromCache;
|
|
118
|
+
function buildSelectedOptionMap(templateCardEvent) {
|
|
119
|
+
var _a, _b, _c, _d, _e, _f;
|
|
120
|
+
var selectedMap = new Map();
|
|
121
|
+
var selectedItems = (_b = (_a = templateCardEvent === null || templateCardEvent === void 0 ? void 0 : templateCardEvent.selected_items) === null || _a === void 0 ? void 0 : _a.selected_item) !== null && _b !== void 0 ? _b : [];
|
|
122
|
+
for (var _i = 0, selectedItems_1 = selectedItems; _i < selectedItems_1.length; _i++) {
|
|
123
|
+
var item = selectedItems_1[_i];
|
|
124
|
+
var questionKey = (_c = item.question_key) === null || _c === void 0 ? void 0 : _c.trim();
|
|
125
|
+
if (!questionKey) {
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
var optionIds = (_f = (_e = (_d = item.option_ids) === null || _d === void 0 ? void 0 : _d.option_id) === null || _e === void 0 ? void 0 : _e.filter(Boolean)) !== null && _f !== void 0 ? _f : [];
|
|
129
|
+
selectedMap.set(questionKey, optionIds);
|
|
130
|
+
}
|
|
131
|
+
return selectedMap;
|
|
132
|
+
}
|
|
133
|
+
function applySelectedStateToTemplateCard(params) {
|
|
134
|
+
var _a, _b, _c, _d, _e;
|
|
135
|
+
var templateCard = params.templateCard, selectedMap = params.selectedMap, templateCardEvent = params.templateCardEvent;
|
|
136
|
+
var nextCard = cloneTemplateCard(templateCard);
|
|
137
|
+
if (templateCardEvent === null || templateCardEvent === void 0 ? void 0 : templateCardEvent.task_id) {
|
|
138
|
+
nextCard.task_id = templateCardEvent.task_id;
|
|
139
|
+
}
|
|
140
|
+
if (templateCardEvent === null || templateCardEvent === void 0 ? void 0 : templateCardEvent.card_type) {
|
|
141
|
+
nextCard.card_type = templateCardEvent.card_type;
|
|
142
|
+
}
|
|
143
|
+
if ((_a = nextCard.submit_button) === null || _a === void 0 ? void 0 : _a.text) {
|
|
144
|
+
nextCard.submit_button.text = "已提交";
|
|
145
|
+
}
|
|
146
|
+
if ((_b = nextCard.checkbox) === null || _b === void 0 ? void 0 : _b.question_key) {
|
|
147
|
+
var selectedIds_1 = (_c = selectedMap.get(nextCard.checkbox.question_key)) !== null && _c !== void 0 ? _c : [];
|
|
148
|
+
nextCard.checkbox.disable = true;
|
|
149
|
+
if (Array.isArray(nextCard.checkbox.option_list)) {
|
|
150
|
+
nextCard.checkbox.option_list = nextCard.checkbox.option_list.map(function (option) { return (__assign(__assign({}, option), { is_checked: selectedIds_1.includes(option.id) })); });
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
if (Array.isArray(nextCard.select_list)) {
|
|
154
|
+
nextCard.select_list = nextCard.select_list.map(function (selection) {
|
|
155
|
+
var _a, _b;
|
|
156
|
+
var selectedIds = (_a = selectedMap.get(selection.question_key)) !== null && _a !== void 0 ? _a : [];
|
|
157
|
+
return __assign(__assign({}, selection), { disable: true, selected_id: (_b = selectedIds[0]) !== null && _b !== void 0 ? _b : selection.selected_id });
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
if ((_d = nextCard.button_selection) === null || _d === void 0 ? void 0 : _d.question_key) {
|
|
161
|
+
var selectedIds = (_e = selectedMap.get(nextCard.button_selection.question_key)) !== null && _e !== void 0 ? _e : [];
|
|
162
|
+
nextCard.button_selection.disable = true;
|
|
163
|
+
if (selectedIds[0]) {
|
|
164
|
+
nextCard.button_selection.selected_id = selectedIds[0];
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return nextCard;
|
|
168
|
+
}
|
|
169
|
+
function updateTemplateCardOnEvent(params) {
|
|
170
|
+
var _a, _b, _c, _d;
|
|
171
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
172
|
+
var frame, accountId, runtime, wsClient, body, templateCardEvent, taskId, cachedCard, selectedMap, updatedCard;
|
|
173
|
+
return __generator(this, function (_e) {
|
|
174
|
+
switch (_e.label) {
|
|
175
|
+
case 0:
|
|
176
|
+
frame = params.frame, accountId = params.accountId, runtime = params.runtime, wsClient = params.wsClient;
|
|
177
|
+
body = frame.body;
|
|
178
|
+
templateCardEvent = (_a = body.event) === null || _a === void 0 ? void 0 : _a.template_card_event;
|
|
179
|
+
taskId = templateCardEvent === null || templateCardEvent === void 0 ? void 0 : templateCardEvent.task_id;
|
|
180
|
+
if (!taskId) {
|
|
181
|
+
(_b = runtime.log) === null || _b === void 0 ? void 0 : _b.call(runtime, "[" + accountId + "] [template-card-update] Skip update: missing task_id in callback");
|
|
182
|
+
return [2 /*return*/];
|
|
183
|
+
}
|
|
184
|
+
cachedCard = getTemplateCardFromCache(accountId, taskId);
|
|
185
|
+
if (!cachedCard) {
|
|
186
|
+
(_c = runtime.log) === null || _c === void 0 ? void 0 : _c.call(runtime, "[" + accountId + "] [template-card-update] Skip update: task_id=" + taskId + " not found in cache (cache is in-memory only, may have been cleared after restart)");
|
|
187
|
+
return [2 /*return*/];
|
|
188
|
+
}
|
|
189
|
+
selectedMap = buildSelectedOptionMap(templateCardEvent);
|
|
190
|
+
updatedCard = applySelectedStateToTemplateCard({
|
|
191
|
+
templateCard: cachedCard,
|
|
192
|
+
selectedMap: selectedMap,
|
|
193
|
+
templateCardEvent: templateCardEvent
|
|
194
|
+
});
|
|
195
|
+
return [4 /*yield*/, wsClient.updateTemplateCard(frame, updatedCard, [body.from.userid])];
|
|
196
|
+
case 1:
|
|
197
|
+
_e.sent();
|
|
198
|
+
(_d = runtime.log) === null || _d === void 0 ? void 0 : _d.call(runtime, "[" + accountId + "] [template-card-update] Updated card by task_id=" + taskId);
|
|
199
|
+
saveTemplateCardToCache({
|
|
200
|
+
accountId: accountId,
|
|
201
|
+
templateCard: updatedCard,
|
|
202
|
+
runtime: runtime
|
|
203
|
+
});
|
|
204
|
+
return [2 /*return*/];
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
exports.updateTemplateCardOnEvent = updateTemplateCardOnEvent;
|
|
210
|
+
// ============================================================================
|
|
211
|
+
// 模板卡片发送
|
|
212
|
+
// ============================================================================
|
|
213
|
+
/**
|
|
214
|
+
* 逐个发送已提取的模板卡片(通过 wsClient.sendMessage 主动推送)
|
|
215
|
+
*
|
|
216
|
+
* 发送失败不阻塞流程,仅记录错误日志。
|
|
217
|
+
*/
|
|
218
|
+
function sendTemplateCards(params) {
|
|
219
|
+
var _a, _b, _c, _d;
|
|
220
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
221
|
+
var wsClient, frame, state, runtime, account, cards, body, chatId, _i, cards_1, card, rawTemplateCard, templateCard, err_1;
|
|
222
|
+
return __generator(this, function (_e) {
|
|
223
|
+
switch (_e.label) {
|
|
224
|
+
case 0:
|
|
225
|
+
wsClient = params.wsClient, frame = params.frame, state = params.state, runtime = params.runtime, account = params.account, cards = params.cards;
|
|
226
|
+
body = frame.body;
|
|
227
|
+
chatId = body.chatid || body.from.userid;
|
|
228
|
+
_i = 0, cards_1 = cards;
|
|
229
|
+
_e.label = 1;
|
|
230
|
+
case 1:
|
|
231
|
+
if (!(_i < cards_1.length)) return [3 /*break*/, 6];
|
|
232
|
+
card = cards_1[_i];
|
|
233
|
+
_e.label = 2;
|
|
234
|
+
case 2:
|
|
235
|
+
_e.trys.push([2, 4, , 5]);
|
|
236
|
+
(_a = runtime.log) === null || _a === void 0 ? void 0 : _a.call(runtime, "[wecom][template-card] Sending card_type=" + card.cardType + " to chatId=" + chatId);
|
|
237
|
+
rawTemplateCard = card.cardJson;
|
|
238
|
+
if (typeof rawTemplateCard.card_type !== "string") {
|
|
239
|
+
(_b = runtime.error) === null || _b === void 0 ? void 0 : _b.call(runtime, "[wecom][template-card] Skip sending invalid card: missing card_type");
|
|
240
|
+
return [3 /*break*/, 5];
|
|
241
|
+
}
|
|
242
|
+
templateCard = rawTemplateCard;
|
|
243
|
+
return [4 /*yield*/, wsClient.sendMessage(chatId, {
|
|
244
|
+
msgtype: "template_card",
|
|
245
|
+
template_card: templateCard
|
|
246
|
+
})];
|
|
247
|
+
case 3:
|
|
248
|
+
_e.sent();
|
|
249
|
+
state.hasTemplateCard = true;
|
|
250
|
+
saveTemplateCardToCache({
|
|
251
|
+
accountId: account.accountId,
|
|
252
|
+
templateCard: templateCard,
|
|
253
|
+
runtime: runtime
|
|
254
|
+
});
|
|
255
|
+
(_c = runtime.log) === null || _c === void 0 ? void 0 : _c.call(runtime, "[wecom][template-card] Card sent successfully: card_type=" + card.cardType);
|
|
256
|
+
return [3 /*break*/, 5];
|
|
257
|
+
case 4:
|
|
258
|
+
err_1 = _e.sent();
|
|
259
|
+
(_d = runtime.error) === null || _d === void 0 ? void 0 : _d.call(runtime, "[wecom][template-card] Failed to send card: card_type=" + card.cardType + ", error=" + JSON.stringify(err_1));
|
|
260
|
+
return [3 /*break*/, 5];
|
|
261
|
+
case 5:
|
|
262
|
+
_i++;
|
|
263
|
+
return [3 /*break*/, 1];
|
|
264
|
+
case 6: return [2 /*return*/];
|
|
265
|
+
}
|
|
266
|
+
});
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
exports.sendTemplateCards = sendTemplateCards;
|
|
270
|
+
// ============================================================================
|
|
271
|
+
// 模板卡片检测与处理(从 finishThinkingStream 中分离)
|
|
272
|
+
// ============================================================================
|
|
273
|
+
/**
|
|
274
|
+
* 从累积文本中检测并发送模板卡片。
|
|
275
|
+
*
|
|
276
|
+
* 在 finishThinkingStream 之前调用,将卡片处理和流关闭解耦。
|
|
277
|
+
*
|
|
278
|
+
* @returns 移除卡片代码块后的剩余文本(如果没有卡片则返回 null,表示无需修改)
|
|
279
|
+
*/
|
|
280
|
+
function processTemplateCardsIfNeeded(params) {
|
|
281
|
+
var _a, _b, _c, _d, _e;
|
|
282
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
283
|
+
var state, runtime, visibleText, logFn, _f, cards, remainingText;
|
|
284
|
+
return __generator(this, function (_g) {
|
|
285
|
+
switch (_g.label) {
|
|
286
|
+
case 0:
|
|
287
|
+
state = params.state, runtime = params.runtime;
|
|
288
|
+
visibleText = (_a = state.accumulatedText) === null || _a === void 0 ? void 0 : _a.trim();
|
|
289
|
+
if (!visibleText) {
|
|
290
|
+
(_b = runtime.log) === null || _b === void 0 ? void 0 : _b.call(runtime, "[wecom][template-card] processTemplateCardsIfNeeded: no visibleText, skipping");
|
|
291
|
+
return [2 /*return*/, null];
|
|
292
|
+
}
|
|
293
|
+
(_c = runtime.log) === null || _c === void 0 ? void 0 : _c.call(runtime, "[wecom][template-card] processTemplateCardsIfNeeded: visibleText exists, length=" + visibleText.length + ", running extractTemplateCards...");
|
|
294
|
+
logFn = function () {
|
|
295
|
+
var _a;
|
|
296
|
+
var args = [];
|
|
297
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
298
|
+
args[_i] = arguments[_i];
|
|
299
|
+
}
|
|
300
|
+
(_a = runtime.log) === null || _a === void 0 ? void 0 : _a.call.apply(_a, __spreadArrays([runtime], args));
|
|
301
|
+
};
|
|
302
|
+
_f = template_card_parser_js_1.extractTemplateCards(state.accumulatedText, logFn), cards = _f.cards, remainingText = _f.remainingText;
|
|
303
|
+
(_d = runtime.log) === null || _d === void 0 ? void 0 : _d.call(runtime, "[wecom][template-card] processTemplateCardsIfNeeded: extractTemplateCards result \u2014 cards=" + cards.length + ", remainingTextLength=" + remainingText.length);
|
|
304
|
+
if (cards.length === 0) {
|
|
305
|
+
return [2 /*return*/, null];
|
|
306
|
+
}
|
|
307
|
+
(_e = runtime.log) === null || _e === void 0 ? void 0 : _e.call(runtime, "[wecom][template-card] processTemplateCardsIfNeeded: " + cards.length + " card(s) detected, card_types=[" + cards.map(function (c) { return c.cardType; }).join(", ") + "]");
|
|
308
|
+
return [4 /*yield*/, sendTemplateCards(__assign(__assign({}, params), { cards: cards }))];
|
|
309
|
+
case 1:
|
|
310
|
+
_g.sent();
|
|
311
|
+
return [2 /*return*/, { remainingText: remainingText, cardsDetected: true }];
|
|
312
|
+
}
|
|
313
|
+
});
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
exports.processTemplateCardsIfNeeded = processTemplateCardsIfNeeded;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 模板卡片解析器
|
|
3
|
+
*
|
|
4
|
+
* 从 LLM 回复文本中提取 markdown JSON 代码块,验证其是否为合法的企业微信模板卡片,
|
|
5
|
+
* 返回提取到的卡片列表和剩余文本。
|
|
6
|
+
*
|
|
7
|
+
* 同时提供 maskTemplateCardBlocks 函数,用于在流式中间帧中隐藏正在构建的卡片代码块,
|
|
8
|
+
* 避免 JSON 源码暴露给终端用户。
|
|
9
|
+
*/
|
|
10
|
+
import type { TemplateCardExtractionResult } from "./interface.js";
|
|
11
|
+
/**
|
|
12
|
+
* 从文本中提取模板卡片 JSON 代码块
|
|
13
|
+
*
|
|
14
|
+
* 匹配规则:
|
|
15
|
+
* 1. 匹配所有 ```json ... ``` 或 ``` ... ``` 格式的代码块
|
|
16
|
+
* 2. 尝试 JSON.parse 解析代码块内容
|
|
17
|
+
* 3. 检查解析结果中是否包含合法的 card_type 字段
|
|
18
|
+
* 4. 合法的卡片从原文中移除,不合法的保留
|
|
19
|
+
*
|
|
20
|
+
* @param text - LLM 回复的完整文本
|
|
21
|
+
* @returns 提取结果,包含卡片列表和剩余文本
|
|
22
|
+
*/
|
|
23
|
+
export declare function extractTemplateCards(text: string, log?: (...args: any[]) => void): TemplateCardExtractionResult;
|
|
24
|
+
/**
|
|
25
|
+
* 遮罩文本中的模板卡片代码块(用于流式中间帧展示)
|
|
26
|
+
*
|
|
27
|
+
* 在 LLM 流式输出过程中,累积文本可能包含:
|
|
28
|
+
* 1. 已闭合的模板卡片 JSON 代码块 → 替换为友好提示文本
|
|
29
|
+
* 2. 正在构建中的未闭合代码块 → 截断隐藏,避免 JSON 源码暴露
|
|
30
|
+
*
|
|
31
|
+
* 此函数仅做文本替换,不做 JSON 解析验证(中间帧性能优先)。
|
|
32
|
+
* 只要代码块内容中出现 "card_type" 关键词就认为是模板卡片并遮罩。
|
|
33
|
+
*
|
|
34
|
+
* @param text - 当前累积文本
|
|
35
|
+
* @returns 遮罩后的展示文本
|
|
36
|
+
*/
|
|
37
|
+
export declare function maskTemplateCardBlocks(text: string, log?: (...args: any[]) => void): string;
|