@qwen-code/channel-base 0.19.3 → 0.19.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,12 @@
1
1
  import { existsSync, readFileSync, writeFileSync, unlinkSync } from 'node:fs';
2
+ import process from 'node:process';
3
+ import { sanitizeLogText } from './sanitize.js';
2
4
  export class SessionRouter {
3
5
  toSession = new Map(); // routing key → session ID
4
6
  toTarget = new Map(); // session ID → target
5
7
  toCwd = new Map(); // session ID → cwd
8
+ creatingSessions = new Map();
9
+ sessionLoadWindows = new Set();
6
10
  bridge;
7
11
  defaultCwd;
8
12
  defaultScope;
@@ -34,28 +38,62 @@ export class SessionRouter {
34
38
  return `${channelName}:${senderId}:${chatId}`;
35
39
  }
36
40
  }
37
- /**
38
- * Sender-scoped key prefix for by-sender (no chatId) scans. The trailing
39
- * ':' delimiter ensures a sender id matches as a whole segment — without it
40
- * sender "bob" would also match another sender "bobby"
41
- * (key `${channelName}:bobby:${chatId}`).
42
- */
43
- senderPrefix(channelName, senderId) {
44
- return `${channelName}:${senderId}:`;
45
- }
46
41
  async resolve(channelName, senderId, chatId, threadId, cwd) {
47
42
  const key = this.routingKey(channelName, senderId, chatId, threadId);
48
- const existing = this.toSession.get(key);
49
- if (existing) {
50
- return existing;
51
- }
52
- const sessionCwd = cwd || this.defaultCwd;
53
- const sessionId = await this.bridge.newSession(sessionCwd);
54
- this.toSession.set(key, sessionId);
55
- this.toTarget.set(sessionId, { channelName, senderId, chatId, threadId });
56
- this.toCwd.set(sessionId, sessionCwd);
57
- this.persist();
58
- return sessionId;
43
+ let failedCreateWaits = 0;
44
+ for (;;) {
45
+ const existing = this.toSession.get(key);
46
+ if (existing) {
47
+ return existing;
48
+ }
49
+ const creating = this.creatingSessions.get(key);
50
+ if (creating) {
51
+ try {
52
+ return await creating;
53
+ }
54
+ catch (err) {
55
+ if (this.creatingSessions.get(key) === creating) {
56
+ this.creatingSessions.delete(key);
57
+ }
58
+ failedCreateWaits++;
59
+ if (failedCreateWaits > 3) {
60
+ throw err;
61
+ }
62
+ continue;
63
+ }
64
+ }
65
+ // Register the in-flight route before starting newSession(), because a
66
+ // bridge can emit sessionDied synchronously while creating the session.
67
+ const created = Promise.resolve().then(async () => {
68
+ const sessionCwd = cwd || this.defaultCwd;
69
+ const loadWindow = this.beginSessionLoad();
70
+ try {
71
+ const sessionId = await this.createLiveSession(sessionCwd, loadWindow, key);
72
+ this.toSession.set(key, sessionId);
73
+ this.toTarget.set(sessionId, {
74
+ channelName,
75
+ senderId,
76
+ chatId,
77
+ threadId,
78
+ });
79
+ this.toCwd.set(sessionId, sessionCwd);
80
+ this.persist();
81
+ return sessionId;
82
+ }
83
+ finally {
84
+ this.endSessionLoad(loadWindow);
85
+ }
86
+ });
87
+ this.creatingSessions.set(key, created);
88
+ try {
89
+ return await created;
90
+ }
91
+ finally {
92
+ if (this.creatingSessions.get(key) === created) {
93
+ this.creatingSessions.delete(key);
94
+ }
95
+ }
96
+ }
59
97
  }
60
98
  getTarget(sessionId) {
61
99
  return this.toTarget.get(sessionId);
@@ -63,35 +101,46 @@ export class SessionRouter {
63
101
  getSession(channelName, senderId, chatId, threadId) {
64
102
  return this.toSession.get(this.routingKey(channelName, senderId, chatId, threadId));
65
103
  }
66
- hasSession(channelName, senderId, chatId) {
67
- // If chatId is provided, do an exact lookup; otherwise prefix-scan for any
68
- // session belonging to this sender on this channel.
104
+ hasSession(channelName, senderId, chatId, threadId) {
105
+ const scope = this.channelScopes.get(channelName) || this.defaultScope;
106
+ // If chatId is provided, do an exact scoped lookup; otherwise scan for any
107
+ // sender-owned session on this channel. Single scope has no sender-owned
108
+ // no-chat lookup, so callers must pass chatId for an exact single-session
109
+ // check.
69
110
  if (chatId) {
70
- return this.toSession.has(this.routingKey(channelName, senderId, chatId));
111
+ return this.toSession.has(this.routingKey(channelName, senderId, chatId, threadId));
112
+ }
113
+ if (scope === 'single') {
114
+ return false;
71
115
  }
72
- const prefix = this.senderPrefix(channelName, senderId);
73
- for (const k of this.toSession.keys()) {
74
- if (k.startsWith(prefix))
116
+ for (const target of this.toTarget.values()) {
117
+ if (target.channelName === channelName && target.senderId === senderId) {
75
118
  return true;
119
+ }
76
120
  }
77
121
  return false;
78
122
  }
79
123
  /**
80
124
  * Remove session(s) for the given sender. Returns the removed session IDs.
81
125
  */
82
- removeSession(channelName, senderId, chatId) {
126
+ removeSession(channelName, senderId, chatId, threadId) {
83
127
  const removedIds = [];
128
+ const scope = this.channelScopes.get(channelName) || this.defaultScope;
84
129
  if (chatId) {
85
- const key = this.routingKey(channelName, senderId, chatId);
130
+ const key = this.routingKey(channelName, senderId, chatId, threadId);
86
131
  const sessionId = this.deleteByKey(key);
87
132
  if (sessionId)
88
133
  removedIds.push(sessionId);
89
134
  }
135
+ else if (scope === 'single') {
136
+ return removedIds;
137
+ }
90
138
  else {
91
139
  // No chatId: remove all sessions for this sender on this channel.
92
- const prefix = this.senderPrefix(channelName, senderId);
93
- for (const k of [...this.toSession.keys()]) {
94
- if (k.startsWith(prefix)) {
140
+ for (const [k, mappedSessionId] of [...this.toSession.entries()]) {
141
+ const target = this.toTarget.get(mappedSessionId);
142
+ if (target?.channelName === channelName &&
143
+ target.senderId === senderId) {
95
144
  const sessionId = this.deleteByKey(k);
96
145
  if (sessionId)
97
146
  removedIds.push(sessionId);
@@ -102,6 +151,31 @@ export class SessionRouter {
102
151
  this.persist();
103
152
  return removedIds;
104
153
  }
154
+ /** Remove a session mapping by daemon/ACP session ID. */
155
+ removeSessionId(sessionId) {
156
+ let removed = false;
157
+ for (const [key, mappedSessionId] of [...this.toSession.entries()]) {
158
+ if (mappedSessionId === sessionId) {
159
+ this.toSession.delete(key);
160
+ removed = true;
161
+ }
162
+ }
163
+ if (this.toTarget.delete(sessionId)) {
164
+ removed = true;
165
+ }
166
+ if (this.toCwd.delete(sessionId)) {
167
+ removed = true;
168
+ }
169
+ if (!removed && this.sessionLoadWindows.size > 0) {
170
+ for (const loadWindow of this.sessionLoadWindows) {
171
+ loadWindow.add(sessionId);
172
+ }
173
+ }
174
+ if (removed) {
175
+ this.persist();
176
+ }
177
+ return removed;
178
+ }
105
179
  deleteByKey(key) {
106
180
  const sessionId = this.toSession.get(key);
107
181
  if (!sessionId)
@@ -125,36 +199,78 @@ export class SessionRouter {
125
199
  /**
126
200
  * Restore session mappings from a previous bridge.
127
201
  * Called after bridge restart — attempts loadSession for each saved mapping.
128
- * Failed loads are silently dropped (new session on next message).
202
+ * Failed loads are dropped (new session on next message).
129
203
  */
130
204
  async restoreSessions() {
131
- if (!this.persistPath || !existsSync(this.persistPath)) {
205
+ const persistPath = this.persistPath;
206
+ if (!persistPath || !existsSync(persistPath)) {
132
207
  return { restored: 0, failed: 0 };
133
208
  }
134
209
  let entries;
135
210
  try {
136
- entries = JSON.parse(readFileSync(this.persistPath, 'utf-8'));
211
+ entries = JSON.parse(readFileSync(persistPath, 'utf-8'));
137
212
  }
138
- catch {
213
+ catch (err) {
214
+ const reason = err instanceof Error ? err.message : String(err);
215
+ process.stderr.write(`[SessionRouter] Corrupted persist file at ${sanitizeLogText(persistPath, 1024)}: ${sanitizeLogText(reason, 512)}\n`);
139
216
  return { restored: 0, failed: 0 };
140
217
  }
141
218
  let restored = 0;
142
219
  let failed = 0;
143
- for (const [key, entry] of Object.entries(entries)) {
144
- try {
145
- const sessionId = await this.bridge.loadSession(entry.sessionId, entry.cwd);
146
- this.toSession.set(key, sessionId);
147
- this.toTarget.set(sessionId, entry.target);
148
- this.toCwd.set(sessionId, entry.cwd);
149
- restored++;
150
- }
151
- catch {
152
- // Session can't be loaded — will create fresh on next message
153
- failed++;
220
+ let changed = false;
221
+ const reservations = new Map();
222
+ // Reserve every persisted key up front so inbound messages during restart
223
+ // wait for restore instead of returning stale IDs or creating duplicates.
224
+ for (const key of Object.keys(entries)) {
225
+ this.deleteByKey(key);
226
+ const reservation = this.createSessionReservation();
227
+ reservation.promise.catch(() => undefined);
228
+ this.creatingSessions.set(key, reservation.promise);
229
+ reservations.set(key, reservation);
230
+ }
231
+ const loadWindow = this.beginSessionLoad();
232
+ try {
233
+ for (const [key, entry] of Object.entries(entries)) {
234
+ const reservation = reservations.get(key);
235
+ if (!reservation)
236
+ continue;
237
+ try {
238
+ const sessionId = await this.bridge.loadSession(entry.sessionId, entry.cwd);
239
+ if (typeof sessionId !== 'string' || sessionId.length === 0) {
240
+ throw new Error('Invalid restored session ID');
241
+ }
242
+ if (loadWindow.delete(sessionId)) {
243
+ throw new Error('Restored session died before routing completed');
244
+ }
245
+ this.toSession.set(key, sessionId);
246
+ this.toTarget.set(sessionId, entry.target);
247
+ this.toCwd.set(sessionId, entry.cwd);
248
+ reservation.resolve(sessionId);
249
+ if (sessionId !== entry.sessionId) {
250
+ changed = true;
251
+ }
252
+ restored++;
253
+ }
254
+ catch (err) {
255
+ const reason = err instanceof Error ? err.message : String(err);
256
+ process.stderr.write(`[SessionRouter] Failed to restore session ${sanitizeLogText(entry.sessionId, 128)} for key ${sanitizeLogText(key, 256)}: ${sanitizeLogText(reason, 512)}\n`);
257
+ reservation.reject(new Error('Session restore failed', { cause: err }));
258
+ // Session can't be loaded — will create fresh on next message
259
+ failed++;
260
+ changed = true;
261
+ }
262
+ finally {
263
+ if (this.creatingSessions.get(key) === reservation.promise) {
264
+ this.creatingSessions.delete(key);
265
+ }
266
+ }
154
267
  }
155
268
  }
269
+ finally {
270
+ this.endSessionLoad(loadWindow);
271
+ }
156
272
  // Update persist file to only include successfully restored sessions
157
- if (failed > 0) {
273
+ if (changed) {
158
274
  this.persist();
159
275
  }
160
276
  return { restored, failed };
@@ -164,6 +280,8 @@ export class SessionRouter {
164
280
  this.toSession.clear();
165
281
  this.toTarget.clear();
166
282
  this.toCwd.clear();
283
+ this.creatingSessions.clear();
284
+ this.sessionLoadWindows.clear();
167
285
  if (this.persistPath && existsSync(this.persistPath)) {
168
286
  try {
169
287
  unlinkSync(this.persistPath);
@@ -194,5 +312,41 @@ export class SessionRouter {
194
312
  // best-effort — don't break message flow for persistence failure
195
313
  }
196
314
  }
315
+ async createLiveSession(cwd, loadWindow, routingKey) {
316
+ const maxAttempts = 2;
317
+ let lastDeadSessionId;
318
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
319
+ const sessionId = await this.bridge.newSession(cwd);
320
+ if (typeof sessionId !== 'string' || sessionId.length === 0) {
321
+ throw new Error('Invalid session ID from bridge');
322
+ }
323
+ if (!loadWindow.delete(sessionId)) {
324
+ return sessionId;
325
+ }
326
+ lastDeadSessionId = sessionId;
327
+ }
328
+ throw new Error(`Session ${lastDeadSessionId ?? 'unknown'} died before routing completed (${maxAttempts}/${maxAttempts} attempts, key ${routingKey})`);
329
+ }
330
+ beginSessionLoad() {
331
+ const loadWindow = new Set();
332
+ this.sessionLoadWindows.add(loadWindow);
333
+ return loadWindow;
334
+ }
335
+ createSessionReservation() {
336
+ let resolveReservation;
337
+ let rejectReservation;
338
+ const promise = new Promise((resolve, reject) => {
339
+ resolveReservation = resolve;
340
+ rejectReservation = reject;
341
+ });
342
+ return {
343
+ promise,
344
+ resolve: resolveReservation,
345
+ reject: rejectReservation,
346
+ };
347
+ }
348
+ endSessionLoad(loadWindow) {
349
+ this.sessionLoadWindows.delete(loadWindow);
350
+ }
197
351
  }
198
352
  //# sourceMappingURL=SessionRouter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SessionRouter.js","sourceRoot":"","sources":["../src/SessionRouter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SessionRouter.js","sourceRoot":"","sources":["../src/SessionRouter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ export interface GroupHistoryEntry {
2
+ senderId: string;
3
+ senderName: string;
4
+ text: string;
5
+ messageId?: string;
6
+ timestamp: number;
7
+ }
8
+ export interface GroupHistoryStoreOptions {
9
+ maxKeys?: number;
10
+ compactAfterRecords?: number;
11
+ }
12
+ export declare class GroupHistoryStore {
13
+ private readonly filePath;
14
+ private maxKeys;
15
+ private compactAfterRecords;
16
+ constructor(filePath: string, options?: GroupHistoryStoreOptions);
17
+ record(key: string, entry: GroupHistoryEntry, limit: number): void;
18
+ drain(key: string, limit: number): GroupHistoryEntry[];
19
+ clear(key: string): void;
20
+ clearAll(): void;
21
+ size(key?: string): number;
22
+ private loadState;
23
+ private readRecords;
24
+ private append;
25
+ private compact;
26
+ }
@@ -0,0 +1,242 @@
1
+ import { appendFileSync, chmodSync, existsSync, mkdirSync, readFileSync, renameSync, writeFileSync, } from 'node:fs';
2
+ import { dirname, join } from 'node:path';
3
+ const DEFAULT_MAX_KEYS = 1000;
4
+ const DEFAULT_COMPACT_AFTER_RECORDS = 1000;
5
+ export class GroupHistoryStore {
6
+ filePath;
7
+ maxKeys;
8
+ compactAfterRecords;
9
+ constructor(filePath, options = {}) {
10
+ this.filePath = filePath;
11
+ this.maxKeys = options.maxKeys ?? DEFAULT_MAX_KEYS;
12
+ this.compactAfterRecords =
13
+ options.compactAfterRecords ?? DEFAULT_COMPACT_AFTER_RECORDS;
14
+ }
15
+ record(key, entry, limit) {
16
+ const normalizedLimit = normalizeLimit(limit);
17
+ if (normalizedLimit <= 0) {
18
+ return;
19
+ }
20
+ const loaded = this.loadState();
21
+ const state = loaded.entries;
22
+ const limits = loaded.limits;
23
+ const current = state.get(key) ?? [];
24
+ current.push(entry);
25
+ if (current.length > normalizedLimit) {
26
+ current.splice(0, current.length - normalizedLimit);
27
+ }
28
+ state.delete(key);
29
+ state.set(key, current);
30
+ limits.set(key, normalizedLimit);
31
+ const evicted = evictOldKeys(state, this.maxKeys, limits);
32
+ this.append({
33
+ type: 'message',
34
+ key,
35
+ limit: normalizedLimit,
36
+ entry,
37
+ recordedAt: Date.now(),
38
+ });
39
+ if (evicted ||
40
+ loaded.hadInvalidRecords ||
41
+ loaded.recordCount + 1 >= this.compactAfterRecords) {
42
+ this.compact(state, limits);
43
+ }
44
+ }
45
+ drain(key, limit) {
46
+ const normalizedLimit = normalizeLimit(limit);
47
+ const loaded = this.loadState();
48
+ const state = loaded.entries;
49
+ const entries = normalizedLimit > 0 ? (state.get(key) ?? []).slice(-normalizedLimit) : [];
50
+ if (state.has(key)) {
51
+ state.delete(key);
52
+ loaded.limits.delete(key);
53
+ this.append({ type: 'clear', key, recordedAt: Date.now() });
54
+ }
55
+ return entries;
56
+ }
57
+ clear(key) {
58
+ const loaded = this.loadState();
59
+ const state = loaded.entries;
60
+ if (!state.has(key)) {
61
+ return;
62
+ }
63
+ state.delete(key);
64
+ loaded.limits.delete(key);
65
+ this.append({ type: 'clear', key, recordedAt: Date.now() });
66
+ this.compact(state, loaded.limits);
67
+ }
68
+ clearAll() {
69
+ const loaded = this.loadState();
70
+ if (loaded.entries.size === 0) {
71
+ return;
72
+ }
73
+ const recordedAt = Date.now();
74
+ for (const key of loaded.entries.keys()) {
75
+ this.append({ type: 'clear', key, recordedAt });
76
+ }
77
+ this.compact(new Map(), new Map());
78
+ }
79
+ size(key) {
80
+ const state = this.loadState().entries;
81
+ if (key !== undefined) {
82
+ return state.get(key)?.length ?? 0;
83
+ }
84
+ return state.size;
85
+ }
86
+ loadState() {
87
+ const state = new Map();
88
+ const limits = new Map();
89
+ const read = this.readRecords();
90
+ for (const record of read.records) {
91
+ if (record.type === 'clear') {
92
+ state.delete(record.key);
93
+ limits.delete(record.key);
94
+ continue;
95
+ }
96
+ const current = state.get(record.key) ?? [];
97
+ current.push(record.entry);
98
+ if (current.length > record.limit) {
99
+ current.splice(0, current.length - record.limit);
100
+ }
101
+ state.delete(record.key);
102
+ state.set(record.key, current);
103
+ limits.set(record.key, record.limit);
104
+ evictOldKeys(state, this.maxKeys, limits);
105
+ }
106
+ return {
107
+ entries: state,
108
+ limits,
109
+ recordCount: read.records.length,
110
+ hadInvalidRecords: read.hadInvalidRecords,
111
+ };
112
+ }
113
+ readRecords() {
114
+ if (!existsSync(this.filePath)) {
115
+ return { records: [], hadInvalidRecords: false };
116
+ }
117
+ let data;
118
+ try {
119
+ data = readFileSync(this.filePath, 'utf-8');
120
+ }
121
+ catch (err) {
122
+ if (isErrnoCode(err, 'ENOENT')) {
123
+ return { records: [], hadInvalidRecords: false };
124
+ }
125
+ throw err;
126
+ }
127
+ const records = [];
128
+ let hadInvalidRecords = false;
129
+ for (const line of data.split('\n')) {
130
+ if (line.trim().length === 0) {
131
+ continue;
132
+ }
133
+ try {
134
+ const parsed = JSON.parse(line);
135
+ if (isGroupHistoryRecord(parsed)) {
136
+ records.push(parsed);
137
+ }
138
+ else {
139
+ hadInvalidRecords = true;
140
+ }
141
+ }
142
+ catch {
143
+ // Ignore corrupt lines. The next compaction will rewrite valid state.
144
+ hadInvalidRecords = true;
145
+ }
146
+ }
147
+ return { records, hadInvalidRecords };
148
+ }
149
+ append(record) {
150
+ const dir = dirname(this.filePath);
151
+ mkdirSync(dir, { recursive: true, mode: 0o700 });
152
+ chmodPrivate(dir, 0o700);
153
+ appendFileSync(this.filePath, `${JSON.stringify(record)}\n`, {
154
+ encoding: 'utf-8',
155
+ mode: 0o600,
156
+ });
157
+ chmodPrivate(this.filePath, 0o600);
158
+ }
159
+ compact(state, limits) {
160
+ const dir = dirname(this.filePath);
161
+ mkdirSync(dir, { recursive: true, mode: 0o700 });
162
+ chmodPrivate(dir, 0o700);
163
+ const records = [];
164
+ const recordedAt = Date.now();
165
+ for (const [key, entries] of state) {
166
+ for (const entry of entries) {
167
+ records.push({
168
+ type: 'message',
169
+ key,
170
+ limit: limits.get(key) ?? entries.length,
171
+ entry,
172
+ recordedAt,
173
+ });
174
+ }
175
+ }
176
+ const data = records.length > 0
177
+ ? `${records.map((record) => JSON.stringify(record)).join('\n')}\n`
178
+ : '';
179
+ const tempPath = join(dir, `${Date.now()}-${process.pid}-${Math.random().toString(16).slice(2)}.tmp`);
180
+ writeFileSync(tempPath, data, { encoding: 'utf-8', mode: 0o600 });
181
+ chmodPrivate(tempPath, 0o600);
182
+ renameSync(tempPath, this.filePath);
183
+ chmodPrivate(this.filePath, 0o600);
184
+ }
185
+ }
186
+ function normalizeLimit(limit) {
187
+ if (!Number.isFinite(limit) || limit <= 0) {
188
+ return 0;
189
+ }
190
+ return Math.floor(limit);
191
+ }
192
+ function evictOldKeys(state, maxKeys, limits) {
193
+ let evicted = false;
194
+ while (state.size > maxKeys) {
195
+ const oldest = state.keys().next().value;
196
+ if (oldest === undefined) {
197
+ return evicted;
198
+ }
199
+ state.delete(oldest);
200
+ limits?.delete(oldest);
201
+ evicted = true;
202
+ }
203
+ return evicted;
204
+ }
205
+ function isGroupHistoryRecord(value) {
206
+ if (!isRecord(value)) {
207
+ return false;
208
+ }
209
+ if (value['type'] === 'clear') {
210
+ return typeof value['key'] === 'string';
211
+ }
212
+ if (value['type'] !== 'message') {
213
+ return false;
214
+ }
215
+ return (typeof value['key'] === 'string' &&
216
+ typeof value['limit'] === 'number' &&
217
+ isGroupHistoryEntry(value['entry']));
218
+ }
219
+ function isGroupHistoryEntry(value) {
220
+ return (isRecord(value) &&
221
+ typeof value['senderId'] === 'string' &&
222
+ typeof value['senderName'] === 'string' &&
223
+ typeof value['text'] === 'string' &&
224
+ typeof value['timestamp'] === 'number');
225
+ }
226
+ function isRecord(value) {
227
+ return typeof value === 'object' && value !== null;
228
+ }
229
+ function isErrnoCode(err, code) {
230
+ return (err instanceof Error &&
231
+ 'code' in err &&
232
+ err.code === code);
233
+ }
234
+ function chmodPrivate(path, mode) {
235
+ try {
236
+ chmodSync(path, mode);
237
+ }
238
+ catch {
239
+ // Best effort: some filesystems/platforms do not support POSIX modes.
240
+ }
241
+ }
242
+ //# sourceMappingURL=group-history-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group-history-store.js","sourceRoot":"","sources":["../src/group-history-store.ts"],"names":[],"mappings":"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"}