botmux 2.99.0 → 2.101.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 (147) hide show
  1. package/README.en.md +33 -7
  2. package/README.md +33 -7
  3. package/dist/adapters/backend/sandbox.d.ts +33 -4
  4. package/dist/adapters/backend/sandbox.d.ts.map +1 -1
  5. package/dist/adapters/backend/sandbox.js +90 -29
  6. package/dist/adapters/backend/sandbox.js.map +1 -1
  7. package/dist/adapters/cli/hermes.d.ts.map +1 -1
  8. package/dist/adapters/cli/hermes.js +6 -0
  9. package/dist/adapters/cli/hermes.js.map +1 -1
  10. package/dist/adapters/cli/opencode.d.ts.map +1 -1
  11. package/dist/adapters/cli/opencode.js +241 -13
  12. package/dist/adapters/cli/opencode.js.map +1 -1
  13. package/dist/adapters/cli/traex.d.ts.map +1 -1
  14. package/dist/adapters/cli/traex.js +8 -6
  15. package/dist/adapters/cli/traex.js.map +1 -1
  16. package/dist/adapters/cli/types.d.ts +10 -3
  17. package/dist/adapters/cli/types.d.ts.map +1 -1
  18. package/dist/bot-registry.d.ts +12 -0
  19. package/dist/bot-registry.d.ts.map +1 -1
  20. package/dist/bot-registry.js +10 -3
  21. package/dist/bot-registry.js.map +1 -1
  22. package/dist/cli.d.ts.map +1 -1
  23. package/dist/cli.js +659 -154
  24. package/dist/cli.js.map +1 -1
  25. package/dist/core/cost-calculator.d.ts.map +1 -1
  26. package/dist/core/cost-calculator.js +26 -36
  27. package/dist/core/cost-calculator.js.map +1 -1
  28. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  29. package/dist/core/dashboard-ipc-server.js +37 -2
  30. package/dist/core/dashboard-ipc-server.js.map +1 -1
  31. package/dist/core/session-manager.d.ts +11 -0
  32. package/dist/core/session-manager.d.ts.map +1 -1
  33. package/dist/core/session-manager.js +87 -17
  34. package/dist/core/session-manager.js.map +1 -1
  35. package/dist/core/worker-pool.d.ts.map +1 -1
  36. package/dist/core/worker-pool.js +6 -0
  37. package/dist/core/worker-pool.js.map +1 -1
  38. package/dist/daemon.d.ts +1 -1
  39. package/dist/daemon.d.ts.map +1 -1
  40. package/dist/daemon.js +24 -8
  41. package/dist/daemon.js.map +1 -1
  42. package/dist/dashboard/bot-onboarding.d.ts +6 -0
  43. package/dist/dashboard/bot-onboarding.d.ts.map +1 -1
  44. package/dist/dashboard/bot-onboarding.js +3 -1
  45. package/dist/dashboard/bot-onboarding.js.map +1 -1
  46. package/dist/dashboard/web/bot-onboarding.d.ts.map +1 -1
  47. package/dist/dashboard/web/bot-onboarding.js +24 -3
  48. package/dist/dashboard/web/bot-onboarding.js.map +1 -1
  49. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  50. package/dist/dashboard/web/i18n.js +14 -4
  51. package/dist/dashboard/web/i18n.js.map +1 -1
  52. package/dist/dashboard/web/sessions.d.ts.map +1 -1
  53. package/dist/dashboard/web/sessions.js +5 -19
  54. package/dist/dashboard/web/sessions.js.map +1 -1
  55. package/dist/dashboard-web/app.js +40 -33
  56. package/dist/dashboard-web/chunks/{bot-defaults-page-3EV7K6LJ.js → bot-defaults-page-HOGLABBC.js} +1 -1
  57. package/dist/dashboard-web/chunks/{chunk-NASYW5FD.js → chunk-ECXPBQ3J.js} +1 -1
  58. package/dist/dashboard-web/chunks/chunk-MR57RUVP.js +31 -0
  59. package/dist/dashboard-web/chunks/{connectors-XPZKEHF6.js → connectors-UGTF4Q4I.js} +1 -1
  60. package/dist/dashboard-web/chunks/{groups-page-C54PVKYP.js → groups-page-IKTCMQ4A.js} +1 -1
  61. package/dist/dashboard-web/chunks/{insights-page-BBQYR7WY.js → insights-page-7CCSHEKM.js} +1 -1
  62. package/dist/dashboard-web/chunks/{overview-page-5PJCAMID.js → overview-page-JOJW65P5.js} +1 -1
  63. package/dist/dashboard-web/chunks/{roles-page-APUDLPVM.js → roles-page-E2VN2DLV.js} +1 -1
  64. package/dist/dashboard-web/chunks/{schedules-WG2UKHSO.js → schedules-6QIHJIHX.js} +1 -1
  65. package/dist/dashboard-web/chunks/sessions-page-QN2TARF2.js +238 -0
  66. package/dist/dashboard-web/chunks/{settings-page-OSBZNCXL.js → settings-page-WWTXB577.js} +1 -1
  67. package/dist/dashboard-web/chunks/{skills-page-Y3VUAOYG.js → skills-page-2FAUPQ6H.js} +1 -1
  68. package/dist/dashboard-web/chunks/{team-federation-page-CRH3WZPH.js → team-federation-page-PTBQQSFS.js} +1 -1
  69. package/dist/dashboard-web/chunks/{workflows-UB7OPYGI.js → workflows-ZNBB5KFV.js} +1 -1
  70. package/dist/dashboard.js +86 -1
  71. package/dist/dashboard.js.map +1 -1
  72. package/dist/i18n/en.d.ts.map +1 -1
  73. package/dist/i18n/en.js +2 -0
  74. package/dist/i18n/en.js.map +1 -1
  75. package/dist/i18n/zh.d.ts.map +1 -1
  76. package/dist/i18n/zh.js +2 -0
  77. package/dist/i18n/zh.js.map +1 -1
  78. package/dist/im/lark/card-builder.d.ts +2 -2
  79. package/dist/im/lark/card-builder.js +2 -2
  80. package/dist/im/lark/event-dispatcher.d.ts +8 -3
  81. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  82. package/dist/im/lark/event-dispatcher.js +45 -9
  83. package/dist/im/lark/event-dispatcher.js.map +1 -1
  84. package/dist/platform/bind.d.ts.map +1 -1
  85. package/dist/platform/bind.js +36 -15
  86. package/dist/platform/bind.js.map +1 -1
  87. package/dist/platform/binding.d.ts +5 -0
  88. package/dist/platform/binding.d.ts.map +1 -1
  89. package/dist/platform/binding.js +11 -0
  90. package/dist/platform/binding.js.map +1 -1
  91. package/dist/platform/platform-http.d.ts +11 -0
  92. package/dist/platform/platform-http.d.ts.map +1 -0
  93. package/dist/platform/platform-http.js +41 -0
  94. package/dist/platform/platform-http.js.map +1 -0
  95. package/dist/platform/tunnel-client.d.ts +14 -0
  96. package/dist/platform/tunnel-client.d.ts.map +1 -1
  97. package/dist/platform/tunnel-client.js +40 -3
  98. package/dist/platform/tunnel-client.js.map +1 -1
  99. package/dist/services/bot-union-ids-store.d.ts +9 -0
  100. package/dist/services/bot-union-ids-store.d.ts.map +1 -0
  101. package/dist/services/bot-union-ids-store.js +59 -0
  102. package/dist/services/bot-union-ids-store.js.map +1 -0
  103. package/dist/services/coco-transcript.d.ts.map +1 -1
  104. package/dist/services/coco-transcript.js +59 -64
  105. package/dist/services/coco-transcript.js.map +1 -1
  106. package/dist/services/jsonl-cursor.d.ts +12 -0
  107. package/dist/services/jsonl-cursor.d.ts.map +1 -1
  108. package/dist/services/jsonl-cursor.js +63 -4
  109. package/dist/services/jsonl-cursor.js.map +1 -1
  110. package/dist/services/opencode-paths.d.ts +7 -0
  111. package/dist/services/opencode-paths.d.ts.map +1 -0
  112. package/dist/services/opencode-paths.js +18 -0
  113. package/dist/services/opencode-paths.js.map +1 -0
  114. package/dist/services/platform-team-store.d.ts +37 -0
  115. package/dist/services/platform-team-store.d.ts.map +1 -0
  116. package/dist/services/platform-team-store.js +120 -0
  117. package/dist/services/platform-team-store.js.map +1 -0
  118. package/dist/services/team-groups-store.d.ts +14 -1
  119. package/dist/services/team-groups-store.d.ts.map +1 -1
  120. package/dist/services/team-groups-store.js +28 -1
  121. package/dist/services/team-groups-store.js.map +1 -1
  122. package/dist/setup/bot-config-editor.d.ts +6 -0
  123. package/dist/setup/bot-config-editor.d.ts.map +1 -1
  124. package/dist/setup/bot-config-editor.js +18 -15
  125. package/dist/setup/bot-config-editor.js.map +1 -1
  126. package/dist/setup/interactive-select.d.ts +22 -0
  127. package/dist/setup/interactive-select.d.ts.map +1 -1
  128. package/dist/setup/interactive-select.js +101 -7
  129. package/dist/setup/interactive-select.js.map +1 -1
  130. package/dist/setup/open-platform-automation.d.ts +42 -0
  131. package/dist/setup/open-platform-automation.d.ts.map +1 -1
  132. package/dist/setup/open-platform-automation.js +107 -0
  133. package/dist/setup/open-platform-automation.js.map +1 -1
  134. package/dist/setup/setup-args.d.ts +77 -0
  135. package/dist/setup/setup-args.d.ts.map +1 -0
  136. package/dist/setup/setup-args.js +272 -0
  137. package/dist/setup/setup-args.js.map +1 -0
  138. package/dist/types.d.ts +6 -0
  139. package/dist/types.d.ts.map +1 -1
  140. package/dist/worker.js +12 -2
  141. package/dist/worker.js.map +1 -1
  142. package/dist/workflows/attempt-resume.d.ts.map +1 -1
  143. package/dist/workflows/attempt-resume.js +4 -1
  144. package/dist/workflows/attempt-resume.js.map +1 -1
  145. package/package.json +1 -1
  146. package/dist/dashboard-web/chunks/chunk-JXLHRRJD.js +0 -31
  147. package/dist/dashboard-web/chunks/sessions-page-F3U5NFPD.js +0 -238
@@ -4,7 +4,7 @@
4
4
  import net from 'node:net';
5
5
  import { hostname, networkInterfaces } from 'node:os';
6
6
  import { WebSocket, createWebSocketStream } from 'ws';
7
- import { setPlatformTeams, clearPlatformBinding } from './binding.js';
7
+ import { setPlatformTeams, setPlatformIpFamily, clearPlatformBinding } from './binding.js';
8
8
  const HEARTBEAT_MS = 30_000;
9
9
  const BACKOFF_MIN_MS = 1_000;
10
10
  const BACKOFF_MAX_MS = 30_000;
@@ -47,20 +47,41 @@ export function startPlatformTunnelClient(opts) {
47
47
  let backoff = BACKOFF_MIN_MS;
48
48
  // 本机平台团队(成员关系下沉到部署本地)
49
49
  let teams = opts.binding.teams ? [...opts.binding.teams] : [];
50
+ // 与平台通信的 IP 协议族:bind 时探明的偏好起步(缺省跟随系统默认)。有的机器 IPv4
51
+ // 路由是坏的、但 IPv6 通(或运行期才坏掉),控制连接连续失败时隔次换协议族试探,
52
+ // 换族连通即采纳并落盘——之后所有平台连接(含数据流)默认走它,重启也生效。
53
+ let ipFamily = opts.binding.ipFamily;
54
+ let connectFails = 0;
50
55
  const base = wsBase(opts.binding.platformUrl);
51
56
  const tokenQ = encodeURIComponent(opts.binding.machineToken);
57
+ const flipFamily = (f) => (f === 6 ? 4 : 6);
52
58
  function connect() {
53
59
  if (stopped)
54
60
  return;
55
61
  const url = `${base}/tunnel/control?token=${tokenQ}`;
62
+ // 连续 3 次连不上后,每隔一次用另一个协议族试探(默认/4 ↔ 6),兜住单协议族路由坏掉的机器。
63
+ const attemptFamily = connectFails >= 3 && connectFails % 2 === 1 ? flipFamily(ipFamily) : ipFamily;
56
64
  // 关掉 permessage-deflate:隧道是裸字节桥,承载的 HTTP 自己会 gzip,WS 层再压一遍既没收益、
57
65
  // 又会在经过中心化网关(TLB)时因压缩扩展协商被改写而触发 "Invalid WebSocket frame: RSV1 must
58
66
  // be clear",整条数据流当场挂掉 → dashboard 的 CSS/JS 半路断供、页面掉样式。不 offer 扩展,
59
67
  // 中间任何一跳都不会给这条连接开压缩。
60
- const sock = new WebSocket(url, { perMessageDeflate: false });
68
+ const sock = new WebSocket(url, { perMessageDeflate: false, family: attemptFamily });
61
69
  ws = sock;
70
+ let opened = false;
62
71
  sock.on('open', () => {
72
+ opened = true;
73
+ connectFails = 0;
63
74
  backoff = BACKOFF_MIN_MS;
75
+ if (attemptFamily !== ipFamily) {
76
+ ipFamily = attemptFamily;
77
+ try {
78
+ setPlatformIpFamily(attemptFamily);
79
+ }
80
+ catch {
81
+ /* 落盘失败不影响本进程内生效 */
82
+ }
83
+ opts.log(`隧道经 IPv${attemptFamily} 连通,已设为本机与平台通信的默认协议族`);
84
+ }
64
85
  opts.log('隧道已连接平台');
65
86
  sendRegister(sock);
66
87
  heartbeat = setInterval(() => sendHeartbeat(sock), HEARTBEAT_MS);
@@ -82,6 +103,17 @@ export function startPlatformTunnelClient(opts) {
82
103
  else if (msg.type === 'leave-team' && msg.teamId) {
83
104
  leaveTeam(msg.teamId, sock);
84
105
  }
106
+ else if (msg.type === 'team-sync' && typeof msg.rev === 'string') {
107
+ opts.log('收到 team-sync', { rev: msg.rev, teams: Array.isArray(msg.teams) ? msg.teams.length : 0 });
108
+ try {
109
+ opts.onTeamSync?.({ rev: msg.rev, teams: Array.isArray(msg.teams) ? msg.teams : [] });
110
+ }
111
+ catch (e) {
112
+ opts.log('team-sync 应用失败', { err: String(e) });
113
+ }
114
+ // 立即回一拍心跳带上新 rev,平台好知道已收敛(否则等下个 30s 周期)。
115
+ sendHeartbeat(sock);
116
+ }
85
117
  else if (msg.type === 'unbound') {
86
118
  handleUnbound(sock);
87
119
  }
@@ -92,6 +124,8 @@ export function startPlatformTunnelClient(opts) {
92
124
  opts.log('机器 token 失效,请重新 botmux bind');
93
125
  });
94
126
  sock.on('close', () => {
127
+ if (!opened)
128
+ connectFails++; // 只统计「没连上」,连上后正常掉线不算
95
129
  cleanupSock();
96
130
  scheduleReconnect();
97
131
  });
@@ -125,6 +159,7 @@ export function startPlatformTunnelClient(opts) {
125
159
  directHosts: localDirectHosts(opts.getDashboardPort()),
126
160
  memberships: teams,
127
161
  bots: opts.getBots?.() ?? [],
162
+ teamSyncRev: opts.getTeamSyncRev?.() ?? '',
128
163
  });
129
164
  }
130
165
  function sendHeartbeat(sock) {
@@ -135,6 +170,7 @@ export function startPlatformTunnelClient(opts) {
135
170
  directHosts: localDirectHosts(opts.getDashboardPort()),
136
171
  memberships: teams,
137
172
  bots: opts.getBots?.() ?? [],
173
+ teamSyncRev: opts.getTeamSyncRev?.() ?? '',
138
174
  });
139
175
  }
140
176
  function joinTeam(teamId, teamName, sock) {
@@ -238,7 +274,8 @@ export function startPlatformTunnelClient(opts) {
238
274
  }
239
275
  };
240
276
  for (let k = 0; k < DATA_DIAL_PARALLEL; k++) {
241
- const data = new WebSocket(url, { perMessageDeflate: false });
277
+ // 数据流跟随当前生效的协议族(控制连接连得上的那个),不再各自赌路由
278
+ const data = new WebSocket(url, { perMessageDeflate: false, family: ipFamily });
242
279
  inflight.add(data);
243
280
  let done = false;
244
281
  const timer = setTimeout(() => {
@@ -1 +1 @@
1
- {"version":3,"file":"tunnel-client.js","sourceRoot":"","sources":["../../src/platform/tunnel-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tunnel-client.js","sourceRoot":"","sources":["../../src/platform/tunnel-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /** This bot's own learned union_id, or undefined if not yet echoed. */
2
+ export declare function getBotUnionId(dataDir: string, larkAppId: string): string | undefined;
3
+ /**
4
+ * Persist a bot's own union_id learned from its message echo. Returns true iff
5
+ * the store changed (first learn or a corrected value), so callers can log
6
+ * exactly once. No-op on empty ids.
7
+ */
8
+ export declare function recordBotUnionId(dataDir: string, larkAppId: string, unionId: string, now?: number): boolean;
9
+ //# sourceMappingURL=bot-union-ids-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bot-union-ids-store.d.ts","sourceRoot":"","sources":["../../src/services/bot-union-ids-store.ts"],"names":[],"mappings":"AAqCA,uEAAuE;AACvE,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAIpF;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,GAAG,GAAE,MAAmB,GACvB,OAAO,CAST"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Self bot union_id store: each LOCAL bot's own tenant-stable `union_id`.
3
+ *
4
+ * Why we need it: the platform aggregates a team roster of bot union_ids and
5
+ * pushes it to member deployments (see [[platform-team-store]]), so receivers
6
+ * can trust a teammate bot in ANY chat without /grant. But a bot cannot ask
7
+ * Feishu for its own union_id — /bot/v3/info doesn't return it and the contact
8
+ * API can't resolve bot open_ids. The only reliable source is the bot's own
9
+ * message ECHO: a group message the bot sends is delivered back to its own
10
+ * daemon (im:message.group_msg) with `sender.sender_id.union_id` stamped.
11
+ *
12
+ * Written from the event dispatcher's self-message branch (once per bot —
13
+ * idempotent), read by the platform tunnel heartbeat (PlatformBotInfo.unionId).
14
+ *
15
+ * Storage: `{dataDir}/bot-union-ids.json` — { [larkAppId]: { unionId, learnedAt } }
16
+ */
17
+ import { readFileSync, existsSync } from 'node:fs';
18
+ import { join } from 'node:path';
19
+ import { atomicWriteFileSync } from '../utils/atomic-write.js';
20
+ function filePath(dataDir) {
21
+ return join(dataDir, 'bot-union-ids.json');
22
+ }
23
+ function readFile(dataDir) {
24
+ const fp = filePath(dataDir);
25
+ if (!existsSync(fp))
26
+ return {};
27
+ try {
28
+ const parsed = JSON.parse(readFileSync(fp, 'utf-8'));
29
+ if (parsed && typeof parsed === 'object' && !Array.isArray(parsed))
30
+ return parsed;
31
+ }
32
+ catch { /* corrupt — fall through */ }
33
+ return {};
34
+ }
35
+ /** This bot's own learned union_id, or undefined if not yet echoed. */
36
+ export function getBotUnionId(dataDir, larkAppId) {
37
+ const id = (larkAppId ?? '').trim();
38
+ if (!id)
39
+ return undefined;
40
+ return readFile(dataDir)[id]?.unionId;
41
+ }
42
+ /**
43
+ * Persist a bot's own union_id learned from its message echo. Returns true iff
44
+ * the store changed (first learn or a corrected value), so callers can log
45
+ * exactly once. No-op on empty ids.
46
+ */
47
+ export function recordBotUnionId(dataDir, larkAppId, unionId, now = Date.now()) {
48
+ const app = (larkAppId ?? '').trim();
49
+ const uid = (unionId ?? '').trim();
50
+ if (!app || !uid)
51
+ return false;
52
+ const data = readFile(dataDir);
53
+ if (data[app]?.unionId === uid)
54
+ return false;
55
+ data[app] = { unionId: uid, learnedAt: now };
56
+ atomicWriteFileSync(filePath(dataDir), JSON.stringify(data, null, 2) + '\n');
57
+ return true;
58
+ }
59
+ //# sourceMappingURL=bot-union-ids-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bot-union-ids-store.js","sourceRoot":"","sources":["../../src/services/bot-union-ids-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAK/D,SAAS,QAAQ,CAAC,OAAe;IAC/B,OAAO,IAAI,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,QAAQ,CAAC,OAAe;IAC/B,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC7B,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAAE,OAAO,EAAE,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;QACrD,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,OAAO,MAAmB,CAAC;IACjG,CAAC;IAAC,MAAM,CAAC,CAAC,4BAA4B,CAAC,CAAC;IACxC,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,SAAiB;IAC9D,MAAM,EAAE,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACpC,IAAI,CAAC,EAAE;QAAE,OAAO,SAAS,CAAC;IAC1B,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC;AACxC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAC9B,OAAe,EACf,SAAiB,EACjB,OAAe,EACf,MAAc,IAAI,CAAC,GAAG,EAAE;IAExB,MAAM,GAAG,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACrC,MAAM,GAAG,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IAC/B,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC/B,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,KAAK,GAAG;QAAE,OAAO,KAAK,CAAC;IAC7C,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;IAC7C,mBAAmB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC7E,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"coco-transcript.d.ts","sourceRoot":"","sources":["../../src/services/coco-transcript.ts"],"names":[],"mappings":"AA6BA,MAAM,WAAW,eAAe;IAC9B,4EAA4E;IAC5E,IAAI,EAAE,MAAM,CAAC;IACb,0EAA0E;IAC1E,WAAW,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,IAAI,EAAE,MAAM,GAAG,iBAAiB,CAAC;IACjC,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAElE;AAED;;;;;;;;;;;iCAWiC;AACjC,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,MAAM,GACV;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAmCvD;AAcD,4DAA4D;AAC5D,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,eAAe,CA6DjF"}
1
+ {"version":3,"file":"coco-transcript.d.ts","sourceRoot":"","sources":["../../src/services/coco-transcript.ts"],"names":[],"mappings":"AA+BA,MAAM,WAAW,eAAe;IAC9B,4EAA4E;IAC5E,IAAI,EAAE,MAAM,CAAC;IACb,0EAA0E;IAC1E,WAAW,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,IAAI,EAAE,MAAM,GAAG,iBAAiB,CAAC;IACjC,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAElE;AAED;;;;;;;;;;;iCAWiC;AACjC,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,MAAM,GACV;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAmCvD;AAgDD,4DAA4D;AAC5D,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,eAAe,CAuBjF"}
@@ -13,11 +13,13 @@
13
13
  * user messages whose `extra.is_original_user_input === true` so a Lark
14
14
  * turn fingerprints against the user's prompt, not injected context.
15
15
  */
16
- import { existsSync, statSync, openSync, readSync, closeSync, readdirSync, readlinkSync } from 'node:fs';
16
+ import { existsSync, statSync, readdirSync, readlinkSync } from 'node:fs';
17
17
  import { execSync } from 'node:child_process';
18
18
  import { platform } from 'node:os';
19
19
  import { join } from 'node:path';
20
20
  import { cocoCacheRoot } from './coco-paths.js';
21
+ import { scanJsonlFromOffset } from './jsonl-cursor.js';
22
+ import { logger } from '../utils/logger.js';
21
23
  const COCO_SESSIONS_ROOT = join(cocoCacheRoot(), 'sessions');
22
24
  const SESSION_UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
23
25
  const IS_LINUX = platform() === 'linux';
@@ -104,6 +106,48 @@ function matchCocoSessionPath(target) {
104
106
  function messageText(content) {
105
107
  return typeof content === 'string' ? content : '';
106
108
  }
109
+ function parseCocoBridgeEvent(path, line, lineStart) {
110
+ let obj;
111
+ try {
112
+ obj = JSON.parse(line);
113
+ }
114
+ catch {
115
+ return null;
116
+ }
117
+ const msg = obj?.message?.message;
118
+ if (!msg || typeof msg !== 'object')
119
+ return null;
120
+ const ts = typeof obj.created_at === 'string' ? Date.parse(obj.created_at) : NaN;
121
+ const timestampMs = Number.isFinite(ts) ? ts : Date.now();
122
+ if (msg.role === 'user') {
123
+ if (msg.extra?.is_original_user_input !== true)
124
+ return null;
125
+ const content = messageText(msg.content);
126
+ if (!content)
127
+ return null;
128
+ return { uuid: `${path}:${lineStart}`, timestampMs, kind: 'user', text: content };
129
+ }
130
+ if (msg.role === 'assistant') {
131
+ // CoCo emits two assistant shapes per turn:
132
+ // - finish_reason:'tool_calls' — mid-turn "thinking out loud" before
133
+ // a tool call. Sometimes carries visible text (e.g. "Let me run
134
+ // the tests..."). Treating these as final would close the
135
+ // pending Lark turn early with mid-turn narration; the actual
136
+ // `stop` message that follows would then drop on the floor
137
+ // because the queue's collecting slot is already cleared.
138
+ // - finish_reason:'stop' — the model's terminal answer. This is
139
+ // what the bridge fallback should forward.
140
+ // Only the latter becomes assistant_final; everything else is skipped.
141
+ const finishReason = msg.response_meta?.finish_reason;
142
+ if (finishReason !== 'stop')
143
+ return null;
144
+ const content = messageText(msg.content);
145
+ if (!content)
146
+ return null;
147
+ return { uuid: `${path}:${lineStart}`, timestampMs, kind: 'assistant_final', text: content };
148
+ }
149
+ return null;
150
+ }
107
151
  /** Increment-read a CoCo events.jsonl from `fromOffset`. */
108
152
  export function drainCocoEvents(path, fromOffset) {
109
153
  if (!existsSync(path))
@@ -120,69 +164,20 @@ export function drainCocoEvents(path, fromOffset) {
120
164
  start = 0;
121
165
  if (size === start)
122
166
  return { events: [], newOffset: start, pendingTail: '' };
123
- const len = size - start;
124
- const buf = Buffer.alloc(len);
125
- const fd = openSync(path, 'r');
126
- try {
127
- readSync(fd, buf, 0, len, start);
128
- }
129
- finally {
130
- closeSync(fd);
131
- }
132
- const text = buf.toString('utf8');
133
- const lastNl = text.lastIndexOf('\n');
134
- const completeText = lastNl >= 0 ? text.slice(0, lastNl + 1) : '';
135
- const pendingTail = lastNl >= 0 ? text.slice(lastNl + 1) : text;
136
- const newOffset = start + Buffer.byteLength(completeText, 'utf8');
137
167
  const events = [];
138
- let cursor = start;
139
- for (const line of completeText.split('\n')) {
140
- if (line.length === 0) {
141
- cursor += 1;
142
- continue;
143
- }
144
- const lineStart = cursor;
145
- cursor += Buffer.byteLength(line, 'utf8') + 1;
146
- let obj;
147
- try {
148
- obj = JSON.parse(line);
149
- }
150
- catch {
151
- continue;
152
- }
153
- const msg = obj?.message?.message;
154
- if (!msg || typeof msg !== 'object')
155
- continue;
156
- const ts = typeof obj.created_at === 'string' ? Date.parse(obj.created_at) : NaN;
157
- const timestampMs = Number.isFinite(ts) ? ts : Date.now();
158
- if (msg.role === 'user') {
159
- if (msg.extra?.is_original_user_input !== true)
160
- continue;
161
- const content = messageText(msg.content);
162
- if (!content)
163
- continue;
164
- events.push({ uuid: `${path}:${lineStart}`, timestampMs, kind: 'user', text: content });
165
- }
166
- else if (msg.role === 'assistant') {
167
- // CoCo emits two assistant shapes per turn:
168
- // - finish_reason:'tool_calls' — mid-turn "thinking out loud" before
169
- // a tool call. Sometimes carries visible text (e.g. "Let me run
170
- // the tests..."). Treating these as final would close the
171
- // pending Lark turn early with mid-turn narration; the actual
172
- // `stop` message that follows would then drop on the floor
173
- // because the queue's collecting slot is already cleared.
174
- // - finish_reason:'stop' — the model's terminal answer. This is
175
- // what the bridge fallback should forward.
176
- // Only the latter becomes assistant_final; everything else is skipped.
177
- const finishReason = msg.response_meta?.finish_reason;
178
- if (finishReason !== 'stop')
179
- continue;
180
- const content = messageText(msg.content);
181
- if (!content)
182
- continue;
183
- events.push({ uuid: `${path}:${lineStart}`, timestampMs, kind: 'assistant_final', text: content });
184
- }
185
- }
186
- return { events, newOffset, pendingTail };
168
+ const scanned = scanJsonlFromOffset(path, start, {
169
+ endOffset: size,
170
+ onLine: (line, lineStart) => {
171
+ const event = parseCocoBridgeEvent(path, line, lineStart);
172
+ if (event)
173
+ events.push(event);
174
+ },
175
+ onError: (error) => {
176
+ logger.warn(`[coco-transcript] failed to scan ${path}: ${error instanceof Error ? error.message : String(error)}`);
177
+ },
178
+ });
179
+ if (!scanned)
180
+ return { events: [], newOffset: start, pendingTail: '' };
181
+ return { events, newOffset: scanned.newOffset, pendingTail: scanned.pendingTail };
187
182
  }
188
183
  //# sourceMappingURL=coco-transcript.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"coco-transcript.js","sourceRoot":"","sources":["../../src/services/coco-transcript.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"coco-transcript.js","sourceRoot":"","sources":["../../src/services/coco-transcript.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,18 @@ export interface JsonlCursor {
2
2
  newOffset: number;
3
3
  pendingTail: string;
4
4
  }
5
+ export interface JsonlScanOptions {
6
+ endOffset?: number;
7
+ chunkSize?: number;
8
+ onLine?: (line: string, lineStart: number) => void;
9
+ onError?: (error: unknown) => void;
10
+ }
11
+ /**
12
+ * Scan an append-only JSONL file from `fromOffset` using bounded-memory chunked
13
+ * reads. Calls `onLine` for each COMPLETE line, and returns the durable byte
14
+ * frontier plus any trailing partial line text left after the last newline.
15
+ */
16
+ export declare function scanJsonlFromOffset(path: string, fromOffset: number, opts?: JsonlScanOptions): JsonlCursor | null;
5
17
  /**
6
18
  * Return a baseline cursor for an append-only JSONL file without parsing the
7
19
  * historical content. This is used when attaching to an existing transcript:
@@ -1 +1 @@
1
- {"version":3,"file":"jsonl-cursor.d.ts","sourceRoot":"","sources":["../../src/services/jsonl-cursor.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAID;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAmC7D"}
1
+ {"version":3,"file":"jsonl-cursor.d.ts","sourceRoot":"","sources":["../../src/services/jsonl-cursor.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACpC;AAKD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,GAAE,gBAAqB,GAAG,WAAW,GAAG,IAAI,CAgDrH;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAmC7D"}
@@ -1,5 +1,64 @@
1
1
  import { closeSync, existsSync, openSync, readSync, statSync } from 'node:fs';
2
+ import { StringDecoder } from 'node:string_decoder';
2
3
  const TAIL_PROBE_BYTES = 64 * 1024;
4
+ const JSONL_SCAN_CHUNK_BYTES = 64 * 1024;
5
+ /**
6
+ * Scan an append-only JSONL file from `fromOffset` using bounded-memory chunked
7
+ * reads. Calls `onLine` for each COMPLETE line, and returns the durable byte
8
+ * frontier plus any trailing partial line text left after the last newline.
9
+ */
10
+ export function scanJsonlFromOffset(path, fromOffset, opts = {}) {
11
+ const endOffset = opts.endOffset;
12
+ const chunkSize = Math.max(1, opts.chunkSize ?? JSONL_SCAN_CHUNK_BYTES);
13
+ let fd = null;
14
+ let nextReadOffset = Math.max(0, fromOffset);
15
+ let lineStartOffset = nextReadOffset;
16
+ let carry = '';
17
+ const decoder = new StringDecoder('utf8');
18
+ const buf = Buffer.alloc(chunkSize);
19
+ try {
20
+ fd = openSync(path, 'r');
21
+ while (true) {
22
+ const remaining = endOffset === undefined ? chunkSize : endOffset - nextReadOffset;
23
+ if (remaining <= 0)
24
+ break;
25
+ const toRead = Math.min(chunkSize, remaining);
26
+ const bytesRead = readSync(fd, buf, 0, toRead, nextReadOffset);
27
+ if (bytesRead <= 0)
28
+ break;
29
+ nextReadOffset += bytesRead;
30
+ const decoded = decoder.write(buf.subarray(0, bytesRead));
31
+ const text = carry + decoded;
32
+ let searchFrom = 0;
33
+ let currentLineStart = lineStartOffset;
34
+ // carry never contains '\n', so newlines can only appear at or after
35
+ // carry.length — starting there avoids re-scanning a growing carry on
36
+ // every chunk when a single record spans many chunks.
37
+ let nl = text.indexOf('\n', carry.length);
38
+ while (nl >= 0) {
39
+ const line = text.slice(searchFrom, nl);
40
+ opts.onLine?.(line, currentLineStart);
41
+ currentLineStart += Buffer.byteLength(line, 'utf8') + 1;
42
+ searchFrom = nl + 1;
43
+ nl = text.indexOf('\n', searchFrom);
44
+ }
45
+ carry = text.slice(searchFrom);
46
+ lineStartOffset = currentLineStart;
47
+ }
48
+ return {
49
+ newOffset: lineStartOffset,
50
+ pendingTail: carry + decoder.end(),
51
+ };
52
+ }
53
+ catch (error) {
54
+ opts.onError?.(error);
55
+ return null;
56
+ }
57
+ finally {
58
+ if (fd !== null)
59
+ closeSync(fd);
60
+ }
61
+ }
3
62
  /**
4
63
  * Return a baseline cursor for an append-only JSONL file without parsing the
5
64
  * historical content. This is used when attaching to an existing transcript:
@@ -29,16 +88,16 @@ export function baselineJsonlCursor(path) {
29
88
  finally {
30
89
  closeSync(fd);
31
90
  }
32
- const text = buf.subarray(0, read).toString('utf8');
33
- const lastNl = text.lastIndexOf('\n');
91
+ const probe = buf.subarray(0, read);
92
+ const lastNl = probe.lastIndexOf(0x0a);
34
93
  if (lastNl < 0) {
35
94
  // A single very long partial line. Treat it as historical and skip it
36
95
  // rather than allocating/parsing the whole file just to preserve a tail.
37
96
  return { newOffset: size, pendingTail: '' };
38
97
  }
39
- const pendingTail = text.slice(lastNl + 1);
98
+ const pendingTail = probe.subarray(lastNl + 1).toString('utf8');
40
99
  return {
41
- newOffset: start + Buffer.byteLength(text.slice(0, lastNl + 1), 'utf8'),
100
+ newOffset: start + lastNl + 1,
42
101
  pendingTail,
43
102
  };
44
103
  }
@@ -1 +1 @@
1
- {"version":3,"file":"jsonl-cursor.js","sourceRoot":"","sources":["../../src/services/jsonl-cursor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAO9E,MAAM,gBAAgB,GAAG,EAAE,GAAG,IAAI,CAAC;AAEnC;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;IAEhE,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;IAC3C,CAAC;IACD,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;IAEzD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,IAAI,GAAG,GAAG,CAAC;IACzB,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC/B,IAAI,CAAC;QACH,IAAI,GAAG,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IAC1C,CAAC;YAAS,CAAC;QACT,SAAS,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC;IAED,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QACf,sEAAsE;QACtE,yEAAyE;QACzE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;IAC9C,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC3C,OAAO;QACL,SAAS,EAAE,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC;QACvE,WAAW;KACZ,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"jsonl-cursor.js","sourceRoot":"","sources":["../../src/services/jsonl-cursor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /** OpenCode 的数据根目录:跟随 XDG_DATA_HOME,默认 ~/.local/share/opencode。
2
+ * 保持动态解析(不在模块加载时固化),测试/子进程改 env 后仍能命中。 */
3
+ export declare function opencodeDataRoot(): string;
4
+ /** OpenCode 1.17+ 的全局 SQLite 库(session/message/part 表,所有项目共用一个)。
5
+ * 作为 resume 目标探测、submit 验证与 cliSessionId 捕获的数据源。 */
6
+ export declare function opencodeDbPath(): string;
7
+ //# sourceMappingURL=opencode-paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-paths.d.ts","sourceRoot":"","sources":["../../src/services/opencode-paths.ts"],"names":[],"mappings":"AAOA;2CAC2C;AAC3C,wBAAgB,gBAAgB,IAAI,MAAM,CAIzC;AAED;qDACqD;AACrD,wBAAgB,cAAc,IAAI,MAAM,CAEvC"}
@@ -0,0 +1,18 @@
1
+ import { homedir } from 'node:os';
2
+ import { join } from 'node:path';
3
+ function expandHome(path) {
4
+ return path.startsWith('~') ? join(homedir(), path.slice(1)) : path;
5
+ }
6
+ /** OpenCode 的数据根目录:跟随 XDG_DATA_HOME,默认 ~/.local/share/opencode。
7
+ * 保持动态解析(不在模块加载时固化),测试/子进程改 env 后仍能命中。 */
8
+ export function opencodeDataRoot() {
9
+ const xdg = process.env.XDG_DATA_HOME?.trim();
10
+ const base = xdg ? expandHome(xdg) : join(homedir(), '.local', 'share');
11
+ return join(base, 'opencode');
12
+ }
13
+ /** OpenCode 1.17+ 的全局 SQLite 库(session/message/part 表,所有项目共用一个)。
14
+ * 作为 resume 目标探测、submit 验证与 cliSessionId 捕获的数据源。 */
15
+ export function opencodeDbPath() {
16
+ return join(opencodeDataRoot(), 'opencode.db');
17
+ }
18
+ //# sourceMappingURL=opencode-paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-paths.js","sourceRoot":"","sources":["../../src/services/opencode-paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACtE,CAAC;AAED;2CAC2C;AAC3C,MAAM,UAAU,gBAAgB;IAC9B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC;IAC9C,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACxE,OAAO,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AAChC,CAAC;AAED;qDACqD;AACrD,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,CAAC,gBAAgB,EAAE,EAAE,aAAa,CAAC,CAAC;AACjD,CAAC"}
@@ -0,0 +1,37 @@
1
+ /** teamId prefix used when mirroring platform team groups into team-groups.json. */
2
+ export declare const PLATFORM_TEAM_PREFIX = "platform:";
3
+ export interface PlatformTeamBot {
4
+ appId: string;
5
+ unionId?: string;
6
+ name?: string;
7
+ }
8
+ export interface PlatformTeamSyncTeam {
9
+ teamId: string;
10
+ teamName: string;
11
+ /** Team-assembled group chats (机器人大厅 first) — trusted like 拉群 groups. */
12
+ groupChatIds: string[];
13
+ bots: PlatformTeamBot[];
14
+ }
15
+ export interface PlatformTeamSyncPayload {
16
+ rev: string;
17
+ teams: PlatformTeamSyncTeam[];
18
+ }
19
+ /**
20
+ * Apply a platform `team-sync` push: persist the payload (full-replace — it is
21
+ * the platform's complete view of THIS machine's teams) and mirror the group
22
+ * chats into team-groups.json under the platform prefix. Teams absent from the
23
+ * payload (machine left the team / team deleted) drop out of both stores.
24
+ */
25
+ export declare function applyPlatformTeamSync(dataDir: string, payload: {
26
+ rev?: unknown;
27
+ teams?: unknown;
28
+ }, now?: number): PlatformTeamSyncPayload | null;
29
+ /** The rev of the last applied team-sync ('' when none) — reported on
30
+ * register/heartbeat so the platform knows whether to re-push. */
31
+ export declare function getPlatformTeamSyncRev(dataDir: string): string;
32
+ /** All platform teams this machine belongs to (last applied sync). */
33
+ export declare function listPlatformTeams(dataDir: string): PlatformTeamSyncTeam[];
34
+ /** Is `unionId` a bot in ANY platform team this machine belongs to? The auth
35
+ * gate's platform-mode predicate — membership-driven, no expiry. */
36
+ export declare function isPlatformTeamBot(dataDir: string, unionId: string | undefined): boolean;
37
+ //# sourceMappingURL=platform-team-store.d.ts.map