botmux 2.61.0 → 2.63.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 (173) hide show
  1. package/README.en.md +1 -1
  2. package/README.md +1 -1
  3. package/dist/bot-registry.d.ts +15 -0
  4. package/dist/bot-registry.d.ts.map +1 -1
  5. package/dist/bot-registry.js +14 -0
  6. package/dist/bot-registry.js.map +1 -1
  7. package/dist/cli.d.ts.map +1 -1
  8. package/dist/cli.js +28 -31
  9. package/dist/cli.js.map +1 -1
  10. package/dist/config.d.ts +12 -0
  11. package/dist/config.d.ts.map +1 -1
  12. package/dist/config.js +12 -0
  13. package/dist/config.js.map +1 -1
  14. package/dist/core/command-handler.d.ts.map +1 -1
  15. package/dist/core/command-handler.js +14 -8
  16. package/dist/core/command-handler.js.map +1 -1
  17. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  18. package/dist/core/dashboard-ipc-server.js +2 -1
  19. package/dist/core/dashboard-ipc-server.js.map +1 -1
  20. package/dist/core/dashboard-rows.d.ts +13 -1
  21. package/dist/core/dashboard-rows.d.ts.map +1 -1
  22. package/dist/core/dashboard-rows.js +10 -4
  23. package/dist/core/dashboard-rows.js.map +1 -1
  24. package/dist/core/session-activity.d.ts +16 -0
  25. package/dist/core/session-activity.d.ts.map +1 -1
  26. package/dist/core/session-activity.js +35 -0
  27. package/dist/core/session-activity.js.map +1 -1
  28. package/dist/core/trigger-session.d.ts.map +1 -1
  29. package/dist/core/trigger-session.js +9 -10
  30. package/dist/core/trigger-session.js.map +1 -1
  31. package/dist/core/worker-pool.d.ts.map +1 -1
  32. package/dist/core/worker-pool.js +6 -0
  33. package/dist/core/worker-pool.js.map +1 -1
  34. package/dist/daemon.d.ts.map +1 -1
  35. package/dist/daemon.js +10 -2
  36. package/dist/daemon.js.map +1 -1
  37. package/dist/dashboard/auth.d.ts +6 -0
  38. package/dist/dashboard/auth.d.ts.map +1 -1
  39. package/dist/dashboard/auth.js +33 -12
  40. package/dist/dashboard/auth.js.map +1 -1
  41. package/dist/dashboard/bot-onboarding.d.ts.map +1 -1
  42. package/dist/dashboard/bot-onboarding.js +10 -13
  43. package/dist/dashboard/bot-onboarding.js.map +1 -1
  44. package/dist/dashboard/connector-api.d.ts.map +1 -1
  45. package/dist/dashboard/connector-api.js +22 -17
  46. package/dist/dashboard/connector-api.js.map +1 -1
  47. package/dist/dashboard/public-redact.d.ts +16 -0
  48. package/dist/dashboard/public-redact.d.ts.map +1 -0
  49. package/dist/dashboard/public-redact.js +62 -0
  50. package/dist/dashboard/public-redact.js.map +1 -0
  51. package/dist/dashboard/web/app.d.ts +1 -0
  52. package/dist/dashboard/web/app.d.ts.map +1 -1
  53. package/dist/dashboard/web/app.js +171 -25
  54. package/dist/dashboard/web/app.js.map +1 -1
  55. package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
  56. package/dist/dashboard/web/bot-defaults.js +136 -64
  57. package/dist/dashboard/web/bot-defaults.js.map +1 -1
  58. package/dist/dashboard/web/connectors.d.ts.map +1 -1
  59. package/dist/dashboard/web/connectors.js +120 -25
  60. package/dist/dashboard/web/connectors.js.map +1 -1
  61. package/dist/dashboard/web/cyber-fx.d.ts +6 -0
  62. package/dist/dashboard/web/cyber-fx.d.ts.map +1 -0
  63. package/dist/dashboard/web/cyber-fx.js +289 -0
  64. package/dist/dashboard/web/cyber-fx.js.map +1 -0
  65. package/dist/dashboard/web/groups.d.ts.map +1 -1
  66. package/dist/dashboard/web/groups.js +6 -1
  67. package/dist/dashboard/web/groups.js.map +1 -1
  68. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  69. package/dist/dashboard/web/i18n.js +146 -8
  70. package/dist/dashboard/web/i18n.js.map +1 -1
  71. package/dist/dashboard/web/overview.d.ts.map +1 -1
  72. package/dist/dashboard/web/overview.js +206 -48
  73. package/dist/dashboard/web/overview.js.map +1 -1
  74. package/dist/dashboard/web/preferences.d.ts +16 -0
  75. package/dist/dashboard/web/preferences.d.ts.map +1 -1
  76. package/dist/dashboard/web/preferences.js +72 -1
  77. package/dist/dashboard/web/preferences.js.map +1 -1
  78. package/dist/dashboard/web/roles.js +3 -3
  79. package/dist/dashboard/web/roles.js.map +1 -1
  80. package/dist/dashboard/web/sessions.d.ts.map +1 -1
  81. package/dist/dashboard/web/sessions.js +404 -64
  82. package/dist/dashboard/web/sessions.js.map +1 -1
  83. package/dist/dashboard/web/settings.d.ts +2 -0
  84. package/dist/dashboard/web/settings.d.ts.map +1 -0
  85. package/dist/dashboard/web/settings.js +135 -0
  86. package/dist/dashboard/web/settings.js.map +1 -0
  87. package/dist/dashboard/web/skin-intro.d.ts +4 -0
  88. package/dist/dashboard/web/skin-intro.d.ts.map +1 -0
  89. package/dist/dashboard/web/skin-intro.js +49 -0
  90. package/dist/dashboard/web/skin-intro.js.map +1 -0
  91. package/dist/dashboard/web/team-federation.js +4 -4
  92. package/dist/dashboard/web/team-federation.js.map +1 -1
  93. package/dist/dashboard/web/theme-menu.d.ts +3 -0
  94. package/dist/dashboard/web/theme-menu.d.ts.map +1 -0
  95. package/dist/dashboard/web/theme-menu.js +97 -0
  96. package/dist/dashboard/web/theme-menu.js.map +1 -0
  97. package/dist/dashboard/web/ui.d.ts +16 -2
  98. package/dist/dashboard/web/ui.d.ts.map +1 -1
  99. package/dist/dashboard/web/ui.js +137 -7
  100. package/dist/dashboard/web/ui.js.map +1 -1
  101. package/dist/dashboard/webhook-routes.d.ts +1 -5
  102. package/dist/dashboard/webhook-routes.d.ts.map +1 -1
  103. package/dist/dashboard/webhook-routes.js +127 -76
  104. package/dist/dashboard/webhook-routes.js.map +1 -1
  105. package/dist/dashboard-web/app.js +704 -512
  106. package/dist/dashboard-web/index.html +19 -14
  107. package/dist/dashboard-web/skins/bluearchive-hero.webp +0 -0
  108. package/dist/dashboard-web/skins/dragonball-goku.webp +0 -0
  109. package/dist/dashboard-web/skins/dragonball-wukong.webp +0 -0
  110. package/dist/dashboard-web/skins/fallout-vaultboy.webp +0 -0
  111. package/dist/dashboard-web/skins/genshin-breeze.webp +0 -0
  112. package/dist/dashboard-web/skins/ikun-hero.webp +0 -0
  113. package/dist/dashboard-web/skins/prts-priestess.webp +0 -0
  114. package/dist/dashboard-web/skins/zzz-hero.webp +0 -0
  115. package/dist/dashboard-web/skins/zzz-pattern.svg +25 -0
  116. package/dist/dashboard-web/style.css +2870 -16
  117. package/dist/dashboard.js +91 -31
  118. package/dist/dashboard.js.map +1 -1
  119. package/dist/global-config.d.ts +15 -0
  120. package/dist/global-config.d.ts.map +1 -1
  121. package/dist/global-config.js +51 -2
  122. package/dist/global-config.js.map +1 -1
  123. package/dist/im/lark/card-builder.d.ts.map +1 -1
  124. package/dist/im/lark/card-builder.js +17 -3
  125. package/dist/im/lark/card-builder.js.map +1 -1
  126. package/dist/im/lark/card-handler.d.ts.map +1 -1
  127. package/dist/im/lark/card-handler.js +5 -0
  128. package/dist/im/lark/card-handler.js.map +1 -1
  129. package/dist/im/lark/client.d.ts.map +1 -1
  130. package/dist/im/lark/client.js +7 -5
  131. package/dist/im/lark/client.js.map +1 -1
  132. package/dist/im/lark/event-dispatcher.d.ts +2 -1
  133. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  134. package/dist/im/lark/event-dispatcher.js +15 -9
  135. package/dist/im/lark/event-dispatcher.js.map +1 -1
  136. package/dist/im/lark/lark-hosts.d.ts +44 -0
  137. package/dist/im/lark/lark-hosts.d.ts.map +1 -0
  138. package/dist/im/lark/lark-hosts.js +49 -0
  139. package/dist/im/lark/lark-hosts.js.map +1 -0
  140. package/dist/services/connector-store.d.ts +2 -3
  141. package/dist/services/connector-store.d.ts.map +1 -1
  142. package/dist/services/connector-store.js.map +1 -1
  143. package/dist/services/trigger-types.d.ts +1 -0
  144. package/dist/services/trigger-types.d.ts.map +1 -1
  145. package/dist/services/trigger-types.js.map +1 -1
  146. package/dist/services/webhook-lifecycle-extractors.d.ts +4 -13
  147. package/dist/services/webhook-lifecycle-extractors.d.ts.map +1 -1
  148. package/dist/services/webhook-lifecycle-extractors.js +8 -23
  149. package/dist/services/webhook-lifecycle-extractors.js.map +1 -1
  150. package/dist/setup/verify-permissions.d.ts +2 -1
  151. package/dist/setup/verify-permissions.d.ts.map +1 -1
  152. package/dist/setup/verify-permissions.js +5 -8
  153. package/dist/setup/verify-permissions.js.map +1 -1
  154. package/dist/types.d.ts +1 -0
  155. package/dist/types.d.ts.map +1 -1
  156. package/dist/utils/lark-upload.d.ts +2 -1
  157. package/dist/utils/lark-upload.d.ts.map +1 -1
  158. package/dist/utils/lark-upload.js +11 -7
  159. package/dist/utils/lark-upload.js.map +1 -1
  160. package/dist/utils/screen-analyzer.d.ts +8 -0
  161. package/dist/utils/screen-analyzer.d.ts.map +1 -1
  162. package/dist/utils/screen-analyzer.js +32 -11
  163. package/dist/utils/screen-analyzer.js.map +1 -1
  164. package/dist/utils/user-token.d.ts +12 -4
  165. package/dist/utils/user-token.d.ts.map +1 -1
  166. package/dist/utils/user-token.js +64 -25
  167. package/dist/utils/user-token.js.map +1 -1
  168. package/dist/worker.js +4 -1
  169. package/dist/worker.js.map +1 -1
  170. package/dist/workflows/trigger-from-envelope.d.ts.map +1 -1
  171. package/dist/workflows/trigger-from-envelope.js +1 -0
  172. package/dist/workflows/trigger-from-envelope.js.map +1 -1
  173. package/package.json +2 -2
@@ -1,3 +1,4 @@
1
+ import { type Brand } from '../im/lark/lark-hosts.js';
1
2
  export interface TokenStore {
2
3
  access_token: string;
3
4
  refresh_token: string;
@@ -5,17 +6,23 @@ export interface TokenStore {
5
6
  expires_at: string;
6
7
  refresh_expires_at: string;
7
8
  scope: string;
9
+ /**
10
+ * token 所属应用 / 品牌。旧的单文件没有这两个字段(undefined)——按"属于升级前
11
+ * 唯一的那个 feishu bot"兼容处理(见 {@link loadTokenForApp})。
12
+ */
13
+ appId?: string;
14
+ brand?: Brand;
8
15
  }
9
16
  /**
10
17
  * Resolve a valid User Access Token.
11
18
  * Returns access_token string, or null if unavailable.
12
19
  */
13
- export declare function resolveUserToken(appId: string, appSecret: string): Promise<string | null>;
20
+ export declare function resolveUserToken(appId: string, appSecret: string, brand?: Brand): Promise<string | null>;
14
21
  /**
15
22
  * Generate an OAuth authorization URL. Returns the URL and stores pending state.
16
23
  * Called by /login command handler.
17
24
  */
18
- export declare function generateAuthUrl(appId: string, appSecret: string): {
25
+ export declare function generateAuthUrl(appId: string, appSecret: string, brand?: Brand): {
19
26
  authUrl: string;
20
27
  state: string;
21
28
  };
@@ -29,7 +36,8 @@ export declare function handleCallbackUrl(url: string): Promise<string | null>;
29
36
  */
30
37
  export declare function isCallbackUrl(text: string): boolean;
31
38
  /**
32
- * Get current token status for /login status display.
39
+ * Get current token status for /login status display. Per-app: reports the
40
+ * token belonging to this bot (appId/brand), not whatever was last written.
33
41
  */
34
- export declare function getTokenStatus(): string;
42
+ export declare function getTokenStatus(appId: string, brand?: Brand): string;
35
43
  //# sourceMappingURL=user-token.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"user-token.d.ts","sourceRoot":"","sources":["../../src/utils/user-token.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;CACf;AA+FD;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAuB/F;AAYD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CA6BpG;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA2D3E;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAgBvC"}
1
+ {"version":3,"file":"user-token.d.ts","sourceRoot":"","sources":["../../src/utils/user-token.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,KAAK,KAAK,EAAa,MAAM,0BAA0B,CAAC;AAmBjE,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAuHD;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,GAAE,KAAgB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAuBxH;AAWD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,GAAE,KAAgB,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CA+B7H;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA6D3E;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,KAAgB,GAAG,MAAM,CAgB7E"}
@@ -13,9 +13,19 @@ import { join, dirname } from 'node:path';
13
13
  import { homedir } from 'node:os';
14
14
  import { randomBytes } from 'node:crypto';
15
15
  import { logger } from './logger.js';
16
+ import { larkHosts } from '../im/lark/lark-hosts.js';
16
17
  // ─── Token paths ──────────────────────────────────────────────────────────────
17
- const BOTMUX_TOKEN_PATH = join(homedir(), '.botmux', 'data', 'user-token.json');
18
+ const TOKEN_DIR = join(homedir(), '.botmux', 'data');
19
+ /** 旧版单文件(升级前都是单 feishu bot)。仅作向后兼容读取,不再写入。 */
20
+ const LEGACY_TOKEN_PATH = join(TOKEN_DIR, 'user-token.json');
18
21
  const BUFFER_MS = 60_000; // 60s safety margin before expiry
22
+ /**
23
+ * Per-app token 文件:`~/.botmux/data/user-token-<appId>.json`。
24
+ * 一台机器混挂 Feishu + Lark 多 bot 时,各自的 User Token 互不覆盖、互不串用。
25
+ */
26
+ function tokenPathForApp(appId) {
27
+ return join(TOKEN_DIR, `user-token-${appId}.json`);
28
+ }
19
29
  const pendingLogins = new Map(); // keyed by state
20
30
  // ─── Token I/O ────────────────────────────────────────────────────────────────
21
31
  function loadTokenFromPath(path) {
@@ -26,7 +36,8 @@ function loadTokenFromPath(path) {
26
36
  return null;
27
37
  }
28
38
  }
29
- function saveToken(token, path = BOTMUX_TOKEN_PATH) {
39
+ function saveTokenForApp(token, appId) {
40
+ const path = tokenPathForApp(appId);
30
41
  const dir = dirname(path);
31
42
  if (!existsSync(dir))
32
43
  mkdirSync(dir, { recursive: true });
@@ -37,17 +48,39 @@ function isValid(isoDate) {
37
48
  return false;
38
49
  return Date.now() + BUFFER_MS < new Date(isoDate).getTime();
39
50
  }
40
- /** Load token from botmux's own file. */
41
- function loadToken() {
42
- const token = loadTokenFromPath(BOTMUX_TOKEN_PATH);
43
- if (token)
44
- return { token, source: 'botmux' };
51
+ /**
52
+ * 一个落盘 token 是否真的属于本次请求的 (appId, brand)。除文件名外,**再校验文件
53
+ * 内容里的 appId/brand**(Codex review hardening)——防止 per-app 文件被改名 / 手动
54
+ * 误编辑 / 旧迁移残留导致拿错域的 token
55
+ * - 未标 appId(升级前的旧单文件)→ 仅当请求 feishu 时认领(彼时只有 feishu 单 bot)
56
+ * - 标了 appId → 必须同 appId;若也标了 brand,则必须同 brand
57
+ */
58
+ function tokenMatches(t, appId, brand) {
59
+ if (t.appId === undefined)
60
+ return brand === 'feishu';
61
+ if (t.appId !== appId)
62
+ return false;
63
+ if (t.brand !== undefined && t.brand !== brand)
64
+ return false;
65
+ return true;
66
+ }
67
+ /**
68
+ * 取指定 app 的 token。优先 per-app 文件,其次回退旧的单文件;两者都过
69
+ * {@link tokenMatches} 校验(文件名 + 内容双重把关),不匹配一律视为无 token。
70
+ */
71
+ function loadTokenForApp(appId, brand) {
72
+ const perApp = loadTokenFromPath(tokenPathForApp(appId));
73
+ if (perApp && tokenMatches(perApp, appId, brand))
74
+ return { token: perApp, source: 'botmux' };
75
+ const legacy = loadTokenFromPath(LEGACY_TOKEN_PATH);
76
+ if (legacy && tokenMatches(legacy, appId, brand))
77
+ return { token: legacy, source: 'botmux(legacy)' };
45
78
  return null;
46
79
  }
47
80
  // ─── Token refresh ────────────────────────────────────────────────────────────
48
- async function refreshToken(token, appId, appSecret) {
81
+ async function refreshToken(token, appId, appSecret, brand = 'feishu') {
49
82
  try {
50
- const res = await fetch('https://open.feishu.cn/open-apis/authen/v2/oauth/token', {
83
+ const res = await fetch(`${larkHosts(brand).openApi}/open-apis/authen/v2/oauth/token`, {
51
84
  method: 'POST',
52
85
  headers: { 'Content-Type': 'application/json' },
53
86
  body: JSON.stringify({
@@ -72,10 +105,12 @@ async function refreshToken(token, appId, appSecret) {
72
105
  ? new Date(now.getTime() + data.refresh_token_expires_in * 1000).toISOString()
73
106
  : token.refresh_expires_at,
74
107
  scope: data.scope || token.scope,
108
+ appId,
109
+ brand,
75
110
  };
76
- // Always write to botmux's own file
111
+ // Write to this app's own token file (per-app, brand-stamped)
77
112
  try {
78
- saveToken(updated);
113
+ saveTokenForApp(updated, appId);
79
114
  }
80
115
  catch { /* best-effort */ }
81
116
  logger.info('[user-token] Refreshed User Access Token');
@@ -91,13 +126,13 @@ async function refreshToken(token, appId, appSecret) {
91
126
  * Resolve a valid User Access Token.
92
127
  * Returns access_token string, or null if unavailable.
93
128
  */
94
- export async function resolveUserToken(appId, appSecret) {
95
- // 1. Environment variable
129
+ export async function resolveUserToken(appId, appSecret, brand = 'feishu') {
130
+ // 1. Environment variable (explicit global override)
96
131
  const envToken = process.env.FEISHU_USER_ACCESS_TOKEN;
97
132
  if (envToken)
98
133
  return envToken;
99
- // 2. Token file (~/.botmux/data/user-token.json)
100
- const loaded = loadToken();
134
+ // 2. Per-app token file (mismatched / 别的 bot 的 token → null,调用方提示 /login)
135
+ const loaded = loadTokenForApp(appId, brand);
101
136
  if (!loaded)
102
137
  return null;
103
138
  const { token } = loaded;
@@ -106,7 +141,7 @@ export async function resolveUserToken(appId, appSecret) {
106
141
  }
107
142
  // access_token expired — try refresh
108
143
  if (isValid(token.refresh_expires_at) || (!token.refresh_expires_at && token.refresh_token)) {
109
- const refreshed = await refreshToken(token, appId, appSecret);
144
+ const refreshed = await refreshToken(token, appId, appSecret, brand);
110
145
  if (refreshed)
111
146
  return refreshed.access_token;
112
147
  }
@@ -114,7 +149,6 @@ export async function resolveUserToken(appId, appSecret) {
114
149
  return null;
115
150
  }
116
151
  // ─── Public API: OAuth login flow ─────────────────────────────────────────────
117
- const FEISHU_AUTH_URL = 'https://accounts.feishu.cn/open-apis/authen/v1/authorize';
118
152
  const DEFAULT_PORT = 9768;
119
153
  const DEFAULT_SCOPES = [
120
154
  'im:message:readonly',
@@ -125,7 +159,7 @@ const DEFAULT_SCOPES = [
125
159
  * Generate an OAuth authorization URL. Returns the URL and stores pending state.
126
160
  * Called by /login command handler.
127
161
  */
128
- export function generateAuthUrl(appId, appSecret) {
162
+ export function generateAuthUrl(appId, appSecret, brand = 'feishu') {
129
163
  const state = randomBytes(32).toString('hex');
130
164
  const redirectUri = `http://127.0.0.1:${DEFAULT_PORT}/callback`;
131
165
  const params = new URLSearchParams({
@@ -135,13 +169,15 @@ export function generateAuthUrl(appId, appSecret) {
135
169
  state,
136
170
  scope: DEFAULT_SCOPES,
137
171
  });
138
- const authUrl = `${FEISHU_AUTH_URL}?${params.toString()}`;
172
+ // authorize accounts host(feishu: accounts.feishu.cn / lark: accounts.larksuite.com)
173
+ const authUrl = `${larkHosts(brand).accounts}/open-apis/authen/v1/authorize?${params.toString()}`;
139
174
  // Store pending state for verification (expires in 5 minutes)
140
175
  pendingLogins.set(state, {
141
176
  state,
142
177
  redirectUri,
143
178
  appId,
144
179
  appSecret,
180
+ brand,
145
181
  createdAt: Date.now(),
146
182
  });
147
183
  // Clean up stale pending logins
@@ -170,7 +206,7 @@ export async function handleCallbackUrl(url) {
170
206
  pendingLogins.delete(state);
171
207
  // Exchange code for token
172
208
  try {
173
- const res = await fetch('https://open.feishu.cn/open-apis/authen/v2/oauth/token', {
209
+ const res = await fetch(`${larkHosts(pending.brand).openApi}/open-apis/authen/v2/oauth/token`, {
174
210
  method: 'POST',
175
211
  headers: { 'Content-Type': 'application/json' },
176
212
  body: JSON.stringify({
@@ -198,9 +234,11 @@ export async function handleCallbackUrl(url) {
198
234
  ? new Date(now.getTime() + data.refresh_token_expires_in * 1000).toISOString()
199
235
  : '',
200
236
  scope: data.scope,
237
+ appId: pending.appId,
238
+ brand: pending.brand,
201
239
  };
202
- saveToken(token);
203
- logger.info('[user-token] OAuth login successful, token saved');
240
+ saveTokenForApp(token, pending.appId);
241
+ logger.info(`[user-token] OAuth login successful, token saved for ${pending.appId}`);
204
242
  const expiresAt = new Date(token.expires_at).toLocaleString('zh-CN', { timeZone: 'Asia/Shanghai' });
205
243
  return `✅ 授权成功!Token 已保存。\n有效期至 ${expiresAt},过期后自动刷新。`;
206
244
  }
@@ -215,10 +253,11 @@ export function isCallbackUrl(text) {
215
253
  return /^https?:\/\/127\.0\.0\.1[:/].*[?&]code=/.test(text.trim());
216
254
  }
217
255
  /**
218
- * Get current token status for /login status display.
256
+ * Get current token status for /login status display. Per-app: reports the
257
+ * token belonging to this bot (appId/brand), not whatever was last written.
219
258
  */
220
- export function getTokenStatus() {
221
- const loaded = loadToken();
259
+ export function getTokenStatus(appId, brand = 'feishu') {
260
+ const loaded = loadTokenForApp(appId, brand);
222
261
  if (!loaded)
223
262
  return '未登录(无 User Token)';
224
263
  const { token, source } = loaded;
@@ -1 +1 @@
1
- {"version":3,"file":"user-token.js","sourceRoot":"","sources":["../../src/utils/user-token.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"user-token.js","sourceRoot":"","sources":["../../src/utils/user-token.ts"],"names":[],"mappings":"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"}
package/dist/worker.js CHANGED
@@ -2175,6 +2175,7 @@ let pendingShotTimer = null;
2175
2175
  let lastShotHash = '';
2176
2176
  let larkAppIdForUpload = '';
2177
2177
  let larkAppSecretForUpload = '';
2178
+ let larkBrandForUpload = 'feishu';
2178
2179
  function startScreenshotLoop() {
2179
2180
  stopScreenshotLoop();
2180
2181
  screenshotTimer = setInterval(() => { void captureAndUpload(); }, SCREENSHOT_INTERVAL_MS);
@@ -2288,7 +2289,7 @@ async function captureAndUpload() {
2288
2289
  }
2289
2290
  let imageKey;
2290
2291
  try {
2291
- imageKey = await uploadImageBuffer(larkAppIdForUpload, larkAppSecretForUpload, png);
2292
+ imageKey = await uploadImageBuffer(larkAppIdForUpload, larkAppSecretForUpload, png, larkBrandForUpload);
2292
2293
  }
2293
2294
  catch (err) {
2294
2295
  logError(`Screenshot upload failed: ${err?.message ?? err}`);
@@ -4181,6 +4182,8 @@ process.on('message', async (raw) => {
4181
4182
  // Capture credentials for direct image upload from worker
4182
4183
  larkAppIdForUpload = msg.larkAppId;
4183
4184
  larkAppSecretForUpload = msg.larkAppSecret;
4185
+ // brand 决定截图上传打哪个域(feishu / larksuite)。缺省 feishu。
4186
+ larkBrandForUpload = msg.brand === 'lark' ? 'lark' : 'feishu';
4184
4187
  // Resolve render dimensions BEFORE startScreenUpdates() — the
4185
4188
  // headless xterm and PNG canvas need to know the source pane size
4186
4189
  // up-front. Setting them later (after the renderer was built at