@chrisromp/copilot-bridge 0.7.0-dev.16 → 0.8.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/config.sample.json +8 -1
- package/dist/channels/slack/adapter.d.ts +62 -0
- package/dist/channels/slack/adapter.d.ts.map +1 -0
- package/dist/channels/slack/adapter.js +382 -0
- package/dist/channels/slack/adapter.js.map +1 -0
- package/dist/channels/slack/mrkdwn.d.ts +22 -0
- package/dist/channels/slack/mrkdwn.d.ts.map +1 -0
- package/dist/channels/slack/mrkdwn.js +120 -0
- package/dist/channels/slack/mrkdwn.js.map +1 -0
- package/dist/config.d.ts +5 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +55 -7
- package/dist/config.js.map +1 -1
- package/dist/core/access-control.d.ts +32 -0
- package/dist/core/access-control.d.ts.map +1 -0
- package/dist/core/access-control.js +59 -0
- package/dist/core/access-control.js.map +1 -0
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +75 -1
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/inter-agent.d.ts +9 -2
- package/dist/core/inter-agent.d.ts.map +1 -1
- package/dist/core/inter-agent.js +87 -22
- package/dist/core/inter-agent.js.map +1 -1
- package/dist/core/model-fallback.js +1 -1
- package/dist/core/model-fallback.js.map +1 -1
- package/dist/index.js +182 -14
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +9 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -1
- package/scripts/init.ts +322 -117
- package/scripts/lib/config-gen.ts +74 -10
- package/scripts/lib/prerequisites.ts +17 -5
- package/scripts/lib/prompts.ts +4 -0
- package/scripts/lib/slack.ts +190 -0
- package/templates/admin/AGENTS.md +5 -5
- package/templates/agents/AGENTS.md +1 -1
package/dist/core/inter-agent.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import crypto from 'node:crypto';
|
|
4
|
+
import os from 'node:os';
|
|
4
5
|
import { getConfig, getInterAgentConfig } from '../config.js';
|
|
5
6
|
import { getDynamicChannels } from '../state/store.js';
|
|
6
7
|
import { createLogger } from '../logger.js';
|
|
@@ -131,35 +132,99 @@ export function buildCallerPrompt(context) {
|
|
|
131
132
|
}
|
|
132
133
|
// --- Agent Definition Discovery ---
|
|
133
134
|
/**
|
|
134
|
-
*
|
|
135
|
-
*
|
|
135
|
+
* Collect all directories that may contain *.agent.md files.
|
|
136
|
+
* Sources (later entries win on name conflicts):
|
|
137
|
+
* 1. Installed plugins: ~/.copilot/installed-plugins/<vendor>/<plugin>/agents/
|
|
138
|
+
* 2. User profile: ~/.copilot/agents/
|
|
139
|
+
* 3. Workspace: <workspacePath>/agents/
|
|
140
|
+
*/
|
|
141
|
+
function getAgentRoots(workspacePath) {
|
|
142
|
+
const roots = [];
|
|
143
|
+
const home = os.homedir();
|
|
144
|
+
// 1. Plugin agents — walk at most 3 levels deep (e.g. _direct/vendor/plugin/agents/)
|
|
145
|
+
if (home) {
|
|
146
|
+
const pluginsDir = path.join(home, '.copilot', 'installed-plugins');
|
|
147
|
+
if (fs.existsSync(pluginsDir)) {
|
|
148
|
+
const walk = (dir, depth) => {
|
|
149
|
+
if (depth > 3)
|
|
150
|
+
return;
|
|
151
|
+
try {
|
|
152
|
+
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
153
|
+
if (!entry.isDirectory())
|
|
154
|
+
continue;
|
|
155
|
+
const full = path.join(dir, entry.name);
|
|
156
|
+
if (entry.name === 'agents') {
|
|
157
|
+
roots.push({ dir: full, source: 'plugin' });
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
walk(full, depth + 1);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
catch { /* permission errors */ }
|
|
165
|
+
};
|
|
166
|
+
walk(pluginsDir, 0);
|
|
167
|
+
}
|
|
168
|
+
// 2. User-level agents
|
|
169
|
+
const userAgents = path.join(home, '.copilot', 'agents');
|
|
170
|
+
if (fs.existsSync(userAgents))
|
|
171
|
+
roots.push({ dir: userAgents, source: 'user' });
|
|
172
|
+
}
|
|
173
|
+
// 3. Workspace agents (highest priority — overrides earlier sources)
|
|
174
|
+
const wsAgents = path.join(workspacePath, 'agents');
|
|
175
|
+
if (fs.existsSync(wsAgents))
|
|
176
|
+
roots.push({ dir: wsAgents, source: 'workspace' });
|
|
177
|
+
return roots;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Discover *.agent.md files from all agent sources (plugins, user profile, workspace).
|
|
181
|
+
* Returns a map of agent name → definition. Later sources override earlier ones.
|
|
136
182
|
*/
|
|
137
183
|
export function discoverAgentDefinitions(workspacePath) {
|
|
138
|
-
const agentsDir = path.join(workspacePath, 'agents');
|
|
139
184
|
const definitions = new Map();
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
185
|
+
for (const { dir: agentsDir, source } of getAgentRoots(workspacePath)) {
|
|
186
|
+
try {
|
|
187
|
+
for (const entry of fs.readdirSync(agentsDir, { withFileTypes: true })) {
|
|
188
|
+
if (!entry.isFile() || !entry.name.endsWith('.agent.md'))
|
|
189
|
+
continue;
|
|
190
|
+
const name = entry.name.replace(/\.agent\.md$/, '');
|
|
191
|
+
const filePath = path.join(agentsDir, entry.name);
|
|
192
|
+
try {
|
|
193
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
194
|
+
definitions.set(name, { name, content, filePath, source });
|
|
195
|
+
log.debug(`Discovered agent definition: ${name} at ${filePath}`);
|
|
196
|
+
}
|
|
197
|
+
catch (err) {
|
|
198
|
+
log.warn(`Failed to read agent definition ${filePath}: ${err?.message}`);
|
|
199
|
+
}
|
|
155
200
|
}
|
|
156
201
|
}
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
202
|
+
catch (err) {
|
|
203
|
+
log.warn(`Failed to scan agents directory ${agentsDir}: ${err?.message}`);
|
|
204
|
+
}
|
|
160
205
|
}
|
|
161
206
|
return definitions;
|
|
162
207
|
}
|
|
208
|
+
/**
|
|
209
|
+
* Lightweight agent name discovery — reads only filenames, not file contents.
|
|
210
|
+
* Scans all agent sources (plugins, user profile, workspace).
|
|
211
|
+
*/
|
|
212
|
+
export function discoverAgentNames(workspacePath) {
|
|
213
|
+
const names = new Set();
|
|
214
|
+
for (const { dir: agentsDir } of getAgentRoots(workspacePath)) {
|
|
215
|
+
try {
|
|
216
|
+
for (const entry of fs.readdirSync(agentsDir, { withFileTypes: true })) {
|
|
217
|
+
if (!entry.isFile() || !entry.name.endsWith('.agent.md'))
|
|
218
|
+
continue;
|
|
219
|
+
names.add(entry.name.replace(/\.agent\.md$/, ''));
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
catch (err) {
|
|
223
|
+
log.warn(`Failed to scan agents directory ${agentsDir}: ${err?.message}`);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return names;
|
|
227
|
+
}
|
|
163
228
|
/**
|
|
164
229
|
* Resolve which agent definition to use for an ephemeral session.
|
|
165
230
|
* Priority: explicit agent param → bot's default agent → none.
|
|
@@ -171,7 +236,7 @@ export function resolveAgentDefinition(workspacePath, agentParam, botDefaultAgen
|
|
|
171
236
|
const definitions = discoverAgentDefinitions(workspacePath);
|
|
172
237
|
const def = definitions.get(agentName);
|
|
173
238
|
if (!def) {
|
|
174
|
-
log.warn(`Agent definition "${agentName}" not found
|
|
239
|
+
log.warn(`Agent definition "${agentName}" not found (scanned plugins, user profile, and ${workspacePath}/agents/)`);
|
|
175
240
|
return null;
|
|
176
241
|
}
|
|
177
242
|
return def;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inter-agent.js","sourceRoot":"","sources":["../../src/core/inter-agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,GAAG,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"inter-agent.js","sourceRoot":"","sources":["../../src/core/inter-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -191,7 +191,7 @@ export function getFallbackChain(modelId, availableModels) {
|
|
|
191
191
|
const MODEL_ERROR_PATTERNS = [
|
|
192
192
|
/model.*capacity/i,
|
|
193
193
|
/model.*(overloaded|over\s*loaded)/i,
|
|
194
|
-
/model.*(not\s+found|not\s+available|unavailable|does\s+not\s+exist)/i,
|
|
194
|
+
/model.*(not\s+found|not\s+available|unavailable|does\s+not\s+exist|not\s+supported)/i,
|
|
195
195
|
/rate\s*limit/i,
|
|
196
196
|
/too\s+many\s+requests/i,
|
|
197
197
|
/resource\s+exhausted/i,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-fallback.js","sourceRoot":"","sources":["../../src/core/model-fallback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,GAAG,GAAG,YAAY,CAAC,gBAAgB,CAAC,CAAC;AAc3C,8EAA8E;AAC9E,yDAAyD;AACzD,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,mBAAmB,GAA6B;IACpD,qBAAqB;IACrB,iBAAiB,EAAQ,CAAC,iBAAiB,EAAE,mBAAmB,EAAE,mBAAmB,CAAC;IACtF,iBAAiB,EAAQ,CAAC,iBAAiB,EAAE,mBAAmB,EAAE,mBAAmB,CAAC;IAEtF,uBAAuB;IACvB,mBAAmB,EAAM,CAAC,mBAAmB,EAAE,kBAAkB,CAAC;IAClE,mBAAmB,EAAM,CAAC,mBAAmB,EAAE,kBAAkB,CAAC;IAElE,yDAAyD;IACzD,kBAAkB,EAAO,CAAC,mBAAmB,EAAE,mBAAmB,CAAC;IAEnE,kBAAkB;IAClB,SAAS,EAAgB,CAAC,SAAS,EAAE,SAAS,CAAC;IAC/C,SAAS,EAAgB,CAAC,SAAS,EAAE,SAAS,CAAC;IAC/C,SAAS,EAAgB,CAAC,SAAS,EAAE,SAAS,CAAC;IAC/C,YAAY,EAAa,CAAC,SAAS,EAAE,SAAS,CAAC;IAE/C,mBAAmB;IACnB,eAAe,EAAU,CAAC,eAAe,EAAE,mBAAmB,CAAC;IAC/D,eAAe,EAAU,CAAC,mBAAmB,EAAE,eAAe,CAAC;IAC/D,mBAAmB,EAAM,CAAC,eAAe,EAAE,eAAe,CAAC;IAE3D,kBAAkB;IAClB,SAAS,EAAgB,CAAC,YAAY,EAAE,SAAS,CAAC;IAElD,8BAA8B;IAC9B,IAAI,EAAsB,CAAC,SAAS,EAAE,SAAS,CAAC;IAChD,SAAS,EAAiB,CAAC,IAAI,EAAE,YAAY,CAAC;CAC/C,CAAC;AAEF,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAAC,EAAU;IACrC,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;IAE/B,8CAA8C;IAC9C,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC5E,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO;YACL,QAAQ,EAAE,QAAQ;YAClB,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;YACtB,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;YACvB,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;YACvB,GAAG,EAAE,EAAE;SACR,CAAC;IACJ,CAAC;IAED,wCAAwC;IACxC,sEAAsE;IACtE,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;IAC5E,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,4CAA4C;QACxE,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,8BAA8B;QAEzD,4FAA4F;QAC5F,MAAM,aAAa,GAAG,CAAC,OAAO,CAAC,CAAC;QAChC,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,OAA2B,CAAC;QAEhC,IAAI,MAAM,IAAI,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7C,MAAM,GAAG,MAAM,CAAC;YAChB,OAAO,GAAG,KAAK,CAAC;QAClB,CAAC;aAAM,IAAI,MAAM,EAAE,CAAC;YAClB,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;QAClD,CAAC;QAED,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;IAChE,CAAC;IAED,8CAA8C;IAC9C,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC5E,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO;YACL,QAAQ,EAAE,QAAQ;YAClB,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;YACtB,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;YACvB,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;YACvB,GAAG,EAAE,EAAE;SACR,CAAC;IACJ,CAAC;IAED,iCAAiC;IACjC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACjD,IAAI,MAAM,EAAE,CAAC;QACX,OAAO;YACL,QAAQ,EAAE,GAAG;YACb,MAAM,EAAE,EAAE;YACV,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;YAClB,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;YAClB,GAAG,EAAE,EAAE;SACR,CAAC;IACJ,CAAC;IAED,oCAAoC;IACpC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;AACnE,CAAC;AAED,8EAA8E;AAC9E,4BAA4B;AAC5B,8EAA8E;AAE9E,4EAA4E;AAC5E,SAAS,eAAe,CAAC,CAAS,EAAE,CAAS;IAC3C,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC1B,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,EAAE,KAAK,EAAE;YAAE,OAAO,EAAE,GAAG,EAAE,CAAC;IAChC,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;GAIG;AACH,SAAS,oBAAoB,CAAC,MAAmB,EAAE,eAAyB;IAC1E,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IAE7C,MAAM,UAAU,GAA+C,EAAE,CAAC;IAClE,KAAK,MAAM,EAAE,IAAI,eAAe,EAAE,CAAC;QACjC,IAAI,EAAE,KAAK,MAAM,CAAC,GAAG;YAAE,SAAS;QAChC,MAAM,CAAC,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;QAC3B,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;YACjE,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACvB,MAAM,GAAG,GAAG,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAChE,IAAI,GAAG,KAAK,CAAC;YAAE,OAAO,GAAG,CAAC;QAC1B,+DAA+D;QAC/D,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO,CAAC,CAAC,CAAC;QACrD,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO,CAAC,CAAC;QACpD,OAAO,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;IAEH,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACnC,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,eAAyB;IACzE,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,MAAM,cAAc,GAAG,CAAC,EAAU,EAAE,EAAE;QACpC,IAAI,EAAE,KAAK,OAAO,IAAI,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YAC5D,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACb,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,CAAC;IAEF,mDAAmD;IACnD,MAAM,WAAW,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACjD,IAAI,WAAW,EAAE,CAAC;QAChB,KAAK,MAAM,EAAE,IAAI,WAAW;YAAE,cAAc,CAAC,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,qDAAqD;IACrD,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,oBAAoB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC9D,KAAK,MAAM,EAAE,IAAI,OAAO;QAAE,cAAc,CAAC,EAAE,CAAC,CAAC;IAE7C,OAAO,KAAK,CAAC;AACf,CAAC;AAED,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E,+FAA+F;AAC/F,MAAM,oBAAoB,GAAG;IAC3B,kBAAkB;IAClB,oCAAoC;IACpC,
|
|
1
|
+
{"version":3,"file":"model-fallback.js","sourceRoot":"","sources":["../../src/core/model-fallback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,GAAG,GAAG,YAAY,CAAC,gBAAgB,CAAC,CAAC;AAc3C,8EAA8E;AAC9E,yDAAyD;AACzD,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,mBAAmB,GAA6B;IACpD,qBAAqB;IACrB,iBAAiB,EAAQ,CAAC,iBAAiB,EAAE,mBAAmB,EAAE,mBAAmB,CAAC;IACtF,iBAAiB,EAAQ,CAAC,iBAAiB,EAAE,mBAAmB,EAAE,mBAAmB,CAAC;IAEtF,uBAAuB;IACvB,mBAAmB,EAAM,CAAC,mBAAmB,EAAE,kBAAkB,CAAC;IAClE,mBAAmB,EAAM,CAAC,mBAAmB,EAAE,kBAAkB,CAAC;IAElE,yDAAyD;IACzD,kBAAkB,EAAO,CAAC,mBAAmB,EAAE,mBAAmB,CAAC;IAEnE,kBAAkB;IAClB,SAAS,EAAgB,CAAC,SAAS,EAAE,SAAS,CAAC;IAC/C,SAAS,EAAgB,CAAC,SAAS,EAAE,SAAS,CAAC;IAC/C,SAAS,EAAgB,CAAC,SAAS,EAAE,SAAS,CAAC;IAC/C,YAAY,EAAa,CAAC,SAAS,EAAE,SAAS,CAAC;IAE/C,mBAAmB;IACnB,eAAe,EAAU,CAAC,eAAe,EAAE,mBAAmB,CAAC;IAC/D,eAAe,EAAU,CAAC,mBAAmB,EAAE,eAAe,CAAC;IAC/D,mBAAmB,EAAM,CAAC,eAAe,EAAE,eAAe,CAAC;IAE3D,kBAAkB;IAClB,SAAS,EAAgB,CAAC,YAAY,EAAE,SAAS,CAAC;IAElD,8BAA8B;IAC9B,IAAI,EAAsB,CAAC,SAAS,EAAE,SAAS,CAAC;IAChD,SAAS,EAAiB,CAAC,IAAI,EAAE,YAAY,CAAC;CAC/C,CAAC;AAEF,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAAC,EAAU;IACrC,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;IAE/B,8CAA8C;IAC9C,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC5E,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO;YACL,QAAQ,EAAE,QAAQ;YAClB,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;YACtB,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;YACvB,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;YACvB,GAAG,EAAE,EAAE;SACR,CAAC;IACJ,CAAC;IAED,wCAAwC;IACxC,sEAAsE;IACtE,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;IAC5E,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,4CAA4C;QACxE,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,8BAA8B;QAEzD,4FAA4F;QAC5F,MAAM,aAAa,GAAG,CAAC,OAAO,CAAC,CAAC;QAChC,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,OAA2B,CAAC;QAEhC,IAAI,MAAM,IAAI,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7C,MAAM,GAAG,MAAM,CAAC;YAChB,OAAO,GAAG,KAAK,CAAC;QAClB,CAAC;aAAM,IAAI,MAAM,EAAE,CAAC;YAClB,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;QAClD,CAAC;QAED,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;IAChE,CAAC;IAED,8CAA8C;IAC9C,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC5E,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO;YACL,QAAQ,EAAE,QAAQ;YAClB,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;YACtB,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;YACvB,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;YACvB,GAAG,EAAE,EAAE;SACR,CAAC;IACJ,CAAC;IAED,iCAAiC;IACjC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACjD,IAAI,MAAM,EAAE,CAAC;QACX,OAAO;YACL,QAAQ,EAAE,GAAG;YACb,MAAM,EAAE,EAAE;YACV,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;YAClB,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;YAClB,GAAG,EAAE,EAAE;SACR,CAAC;IACJ,CAAC;IAED,oCAAoC;IACpC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;AACnE,CAAC;AAED,8EAA8E;AAC9E,4BAA4B;AAC5B,8EAA8E;AAE9E,4EAA4E;AAC5E,SAAS,eAAe,CAAC,CAAS,EAAE,CAAS;IAC3C,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC1B,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,EAAE,KAAK,EAAE;YAAE,OAAO,EAAE,GAAG,EAAE,CAAC;IAChC,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;GAIG;AACH,SAAS,oBAAoB,CAAC,MAAmB,EAAE,eAAyB;IAC1E,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IAE7C,MAAM,UAAU,GAA+C,EAAE,CAAC;IAClE,KAAK,MAAM,EAAE,IAAI,eAAe,EAAE,CAAC;QACjC,IAAI,EAAE,KAAK,MAAM,CAAC,GAAG;YAAE,SAAS;QAChC,MAAM,CAAC,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;QAC3B,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;YACjE,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACvB,MAAM,GAAG,GAAG,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAChE,IAAI,GAAG,KAAK,CAAC;YAAE,OAAO,GAAG,CAAC;QAC1B,+DAA+D;QAC/D,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO,CAAC,CAAC,CAAC;QACrD,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO,CAAC,CAAC;QACpD,OAAO,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;IAEH,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACnC,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,eAAyB;IACzE,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,MAAM,cAAc,GAAG,CAAC,EAAU,EAAE,EAAE;QACpC,IAAI,EAAE,KAAK,OAAO,IAAI,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YAC5D,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACb,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,CAAC;IAEF,mDAAmD;IACnD,MAAM,WAAW,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACjD,IAAI,WAAW,EAAE,CAAC;QAChB,KAAK,MAAM,EAAE,IAAI,WAAW;YAAE,cAAc,CAAC,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,qDAAqD;IACrD,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,oBAAoB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC9D,KAAK,MAAM,EAAE,IAAI,OAAO;QAAE,cAAc,CAAC,EAAE,CAAC,CAAC;IAE7C,OAAO,KAAK,CAAC;AACf,CAAC;AAED,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E,+FAA+F;AAC/F,MAAM,oBAAoB,GAAG;IAC3B,kBAAkB;IAClB,oCAAoC;IACpC,sFAAsF;IACtF,eAAe;IACf,wBAAwB;IACxB,uBAAuB;IACvB,mCAAmC;IACnC,mBAAmB;IACnB,qEAAqE;CACtE,CAAC;AAEF,oEAAoE;AACpE,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AAE9C;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,KAAU;IACrC,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IAEzB,0BAA0B;IAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC;IAChD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QAChE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,kEAAkE;IAClE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACxB,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,+BAA+B;IAC/B,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC;IACrE,OAAO,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AACrE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAChC,YAAoB,EACpB,eAAyB,EACzB,eAA0B;IAE1B,MAAM,eAAe,GAAG,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC;IACnD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,eAAe,CAAC,CAAC,CAAC,gBAAgB,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEzF,IAAI,eAAe,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,eAAe;YAC9B,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,YAAY,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACxE,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,YAAY,CAAC,CAAC;QACpD,OAAO;YACL,GAAG,QAAQ;YACX,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SAC5C,CAAC;IACJ,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,YAAoB,EACpB,eAAyB,EACzB,eAAqC,EACrC,MAAqC;IAErC,0BAA0B;IAC1B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;QAC1C,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;IACjE,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,GAAG,CAAC,CAAC,0CAA0C;QACvD,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,UAAU,YAAY,aAAa,GAAG,CAAC,OAAO,IAAI,GAAG,uBAAuB,CAAC,CAAC;QAEvF,MAAM,KAAK,GAAG,kBAAkB,CAAC,YAAY,EAAE,eAAe,EAAE,eAAe,CAAC,CAAC;QAEjF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,GAAG,CAAC,KAAK,CAAC,qCAAqC,YAAY,GAAG,CAAC,CAAC;YAChE,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,uBAAuB,YAAY,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAEvE,oBAAoB;QACpB,IAAI,SAAS,GAAG,GAAG,CAAC;QACpB,KAAK,MAAM,aAAa,IAAI,KAAK,EAAE,CAAC;YAClC,IAAI,CAAC;gBACH,GAAG,CAAC,IAAI,CAAC,0BAA0B,aAAa,MAAM,CAAC,CAAC;gBACxD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;gBAC3C,GAAG,CAAC,IAAI,CAAC,gBAAgB,aAAa,aAAa,CAAC,CAAC;gBACrD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;YACjE,CAAC;YAAC,OAAO,WAAgB,EAAE,CAAC;gBAC1B,GAAG,CAAC,IAAI,CAAC,mBAAmB,aAAa,kBAAkB,WAAW,CAAC,OAAO,IAAI,WAAW,EAAE,CAAC,CAAC;gBACjG,SAAS,GAAG,WAAW,CAAC;YAC1B,CAAC;QACH,CAAC;QAED,GAAG,CAAC,KAAK,CAAC,sCAAsC,YAAY,GAAG,CAAC,CAAC;QACjE,MAAM,SAAS,CAAC;IAClB,CAAC;AACH,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { loadConfig, getConfig, isConfiguredChannel, registerDynamicChannel, markChannelAsDM, getChannelConfig, getPlatformBots, getChannelBotName, isBotAdmin, getHardcodedRules, getConfigRules, reloadConfig, ConfigWatcher } from './config.js';
|
|
1
|
+
import { loadConfig, getConfig, isConfiguredChannel, registerDynamicChannel, markChannelAsDM, getChannelConfig, getPlatformBots, getPlatformAccess, getChannelBotName, isBotAdmin, getHardcodedRules, getConfigRules, reloadConfig, ConfigWatcher } from './config.js';
|
|
2
2
|
import { CopilotBridge } from './core/bridge.js';
|
|
3
3
|
import { SessionManager, BRIDGE_CUSTOM_TOOLS } from './core/session-manager.js';
|
|
4
4
|
import { handleCommand, parseCommand } from './core/command-handler.js';
|
|
@@ -12,6 +12,7 @@ import { initScheduler, stopAll as stopScheduler, listJobs, removeJob, pauseJob,
|
|
|
12
12
|
import { markBusy, markIdle, markIdleImmediate, isBusy, waitForChannelIdle, cancelIdleDebounce } from './core/channel-idle.js';
|
|
13
13
|
import { LoopDetector, MAX_IDENTICAL_CALLS } from './core/loop-detector.js';
|
|
14
14
|
import { getTaskHistory } from './state/store.js';
|
|
15
|
+
import { checkUserAccess } from './core/access-control.js';
|
|
15
16
|
import { createLogger } from './logger.js';
|
|
16
17
|
import fs from 'node:fs';
|
|
17
18
|
import path from 'node:path';
|
|
@@ -116,6 +117,112 @@ function getAdapterForChannel(channelId) {
|
|
|
116
117
|
return null;
|
|
117
118
|
return { adapter, streaming };
|
|
118
119
|
}
|
|
120
|
+
const SLACK_UID_PATTERN = /^U[A-Z0-9]{6,}$/;
|
|
121
|
+
/**
|
|
122
|
+
* Resolve non-UID entries in Slack bot access configs.
|
|
123
|
+
* Handles added manually as usernames are looked up via Slack API (with pagination) and replaced with UIDs.
|
|
124
|
+
*/
|
|
125
|
+
async function resolveSlackAccessUsers(config) {
|
|
126
|
+
const slackPlatform = config.platforms.slack;
|
|
127
|
+
if (!slackPlatform?.bots)
|
|
128
|
+
return;
|
|
129
|
+
// Collect all access configs that need resolution: platform-level + per-bot
|
|
130
|
+
const accessTargets = [];
|
|
131
|
+
const firstBotToken = Object.values(slackPlatform.bots)[0]?.token;
|
|
132
|
+
if (slackPlatform.access?.users?.length && firstBotToken) {
|
|
133
|
+
accessTargets.push({ label: 'platform "slack"', access: slackPlatform.access, tokenSource: firstBotToken });
|
|
134
|
+
}
|
|
135
|
+
for (const [botName, bot] of Object.entries(slackPlatform.bots)) {
|
|
136
|
+
if (bot.access?.users?.length) {
|
|
137
|
+
accessTargets.push({ label: `bot "${botName}"`, access: bot.access, tokenSource: bot.token });
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
if (accessTargets.length === 0)
|
|
141
|
+
return;
|
|
142
|
+
// Deduplicate API calls — group by token
|
|
143
|
+
const membersByToken = new Map();
|
|
144
|
+
for (const target of accessTargets) {
|
|
145
|
+
if (membersByToken.has(target.tokenSource))
|
|
146
|
+
continue;
|
|
147
|
+
const unresolved = target.access.users.filter(u => !SLACK_UID_PATTERN.test(u));
|
|
148
|
+
if (unresolved.length === 0)
|
|
149
|
+
continue;
|
|
150
|
+
const allMembers = [];
|
|
151
|
+
try {
|
|
152
|
+
let cursor;
|
|
153
|
+
do {
|
|
154
|
+
const params = new URLSearchParams({ limit: '200' });
|
|
155
|
+
if (cursor)
|
|
156
|
+
params.set('cursor', cursor);
|
|
157
|
+
const resp = await fetch(`https://slack.com/api/users.list?${params}`, {
|
|
158
|
+
headers: { 'Authorization': `Bearer ${target.tokenSource}` },
|
|
159
|
+
});
|
|
160
|
+
if (!resp.ok) {
|
|
161
|
+
log.warn(` Slack users.list failed: HTTP ${resp.status}`);
|
|
162
|
+
break;
|
|
163
|
+
}
|
|
164
|
+
const data = await resp.json();
|
|
165
|
+
if (!data.ok) {
|
|
166
|
+
log.warn(` Slack users.list failed: ${data.error}`);
|
|
167
|
+
break;
|
|
168
|
+
}
|
|
169
|
+
for (const m of data.members ?? [])
|
|
170
|
+
allMembers.push(m);
|
|
171
|
+
cursor = data.response_metadata?.next_cursor || undefined;
|
|
172
|
+
} while (cursor);
|
|
173
|
+
}
|
|
174
|
+
catch (err) {
|
|
175
|
+
log.warn(` Failed to fetch Slack users: ${err.message}`);
|
|
176
|
+
}
|
|
177
|
+
membersByToken.set(target.tokenSource, allMembers);
|
|
178
|
+
}
|
|
179
|
+
// Resolve each access config
|
|
180
|
+
for (const target of accessTargets) {
|
|
181
|
+
const unresolved = target.access.users.filter(u => !SLACK_UID_PATTERN.test(u));
|
|
182
|
+
if (unresolved.length === 0)
|
|
183
|
+
continue;
|
|
184
|
+
log.info(`Resolving ${unresolved.length} Slack handle(s) for ${target.label} access list...`);
|
|
185
|
+
const allMembers = membersByToken.get(target.tokenSource) ?? [];
|
|
186
|
+
// Build lookup map for O(1) resolution
|
|
187
|
+
const nameMap = new Map();
|
|
188
|
+
const displayMap = new Map();
|
|
189
|
+
for (const m of allMembers) {
|
|
190
|
+
if (m.deleted || m.is_bot)
|
|
191
|
+
continue;
|
|
192
|
+
const name = (m.name ?? '').toLowerCase();
|
|
193
|
+
if (name)
|
|
194
|
+
nameMap.set(name, m.id);
|
|
195
|
+
const displayName = m.profile?.display_name_normalized?.toLowerCase() ?? '';
|
|
196
|
+
if (displayName)
|
|
197
|
+
displayMap.set(displayName, m.id);
|
|
198
|
+
const realName = m.profile?.real_name_normalized?.toLowerCase() ?? '';
|
|
199
|
+
if (realName)
|
|
200
|
+
displayMap.set(realName, m.id);
|
|
201
|
+
}
|
|
202
|
+
const resolved = [];
|
|
203
|
+
for (const handle of unresolved) {
|
|
204
|
+
const normalized = handle.replace(/^@/, '').toLowerCase();
|
|
205
|
+
const byName = nameMap.get(normalized);
|
|
206
|
+
if (byName) {
|
|
207
|
+
log.info(` Resolved "${handle}" → ${byName} (by handle)`);
|
|
208
|
+
resolved.push(byName);
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
const byDisplay = displayMap.get(normalized);
|
|
212
|
+
if (byDisplay) {
|
|
213
|
+
log.warn(` Resolved "${handle}" → ${byDisplay} (by display/real name — consider using the exact Slack handle for reliability)`);
|
|
214
|
+
resolved.push(byDisplay);
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
log.warn(` Could not resolve Slack handle "${handle}" — keeping as-is`);
|
|
218
|
+
resolved.push(handle);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
const uidEntries = target.access.users.filter(u => SLACK_UID_PATTERN.test(u));
|
|
223
|
+
target.access.users = [...uidEntries, ...resolved];
|
|
224
|
+
}
|
|
225
|
+
}
|
|
119
226
|
async function main() {
|
|
120
227
|
log.info('copilot-bridge starting...');
|
|
121
228
|
// Load configuration
|
|
@@ -126,6 +233,16 @@ async function main() {
|
|
|
126
233
|
configWatcher.onReload((result) => {
|
|
127
234
|
if (!result.success)
|
|
128
235
|
return;
|
|
236
|
+
// Re-resolve Slack access handles after reload (config was re-read from disk).
|
|
237
|
+
// Fires asynchronously — messages during resolution use the old resolved values.
|
|
238
|
+
void (async () => {
|
|
239
|
+
try {
|
|
240
|
+
await resolveSlackAccessUsers(getConfig());
|
|
241
|
+
}
|
|
242
|
+
catch (err) {
|
|
243
|
+
log.warn(`Slack access resolution after reload failed: ${err.message}`);
|
|
244
|
+
}
|
|
245
|
+
})();
|
|
129
246
|
if (result.restartNeeded.length > 0) {
|
|
130
247
|
// Notify admin channels about restart-needed changes
|
|
131
248
|
for (const [key, adapter] of botAdapters) {
|
|
@@ -174,20 +291,44 @@ async function main() {
|
|
|
174
291
|
};
|
|
175
292
|
// Initialize channel adapters — one per bot identity
|
|
176
293
|
for (const [platformName, platformConfig] of Object.entries(config.platforms)) {
|
|
177
|
-
const factory = adapterFactories[platformName];
|
|
178
|
-
if (!factory) {
|
|
179
|
-
log.warn(`No adapter for platform "${platformName}" — skipping`);
|
|
180
|
-
continue;
|
|
181
|
-
}
|
|
182
294
|
const bots = getPlatformBots(platformName);
|
|
183
295
|
for (const [botName, botInfo] of bots) {
|
|
184
296
|
const key = `${platformName}:${botName}`;
|
|
185
|
-
|
|
297
|
+
let adapter;
|
|
298
|
+
if (platformName === 'slack') {
|
|
299
|
+
// Slack needs appToken for Socket Mode — construct directly
|
|
300
|
+
if (!botInfo.appToken) {
|
|
301
|
+
log.error(`Slack bot "${botName}" missing appToken — skipping`);
|
|
302
|
+
continue;
|
|
303
|
+
}
|
|
304
|
+
try {
|
|
305
|
+
const { SlackAdapter } = await import('./channels/slack/adapter.js');
|
|
306
|
+
adapter = new SlackAdapter({
|
|
307
|
+
platformName,
|
|
308
|
+
botToken: botInfo.token,
|
|
309
|
+
appToken: botInfo.appToken,
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
catch (err) {
|
|
313
|
+
log.error(`Failed to load Slack adapter: ${err.message}`);
|
|
314
|
+
continue;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
else {
|
|
318
|
+
const factory = adapterFactories[platformName];
|
|
319
|
+
if (!factory) {
|
|
320
|
+
log.warn(`No adapter for platform "${platformName}" — skipping`);
|
|
321
|
+
break; // skip all bots for this platform
|
|
322
|
+
}
|
|
323
|
+
adapter = factory(platformName, platformConfig.url ?? '', botInfo.token);
|
|
324
|
+
}
|
|
186
325
|
botAdapters.set(key, adapter);
|
|
187
326
|
botStreamers.set(key, new StreamingHandler(adapter));
|
|
188
327
|
log.info(`Registered bot "${botName}" for ${platformName}`);
|
|
189
328
|
}
|
|
190
329
|
}
|
|
330
|
+
// Resolve non-UID Slack access entries at startup
|
|
331
|
+
await resolveSlackAccessUsers(config);
|
|
191
332
|
// Wire up session events → streaming output (serialized per channel)
|
|
192
333
|
sessionManager.onSessionEvent((sessionId, channelId, event) => {
|
|
193
334
|
const prev = eventLocks.get(channelId) ?? Promise.resolve();
|
|
@@ -242,7 +383,7 @@ async function main() {
|
|
|
242
383
|
.catch(err => log.error(`Unhandled error in message handler:`, err)));
|
|
243
384
|
channelLocks.set(msg.channelId, next);
|
|
244
385
|
});
|
|
245
|
-
adapter.onReaction((reaction) => handleReaction(reaction, sessionManager));
|
|
386
|
+
adapter.onReaction((reaction) => handleReaction(reaction, sessionManager, platformName, botName));
|
|
246
387
|
await adapter.connect();
|
|
247
388
|
log.info(`${key} connected`);
|
|
248
389
|
// Discover existing DM channels and auto-register any that aren't configured
|
|
@@ -370,6 +511,12 @@ async function handleMidTurnMessage(msg, sessionManager, platformName, botName)
|
|
|
370
511
|
if (key.startsWith(`${platformName}:`) && msg.userId === a.getBotUserId())
|
|
371
512
|
return;
|
|
372
513
|
}
|
|
514
|
+
// Check user-level access control
|
|
515
|
+
const botInfo = getPlatformBots(platformName).get(botName);
|
|
516
|
+
if (!checkUserAccess(msg.userId, msg.username, botInfo?.access, getPlatformAccess(platformName))) {
|
|
517
|
+
log.debug(`User ${msg.username} (${msg.userId}) denied mid-turn access to bot "${botName}"`);
|
|
518
|
+
return;
|
|
519
|
+
}
|
|
373
520
|
if (!isConfiguredChannel(msg.channelId))
|
|
374
521
|
return;
|
|
375
522
|
const assignedBot = getChannelBotName(msg.channelId);
|
|
@@ -381,8 +528,10 @@ async function handleMidTurnMessage(msg, sessionManager, platformName, botName)
|
|
|
381
528
|
const { adapter } = resolved;
|
|
382
529
|
const channelConfig = getChannelConfig(msg.channelId);
|
|
383
530
|
// Respect trigger mode — don't steer on unmentioned messages in mention-only channels
|
|
384
|
-
if (channelConfig.triggerMode === 'mention' && !msg.mentionsBot && !msg.isDM)
|
|
531
|
+
if (channelConfig.triggerMode === 'mention' && !msg.mentionsBot && !msg.isDM) {
|
|
532
|
+
log.debug(`Ignoring mid-turn message (trigger=mention, no mention) in ${msg.channelId.slice(0, 8)}...`);
|
|
385
533
|
return;
|
|
534
|
+
}
|
|
386
535
|
const text = stripBotMention(msg.text, channelConfig.bot);
|
|
387
536
|
if (!text && !msg.attachments?.length)
|
|
388
537
|
return;
|
|
@@ -457,7 +606,7 @@ async function handleMidTurnMessage(msg, sessionManager, platformName, botName)
|
|
|
457
606
|
// Commands with complex action handlers (skills, schedule, rules) defer to serialized path.
|
|
458
607
|
const SAFE_MID_TURN = new Set([
|
|
459
608
|
'context', 'status', 'help', 'verbose', 'autopilot', 'yolo',
|
|
460
|
-
'mcp', 'model', 'models', 'reasoning',
|
|
609
|
+
'mcp', 'model', 'models', 'reasoning', 'agents',
|
|
461
610
|
'streamer-mode', 'on-air',
|
|
462
611
|
]);
|
|
463
612
|
if (SAFE_MID_TURN.has(parsed.command)) {
|
|
@@ -523,6 +672,12 @@ async function handleInboundMessage(msg, sessionManager, platformName, botName)
|
|
|
523
672
|
if (key.startsWith(`${platformName}:`) && msg.userId === a.getBotUserId())
|
|
524
673
|
return;
|
|
525
674
|
}
|
|
675
|
+
// Check user-level access control (reads live config — hot-reloadable)
|
|
676
|
+
const botInfo = getPlatformBots(platformName).get(botName);
|
|
677
|
+
if (!checkUserAccess(msg.userId, msg.username, botInfo?.access, getPlatformAccess(platformName))) {
|
|
678
|
+
log.debug(`User ${msg.username} (${msg.userId}) denied access to bot "${botName}"`);
|
|
679
|
+
return; // silent drop
|
|
680
|
+
}
|
|
526
681
|
// Auto-register DM channels for known bots
|
|
527
682
|
if (!isConfiguredChannel(msg.channelId) && msg.isDM) {
|
|
528
683
|
const workspacePath = getWorkspacePath(botName);
|
|
@@ -558,8 +713,10 @@ async function handleInboundMessage(msg, sessionManager, platformName, botName)
|
|
|
558
713
|
const channelConfig = getChannelConfig(msg.channelId);
|
|
559
714
|
// Check trigger mode
|
|
560
715
|
const triggerMode = channelConfig.triggerMode;
|
|
561
|
-
if (triggerMode === 'mention' && !msg.mentionsBot && !msg.isDM)
|
|
716
|
+
if (triggerMode === 'mention' && !msg.mentionsBot && !msg.isDM) {
|
|
717
|
+
log.debug(`Ignoring message (trigger=mention, no mention) in ${msg.channelId.slice(0, 8)}...`);
|
|
562
718
|
return;
|
|
719
|
+
}
|
|
563
720
|
// Strip bot mention from message text
|
|
564
721
|
let text = stripBotMention(msg.text, channelConfig.bot);
|
|
565
722
|
if (!text && !msg.attachments?.length)
|
|
@@ -1020,11 +1177,20 @@ async function handleInboundMessage(msg, sessionManager, platformName, botName)
|
|
|
1020
1177
|
}
|
|
1021
1178
|
}
|
|
1022
1179
|
// --- Reaction Handling ---
|
|
1023
|
-
async function handleReaction(reaction, sessionManager) {
|
|
1180
|
+
async function handleReaction(reaction, sessionManager, platformName, botName) {
|
|
1024
1181
|
if (!isConfiguredChannel(reaction.channelId))
|
|
1025
1182
|
return;
|
|
1026
1183
|
if (reaction.action !== 'added')
|
|
1027
1184
|
return;
|
|
1185
|
+
// Check user-level access control.
|
|
1186
|
+
// Reactions only carry userId (no username), so this matches against userId only.
|
|
1187
|
+
// For Slack (UIDs stored in config), this is exact. For Mattermost (usernames in config),
|
|
1188
|
+
// this is best-effort — admin bots should use both username and user ID in allowlists.
|
|
1189
|
+
const botInfo = getPlatformBots(platformName).get(botName);
|
|
1190
|
+
if (!checkUserAccess(reaction.userId, reaction.userId, botInfo?.access, getPlatformAccess(platformName))) {
|
|
1191
|
+
log.debug(`User ${reaction.userId} denied reaction access to bot "${botName}"`);
|
|
1192
|
+
return;
|
|
1193
|
+
}
|
|
1028
1194
|
const resolved = getAdapterForChannel(reaction.channelId);
|
|
1029
1195
|
if (!resolved)
|
|
1030
1196
|
return;
|
|
@@ -1079,6 +1245,7 @@ async function handleSessionEvent(sessionId, channelId, event, sessionManager) {
|
|
|
1079
1245
|
// Handle custom bridge events (permissions, user input)
|
|
1080
1246
|
if (event.type === 'bridge.permission_request') {
|
|
1081
1247
|
const streamKey = activeStreams.get(channelId);
|
|
1248
|
+
const threadRootId = streamKey ? streaming.getStreamThreadRootId(streamKey) : undefined;
|
|
1082
1249
|
if (streamKey) {
|
|
1083
1250
|
await streaming.finalizeStream(streamKey);
|
|
1084
1251
|
activeStreams.delete(channelId);
|
|
@@ -1086,11 +1253,12 @@ async function handleSessionEvent(sessionId, channelId, event, sessionManager) {
|
|
|
1086
1253
|
await finalizeActivityFeed(channelId, adapter);
|
|
1087
1254
|
const { toolName, serverName, input, commands } = event.data;
|
|
1088
1255
|
const formatted = formatPermissionRequest(toolName, input, commands, serverName);
|
|
1089
|
-
await adapter.sendMessage(channelId, formatted);
|
|
1256
|
+
await adapter.sendMessage(channelId, formatted, { threadRootId });
|
|
1090
1257
|
return;
|
|
1091
1258
|
}
|
|
1092
1259
|
if (event.type === 'bridge.user_input_request') {
|
|
1093
1260
|
const streamKey = activeStreams.get(channelId);
|
|
1261
|
+
const threadRootId = streamKey ? streaming.getStreamThreadRootId(streamKey) : undefined;
|
|
1094
1262
|
if (streamKey) {
|
|
1095
1263
|
await streaming.finalizeStream(streamKey);
|
|
1096
1264
|
activeStreams.delete(channelId);
|
|
@@ -1098,7 +1266,7 @@ async function handleSessionEvent(sessionId, channelId, event, sessionManager) {
|
|
|
1098
1266
|
await finalizeActivityFeed(channelId, adapter);
|
|
1099
1267
|
const { question, choices } = event.data;
|
|
1100
1268
|
const formatted = formatUserInputRequest(question, choices);
|
|
1101
|
-
await adapter.sendMessage(channelId, formatted);
|
|
1269
|
+
await adapter.sendMessage(channelId, formatted, { threadRootId });
|
|
1102
1270
|
return;
|
|
1103
1271
|
}
|
|
1104
1272
|
// Format and route SDK events
|