@openclaw/msteams 2026.10.1 → 2026.10.5-beta.1
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/.setup/{adapter.runtime-D0HYByze.cjs → adapter.runtime-JoPydWqP.cjs} +1 -1
- package/dist/.setup/{approval-handler.runtime-C-RJ3wXc.cjs → approval-handler.runtime-bUN9icMr.cjs} +3 -3
- package/dist/.setup/{bot-framework-service-url-BUhTe8F3.cjs → bot-framework-service-url-CPp4d-Q6.cjs} +1 -5
- package/dist/.setup/{channel-BFhXodl2.cjs → channel-Cifn9fsv.cjs} +230 -430
- package/dist/.setup/{channel.runtime-D9jrw2SN.cjs → channel.runtime-DWRAolil.cjs} +70 -44
- package/dist/.setup/{channel.setup-ss0TO-ap.cjs → channel.setup-BjbHugkL.cjs} +5 -7
- package/dist/.setup/{config-schema-0KoBzb0t.cjs → config-schema-Dk0mRIam.cjs} +1 -1
- package/dist/.setup/{conversation-store-state-f7V8CVNy.cjs → conversation-store-state-DprmOfl7.cjs} +103 -236
- package/dist/.setup/{monitor-DfSPCRkk.cjs → monitor-C9x_CJhY.cjs} +173 -322
- package/dist/.setup/oauth-CWJ85AMw.cjs +55 -0
- package/dist/.setup/{reaction-types-B-GEv57k.cjs → reaction-types-Ig9sQJuR.cjs} +3 -3
- package/dist/.setup/{resolve-allowlist-Ct9yxQUw.cjs → resolve-allowlist-DdDBVCzl.cjs} +77 -174
- package/dist/.setup/{send-7VV1iCai.cjs → send-rJpcVtRp.cjs} +8 -9
- package/dist/.setup/{setup-plugin-api-B0OFG32J.cjs → setup-plugin-api-DfoVOqMJ.cjs} +1 -1
- package/dist/.setup/{thread-session-ClI-lSyG.cjs → thread-session-B74FC1Id.cjs} +1 -1
- package/dist/.setup/{token-config-DOt3XwVa.cjs → token-config-CqIh8z7Q.cjs} +6 -7
- package/dist/api.cjs +2 -2
- package/dist/channel-config-api.cjs +1 -1
- package/dist/channel-plugin-api.cjs +1 -1
- package/dist/directory-contract-api.cjs +2 -2
- package/dist/doctor-contract-api.cjs +1 -1
- package/dist/qa-runner-api.cjs +9 -10
- package/dist/setup-entry.cjs +1 -1
- package/dist/setup-plugin-api.cjs +1 -1
- package/package.json +4 -4
- package/dist/.setup/oauth-CYxMYIOQ.cjs +0 -102
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
require("../runtime-api.cjs");
|
|
2
|
-
const require_resolve_allowlist = require("./resolve-allowlist-
|
|
3
|
-
const require_token_config = require("./token-config-
|
|
4
|
-
const require_channel = require("./channel-
|
|
5
|
-
const require_channel_setup = require("./channel.setup-
|
|
6
|
-
const require_conversation_store_state = require("./conversation-store-state-
|
|
7
|
-
const require_send = require("./send-
|
|
8
|
-
const require_reaction_types = require("./reaction-types-
|
|
2
|
+
const require_resolve_allowlist = require("./resolve-allowlist-DdDBVCzl.cjs");
|
|
3
|
+
const require_token_config = require("./token-config-CqIh8z7Q.cjs");
|
|
4
|
+
const require_channel = require("./channel-Cifn9fsv.cjs");
|
|
5
|
+
const require_channel_setup = require("./channel.setup-BjbHugkL.cjs");
|
|
6
|
+
const require_conversation_store_state = require("./conversation-store-state-DprmOfl7.cjs");
|
|
7
|
+
const require_send = require("./send-rJpcVtRp.cjs");
|
|
8
|
+
const require_reaction_types = require("./reaction-types-Ig9sQJuR.cjs");
|
|
9
9
|
let openclaw_plugin_sdk_channel_outbound = require("openclaw/plugin-sdk/channel-outbound");
|
|
10
10
|
let openclaw_plugin_sdk_string_coerce_runtime = require("openclaw/plugin-sdk/string-coerce-runtime");
|
|
11
11
|
let openclaw_plugin_sdk_reply_payload = require("openclaw/plugin-sdk/reply-payload");
|
|
12
12
|
let openclaw_plugin_sdk_number_runtime = require("openclaw/plugin-sdk/number-runtime");
|
|
13
|
+
let openclaw_plugin_sdk_channel_inbound = require("openclaw/plugin-sdk/channel-inbound");
|
|
13
14
|
let openclaw_plugin_sdk_channel_send_result = require("openclaw/plugin-sdk/channel-send-result");
|
|
14
15
|
let openclaw_plugin_sdk_string_normalization_runtime = require("openclaw/plugin-sdk/string-normalization-runtime");
|
|
15
16
|
let openclaw_plugin_sdk_text_chunking = require("openclaw/plugin-sdk/text-chunking");
|
|
@@ -43,6 +44,7 @@ async function listMSTeamsDirectoryGroupsLive(params) {
|
|
|
43
44
|
const token = await require_resolve_allowlist.resolveGraphToken(params.cfg);
|
|
44
45
|
const limit = typeof params.limit === "number" && params.limit > 0 ? params.limit : 20;
|
|
45
46
|
const [teamQuery, channelQuery] = rawQuery.includes("/") ? (0, openclaw_plugin_sdk_string_coerce_runtime.normalizeStringEntries)(rawQuery.split("/", 2)) : [rawQuery, null];
|
|
47
|
+
const normalizedChannelQuery = (0, openclaw_plugin_sdk_string_coerce_runtime.normalizeLowercaseStringOrEmpty)(channelQuery);
|
|
46
48
|
const teams = await require_resolve_allowlist.listTeamsByName(token, teamQuery);
|
|
47
49
|
const results = [];
|
|
48
50
|
for (const team of teams) {
|
|
@@ -64,7 +66,7 @@ async function listMSTeamsDirectoryGroupsLive(params) {
|
|
|
64
66
|
for (const channel of channels) {
|
|
65
67
|
const name = channel.displayName?.trim();
|
|
66
68
|
if (!name) continue;
|
|
67
|
-
if (!(0, openclaw_plugin_sdk_string_coerce_runtime.normalizeLowercaseStringOrEmpty)(name).includes(
|
|
69
|
+
if (!(0, openclaw_plugin_sdk_string_coerce_runtime.normalizeLowercaseStringOrEmpty)(name).includes(normalizedChannelQuery)) continue;
|
|
68
70
|
results.push({
|
|
69
71
|
kind: "group",
|
|
70
72
|
id: `conversation:${channel.id}`,
|
|
@@ -117,9 +119,22 @@ function resolveConversationPath(to) {
|
|
|
117
119
|
chatId: cleaned
|
|
118
120
|
};
|
|
119
121
|
}
|
|
122
|
+
async function resolveGraphMessageContext(params, options) {
|
|
123
|
+
const token = await require_resolve_allowlist.resolveGraphToken(params.cfg, options);
|
|
124
|
+
const conversationId = await resolveGraphConversationId(params.to);
|
|
125
|
+
return {
|
|
126
|
+
token,
|
|
127
|
+
conversationId,
|
|
128
|
+
...resolveConversationPath(conversationId)
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
async function resolveGraphPinContext(params, operation) {
|
|
132
|
+
const context = await resolveGraphMessageContext(params);
|
|
133
|
+
if (context.kind === "channel") throw new Error((operation === "list" ? "Listing pinned messages is not supported for channels on Graph v1.0. " : "Pin/unpin is not supported for channel messages on Graph v1.0. ") + "Only chat conversations support pinned messages.");
|
|
134
|
+
return context;
|
|
135
|
+
}
|
|
120
136
|
async function getMessageMSTeams(params) {
|
|
121
|
-
const token = await
|
|
122
|
-
const { basePath } = resolveConversationPath(await resolveGraphConversationId(params.to));
|
|
137
|
+
const { token, basePath } = await resolveGraphMessageContext(params);
|
|
123
138
|
const path = `${basePath}/messages/${encodeURIComponent(params.messageId)}`;
|
|
124
139
|
const msg = await require_resolve_allowlist.fetchGraphJson({
|
|
125
140
|
token,
|
|
@@ -133,26 +148,21 @@ async function getMessageMSTeams(params) {
|
|
|
133
148
|
};
|
|
134
149
|
}
|
|
135
150
|
async function pinMessageMSTeams(params) {
|
|
136
|
-
const token = await
|
|
137
|
-
const conversationId = await resolveGraphConversationId(params.to);
|
|
138
|
-
const conv = resolveConversationPath(conversationId);
|
|
139
|
-
if (conv.kind === "channel") throw new Error("Pin/unpin is not supported for channel messages on Graph v1.0. Only chat conversations support pinned messages.");
|
|
151
|
+
const { token, conversationId, basePath } = await resolveGraphPinContext(params, "modify");
|
|
140
152
|
const body = { "message@odata.bind": `https://graph.microsoft.com/v1.0/chats/${encodeURIComponent(conversationId)}/messages/${encodeURIComponent(params.messageId)}` };
|
|
141
153
|
return {
|
|
142
154
|
ok: true,
|
|
143
155
|
pinnedMessageId: (await require_resolve_allowlist.mutateGraphJson({
|
|
144
156
|
token,
|
|
145
|
-
path: `${
|
|
157
|
+
path: `${basePath}/pinnedMessages`,
|
|
146
158
|
method: "POST",
|
|
147
159
|
body
|
|
148
160
|
})).id
|
|
149
161
|
};
|
|
150
162
|
}
|
|
151
163
|
async function unpinMessageMSTeams(params) {
|
|
152
|
-
const token = await
|
|
153
|
-
const
|
|
154
|
-
if (conv.kind === "channel") throw new Error("Pin/unpin is not supported for channel messages on Graph v1.0. Only chat conversations support pinned messages.");
|
|
155
|
-
const path = `${conv.basePath}/pinnedMessages/${encodeURIComponent(params.pinnedMessageId)}`;
|
|
164
|
+
const { token, basePath } = await resolveGraphPinContext(params, "modify");
|
|
165
|
+
const path = `${basePath}/pinnedMessages/${encodeURIComponent(params.pinnedMessageId)}`;
|
|
156
166
|
await require_resolve_allowlist.deleteGraphRequest({
|
|
157
167
|
token,
|
|
158
168
|
path
|
|
@@ -161,10 +171,8 @@ async function unpinMessageMSTeams(params) {
|
|
|
161
171
|
}
|
|
162
172
|
const LIST_PINS_MAX_PAGES = 10;
|
|
163
173
|
async function listPinsMSTeams(params) {
|
|
164
|
-
const token = await
|
|
165
|
-
const
|
|
166
|
-
if (conv.kind === "channel") throw new Error("Listing pinned messages is not supported for channels on Graph v1.0. Only chat conversations support pinned messages.");
|
|
167
|
-
const path = `${conv.basePath}/pinnedMessages?$expand=message`;
|
|
174
|
+
const { token, basePath } = await resolveGraphPinContext(params, "list");
|
|
175
|
+
const path = `${basePath}/pinnedMessages?$expand=message`;
|
|
168
176
|
const allPins = [];
|
|
169
177
|
let res = await require_resolve_allowlist.fetchGraphJson({
|
|
170
178
|
token,
|
|
@@ -190,8 +198,7 @@ async function listPinsMSTeams(params) {
|
|
|
190
198
|
}
|
|
191
199
|
async function mutateMessageReaction(params, operation) {
|
|
192
200
|
const reactionType = require_reaction_types.resolveMSTeamsReactionEmoji(params.reactionType);
|
|
193
|
-
const token = await
|
|
194
|
-
const { basePath } = resolveConversationPath(await resolveGraphConversationId(params.to));
|
|
201
|
+
const { token, basePath } = await resolveGraphMessageContext(params, { preferDelegated: true });
|
|
195
202
|
await require_resolve_allowlist.mutateGraphJson({
|
|
196
203
|
token,
|
|
197
204
|
path: `${basePath}/messages/${encodeURIComponent(params.messageId)}/${operation}`,
|
|
@@ -212,8 +219,7 @@ function unreactMessageMSTeams(params) {
|
|
|
212
219
|
* Uses Graph v1.0 (reactions are included in the message resource).
|
|
213
220
|
*/
|
|
214
221
|
async function listReactionsMSTeams(params) {
|
|
215
|
-
const token = await
|
|
216
|
-
const { basePath } = resolveConversationPath(await resolveGraphConversationId(params.to));
|
|
222
|
+
const { token, basePath } = await resolveGraphMessageContext(params);
|
|
217
223
|
const path = `${basePath}/messages/${encodeURIComponent(params.messageId)}`;
|
|
218
224
|
const msg = await require_resolve_allowlist.fetchGraphJson({
|
|
219
225
|
token,
|
|
@@ -261,8 +267,7 @@ function matchesSearchSender(message, from) {
|
|
|
261
267
|
* locally without widening the read to the account's global message index.
|
|
262
268
|
*/
|
|
263
269
|
async function searchMessagesMSTeams(params) {
|
|
264
|
-
const token = await
|
|
265
|
-
const { basePath } = resolveConversationPath(await resolveGraphConversationId(params.to));
|
|
270
|
+
const { token, basePath } = await resolveGraphMessageContext(params);
|
|
266
271
|
const rawLimit = params.limit ?? SEARCH_DEFAULT_LIMIT;
|
|
267
272
|
const top = Number.isFinite(rawLimit) ? Math.min(Math.max(Math.floor(rawLimit), 1), SEARCH_MAX_LIMIT) : SEARCH_DEFAULT_LIMIT;
|
|
268
273
|
const query = params.query.trim().toLowerCase();
|
|
@@ -489,15 +494,35 @@ function toMSTeamsOutboundResult(result) {
|
|
|
489
494
|
}
|
|
490
495
|
};
|
|
491
496
|
}
|
|
492
|
-
async function sendWithDeliveryResults(send, onDeliveryResult) {
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
497
|
+
async function sendWithDeliveryResults(send, onDeliveryResult, acceptedResults = []) {
|
|
498
|
+
const acceptedBeforeSend = acceptedResults.length;
|
|
499
|
+
try {
|
|
500
|
+
let childReported = false;
|
|
501
|
+
const result = await send(onDeliveryResult ? async (delivery) => {
|
|
502
|
+
childReported = true;
|
|
503
|
+
acceptedResults.push(delivery);
|
|
504
|
+
await onDeliveryResult((0, openclaw_plugin_sdk_channel_send_result.attachChannelToResult)("msteams", toMSTeamsOutboundResult(delivery)));
|
|
505
|
+
} : void 0);
|
|
506
|
+
if (!childReported) {
|
|
507
|
+
acceptedResults.push(result);
|
|
508
|
+
if (onDeliveryResult) await onDeliveryResult((0, openclaw_plugin_sdk_channel_send_result.attachChannelToResult)("msteams", toMSTeamsOutboundResult(result)));
|
|
509
|
+
}
|
|
510
|
+
return result;
|
|
511
|
+
} catch (error) {
|
|
512
|
+
const partial = (0, openclaw_plugin_sdk_channel_inbound.isChannelPartialDeliveryError)(error) ? error : void 0;
|
|
513
|
+
const earlierResults = partial ? acceptedResults.slice(0, acceptedBeforeSend) : acceptedResults;
|
|
514
|
+
if (earlierResults.length === 0) throw error;
|
|
515
|
+
const receipt = (0, openclaw_plugin_sdk_channel_outbound.createMessageReceiptFromOutboundResults)({ results: [...earlierResults.map((result) => (0, openclaw_plugin_sdk_channel_send_result.attachChannelToResult)("msteams", result)), ...partial?.deliveryResult.receipt ? [{ receipt: partial.deliveryResult.receipt }] : (partial?.deliveryResult.messageIds ?? []).map((messageId) => ({
|
|
516
|
+
channel: "msteams",
|
|
517
|
+
messageId
|
|
518
|
+
}))] });
|
|
519
|
+
throw (0, openclaw_plugin_sdk_channel_inbound.createChannelPartialDeliveryError)(partial?.cause ?? error, {
|
|
520
|
+
...partial?.deliveryResult,
|
|
521
|
+
messageIds: receipt.platformMessageIds,
|
|
522
|
+
receipt,
|
|
523
|
+
visibleReplySent: true
|
|
524
|
+
});
|
|
525
|
+
}
|
|
501
526
|
}
|
|
502
527
|
function resolveMSTeamsThreadTarget(to, threadId) {
|
|
503
528
|
const normalizedThreadId = threadId == null ? "" : String(threadId).trim();
|
|
@@ -553,6 +578,7 @@ const msteamsOutbound = {
|
|
|
553
578
|
assertDirectAdapterHandoff,
|
|
554
579
|
onPlatformSendDispatch
|
|
555
580
|
};
|
|
581
|
+
const acceptedResults = [];
|
|
556
582
|
const deliveryTarget = resolveMSTeamsThreadTarget(to, threadId);
|
|
557
583
|
const msteamsData = (0, openclaw_plugin_sdk_string_coerce_runtime.asOptionalRecord)(payload.channelData?.msteams);
|
|
558
584
|
const presentationCard = (0, openclaw_plugin_sdk_string_coerce_runtime.asOptionalRecord)(msteamsData?.presentationCard);
|
|
@@ -563,7 +589,7 @@ const msteamsOutbound = {
|
|
|
563
589
|
card: presentationCard,
|
|
564
590
|
...handoff,
|
|
565
591
|
onDeliveryResult: report
|
|
566
|
-
}), onDeliveryResult);
|
|
592
|
+
}), onDeliveryResult, acceptedResults);
|
|
567
593
|
return (0, openclaw_plugin_sdk_channel_send_result.attachChannelToResult)("msteams", toMSTeamsOutboundResult(result));
|
|
568
594
|
}
|
|
569
595
|
const mediaUrls = (0, openclaw_plugin_sdk_string_normalization_runtime.normalizeStringEntries)((0, openclaw_plugin_sdk_reply_payload.resolvePayloadMediaUrls)({
|
|
@@ -578,14 +604,14 @@ const msteamsOutbound = {
|
|
|
578
604
|
const result = await (0, openclaw_plugin_sdk_reply_payload.sendPayloadMediaSequence)({
|
|
579
605
|
text,
|
|
580
606
|
mediaUrls,
|
|
581
|
-
send:
|
|
607
|
+
send: ({ text: textLocal, mediaUrl: mediaUrlLocal }) => sendWithDeliveryResults((report) => send(deliveryTarget, textLocal, {
|
|
582
608
|
mediaUrl: mediaUrlLocal,
|
|
583
609
|
mediaAccess,
|
|
584
610
|
mediaLocalRoots,
|
|
585
611
|
mediaReadFile,
|
|
586
612
|
...handoff,
|
|
587
613
|
onDeliveryResult: report
|
|
588
|
-
}), onDeliveryResult)
|
|
614
|
+
}), onDeliveryResult, acceptedResults)
|
|
589
615
|
});
|
|
590
616
|
if (result) return (0, openclaw_plugin_sdk_channel_send_result.attachChannelToResult)("msteams", toMSTeamsOutboundResult(result));
|
|
591
617
|
}
|
|
@@ -599,7 +625,7 @@ const msteamsOutbound = {
|
|
|
599
625
|
for (const chunk of chunks) result = await sendWithDeliveryResults((report) => send(deliveryTarget, chunk, {
|
|
600
626
|
...handoff,
|
|
601
627
|
onDeliveryResult: report
|
|
602
|
-
}), onDeliveryResult);
|
|
628
|
+
}), onDeliveryResult, acceptedResults);
|
|
603
629
|
return (0, openclaw_plugin_sdk_channel_send_result.attachChannelToResult)("msteams", toMSTeamsOutboundResult(result));
|
|
604
630
|
}
|
|
605
631
|
throw new Error("MS Teams payload send requires text, media, or a presentation card.");
|
|
@@ -666,13 +692,13 @@ async function probeMSTeams(cfg) {
|
|
|
666
692
|
const { app } = await require_resolve_allowlist.loadMSTeamsSdkWithAuth(creds, require_resolve_allowlist.resolveMSTeamsSdkCloudOptions(cfg));
|
|
667
693
|
const tokenProvider = require_resolve_allowlist.createMSTeamsTokenProvider(app);
|
|
668
694
|
if (!await require_resolve_allowlist.withMSTeamsRequestDeadline({
|
|
669
|
-
label: "MS Teams Bot Framework
|
|
695
|
+
label: "MS Teams Bot Framework token check",
|
|
670
696
|
work: () => tokenProvider.getAccessToken("https://api.botframework.com")
|
|
671
697
|
})) throw new Error("Failed to acquire bot token");
|
|
672
698
|
let graph;
|
|
673
699
|
try {
|
|
674
700
|
const accessToken = await require_resolve_allowlist.withMSTeamsRequestDeadline({
|
|
675
|
-
label: "MS Teams Graph
|
|
701
|
+
label: "MS Teams Graph token check",
|
|
676
702
|
work: () => tokenProvider.getAccessToken("https://graph.microsoft.com")
|
|
677
703
|
});
|
|
678
704
|
const payload = accessToken ? decodeJwtPayload(accessToken) : null;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
const require_resolve_allowlist = require("./resolve-allowlist-
|
|
2
|
-
const require_token_config = require("./token-config-
|
|
3
|
-
const require_config_schema = require("./config-schema-
|
|
1
|
+
const require_resolve_allowlist = require("./resolve-allowlist-DdDBVCzl.cjs");
|
|
2
|
+
const require_token_config = require("./token-config-CqIh8z7Q.cjs");
|
|
3
|
+
const require_config_schema = require("./config-schema-Dk0mRIam.cjs");
|
|
4
4
|
let openclaw_plugin_sdk_string_coerce_runtime = require("openclaw/plugin-sdk/string-coerce-runtime");
|
|
5
5
|
let openclaw_plugin_sdk_allow_from = require("openclaw/plugin-sdk/allow-from");
|
|
6
6
|
let openclaw_plugin_sdk_account_id = require("openclaw/plugin-sdk/account-id");
|
|
@@ -431,7 +431,7 @@ const msteamsGroupAccess = {
|
|
|
431
431
|
currentEntries: ({ cfg }) => listMSTeamsGroupEntries(cfg),
|
|
432
432
|
updatePrompt: ({ cfg }) => Boolean(cfg.channels?.msteams?.teams),
|
|
433
433
|
setPolicy: ({ cfg, policy }) => setMSTeamsGroupPolicy(cfg, policy),
|
|
434
|
-
resolveAllowlist:
|
|
434
|
+
resolveAllowlist: ({ cfg, entries, prompter }) => resolveMSTeamsGroupAllowlist({
|
|
435
435
|
cfg,
|
|
436
436
|
entries,
|
|
437
437
|
prompter
|
|
@@ -469,7 +469,7 @@ const msteamsSetupWizard = {
|
|
|
469
469
|
};
|
|
470
470
|
let oauthModule;
|
|
471
471
|
try {
|
|
472
|
-
oauthModule = await Promise.resolve().then(() => require("./oauth-
|
|
472
|
+
oauthModule = await Promise.resolve().then(() => require("./oauth-CWJ85AMw.cjs"));
|
|
473
473
|
} catch (err) {
|
|
474
474
|
await noteDelegatedAuthFailure(err);
|
|
475
475
|
return {
|
|
@@ -482,8 +482,6 @@ const msteamsSetupWizard = {
|
|
|
482
482
|
let tokens;
|
|
483
483
|
try {
|
|
484
484
|
tokens = await oauthModule.loginMSTeamsDelegated({
|
|
485
|
-
isRemote: true,
|
|
486
|
-
openUrl: openDelegatedOAuthUrl,
|
|
487
485
|
log: (msg) => {
|
|
488
486
|
params.prompter.note(msg);
|
|
489
487
|
},
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const require_bot_framework_service_url = require("./bot-framework-service-url-
|
|
1
|
+
const require_bot_framework_service_url = require("./bot-framework-service-url-CPp4d-Q6.cjs");
|
|
2
2
|
let openclaw_plugin_sdk_channel_core = require("openclaw/plugin-sdk/channel-core");
|
|
3
3
|
let openclaw_plugin_sdk_ssrf_policy = require("openclaw/plugin-sdk/ssrf-policy");
|
|
4
4
|
let openclaw_plugin_sdk_secret_input = require("openclaw/plugin-sdk/secret-input");
|