discord-agent-bridge 0.1.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.
Files changed (201) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +195 -0
  3. package/dist/app.js +210 -0
  4. package/dist/app.js.map +1 -0
  5. package/dist/app.test.js +117 -0
  6. package/dist/app.test.js.map +1 -0
  7. package/dist/cli.js +63 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/cli.test.js +91 -0
  10. package/dist/cli.test.js.map +1 -0
  11. package/dist/core/auditLog.js +65 -0
  12. package/dist/core/auditLog.js.map +1 -0
  13. package/dist/core/auditLog.test.js +124 -0
  14. package/dist/core/auditLog.test.js.map +1 -0
  15. package/dist/core/auth.js +106 -0
  16. package/dist/core/auth.js.map +1 -0
  17. package/dist/core/auth.test.js +216 -0
  18. package/dist/core/auth.test.js.map +1 -0
  19. package/dist/core/channelRegistry.js +119 -0
  20. package/dist/core/channelRegistry.js.map +1 -0
  21. package/dist/core/channelRegistry.test.js +114 -0
  22. package/dist/core/channelRegistry.test.js.map +1 -0
  23. package/dist/core/commandPolicy.js +6 -0
  24. package/dist/core/commandPolicy.js.map +1 -0
  25. package/dist/core/commandRouter.js +9 -0
  26. package/dist/core/commandRouter.js.map +1 -0
  27. package/dist/core/config.js +141 -0
  28. package/dist/core/config.js.map +1 -0
  29. package/dist/core/config.test.js +149 -0
  30. package/dist/core/config.test.js.map +1 -0
  31. package/dist/core/configResolver.js +90 -0
  32. package/dist/core/configResolver.js.map +1 -0
  33. package/dist/core/configResolver.test.js +138 -0
  34. package/dist/core/configResolver.test.js.map +1 -0
  35. package/dist/core/configSchema.js +164 -0
  36. package/dist/core/configSchema.js.map +1 -0
  37. package/dist/core/contracts.js +5 -0
  38. package/dist/core/contracts.js.map +1 -0
  39. package/dist/core/eventBus.js +42 -0
  40. package/dist/core/eventBus.js.map +1 -0
  41. package/dist/core/eventBus.test.js +72 -0
  42. package/dist/core/eventBus.test.js.map +1 -0
  43. package/dist/core/hookBridge.js +11 -0
  44. package/dist/core/hookBridge.js.map +1 -0
  45. package/dist/core/logger.js +116 -0
  46. package/dist/core/logger.js.map +1 -0
  47. package/dist/core/logger.test.js +88 -0
  48. package/dist/core/logger.test.js.map +1 -0
  49. package/dist/core/modeRegistry.js +33 -0
  50. package/dist/core/modeRegistry.js.map +1 -0
  51. package/dist/core/permissionResolver.js +43 -0
  52. package/dist/core/permissionResolver.js.map +1 -0
  53. package/dist/core/permissionResolver.test.js +136 -0
  54. package/dist/core/permissionResolver.test.js.map +1 -0
  55. package/dist/core/providerCatalog.js +240 -0
  56. package/dist/core/providerCatalog.js.map +1 -0
  57. package/dist/core/providerCatalog.test.js +230 -0
  58. package/dist/core/providerCatalog.test.js.map +1 -0
  59. package/dist/core/sessionOrchestrator.js +463 -0
  60. package/dist/core/sessionOrchestrator.js.map +1 -0
  61. package/dist/core/sessionOrchestrator.test.js +344 -0
  62. package/dist/core/sessionOrchestrator.test.js.map +1 -0
  63. package/dist/core/state/schema.js +49 -0
  64. package/dist/core/state/schema.js.map +1 -0
  65. package/dist/core/state/store.js +86 -0
  66. package/dist/core/state/store.js.map +1 -0
  67. package/dist/core/state/store.test.js +99 -0
  68. package/dist/core/state/store.test.js.map +1 -0
  69. package/dist/core/usageService.js +310 -0
  70. package/dist/core/usageService.js.map +1 -0
  71. package/dist/core/usageService.test.js +234 -0
  72. package/dist/core/usageService.test.js.map +1 -0
  73. package/dist/discord/alwaysAllow.test.js +181 -0
  74. package/dist/discord/alwaysAllow.test.js.map +1 -0
  75. package/dist/discord/client.js +666 -0
  76. package/dist/discord/client.js.map +1 -0
  77. package/dist/discord/client.test.js +256 -0
  78. package/dist/discord/client.test.js.map +1 -0
  79. package/dist/discord/configPanel.js +270 -0
  80. package/dist/discord/configPanel.js.map +1 -0
  81. package/dist/discord/configPanel.test.js +332 -0
  82. package/dist/discord/configPanel.test.js.map +1 -0
  83. package/dist/discord/directoryBrowser.js +151 -0
  84. package/dist/discord/directoryBrowser.js.map +1 -0
  85. package/dist/discord/directoryBrowser.test.js +163 -0
  86. package/dist/discord/directoryBrowser.test.js.map +1 -0
  87. package/dist/discord/favorites.js +10 -0
  88. package/dist/discord/favorites.js.map +1 -0
  89. package/dist/discord/fileDownload.js +94 -0
  90. package/dist/discord/fileDownload.js.map +1 -0
  91. package/dist/discord/fileDownload.test.js +59 -0
  92. package/dist/discord/fileDownload.test.js.map +1 -0
  93. package/dist/discord/format.js +104 -0
  94. package/dist/discord/format.js.map +1 -0
  95. package/dist/discord/format.test.js +40 -0
  96. package/dist/discord/format.test.js.map +1 -0
  97. package/dist/discord/guildChannels.js +97 -0
  98. package/dist/discord/guildChannels.js.map +1 -0
  99. package/dist/discord/guildChannels.test.js +231 -0
  100. package/dist/discord/guildChannels.test.js.map +1 -0
  101. package/dist/discord/i18n.js +207 -0
  102. package/dist/discord/i18n.js.map +1 -0
  103. package/dist/discord/i18n.test.js +31 -0
  104. package/dist/discord/i18n.test.js.map +1 -0
  105. package/dist/discord/interactionRouter.js +954 -0
  106. package/dist/discord/interactionRouter.js.map +1 -0
  107. package/dist/discord/interactionRouter.test.js +1245 -0
  108. package/dist/discord/interactionRouter.test.js.map +1 -0
  109. package/dist/discord/messageRouter.js +221 -0
  110. package/dist/discord/messageRouter.js.map +1 -0
  111. package/dist/discord/messageRouter.test.js +360 -0
  112. package/dist/discord/messageRouter.test.js.map +1 -0
  113. package/dist/discord/ports.js +12 -0
  114. package/dist/discord/ports.js.map +1 -0
  115. package/dist/discord/renderers/defaultSet.test.js +97 -0
  116. package/dist/discord/renderers/defaultSet.test.js.map +1 -0
  117. package/dist/discord/renderers/diffView.js +73 -0
  118. package/dist/discord/renderers/diffView.js.map +1 -0
  119. package/dist/discord/renderers/diffView.test.js +54 -0
  120. package/dist/discord/renderers/diffView.test.js.map +1 -0
  121. package/dist/discord/renderers/index.js +143 -0
  122. package/dist/discord/renderers/index.js.map +1 -0
  123. package/dist/discord/renderers/index.test.js +124 -0
  124. package/dist/discord/renderers/index.test.js.map +1 -0
  125. package/dist/discord/renderers/mentionOnComplete.js +19 -0
  126. package/dist/discord/renderers/mentionOnComplete.js.map +1 -0
  127. package/dist/discord/renderers/mentionOnComplete.test.js +35 -0
  128. package/dist/discord/renderers/mentionOnComplete.test.js.map +1 -0
  129. package/dist/discord/renderers/permissionButtons.js +150 -0
  130. package/dist/discord/renderers/permissionButtons.js.map +1 -0
  131. package/dist/discord/renderers/permissionButtons.test.js +108 -0
  132. package/dist/discord/renderers/permissionButtons.test.js.map +1 -0
  133. package/dist/discord/renderers/resultLine.js +25 -0
  134. package/dist/discord/renderers/resultLine.js.map +1 -0
  135. package/dist/discord/renderers/statusEmbed.js +20 -0
  136. package/dist/discord/renderers/statusEmbed.js.map +1 -0
  137. package/dist/discord/renderers/statusEmbed.test.js +32 -0
  138. package/dist/discord/renderers/statusEmbed.test.js.map +1 -0
  139. package/dist/discord/renderers/streamEmbed.js +134 -0
  140. package/dist/discord/renderers/streamEmbed.js.map +1 -0
  141. package/dist/discord/renderers/streamEmbed.test.js +97 -0
  142. package/dist/discord/renderers/streamEmbed.test.js.map +1 -0
  143. package/dist/discord/renderers/toolThread.js +65 -0
  144. package/dist/discord/renderers/toolThread.js.map +1 -0
  145. package/dist/discord/renderers/toolThread.test.js +54 -0
  146. package/dist/discord/renderers/toolThread.test.js.map +1 -0
  147. package/dist/discord/renderers/transcriptFeed.js +33 -0
  148. package/dist/discord/renderers/transcriptFeed.js.map +1 -0
  149. package/dist/discord/renderers/usageEmbed.js +78 -0
  150. package/dist/discord/renderers/usageEmbed.js.map +1 -0
  151. package/dist/discord/renderers/usageEmbed.test.js +42 -0
  152. package/dist/discord/renderers/usageEmbed.test.js.map +1 -0
  153. package/dist/discord/wiring.js +214 -0
  154. package/dist/discord/wiring.js.map +1 -0
  155. package/dist/discord/wiring.test.js +252 -0
  156. package/dist/discord/wiring.test.js.map +1 -0
  157. package/dist/discord/wizard/channelWizard.js +305 -0
  158. package/dist/discord/wizard/channelWizard.js.map +1 -0
  159. package/dist/discord/wizard/channelWizard.test.js +298 -0
  160. package/dist/discord/wizard/channelWizard.test.js.map +1 -0
  161. package/dist/discord/wizard/resumeWizard.js +123 -0
  162. package/dist/discord/wizard/resumeWizard.js.map +1 -0
  163. package/dist/modes/claude/index.js +80 -0
  164. package/dist/modes/claude/index.js.map +1 -0
  165. package/dist/modes/claude/listResumable.test.js +72 -0
  166. package/dist/modes/claude/listResumable.test.js.map +1 -0
  167. package/dist/modes/claude/mcpFileTool.js +82 -0
  168. package/dist/modes/claude/mcpFileTool.js.map +1 -0
  169. package/dist/modes/claude/permissions.js +35 -0
  170. package/dist/modes/claude/permissions.js.map +1 -0
  171. package/dist/modes/claude/plugins.js +56 -0
  172. package/dist/modes/claude/plugins.js.map +1 -0
  173. package/dist/modes/claude/session.js +324 -0
  174. package/dist/modes/claude/session.js.map +1 -0
  175. package/dist/modes/claude/session.test.js +415 -0
  176. package/dist/modes/claude/session.test.js.map +1 -0
  177. package/dist/modes/codex/discovery.js +221 -0
  178. package/dist/modes/codex/discovery.js.map +1 -0
  179. package/dist/modes/codex/discovery.test.js +213 -0
  180. package/dist/modes/codex/discovery.test.js.map +1 -0
  181. package/dist/modes/codex/eventMapper.js +262 -0
  182. package/dist/modes/codex/eventMapper.js.map +1 -0
  183. package/dist/modes/codex/index.js +132 -0
  184. package/dist/modes/codex/index.js.map +1 -0
  185. package/dist/modes/codex/index.test.js +170 -0
  186. package/dist/modes/codex/index.test.js.map +1 -0
  187. package/dist/modes/codex/runner.js +207 -0
  188. package/dist/modes/codex/runner.js.map +1 -0
  189. package/dist/modes/codex/runner.test.js +587 -0
  190. package/dist/modes/codex/runner.test.js.map +1 -0
  191. package/dist/modes/codex/sqliteReader.js +171 -0
  192. package/dist/modes/codex/sqliteReader.js.map +1 -0
  193. package/dist/modes/codex/sqliteReader.test.js +137 -0
  194. package/dist/modes/codex/sqliteReader.test.js.map +1 -0
  195. package/dist/setup/wizard.js +115 -0
  196. package/dist/setup/wizard.js.map +1 -0
  197. package/dist/setup/wizard.test.js +216 -0
  198. package/dist/setup/wizard.test.js.map +1 -0
  199. package/dist/startBot.test.js +78 -0
  200. package/dist/startBot.test.js.map +1 -0
  201. package/package.json +58 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/discord/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,256 @@
1
+ import { describe, it, expect, vi } from 'vitest';
2
+ import { Events, PermissionFlagsBits } from 'discord.js';
3
+ import { adaptInteraction, buildSlashCommands, DiscordClient } from './client.js';
4
+ // The `/mode backend` choices must be built from the REGISTERED backend list, so a
5
+ // backend that is not yet registered (Codex before Phase 2) is never offered.
6
+ // Pull the `backend` string-option choices out of the `/mode backend` subcommand.
7
+ function backendChoiceValues(backends) {
8
+ const commands = buildSlashCommands(backends);
9
+ const mode = commands.find((c) => c.name === 'mode');
10
+ const backendSub = mode.options.find((o) => o.name === 'backend');
11
+ const backendOpt = backendSub?.options?.find((o) => o.name === 'backend');
12
+ return (backendOpt?.choices ?? []).map((ch) => ch.value);
13
+ }
14
+ describe('buildSlashCommands — /mode backend choices', () => {
15
+ it('offers only the registered backends (Claude only, pre-Phase 2)', () => {
16
+ expect(backendChoiceValues(['claude'])).toEqual(['claude']);
17
+ });
18
+ it('offers a later-registered backend generically (Claude + Codex)', () => {
19
+ expect(backendChoiceValues(['claude', 'codex'])).toEqual(['claude', 'codex']);
20
+ });
21
+ it('does NOT offer Codex when it is not registered', () => {
22
+ expect(backendChoiceValues(['claude'])).not.toContain('codex');
23
+ });
24
+ });
25
+ describe('buildSlashCommands — /config', () => {
26
+ it('registers /config gated to the Administrator default member permission', () => {
27
+ const commands = buildSlashCommands(['claude']);
28
+ const config = commands.find((c) => c.name === 'config');
29
+ expect(config).toBeTruthy();
30
+ // Administrator is bit 3 (0x8); default_member_permissions is the string bitfield.
31
+ expect(config.default_member_permissions).toBeTruthy();
32
+ expect((BigInt(config.default_member_permissions) & 0x8n) === 0x8n).toBe(true);
33
+ });
34
+ });
35
+ // adaptInteraction maps a real discord.js Interaction onto the router's narrow shape.
36
+ // discord.js is mocked here (fakes satisfy the type guards structurally), so these
37
+ // assert the adapter contract — the real reply/defer wiring is validated by live use.
38
+ // A fake chat-input interaction that records which discord.js ack method fired and
39
+ // tracks deferred/replied like the real interaction. `memberPermissions` mirrors
40
+ // discord.js's resolved PermissionsBitField.
41
+ function fakeSlash(over = {}) {
42
+ const calls = [];
43
+ let deferred = false;
44
+ let replied = false;
45
+ const interaction = {
46
+ guildId: 'g1',
47
+ channelId: 'c1',
48
+ user: { id: 'u1' },
49
+ member: { roles: { cache: { map: (fn) => ['r1'].map((id) => fn({ id })) } } },
50
+ memberPermissions: { has: (bit) => (over.adminPerm ?? false) && bit === PermissionFlagsBits.Administrator },
51
+ commandName: 'config',
52
+ options: { getSubcommand: () => { throw new Error('no subcommand'); }, getString: () => null },
53
+ get deferred() { return deferred; },
54
+ get replied() { return replied; },
55
+ isChatInputCommand: () => true,
56
+ isButton: () => false,
57
+ isStringSelectMenu: () => false,
58
+ isRoleSelectMenu: () => false,
59
+ deferReply: vi.fn(async (_o) => { deferred = true; calls.push('deferReply'); }),
60
+ reply: vi.fn(async (_o) => { replied = true; calls.push('reply'); }),
61
+ editReply: vi.fn(async (_o) => { calls.push('editReply'); }),
62
+ followUp: vi.fn(async (_o) => { calls.push('followUp'); }),
63
+ };
64
+ return { interaction: interaction, calls, raw: interaction };
65
+ }
66
+ // A fake button interaction that records showModal (the ack for a modal-open button).
67
+ function fakeButton(customId) {
68
+ const calls = [];
69
+ let modalArg;
70
+ const interaction = {
71
+ guildId: 'g1',
72
+ channelId: 'c1',
73
+ user: { id: 'u1' },
74
+ member: { roles: { cache: { map: (fn) => ['r1'].map((id) => fn({ id })) } } },
75
+ memberPermissions: { has: () => false },
76
+ customId,
77
+ get deferred() { return false; },
78
+ get replied() { return false; },
79
+ isChatInputCommand: () => false,
80
+ isButton: () => true,
81
+ isStringSelectMenu: () => false,
82
+ isRoleSelectMenu: () => false,
83
+ isModalSubmit: () => false,
84
+ deferUpdate: vi.fn(async () => { calls.push('deferUpdate'); }),
85
+ reply: vi.fn(),
86
+ deferReply: vi.fn(),
87
+ editReply: vi.fn(),
88
+ followUp: vi.fn(),
89
+ showModal: vi.fn(async (m) => { calls.push('showModal'); modalArg = m; }),
90
+ };
91
+ return { interaction: interaction, calls, getModalArg: () => modalArg };
92
+ }
93
+ // A fake modal-submit interaction exposing fields.getTextInputValue by custom id.
94
+ function fakeModalSubmit(customId, fields) {
95
+ const interaction = {
96
+ guildId: 'g1',
97
+ channelId: 'c1',
98
+ user: { id: 'u1' },
99
+ member: { roles: { cache: { map: (fn) => ['r1'].map((id) => fn({ id })) } } },
100
+ memberPermissions: { has: () => false },
101
+ customId,
102
+ fields: { getTextInputValue: (id) => { if (!(id in fields))
103
+ throw new Error('no field'); return fields[id]; } },
104
+ get deferred() { return false; },
105
+ get replied() { return false; },
106
+ isChatInputCommand: () => false,
107
+ isButton: () => false,
108
+ isStringSelectMenu: () => false,
109
+ isRoleSelectMenu: () => false,
110
+ isModalSubmit: () => true,
111
+ reply: vi.fn(),
112
+ deferReply: vi.fn(),
113
+ editReply: vi.fn(),
114
+ followUp: vi.fn(),
115
+ };
116
+ return { interaction: interaction };
117
+ }
118
+ // The modal adapter is kept as GENERIC discord.js plumbing (ports.ts ModalSpec →
119
+ // discord.js ModalBuilder, and ModalSubmit → getField). The /config Codex-path modal
120
+ // that used to be its only caller is gone, so these use generic fixture ids.
121
+ describe('adaptInteraction — modal wiring (generic)', () => {
122
+ it('a button exposes showModal that maps a ModalSpec onto discord.js showModal', async () => {
123
+ const { interaction, calls, getModalArg } = fakeButton('some.button');
124
+ const adapted = adaptInteraction(interaction);
125
+ expect(adapted?.kind).toBe('component');
126
+ if (!adapted || adapted.kind !== 'component')
127
+ return;
128
+ await adapted.showModal({
129
+ customId: 'some.modal',
130
+ title: 'Example',
131
+ fields: [{ customId: 'some.field', label: 'value', value: 'x', required: true }],
132
+ });
133
+ // showModal fired (it is the ack); no defer preceded it.
134
+ expect(calls).toEqual(['showModal']);
135
+ // A discord.js ModalBuilder was passed (has toJSON).
136
+ expect(typeof getModalArg().toJSON).toBe('function');
137
+ });
138
+ it('adapts a ModalSubmit interaction and reads a field value by custom id', () => {
139
+ const { interaction } = fakeModalSubmit('some.modal', { 'some.field': 'value-1' });
140
+ const adapted = adaptInteraction(interaction);
141
+ expect(adapted?.kind).toBe('modalSubmit');
142
+ if (!adapted || adapted.kind !== 'modalSubmit')
143
+ return;
144
+ expect(adapted.customId).toBe('some.modal');
145
+ expect(adapted.getField('some.field')).toBe('value-1');
146
+ // An absent field returns '' (never throws).
147
+ expect(adapted.getField('missing')).toBe('');
148
+ });
149
+ });
150
+ // The auto-provision wiring on ClientReady / GuildCreate (§ auto-provision, /init
151
+ // optional). discord.js is faked: the Client captures its event handlers so a test
152
+ // fires ClientReady / GuildCreate WITHOUT a gateway. The fake's token is empty so
153
+ // registerCommands fails fast (no REST/network) — the ready handler catches it and
154
+ // still runs auto-provision, which is what we assert here.
155
+ describe('DiscordClient auto-provision on ready / guild-join', () => {
156
+ const noopLogger = { debug() { }, info() { }, warn() { }, error() { } };
157
+ function fakeGatewayClient(guildIds) {
158
+ const once = new Map();
159
+ const on = new Map();
160
+ const cache = new Map(guildIds.map((id) => [id, { id }]));
161
+ const ready = { user: { tag: 'bot#0001' }, guilds: { cache } };
162
+ const client = {
163
+ once: (event, handler) => { once.set(event, handler); },
164
+ on: (event, handler) => { on.set(event, handler); },
165
+ guilds: { cache },
166
+ channels: { fetch: async () => null },
167
+ token: '', // empty → registerCommands throws before any REST call (network-free)
168
+ };
169
+ return {
170
+ client,
171
+ fireReady: async () => {
172
+ const handler = once.get(Events.ClientReady);
173
+ if (!handler)
174
+ throw new Error('no ClientReady handler registered');
175
+ handler(ready);
176
+ await new Promise((r) => setTimeout(r, 0));
177
+ },
178
+ fireGuildCreate: async (guildId) => {
179
+ const handler = on.get(Events.GuildCreate);
180
+ if (!handler)
181
+ throw new Error('no GuildCreate handler registered');
182
+ handler({ id: guildId, name: 'g' });
183
+ await new Promise((r) => setTimeout(r, 0));
184
+ },
185
+ };
186
+ }
187
+ function build(client, autoProvisionGuild) {
188
+ const messageRouter = {};
189
+ const interactionRouter = {};
190
+ return new DiscordClient({
191
+ clientId: 'cid',
192
+ logger: noopLogger,
193
+ messageRouter,
194
+ interactionRouter,
195
+ backends: () => ['claude'],
196
+ onReady: async () => { },
197
+ ...(autoProvisionGuild ? { autoProvisionGuild } : {}),
198
+ client,
199
+ });
200
+ }
201
+ it('invokes autoProvisionGuild for EVERY existing guild on ClientReady', async () => {
202
+ const fc = fakeGatewayClient(['g1', 'g2']);
203
+ const provisioned = [];
204
+ build(fc.client, async (guildId) => { provisioned.push(guildId); });
205
+ await fc.fireReady();
206
+ expect(provisioned.sort()).toEqual(['g1', 'g2']);
207
+ });
208
+ it('invokes autoProvisionGuild when the bot is added to a new guild (GuildCreate)', async () => {
209
+ const fc = fakeGatewayClient([]);
210
+ const provisioned = [];
211
+ build(fc.client, async (guildId) => { provisioned.push(guildId); });
212
+ await fc.fireGuildCreate('new-guild');
213
+ expect(provisioned).toEqual(['new-guild']);
214
+ });
215
+ it('a throwing autoProvisionGuild never crashes the ready handler', async () => {
216
+ const fc = fakeGatewayClient(['g1']);
217
+ build(fc.client, async () => { throw new Error('boom'); });
218
+ // The ready handler catches per-guild failures — firing must not reject.
219
+ await expect(fc.fireReady()).resolves.toBeUndefined();
220
+ });
221
+ it('is optional: no autoProvisionGuild dep → ClientReady still completes', async () => {
222
+ const fc = fakeGatewayClient(['g1']);
223
+ build(fc.client); // no autoProvisionGuild wired
224
+ await expect(fc.fireReady()).resolves.toBeUndefined();
225
+ });
226
+ });
227
+ describe('adaptInteraction — acknowledgment wiring', () => {
228
+ it('exposes deferReply/editReply/followUp and an acknowledged flag that tracks defer', async () => {
229
+ const { interaction, raw } = fakeSlash();
230
+ const adapted = adaptInteraction(interaction);
231
+ expect(adapted).toBeTruthy();
232
+ if (!adapted)
233
+ return;
234
+ expect(adapted.acknowledged).toBe(false);
235
+ await adapted.deferReply({ ephemeral: true });
236
+ expect(raw.deferReply).toHaveBeenCalledOnce();
237
+ // The deferReply carried the Ephemeral flag.
238
+ expect(raw.deferReply.mock.calls[0]?.[0]).toMatchObject({ flags: expect.anything() });
239
+ // Now acknowledged → the guaranteed-error path uses editReply, not reply.
240
+ expect(adapted.acknowledged).toBe(true);
241
+ await adapted.editReply({ content: 'done' });
242
+ expect(raw.editReply).toHaveBeenCalledOnce();
243
+ });
244
+ it('fills hasAdminPermission from interaction.memberPermissions (Administrator bit)', () => {
245
+ expect(adaptInteraction(fakeSlash({ adminPerm: true }).interaction)?.hasAdminPermission).toBe(true);
246
+ expect(adaptInteraction(fakeSlash({ adminPerm: false }).interaction)?.hasAdminPermission).toBe(false);
247
+ });
248
+ it('editReply omits the ephemeral flag (only deferReply/reply/followUp set visibility)', async () => {
249
+ const { interaction, raw } = fakeSlash();
250
+ const adapted = adaptInteraction(interaction);
251
+ await adapted?.editReply({ content: 'x', ephemeral: true });
252
+ // editReply body must not carry a flags key (discord.js rejects it).
253
+ expect(raw.editReply.mock.calls[0]?.[0]).not.toHaveProperty('flags');
254
+ });
255
+ });
256
+ //# sourceMappingURL=client.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.test.js","sourceRoot":"","sources":["../../src/discord/client.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,270 @@
1
+ import { CONFIG_VERSION } from '../core/configSchema.js';
2
+ import { t } from './i18n.js';
3
+ // The `/config` panel (§7.1/§8): configure a guild's role tiers and defaults by
4
+ // CLICKING role names (Discord Role Select menus) instead of pasting role IDs.
5
+ // Everything the panel needs is plain data — no discord.js here — so the router
6
+ // and tests drive it directly; the client.ts adapter maps RoleSelectSpec onto a
7
+ // discord.js RoleSelectMenuBuilder and multi-select values onto ComponentInteraction.
8
+ //
9
+ // Persistence target: per-server servers/<guildId>.json (roles are per-guild, §7.1).
10
+ //
11
+ // Two persistence styles coexist so the panel stays within Discord's 5-action-row
12
+ // limit per message (the primary reply and a follow-up):
13
+ // - Role tiers (3 role-selects) batch into a pending set and persist together on
14
+ // the Save button — they share the primary message (3 selects + Save = 4 rows).
15
+ // - Defaults (backend / model / permMode / locale selects) AUTO-SAVE on each
16
+ // change: one changed field is written immediately. This lets the defaults
17
+ // follow-up hold 4 selects = 4 rows with no Save button — respecting the budget.
18
+ //
19
+ // Codex home is NOT configured here: it resolves automatically to `~/.codex` (like
20
+ // Claude's `~/.claude`) via the config default / resolveCodexHome. The actual PROJECT
21
+ // folder is chosen per-session in the `/agent start` wizard, not in /config.
22
+ // The panel component ids. `config.` prefix lets the router recognize + route them.
23
+ export const CONFIG_PANEL_PREFIX = 'config.';
24
+ const IDS = {
25
+ roleAdmin: 'config.role.admin',
26
+ roleExecute: 'config.role.execute',
27
+ roleReadOnly: 'config.role.readOnly',
28
+ backend: 'config.default.backend',
29
+ model: 'config.default.model',
30
+ permMode: 'config.default.permMode',
31
+ locale: 'config.default.locale',
32
+ save: 'config.save',
33
+ };
34
+ // True when a component id belongs to a /config panel (router routing predicate).
35
+ export function isConfigPanelId(customId) {
36
+ return customId.startsWith(CONFIG_PANEL_PREFIX);
37
+ }
38
+ // The offered locales (a closed set — the i18n catalog only ships ko/en).
39
+ const LOCALES = ['ko', 'en'];
40
+ const TIER_BY_ID = {
41
+ [IDS.roleAdmin]: 'admin',
42
+ [IDS.roleExecute]: 'execute',
43
+ [IDS.roleReadOnly]: 'readOnly',
44
+ };
45
+ export class ConfigPanel {
46
+ opts;
47
+ pending = {};
48
+ // The Discord user who opened this panel. Only they may edit/save it, so a
49
+ // bystander's stray select cannot corrupt another admin's configuration (§7.1).
50
+ ownerId;
51
+ constructor(options) {
52
+ this.opts = options;
53
+ this.ownerId = options.ownerId;
54
+ }
55
+ // Advance the panel by one input. A role-select records a pending pick (batched
56
+ // until Save). A defaults select auto-saves that one field immediately. The Save
57
+ // button persists the batched role tiers. An unknown id is ignored.
58
+ handle(input) {
59
+ const tier = TIER_BY_ID[input.id];
60
+ if (tier) {
61
+ // A role-select delivers role IDs in `values` (possibly empty when the operator
62
+ // cleared the tier). Absent `values` (a malformed input) is ignored, not stored
63
+ // as an empty allowlist, so a glitch never silently locks a tier down.
64
+ if (input.values === undefined)
65
+ return { kind: 'ignored' };
66
+ this.setTier(tier, input.values);
67
+ return { kind: 'pending' };
68
+ }
69
+ switch (input.id) {
70
+ case IDS.backend:
71
+ if (!input.value)
72
+ return { kind: 'pending' };
73
+ return this.autosaveBackend(input.value);
74
+ case IDS.model:
75
+ if (!input.value)
76
+ return { kind: 'pending' };
77
+ return this.autosaveModel(input.value);
78
+ case IDS.permMode:
79
+ if (!input.value)
80
+ return { kind: 'pending' };
81
+ return this.autosavePermMode(input.value);
82
+ case IDS.locale:
83
+ if (!input.value)
84
+ return { kind: 'pending' };
85
+ return this.autosaveLocale(input.value);
86
+ case IDS.save:
87
+ return { kind: 'saved', summary: this.saveRoles() };
88
+ default:
89
+ return { kind: 'ignored' };
90
+ }
91
+ }
92
+ autosaveBackend(backend) {
93
+ // Only known enum backends are stored on defaults.mode; a future backend id is
94
+ // ignored (same guard as the original Save path).
95
+ if (backend === 'claude' || backend === 'codex') {
96
+ this.patchDefaults({ mode: backend });
97
+ }
98
+ return { kind: 'autosaved', notice: t('config.autosaved.backend', { backend }) };
99
+ }
100
+ autosaveModel(model) {
101
+ this.patchDefaults({ claudeModel: model });
102
+ return { kind: 'autosaved', notice: t('config.autosaved.model', { model }) };
103
+ }
104
+ autosavePermMode(permMode) {
105
+ this.patchDefaults({ permissionMode: permMode });
106
+ return { kind: 'autosaved', notice: t('config.autosaved.permMode', { perm: t(`perm.${permMode}`) }) };
107
+ }
108
+ autosaveLocale(locale) {
109
+ this.patchLocale(locale);
110
+ return { kind: 'autosaved', notice: t('config.autosaved.locale', { locale: this.localeLabel(locale) }) };
111
+ }
112
+ setTier(tier, roleIds) {
113
+ // De-duplicate defensively; Discord already de-dupes, but a fake test input may not.
114
+ const unique = [...new Set(roleIds)];
115
+ if (tier === 'admin')
116
+ this.pending.adminRoleIds = unique;
117
+ else if (tier === 'execute')
118
+ this.pending.executeRoleIds = unique;
119
+ else
120
+ this.pending.readOnlyRoleIds = unique;
121
+ }
122
+ // Merge the batched role picks over the guild's current server config and persist.
123
+ // Untouched tiers fall through to the current effective value (defaults), then to
124
+ // whatever the existing server file held — so Save never blanks a tier the operator
125
+ // didn't touch. Defaults are NOT written here (they auto-save on change).
126
+ saveRoles() {
127
+ const existing = this.opts.configStore.loadServerConfig(this.opts.guildId);
128
+ const d = this.opts.defaults;
129
+ const adminRoleIds = this.pending.adminRoleIds ?? existing?.auth?.adminRoleIds ?? d.adminRoleIds;
130
+ const executeRoleIds = this.pending.executeRoleIds ?? existing?.auth?.executeRoleIds ?? d.executeRoleIds;
131
+ const readOnlyRoleIds = this.pending.readOnlyRoleIds ?? existing?.auth?.readOnlyRoleIds ?? d.readOnlyRoleIds;
132
+ // Preserve any server fields the panel doesn't manage (defaults, limits, etc.).
133
+ const next = {
134
+ ...(existing ?? {}),
135
+ version: existing?.version ?? CONFIG_VERSION,
136
+ guildId: this.opts.guildId,
137
+ auth: {
138
+ ...(existing?.auth ?? {}),
139
+ adminRoleIds,
140
+ executeRoleIds,
141
+ readOnlyRoleIds,
142
+ },
143
+ };
144
+ this.opts.configStore.saveServerConfig(next);
145
+ return t('config.saved', {
146
+ admin: formatRoleList(adminRoleIds),
147
+ execute: formatRoleList(executeRoleIds),
148
+ readOnly: formatRoleList(readOnlyRoleIds),
149
+ backend: d.backend,
150
+ model: d.model,
151
+ perm: t(`perm.${d.permMode}`),
152
+ });
153
+ }
154
+ // Merge ONE changed defaults field over the guild's current server config and
155
+ // persist it, preserving every other field (auth, other defaults, limits, locale).
156
+ patchDefaults(patch) {
157
+ const existing = this.opts.configStore.loadServerConfig(this.opts.guildId);
158
+ const next = {
159
+ ...(existing ?? {}),
160
+ version: existing?.version ?? CONFIG_VERSION,
161
+ guildId: this.opts.guildId,
162
+ defaults: { ...(existing?.defaults ?? {}), ...patch },
163
+ };
164
+ this.opts.configStore.saveServerConfig(next);
165
+ }
166
+ // Persist the per-guild locale (top-level on the server config, mirroring the
167
+ // schema), preserving every other field.
168
+ patchLocale(locale) {
169
+ const existing = this.opts.configStore.loadServerConfig(this.opts.guildId);
170
+ const next = {
171
+ ...(existing ?? {}),
172
+ version: existing?.version ?? CONFIG_VERSION,
173
+ guildId: this.opts.guildId,
174
+ locale,
175
+ };
176
+ this.opts.configStore.saveServerConfig(next);
177
+ }
178
+ localeLabel(locale) {
179
+ return locale === 'ko' || locale === 'en' ? t(`config.locale.${locale}`) : locale;
180
+ }
181
+ // Render the panel as plain component specs. `roleRows` (3 role tiers + Save = 4
182
+ // rows) go on the primary reply; `defaultRows` (backend/model/permMode/locale
183
+ // selects = 4 rows) go on a follow-up — both within Discord's 5-action-row-per-
184
+ // message limit. Each defaults select marks its currently-saved option with
185
+ // `default: true` so the dropdown shows the REAL current value (not the last
186
+ // option), and role-selects pre-select the tier's current roles. The adapter maps
187
+ // these onto discord.js; tests assert on them directly.
188
+ render() {
189
+ const d = this.opts.defaults;
190
+ const adminSelect = this.roleSelect(IDS.roleAdmin, 'config.role.admin.placeholder', this.pending.adminRoleIds ?? d.adminRoleIds);
191
+ const execSelect = this.roleSelect(IDS.roleExecute, 'config.role.execute.placeholder', this.pending.executeRoleIds ?? d.executeRoleIds);
192
+ const readSelect = this.roleSelect(IDS.roleReadOnly, 'config.role.readOnly.placeholder', this.pending.readOnlyRoleIds ?? d.readOnlyRoleIds);
193
+ const backendSelect = {
194
+ type: 'select',
195
+ customId: IDS.backend,
196
+ placeholder: t('config.default.backend.placeholder'),
197
+ options: this.opts.backends.map((b) => ({
198
+ label: t(`backend.${b}`) === `backend.${b}` ? b : t(`backend.${b}`),
199
+ value: b,
200
+ default: b === d.backend,
201
+ })),
202
+ };
203
+ const modelSelect = {
204
+ type: 'select',
205
+ customId: IDS.model,
206
+ placeholder: t('config.default.model.placeholder'),
207
+ // English labels from the catalog (model id / SDK displayName), not localized.
208
+ options: this.opts.models.map((m) => ({
209
+ label: m.label,
210
+ value: m.value,
211
+ default: m.value === d.model,
212
+ })),
213
+ };
214
+ const permSelect = {
215
+ type: 'select',
216
+ customId: IDS.permMode,
217
+ placeholder: t('config.default.permMode.placeholder'),
218
+ // English identifiers + a short English hint from the catalog, not localized.
219
+ options: this.opts.permModes.map((m) => ({
220
+ label: m.label,
221
+ value: m.value,
222
+ default: m.value === d.permMode,
223
+ })),
224
+ };
225
+ const localeSelect = {
226
+ type: 'select',
227
+ customId: IDS.locale,
228
+ placeholder: t('config.default.locale.placeholder'),
229
+ options: LOCALES.map((l) => ({
230
+ label: this.localeLabel(l),
231
+ value: l,
232
+ default: l === d.locale,
233
+ })),
234
+ };
235
+ const save = { type: 'button', customId: IDS.save, label: t('config.save'), style: 'success' };
236
+ return {
237
+ embed: { title: t('config.title'), description: t('config.intro') },
238
+ roleRows: [
239
+ { components: [adminSelect] },
240
+ { components: [execSelect] },
241
+ { components: [readSelect] },
242
+ { components: [save] },
243
+ ],
244
+ defaultRows: [
245
+ { components: [backendSelect] },
246
+ { components: [modelSelect] },
247
+ { components: [permSelect] },
248
+ { components: [localeSelect] },
249
+ ],
250
+ };
251
+ }
252
+ roleSelect(customId, placeholderKey, defaultRoleIds) {
253
+ return {
254
+ type: 'roleSelect',
255
+ customId,
256
+ placeholder: t(placeholderKey),
257
+ minValues: 0,
258
+ maxValues: 25,
259
+ defaultRoleIds,
260
+ };
261
+ }
262
+ }
263
+ // Format a role-id list for the confirmation summary as Discord role mentions
264
+ // (<@&id>), so the operator sees role NAMES, not raw ids. Empty → an em dash.
265
+ function formatRoleList(roleIds) {
266
+ if (roleIds.length === 0)
267
+ return '—';
268
+ return roleIds.map((id) => `<@&${id}>`).join(', ');
269
+ }
270
+ //# sourceMappingURL=configPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configPanel.js","sourceRoot":"","sources":["../../src/discord/configPanel.ts"],"names":[],"mappings":"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"}