@openclaw/discord 2026.7.1 → 2026.7.2-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/action-runtime-api.js +1 -1
- package/dist/{allow-list-C-MqM-B_.js → allow-list-B7qOH5xu.js} +22 -1
- package/dist/{api-DPRqYi4Z.js → api--f62GFaS.js} +38 -23
- package/dist/api.js +15 -15
- package/dist/approval-custom-id-NYPYj9Po.js +58 -0
- package/dist/{approval-handler.runtime-Bw2pZNk1.js → approval-handler.runtime-DeyIiw5I.js} +28 -23
- package/dist/approval-message-safety-C-8BL6Kv.js +47 -0
- package/dist/{audit-MLpDpN3Z.js → audit-Df2w046a.js} +3 -3
- package/dist/{channel-actions-D_fjVUZ_.js → channel-actions-ChpBSRcu.js} +6 -4
- package/dist/{channel-actions.runtime-CVHlFqQg.js → channel-actions.runtime-D8V8tyCq.js} +41 -12
- package/dist/channel-config-api.js +1 -1
- package/dist/{channel-DGWPH5u3.js → channel-nYmJ7FKQ.js} +275 -62
- package/dist/channel-plugin-api.js +1 -1
- package/dist/{channel.setup-tZcpIn4e.js → channel.setup-DyihrqHH.js} +3 -3
- package/dist/{components-BIBizbtZ.js → components-BVrfRS-F.js} +78 -52
- package/dist/config-api-B18fR8M5.js +3 -0
- package/dist/{config-schema-BgIhO3ko.js → config-schema-_bUKcWRm.js} +42 -82
- package/dist/conversation-identity-BpkAzklg.js +94 -0
- package/dist/{directory-config-ByaUKL1f.js → directory-config-BUe-qq_C.js} +1 -1
- package/dist/directory-contract-api.js +1 -1
- package/dist/{directory-live-BX79ImQA.js → directory-live-DZByMdPO.js} +6 -6
- package/dist/{doctor-Bgoxm5AN.js → doctor-bMaWXFKu.js} +5 -4
- package/dist/doctor-contract-api.js +1 -1
- package/dist/{doctor-contract-CU7lnZTF.js → doctor-contract-wId6pV41.js} +41 -37
- package/dist/{handle-action.guild-admin-CgJSNVui.js → handle-action.guild-admin-C_PQcBEV.js} +12 -12
- package/dist/index.js +1 -1
- package/dist/legacy-state-migrations-api.js +24 -2
- package/dist/{manager.runtime-DaB-CTrt.js → manager.runtime-3RVMVkyx.js} +546 -154
- package/dist/{message-handler-DcgvugZt.js → message-handler-CIxWq5Yh.js} +8 -9
- package/dist/{message-handler.preflight-DvLXiYVH.js → message-handler.preflight-BI86IbHz.js} +46 -22
- package/dist/{message-handler.process-Cjf30P_B.js → message-handler.process-bPS_9_tb.js} +241 -107
- package/dist/{message-utils-B_3yA5bN.js → message-utils-D4j07taS.js} +2 -3
- package/dist/{outbound-adapter-82RWi_SR.js → outbound-adapter-Czny0Fae.js} +16 -68
- package/dist/outbound-components-oJKLj62G.js +99 -0
- package/dist/pluralkit-UXq1OyUI.js +40 -0
- package/dist/{probe-D1ImJEo2.js → probe-DxjMBeVG.js} +1 -1
- package/dist/{probe.runtime-B1dsEeBD.js → probe.runtime-Bc8Oo6e8.js} +1 -1
- package/dist/{provider-BkfbC9FQ.js → provider-DWvDNb4J.js} +702 -236
- package/dist/{provider-session.runtime-BDjyFw6Y.js → provider-session.runtime-D5pCGibh.js} +3 -3
- package/dist/provider.runtime-C2iIfbTs.js +2 -0
- package/dist/{resolve-allowlist-common-CWbE8XlH.js → resolve-allowlist-common-B9S8LLBd.js} +5 -5
- package/dist/{resolve-channels-CcpvWoRa.js → resolve-channels-BrkWOKdG.js} +7 -7
- package/dist/{resolve-users-DJamun9s.js → resolve-users-OjrXXvJP.js} +5 -5
- package/dist/{runtime-C6rRmQ6l.js → runtime-C618lis9.js} +223 -33
- package/dist/runtime-api.actions.js +2 -2
- package/dist/runtime-api.js +23 -23
- package/dist/runtime-api.lookup.js +5 -5
- package/dist/runtime-api.monitor-DSbfGnzS.js +6 -0
- package/dist/runtime-api.monitor.js +7 -7
- package/dist/runtime-api.send.js +5 -5
- package/dist/runtime-api.threads.js +5 -5
- package/dist/{send-iJ0B4bAX.js → send-BFpa_DHn.js} +21 -12
- package/dist/{send.components-D0I39utR.js → send.components-BaXQJKWT.js} +15 -10
- package/dist/{send.outbound-Bj61Q3a0.js → send.outbound-BlA6VzSE.js} +22 -12
- package/dist/{send.receipt-BpBQED_5.js → send.receipt-aegk69an.js} +59 -75
- package/dist/{send.shared-wAwMhHDN.js → send.shared-Xz7IMVpu.js} +44 -20
- package/dist/{sender-identity-CEsfDF0L.js → sender-identity-C62lBe18.js} +1 -1
- package/dist/session-binding-contract-api.js +1 -1
- package/dist/setup-plugin-api.js +1 -1
- package/dist/{shared-BQVKfnev.js → shared-BLYBt5SA.js} +3 -3
- package/dist/{subagent-hooks-B-bJxxGg.js → subagent-hooks-DKJ4p-Oy.js} +2 -2
- package/dist/subagent-hooks-api.js +1 -1
- package/dist/{system-events-DVnqSyTt.js → system-events-DKwfE-2z.js} +2 -2
- package/dist/{target-resolver-CwHaSLt3.js → target-resolver-BQyEHyeS.js} +2 -2
- package/dist/targets-DvItNIvP.js +3 -0
- package/dist/thread-binding-api-BDZJD4na.js +4 -0
- package/dist/thread-binding-api.js +1 -3
- package/dist/{thread-bindings-DsTxqu3E.js → thread-bindings-BbzjUuNB.js} +26 -43
- package/dist/{thread-bindings.discord-api-BjIf9lGs.js → thread-bindings.discord-api-DJD3qwIN.js} +8 -10
- package/dist/{thread-bindings.manager-Bwmtqc3E.js → thread-bindings.manager-BIBm6bQd.js} +4 -4
- package/dist/{thread-bindings.session-updates-Chs3HgGa.js → thread-bindings.session-updates-eRcJlzIU.js} +1 -1
- package/dist/{thread-bindings.state-iSWjCYjB.js → thread-bindings.state-9VAxhVf6.js} +3 -14
- package/dist/{timeouts-C5TBc_9x.js → timeouts-ZRc9Lw4y.js} +3 -15
- package/dist/timeouts.js +1 -1
- package/dist/{transcripts-source-BvvM5Ns9.js → transcripts-source-CLZ5X8fh.js} +1 -1
- package/dist/transcripts-source-api.js +1 -1
- package/dist/{typing-BVcJgILg.js → typing-BnYT7Szq.js} +2 -2
- package/node_modules/p-map/index.d.ts +155 -0
- package/node_modules/p-map/index.js +284 -0
- package/node_modules/p-map/license +9 -0
- package/node_modules/p-map/package.json +57 -0
- package/node_modules/p-map/readme.md +190 -0
- package/npm-shrinkwrap.json +16 -3
- package/openclaw.plugin.json +70 -2
- package/package.json +6 -4
- package/dist/config-api-JiPdJeb0.js +0 -2
- package/dist/conversation-identity-DWC5d8Sy.js +0 -272
- package/dist/pluralkit-DcD-3EcL.js +0 -24
- package/dist/preview-streaming-DXT8oJdo.js +0 -8
- package/dist/provider.runtime-WrJXikSv.js +0 -2
- package/dist/runtime-api.monitor-C2_WVtJf.js +0 -6
- package/dist/targets-69w7c3vU.js +0 -3
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,22 +1,23 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openclaw/discord",
|
|
3
|
-
"version": "2026.7.1",
|
|
3
|
+
"version": "2026.7.2-beta.1",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@openclaw/discord",
|
|
9
|
-
"version": "2026.7.1",
|
|
9
|
+
"version": "2026.7.2-beta.1",
|
|
10
10
|
"dependencies": {
|
|
11
11
|
"@discordjs/voice": "0.19.2",
|
|
12
12
|
"discord-api-types": "0.38.49",
|
|
13
13
|
"libopus-wasm": "0.2.0",
|
|
14
|
+
"p-map": "7.0.5",
|
|
14
15
|
"typebox": "1.3.3",
|
|
15
16
|
"undici": "8.5.0",
|
|
16
17
|
"ws": "8.21.0"
|
|
17
18
|
},
|
|
18
19
|
"peerDependencies": {
|
|
19
|
-
"openclaw": ">=2026.7.1"
|
|
20
|
+
"openclaw": ">=2026.7.2-beta.1"
|
|
20
21
|
},
|
|
21
22
|
"peerDependenciesMeta": {
|
|
22
23
|
"openclaw": {
|
|
@@ -360,6 +361,18 @@
|
|
|
360
361
|
"node": ">=20"
|
|
361
362
|
}
|
|
362
363
|
},
|
|
364
|
+
"node_modules/p-map": {
|
|
365
|
+
"version": "7.0.5",
|
|
366
|
+
"resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.5.tgz",
|
|
367
|
+
"integrity": "sha512-e8vJF4XdVkzqqSHguEMz41mQO1wKwxKm5ENrUJQUu9kLDCtn83cxbyHZcszr4QC5zEA7WffRRC4gsTecC7J9oA==",
|
|
368
|
+
"license": "MIT",
|
|
369
|
+
"engines": {
|
|
370
|
+
"node": ">=18"
|
|
371
|
+
},
|
|
372
|
+
"funding": {
|
|
373
|
+
"url": "https://github.com/sponsors/sindresorhus"
|
|
374
|
+
}
|
|
375
|
+
},
|
|
363
376
|
"node_modules/prism-media": {
|
|
364
377
|
"version": "1.3.5",
|
|
365
378
|
"resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.3.5.tgz",
|
package/openclaw.plugin.json
CHANGED
|
@@ -436,6 +436,9 @@
|
|
|
436
436
|
},
|
|
437
437
|
"commentary": {
|
|
438
438
|
"type": "boolean"
|
|
439
|
+
},
|
|
440
|
+
"narration": {
|
|
441
|
+
"type": "boolean"
|
|
439
442
|
}
|
|
440
443
|
},
|
|
441
444
|
"additionalProperties": false
|
|
@@ -743,6 +746,29 @@
|
|
|
743
746
|
"type": "string"
|
|
744
747
|
}
|
|
745
748
|
},
|
|
749
|
+
"presenceEvents": {
|
|
750
|
+
"type": "object",
|
|
751
|
+
"properties": {
|
|
752
|
+
"enabled": {
|
|
753
|
+
"type": "boolean"
|
|
754
|
+
},
|
|
755
|
+
"channelId": {
|
|
756
|
+
"type": "string",
|
|
757
|
+
"pattern": "^\\d+$"
|
|
758
|
+
},
|
|
759
|
+
"users": {
|
|
760
|
+
"type": "array",
|
|
761
|
+
"items": {
|
|
762
|
+
"type": "string",
|
|
763
|
+
"pattern": "^\\d+$"
|
|
764
|
+
}
|
|
765
|
+
}
|
|
766
|
+
},
|
|
767
|
+
"required": [
|
|
768
|
+
"channelId"
|
|
769
|
+
],
|
|
770
|
+
"additionalProperties": false
|
|
771
|
+
},
|
|
746
772
|
"channels": {
|
|
747
773
|
"type": "object",
|
|
748
774
|
"propertyNames": {
|
|
@@ -2246,6 +2272,9 @@
|
|
|
2246
2272
|
},
|
|
2247
2273
|
"commentary": {
|
|
2248
2274
|
"type": "boolean"
|
|
2275
|
+
},
|
|
2276
|
+
"narration": {
|
|
2277
|
+
"type": "boolean"
|
|
2249
2278
|
}
|
|
2250
2279
|
},
|
|
2251
2280
|
"additionalProperties": false
|
|
@@ -2553,6 +2582,29 @@
|
|
|
2553
2582
|
"type": "string"
|
|
2554
2583
|
}
|
|
2555
2584
|
},
|
|
2585
|
+
"presenceEvents": {
|
|
2586
|
+
"type": "object",
|
|
2587
|
+
"properties": {
|
|
2588
|
+
"enabled": {
|
|
2589
|
+
"type": "boolean"
|
|
2590
|
+
},
|
|
2591
|
+
"channelId": {
|
|
2592
|
+
"type": "string",
|
|
2593
|
+
"pattern": "^\\d+$"
|
|
2594
|
+
},
|
|
2595
|
+
"users": {
|
|
2596
|
+
"type": "array",
|
|
2597
|
+
"items": {
|
|
2598
|
+
"type": "string",
|
|
2599
|
+
"pattern": "^\\d+$"
|
|
2600
|
+
}
|
|
2601
|
+
}
|
|
2602
|
+
},
|
|
2603
|
+
"required": [
|
|
2604
|
+
"channelId"
|
|
2605
|
+
],
|
|
2606
|
+
"additionalProperties": false
|
|
2607
|
+
},
|
|
2556
2608
|
"channels": {
|
|
2557
2609
|
"type": "object",
|
|
2558
2610
|
"propertyNames": {
|
|
@@ -3754,7 +3806,7 @@
|
|
|
3754
3806
|
},
|
|
3755
3807
|
"streaming.progress.labels": {
|
|
3756
3808
|
"label": "Discord Progress Label Pool",
|
|
3757
|
-
"help": "Candidate labels for streaming.progress.label=\"auto\". Leave unset to use
|
|
3809
|
+
"help": "Candidate labels for streaming.progress.label=\"auto\". Leave unset to use the built-in \"Working\" label."
|
|
3758
3810
|
},
|
|
3759
3811
|
"streaming.progress.maxLines": {
|
|
3760
3812
|
"label": "Discord Progress Max Lines",
|
|
@@ -3874,7 +3926,7 @@
|
|
|
3874
3926
|
},
|
|
3875
3927
|
"voice.model": {
|
|
3876
3928
|
"label": "Discord Voice Model",
|
|
3877
|
-
"help": "Optional LLM model override for Discord voice channel responses and realtime agent consults (for example openai/gpt-5.
|
|
3929
|
+
"help": "Optional LLM model override for Discord voice channel responses and realtime agent consults (for example openai/gpt-5.6-sol). Leave unset to inherit the routed agent model."
|
|
3878
3930
|
},
|
|
3879
3931
|
"voice.mode": {
|
|
3880
3932
|
"label": "Discord Voice Mode",
|
|
@@ -4021,6 +4073,22 @@
|
|
|
4021
4073
|
"label": "Discord Auto Presence Exhausted Text",
|
|
4022
4074
|
"help": "Optional custom status text while runtime detects exhausted/unavailable model quota (dnd). Supports {reason} template placeholder."
|
|
4023
4075
|
},
|
|
4076
|
+
"guilds.*.presenceEvents": {
|
|
4077
|
+
"label": "Discord Online Presence Events",
|
|
4078
|
+
"help": "Route selected human offline-to-online transitions into the configured guild channel as agent system events. Requires the Guild Presences privileged intent and an enabled agent heartbeat."
|
|
4079
|
+
},
|
|
4080
|
+
"guilds.*.presenceEvents.enabled": {
|
|
4081
|
+
"label": "Discord Online Presence Events Enabled",
|
|
4082
|
+
"help": "Enable online-presence agent wakes for this guild. Defaults to true when presenceEvents is configured."
|
|
4083
|
+
},
|
|
4084
|
+
"guilds.*.presenceEvents.channelId": {
|
|
4085
|
+
"label": "Discord Online Presence Target Channel",
|
|
4086
|
+
"help": "Numeric Discord channel ID whose routed agent session receives online-presence events and greeting delivery."
|
|
4087
|
+
},
|
|
4088
|
+
"guilds.*.presenceEvents.users": {
|
|
4089
|
+
"label": "Discord Online Presence User IDs",
|
|
4090
|
+
"help": "Optional immutable Discord user ID allowlist. Omit to include all human members in the guild."
|
|
4091
|
+
},
|
|
4024
4092
|
"activityType": {
|
|
4025
4093
|
"label": "Discord Presence Activity Type",
|
|
4026
4094
|
"help": "Discord presence activity type (0=Playing,1=Streaming,2=Listening,3=Watching,4=Custom,5=Competing)."
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openclaw/discord",
|
|
3
|
-
"version": "2026.7.1",
|
|
3
|
+
"version": "2026.7.2-beta.1",
|
|
4
4
|
"description": "OpenClaw Discord channel plugin for channels, DMs, commands, and app events.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -11,12 +11,13 @@
|
|
|
11
11
|
"@discordjs/voice": "0.19.2",
|
|
12
12
|
"discord-api-types": "0.38.49",
|
|
13
13
|
"libopus-wasm": "0.2.0",
|
|
14
|
+
"p-map": "7.0.5",
|
|
14
15
|
"typebox": "1.3.3",
|
|
15
16
|
"undici": "8.5.0",
|
|
16
17
|
"ws": "8.21.0"
|
|
17
18
|
},
|
|
18
19
|
"peerDependencies": {
|
|
19
|
-
"openclaw": ">=2026.7.1"
|
|
20
|
+
"openclaw": ">=2026.7.2-beta.1"
|
|
20
21
|
},
|
|
21
22
|
"peerDependenciesMeta": {
|
|
22
23
|
"openclaw": {
|
|
@@ -63,10 +64,10 @@
|
|
|
63
64
|
"allowInvalidConfigRecovery": true
|
|
64
65
|
},
|
|
65
66
|
"compat": {
|
|
66
|
-
"pluginApi": ">=2026.7.1"
|
|
67
|
+
"pluginApi": ">=2026.7.2-beta.1"
|
|
67
68
|
},
|
|
68
69
|
"build": {
|
|
69
|
-
"openclawVersion": "2026.7.1"
|
|
70
|
+
"openclawVersion": "2026.7.2-beta.1"
|
|
70
71
|
},
|
|
71
72
|
"release": {
|
|
72
73
|
"publishToClawHub": true,
|
|
@@ -88,6 +89,7 @@
|
|
|
88
89
|
"@discordjs/voice",
|
|
89
90
|
"discord-api-types",
|
|
90
91
|
"libopus-wasm",
|
|
92
|
+
"p-map",
|
|
91
93
|
"typebox",
|
|
92
94
|
"undici",
|
|
93
95
|
"ws"
|
|
@@ -1,272 +0,0 @@
|
|
|
1
|
-
import { Kt as parseDiscordTarget } from "./send.receipt-BpBQED_5.js";
|
|
2
|
-
import { r as listDiscordAccountIds, s as resolveDiscordAccount } from "./accounts-P19jm1lf.js";
|
|
3
|
-
import { normalizeLowercaseStringOrEmpty, normalizeOptionalLowercaseString, normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
4
|
-
import { createLazyChannelApprovalNativeRuntimeAdapter } from "openclaw/plugin-sdk/approval-handler-adapter-runtime";
|
|
5
|
-
import { createChannelApproverDmTargetResolver, createChannelNativeOriginTargetResolver, doesApprovalRequestMatchChannelAccount, resolveApprovalRequestSessionConversation } from "openclaw/plugin-sdk/approval-native-runtime";
|
|
6
|
-
import { getExecApprovalReplyMetadata, isChannelExecApprovalClientEnabledFromConfig, matchesApprovalRequestFilters } from "openclaw/plugin-sdk/approval-client-runtime";
|
|
7
|
-
import { resolveApprovalApprovers } from "openclaw/plugin-sdk/approval-auth-runtime";
|
|
8
|
-
import { createApproverRestrictedNativeApprovalCapability } from "openclaw/plugin-sdk/approval-delivery-runtime";
|
|
9
|
-
//#region extensions/discord/src/exec-approvals.ts
|
|
10
|
-
function normalizeDiscordApproverId(value) {
|
|
11
|
-
const trimmed = value.trim();
|
|
12
|
-
if (!trimmed) return;
|
|
13
|
-
if (/^\d+$/.test(trimmed)) return trimmed;
|
|
14
|
-
try {
|
|
15
|
-
const target = parseDiscordTarget(trimmed);
|
|
16
|
-
return target?.kind === "user" ? target.id : void 0;
|
|
17
|
-
} catch {
|
|
18
|
-
return;
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
function resolveDiscordOwnerApprovers(cfg) {
|
|
22
|
-
const ownerAllowFrom = cfg.commands?.ownerAllowFrom;
|
|
23
|
-
if (!Array.isArray(ownerAllowFrom) || ownerAllowFrom.length === 0) return [];
|
|
24
|
-
return resolveApprovalApprovers({
|
|
25
|
-
explicit: ownerAllowFrom,
|
|
26
|
-
normalizeApprover: (value) => normalizeDiscordApproverId(String(value))
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
function getDiscordExecApprovalApprovers(params) {
|
|
30
|
-
return resolveApprovalApprovers({
|
|
31
|
-
explicit: params.configOverride?.approvers ?? resolveDiscordAccount(params).config.execApprovals?.approvers ?? resolveDiscordOwnerApprovers(params.cfg),
|
|
32
|
-
normalizeApprover: (value) => normalizeDiscordApproverId(String(value))
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
function isDiscordExecApprovalClientEnabled(params) {
|
|
36
|
-
return isChannelExecApprovalClientEnabledFromConfig({
|
|
37
|
-
enabled: (params.configOverride ?? resolveDiscordAccount(params).config.execApprovals)?.enabled,
|
|
38
|
-
approverCount: getDiscordExecApprovalApprovers({
|
|
39
|
-
cfg: params.cfg,
|
|
40
|
-
accountId: params.accountId,
|
|
41
|
-
configOverride: params.configOverride
|
|
42
|
-
}).length
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
function isDiscordExecApprovalApprover(params) {
|
|
46
|
-
const senderId = params.senderId?.trim();
|
|
47
|
-
if (!senderId) return false;
|
|
48
|
-
return getDiscordExecApprovalApprovers({
|
|
49
|
-
cfg: params.cfg,
|
|
50
|
-
accountId: params.accountId,
|
|
51
|
-
configOverride: params.configOverride
|
|
52
|
-
}).includes(senderId);
|
|
53
|
-
}
|
|
54
|
-
function shouldSuppressLocalDiscordExecApprovalPrompt(params) {
|
|
55
|
-
const metadata = getExecApprovalReplyMetadata(params.payload);
|
|
56
|
-
const config = resolveDiscordAccount(params).config.execApprovals;
|
|
57
|
-
return params.hint?.kind === "approval-pending" && params.hint.nativeRouteActive === true && isDiscordExecApprovalClientEnabled(params) && metadata !== null && matchesApprovalRequestFilters({
|
|
58
|
-
request: {
|
|
59
|
-
agentId: metadata.agentId,
|
|
60
|
-
sessionKey: metadata.sessionKey
|
|
61
|
-
},
|
|
62
|
-
agentFilter: config?.agentFilter,
|
|
63
|
-
sessionFilter: config?.sessionFilter
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
//#endregion
|
|
67
|
-
//#region extensions/discord/src/approval-shared.ts
|
|
68
|
-
function shouldHandleDiscordApprovalRequest(params) {
|
|
69
|
-
const config = params.configOverride ?? resolveDiscordAccount({
|
|
70
|
-
cfg: params.cfg,
|
|
71
|
-
accountId: params.accountId
|
|
72
|
-
}).config.execApprovals;
|
|
73
|
-
const approvers = getDiscordExecApprovalApprovers({
|
|
74
|
-
cfg: params.cfg,
|
|
75
|
-
accountId: params.accountId,
|
|
76
|
-
configOverride: params.configOverride
|
|
77
|
-
});
|
|
78
|
-
if (!doesApprovalRequestMatchChannelAccount({
|
|
79
|
-
cfg: params.cfg,
|
|
80
|
-
request: params.request,
|
|
81
|
-
channel: "discord",
|
|
82
|
-
accountId: params.accountId
|
|
83
|
-
})) return false;
|
|
84
|
-
if (!isChannelExecApprovalClientEnabledFromConfig({
|
|
85
|
-
enabled: config?.enabled,
|
|
86
|
-
approverCount: approvers.length
|
|
87
|
-
})) return false;
|
|
88
|
-
return matchesApprovalRequestFilters({
|
|
89
|
-
request: params.request.request,
|
|
90
|
-
agentFilter: config?.agentFilter,
|
|
91
|
-
sessionFilter: config?.sessionFilter
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
//#endregion
|
|
95
|
-
//#region extensions/discord/src/approval-native.ts
|
|
96
|
-
function extractDiscordSessionKind(sessionKey) {
|
|
97
|
-
if (!sessionKey) return null;
|
|
98
|
-
const match = sessionKey.match(/discord:(?:[^:]+:)?(channel|group|dm|direct):/);
|
|
99
|
-
if (!match) return null;
|
|
100
|
-
const raw = match[1];
|
|
101
|
-
if (raw === "direct") return "dm";
|
|
102
|
-
return raw;
|
|
103
|
-
}
|
|
104
|
-
function normalizeDiscordOriginChannelId(value) {
|
|
105
|
-
if (!value) return null;
|
|
106
|
-
const trimmed = value.trim();
|
|
107
|
-
if (!trimmed) return null;
|
|
108
|
-
const prefixed = trimmed.match(/^(?:channel|group):(\d+)$/i);
|
|
109
|
-
if (prefixed) return prefixed[1];
|
|
110
|
-
return /^\d+$/.test(trimmed) ? trimmed : null;
|
|
111
|
-
}
|
|
112
|
-
function normalizeDiscordThreadId(value) {
|
|
113
|
-
if (typeof value === "number") return Number.isFinite(value) ? String(value) : void 0;
|
|
114
|
-
if (typeof value !== "string") return;
|
|
115
|
-
const normalized = value.trim();
|
|
116
|
-
return /^\d+$/.test(normalized) ? normalized : void 0;
|
|
117
|
-
}
|
|
118
|
-
function createDiscordOriginTargetResolver(configOverride) {
|
|
119
|
-
return createChannelNativeOriginTargetResolver({
|
|
120
|
-
channel: "discord",
|
|
121
|
-
shouldHandleRequest: ({ cfg, accountId, request }) => shouldHandleDiscordApprovalRequest({
|
|
122
|
-
cfg,
|
|
123
|
-
accountId,
|
|
124
|
-
request,
|
|
125
|
-
configOverride
|
|
126
|
-
}),
|
|
127
|
-
resolveTurnSourceTarget: (request) => {
|
|
128
|
-
const sessionConversation = resolveApprovalRequestSessionConversation({
|
|
129
|
-
request,
|
|
130
|
-
channel: "discord",
|
|
131
|
-
bundledFallback: false
|
|
132
|
-
});
|
|
133
|
-
const sessionKind = extractDiscordSessionKind(normalizeOptionalString(request.request.sessionKey) ?? null);
|
|
134
|
-
const turnSourceChannel = normalizeLowercaseStringOrEmpty(request.request.turnSourceChannel);
|
|
135
|
-
const rawTurnSourceTo = normalizeOptionalString(request.request.turnSourceTo) ?? "";
|
|
136
|
-
const turnSourceTo = normalizeDiscordOriginChannelId(rawTurnSourceTo);
|
|
137
|
-
const threadId = normalizeDiscordThreadId(request.request.turnSourceThreadId) ?? normalizeDiscordThreadId(sessionConversation?.threadId) ?? void 0;
|
|
138
|
-
const hasExplicitOriginTarget = /^(?:channel|group):/i.test(rawTurnSourceTo);
|
|
139
|
-
if (turnSourceChannel !== "discord" || !turnSourceTo || sessionKind === "dm") return null;
|
|
140
|
-
return hasExplicitOriginTarget || sessionKind === "channel" || sessionKind === "group" ? {
|
|
141
|
-
to: turnSourceTo,
|
|
142
|
-
threadId
|
|
143
|
-
} : null;
|
|
144
|
-
},
|
|
145
|
-
resolveSessionTarget: (sessionTarget, request) => {
|
|
146
|
-
const sessionConversation = resolveApprovalRequestSessionConversation({
|
|
147
|
-
request,
|
|
148
|
-
channel: "discord",
|
|
149
|
-
bundledFallback: false
|
|
150
|
-
});
|
|
151
|
-
if (extractDiscordSessionKind(request.request.sessionKey?.trim() || null) === "dm") return null;
|
|
152
|
-
const targetTo = normalizeDiscordOriginChannelId(sessionTarget.to);
|
|
153
|
-
return targetTo ? {
|
|
154
|
-
to: targetTo,
|
|
155
|
-
threadId: normalizeDiscordThreadId(sessionTarget.threadId) ?? normalizeDiscordThreadId(sessionConversation?.threadId) ?? void 0
|
|
156
|
-
} : null;
|
|
157
|
-
},
|
|
158
|
-
resolveFallbackTarget: (request) => {
|
|
159
|
-
const sessionConversation = resolveApprovalRequestSessionConversation({
|
|
160
|
-
request,
|
|
161
|
-
channel: "discord",
|
|
162
|
-
bundledFallback: false
|
|
163
|
-
});
|
|
164
|
-
if (extractDiscordSessionKind(request.request.sessionKey?.trim() || null) === "dm") return null;
|
|
165
|
-
const fallbackChannelId = normalizeDiscordOriginChannelId(sessionConversation?.id);
|
|
166
|
-
return fallbackChannelId ? {
|
|
167
|
-
to: fallbackChannelId,
|
|
168
|
-
threadId: normalizeDiscordThreadId(sessionConversation?.threadId) ?? void 0
|
|
169
|
-
} : null;
|
|
170
|
-
}
|
|
171
|
-
});
|
|
172
|
-
}
|
|
173
|
-
function createDiscordApproverDmTargetResolver(configOverride) {
|
|
174
|
-
return createChannelApproverDmTargetResolver({
|
|
175
|
-
shouldHandleRequest: ({ cfg, accountId, request }) => shouldHandleDiscordApprovalRequest({
|
|
176
|
-
cfg,
|
|
177
|
-
accountId,
|
|
178
|
-
request,
|
|
179
|
-
configOverride
|
|
180
|
-
}),
|
|
181
|
-
resolveApprovers: ({ cfg, accountId }) => getDiscordExecApprovalApprovers({
|
|
182
|
-
cfg,
|
|
183
|
-
accountId,
|
|
184
|
-
configOverride
|
|
185
|
-
}),
|
|
186
|
-
mapApprover: (approver) => ({ to: approver })
|
|
187
|
-
});
|
|
188
|
-
}
|
|
189
|
-
function createDiscordApprovalCapability(configOverride) {
|
|
190
|
-
return createApproverRestrictedNativeApprovalCapability({
|
|
191
|
-
channel: "discord",
|
|
192
|
-
channelLabel: "Discord",
|
|
193
|
-
describeExecApprovalSetup: ({ accountId }) => {
|
|
194
|
-
const prefix = accountId && accountId !== "default" ? `channels.discord.accounts.${accountId}` : "channels.discord";
|
|
195
|
-
return `Approve it from the Web UI or terminal UI for now. Discord supports native exec approvals for this account. Configure \`${prefix}.execApprovals.approvers\` or \`commands.ownerAllowFrom\`; set \`${prefix}.execApprovals.enabled\` to \`auto\` or \`true\`.`;
|
|
196
|
-
},
|
|
197
|
-
listAccountIds: listDiscordAccountIds,
|
|
198
|
-
hasApprovers: ({ cfg, accountId }) => getDiscordExecApprovalApprovers({
|
|
199
|
-
cfg,
|
|
200
|
-
accountId,
|
|
201
|
-
configOverride
|
|
202
|
-
}).length > 0,
|
|
203
|
-
isExecAuthorizedSender: ({ cfg, accountId, senderId }) => isDiscordExecApprovalApprover({
|
|
204
|
-
cfg,
|
|
205
|
-
accountId,
|
|
206
|
-
senderId,
|
|
207
|
-
configOverride
|
|
208
|
-
}),
|
|
209
|
-
isNativeDeliveryEnabled: ({ cfg, accountId }) => isDiscordExecApprovalClientEnabled({
|
|
210
|
-
cfg,
|
|
211
|
-
accountId,
|
|
212
|
-
configOverride
|
|
213
|
-
}),
|
|
214
|
-
resolveNativeDeliveryMode: ({ cfg, accountId }) => configOverride?.target ?? resolveDiscordAccount({
|
|
215
|
-
cfg,
|
|
216
|
-
accountId
|
|
217
|
-
}).config.execApprovals?.target ?? "dm",
|
|
218
|
-
resolveOriginTarget: createDiscordOriginTargetResolver(configOverride),
|
|
219
|
-
resolveApproverDmTargets: createDiscordApproverDmTargetResolver(configOverride),
|
|
220
|
-
notifyOriginWhenDmOnly: true,
|
|
221
|
-
nativeRuntime: createLazyChannelApprovalNativeRuntimeAdapter({
|
|
222
|
-
eventKinds: ["exec", "plugin"],
|
|
223
|
-
isConfigured: ({ cfg, accountId }) => isDiscordExecApprovalClientEnabled({
|
|
224
|
-
cfg,
|
|
225
|
-
accountId,
|
|
226
|
-
configOverride
|
|
227
|
-
}),
|
|
228
|
-
shouldHandle: ({ cfg, accountId, request }) => shouldHandleDiscordApprovalRequest({
|
|
229
|
-
cfg,
|
|
230
|
-
accountId,
|
|
231
|
-
request,
|
|
232
|
-
configOverride
|
|
233
|
-
}),
|
|
234
|
-
load: async () => (await import("./approval-handler.runtime-Bw2pZNk1.js").then((n) => n.t)).discordApprovalNativeRuntime
|
|
235
|
-
})
|
|
236
|
-
});
|
|
237
|
-
}
|
|
238
|
-
let cachedDiscordApprovalCapability;
|
|
239
|
-
function getDiscordApprovalCapability() {
|
|
240
|
-
cachedDiscordApprovalCapability ??= createDiscordApprovalCapability();
|
|
241
|
-
return cachedDiscordApprovalCapability;
|
|
242
|
-
}
|
|
243
|
-
//#endregion
|
|
244
|
-
//#region extensions/discord/src/conversation-identity.ts
|
|
245
|
-
function normalizeDiscordTarget(raw, defaultKind) {
|
|
246
|
-
const trimmed = normalizeOptionalString(raw);
|
|
247
|
-
if (!trimmed) return;
|
|
248
|
-
return parseDiscordTarget(trimmed, { defaultKind })?.normalized;
|
|
249
|
-
}
|
|
250
|
-
function buildDiscordConversationIdentity(kind, rawId) {
|
|
251
|
-
const trimmed = normalizeOptionalString(rawId);
|
|
252
|
-
return trimmed ? `${kind}:${trimmed}` : void 0;
|
|
253
|
-
}
|
|
254
|
-
function resolveDiscordConversationIdentity(params) {
|
|
255
|
-
return params.isDirectMessage ? buildDiscordConversationIdentity("user", params.userId) : buildDiscordConversationIdentity("channel", params.channelId);
|
|
256
|
-
}
|
|
257
|
-
function resolveDiscordCurrentConversationIdentity(params) {
|
|
258
|
-
if (normalizeOptionalLowercaseString(params.chatType) === "direct") {
|
|
259
|
-
const senderTarget = normalizeDiscordTarget(params.from, "user");
|
|
260
|
-
if (senderTarget?.startsWith("user:")) return senderTarget;
|
|
261
|
-
}
|
|
262
|
-
for (const candidate of [
|
|
263
|
-
params.originatingTo,
|
|
264
|
-
params.commandTo,
|
|
265
|
-
params.fallbackTo
|
|
266
|
-
]) {
|
|
267
|
-
const target = normalizeDiscordTarget(candidate, "channel");
|
|
268
|
-
if (target) return target;
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
//#endregion
|
|
272
|
-
export { getDiscordExecApprovalApprovers as a, shouldSuppressLocalDiscordExecApprovalPrompt as c, shouldHandleDiscordApprovalRequest as i, resolveDiscordCurrentConversationIdentity as n, isDiscordExecApprovalApprover as o, getDiscordApprovalCapability as r, isDiscordExecApprovalClientEnabled as s, resolveDiscordConversationIdentity as t };
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { Jt as __exportAll } from "./send.receipt-BpBQED_5.js";
|
|
2
|
-
import { resolveFetch } from "openclaw/plugin-sdk/fetch-runtime";
|
|
3
|
-
import { readProviderJsonResponse, readResponseTextLimited } from "openclaw/plugin-sdk/provider-http";
|
|
4
|
-
//#region extensions/discord/src/pluralkit.ts
|
|
5
|
-
var pluralkit_exports = /* @__PURE__ */ __exportAll({ fetchPluralKitMessageInfo: () => fetchPluralKitMessageInfo });
|
|
6
|
-
const PLURALKIT_API_BASE = "https://api.pluralkit.me/v2";
|
|
7
|
-
const PLURALKIT_ERROR_BODY_LIMIT_BYTES = 8 * 1024;
|
|
8
|
-
async function fetchPluralKitMessageInfo(params) {
|
|
9
|
-
if (!params.config?.enabled) return null;
|
|
10
|
-
const fetchImpl = resolveFetch(params.fetcher);
|
|
11
|
-
if (!fetchImpl) return null;
|
|
12
|
-
const headers = {};
|
|
13
|
-
if (params.config.token?.trim()) headers.Authorization = params.config.token.trim();
|
|
14
|
-
const res = await fetchImpl(`${PLURALKIT_API_BASE}/messages/${params.messageId}`, { headers });
|
|
15
|
-
if (res.status === 404) return null;
|
|
16
|
-
if (!res.ok) {
|
|
17
|
-
const text = await readResponseTextLimited(res, PLURALKIT_ERROR_BODY_LIMIT_BYTES).catch(() => "");
|
|
18
|
-
const detail = text.trim() ? `: ${text.trim()}` : "";
|
|
19
|
-
throw new Error(`PluralKit API failed (${res.status})${detail}`);
|
|
20
|
-
}
|
|
21
|
-
return await readProviderJsonResponse(res, "PluralKit message");
|
|
22
|
-
}
|
|
23
|
-
//#endregion
|
|
24
|
-
export { pluralkit_exports as n, fetchPluralKitMessageInfo as t };
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { resolveChannelPreviewStreamMode } from "openclaw/plugin-sdk/channel-outbound";
|
|
2
|
-
//#region extensions/discord/src/preview-streaming.ts
|
|
3
|
-
function resolveDiscordPreviewStreamMode(params = {}) {
|
|
4
|
-
if (params.streaming === void 0 && params.streamMode === void 0) return "progress";
|
|
5
|
-
return resolveChannelPreviewStreamMode(params, "off");
|
|
6
|
-
}
|
|
7
|
-
//#endregion
|
|
8
|
-
export { resolveDiscordPreviewStreamMode as t };
|
package/dist/targets-69w7c3vU.js
DELETED