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.
- package/README.en.md +33 -7
- package/README.md +33 -7
- package/dist/adapters/backend/sandbox.d.ts +33 -4
- package/dist/adapters/backend/sandbox.d.ts.map +1 -1
- package/dist/adapters/backend/sandbox.js +90 -29
- package/dist/adapters/backend/sandbox.js.map +1 -1
- package/dist/adapters/cli/hermes.d.ts.map +1 -1
- package/dist/adapters/cli/hermes.js +6 -0
- package/dist/adapters/cli/hermes.js.map +1 -1
- package/dist/adapters/cli/opencode.d.ts.map +1 -1
- package/dist/adapters/cli/opencode.js +241 -13
- package/dist/adapters/cli/opencode.js.map +1 -1
- package/dist/adapters/cli/traex.d.ts.map +1 -1
- package/dist/adapters/cli/traex.js +8 -6
- package/dist/adapters/cli/traex.js.map +1 -1
- package/dist/adapters/cli/types.d.ts +10 -3
- package/dist/adapters/cli/types.d.ts.map +1 -1
- package/dist/bot-registry.d.ts +12 -0
- package/dist/bot-registry.d.ts.map +1 -1
- package/dist/bot-registry.js +10 -3
- package/dist/bot-registry.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +659 -154
- package/dist/cli.js.map +1 -1
- package/dist/core/cost-calculator.d.ts.map +1 -1
- package/dist/core/cost-calculator.js +26 -36
- package/dist/core/cost-calculator.js.map +1 -1
- package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
- package/dist/core/dashboard-ipc-server.js +37 -2
- package/dist/core/dashboard-ipc-server.js.map +1 -1
- package/dist/core/session-manager.d.ts +11 -0
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +87 -17
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +6 -0
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/daemon.d.ts +1 -1
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +24 -8
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard/bot-onboarding.d.ts +6 -0
- package/dist/dashboard/bot-onboarding.d.ts.map +1 -1
- package/dist/dashboard/bot-onboarding.js +3 -1
- package/dist/dashboard/bot-onboarding.js.map +1 -1
- package/dist/dashboard/web/bot-onboarding.d.ts.map +1 -1
- package/dist/dashboard/web/bot-onboarding.js +24 -3
- package/dist/dashboard/web/bot-onboarding.js.map +1 -1
- package/dist/dashboard/web/i18n.d.ts.map +1 -1
- package/dist/dashboard/web/i18n.js +14 -4
- package/dist/dashboard/web/i18n.js.map +1 -1
- package/dist/dashboard/web/sessions.d.ts.map +1 -1
- package/dist/dashboard/web/sessions.js +5 -19
- package/dist/dashboard/web/sessions.js.map +1 -1
- package/dist/dashboard-web/app.js +40 -33
- package/dist/dashboard-web/chunks/{bot-defaults-page-3EV7K6LJ.js → bot-defaults-page-HOGLABBC.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-NASYW5FD.js → chunk-ECXPBQ3J.js} +1 -1
- package/dist/dashboard-web/chunks/chunk-MR57RUVP.js +31 -0
- package/dist/dashboard-web/chunks/{connectors-XPZKEHF6.js → connectors-UGTF4Q4I.js} +1 -1
- package/dist/dashboard-web/chunks/{groups-page-C54PVKYP.js → groups-page-IKTCMQ4A.js} +1 -1
- package/dist/dashboard-web/chunks/{insights-page-BBQYR7WY.js → insights-page-7CCSHEKM.js} +1 -1
- package/dist/dashboard-web/chunks/{overview-page-5PJCAMID.js → overview-page-JOJW65P5.js} +1 -1
- package/dist/dashboard-web/chunks/{roles-page-APUDLPVM.js → roles-page-E2VN2DLV.js} +1 -1
- package/dist/dashboard-web/chunks/{schedules-WG2UKHSO.js → schedules-6QIHJIHX.js} +1 -1
- package/dist/dashboard-web/chunks/sessions-page-QN2TARF2.js +238 -0
- package/dist/dashboard-web/chunks/{settings-page-OSBZNCXL.js → settings-page-WWTXB577.js} +1 -1
- package/dist/dashboard-web/chunks/{skills-page-Y3VUAOYG.js → skills-page-2FAUPQ6H.js} +1 -1
- package/dist/dashboard-web/chunks/{team-federation-page-CRH3WZPH.js → team-federation-page-PTBQQSFS.js} +1 -1
- package/dist/dashboard-web/chunks/{workflows-UB7OPYGI.js → workflows-ZNBB5KFV.js} +1 -1
- package/dist/dashboard.js +86 -1
- package/dist/dashboard.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +2 -0
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +2 -0
- package/dist/i18n/zh.js.map +1 -1
- package/dist/im/lark/card-builder.d.ts +2 -2
- package/dist/im/lark/card-builder.js +2 -2
- package/dist/im/lark/event-dispatcher.d.ts +8 -3
- package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
- package/dist/im/lark/event-dispatcher.js +45 -9
- package/dist/im/lark/event-dispatcher.js.map +1 -1
- package/dist/platform/bind.d.ts.map +1 -1
- package/dist/platform/bind.js +36 -15
- package/dist/platform/bind.js.map +1 -1
- package/dist/platform/binding.d.ts +5 -0
- package/dist/platform/binding.d.ts.map +1 -1
- package/dist/platform/binding.js +11 -0
- package/dist/platform/binding.js.map +1 -1
- package/dist/platform/platform-http.d.ts +11 -0
- package/dist/platform/platform-http.d.ts.map +1 -0
- package/dist/platform/platform-http.js +41 -0
- package/dist/platform/platform-http.js.map +1 -0
- package/dist/platform/tunnel-client.d.ts +14 -0
- package/dist/platform/tunnel-client.d.ts.map +1 -1
- package/dist/platform/tunnel-client.js +40 -3
- package/dist/platform/tunnel-client.js.map +1 -1
- package/dist/services/bot-union-ids-store.d.ts +9 -0
- package/dist/services/bot-union-ids-store.d.ts.map +1 -0
- package/dist/services/bot-union-ids-store.js +59 -0
- package/dist/services/bot-union-ids-store.js.map +1 -0
- package/dist/services/coco-transcript.d.ts.map +1 -1
- package/dist/services/coco-transcript.js +59 -64
- package/dist/services/coco-transcript.js.map +1 -1
- package/dist/services/jsonl-cursor.d.ts +12 -0
- package/dist/services/jsonl-cursor.d.ts.map +1 -1
- package/dist/services/jsonl-cursor.js +63 -4
- package/dist/services/jsonl-cursor.js.map +1 -1
- package/dist/services/opencode-paths.d.ts +7 -0
- package/dist/services/opencode-paths.d.ts.map +1 -0
- package/dist/services/opencode-paths.js +18 -0
- package/dist/services/opencode-paths.js.map +1 -0
- package/dist/services/platform-team-store.d.ts +37 -0
- package/dist/services/platform-team-store.d.ts.map +1 -0
- package/dist/services/platform-team-store.js +120 -0
- package/dist/services/platform-team-store.js.map +1 -0
- package/dist/services/team-groups-store.d.ts +14 -1
- package/dist/services/team-groups-store.d.ts.map +1 -1
- package/dist/services/team-groups-store.js +28 -1
- package/dist/services/team-groups-store.js.map +1 -1
- package/dist/setup/bot-config-editor.d.ts +6 -0
- package/dist/setup/bot-config-editor.d.ts.map +1 -1
- package/dist/setup/bot-config-editor.js +18 -15
- package/dist/setup/bot-config-editor.js.map +1 -1
- package/dist/setup/interactive-select.d.ts +22 -0
- package/dist/setup/interactive-select.d.ts.map +1 -1
- package/dist/setup/interactive-select.js +101 -7
- package/dist/setup/interactive-select.js.map +1 -1
- package/dist/setup/open-platform-automation.d.ts +42 -0
- package/dist/setup/open-platform-automation.d.ts.map +1 -1
- package/dist/setup/open-platform-automation.js +107 -0
- package/dist/setup/open-platform-automation.js.map +1 -1
- package/dist/setup/setup-args.d.ts +77 -0
- package/dist/setup/setup-args.d.ts.map +1 -0
- package/dist/setup/setup-args.js +272 -0
- package/dist/setup/setup-args.js.map +1 -0
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/worker.js +12 -2
- package/dist/worker.js.map +1 -1
- package/dist/workflows/attempt-resume.d.ts.map +1 -1
- package/dist/workflows/attempt-resume.js +4 -1
- package/dist/workflows/attempt-resume.js.map +1 -1
- package/package.json +1 -1
- package/dist/dashboard-web/chunks/chunk-JXLHRRJD.js +0 -31
- 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
|
-
|
|
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":"
|
|
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,
|
|
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
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
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":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"coco-transcript.js","sourceRoot":"","sources":["../../src/services/coco-transcript.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,kBAAkB,GAAG,IAAI,CAAC,aAAa,EAAE,EAAE,UAAU,CAAC,CAAC;AAC7D,MAAM,eAAe,GAAG,iEAAiE,CAAC;AAC1F,MAAM,QAAQ,GAAG,QAAQ,EAAE,KAAK,OAAO,CAAC;AACxC,sEAAsE;AACtE,+DAA+D;AAC/D,sDAAsD;AACtD,MAAM,oBAAoB,GAAG,iBAAiB,CAAC;AAmB/C,MAAM,UAAU,wBAAwB,CAAC,SAAiB;IACxD,OAAO,IAAI,CAAC,kBAAkB,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;AAC7D,CAAC;AAED;;;;;;;;;;;iCAWiC;AACjC,MAAM,UAAU,oBAAoB,CAClC,GAAW;IAEX,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IACzD,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,KAAK,GAAG,SAAS,GAAG,KAAK,CAAC;QAChC,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YACtB,IAAI,OAAiB,CAAC;YACtB,IAAI,CAAC;gBAAC,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC;gBAAC,OAAO,SAAS,CAAC;YAAC,CAAC;YACjE,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;gBACzB,IAAI,MAAc,CAAC;gBACnB,IAAI,CAAC;oBAAC,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC;oBAAC,SAAS;gBAAC,CAAC;gBACnE,iDAAiD;gBACjD,uDAAuD;gBACvD,IAAI,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC;oBAAE,SAAS;gBAC5C,MAAM,GAAG,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;gBACzC,IAAI,GAAG;oBAAE,OAAO,GAAG,CAAC;YACtB,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IACD,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,QAAQ,CAAC,WAAW,GAAG,MAAM,EAAE;YACnC,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,SAAS;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,GAAG,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,GAAG;YAAE,OAAO,GAAG,CAAC;IACtB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAc;IAC1C,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACjD,IAAI,GAAG,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAC9B,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1E,IAAI,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IACzD,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,wBAAwB,CAAC,GAAG,CAAC,EAAE,CAAC;AACvE,CAAC;AAED,SAAS,WAAW,CAAC,OAAgB;IACnC,OAAO,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;AACpD,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAY,EAAE,IAAY,EAAE,SAAiB;IACzE,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;IACtD,MAAM,GAAG,GAAG,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC;IAClC,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACjD,MAAM,EAAE,GAAG,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACjF,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;IAE1D,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACxB,IAAI,GAAG,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAC5D,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACzC,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC1B,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI,SAAS,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IACpF,CAAC;IACD,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAC7B,4CAA4C;QAC5C,uEAAuE;QACvE,oEAAoE;QACpE,8DAA8D;QAC9D,kEAAkE;QAClE,+DAA+D;QAC/D,8DAA8D;QAC9D,kEAAkE;QAClE,+CAA+C;QAC/C,uEAAuE;QACvE,MAAM,YAAY,GAAG,GAAG,CAAC,aAAa,EAAE,aAAa,CAAC;QACtD,IAAI,YAAY,KAAK,MAAM;YAAE,OAAO,IAAI,CAAC;QACzC,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACzC,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC1B,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI,SAAS,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC/F,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,UAAkB;IAC9D,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;IAC5E,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;IAAC,CAAC;IAC5G,IAAI,KAAK,GAAG,UAAU,CAAC;IACvB,IAAI,IAAI,GAAG,KAAK;QAAE,KAAK,GAAG,CAAC,CAAC;IAC5B,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;IAE7E,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,MAAM,OAAO,GAAG,mBAAmB,CAAC,IAAI,EAAE,KAAK,EAAE;QAC/C,SAAS,EAAE,IAAI;QACf,MAAM,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE;YAC1B,MAAM,KAAK,GAAG,oBAAoB,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;YAC1D,IAAI,KAAK;gBAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACjB,MAAM,CAAC,IAAI,CACT,oCAAoC,IAAI,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACtG,CAAC;QACJ,CAAC;KACF,CAAC,CAAC;IACH,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;IACvE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC;AACpF,CAAC"}
|
|
@@ -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":"
|
|
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
|
|
33
|
-
const lastNl =
|
|
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 =
|
|
98
|
+
const pendingTail = probe.subarray(lastNl + 1).toString('utf8');
|
|
40
99
|
return {
|
|
41
|
-
newOffset: start +
|
|
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;
|
|
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
|