@tencent-weixin/openclaw-weixin 2.3.1 → 2.4.2
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/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/src/api/api.js +374 -0
- package/dist/src/api/api.js.map +1 -0
- package/dist/src/api/config-cache.js +64 -0
- package/dist/src/api/config-cache.js.map +1 -0
- package/dist/src/api/session-guard.js +49 -0
- package/dist/src/api/session-guard.js.map +1 -0
- package/dist/src/api/types.js +35 -0
- package/dist/src/api/types.js.map +1 -0
- package/dist/src/auth/accounts.js +326 -0
- package/dist/src/auth/accounts.js.map +1 -0
- package/dist/src/auth/login-qr.js +332 -0
- package/dist/src/auth/login-qr.js.map +1 -0
- package/dist/src/auth/pairing.js +104 -0
- package/dist/src/auth/pairing.js.map +1 -0
- package/dist/src/cdn/aes-ecb.js +19 -0
- package/dist/src/cdn/aes-ecb.js.map +1 -0
- package/dist/src/cdn/cdn-upload.js +73 -0
- package/dist/src/cdn/cdn-upload.js.map +1 -0
- package/dist/src/cdn/cdn-url.js +14 -0
- package/dist/src/cdn/cdn-url.js.map +1 -0
- package/dist/src/cdn/pic-decrypt.js +89 -0
- package/dist/src/cdn/pic-decrypt.js.map +1 -0
- package/dist/src/cdn/upload.js +106 -0
- package/dist/src/cdn/upload.js.map +1 -0
- package/dist/src/channel.js +460 -0
- package/dist/src/channel.js.map +1 -0
- package/dist/src/compat.js +67 -0
- package/dist/src/compat.js.map +1 -0
- package/dist/src/config/config-schema.js +19 -0
- package/dist/src/config/config-schema.js.map +1 -0
- package/dist/src/media/media-download.js +95 -0
- package/dist/src/media/media-download.js.map +1 -0
- package/dist/src/media/mime.js +73 -0
- package/dist/src/media/mime.js.map +1 -0
- package/dist/src/media/silk-transcode.js +64 -0
- package/dist/src/media/silk-transcode.js.map +1 -0
- package/dist/src/media/voice-outbound.js +177 -0
- package/dist/src/media/voice-outbound.js.map +1 -0
- package/dist/src/messaging/abort-fence.js +70 -0
- package/dist/src/messaging/abort-fence.js.map +1 -0
- package/dist/src/messaging/buttons.js +117 -0
- package/dist/src/messaging/buttons.js.map +1 -0
- package/dist/src/messaging/debug-mode.js +63 -0
- package/dist/src/messaging/debug-mode.js.map +1 -0
- package/dist/src/messaging/error-notice.js +24 -0
- package/dist/src/messaging/error-notice.js.map +1 -0
- package/dist/src/messaging/inbound.js +201 -0
- package/dist/src/messaging/inbound.js.map +1 -0
- package/dist/src/messaging/lane-key.js +66 -0
- package/dist/src/messaging/lane-key.js.map +1 -0
- package/dist/src/messaging/markdown-filter.js +368 -0
- package/dist/src/messaging/markdown-filter.js.map +1 -0
- package/dist/src/messaging/merged-record.js +149 -0
- package/dist/src/messaging/merged-record.js.map +1 -0
- package/dist/src/messaging/model-buttons.js +182 -0
- package/dist/src/messaging/model-buttons.js.map +1 -0
- package/dist/src/messaging/model-callback-handler.js +133 -0
- package/dist/src/messaging/model-callback-handler.js.map +1 -0
- package/dist/src/messaging/outbound-hooks.js +56 -0
- package/dist/src/messaging/outbound-hooks.js.map +1 -0
- package/dist/src/messaging/process-message.js +381 -0
- package/dist/src/messaging/process-message.js.map +1 -0
- package/dist/src/messaging/send-media.js +54 -0
- package/dist/src/messaging/send-media.js.map +1 -0
- package/dist/src/messaging/send.js +182 -0
- package/dist/src/messaging/send.js.map +1 -0
- package/dist/src/messaging/slash-commands.js +70 -0
- package/dist/src/messaging/slash-commands.js.map +1 -0
- package/dist/src/monitor/lane-scheduler.js +46 -0
- package/dist/src/monitor/lane-scheduler.js.map +1 -0
- package/dist/src/monitor/monitor.js +143 -0
- package/dist/src/monitor/monitor.js.map +1 -0
- package/dist/src/runtime.js +54 -0
- package/dist/src/runtime.js.map +1 -0
- package/dist/src/storage/state-dir.js +9 -0
- package/dist/src/storage/state-dir.js.map +1 -0
- package/dist/src/storage/sync-buf.js +64 -0
- package/dist/src/storage/sync-buf.js.map +1 -0
- package/dist/src/streaming/stream-pipeline.js +431 -0
- package/dist/src/streaming/stream-pipeline.js.map +1 -0
- package/dist/src/streaming/stream-session.js +260 -0
- package/dist/src/streaming/stream-session.js.map +1 -0
- package/dist/src/streaming/stream.js +239 -0
- package/dist/src/streaming/stream.js.map +1 -0
- package/dist/src/util/logger.js +120 -0
- package/dist/src/util/logger.js.map +1 -0
- package/dist/src/util/markdown-fences.js +54 -0
- package/dist/src/util/markdown-fences.js.map +1 -0
- package/dist/src/util/random.js +16 -0
- package/dist/src/util/random.js.map +1 -0
- package/dist/src/util/redact.js +54 -0
- package/dist/src/util/redact.js.map +1 -0
- package/index.ts +0 -5
- package/openclaw.plugin.json +11 -1
- package/package.json +9 -2
- package/src/api/api.ts +2 -3
- package/src/auth/accounts.ts +0 -1
- package/src/channel.ts +13 -1
- package/src/monitor/monitor.ts +11 -10
- package/src/runtime.ts +0 -70
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model selection buttons for Weixin.
|
|
3
|
+
*
|
|
4
|
+
* Reuses the same mdl_* callback_data format as Telegram so that core
|
|
5
|
+
* helpers (buildModelsProviderData, formatModelsAvailableHeader) can be
|
|
6
|
+
* shared directly.
|
|
7
|
+
*
|
|
8
|
+
* Callback data patterns:
|
|
9
|
+
* - mdl_prov - show providers list
|
|
10
|
+
* - mdl_list_{prov}_{pg} - show models for provider (page N, 1-indexed)
|
|
11
|
+
* - mdl_sel_{provider/id} - select model
|
|
12
|
+
* - mdl_back - back to providers list
|
|
13
|
+
*/
|
|
14
|
+
const MODELS_PAGE_SIZE = 8;
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// Callback data parsing
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
export function parseModelCallbackData(data) {
|
|
19
|
+
const trimmed = data.trim();
|
|
20
|
+
if (!trimmed.startsWith("mdl_"))
|
|
21
|
+
return null;
|
|
22
|
+
if (trimmed === "mdl_prov" || trimmed === "mdl_back") {
|
|
23
|
+
return { type: trimmed === "mdl_prov" ? "providers" : "back" };
|
|
24
|
+
}
|
|
25
|
+
const listMatch = trimmed.match(/^mdl_list_([a-z0-9_-]+)_(\d+)$/i);
|
|
26
|
+
if (listMatch) {
|
|
27
|
+
const [, provider, pageStr] = listMatch;
|
|
28
|
+
const page = Number.parseInt(pageStr ?? "1", 10);
|
|
29
|
+
if (provider && Number.isFinite(page) && page >= 1) {
|
|
30
|
+
return { type: "list", provider, page };
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const selMatch = trimmed.match(/^mdl_sel_(.+)$/);
|
|
34
|
+
if (selMatch) {
|
|
35
|
+
const modelRef = selMatch[1];
|
|
36
|
+
if (modelRef) {
|
|
37
|
+
const slashIndex = modelRef.indexOf("/");
|
|
38
|
+
if (slashIndex > 0 && slashIndex < modelRef.length - 1) {
|
|
39
|
+
return {
|
|
40
|
+
type: "select",
|
|
41
|
+
provider: modelRef.slice(0, slashIndex),
|
|
42
|
+
model: modelRef.slice(slashIndex + 1),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
return { type: "select", model: modelRef };
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
// ---------------------------------------------------------------------------
|
|
51
|
+
// Keyboard builders
|
|
52
|
+
// ---------------------------------------------------------------------------
|
|
53
|
+
export function buildProviderKeyboard(providers) {
|
|
54
|
+
if (providers.length === 0)
|
|
55
|
+
return [];
|
|
56
|
+
const rows = [];
|
|
57
|
+
let currentRow = [];
|
|
58
|
+
for (const provider of providers) {
|
|
59
|
+
currentRow.push({
|
|
60
|
+
text: `${provider.id} (${provider.count})`,
|
|
61
|
+
callback_data: `mdl_list_${provider.id}_1`,
|
|
62
|
+
});
|
|
63
|
+
if (currentRow.length === 2) {
|
|
64
|
+
rows.push(currentRow);
|
|
65
|
+
currentRow = [];
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (currentRow.length > 0)
|
|
69
|
+
rows.push(currentRow);
|
|
70
|
+
return rows;
|
|
71
|
+
}
|
|
72
|
+
function truncateModelId(modelId, maxLen) {
|
|
73
|
+
if (modelId.length <= maxLen)
|
|
74
|
+
return modelId;
|
|
75
|
+
return `…${modelId.slice(-(maxLen - 1))}`;
|
|
76
|
+
}
|
|
77
|
+
export function buildModelsKeyboard(params) {
|
|
78
|
+
const { provider, models, currentModel, currentPage, totalPages, modelNames } = params;
|
|
79
|
+
const pageSize = params.pageSize ?? MODELS_PAGE_SIZE;
|
|
80
|
+
if (models.length === 0) {
|
|
81
|
+
return [[{ text: "<< Back", callback_data: "mdl_back" }]];
|
|
82
|
+
}
|
|
83
|
+
const rows = [];
|
|
84
|
+
const startIndex = (currentPage - 1) * pageSize;
|
|
85
|
+
const endIndex = Math.min(startIndex + pageSize, models.length);
|
|
86
|
+
const pageModels = models.slice(startIndex, endIndex);
|
|
87
|
+
for (const model of pageModels) {
|
|
88
|
+
const callbackData = `mdl_sel_${provider}/${model}`;
|
|
89
|
+
const isCurrentModel = currentModel
|
|
90
|
+
? currentModel.includes("/")
|
|
91
|
+
? currentModel === `${provider}/${model}`
|
|
92
|
+
: currentModel === model
|
|
93
|
+
: false;
|
|
94
|
+
const displayLabel = modelNames?.get(`${provider}/${model}`) ?? model;
|
|
95
|
+
const displayText = truncateModelId(displayLabel, 38);
|
|
96
|
+
const text = isCurrentModel ? `${displayText} ✓` : displayText;
|
|
97
|
+
rows.push([{ text, callback_data: callbackData }]);
|
|
98
|
+
}
|
|
99
|
+
if (totalPages > 1) {
|
|
100
|
+
const paginationRow = [];
|
|
101
|
+
if (currentPage > 1) {
|
|
102
|
+
paginationRow.push({
|
|
103
|
+
text: "◀ Prev",
|
|
104
|
+
callback_data: `mdl_list_${provider}_${currentPage - 1}`,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
paginationRow.push({
|
|
108
|
+
text: `${currentPage}/${totalPages}`,
|
|
109
|
+
callback_data: `mdl_list_${provider}_${currentPage}`,
|
|
110
|
+
});
|
|
111
|
+
if (currentPage < totalPages) {
|
|
112
|
+
paginationRow.push({
|
|
113
|
+
text: "Next ▶",
|
|
114
|
+
callback_data: `mdl_list_${provider}_${currentPage + 1}`,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
rows.push(paginationRow);
|
|
118
|
+
}
|
|
119
|
+
rows.push([{ text: "<< Back", callback_data: "mdl_back" }]);
|
|
120
|
+
return rows;
|
|
121
|
+
}
|
|
122
|
+
export function buildBrowseProvidersButton() {
|
|
123
|
+
return [[{ text: "Browse providers", callback_data: "mdl_prov" }]];
|
|
124
|
+
}
|
|
125
|
+
export function getModelsPageSize() {
|
|
126
|
+
return MODELS_PAGE_SIZE;
|
|
127
|
+
}
|
|
128
|
+
export function calculateTotalPages(totalModels, pageSize) {
|
|
129
|
+
const size = pageSize ?? MODELS_PAGE_SIZE;
|
|
130
|
+
return size > 0 ? Math.ceil(totalModels / size) : 1;
|
|
131
|
+
}
|
|
132
|
+
// ---------------------------------------------------------------------------
|
|
133
|
+
// channelData builders (used by plugin.commands adapter)
|
|
134
|
+
// ---------------------------------------------------------------------------
|
|
135
|
+
export function buildWeixinModelsProviderChannelData(params) {
|
|
136
|
+
if (params.providers.length === 0)
|
|
137
|
+
return null;
|
|
138
|
+
return { "openclaw-weixin": { buttons: buildProviderKeyboard(params.providers) } };
|
|
139
|
+
}
|
|
140
|
+
export function buildWeixinModelsListChannelData(params) {
|
|
141
|
+
return { "openclaw-weixin": { buttons: buildModelsKeyboard(params) } };
|
|
142
|
+
}
|
|
143
|
+
export function buildWeixinModelBrowseChannelData() {
|
|
144
|
+
return { "openclaw-weixin": { buttons: buildBrowseProvidersButton() } };
|
|
145
|
+
}
|
|
146
|
+
export function buildWeixinCommandsListChannelData(params) {
|
|
147
|
+
if (params.totalPages <= 1)
|
|
148
|
+
return null;
|
|
149
|
+
const buttons = [];
|
|
150
|
+
const suffix = params.agentId ? `:${params.agentId}` : "";
|
|
151
|
+
if (params.currentPage > 1) {
|
|
152
|
+
buttons.push({
|
|
153
|
+
text: "◀ Prev",
|
|
154
|
+
callback_data: `commands_page_${params.currentPage - 1}${suffix}`,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
buttons.push({
|
|
158
|
+
text: `${params.currentPage}/${params.totalPages}`,
|
|
159
|
+
callback_data: `commands_page_noop${suffix}`,
|
|
160
|
+
});
|
|
161
|
+
if (params.currentPage < params.totalPages) {
|
|
162
|
+
buttons.push({
|
|
163
|
+
text: "Next ▶",
|
|
164
|
+
callback_data: `commands_page_${params.currentPage + 1}${suffix}`,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
return { "openclaw-weixin": { buttons: [buttons] } };
|
|
168
|
+
}
|
|
169
|
+
// ---------------------------------------------------------------------------
|
|
170
|
+
// Model selection resolution (when provider is ambiguous)
|
|
171
|
+
// ---------------------------------------------------------------------------
|
|
172
|
+
export function resolveModelSelection(params) {
|
|
173
|
+
if (params.callback.provider) {
|
|
174
|
+
return { kind: "resolved", provider: params.callback.provider, model: params.callback.model };
|
|
175
|
+
}
|
|
176
|
+
const matchingProviders = params.providers.filter((id) => params.byProvider.get(id)?.has(params.callback.model));
|
|
177
|
+
if (matchingProviders.length === 1) {
|
|
178
|
+
return { kind: "resolved", provider: matchingProviders[0], model: params.callback.model };
|
|
179
|
+
}
|
|
180
|
+
return { kind: "ambiguous", model: params.callback.model, matchingProviders };
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=model-buttons.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-buttons.js","sourceRoot":"","sources":["../../../src/messaging/model-buttons.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAcH,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAE3B,8EAA8E;AAC9E,wBAAwB;AACxB,8EAA8E;AAE9E,MAAM,UAAU,sBAAsB,CAAC,IAAY;IACjD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IAE7C,IAAI,OAAO,KAAK,UAAU,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;QACrD,OAAO,EAAE,IAAI,EAAE,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACjE,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACnE,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;QACxC,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;QACjD,IAAI,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;YACnD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACjD,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACzC,IAAI,UAAU,GAAG,CAAC,IAAI,UAAU,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvD,OAAO;oBACL,IAAI,EAAE,QAAQ;oBACd,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC;oBACvC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC;iBACtC,CAAC;YACJ,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E,MAAM,UAAU,qBAAqB,CAAC,SAAyB;IAC7D,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACtC,MAAM,IAAI,GAAgB,EAAE,CAAC;IAC7B,IAAI,UAAU,GAAc,EAAE,CAAC;IAC/B,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,UAAU,CAAC,IAAI,CAAC;YACd,IAAI,EAAE,GAAG,QAAQ,CAAC,EAAE,KAAK,QAAQ,CAAC,KAAK,GAAG;YAC1C,aAAa,EAAE,YAAY,QAAQ,CAAC,EAAE,IAAI;SAC3C,CAAC,CAAC;QACH,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACtB,UAAU,GAAG,EAAE,CAAC;QAClB,CAAC;IACH,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;QAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACjD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,eAAe,CAAC,OAAe,EAAE,MAAc;IACtD,IAAI,OAAO,CAAC,MAAM,IAAI,MAAM;QAAE,OAAO,OAAO,CAAC;IAC7C,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAQnC;IACC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;IACvF,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,gBAAgB,CAAC;IAErD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,IAAI,GAAgB,EAAE,CAAC;IAC7B,MAAM,UAAU,GAAG,CAAC,WAAW,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC;IAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAChE,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAEtD,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;QAC/B,MAAM,YAAY,GAAG,WAAW,QAAQ,IAAI,KAAK,EAAE,CAAC;QACpD,MAAM,cAAc,GAAG,YAAY;YACjC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAC1B,CAAC,CAAC,YAAY,KAAK,GAAG,QAAQ,IAAI,KAAK,EAAE;gBACzC,CAAC,CAAC,YAAY,KAAK,KAAK;YAC1B,CAAC,CAAC,KAAK,CAAC;QACV,MAAM,YAAY,GAAG,UAAU,EAAE,GAAG,CAAC,GAAG,QAAQ,IAAI,KAAK,EAAE,CAAC,IAAI,KAAK,CAAC;QACtE,MAAM,WAAW,GAAG,eAAe,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,WAAW,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC;QAC/D,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACnB,MAAM,aAAa,GAAc,EAAE,CAAC;QACpC,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;YACpB,aAAa,CAAC,IAAI,CAAC;gBACjB,IAAI,EAAE,QAAQ;gBACd,aAAa,EAAE,YAAY,QAAQ,IAAI,WAAW,GAAG,CAAC,EAAE;aACzD,CAAC,CAAC;QACL,CAAC;QACD,aAAa,CAAC,IAAI,CAAC;YACjB,IAAI,EAAE,GAAG,WAAW,IAAI,UAAU,EAAE;YACpC,aAAa,EAAE,YAAY,QAAQ,IAAI,WAAW,EAAE;SACrD,CAAC,CAAC;QACH,IAAI,WAAW,GAAG,UAAU,EAAE,CAAC;YAC7B,aAAa,CAAC,IAAI,CAAC;gBACjB,IAAI,EAAE,QAAQ;gBACd,aAAa,EAAE,YAAY,QAAQ,IAAI,WAAW,GAAG,CAAC,EAAE;aACzD,CAAC,CAAC;QACL,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC3B,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;IAC5D,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,0BAA0B;IACxC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,WAAmB,EAAE,QAAiB;IACxE,MAAM,IAAI,GAAG,QAAQ,IAAI,gBAAgB,CAAC;IAC1C,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,8EAA8E;AAC9E,yDAAyD;AACzD,8EAA8E;AAE9E,MAAM,UAAU,oCAAoC,CAAC,MAEpD;IACC,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/C,OAAO,EAAE,iBAAiB,EAAE,EAAE,OAAO,EAAE,qBAAqB,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;AACrF,CAAC;AAED,MAAM,UAAU,gCAAgC,CAAC,MAQhD;IACC,OAAO,EAAE,iBAAiB,EAAE,EAAE,OAAO,EAAE,mBAAmB,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,iCAAiC;IAC/C,OAAO,EAAE,iBAAiB,EAAE,EAAE,OAAO,EAAE,0BAA0B,EAAE,EAAE,EAAE,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,kCAAkC,CAAC,MAIlD;IACC,IAAI,MAAM,CAAC,UAAU,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,MAAM,OAAO,GAAc,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1D,IAAI,MAAM,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,QAAQ;YACd,aAAa,EAAE,iBAAiB,MAAM,CAAC,WAAW,GAAG,CAAC,GAAG,MAAM,EAAE;SAClE,CAAC,CAAC;IACL,CAAC;IACD,OAAO,CAAC,IAAI,CAAC;QACX,IAAI,EAAE,GAAG,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,UAAU,EAAE;QAClD,aAAa,EAAE,qBAAqB,MAAM,EAAE;KAC7C,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;QAC3C,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,QAAQ;YACd,aAAa,EAAE,iBAAiB,MAAM,CAAC,WAAW,GAAG,CAAC,GAAG,MAAM,EAAE;SAClE,CAAC,CAAC;IACL,CAAC;IACD,OAAO,EAAE,iBAAiB,EAAE,EAAE,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;AACvD,CAAC;AAED,8EAA8E;AAC9E,0DAA0D;AAC1D,8EAA8E;AAE9E,MAAM,UAAU,qBAAqB,CAAC,MAIrC;IACC,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAC7B,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IAChG,CAAC;IACD,MAAM,iBAAiB,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CACvD,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CACtD,CAAC;IACF,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IAC5F,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,iBAAiB,EAAE,CAAC;AAChF,CAAC"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handle mdl_* button callbacks for /model interactive flow.
|
|
3
|
+
*
|
|
4
|
+
* When a user taps a model-selection button, the BUTTON_CALLBACK arrives
|
|
5
|
+
* as an inbound message with call_back_data = "mdl_...". We intercept
|
|
6
|
+
* it here, build the next response (provider list / model list / confirmation),
|
|
7
|
+
* and send a NEW message (no editing).
|
|
8
|
+
*/
|
|
9
|
+
import { buildModelsProviderData, formatModelsAvailableHeader } from "openclaw/plugin-sdk/models-provider-runtime";
|
|
10
|
+
import { resolveAgentDir, resolveDefaultModelForAgent } from "openclaw/plugin-sdk/agent-runtime";
|
|
11
|
+
import { applyModelOverrideToSessionEntry, updateSessionStore, resolveStorePath, } from "openclaw/plugin-sdk/config-runtime";
|
|
12
|
+
import { logger } from "../util/logger.js";
|
|
13
|
+
import { sendMessageWeixin } from "./send.js";
|
|
14
|
+
import { getContextToken } from "./inbound.js";
|
|
15
|
+
import { parseModelCallbackData, buildProviderKeyboard, buildModelsKeyboard, calculateTotalPages, getModelsPageSize, resolveModelSelection, } from "./model-buttons.js";
|
|
16
|
+
/**
|
|
17
|
+
* Try to handle an inbound message as a model callback.
|
|
18
|
+
* Returns true if the callback was handled, false otherwise.
|
|
19
|
+
*/
|
|
20
|
+
export async function handleModelCallback(callbackData, deps) {
|
|
21
|
+
const parsed = parseModelCallbackData(callbackData);
|
|
22
|
+
if (!parsed)
|
|
23
|
+
return false;
|
|
24
|
+
const contextToken = getContextToken(deps.accountId, deps.to);
|
|
25
|
+
const sendOpts = { baseUrl: deps.baseUrl, token: deps.token, contextToken };
|
|
26
|
+
const modelData = await buildModelsProviderData(deps.cfg, deps.agentId);
|
|
27
|
+
const { byProvider, providers } = modelData;
|
|
28
|
+
const sendWithButtons = async (text, buttons) => {
|
|
29
|
+
await sendMessageWeixin({
|
|
30
|
+
to: deps.to,
|
|
31
|
+
text,
|
|
32
|
+
opts: sendOpts,
|
|
33
|
+
buttons: buttons.length > 0 ? buttons : undefined,
|
|
34
|
+
});
|
|
35
|
+
};
|
|
36
|
+
if (parsed.type === "providers" || parsed.type === "back") {
|
|
37
|
+
if (providers.length === 0) {
|
|
38
|
+
await sendWithButtons("No providers available.", []);
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
const providerInfos = providers.map((p) => ({
|
|
42
|
+
id: p,
|
|
43
|
+
count: byProvider.get(p)?.size ?? 0,
|
|
44
|
+
}));
|
|
45
|
+
await sendWithButtons("Select a provider:", buildProviderKeyboard(providerInfos));
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
if (parsed.type === "list") {
|
|
49
|
+
const { provider, page } = parsed;
|
|
50
|
+
const modelSet = byProvider.get(provider);
|
|
51
|
+
if (!modelSet || modelSet.size === 0) {
|
|
52
|
+
const providerInfos = providers.map((p) => ({
|
|
53
|
+
id: p,
|
|
54
|
+
count: byProvider.get(p)?.size ?? 0,
|
|
55
|
+
}));
|
|
56
|
+
await sendWithButtons(`Unknown provider: ${provider}\n\nSelect a provider:`, buildProviderKeyboard(providerInfos));
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
const models = [...modelSet].toSorted();
|
|
60
|
+
const pageSize = getModelsPageSize();
|
|
61
|
+
const totalPages = calculateTotalPages(models.length, pageSize);
|
|
62
|
+
const safePage = Math.max(1, Math.min(page, totalPages));
|
|
63
|
+
const currentModel = undefined; // TODO: resolve from session if needed
|
|
64
|
+
const buttons = buildModelsKeyboard({
|
|
65
|
+
provider,
|
|
66
|
+
models,
|
|
67
|
+
currentModel,
|
|
68
|
+
currentPage: safePage,
|
|
69
|
+
totalPages,
|
|
70
|
+
pageSize,
|
|
71
|
+
modelNames: modelData.modelNames,
|
|
72
|
+
});
|
|
73
|
+
const text = formatModelsAvailableHeader({
|
|
74
|
+
provider,
|
|
75
|
+
total: models.length,
|
|
76
|
+
cfg: deps.cfg,
|
|
77
|
+
agentDir: deps.agentId ? resolveAgentDir(deps.cfg, deps.agentId) : undefined,
|
|
78
|
+
});
|
|
79
|
+
await sendWithButtons(text, buttons);
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
if (parsed.type === "select") {
|
|
83
|
+
const selection = resolveModelSelection({
|
|
84
|
+
callback: parsed,
|
|
85
|
+
providers,
|
|
86
|
+
byProvider,
|
|
87
|
+
});
|
|
88
|
+
if (selection.kind !== "resolved") {
|
|
89
|
+
const providerInfos = providers.map((p) => ({
|
|
90
|
+
id: p,
|
|
91
|
+
count: byProvider.get(p)?.size ?? 0,
|
|
92
|
+
}));
|
|
93
|
+
await sendWithButtons(`Could not resolve model "${selection.model}".\n\nSelect a provider:`, buildProviderKeyboard(providerInfos));
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
const modelSet = byProvider.get(selection.provider);
|
|
97
|
+
if (!modelSet?.has(selection.model)) {
|
|
98
|
+
await sendWithButtons(`❌ Model "${selection.provider}/${selection.model}" is not allowed.`, []);
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
try {
|
|
102
|
+
const storePath = resolveStorePath(deps.cfg.session?.store, { agentId: deps.agentId }) ?? "";
|
|
103
|
+
const resolvedDefault = resolveDefaultModelForAgent({ cfg: deps.cfg, agentId: deps.agentId });
|
|
104
|
+
const isDefaultSelection = selection.provider === resolvedDefault.provider &&
|
|
105
|
+
selection.model === resolvedDefault.model;
|
|
106
|
+
await updateSessionStore(storePath, (store) => {
|
|
107
|
+
if (!deps.sessionKey)
|
|
108
|
+
return;
|
|
109
|
+
const entry = store[deps.sessionKey] ?? {};
|
|
110
|
+
store[deps.sessionKey] = entry;
|
|
111
|
+
applyModelOverrideToSessionEntry({
|
|
112
|
+
entry,
|
|
113
|
+
selection: {
|
|
114
|
+
provider: selection.provider,
|
|
115
|
+
model: selection.model,
|
|
116
|
+
isDefault: isDefaultSelection,
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
const actionText = isDefaultSelection
|
|
121
|
+
? "reset to default"
|
|
122
|
+
: `changed to ${selection.provider}/${selection.model}`;
|
|
123
|
+
await sendWithButtons(`✅ Model ${actionText}\n\nThis model will be used for your next message.`, []);
|
|
124
|
+
}
|
|
125
|
+
catch (err) {
|
|
126
|
+
logger.error(`handleModelCallback: failed to set model: ${String(err)}`);
|
|
127
|
+
await sendWithButtons(`❌ Failed to set model: ${String(err)}`, []);
|
|
128
|
+
}
|
|
129
|
+
return true;
|
|
130
|
+
}
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=model-callback-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-callback-handler.js","sourceRoot":"","sources":["../../../src/messaging/model-callback-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,uBAAuB,EAAE,2BAA2B,EAAE,MAAM,6CAA6C,CAAC;AACnH,OAAO,EAAE,eAAe,EAAE,2BAA2B,EAAE,MAAM,mCAAmC,CAAC;AACjG,OAAO,EACL,gCAAgC,EAChC,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,oCAAoC,CAAC;AAG5C,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,qBAAqB,GAGtB,MAAM,oBAAoB,CAAC;AAY5B;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,YAAoB,EACpB,IAAuB;IAEvB,MAAM,MAAM,GAAG,sBAAsB,CAAC,YAAY,CAAC,CAAC;IACpD,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAE1B,MAAM,YAAY,GAAG,eAAe,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,YAAY,EAAE,CAAC;IAE5E,MAAM,SAAS,GAAG,MAAM,uBAAuB,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACxE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC;IAE5C,MAAM,eAAe,GAAG,KAAK,EAAE,IAAY,EAAE,OAAoB,EAAE,EAAE;QACnE,MAAM,iBAAiB,CAAC;YACtB,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI;YACJ,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;SAClD,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC1D,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,eAAe,CAAC,yBAAyB,EAAE,EAAE,CAAC,CAAC;YACrD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,aAAa,GAAmB,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC1D,EAAE,EAAE,CAAC;YACL,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC;SACpC,CAAC,CAAC,CAAC;QACJ,MAAM,eAAe,CAAC,oBAAoB,EAAE,qBAAqB,CAAC,aAAa,CAAC,CAAC,CAAC;QAClF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC3B,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;QAClC,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACrC,MAAM,aAAa,GAAmB,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC1D,EAAE,EAAE,CAAC;gBACL,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC;aACpC,CAAC,CAAC,CAAC;YACJ,MAAM,eAAe,CACnB,qBAAqB,QAAQ,wBAAwB,EACrD,qBAAqB,CAAC,aAAa,CAAC,CACrC,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAC;QACrC,MAAM,UAAU,GAAG,mBAAmB,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;QAEzD,MAAM,YAAY,GAAG,SAAS,CAAC,CAAC,uCAAuC;QACvE,MAAM,OAAO,GAAG,mBAAmB,CAAC;YAClC,QAAQ;YACR,MAAM;YACN,YAAY;YACZ,WAAW,EAAE,QAAQ;YACrB,UAAU;YACV,QAAQ;YACR,UAAU,EAAE,SAAS,CAAC,UAAU;SACjC,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,2BAA2B,CAAC;YACvC,QAAQ;YACR,KAAK,EAAE,MAAM,CAAC,MAAM;YACpB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;SAC7E,CAAC,CAAC;QACH,MAAM,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,qBAAqB,CAAC;YACtC,QAAQ,EAAE,MAAM;YAChB,SAAS;YACT,UAAU;SACX,CAAC,CAAC;QACH,IAAI,SAAS,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAClC,MAAM,aAAa,GAAmB,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC1D,EAAE,EAAE,CAAC;gBACL,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC;aACpC,CAAC,CAAC,CAAC;YACJ,MAAM,eAAe,CACnB,4BAA4B,SAAS,CAAC,KAAK,0BAA0B,EACrE,qBAAqB,CAAC,aAAa,CAAC,CACrC,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACpD,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YACpC,MAAM,eAAe,CACnB,YAAY,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,KAAK,mBAAmB,EACpE,EAAE,CACH,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC;YAC7F,MAAM,eAAe,GAAG,2BAA2B,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YAC9F,MAAM,kBAAkB,GACtB,SAAS,CAAC,QAAQ,KAAK,eAAe,CAAC,QAAQ;gBAC/C,SAAS,CAAC,KAAK,KAAK,eAAe,CAAC,KAAK,CAAC;YAE5C,MAAM,kBAAkB,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;gBAC5C,IAAI,CAAC,IAAI,CAAC,UAAU;oBAAE,OAAO;gBAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;gBAC3C,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC;gBAC/B,gCAAgC,CAAC;oBAC/B,KAAK;oBACL,SAAS,EAAE;wBACT,QAAQ,EAAE,SAAS,CAAC,QAAQ;wBAC5B,KAAK,EAAE,SAAS,CAAC,KAAK;wBACtB,SAAS,EAAE,kBAAkB;qBAC9B;iBACF,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,MAAM,UAAU,GAAG,kBAAkB;gBACnC,CAAC,CAAC,kBAAkB;gBACpB,CAAC,CAAC,cAAc,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;YAC1D,MAAM,eAAe,CACnB,WAAW,UAAU,oDAAoD,EACzE,EAAE,CACH,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,6CAA6C,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACzE,MAAM,eAAe,CAAC,0BAA0B,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACrE,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { fireAndForgetHook, buildCanonicalSentMessageHookContext, toPluginMessageContext, toPluginMessageSentEvent, } from "openclaw/plugin-sdk/hook-runtime";
|
|
2
|
+
import { getGlobalHookRunner } from "openclaw/plugin-sdk/plugin-runtime";
|
|
3
|
+
import { logger } from "../util/logger.js";
|
|
4
|
+
const CHANNEL_ID = "openclaw-weixin";
|
|
5
|
+
/**
|
|
6
|
+
* Run message_sending hook before sending.
|
|
7
|
+
* Returns the (possibly modified) text content plus a cancelled flag.
|
|
8
|
+
* Hook errors are caught and logged — sending proceeds regardless.
|
|
9
|
+
*/
|
|
10
|
+
export async function applyWeixinMessageSendingHook(params) {
|
|
11
|
+
const hookRunner = getGlobalHookRunner();
|
|
12
|
+
if (!hookRunner?.hasHooks("message_sending")) {
|
|
13
|
+
return { cancelled: false, text: params.text };
|
|
14
|
+
}
|
|
15
|
+
try {
|
|
16
|
+
const hookResult = await hookRunner.runMessageSending({
|
|
17
|
+
to: params.to,
|
|
18
|
+
content: params.text,
|
|
19
|
+
metadata: {
|
|
20
|
+
channel: CHANNEL_ID,
|
|
21
|
+
accountId: params.accountId,
|
|
22
|
+
...(params.mediaUrl ? { mediaUrls: [params.mediaUrl] } : {}),
|
|
23
|
+
},
|
|
24
|
+
}, { channelId: CHANNEL_ID, accountId: params.accountId });
|
|
25
|
+
if (hookResult?.cancel) {
|
|
26
|
+
return { cancelled: true, text: params.text };
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
cancelled: false,
|
|
30
|
+
text: hookResult?.content ?? params.text,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
logger.warn(`message_sending hook error, proceeding with send: ${String(err)}`);
|
|
35
|
+
return { cancelled: false, text: params.text };
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Fire message_sent hook (fire-and-forget) after a send attempt.
|
|
40
|
+
*/
|
|
41
|
+
export function emitWeixinMessageSent(params) {
|
|
42
|
+
const hookRunner = getGlobalHookRunner();
|
|
43
|
+
if (!hookRunner?.hasHooks("message_sent"))
|
|
44
|
+
return;
|
|
45
|
+
const canonical = buildCanonicalSentMessageHookContext({
|
|
46
|
+
to: params.to,
|
|
47
|
+
content: params.content,
|
|
48
|
+
success: params.success,
|
|
49
|
+
error: params.error,
|
|
50
|
+
channelId: CHANNEL_ID,
|
|
51
|
+
accountId: params.accountId,
|
|
52
|
+
conversationId: params.to,
|
|
53
|
+
});
|
|
54
|
+
fireAndForgetHook(Promise.resolve(hookRunner.runMessageSent(toPluginMessageSentEvent(canonical), toPluginMessageContext(canonical))), "weixin: message_sent plugin hook failed");
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=outbound-hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outbound-hooks.js","sourceRoot":"","sources":["../../../src/messaging/outbound-hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,oCAAoC,EACpC,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAEzE,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,MAAM,UAAU,GAAG,iBAAiB,CAAC;AAErC;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,6BAA6B,CAAC,MAKnD;IACC,MAAM,UAAU,GAAG,mBAAmB,EAAE,CAAC;IACzC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC7C,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;IACjD,CAAC;IACD,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,iBAAiB,CACnD;YACE,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,OAAO,EAAE,MAAM,CAAC,IAAI;YACpB,QAAQ,EAAE;gBACR,OAAO,EAAE,UAAU;gBACnB,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC7D;SACF,EACD,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CACvD,CAAC;QACF,IAAI,UAAU,EAAE,MAAM,EAAE,CAAC;YACvB,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;QAChD,CAAC;QACD,OAAO;YACL,SAAS,EAAE,KAAK;YAChB,IAAI,EAAE,UAAU,EAAE,OAAO,IAAI,MAAM,CAAC,IAAI;SACzC,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CAAC,qDAAqD,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChF,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;IACjD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAMrC;IACC,MAAM,UAAU,GAAG,mBAAmB,EAAE,CAAC;IACzC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,cAAc,CAAC;QAAE,OAAO;IAClD,MAAM,SAAS,GAAG,oCAAoC,CAAC;QACrD,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,SAAS,EAAE,UAAU;QACrB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,cAAc,EAAE,MAAM,CAAC,EAAE;KAC1B,CAAC,CAAC;IACH,iBAAiB,CACf,OAAO,CAAC,OAAO,CACb,UAAW,CAAC,cAAc,CACxB,wBAAwB,CAAC,SAAS,CAAC,EACnC,sBAAsB,CAAC,SAAS,CAAC,CAClC,CACF,EACD,yCAAyC,CAC1C,CAAC;AACJ,CAAC"}
|