@spinabot/brigade 1.6.0 → 1.7.0
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/agents/agent-loop.d.ts.map +1 -1
- package/dist/agents/agent-loop.js +51 -1
- package/dist/agents/agent-loop.js.map +1 -1
- package/dist/agents/channels/bundled-channel-metas.d.ts +2 -0
- package/dist/agents/channels/bundled-channel-metas.d.ts.map +1 -1
- package/dist/agents/channels/bundled-channel-metas.js +11 -0
- package/dist/agents/channels/bundled-channel-metas.js.map +1 -1
- package/dist/agents/channels/discord/account-config.d.ts +177 -0
- package/dist/agents/channels/discord/account-config.d.ts.map +1 -0
- package/dist/agents/channels/discord/account-config.js +349 -0
- package/dist/agents/channels/discord/account-config.js.map +1 -0
- package/dist/agents/channels/discord/adapter.d.ts +79 -0
- package/dist/agents/channels/discord/adapter.d.ts.map +1 -0
- package/dist/agents/channels/discord/adapter.js +693 -0
- package/dist/agents/channels/discord/adapter.js.map +1 -0
- package/dist/agents/channels/discord/approval-authorize.d.ts +43 -0
- package/dist/agents/channels/discord/approval-authorize.d.ts.map +1 -0
- package/dist/agents/channels/discord/approval-authorize.js +71 -0
- package/dist/agents/channels/discord/approval-authorize.js.map +1 -0
- package/dist/agents/channels/discord/approval-native.d.ts +68 -0
- package/dist/agents/channels/discord/approval-native.d.ts.map +1 -0
- package/dist/agents/channels/discord/approval-native.js +81 -0
- package/dist/agents/channels/discord/approval-native.js.map +1 -0
- package/dist/agents/channels/discord/command-menu.d.ts +49 -0
- package/dist/agents/channels/discord/command-menu.d.ts.map +1 -0
- package/dist/agents/channels/discord/command-menu.js +73 -0
- package/dist/agents/channels/discord/command-menu.js.map +1 -0
- package/dist/agents/channels/discord/component-blocks.d.ts +108 -0
- package/dist/agents/channels/discord/component-blocks.d.ts.map +1 -0
- package/dist/agents/channels/discord/component-blocks.js +113 -0
- package/dist/agents/channels/discord/component-blocks.js.map +1 -0
- package/dist/agents/channels/discord/components.d.ts +175 -0
- package/dist/agents/channels/discord/components.d.ts.map +1 -0
- package/dist/agents/channels/discord/components.js +220 -0
- package/dist/agents/channels/discord/components.js.map +1 -0
- package/dist/agents/channels/discord/connection.d.ts +570 -0
- package/dist/agents/channels/discord/connection.d.ts.map +1 -0
- package/dist/agents/channels/discord/connection.js +1600 -0
- package/dist/agents/channels/discord/connection.js.map +1 -0
- package/dist/agents/channels/discord/directory-cache.d.ts +47 -0
- package/dist/agents/channels/discord/directory-cache.d.ts.map +1 -0
- package/dist/agents/channels/discord/directory-cache.js +131 -0
- package/dist/agents/channels/discord/directory-cache.js.map +1 -0
- package/dist/agents/channels/discord/directory-live.d.ts +61 -0
- package/dist/agents/channels/discord/directory-live.d.ts.map +1 -0
- package/dist/agents/channels/discord/directory-live.js +140 -0
- package/dist/agents/channels/discord/directory-live.js.map +1 -0
- package/dist/agents/channels/discord/draft-stream.d.ts +92 -0
- package/dist/agents/channels/discord/draft-stream.d.ts.map +1 -0
- package/dist/agents/channels/discord/draft-stream.js +213 -0
- package/dist/agents/channels/discord/draft-stream.js.map +1 -0
- package/dist/agents/channels/discord/format.d.ts +70 -0
- package/dist/agents/channels/discord/format.d.ts.map +1 -0
- package/dist/agents/channels/discord/format.js +303 -0
- package/dist/agents/channels/discord/format.js.map +1 -0
- package/dist/agents/channels/discord/guilds.d.ts +25 -0
- package/dist/agents/channels/discord/guilds.d.ts.map +1 -0
- package/dist/agents/channels/discord/guilds.js +46 -0
- package/dist/agents/channels/discord/guilds.js.map +1 -0
- package/dist/agents/channels/discord/inbound-extras.d.ts +377 -0
- package/dist/agents/channels/discord/inbound-extras.d.ts.map +1 -0
- package/dist/agents/channels/discord/inbound-extras.js +589 -0
- package/dist/agents/channels/discord/inbound-extras.js.map +1 -0
- package/dist/agents/channels/discord/index.d.ts +21 -0
- package/dist/agents/channels/discord/index.d.ts.map +1 -0
- package/dist/agents/channels/discord/index.js +21 -0
- package/dist/agents/channels/discord/index.js.map +1 -0
- package/dist/agents/channels/discord/media.d.ts +85 -0
- package/dist/agents/channels/discord/media.d.ts.map +1 -0
- package/dist/agents/channels/discord/media.js +242 -0
- package/dist/agents/channels/discord/media.js.map +1 -0
- package/dist/agents/channels/discord/modal-registry.d.ts +89 -0
- package/dist/agents/channels/discord/modal-registry.d.ts.map +1 -0
- package/dist/agents/channels/discord/modal-registry.js +104 -0
- package/dist/agents/channels/discord/modal-registry.js.map +1 -0
- package/dist/agents/channels/discord/modals.d.ts +100 -0
- package/dist/agents/channels/discord/modals.d.ts.map +1 -0
- package/dist/agents/channels/discord/modals.js +124 -0
- package/dist/agents/channels/discord/modals.js.map +1 -0
- package/dist/agents/channels/discord/module.d.ts +15 -0
- package/dist/agents/channels/discord/module.d.ts.map +1 -0
- package/dist/agents/channels/discord/module.js +22 -0
- package/dist/agents/channels/discord/module.js.map +1 -0
- package/dist/agents/channels/discord/permission-audit.d.ts +43 -0
- package/dist/agents/channels/discord/permission-audit.d.ts.map +1 -0
- package/dist/agents/channels/discord/permission-audit.js +192 -0
- package/dist/agents/channels/discord/permission-audit.js.map +1 -0
- package/dist/agents/channels/discord/plugin.d.ts +89 -0
- package/dist/agents/channels/discord/plugin.d.ts.map +1 -0
- package/dist/agents/channels/discord/plugin.js +372 -0
- package/dist/agents/channels/discord/plugin.js.map +1 -0
- package/dist/agents/channels/discord/probe.d.ts +115 -0
- package/dist/agents/channels/discord/probe.d.ts.map +1 -0
- package/dist/agents/channels/discord/probe.js +193 -0
- package/dist/agents/channels/discord/probe.js.map +1 -0
- package/dist/agents/channels/discord/reasoning-lane.d.ts +42 -0
- package/dist/agents/channels/discord/reasoning-lane.d.ts.map +1 -0
- package/dist/agents/channels/discord/reasoning-lane.js +68 -0
- package/dist/agents/channels/discord/reasoning-lane.js.map +1 -0
- package/dist/agents/channels/discord/rest-actions.d.ts +346 -0
- package/dist/agents/channels/discord/rest-actions.d.ts.map +1 -0
- package/dist/agents/channels/discord/rest-actions.js +559 -0
- package/dist/agents/channels/discord/rest-actions.js.map +1 -0
- package/dist/agents/channels/discord/rest-components.d.ts +122 -0
- package/dist/agents/channels/discord/rest-components.d.ts.map +1 -0
- package/dist/agents/channels/discord/rest-components.js +243 -0
- package/dist/agents/channels/discord/rest-components.js.map +1 -0
- package/dist/agents/channels/discord/security-audit.d.ts +29 -0
- package/dist/agents/channels/discord/security-audit.d.ts.map +1 -0
- package/dist/agents/channels/discord/security-audit.js +94 -0
- package/dist/agents/channels/discord/security-audit.js.map +1 -0
- package/dist/agents/channels/discord/security-doctor.d.ts +43 -0
- package/dist/agents/channels/discord/security-doctor.d.ts.map +1 -0
- package/dist/agents/channels/discord/security-doctor.js +83 -0
- package/dist/agents/channels/discord/security-doctor.js.map +1 -0
- package/dist/agents/channels/discord/status-issues.d.ts +37 -0
- package/dist/agents/channels/discord/status-issues.d.ts.map +1 -0
- package/dist/agents/channels/discord/status-issues.js +66 -0
- package/dist/agents/channels/discord/status-issues.js.map +1 -0
- package/dist/agents/channels/discord/subagent-thread-binding-store.d.ts +57 -0
- package/dist/agents/channels/discord/subagent-thread-binding-store.d.ts.map +1 -0
- package/dist/agents/channels/discord/subagent-thread-binding-store.js +98 -0
- package/dist/agents/channels/discord/subagent-thread-binding-store.js.map +1 -0
- package/dist/agents/channels/discord/subagent-thread-binding.d.ts +95 -0
- package/dist/agents/channels/discord/subagent-thread-binding.d.ts.map +1 -0
- package/dist/agents/channels/discord/subagent-thread-binding.js +208 -0
- package/dist/agents/channels/discord/subagent-thread-binding.js.map +1 -0
- package/dist/agents/channels/discord/system-events.d.ts +31 -0
- package/dist/agents/channels/discord/system-events.d.ts.map +1 -0
- package/dist/agents/channels/discord/system-events.js +74 -0
- package/dist/agents/channels/discord/system-events.js.map +1 -0
- package/dist/agents/channels/general-callback.d.ts +12 -0
- package/dist/agents/channels/general-callback.d.ts.map +1 -1
- package/dist/agents/channels/general-callback.js +18 -0
- package/dist/agents/channels/general-callback.js.map +1 -1
- package/dist/agents/channels/inbound-pipeline.d.ts.map +1 -1
- package/dist/agents/channels/inbound-pipeline.js +70 -10
- package/dist/agents/channels/inbound-pipeline.js.map +1 -1
- package/dist/agents/channels/sdk.d.ts +2 -0
- package/dist/agents/channels/sdk.d.ts.map +1 -1
- package/dist/agents/channels/sdk.js +2 -0
- package/dist/agents/channels/sdk.js.map +1 -1
- package/dist/agents/extensions/modules/index.d.ts.map +1 -1
- package/dist/agents/extensions/modules/index.js +5 -0
- package/dist/agents/extensions/modules/index.js.map +1 -1
- package/dist/agents/extensions/types.d.ts +7 -0
- package/dist/agents/extensions/types.d.ts.map +1 -1
- package/dist/agents/extensions/types.js.map +1 -1
- package/dist/agents/subagent-announce-delivery.d.ts +10 -0
- package/dist/agents/subagent-announce-delivery.d.ts.map +1 -1
- package/dist/agents/subagent-announce-delivery.js +1 -0
- package/dist/agents/subagent-announce-delivery.js.map +1 -1
- package/dist/agents/subagent-completion-bridge.d.ts.map +1 -1
- package/dist/agents/subagent-completion-bridge.js +81 -0
- package/dist/agents/subagent-completion-bridge.js.map +1 -1
- package/dist/agents/subagent-spawn.d.ts.map +1 -1
- package/dist/agents/subagent-spawn.js +57 -4
- package/dist/agents/subagent-spawn.js.map +1 -1
- package/dist/agents/tools/cron-tool.d.ts.map +1 -1
- package/dist/agents/tools/cron-tool.js +4 -1
- package/dist/agents/tools/cron-tool.js.map +1 -1
- package/dist/agents/tools/discord-action-tool.d.ts +224 -0
- package/dist/agents/tools/discord-action-tool.d.ts.map +1 -0
- package/dist/agents/tools/discord-action-tool.js +848 -0
- package/dist/agents/tools/discord-action-tool.js.map +1 -0
- package/dist/agents/tools/registry.d.ts.map +1 -1
- package/dist/agents/tools/registry.js +21 -0
- package/dist/agents/tools/registry.js.map +1 -1
- package/dist/agents/tools/sessions/index.d.ts +8 -0
- package/dist/agents/tools/sessions/index.d.ts.map +1 -1
- package/dist/agents/tools/sessions/index.js +15 -3
- package/dist/agents/tools/sessions/index.js.map +1 -1
- package/dist/buildstamp.json +1 -1
- package/dist/cli/commands/channels.d.ts +2 -0
- package/dist/cli/commands/channels.d.ts.map +1 -1
- package/dist/cli/commands/channels.js +58 -1
- package/dist/cli/commands/channels.js.map +1 -1
- package/dist/core/auth-bridge.d.ts +1 -0
- package/dist/core/auth-bridge.d.ts.map +1 -1
- package/dist/core/auth-bridge.js +46 -1
- package/dist/core/auth-bridge.js.map +1 -1
- package/dist/core/server.d.ts.map +1 -1
- package/dist/core/server.js +18 -2
- package/dist/core/server.js.map +1 -1
- package/dist/cron/isolated-agent/run-executor.d.ts +11 -0
- package/dist/cron/isolated-agent/run-executor.d.ts.map +1 -1
- package/dist/cron/isolated-agent/run-executor.js +20 -4
- package/dist/cron/isolated-agent/run-executor.js.map +1 -1
- package/dist/cron/types.d.ts +8 -0
- package/dist/cron/types.d.ts.map +1 -1
- package/dist/system-prompt/assembler.d.ts.map +1 -1
- package/dist/system-prompt/assembler.js +4 -2
- package/dist/system-prompt/assembler.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../../src/agents/channels/discord/adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Discord inline-approval authorization.
|
|
3
|
+
*
|
|
4
|
+
* When an approval prompt is rendered as buttons, ANY member who can see the
|
|
5
|
+
* message could press a button. Brigade's central inbound pipeline already runs
|
|
6
|
+
* the access-control gate before a button press reaches the approval-callback
|
|
7
|
+
* path, so only an admitted (allow-listed / owner) peer gets here at all — but a
|
|
8
|
+
* SHARED Discord guild channel is the edge case: in a channel the bot is in, an
|
|
9
|
+
* admitted member's button press should still be allowed only when that presser
|
|
10
|
+
* is an approved approver, not merely present in the room. Discord's
|
|
11
|
+
* multi-member guilds make this gate more load-bearing than a 1:1 DM.
|
|
12
|
+
*
|
|
13
|
+
* This predicate is the channel's `approvalCapability.authorizeApprover`. It is
|
|
14
|
+
* invoked CENTRALLY by `tryConsumeChannelApprovalCallback` with the presser's
|
|
15
|
+
* `senderId` (the Discord user id, a snowflake); returning `{ authorized: false,
|
|
16
|
+
* reason }` refuses the press without consuming the operator's pending approval
|
|
17
|
+
* (so the real operator can still answer). Policy:
|
|
18
|
+
*
|
|
19
|
+
* - When the channel has an explicit allow-from list configured (the approved
|
|
20
|
+
* senders), only those ids may approve.
|
|
21
|
+
* - When NO allow-from list is configured, defer to the access gate that
|
|
22
|
+
* already admitted the inbound and authorize the press (matches the text-
|
|
23
|
+
* reply path, which has no extra approver gate).
|
|
24
|
+
*
|
|
25
|
+
* Pure + deterministic over its `cfg` + `senderId` inputs — no I/O. Discord
|
|
26
|
+
* mirror of `slack/approval-authorize.ts`.
|
|
27
|
+
*/
|
|
28
|
+
import type { BrigadeConfig } from "../../../config/io.js";
|
|
29
|
+
/**
|
|
30
|
+
* Resolve whether `senderId` is allowed to answer a Discord inline approval.
|
|
31
|
+
* Returns `{ authorized: true }` when no explicit allow-from gate applies (the
|
|
32
|
+
* central access gate already admitted the inbound), or when the presser is on
|
|
33
|
+
* the configured allow-from list. Otherwise refuses with a reason.
|
|
34
|
+
*/
|
|
35
|
+
export declare function resolveDiscordApprover(args: {
|
|
36
|
+
cfg: BrigadeConfig;
|
|
37
|
+
senderId?: string;
|
|
38
|
+
accountId?: string;
|
|
39
|
+
}): {
|
|
40
|
+
authorized: boolean;
|
|
41
|
+
reason?: string;
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=approval-authorize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approval-authorize.d.ts","sourceRoot":"","sources":["../../../../src/agents/channels/discord/approval-authorize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AA0B3D;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC5C,GAAG,EAAE,aAAa,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG;IAAE,UAAU,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAU3C"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Discord inline-approval authorization.
|
|
3
|
+
*
|
|
4
|
+
* When an approval prompt is rendered as buttons, ANY member who can see the
|
|
5
|
+
* message could press a button. Brigade's central inbound pipeline already runs
|
|
6
|
+
* the access-control gate before a button press reaches the approval-callback
|
|
7
|
+
* path, so only an admitted (allow-listed / owner) peer gets here at all — but a
|
|
8
|
+
* SHARED Discord guild channel is the edge case: in a channel the bot is in, an
|
|
9
|
+
* admitted member's button press should still be allowed only when that presser
|
|
10
|
+
* is an approved approver, not merely present in the room. Discord's
|
|
11
|
+
* multi-member guilds make this gate more load-bearing than a 1:1 DM.
|
|
12
|
+
*
|
|
13
|
+
* This predicate is the channel's `approvalCapability.authorizeApprover`. It is
|
|
14
|
+
* invoked CENTRALLY by `tryConsumeChannelApprovalCallback` with the presser's
|
|
15
|
+
* `senderId` (the Discord user id, a snowflake); returning `{ authorized: false,
|
|
16
|
+
* reason }` refuses the press without consuming the operator's pending approval
|
|
17
|
+
* (so the real operator can still answer). Policy:
|
|
18
|
+
*
|
|
19
|
+
* - When the channel has an explicit allow-from list configured (the approved
|
|
20
|
+
* senders), only those ids may approve.
|
|
21
|
+
* - When NO allow-from list is configured, defer to the access gate that
|
|
22
|
+
* already admitted the inbound and authorize the press (matches the text-
|
|
23
|
+
* reply path, which has no extra approver gate).
|
|
24
|
+
*
|
|
25
|
+
* Pure + deterministic over its `cfg` + `senderId` inputs — no I/O. Discord
|
|
26
|
+
* mirror of `slack/approval-authorize.ts`.
|
|
27
|
+
*/
|
|
28
|
+
/** Read the channel's configured allow-from sender ids (string-normalized). */
|
|
29
|
+
function configuredAllowFrom(cfg, accountId) {
|
|
30
|
+
const channels = cfg.channels;
|
|
31
|
+
const slot = channels?.discord;
|
|
32
|
+
if (!slot)
|
|
33
|
+
return [];
|
|
34
|
+
const ids = [];
|
|
35
|
+
const push = (list) => {
|
|
36
|
+
for (const v of list ?? []) {
|
|
37
|
+
const s = String(v).trim();
|
|
38
|
+
if (s)
|
|
39
|
+
ids.push(s);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
push(slot.allowFrom);
|
|
43
|
+
// Per-account allow-from (multi-account shape) when an accountId is supplied.
|
|
44
|
+
if (accountId && Array.isArray(slot.accounts)) {
|
|
45
|
+
for (const entry of slot.accounts) {
|
|
46
|
+
if (entry && typeof entry.id === "string" && entry.id.trim() === accountId.trim())
|
|
47
|
+
push(entry.allowFrom);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return ids;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Resolve whether `senderId` is allowed to answer a Discord inline approval.
|
|
54
|
+
* Returns `{ authorized: true }` when no explicit allow-from gate applies (the
|
|
55
|
+
* central access gate already admitted the inbound), or when the presser is on
|
|
56
|
+
* the configured allow-from list. Otherwise refuses with a reason.
|
|
57
|
+
*/
|
|
58
|
+
export function resolveDiscordApprover(args) {
|
|
59
|
+
const allow = configuredAllowFrom(args.cfg, args.accountId);
|
|
60
|
+
// No explicit allow list → defer to the access gate that already ran.
|
|
61
|
+
if (allow.length === 0)
|
|
62
|
+
return { authorized: true };
|
|
63
|
+
const sender = (args.senderId ?? "").trim();
|
|
64
|
+
if (sender && allow.includes(sender))
|
|
65
|
+
return { authorized: true };
|
|
66
|
+
return {
|
|
67
|
+
authorized: false,
|
|
68
|
+
reason: "Only an approved sender can answer that approval.",
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=approval-authorize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approval-authorize.js","sourceRoot":"","sources":["../../../../src/agents/channels/discord/approval-authorize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAIH,+EAA+E;AAC/E,SAAS,mBAAmB,CAAC,GAAkB,EAAE,SAAkB;IAClE,MAAM,QAAQ,GAAI,GAA8C,CAAC,QAAQ,CAAC;IAC1E,MAAM,IAAI,GAAG,QAAQ,EAAE,OAEX,CAAC;IACb,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,IAAI,GAAG,CAAC,IAA6B,EAAE,EAAE;QAC9C,KAAK,MAAM,CAAC,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC;YAC5B,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC3B,IAAI,CAAC;gBAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACF,CAAC,CAAC;IACF,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACrB,8EAA8E;IAC9E,IAAI,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/C,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnC,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ,IAAI,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,SAAS,CAAC,IAAI,EAAE;gBAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC1G,CAAC;IACF,CAAC;IACD,OAAO,GAAG,CAAC;AACZ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAItC;IACA,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAC5D,sEAAsE;IACtE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IACpD,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5C,IAAI,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IAClE,OAAO;QACN,UAAU,EAAE,KAAK;QACjB,MAAM,EAAE,mDAAmD;KAC3D,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Discord message-component rendering for native approval prompts.
|
|
3
|
+
*
|
|
4
|
+
* When a channel-routed turn raises an exec/plugin approval AND the Discord
|
|
5
|
+
* adapter has opted into `approvalCapability.sendApprovalPrompt`, the central
|
|
6
|
+
* approval-router asks this channel to render the question as native BUTTONS
|
|
7
|
+
* instead of the default "reply yes/no" text card. The button payloads are
|
|
8
|
+
* produced by the CENTRAL codec (`buildApprovalCallbackButtons`) so the press
|
|
9
|
+
* comes back as an `InboundMessage.callbackQuery` the central
|
|
10
|
+
* `tryConsumeChannelApprovalCallback` decodes + resolves — this file only maps
|
|
11
|
+
* the codec's `{ label, data }` specs onto Discord's component-row shape (via
|
|
12
|
+
* `components.ts`) and assembles the prompt text.
|
|
13
|
+
*
|
|
14
|
+
* SAFETY: every button `custom_id` here is the codec's output — versioned,
|
|
15
|
+
* base64url + printable-ASCII, already proven `<= 64` UTF-8 bytes by
|
|
16
|
+
* `encodeApprovalCallback` (and well under Discord's 100-char custom_id cap).
|
|
17
|
+
* This module never mints its own payloads.
|
|
18
|
+
*
|
|
19
|
+
* Discord mirror of `slack/approval-native.ts`.
|
|
20
|
+
*/
|
|
21
|
+
import { type DiscordActionRow } from "./components.js";
|
|
22
|
+
/** The Discord message payload an approval prompt sends: prompt `text` + button `rows`. */
|
|
23
|
+
export interface DiscordApprovalMessage {
|
|
24
|
+
/** Prompt body rendered above the buttons. */
|
|
25
|
+
text: string;
|
|
26
|
+
/** The component rows (a row of up to 5 buttons; up to 5 rows). */
|
|
27
|
+
rows: DiscordActionRow[];
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Build the component approval message for an approval prompt from the central
|
|
31
|
+
* codec. Returns `null` when fewer than two byte-safe buttons could be minted (a
|
|
32
|
+
* pathologically long approval id) — the caller then falls back to the text
|
|
33
|
+
* prompt rather than ship a half-rendered prompt.
|
|
34
|
+
*
|
|
35
|
+
* `allowAlways: false` drops the "Allow always" button (approvals where
|
|
36
|
+
* persisting an allowlist entry doesn't apply).
|
|
37
|
+
*/
|
|
38
|
+
export declare function buildDiscordApprovalMessage(args: {
|
|
39
|
+
approvalId: string;
|
|
40
|
+
command: string;
|
|
41
|
+
approvalKind: "exec" | "plugin";
|
|
42
|
+
toolName?: string;
|
|
43
|
+
allowAlways?: boolean;
|
|
44
|
+
}): DiscordApprovalMessage | null;
|
|
45
|
+
/**
|
|
46
|
+
* Compose the operator-facing approval question text rendered ABOVE the buttons.
|
|
47
|
+
* Kept short + control-char-scrubbed; the buttons carry the action, so the text
|
|
48
|
+
* only needs the command preview + a one-line ask. The 🦁 mark is the Brigade
|
|
49
|
+
* brand-stamp so the operator recognises this as a Brigade prompt. The command
|
|
50
|
+
* preview is wrapped in a Discord inline code span (single backticks) so it
|
|
51
|
+
* renders verbatim.
|
|
52
|
+
*/
|
|
53
|
+
export declare function buildDiscordApprovalText(args: {
|
|
54
|
+
command: string;
|
|
55
|
+
approvalKind: "exec" | "plugin";
|
|
56
|
+
toolName?: string;
|
|
57
|
+
agentId?: string;
|
|
58
|
+
}): string;
|
|
59
|
+
/**
|
|
60
|
+
* Parse a pressed button's `custom_id` into the pending-approval id + decision,
|
|
61
|
+
* via the CENTRAL codec. Returns `null` when the press wasn't an approval button
|
|
62
|
+
* (a general button, or a foreign id) so the caller can fall through.
|
|
63
|
+
*/
|
|
64
|
+
export declare function parseDiscordApprovalAction(customId: string | undefined): {
|
|
65
|
+
approvalId: string;
|
|
66
|
+
decision: "allow-once" | "allow-always" | "deny";
|
|
67
|
+
} | null;
|
|
68
|
+
//# sourceMappingURL=approval-native.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approval-native.d.ts","sourceRoot":"","sources":["../../../../src/agents/channels/discord/approval-native.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,EAA4B,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAKlF,2FAA2F;AAC3F,MAAM,WAAW,sBAAsB;IACtC,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,IAAI,EAAE,gBAAgB,EAAE,CAAC;CACzB;AAED;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE;IACjD,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,GAAG,QAAQ,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;CACtB,GAAG,sBAAsB,GAAG,IAAI,CAchC;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,GAAG,QAAQ,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,MAAM,CAWT;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CACzC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC1B;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,YAAY,GAAG,cAAc,GAAG,MAAM,CAAA;CAAE,GAAG,IAAI,CAGjF"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Discord message-component rendering for native approval prompts.
|
|
3
|
+
*
|
|
4
|
+
* When a channel-routed turn raises an exec/plugin approval AND the Discord
|
|
5
|
+
* adapter has opted into `approvalCapability.sendApprovalPrompt`, the central
|
|
6
|
+
* approval-router asks this channel to render the question as native BUTTONS
|
|
7
|
+
* instead of the default "reply yes/no" text card. The button payloads are
|
|
8
|
+
* produced by the CENTRAL codec (`buildApprovalCallbackButtons`) so the press
|
|
9
|
+
* comes back as an `InboundMessage.callbackQuery` the central
|
|
10
|
+
* `tryConsumeChannelApprovalCallback` decodes + resolves — this file only maps
|
|
11
|
+
* the codec's `{ label, data }` specs onto Discord's component-row shape (via
|
|
12
|
+
* `components.ts`) and assembles the prompt text.
|
|
13
|
+
*
|
|
14
|
+
* SAFETY: every button `custom_id` here is the codec's output — versioned,
|
|
15
|
+
* base64url + printable-ASCII, already proven `<= 64` UTF-8 bytes by
|
|
16
|
+
* `encodeApprovalCallback` (and well under Discord's 100-char custom_id cap).
|
|
17
|
+
* This module never mints its own payloads.
|
|
18
|
+
*
|
|
19
|
+
* Discord mirror of `slack/approval-native.ts`.
|
|
20
|
+
*/
|
|
21
|
+
import { buildApprovalCallbackButtons, decodeApprovalCallback } from "../sdk.js";
|
|
22
|
+
import { buildDiscordApprovalRows } from "./components.js";
|
|
23
|
+
/** C0/C1 control-character class (incl. NUL) — never a raw control byte in source. */
|
|
24
|
+
const CONTROL_CHARS_RE = /[\x00-\x1f\x7f-\x9f]/g;
|
|
25
|
+
/**
|
|
26
|
+
* Build the component approval message for an approval prompt from the central
|
|
27
|
+
* codec. Returns `null` when fewer than two byte-safe buttons could be minted (a
|
|
28
|
+
* pathologically long approval id) — the caller then falls back to the text
|
|
29
|
+
* prompt rather than ship a half-rendered prompt.
|
|
30
|
+
*
|
|
31
|
+
* `allowAlways: false` drops the "Allow always" button (approvals where
|
|
32
|
+
* persisting an allowlist entry doesn't apply).
|
|
33
|
+
*/
|
|
34
|
+
export function buildDiscordApprovalMessage(args) {
|
|
35
|
+
const specs = buildApprovalCallbackButtons({
|
|
36
|
+
approvalId: args.approvalId,
|
|
37
|
+
...(args.allowAlways === false ? { allowAlways: false } : {}),
|
|
38
|
+
});
|
|
39
|
+
if (specs.length < 2)
|
|
40
|
+
return null; // not enough buttons → caller uses text prompt
|
|
41
|
+
const rows = buildDiscordApprovalRows(specs);
|
|
42
|
+
if (rows.length === 0)
|
|
43
|
+
return null;
|
|
44
|
+
const text = buildDiscordApprovalText({
|
|
45
|
+
command: args.command,
|
|
46
|
+
approvalKind: args.approvalKind,
|
|
47
|
+
...(args.toolName !== undefined ? { toolName: args.toolName } : {}),
|
|
48
|
+
});
|
|
49
|
+
return { text, rows };
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Compose the operator-facing approval question text rendered ABOVE the buttons.
|
|
53
|
+
* Kept short + control-char-scrubbed; the buttons carry the action, so the text
|
|
54
|
+
* only needs the command preview + a one-line ask. The 🦁 mark is the Brigade
|
|
55
|
+
* brand-stamp so the operator recognises this as a Brigade prompt. The command
|
|
56
|
+
* preview is wrapped in a Discord inline code span (single backticks) so it
|
|
57
|
+
* renders verbatim.
|
|
58
|
+
*/
|
|
59
|
+
export function buildDiscordApprovalText(args) {
|
|
60
|
+
const flat = args.command
|
|
61
|
+
.replace(/[\r\n]+/g, " ")
|
|
62
|
+
// oxlint-disable-next-line no-control-regex
|
|
63
|
+
.replace(CONTROL_CHARS_RE, " ")
|
|
64
|
+
.replace(/\s+/g, " ")
|
|
65
|
+
.trim();
|
|
66
|
+
const preview = flat.length <= 180 ? flat : `${flat.slice(0, 177)}…`;
|
|
67
|
+
const what = args.approvalKind === "plugin" ? "run a plugin action" : "run a shell command";
|
|
68
|
+
const lines = [`🦁 Brigade wants to ${what}:`, `\`${preview}\``, "", "Choose below — times out in 5 minutes."];
|
|
69
|
+
return lines.join("\n");
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Parse a pressed button's `custom_id` into the pending-approval id + decision,
|
|
73
|
+
* via the CENTRAL codec. Returns `null` when the press wasn't an approval button
|
|
74
|
+
* (a general button, or a foreign id) so the caller can fall through.
|
|
75
|
+
*/
|
|
76
|
+
export function parseDiscordApprovalAction(customId) {
|
|
77
|
+
if (!customId)
|
|
78
|
+
return null;
|
|
79
|
+
return decodeApprovalCallback(customId);
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=approval-native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approval-native.js","sourceRoot":"","sources":["../../../../src/agents/channels/discord/approval-native.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,4BAA4B,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AACjF,OAAO,EAAE,wBAAwB,EAAyB,MAAM,iBAAiB,CAAC;AAElF,sFAAsF;AACtF,MAAM,gBAAgB,GAAG,uBAAuB,CAAC;AAUjD;;;;;;;;GAQG;AACH,MAAM,UAAU,2BAA2B,CAAC,IAM3C;IACA,MAAM,KAAK,GAAG,4BAA4B,CAAC;QAC1C,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,GAAG,CAAC,IAAI,CAAC,WAAW,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC7D,CAAC,CAAC;IACH,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,+CAA+C;IAClF,MAAM,IAAI,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;IAC7C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,IAAI,GAAG,wBAAwB,CAAC;QACrC,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,GAAG,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACnE,CAAC,CAAC;IACH,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACvB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,wBAAwB,CAAC,IAKxC;IACA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO;SACvB,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC;QACzB,4CAA4C;SAC3C,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC;SAC9B,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,IAAI,EAAE,CAAC;IACT,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC;IACrE,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,qBAAqB,CAAC;IAC5F,MAAM,KAAK,GAAG,CAAC,uBAAuB,IAAI,GAAG,EAAE,KAAK,OAAO,IAAI,EAAE,EAAE,EAAE,wCAAwC,CAAC,CAAC;IAC/G,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CACzC,QAA4B;IAE5B,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3B,OAAO,sBAAsB,CAAC,QAAQ,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Discord native command menu — map Brigade's central channel commands onto the
|
|
3
|
+
* application-command payload that Discord's REST `PUT /applications/{id}/commands`
|
|
4
|
+
* (or the per-guild variant) registers, so the operator sees `/help`, `/status`,
|
|
5
|
+
* … as native Discord slash commands.
|
|
6
|
+
*
|
|
7
|
+
* Brigade owns the command set centrally (`buildBundledCommands` → `/help`,
|
|
8
|
+
* `/status`, `/allowlist`, `/agent`, `/agents`, `/whoami`, `/org`, plus any
|
|
9
|
+
* module-registered channel commands). Discord — like Telegram's `setMyCommands`
|
|
10
|
+
* but UNLIKE Slack (whose slash commands are configured by hand in the app UI) —
|
|
11
|
+
* accepts a programmatic registration, so on connect the connection PUTs this
|
|
12
|
+
* manifest. (Discord slash commands carry no positional args by default, so the
|
|
13
|
+
* agent receives `/status` etc. as a bare command; an inbound interaction is
|
|
14
|
+
* normalized back into a `/command` text turn.)
|
|
15
|
+
*
|
|
16
|
+
* Discord's constraints (enforced here so a malformed command never makes the
|
|
17
|
+
* whole `PUT` reject):
|
|
18
|
+
* - command name: 1–32 chars, lowercase, `[a-z0-9_-]` only (leading `/` stripped).
|
|
19
|
+
* - description: 1–100 chars (clamped; a non-empty fallback is always emitted
|
|
20
|
+
* since Discord rejects an empty description).
|
|
21
|
+
* - at most 100 global commands.
|
|
22
|
+
* - CHAT_INPUT command type = 1.
|
|
23
|
+
*
|
|
24
|
+
* Pure / deterministic — no I/O. Output command names are printable ASCII
|
|
25
|
+
* (`[a-z0-9_-]`), so no NUL / control byte can appear.
|
|
26
|
+
*/
|
|
27
|
+
import type { ChannelCommand } from "../sdk.js";
|
|
28
|
+
/** A Discord application-command (CHAT_INPUT) registration entry. */
|
|
29
|
+
export interface DiscordApplicationCommand {
|
|
30
|
+
/** Command WITHOUT the leading slash, e.g. `status`. */
|
|
31
|
+
name: string;
|
|
32
|
+
/** Short description shown in the Discord command hint (1–100 chars). */
|
|
33
|
+
description: string;
|
|
34
|
+
/** CHAT_INPUT command type (1). */
|
|
35
|
+
type: 1;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Normalize a command word to Discord's `[a-z0-9_-]{1,32}` shape, or null if
|
|
39
|
+
* unusable. Strips a leading `/`, lowercases, and drops disallowed chars.
|
|
40
|
+
*/
|
|
41
|
+
export declare function normalizeDiscordCommandName(raw: string): string | null;
|
|
42
|
+
/**
|
|
43
|
+
* Build the Discord application-command manifest from Brigade's central channel
|
|
44
|
+
* commands. De-dupes by normalized name (first wins), drops unusable names, and
|
|
45
|
+
* caps at Discord's 100-command ceiling. Returns `[]` when nothing maps (the
|
|
46
|
+
* connection then skips the REST `PUT` entirely).
|
|
47
|
+
*/
|
|
48
|
+
export declare function buildDiscordCommandManifest(commands: ReadonlyArray<ChannelCommand>): DiscordApplicationCommand[];
|
|
49
|
+
//# sourceMappingURL=command-menu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-menu.d.ts","sourceRoot":"","sources":["../../../../src/agents/channels/discord/command-menu.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEhD,qEAAqE;AACrE,MAAM,WAAW,yBAAyB;IACzC,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,WAAW,EAAE,MAAM,CAAC;IACpB,mCAAmC;IACnC,IAAI,EAAE,CAAC,CAAC;CACR;AAWD;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKtE;AAUD;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,aAAa,CAAC,cAAc,CAAC,GAAG,yBAAyB,EAAE,CAWhH"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Discord native command menu — map Brigade's central channel commands onto the
|
|
3
|
+
* application-command payload that Discord's REST `PUT /applications/{id}/commands`
|
|
4
|
+
* (or the per-guild variant) registers, so the operator sees `/help`, `/status`,
|
|
5
|
+
* … as native Discord slash commands.
|
|
6
|
+
*
|
|
7
|
+
* Brigade owns the command set centrally (`buildBundledCommands` → `/help`,
|
|
8
|
+
* `/status`, `/allowlist`, `/agent`, `/agents`, `/whoami`, `/org`, plus any
|
|
9
|
+
* module-registered channel commands). Discord — like Telegram's `setMyCommands`
|
|
10
|
+
* but UNLIKE Slack (whose slash commands are configured by hand in the app UI) —
|
|
11
|
+
* accepts a programmatic registration, so on connect the connection PUTs this
|
|
12
|
+
* manifest. (Discord slash commands carry no positional args by default, so the
|
|
13
|
+
* agent receives `/status` etc. as a bare command; an inbound interaction is
|
|
14
|
+
* normalized back into a `/command` text turn.)
|
|
15
|
+
*
|
|
16
|
+
* Discord's constraints (enforced here so a malformed command never makes the
|
|
17
|
+
* whole `PUT` reject):
|
|
18
|
+
* - command name: 1–32 chars, lowercase, `[a-z0-9_-]` only (leading `/` stripped).
|
|
19
|
+
* - description: 1–100 chars (clamped; a non-empty fallback is always emitted
|
|
20
|
+
* since Discord rejects an empty description).
|
|
21
|
+
* - at most 100 global commands.
|
|
22
|
+
* - CHAT_INPUT command type = 1.
|
|
23
|
+
*
|
|
24
|
+
* Pure / deterministic — no I/O. Output command names are printable ASCII
|
|
25
|
+
* (`[a-z0-9_-]`), so no NUL / control byte can appear.
|
|
26
|
+
*/
|
|
27
|
+
/** Discord application-command limits. */
|
|
28
|
+
const MAX_COMMANDS = 100;
|
|
29
|
+
const MAX_NAME_LEN = 32;
|
|
30
|
+
const MAX_DESC_LEN = 100;
|
|
31
|
+
/** Discord allows lowercase `[a-z0-9_-]` (1–32) in a CHAT_INPUT command name. */
|
|
32
|
+
const COMMAND_NAME_RE = /^[a-z0-9_-]{1,32}$/;
|
|
33
|
+
/** CHAT_INPUT application-command type. */
|
|
34
|
+
const CHAT_INPUT = 1;
|
|
35
|
+
/**
|
|
36
|
+
* Normalize a command word to Discord's `[a-z0-9_-]{1,32}` shape, or null if
|
|
37
|
+
* unusable. Strips a leading `/`, lowercases, and drops disallowed chars.
|
|
38
|
+
*/
|
|
39
|
+
export function normalizeDiscordCommandName(raw) {
|
|
40
|
+
const stripped = raw.trim().replace(/^\/+/, "").toLowerCase();
|
|
41
|
+
const cleaned = stripped.replace(/[^a-z0-9_-]/g, "").slice(0, MAX_NAME_LEN);
|
|
42
|
+
if (!cleaned || !COMMAND_NAME_RE.test(cleaned))
|
|
43
|
+
return null;
|
|
44
|
+
return cleaned;
|
|
45
|
+
}
|
|
46
|
+
/** Clamp + flatten a description to a single printable line within Discord's cap (never empty). */
|
|
47
|
+
function normalizeDescription(desc, fallback) {
|
|
48
|
+
const raw = (desc ?? "").replace(/\s+/g, " ").trim() || fallback;
|
|
49
|
+
const clamped = raw.length > MAX_DESC_LEN ? `${raw.slice(0, MAX_DESC_LEN - 1)}…` : raw;
|
|
50
|
+
// Discord rejects an empty description — guarantee at least the fallback name.
|
|
51
|
+
return clamped || fallback;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Build the Discord application-command manifest from Brigade's central channel
|
|
55
|
+
* commands. De-dupes by normalized name (first wins), drops unusable names, and
|
|
56
|
+
* caps at Discord's 100-command ceiling. Returns `[]` when nothing maps (the
|
|
57
|
+
* connection then skips the REST `PUT` entirely).
|
|
58
|
+
*/
|
|
59
|
+
export function buildDiscordCommandManifest(commands) {
|
|
60
|
+
const out = [];
|
|
61
|
+
const seen = new Set();
|
|
62
|
+
for (const cmd of commands) {
|
|
63
|
+
if (out.length >= MAX_COMMANDS)
|
|
64
|
+
break;
|
|
65
|
+
const name = normalizeDiscordCommandName(cmd.name);
|
|
66
|
+
if (!name || seen.has(name))
|
|
67
|
+
continue;
|
|
68
|
+
seen.add(name);
|
|
69
|
+
out.push({ name, description: normalizeDescription(cmd.description, name), type: CHAT_INPUT });
|
|
70
|
+
}
|
|
71
|
+
return out;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=command-menu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-menu.js","sourceRoot":"","sources":["../../../../src/agents/channels/discord/command-menu.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAcH,0CAA0C;AAC1C,MAAM,YAAY,GAAG,GAAG,CAAC;AACzB,MAAM,YAAY,GAAG,EAAE,CAAC;AACxB,MAAM,YAAY,GAAG,GAAG,CAAC;AACzB,iFAAiF;AACjF,MAAM,eAAe,GAAG,oBAAoB,CAAC;AAC7C,2CAA2C;AAC3C,MAAM,UAAU,GAAG,CAAU,CAAC;AAE9B;;;GAGG;AACH,MAAM,UAAU,2BAA2B,CAAC,GAAW;IACtD,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC9D,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;IAC5E,IAAI,CAAC,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5D,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,mGAAmG;AACnG,SAAS,oBAAoB,CAAC,IAAwB,EAAE,QAAgB;IACvE,MAAM,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,QAAQ,CAAC;IACjE,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IACvF,+EAA+E;IAC/E,OAAO,OAAO,IAAI,QAAQ,CAAC;AAC5B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B,CAAC,QAAuC;IAClF,MAAM,GAAG,GAAgC,EAAE,CAAC;IAC5C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,GAAG,CAAC,MAAM,IAAI,YAAY;YAAE,MAAM;QACtC,MAAM,IAAI,GAAG,2BAA2B,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QACtC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACf,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,oBAAoB,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;IAChG,CAAC;IACD,OAAO,GAAG,CAAC;AACZ,CAAC"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Discord Components-V2 layout-block specs (Fix 3c).
|
|
3
|
+
*
|
|
4
|
+
* Components V2 lets a message carry rich layout — containers, sections,
|
|
5
|
+
* separators, media galleries, files, and free-standing text — instead of a
|
|
6
|
+
* plain `content` string + button rows. A V2 message MUST set the
|
|
7
|
+
* `IsComponentsV2` flag and CANNOT carry plain `content`; all text moves into
|
|
8
|
+
* `TextDisplay` blocks. Link buttons (a button with a `url` + no custom_id) are
|
|
9
|
+
* the one button kind that fits naturally in a V2 layout.
|
|
10
|
+
*
|
|
11
|
+
* This module mirrors `components.ts`: it emits PLAIN serializable specs (a
|
|
12
|
+
* `DiscordBlockSpec` list) and never imports discord.js, so it stays pure +
|
|
13
|
+
* unit-testable. The connection turns each spec into the matching discord.js V2
|
|
14
|
+
* builder at send time (`ContainerBuilder` / `SectionBuilder` / `SeparatorBuilder`
|
|
15
|
+
* / `TextDisplayBuilder` / `MediaGalleryBuilder` / `FileBuilder`).
|
|
16
|
+
*
|
|
17
|
+
* Pure / deterministic — no I/O, no globals.
|
|
18
|
+
*/
|
|
19
|
+
import { type DiscordButtonStyleValue } from "./components.js";
|
|
20
|
+
/** `MessageFlags.IsComponentsV2` (1 << 15). A V2 message sets this + drops plain content. */
|
|
21
|
+
export declare const DISCORD_FLAG_IS_COMPONENTS_V2: number;
|
|
22
|
+
/** discord.js `ButtonStyle.Link` value (a URL button, no custom_id). */
|
|
23
|
+
export declare const DISCORD_BUTTON_STYLE_LINK = 5;
|
|
24
|
+
/** A link button — opens a URL; carries NO custom_id, so it never routes a turn. */
|
|
25
|
+
export interface DiscordLinkButtonSpec {
|
|
26
|
+
/** Button label (≤ 80 chars). */
|
|
27
|
+
label: string;
|
|
28
|
+
/** Destination URL. */
|
|
29
|
+
url: string;
|
|
30
|
+
}
|
|
31
|
+
/** An interactive button inside a V2 actions block (general-prefixed customId). */
|
|
32
|
+
export interface DiscordV2ButtonSpec {
|
|
33
|
+
label: string;
|
|
34
|
+
/** Already general-prefixed + sanitized customId (a press routes a turn). */
|
|
35
|
+
customId: string;
|
|
36
|
+
style?: DiscordButtonStyleValue;
|
|
37
|
+
}
|
|
38
|
+
/** A media-gallery item (an image/video URL + optional alt + spoiler). */
|
|
39
|
+
export interface DiscordMediaItem {
|
|
40
|
+
url: string;
|
|
41
|
+
description?: string;
|
|
42
|
+
spoiler?: boolean;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* A single V2 layout block. Discriminated by `type`. Sections may carry an
|
|
46
|
+
* optional accessory (a thumbnail URL or a button). `actions` carries link
|
|
47
|
+
* and/or interactive buttons.
|
|
48
|
+
*/
|
|
49
|
+
export type DiscordBlockSpec = {
|
|
50
|
+
type: "text";
|
|
51
|
+
text: string;
|
|
52
|
+
} | {
|
|
53
|
+
type: "section";
|
|
54
|
+
/** One to three text lines rendered in the section body. */
|
|
55
|
+
texts: string[];
|
|
56
|
+
accessory?: {
|
|
57
|
+
kind: "thumbnail";
|
|
58
|
+
url: string;
|
|
59
|
+
} | {
|
|
60
|
+
kind: "button";
|
|
61
|
+
button: DiscordLinkButtonSpec | DiscordV2ButtonSpec;
|
|
62
|
+
};
|
|
63
|
+
} | {
|
|
64
|
+
type: "separator";
|
|
65
|
+
divider?: boolean;
|
|
66
|
+
spacing?: "small" | "large";
|
|
67
|
+
} | {
|
|
68
|
+
type: "actions";
|
|
69
|
+
buttons: Array<DiscordLinkButtonSpec | DiscordV2ButtonSpec>;
|
|
70
|
+
} | {
|
|
71
|
+
type: "media-gallery";
|
|
72
|
+
items: DiscordMediaItem[];
|
|
73
|
+
} | {
|
|
74
|
+
type: "file";
|
|
75
|
+
url: `attachment://${string}`;
|
|
76
|
+
spoiler?: boolean;
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* A serializable Components-V2 message spec — a `container` (the top-level V2
|
|
80
|
+
* wrapper) holding ordered blocks. The connection wraps it in a single
|
|
81
|
+
* `ContainerBuilder` and sets the V2 flag. `accentColor` tints the container
|
|
82
|
+
* stripe (a Discord color int).
|
|
83
|
+
*/
|
|
84
|
+
export interface DiscordV2MessageSpec {
|
|
85
|
+
/** Discriminator marking this row as a V2 container (vs a button/select row). */
|
|
86
|
+
readonly row: "v2";
|
|
87
|
+
blocks: DiscordBlockSpec[];
|
|
88
|
+
accentColor?: number;
|
|
89
|
+
}
|
|
90
|
+
/** True when a `buildComponentRows` entry is a V2 container marker. */
|
|
91
|
+
export declare function isDiscordV2MessageSpec(row: unknown): row is DiscordV2MessageSpec;
|
|
92
|
+
/** True when a button spec is a LINK button (URL, no custom_id). */
|
|
93
|
+
export declare function isDiscordLinkButton(b: DiscordLinkButtonSpec | DiscordV2ButtonSpec): b is DiscordLinkButtonSpec;
|
|
94
|
+
/** The attachment-ref prefix a `file` block expects (Discord requires it). */
|
|
95
|
+
export declare const DISCORD_ATTACHMENT_REF_PREFIX = "attachment://";
|
|
96
|
+
/**
|
|
97
|
+
* Shape a high-level V2 message into a serializable container spec, or `null`
|
|
98
|
+
* when nothing renderable remains. Defensive caps mirror Discord's limits
|
|
99
|
+
* (section ≤ 3 texts, button label ≤ 80). A `file` block whose url isn't an
|
|
100
|
+
* `attachment://` ref is dropped (Discord rejects external file refs). Returns
|
|
101
|
+
* `null` when the resulting container would be empty so the caller can fall back
|
|
102
|
+
* to a plain text send.
|
|
103
|
+
*/
|
|
104
|
+
export declare function buildDiscordV2Message(spec: {
|
|
105
|
+
blocks: DiscordBlockSpec[];
|
|
106
|
+
accentColor?: number;
|
|
107
|
+
}): DiscordV2MessageSpec | null;
|
|
108
|
+
//# sourceMappingURL=component-blocks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"component-blocks.d.ts","sourceRoot":"","sources":["../../../../src/agents/channels/discord/component-blocks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAwB,KAAK,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAErF,6FAA6F;AAC7F,eAAO,MAAM,6BAA6B,QAAU,CAAC;AAErD,wEAAwE;AACxE,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAE3C,oFAAoF;AACpF,MAAM,WAAW,qBAAqB;IACrC,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,uBAAuB;IACvB,GAAG,EAAE,MAAM,CAAC;CACZ;AAED,mFAAmF;AACnF,MAAM,WAAW,mBAAmB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,6EAA6E;IAC7E,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,uBAAuB,CAAC;CAChC;AAED,0EAA0E;AAC1E,MAAM,WAAW,gBAAgB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GACzB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IACA,IAAI,EAAE,SAAS,CAAC;IAChB,4DAA4D;IAC5D,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE;QAAE,IAAI,EAAE,WAAW,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,QAAQ,CAAC;QAAC,MAAM,EAAE,qBAAqB,GAAG,mBAAmB,CAAA;KAAE,CAAC;CACxH,GACD;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAA;CAAE,GACrE;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,KAAK,CAAC,qBAAqB,GAAG,mBAAmB,CAAC,CAAA;CAAE,GAChF;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,KAAK,EAAE,gBAAgB,EAAE,CAAA;CAAE,GACpD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,gBAAgB,MAAM,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEtE;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACpC,iFAAiF;IACjF,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC;IACnB,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,uEAAuE;AACvE,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,oBAAoB,CAEhF;AAED,oEAAoE;AACpE,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,qBAAqB,GAAG,mBAAmB,GAAG,CAAC,IAAI,qBAAqB,CAE9G;AAED,8EAA8E;AAC9E,eAAO,MAAM,6BAA6B,kBAAkB,CAAC;AAK7D;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE;IAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,oBAAoB,GAAG,IAAI,CAyD7H"}
|