@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.
Files changed (38) hide show
  1. package/config.sample.json +8 -1
  2. package/dist/channels/slack/adapter.d.ts +62 -0
  3. package/dist/channels/slack/adapter.d.ts.map +1 -0
  4. package/dist/channels/slack/adapter.js +382 -0
  5. package/dist/channels/slack/adapter.js.map +1 -0
  6. package/dist/channels/slack/mrkdwn.d.ts +22 -0
  7. package/dist/channels/slack/mrkdwn.d.ts.map +1 -0
  8. package/dist/channels/slack/mrkdwn.js +120 -0
  9. package/dist/channels/slack/mrkdwn.js.map +1 -0
  10. package/dist/config.d.ts +5 -1
  11. package/dist/config.d.ts.map +1 -1
  12. package/dist/config.js +55 -7
  13. package/dist/config.js.map +1 -1
  14. package/dist/core/access-control.d.ts +32 -0
  15. package/dist/core/access-control.d.ts.map +1 -0
  16. package/dist/core/access-control.js +59 -0
  17. package/dist/core/access-control.js.map +1 -0
  18. package/dist/core/command-handler.d.ts.map +1 -1
  19. package/dist/core/command-handler.js +75 -1
  20. package/dist/core/command-handler.js.map +1 -1
  21. package/dist/core/inter-agent.d.ts +9 -2
  22. package/dist/core/inter-agent.d.ts.map +1 -1
  23. package/dist/core/inter-agent.js +87 -22
  24. package/dist/core/inter-agent.js.map +1 -1
  25. package/dist/core/model-fallback.js +1 -1
  26. package/dist/core/model-fallback.js.map +1 -1
  27. package/dist/index.js +182 -14
  28. package/dist/index.js.map +1 -1
  29. package/dist/types.d.ts +9 -1
  30. package/dist/types.d.ts.map +1 -1
  31. package/package.json +2 -1
  32. package/scripts/init.ts +322 -117
  33. package/scripts/lib/config-gen.ts +74 -10
  34. package/scripts/lib/prerequisites.ts +17 -5
  35. package/scripts/lib/prompts.ts +4 -0
  36. package/scripts/lib/slack.ts +190 -0
  37. package/templates/admin/AGENTS.md +5 -5
  38. package/templates/agents/AGENTS.md +1 -1
@@ -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
- * Discover *.agent.md files in a bot's workspace agents/ directory.
135
- * Returns a map of agent name → definition.
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
- if (!fs.existsSync(agentsDir))
141
- return definitions;
142
- try {
143
- for (const entry of fs.readdirSync(agentsDir, { withFileTypes: true })) {
144
- if (!entry.isFile() || !entry.name.endsWith('.agent.md'))
145
- continue;
146
- const name = entry.name.replace(/\.agent\.md$/, '');
147
- const filePath = path.join(agentsDir, entry.name);
148
- try {
149
- const content = fs.readFileSync(filePath, 'utf-8');
150
- definitions.set(name, { name, content, filePath });
151
- log.debug(`Discovered agent definition: ${name} at ${filePath}`);
152
- }
153
- catch (err) {
154
- log.warn(`Failed to read agent definition ${filePath}: ${err?.message}`);
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
- catch (err) {
159
- log.warn(`Failed to scan agents directory ${agentsDir}: ${err?.message}`);
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 in ${workspacePath}/agents/`);
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":"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"}
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,sEAAsE;IACtE,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"}
1
+ {"version":3,"file":"model-fallback.js","sourceRoot":"","sources":["../../src/core/model-fallback.ts"],"names":[],"mappings":"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"}
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
- const adapter = factory(platformName, platformConfig.url, botInfo.token);
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