agent-messenger 2.15.0 → 2.15.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-messenger",
3
- "version": "2.15.0",
3
+ "version": "2.15.1",
4
4
  "description": "Messaging platform interaction skills for AI agents. Interact with Slack, Discord, Microsoft Teams, Webex, Telegram, Telegram Bot, WhatsApp, LINE, Instagram, KakaoTalk, and Channel Talk - send messages, read channels, manage reactions, upload files, and more through simple CLI interfaces.",
5
5
  "author": {
6
6
  "name": "agent-messenger",
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-messenger",
3
- "version": "2.15.0",
3
+ "version": "2.15.1",
4
4
  "description": "Multi-platform messaging CLI for AI agents (Slack, Discord, Teams, Webex, Telegram, Telegram Bot, WhatsApp, LINE, Instagram, KakaoTalk, Channel Talk)",
5
5
  "repository": {
6
6
  "type": "git",
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../../../src/platforms/slack/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAWnC,OAAO,EAAE,KAAK,kBAAkB,EAAkB,MAAM,oBAAoB,CAAA;AAE5E,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,kBAAkB,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,CAI3F;AAqND,wBAAgB,yBAAyB,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,MAAM,CAQ1E;AAED,wBAAgB,2BAA2B,IAAI,MAAM,CAEpD;AAED,eAAO,MAAM,WAAW,SA4BrB,CAAA"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../../../src/platforms/slack/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAWnC,OAAO,EAAE,KAAK,kBAAkB,EAAkB,MAAM,oBAAoB,CAAA;AAE5E,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,kBAAkB,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,CAI3F;AAuND,wBAAgB,yBAAyB,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,MAAM,CAQ1E;AAED,wBAAgB,2BAA2B,IAAI,MAAM,CAEpD;AAED,eAAO,MAAM,WAAW,SA4BrB,CAAA"}
@@ -82,16 +82,20 @@ async function extractAction(options) {
82
82
  }
83
83
  if (options.debug) {
84
84
  const domain = workspaceDomains[ws.workspace_id];
85
- debug(`[debug] Attempting web token refresh for ${ws.workspace_id}${domain ? ` (${domain}.slack.com)` : ''}...`);
85
+ const target = domain
86
+ ? `${ws.workspace_id} (${domain}.slack.com)`
87
+ : `${ws.workspace_id} (trying all known domains)`;
88
+ debug(`[debug] Attempting web token refresh for ${target}...`);
86
89
  }
87
90
  const refreshed = await tryWebTokenRefresh(ws, workspaceDomains);
88
91
  if (refreshed) {
89
92
  ws.token = refreshed.token;
93
+ ws.workspace_id = refreshed.workspace_id;
90
94
  ws.workspace_name = refreshed.workspace_name;
91
95
  validWorkspaces.push(ws);
92
96
  await credManager.setWorkspace(ws);
93
97
  if (options.debug) {
94
- debug(`[debug] ✓ Web refresh succeeded: ${refreshed.workspace_name}`);
98
+ debug(`[debug] ✓ Web refresh succeeded: ${refreshed.workspace_id}/${refreshed.workspace_name}`);
95
99
  }
96
100
  }
97
101
  else if (options.debug) {
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../../../src/platforms/slack/commands/auth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../../../src/platforms/slack/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAA;AAE/D,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACpD,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAE7C,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AACzD,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAClE,OAAO,EAA2B,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAE5E,MAAM,UAAU,qBAAqB,CAAC,EAAsB,EAAE,WAAqB;IACjF,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAA;IAC/E,MAAM,aAAa,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAA;IACjF,OAAO,GAAG,EAAE,CAAC,YAAY,WAAW,YAAY,YAAY,aAAa,EAAE,CAAA;AAC7E,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,OAK5B;IACC,IAAI,CAAC;QACH,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;YAChC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAA;QACtB,CAAC;QACD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QACrF,MAAM,SAAS,GAAG,IAAI,cAAc,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;QAEvG,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YACf,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAA;YACrD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YACf,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAA;YACvE,OAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAA;YAC3E,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAA;YACnD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YACf,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;YAC9B,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAA;YAC7E,OAAO,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAA;YACzE,OAAO,CAAC,GAAG,CAAC,yEAAyE,CAAC,CAAA;YACtF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YACf,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAA;YACvE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACjB,CAAC;QAED,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,KAAK,CAAC,4BAA4B,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;QAC9D,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,CAAA;QAE5C,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,KAAK,CAAC,iBAAiB,UAAU,CAAC,MAAM,eAAe,CAAC,CAAA;YACxD,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;gBAC5B,KAAK,CAAC,aAAa,qBAAqB,CAAC,EAAE,EAAE,OAAO,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAA;YAC9E,CAAC;QACH,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CACT,YAAY,CACV;gBACE,KAAK,EAAE,2BAA2B,EAAE;gBACpC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,iCAAiC;aACpE,EACD,OAAO,CAAC,MAAM,CACf,CACF,CAAA;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,iBAAiB,EAAE,CAAA;QAC3C,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,CAAA;QACvC,MAAM,gBAAgB,GAAG,SAAS,CAAC,mBAAmB,EAAE,CAAA;QAExD,MAAM,eAAe,GAAG,EAAE,CAAA;QAC1B,MAAM,cAAc,GAAa,EAAE,CAAA;QACnC,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;YAC5B,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;gBAClB,KAAK,CAAC,mCAAmC,EAAE,CAAC,YAAY,KAAK,CAAC,CAAA;YAChE,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,WAAW,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAA;gBACpF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAA;gBACxC,EAAE,CAAC,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAA;gBAClC,EAAE,CAAC,cAAc,GAAG,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,cAAc,CAAA;gBACtD,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;gBACxB,MAAM,WAAW,CAAC,YAAY,CAAC,EAAE,CAAC,CAAA;gBAElC,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;oBAClB,KAAK,CAAC,oBAAoB,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAA;gBAC/D,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,GAAG,KAAK,YAAY,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAA;gBACjE,IAAI,IAAI,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC3C,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBAC3B,CAAC;gBACD,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;oBAClB,KAAK,CAAC,sBAAuB,KAAe,CAAC,OAAO,EAAE,CAAC,CAAA;gBACzD,CAAC;gBAED,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;oBAClB,MAAM,MAAM,GAAG,gBAAgB,CAAC,EAAE,CAAC,YAAY,CAAC,CAAA;oBAChD,MAAM,MAAM,GAAG,MAAM;wBACnB,CAAC,CAAC,GAAG,EAAE,CAAC,YAAY,KAAK,MAAM,aAAa;wBAC5C,CAAC,CAAC,GAAG,EAAE,CAAC,YAAY,6BAA6B,CAAA;oBACnD,KAAK,CAAC,4CAA4C,MAAM,KAAK,CAAC,CAAA;gBAChE,CAAC;gBACD,MAAM,SAAS,GAAG,MAAM,kBAAkB,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAA;gBAChE,IAAI,SAAS,EAAE,CAAC;oBACd,EAAE,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,CAAA;oBAC1B,EAAE,CAAC,YAAY,GAAG,SAAS,CAAC,YAAY,CAAA;oBACxC,EAAE,CAAC,cAAc,GAAG,SAAS,CAAC,cAAc,CAAA;oBAC5C,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;oBACxB,MAAM,WAAW,CAAC,YAAY,CAAC,EAAE,CAAC,CAAA;oBAElC,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;wBAClB,KAAK,CAAC,oCAAoC,SAAS,CAAC,YAAY,IAAI,SAAS,CAAC,cAAc,EAAE,CAAC,CAAA;oBACjG,CAAC;gBACH,CAAC;qBAAM,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;oBACzB,KAAK,CAAC,8BAA8B,CAAC,CAAA;gBACvC,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,MAAM,YAAY,GAAG,yBAAyB,CAAC,cAAc,CAAC,CAAA;YAC9D,OAAO,CAAC,GAAG,CACT,YAAY,CACV;gBACE,KAAK,EAAE,YAAY;gBACnB,eAAe,EAAE,UAAU,CAAC,MAAM;gBAClC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,oCAAoC;aACvE,EACD,OAAO,CAAC,MAAM,CACf,CACF,CAAA;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,iBAAiB,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5D,MAAM,WAAW,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAA;QACxE,CAAC;QAED,MAAM,MAAM,GAAG;YACb,UAAU,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,YAAY,IAAI,EAAE,CAAC,cAAc,EAAE,CAAC;YAClF,OAAO,EAAE,MAAM,CAAC,iBAAiB,IAAI,eAAe,CAAC,CAAC,CAAC,CAAC,YAAY;SACrE,CAAA;QAED,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAA;IACnD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,WAAW,CAAC,KAAc,CAAC,CAAA;IAC7B,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,SAA6B,EAAE,OAA6B;IACtF,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,IAAI,iBAAiB,EAAE,CAAA;QAC3C,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,CAAA;QAEvC,IAAI,eAAe,GAAG,SAAS,CAAA;QAE/B,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC;gBAC9B,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,mDAAmD,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAA;gBACzG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACjB,CAAC;YACD,eAAe,GAAG,MAAM,CAAC,iBAAiB,CAAA;QAC5C,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YACxC,OAAO,CAAC,GAAG,CACT,YAAY,CACV;gBACE,KAAK,EAAE,wBAAwB,eAAe,EAAE;gBAChD,IAAI,EAAE,mDAAmD;aAC1D,EACD,OAAO,CAAC,MAAM,CACf,CACF,CAAA;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QAED,MAAM,WAAW,CAAC,eAAe,CAAC,eAAe,CAAC,CAAA;QAElD,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAA;IACxF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,WAAW,CAAC,KAAc,CAAC,CAAA;IAC7B,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,OAA6B;IACvD,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,IAAI,iBAAiB,EAAE,CAAA;QAC3C,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,YAAY,EAAE,CAAA;QAE3C,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,qDAAqD,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAA;YAC3G,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QAED,IAAI,QAAQ,GAA8E,IAAI,CAAA;QAC9F,IAAI,KAAK,GAAG,KAAK,CAAA;QAEjB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,WAAW,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAA;YACpF,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAA;YAClC,KAAK,GAAG,IAAI,CAAA;QACd,CAAC;QAAC,MAAM,CAAC;YACP,QAAQ,GAAG,MAAM,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,CAAA;YACrD,KAAK,GAAG,QAAQ,KAAK,IAAI,CAAA;QAC3B,CAAC;QAED,MAAM,MAAM,GAAG;YACb,YAAY,EAAE,EAAE,CAAC,YAAY;YAC7B,cAAc,EAAE,EAAE,CAAC,cAAc;YACjC,IAAI,EAAE,QAAQ,EAAE,IAAI;YACpB,IAAI,EAAE,QAAQ,EAAE,IAAI;YACpB,KAAK;SACN,CAAA;QAED,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAA;IACnD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,WAAW,CAAC,KAAc,CAAC,CAAA;IAC7B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,cAAwB;IAChE,IAAI,cAAc,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC9C,OAAO,4JAA4J,CAAA;IACrK,CAAC;IACD,IAAI,cAAc,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QAC5C,OAAO,8IAA8I,CAAA;IACvJ,CAAC;IACD,OAAO,uHAAuH,CAAA;AAChI,CAAC;AAED,MAAM,UAAU,2BAA2B;IACzC,OAAO,8GAA8G,CAAA;AACvH,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,yBAAyB,CAAC;KACtC,UAAU,CACT,IAAI,OAAO,CAAC,SAAS,CAAC;KACnB,WAAW,CAAC,uEAAuE,CAAC;KACpF,MAAM,CAAC,UAAU,EAAE,0BAA0B,CAAC;KAC9C,MAAM,CAAC,SAAS,EAAE,uCAAuC,CAAC;KAC1D,MAAM,CACL,0BAA0B,EAC1B,iGAAiG,EACjG,2BAA2B,EAC3B,EAAE,CACH;KACA,MAAM,CAAC,yBAAyB,EAAE,mDAAmD,CAAC;KACtF,MAAM,CAAC,CAAC,OAAmE,EAAE,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAC3G;KACA,UAAU,CACT,IAAI,OAAO,CAAC,QAAQ,CAAC;KAClB,WAAW,CAAC,uBAAuB,CAAC;KACpC,QAAQ,CAAC,aAAa,EAAE,cAAc,CAAC;KACvC,MAAM,CAAC,UAAU,EAAE,0BAA0B,CAAC;KAC9C,MAAM,CAAC,YAAY,CAAC,CACxB;KACA,UAAU,CACT,IAAI,OAAO,CAAC,QAAQ,CAAC;KAClB,WAAW,CAAC,4BAA4B,CAAC;KACzC,MAAM,CAAC,UAAU,EAAE,0BAA0B,CAAC;KAC9C,MAAM,CAAC,YAAY,CAAC,CACxB,CAAA"}
@@ -1,10 +1,16 @@
1
1
  import { CredentialManager } from './credential-manager.js';
2
2
  import { type ExtractedWorkspace } from './token-extractor.js';
3
3
  export declare function ensureSlackAuth(): Promise<void>;
4
- export declare function tryWebTokenRefresh(ws: ExtractedWorkspace, workspaceDomains: Record<string, string>): Promise<{
4
+ export type RefreshResult = {
5
5
  token: string;
6
+ workspace_id: string;
6
7
  workspace_name: string;
7
- } | null>;
8
+ };
9
+ export type RefreshContext = {
10
+ resolvedTeamIds?: Set<string>;
11
+ refreshCache?: Map<string, RefreshResult | null>;
12
+ };
13
+ export declare function tryWebTokenRefresh(ws: ExtractedWorkspace, workspaceDomains: Record<string, string>, context?: RefreshContext): Promise<RefreshResult | null>;
8
14
  export declare function refreshTokenFromWeb(domain: string, cookie: string): Promise<string | null>;
9
15
  export declare function refreshCookie(token: string, credManager: CredentialManager): Promise<{
10
16
  user_id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"ensure-auth.d.ts","sourceRoot":"","sources":["../../../../src/platforms/slack/ensure-auth.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,EAAE,KAAK,kBAAkB,EAAkB,MAAM,mBAAmB,CAAA;AAE3E,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAkDrD;AAED,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,kBAAkB,EACtB,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACvC,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAe3D;AAID,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAchG;AAED,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,iBAAiB,GAC7B,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAiBpF"}
1
+ {"version":3,"file":"ensure-auth.d.ts","sourceRoot":"","sources":["../../../../src/platforms/slack/ensure-auth.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,EAAE,KAAK,kBAAkB,EAAkB,MAAM,mBAAmB,CAAA;AAE3E,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CA2DrD;AAUD,MAAM,MAAM,aAAa,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAAA;AAE3F,MAAM,MAAM,cAAc,GAAG;IAC3B,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC7B,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC,CAAA;CACjD,CAAA;AAED,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,kBAAkB,EACtB,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACxC,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CA4B/B;AAmCD,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAchG;AAED,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,iBAAiB,GAC7B,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAiBpF"}
@@ -20,20 +20,29 @@ export async function ensureSlackAuth() {
20
20
  const workspaces = await extractor.extract();
21
21
  const workspaceDomains = extractor.getWorkspaceDomains();
22
22
  const validWorkspaces = [];
23
+ const resolvedTeamIds = new Set();
24
+ const refreshCache = new Map();
23
25
  for (const ws of workspaces) {
24
26
  try {
25
27
  const client = await new SlackClient().login({ token: ws.token, cookie: ws.cookie });
26
28
  const authInfo = await client.testAuth();
29
+ if (!authInfo.team_id)
30
+ throw new Error('testAuth returned empty team_id');
27
31
  ws.workspace_id = authInfo.team_id;
28
32
  ws.workspace_name = authInfo.team || ws.workspace_name;
29
- await credManager.setWorkspace(ws);
30
- validWorkspaces.push(ws);
33
+ if (!resolvedTeamIds.has(ws.workspace_id)) {
34
+ resolvedTeamIds.add(ws.workspace_id);
35
+ await credManager.setWorkspace(ws);
36
+ validWorkspaces.push(ws);
37
+ }
31
38
  }
32
39
  catch {
33
- const refreshed = await tryWebTokenRefresh(ws, workspaceDomains);
34
- if (refreshed) {
40
+ const refreshed = await tryWebTokenRefresh(ws, workspaceDomains, { resolvedTeamIds, refreshCache });
41
+ if (refreshed && !resolvedTeamIds.has(refreshed.workspace_id)) {
35
42
  ws.token = refreshed.token;
43
+ ws.workspace_id = refreshed.workspace_id;
36
44
  ws.workspace_name = refreshed.workspace_name;
45
+ resolvedTeamIds.add(ws.workspace_id);
37
46
  await credManager.setWorkspace(ws);
38
47
  validWorkspaces.push(ws);
39
48
  }
@@ -52,19 +61,67 @@ export async function ensureSlackAuth() {
52
61
  }
53
62
  }
54
63
  }
55
- export async function tryWebTokenRefresh(ws, workspaceDomains) {
64
+ // Bound worst-case HTTP traffic for users with very large root-state.json workspace lists.
65
+ const MAX_DOMAIN_ATTEMPTS = 16;
66
+ // Slack workspace subdomains match `^[a-z][a-z0-9-]*$` per signup rules; validating here
67
+ // prevents a tampered root-state.json from steering the cookie-bearing fetch to a non-Slack
68
+ // host (e.g. a domain value containing `.`, `/`, `:`, `@`, `#`, or `?`).
69
+ const SLACK_DOMAIN_REGEX = /^[a-zA-Z0-9][a-zA-Z0-9-]*$/;
70
+ export async function tryWebTokenRefresh(ws, workspaceDomains, context = {}) {
56
71
  if (!ws.cookie)
57
72
  return null;
58
- const domain = workspaceDomains[ws.workspace_id];
59
- if (!domain)
73
+ // Try the domain that maps to this workspace_id first (when known), then fall back to
74
+ // every other known domain. Slack tokens extracted from LevelDB blobs sometimes carry
75
+ // workspace_id="unknown" because the regex window around the xoxc- bytes does not
76
+ // contain the T... team id; in that case the cookie may still be valid for one of the
77
+ // other workspaces the user is signed into.
78
+ const candidates = orderCandidateDomains(ws.workspace_id, workspaceDomains);
79
+ if (candidates.length === 0)
60
80
  return null;
81
+ for (const { domain } of candidates) {
82
+ if (!SLACK_DOMAIN_REGEX.test(domain))
83
+ continue;
84
+ const cacheKey = `${ws.cookie}\u0000${domain}`;
85
+ const cached = context.refreshCache?.get(cacheKey);
86
+ let result;
87
+ if (cached !== undefined) {
88
+ result = cached;
89
+ }
90
+ else {
91
+ result = await refreshAndVerify(ws.cookie, domain, ws.workspace_name);
92
+ context.refreshCache?.set(cacheKey, result);
93
+ }
94
+ if (!result)
95
+ continue;
96
+ if (context.resolvedTeamIds?.has(result.workspace_id))
97
+ continue;
98
+ return result;
99
+ }
100
+ return null;
101
+ }
102
+ function orderCandidateDomains(workspaceId, workspaceDomains) {
103
+ const entries = Object.entries(workspaceDomains).map(([workspace_id, domain]) => ({ workspace_id, domain }));
104
+ const exact = entries.findIndex((e) => e.workspace_id === workspaceId);
105
+ if (exact > 0) {
106
+ const [match] = entries.splice(exact, 1);
107
+ entries.unshift(match);
108
+ }
109
+ return entries.slice(0, MAX_DOMAIN_ATTEMPTS);
110
+ }
111
+ async function refreshAndVerify(cookie, domain, fallbackName) {
61
112
  try {
62
- const freshToken = await refreshTokenFromWeb(domain, ws.cookie);
113
+ const freshToken = await refreshTokenFromWeb(domain, cookie);
63
114
  if (!freshToken)
64
115
  return null;
65
- const client = await new SlackClient().login({ token: freshToken, cookie: ws.cookie });
116
+ const client = await new SlackClient().login({ token: freshToken, cookie });
66
117
  const authInfo = await client.testAuth();
67
- return { token: freshToken, workspace_name: authInfo.team || ws.workspace_name };
118
+ if (!authInfo.team_id)
119
+ return null;
120
+ return {
121
+ token: freshToken,
122
+ workspace_id: authInfo.team_id,
123
+ workspace_name: authInfo.team || fallbackName,
124
+ };
68
125
  }
69
126
  catch {
70
127
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"ensure-auth.js","sourceRoot":"","sources":["../../../../src/platforms/slack/ensure-auth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ensure-auth.js","sourceRoot":"","sources":["../../../../src/platforms/slack/ensure-auth.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-messenger",
3
- "version": "2.15.0",
3
+ "version": "2.15.1",
4
4
  "description": "Multi-platform messaging CLI for AI agents (Slack, Discord, Teams, Webex, Telegram, Telegram Bot, WhatsApp, LINE, Instagram, KakaoTalk, Channel Talk)",
5
5
  "repository": {
6
6
  "type": "git",
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: agent-channeltalk
3
3
  description: Interact with Channel Talk using extracted desktop app or browser credentials - read chats, send messages, search messages, manage groups
4
- version: 2.15.0
4
+ version: 2.15.1
5
5
  allowed-tools: Bash(agent-channeltalk:*)
6
6
  metadata:
7
7
  openclaw:
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: agent-channeltalkbot
3
3
  description: Interact with Channel Talk workspaces using API credentials - send messages, read chats, manage groups and bots
4
- version: 2.15.0
4
+ version: 2.15.1
5
5
  allowed-tools: Bash(agent-channeltalkbot:*)
6
6
  metadata:
7
7
  openclaw:
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: agent-discord
3
3
  description: Interact with Discord servers - send messages, read channels, manage reactions
4
- version: 2.15.0
4
+ version: 2.15.1
5
5
  allowed-tools: Bash(agent-discord:*)
6
6
  metadata:
7
7
  openclaw:
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: agent-discordbot
3
3
  description: Interact with Discord servers using bot tokens - send messages, read channels, manage reactions
4
- version: 2.15.0
4
+ version: 2.15.1
5
5
  allowed-tools: Bash(agent-discordbot:*)
6
6
  metadata:
7
7
  openclaw:
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: agent-instagram
3
3
  description: Interact with Instagram DMs - send messages, read conversations, manage accounts
4
- version: 2.15.0
4
+ version: 2.15.1
5
5
  allowed-tools: Bash(agent-instagram:*)
6
6
  metadata:
7
7
  openclaw:
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: agent-kakaotalk
3
3
  description: Interact with KakaoTalk - send messages, read chats, manage conversations
4
- version: 2.15.0
4
+ version: 2.15.1
5
5
  allowed-tools: Bash(agent-kakaotalk:*)
6
6
  metadata:
7
7
  openclaw:
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: agent-line
3
3
  description: Interact with LINE - send messages, read chats, manage conversations
4
- version: 2.15.0
4
+ version: 2.15.1
5
5
  allowed-tools: Bash(agent-line:*)
6
6
  metadata:
7
7
  openclaw:
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: agent-slack
3
3
  description: Interact with Slack workspaces - send messages, read channels, manage reactions
4
- version: 2.15.0
4
+ version: 2.15.1
5
5
  allowed-tools: Bash(agent-slack:*)
6
6
  metadata:
7
7
  openclaw:
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: agent-slackbot
3
3
  description: Interact with Slack workspaces using bot tokens - send messages, read channels, manage reactions
4
- version: 2.15.0
4
+ version: 2.15.1
5
5
  allowed-tools: Bash(agent-slackbot:*)
6
6
  metadata:
7
7
  openclaw:
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: agent-teams
3
3
  description: Interact with Microsoft Teams - send messages, read channels, manage reactions
4
- version: 2.15.0
4
+ version: 2.15.1
5
5
  allowed-tools: Bash(agent-teams:*)
6
6
  metadata:
7
7
  openclaw:
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: agent-telegram
3
3
  description: Interact with Telegram through TDLib - authenticate, inspect chats, and send messages
4
- version: 2.15.0
4
+ version: 2.15.1
5
5
  allowed-tools: Bash(agent-telegram:*)
6
6
  ---
7
7
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: agent-telegrambot
3
3
  description: Interact with Telegram using bot tokens - send messages, read chats, manage reactions
4
- version: 2.15.0
4
+ version: 2.15.1
5
5
  allowed-tools: Bash(agent-telegrambot:*)
6
6
  metadata:
7
7
  openclaw:
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: agent-webex
3
3
  description: Interact with Cisco Webex - send messages, read spaces, manage memberships
4
- version: 2.15.0
4
+ version: 2.15.1
5
5
  allowed-tools: Bash(agent-webex:*)
6
6
  metadata:
7
7
  openclaw:
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: agent-wechatbot
3
3
  description: Interact with WeChat Official Account using API credentials - send messages, manage templates, list followers
4
- version: 2.15.0
4
+ version: 2.15.1
5
5
  allowed-tools: Bash(agent-wechatbot:*)
6
6
  metadata:
7
7
  openclaw:
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: agent-whatsapp
3
3
  description: Interact with WhatsApp - send messages, read chats, manage conversations
4
- version: 2.15.0
4
+ version: 2.15.1
5
5
  allowed-tools: Bash(agent-whatsapp:*)
6
6
  metadata:
7
7
  openclaw:
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: agent-whatsappbot
3
3
  description: Interact with WhatsApp using Cloud API credentials - send messages, manage templates
4
- version: 2.15.0
4
+ version: 2.15.1
5
5
  allowed-tools: Bash(agent-whatsappbot:*)
6
6
  metadata:
7
7
  openclaw:
@@ -106,19 +106,21 @@ async function extractAction(options: {
106
106
 
107
107
  if (options.debug) {
108
108
  const domain = workspaceDomains[ws.workspace_id]
109
- debug(
110
- `[debug] Attempting web token refresh for ${ws.workspace_id}${domain ? ` (${domain}.slack.com)` : ''}...`,
111
- )
109
+ const target = domain
110
+ ? `${ws.workspace_id} (${domain}.slack.com)`
111
+ : `${ws.workspace_id} (trying all known domains)`
112
+ debug(`[debug] Attempting web token refresh for ${target}...`)
112
113
  }
113
114
  const refreshed = await tryWebTokenRefresh(ws, workspaceDomains)
114
115
  if (refreshed) {
115
116
  ws.token = refreshed.token
117
+ ws.workspace_id = refreshed.workspace_id
116
118
  ws.workspace_name = refreshed.workspace_name
117
119
  validWorkspaces.push(ws)
118
120
  await credManager.setWorkspace(ws)
119
121
 
120
122
  if (options.debug) {
121
- debug(`[debug] ✓ Web refresh succeeded: ${refreshed.workspace_name}`)
123
+ debug(`[debug] ✓ Web refresh succeeded: ${refreshed.workspace_id}/${refreshed.workspace_name}`)
122
124
  }
123
125
  } else if (options.debug) {
124
126
  debug('[debug] ✗ Web refresh failed')
@@ -10,10 +10,12 @@ let extractSpy: ReturnType<typeof spyOn>
10
10
  let extractCookieSpy: ReturnType<typeof spyOn>
11
11
  let getWorkspaceDomainsSpy: ReturnType<typeof spyOn>
12
12
  let testAuthSpy: ReturnType<typeof spyOn>
13
+ let loginSpy: ReturnType<typeof spyOn>
13
14
  let setWorkspaceSpy: ReturnType<typeof spyOn>
14
15
  let loadSpy: ReturnType<typeof spyOn>
15
16
  let setCurrentWorkspaceSpy: ReturnType<typeof spyOn>
16
17
  let fetchSpy: ReturnType<typeof spyOn>
18
+ let activeToken: string | null = null
17
19
 
18
20
  beforeEach(() => {
19
21
  getWorkspaceSpy = spyOn(CredentialManager.prototype, 'getWorkspace').mockResolvedValue(null)
@@ -31,6 +33,15 @@ beforeEach(() => {
31
33
 
32
34
  getWorkspaceDomainsSpy = spyOn(TokenExtractor.prototype, 'getWorkspaceDomains').mockReturnValue({})
33
35
 
36
+ activeToken = null
37
+ loginSpy = spyOn(SlackClient.prototype, 'login').mockImplementation(function (
38
+ this: SlackClient,
39
+ credentials?: { token: string; cookie: string },
40
+ ) {
41
+ activeToken = credentials?.token ?? null
42
+ return Promise.resolve(this)
43
+ })
44
+
34
45
  testAuthSpy = spyOn(SlackClient.prototype, 'testAuth').mockResolvedValue({
35
46
  user_id: 'U123',
36
47
  team_id: 'T123',
@@ -55,6 +66,7 @@ afterEach(() => {
55
66
  extractSpy?.mockRestore()
56
67
  extractCookieSpy?.mockRestore()
57
68
  getWorkspaceDomainsSpy?.mockRestore()
69
+ loginSpy?.mockRestore()
58
70
  testAuthSpy?.mockRestore()
59
71
  setWorkspaceSpy?.mockRestore()
60
72
  loadSpy?.mockRestore()
@@ -62,6 +74,16 @@ afterEach(() => {
62
74
  fetchSpy?.mockRestore()
63
75
  })
64
76
 
77
+ function authResponseByToken(map: Record<string, { team_id: string; team?: string } | Error>) {
78
+ testAuthSpy.mockImplementation(() => {
79
+ const token = activeToken ?? '<no-token>'
80
+ const result = map[token]
81
+ if (!result) throw new Error('invalid_auth')
82
+ if (result instanceof Error) throw result
83
+ return Promise.resolve({ user_id: 'U1', user: 'user', team: result.team, team_id: result.team_id })
84
+ })
85
+ }
86
+
65
87
  describe('ensureSlackAuth', () => {
66
88
  it('skips extraction when stored credentials are valid', async () => {
67
89
  // given
@@ -278,7 +300,7 @@ describe('ensureSlackAuth', () => {
278
300
  )
279
301
  })
280
302
 
281
- it('skips web refresh when no domain is known for workspace', async () => {
303
+ it('skips web refresh when domain map is empty', async () => {
282
304
  // given — domain mapping is empty
283
305
  extractSpy.mockResolvedValue([
284
306
  { workspace_id: 'T-stale', workspace_name: 'stale-ws', token: 'xoxc-stale', cookie: 'xoxd-valid' },
@@ -294,6 +316,206 @@ describe('ensureSlackAuth', () => {
294
316
  expect(setWorkspaceSpy).not.toHaveBeenCalled()
295
317
  })
296
318
 
319
+ it('falls back to other known domains when workspace_id has no domain mapping', async () => {
320
+ // given — workspace_id 'unknown' (extractor couldn't resolve team id); cookie is valid
321
+ // for the second candidate domain in root-state.json
322
+ extractSpy.mockResolvedValue([
323
+ { workspace_id: 'unknown', workspace_name: 'unknown', token: 'xoxc-stale', cookie: 'xoxd-valid' },
324
+ ])
325
+ getWorkspaceDomainsSpy.mockReturnValue({
326
+ T_OTHER_A: 'other-a',
327
+ T_OTHER_B: 'other-b',
328
+ })
329
+
330
+ fetchSpy.mockImplementation((url: string) => {
331
+ if (url.startsWith('https://other-a.slack.com/')) {
332
+ return Promise.resolve(new Response('<html>"api_token":"xoxc-fresh-a"</html>', { status: 200 }))
333
+ }
334
+ if (url.startsWith('https://other-b.slack.com/')) {
335
+ return Promise.resolve(new Response('<html>"api_token":"xoxc-fresh-b"</html>', { status: 200 }))
336
+ }
337
+ return Promise.resolve(new Response('', { status: 500 }))
338
+ })
339
+
340
+ authResponseByToken({
341
+ 'xoxc-fresh-b': { team_id: 'T_OTHER_B', team: 'Other B' },
342
+ })
343
+
344
+ // when
345
+ await ensureSlackAuth()
346
+
347
+ // then — both candidate domains were tried; the workspace saves with the resolved team_id
348
+ expect(fetchSpy).toHaveBeenCalledWith(
349
+ 'https://other-a.slack.com/ssb/redirect',
350
+ expect.objectContaining({ headers: { Cookie: 'd=xoxd-valid' } }),
351
+ )
352
+ expect(fetchSpy).toHaveBeenCalledWith(
353
+ 'https://other-b.slack.com/ssb/redirect',
354
+ expect.objectContaining({ headers: { Cookie: 'd=xoxd-valid' } }),
355
+ )
356
+ expect(setWorkspaceSpy).toHaveBeenCalledWith(
357
+ expect.objectContaining({ workspace_id: 'T_OTHER_B', token: 'xoxc-fresh-b', workspace_name: 'Other B' }),
358
+ )
359
+ })
360
+
361
+ it('stops trying domains once a refresh+verify succeeds', async () => {
362
+ // given — exact-match domain succeeds on first attempt; the fallback domain must not be fetched
363
+ extractSpy.mockResolvedValue([
364
+ { workspace_id: 'T_TARGET', workspace_name: 'target', token: 'xoxc-stale', cookie: 'xoxd-valid' },
365
+ ])
366
+ getWorkspaceDomainsSpy.mockReturnValue({
367
+ T_TARGET: 'target-domain',
368
+ T_OTHER: 'other-domain',
369
+ })
370
+
371
+ fetchSpy.mockResolvedValue(new Response('<html>"api_token":"xoxc-fresh"</html>', { status: 200 }))
372
+
373
+ authResponseByToken({
374
+ 'xoxc-fresh': { team_id: 'T_TARGET', team: 'Target' },
375
+ })
376
+
377
+ // when
378
+ await ensureSlackAuth()
379
+
380
+ // then — the exact-match domain is tried, fallback domain is not
381
+ expect(fetchSpy).toHaveBeenCalledWith(
382
+ 'https://target-domain.slack.com/ssb/redirect',
383
+ expect.objectContaining({ headers: { Cookie: 'd=xoxd-valid' } }),
384
+ )
385
+ expect(fetchSpy).not.toHaveBeenCalledWith('https://other-domain.slack.com/ssb/redirect', expect.anything())
386
+ })
387
+
388
+ it('returns failure when no known domain validates the cookie', async () => {
389
+ // given — none of the domains in the map produce a valid token+cookie pair
390
+ extractSpy.mockResolvedValue([
391
+ { workspace_id: 'unknown', workspace_name: 'unknown', token: 'xoxc-stale', cookie: 'xoxd-valid' },
392
+ ])
393
+ getWorkspaceDomainsSpy.mockReturnValue({
394
+ T_A: 'a',
395
+ T_B: 'b',
396
+ })
397
+
398
+ fetchSpy.mockResolvedValue(new Response('<html>"api_token":"xoxc-fresh"</html>', { status: 200 }))
399
+ testAuthSpy.mockRejectedValue(new Error('invalid_auth'))
400
+
401
+ // when
402
+ await ensureSlackAuth()
403
+
404
+ // then — every candidate is tried, none save
405
+ expect(fetchSpy).toHaveBeenCalledWith('https://a.slack.com/ssb/redirect', expect.anything())
406
+ expect(fetchSpy).toHaveBeenCalledWith('https://b.slack.com/ssb/redirect', expect.anything())
407
+ expect(setWorkspaceSpy).not.toHaveBeenCalled()
408
+ })
409
+
410
+ it('skips domains with non-subdomain characters', async () => {
411
+ // given — a tampered root-state.json with a domain that contains a dot/slash/colon
412
+ extractSpy.mockResolvedValue([
413
+ { workspace_id: 'unknown', workspace_name: 'unknown', token: 'xoxc-stale', cookie: 'xoxd-valid' },
414
+ ])
415
+ getWorkspaceDomainsSpy.mockReturnValue({
416
+ T_EVIL: 'attacker.com#',
417
+ T_GOOD: 'good',
418
+ })
419
+
420
+ fetchSpy.mockResolvedValue(new Response('<html>"api_token":"xoxc-fresh"</html>', { status: 200 }))
421
+ authResponseByToken({ 'xoxc-fresh': { team_id: 'T_GOOD', team: 'Good' } })
422
+
423
+ // when
424
+ await ensureSlackAuth()
425
+
426
+ // then — the bad domain is never fetched; the good domain succeeds
427
+ expect(fetchSpy).not.toHaveBeenCalledWith(expect.stringContaining('attacker.com'), expect.anything())
428
+ expect(fetchSpy).toHaveBeenCalledWith('https://good.slack.com/ssb/redirect', expect.anything())
429
+ expect(setWorkspaceSpy).toHaveBeenCalledWith(expect.objectContaining({ workspace_id: 'T_GOOD' }))
430
+ })
431
+
432
+ it('rejects refresh result when testAuth returns empty team_id', async () => {
433
+ // given — the fresh token verifies but Slack returns no team_id
434
+ extractSpy.mockResolvedValue([
435
+ { workspace_id: 'unknown', workspace_name: 'unknown', token: 'xoxc-stale', cookie: 'xoxd-valid' },
436
+ ])
437
+ getWorkspaceDomainsSpy.mockReturnValue({ T_A: 'a' })
438
+ fetchSpy.mockResolvedValue(new Response('<html>"api_token":"xoxc-fresh"</html>', { status: 200 }))
439
+ testAuthSpy.mockResolvedValue({ user_id: 'U1', team_id: '', user: 'user', team: undefined })
440
+
441
+ // when
442
+ await ensureSlackAuth()
443
+
444
+ // then — nothing is saved despite successful refresh+login
445
+ expect(setWorkspaceSpy).not.toHaveBeenCalled()
446
+ })
447
+
448
+ it('does not resolve multiple unknown workspaces to the same team', async () => {
449
+ // given — two unknown tokens share a cookie that validates against the first candidate domain.
450
+ // Naive iteration would resolve both to T_A; the resolved-team-id tracker must prevent the
451
+ // second unknown from claiming an already-saved team.
452
+ extractSpy.mockResolvedValue([
453
+ { workspace_id: 'unknown', workspace_name: 'unknown', token: 'xoxc-stale-1', cookie: 'xoxd-valid' },
454
+ { workspace_id: 'unknown', workspace_name: 'unknown', token: 'xoxc-stale-2', cookie: 'xoxd-valid' },
455
+ ])
456
+ getWorkspaceDomainsSpy.mockReturnValue({ T_A: 'a', T_B: 'b' })
457
+
458
+ fetchSpy.mockImplementation((url: string) => {
459
+ if (url.startsWith('https://a.slack.com/')) {
460
+ return Promise.resolve(new Response('<html>"api_token":"xoxc-fresh-a"</html>', { status: 200 }))
461
+ }
462
+ if (url.startsWith('https://b.slack.com/')) {
463
+ return Promise.resolve(new Response('<html>"api_token":"xoxc-fresh-b"</html>', { status: 200 }))
464
+ }
465
+ return Promise.resolve(new Response('', { status: 500 }))
466
+ })
467
+ authResponseByToken({
468
+ 'xoxc-fresh-a': { team_id: 'T_A', team: 'A' },
469
+ 'xoxc-fresh-b': { team_id: 'T_B', team: 'B' },
470
+ })
471
+
472
+ // when
473
+ await ensureSlackAuth()
474
+
475
+ // then — T_A and T_B each saved exactly once
476
+ const savedIds = setWorkspaceSpy.mock.calls.map((c) => (c[0] as { workspace_id: string }).workspace_id)
477
+ expect(savedIds.sort()).toEqual(['T_A', 'T_B'])
478
+ })
479
+
480
+ it('caches refresh attempts per (cookie, domain) within one extraction', async () => {
481
+ // given — two unknown tokens with the same cookie; both will iterate the same domains
482
+ extractSpy.mockResolvedValue([
483
+ { workspace_id: 'unknown', workspace_name: 'unknown', token: 'xoxc-stale-1', cookie: 'xoxd-valid' },
484
+ { workspace_id: 'unknown', workspace_name: 'unknown', token: 'xoxc-stale-2', cookie: 'xoxd-valid' },
485
+ ])
486
+ getWorkspaceDomainsSpy.mockReturnValue({ T_A: 'a', T_B: 'b' })
487
+
488
+ fetchSpy.mockResolvedValue(new Response('', { status: 500 }))
489
+ testAuthSpy.mockRejectedValue(new Error('invalid_auth'))
490
+
491
+ // when
492
+ await ensureSlackAuth()
493
+
494
+ // then — each domain fetched at most once across both workspaces (2 total, not 4)
495
+ const refreshCalls = fetchSpy.mock.calls.filter((c) => String(c[0]).includes('/ssb/redirect'))
496
+ expect(refreshCalls.length).toBe(2)
497
+ })
498
+
499
+ it('caps domain attempts at MAX_DOMAIN_ATTEMPTS', async () => {
500
+ // given — 20 candidate domains; only the first 16 should be attempted
501
+ extractSpy.mockResolvedValue([
502
+ { workspace_id: 'unknown', workspace_name: 'unknown', token: 'xoxc-stale', cookie: 'xoxd-valid' },
503
+ ])
504
+ const manyDomains: Record<string, string> = {}
505
+ for (let i = 0; i < 20; i++) manyDomains[`T_${i}`] = `dom${i}`
506
+ getWorkspaceDomainsSpy.mockReturnValue(manyDomains)
507
+
508
+ fetchSpy.mockResolvedValue(new Response('', { status: 500 }))
509
+ testAuthSpy.mockRejectedValue(new Error('invalid_auth'))
510
+
511
+ // when
512
+ await ensureSlackAuth()
513
+
514
+ // then — exactly 16 refresh attempts
515
+ const refreshCalls = fetchSpy.mock.calls.filter((c) => String(c[0]).includes('/ssb/redirect'))
516
+ expect(refreshCalls.length).toBe(16)
517
+ })
518
+
297
519
  it('skips web refresh when workspace has no cookie', async () => {
298
520
  // given — cookie is empty
299
521
  extractSpy.mockResolvedValue([
@@ -21,20 +21,29 @@ export async function ensureSlackAuth(): Promise<void> {
21
21
  const workspaces = await extractor.extract()
22
22
  const workspaceDomains = extractor.getWorkspaceDomains()
23
23
 
24
- const validWorkspaces = []
24
+ const validWorkspaces: ExtractedWorkspace[] = []
25
+ const resolvedTeamIds = new Set<string>()
26
+ const refreshCache = new Map<string, RefreshResult | null>()
27
+
25
28
  for (const ws of workspaces) {
26
29
  try {
27
30
  const client = await new SlackClient().login({ token: ws.token, cookie: ws.cookie })
28
31
  const authInfo = await client.testAuth()
32
+ if (!authInfo.team_id) throw new Error('testAuth returned empty team_id')
29
33
  ws.workspace_id = authInfo.team_id
30
34
  ws.workspace_name = authInfo.team || ws.workspace_name
31
- await credManager.setWorkspace(ws)
32
- validWorkspaces.push(ws)
35
+ if (!resolvedTeamIds.has(ws.workspace_id)) {
36
+ resolvedTeamIds.add(ws.workspace_id)
37
+ await credManager.setWorkspace(ws)
38
+ validWorkspaces.push(ws)
39
+ }
33
40
  } catch {
34
- const refreshed = await tryWebTokenRefresh(ws, workspaceDomains)
35
- if (refreshed) {
41
+ const refreshed = await tryWebTokenRefresh(ws, workspaceDomains, { resolvedTeamIds, refreshCache })
42
+ if (refreshed && !resolvedTeamIds.has(refreshed.workspace_id)) {
36
43
  ws.token = refreshed.token
44
+ ws.workspace_id = refreshed.workspace_id
37
45
  ws.workspace_name = refreshed.workspace_name
46
+ resolvedTeamIds.add(ws.workspace_id)
38
47
  await credManager.setWorkspace(ws)
39
48
  validWorkspaces.push(ws)
40
49
  }
@@ -54,21 +63,81 @@ export async function ensureSlackAuth(): Promise<void> {
54
63
  }
55
64
  }
56
65
 
66
+ // Bound worst-case HTTP traffic for users with very large root-state.json workspace lists.
67
+ const MAX_DOMAIN_ATTEMPTS = 16
68
+
69
+ // Slack workspace subdomains match `^[a-z][a-z0-9-]*$` per signup rules; validating here
70
+ // prevents a tampered root-state.json from steering the cookie-bearing fetch to a non-Slack
71
+ // host (e.g. a domain value containing `.`, `/`, `:`, `@`, `#`, or `?`).
72
+ const SLACK_DOMAIN_REGEX = /^[a-zA-Z0-9][a-zA-Z0-9-]*$/
73
+
74
+ export type RefreshResult = { token: string; workspace_id: string; workspace_name: string }
75
+
76
+ export type RefreshContext = {
77
+ resolvedTeamIds?: Set<string>
78
+ refreshCache?: Map<string, RefreshResult | null>
79
+ }
80
+
57
81
  export async function tryWebTokenRefresh(
58
82
  ws: ExtractedWorkspace,
59
83
  workspaceDomains: Record<string, string>,
60
- ): Promise<{ token: string; workspace_name: string } | null> {
84
+ context: RefreshContext = {},
85
+ ): Promise<RefreshResult | null> {
61
86
  if (!ws.cookie) return null
62
- const domain = workspaceDomains[ws.workspace_id]
63
- if (!domain) return null
64
87
 
88
+ // Try the domain that maps to this workspace_id first (when known), then fall back to
89
+ // every other known domain. Slack tokens extracted from LevelDB blobs sometimes carry
90
+ // workspace_id="unknown" because the regex window around the xoxc- bytes does not
91
+ // contain the T... team id; in that case the cookie may still be valid for one of the
92
+ // other workspaces the user is signed into.
93
+ const candidates = orderCandidateDomains(ws.workspace_id, workspaceDomains)
94
+ if (candidates.length === 0) return null
95
+
96
+ for (const { domain } of candidates) {
97
+ if (!SLACK_DOMAIN_REGEX.test(domain)) continue
98
+
99
+ const cacheKey = `${ws.cookie}\u0000${domain}`
100
+ const cached = context.refreshCache?.get(cacheKey)
101
+ let result: RefreshResult | null
102
+ if (cached !== undefined) {
103
+ result = cached
104
+ } else {
105
+ result = await refreshAndVerify(ws.cookie, domain, ws.workspace_name)
106
+ context.refreshCache?.set(cacheKey, result)
107
+ }
108
+ if (!result) continue
109
+ if (context.resolvedTeamIds?.has(result.workspace_id)) continue
110
+ return result
111
+ }
112
+ return null
113
+ }
114
+
115
+ function orderCandidateDomains(
116
+ workspaceId: string,
117
+ workspaceDomains: Record<string, string>,
118
+ ): Array<{ workspace_id: string; domain: string }> {
119
+ const entries = Object.entries(workspaceDomains).map(([workspace_id, domain]) => ({ workspace_id, domain }))
120
+ const exact = entries.findIndex((e) => e.workspace_id === workspaceId)
121
+ if (exact > 0) {
122
+ const [match] = entries.splice(exact, 1)
123
+ entries.unshift(match)
124
+ }
125
+ return entries.slice(0, MAX_DOMAIN_ATTEMPTS)
126
+ }
127
+
128
+ async function refreshAndVerify(cookie: string, domain: string, fallbackName: string): Promise<RefreshResult | null> {
65
129
  try {
66
- const freshToken = await refreshTokenFromWeb(domain, ws.cookie)
130
+ const freshToken = await refreshTokenFromWeb(domain, cookie)
67
131
  if (!freshToken) return null
68
132
 
69
- const client = await new SlackClient().login({ token: freshToken, cookie: ws.cookie })
133
+ const client = await new SlackClient().login({ token: freshToken, cookie })
70
134
  const authInfo = await client.testAuth()
71
- return { token: freshToken, workspace_name: authInfo.team || ws.workspace_name }
135
+ if (!authInfo.team_id) return null
136
+ return {
137
+ token: freshToken,
138
+ workspace_id: authInfo.team_id,
139
+ workspace_name: authInfo.team || fallbackName,
140
+ }
72
141
  } catch {
73
142
  return null
74
143
  }