group-chat-mcp 0.1.5 → 0.1.6
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/CHANGELOG.md +10 -0
- package/STEPS.md +43 -0
- package/dist/__tests__/send-lock.test.d.ts +2 -0
- package/dist/__tests__/send-lock.test.d.ts.map +1 -0
- package/dist/__tests__/send-lock.test.js +239 -0
- package/dist/__tests__/send-lock.test.js.map +1 -0
- package/dist/__tests__/tool-handlers.test.d.ts +2 -0
- package/dist/__tests__/tool-handlers.test.d.ts.map +1 -0
- package/dist/__tests__/tool-handlers.test.js +102 -0
- package/dist/__tests__/tool-handlers.test.js.map +1 -0
- package/dist/index.js +15 -3
- package/dist/index.js.map +1 -1
- package/dist/services/tool-handlers.d.ts.map +1 -1
- package/dist/services/tool-handlers.js +60 -7
- package/dist/services/tool-handlers.js.map +1 -1
- package/dist/utils/file-lock.d.ts +2 -0
- package/dist/utils/file-lock.d.ts.map +1 -1
- package/dist/utils/file-lock.js +2 -2
- package/dist/utils/file-lock.js.map +1 -1
- package/dist/utils/send-lock.d.ts +24 -0
- package/dist/utils/send-lock.d.ts.map +1 -0
- package/dist/utils/send-lock.js +139 -0
- package/dist/utils/send-lock.js.map +1 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,16 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [0.1.6] - 2026-03-23
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- Per-conversation send lock that serializes concurrent `send_message` calls within a conversation, returning competing messages with reconsideration instructions to blocked agents
|
|
13
|
+
|
|
14
|
+
### Fixed
|
|
15
|
+
|
|
16
|
+
- Send lock robustness: stale lock detection with process liveness checks, lock release on agent disconnect, and jittered poll intervals to prevent filesystem contention
|
|
17
|
+
|
|
8
18
|
## [0.1.5] - 2026-03-22
|
|
9
19
|
|
|
10
20
|
### Added
|
package/STEPS.md
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# End Goal
|
|
2
|
+
|
|
3
|
+
Add a per-conversation message-sending lock that serializes sends within a conversation. When an agent attempts to send while another agent is already sending, the server waits internally until the competing message lands, then returns that message with strict instructions to reconsider and resend — never discarding the blocked agent's intent.
|
|
4
|
+
|
|
5
|
+
## Steps
|
|
6
|
+
|
|
7
|
+
- [ ] Add a per-conversation send lock to the state layer
|
|
8
|
+
- [ ] File-based lock per conversation (reusing the existing lock primitive pattern) that tracks the sending agent's ID
|
|
9
|
+
- [ ] 10-second stale threshold with automatic lock breaking and process liveness check
|
|
10
|
+
- [ ] Integrate the lock into the send_message tool handler
|
|
11
|
+
- [ ] On lock contention: wait internally (poll) until the competing message lands
|
|
12
|
+
- [ ] On lock release: read the latest message(s) from the conversation file that arrived while waiting, return them with strict instructions to read, reconsider the original intent, and resend (do NOT echo the blocked agent's original message)
|
|
13
|
+
- [ ] On timeout: break the stale lock and proceed with the blocked agent's send normally
|
|
14
|
+
- [ ] Handle lock cleanup on agent disconnect/crash to prevent deadlocks
|
|
15
|
+
|
|
16
|
+
## Questions Answered
|
|
17
|
+
|
|
18
|
+
1. Q: Should the send lock be scoped per-conversation or global?
|
|
19
|
+
A: Per-conversation. Agents can send to different conversations simultaneously, but only one at a time per conversation.
|
|
20
|
+
|
|
21
|
+
2. Q: Should the server reject immediately or wait internally?
|
|
22
|
+
A: Wait internally until the competing message is sent, then return that message in the rejection response. This way the blocked agent immediately sees the message that beat it, can adjust its reply, and retry without waiting for a notification cycle.
|
|
23
|
+
|
|
24
|
+
3. Q: Should the blocked agent still receive the competing message via normal notifications?
|
|
25
|
+
A: Yes. The notification system stays unchanged. Duplicate exposure is acceptable and keeps the system simple.
|
|
26
|
+
|
|
27
|
+
4. Q: How long should the blocked agent wait before timing out?
|
|
28
|
+
A: 10 seconds. Matches existing stale lock threshold. Normal sends complete in milliseconds.
|
|
29
|
+
|
|
30
|
+
5. Q: What happens on timeout?
|
|
31
|
+
A: Break the stale lock and let the blocked agent send its message. Automatic recovery, no manual intervention.
|
|
32
|
+
|
|
33
|
+
6. Q: Should the rejection response echo the blocked agent's original message?
|
|
34
|
+
A: No. Only return the competing message. The agent must reconsider its message in light of what the other agent said — that's the entire point of this feature. Echoing the original would tempt it to just resend without reconsidering.
|
|
35
|
+
|
|
36
|
+
7. Q: When multiple agents are blocked on the same conversation, queue or race?
|
|
37
|
+
A: Race. All waiters re-contend when the lock releases. Losers wait again and see each subsequent competing message. Natural fit for file-based locks.
|
|
38
|
+
|
|
39
|
+
8. Q: How should the blocked agent retrieve the competing message?
|
|
40
|
+
A: Read from the conversation's message file after the lock releases. Simple, uses existing data. In a multi-waiter race, each agent sees all messages sent since it started waiting.
|
|
41
|
+
|
|
42
|
+
9. Q: Should the send_message tool description be updated to document the lock behavior?
|
|
43
|
+
A: No. Discovery only. Agents learn about it when they hit contention via the rejection response.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"send-lock.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/send-lock.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import fs from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import os from 'node:os';
|
|
5
|
+
import { MessageType } from '../enums/message-type.js';
|
|
6
|
+
import { sendLockDir, tryAcquireSendLock, waitForSendLockRelease, releaseSendLock, getMessagesSince, getMessageCount, readSendLockInfo, } from '../utils/send-lock.js';
|
|
7
|
+
import { LOCK_INFO_FILENAME } from '../utils/file-lock.js';
|
|
8
|
+
import { writeJsonFile } from '../utils/file-utils.js';
|
|
9
|
+
import { MESSAGES_DIR } from '../constants/storage.js';
|
|
10
|
+
let tmpDir;
|
|
11
|
+
beforeEach(async () => {
|
|
12
|
+
tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'gchat-sendlock-test-'));
|
|
13
|
+
await fs.mkdir(path.join(tmpDir, MESSAGES_DIR), { recursive: true });
|
|
14
|
+
});
|
|
15
|
+
afterEach(async () => {
|
|
16
|
+
await fs.rm(tmpDir, { recursive: true, force: true });
|
|
17
|
+
});
|
|
18
|
+
describe('sendLockDir', () => {
|
|
19
|
+
describe('Given agents A and B targeting same and different conversations', () => {
|
|
20
|
+
it('When sendLockDir is called for the same conversation from different callers Then the same path is returned', () => {
|
|
21
|
+
const dirA = sendLockDir(tmpDir, 'conv-1');
|
|
22
|
+
const dirB = sendLockDir(tmpDir, 'conv-1');
|
|
23
|
+
expect(dirA).toBe(dirB);
|
|
24
|
+
expect(dirA).toBe(path.join(tmpDir, MESSAGES_DIR, 'conv-1.send-lock'));
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
describe('tryAcquireSendLock', () => {
|
|
29
|
+
describe('Given no contention', () => {
|
|
30
|
+
it('When agent acquires send lock Then lock acquired and released cleanly', async () => {
|
|
31
|
+
const lockDir = sendLockDir(tmpDir, 'conv-1');
|
|
32
|
+
const result = await tryAcquireSendLock(lockDir, 'agent-A');
|
|
33
|
+
expect(result).toEqual({ acquired: true });
|
|
34
|
+
const info = await readSendLockInfo(lockDir);
|
|
35
|
+
expect(info).not.toBeNull();
|
|
36
|
+
expect(info.agentId).toBe('agent-A');
|
|
37
|
+
expect(info.pid).toBe(process.pid);
|
|
38
|
+
await releaseSendLock(lockDir);
|
|
39
|
+
const exists = await fs.stat(lockDir).catch(() => null);
|
|
40
|
+
expect(exists).toBeNull();
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
describe('Given agent A holds send lock on conv X', () => {
|
|
44
|
+
it('When agent B tries to acquire on conv X Then B gets acquired: false with A agentId', async () => {
|
|
45
|
+
const lockDir = sendLockDir(tmpDir, 'conv-X');
|
|
46
|
+
await tryAcquireSendLock(lockDir, 'agent-A');
|
|
47
|
+
const result = await tryAcquireSendLock(lockDir, 'agent-B');
|
|
48
|
+
expect(result).toEqual({ acquired: false, holderAgentId: 'agent-A' });
|
|
49
|
+
await releaseSendLock(lockDir);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
describe('Given agent A holds send lock on conv X', () => {
|
|
53
|
+
it('When agent B acquires on conv Y Then B succeeds immediately', async () => {
|
|
54
|
+
const lockDirX = sendLockDir(tmpDir, 'conv-X');
|
|
55
|
+
const lockDirY = sendLockDir(tmpDir, 'conv-Y');
|
|
56
|
+
await tryAcquireSendLock(lockDirX, 'agent-A');
|
|
57
|
+
const result = await tryAcquireSendLock(lockDirY, 'agent-B');
|
|
58
|
+
expect(result).toEqual({ acquired: true });
|
|
59
|
+
await releaseSendLock(lockDirX);
|
|
60
|
+
await releaseSendLock(lockDirY);
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
describe('waitForSendLockRelease', () => {
|
|
65
|
+
describe('Given lock held for >10s by dead process', () => {
|
|
66
|
+
it('When agent calls waitForSendLockRelease Then stale lock broken and released: true returned', async () => {
|
|
67
|
+
const lockDir = sendLockDir(tmpDir, 'conv-stale');
|
|
68
|
+
await fs.mkdir(lockDir);
|
|
69
|
+
const staleLockInfo = {
|
|
70
|
+
pid: 999999,
|
|
71
|
+
agentId: 'dead-agent',
|
|
72
|
+
timestamp: Date.now() - 15_000,
|
|
73
|
+
};
|
|
74
|
+
await fs.writeFile(path.join(lockDir, LOCK_INFO_FILENAME), JSON.stringify(staleLockInfo), 'utf-8');
|
|
75
|
+
const result = await waitForSendLockRelease(lockDir, 200);
|
|
76
|
+
expect(result).toEqual({ released: true });
|
|
77
|
+
const exists = await fs.stat(lockDir).catch(() => null);
|
|
78
|
+
expect(exists).toBeNull();
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
describe('Given agent blocked on send lock', () => {
|
|
82
|
+
it('When lock directory is manually deleted Then waitForSendLockRelease returns released', async () => {
|
|
83
|
+
const lockDir = sendLockDir(tmpDir, 'conv-deleted');
|
|
84
|
+
await fs.mkdir(lockDir);
|
|
85
|
+
const lockInfo = {
|
|
86
|
+
pid: process.pid,
|
|
87
|
+
agentId: 'agent-A',
|
|
88
|
+
timestamp: Date.now(),
|
|
89
|
+
};
|
|
90
|
+
await fs.writeFile(path.join(lockDir, LOCK_INFO_FILENAME), JSON.stringify(lockInfo), 'utf-8');
|
|
91
|
+
const waitPromise = waitForSendLockRelease(lockDir, 2000);
|
|
92
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
93
|
+
await fs.rm(lockDir, { recursive: true, force: true });
|
|
94
|
+
const result = await waitPromise;
|
|
95
|
+
expect(result).toEqual({ released: true });
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
describe('Given agent A releases lock and agent C immediately acquires', () => {
|
|
99
|
+
it('When B timeout fires Then B detects C lock and does NOT break it', async () => {
|
|
100
|
+
const lockDir = sendLockDir(tmpDir, 'conv-reacquire');
|
|
101
|
+
await fs.mkdir(lockDir);
|
|
102
|
+
const originalInfo = {
|
|
103
|
+
pid: process.pid,
|
|
104
|
+
agentId: 'agent-A',
|
|
105
|
+
timestamp: Date.now(),
|
|
106
|
+
};
|
|
107
|
+
await fs.writeFile(path.join(lockDir, LOCK_INFO_FILENAME), JSON.stringify(originalInfo), 'utf-8');
|
|
108
|
+
const waitPromise = waitForSendLockRelease(lockDir, 200);
|
|
109
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
110
|
+
const newInfo = {
|
|
111
|
+
pid: process.pid,
|
|
112
|
+
agentId: 'agent-C',
|
|
113
|
+
timestamp: Date.now() + 1000,
|
|
114
|
+
};
|
|
115
|
+
await fs.writeFile(path.join(lockDir, LOCK_INFO_FILENAME), JSON.stringify(newInfo), 'utf-8');
|
|
116
|
+
const result = await waitPromise;
|
|
117
|
+
expect(result).toEqual({ timedOut: true });
|
|
118
|
+
const lockStillExists = await fs.stat(lockDir).catch(() => null);
|
|
119
|
+
expect(lockStillExists).not.toBeNull();
|
|
120
|
+
const currentInfo = await readSendLockInfo(lockDir);
|
|
121
|
+
expect(currentInfo.agentId).toBe('agent-C');
|
|
122
|
+
await releaseSendLock(lockDir);
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
describe('releaseSendLock', () => {
|
|
127
|
+
describe('Given send lock held', () => {
|
|
128
|
+
it('When releaseSendLock called Then lock directory and lock.info removed', async () => {
|
|
129
|
+
const lockDir = sendLockDir(tmpDir, 'conv-release');
|
|
130
|
+
await tryAcquireSendLock(lockDir, 'agent-A');
|
|
131
|
+
const existsBefore = await fs.stat(lockDir).catch(() => null);
|
|
132
|
+
expect(existsBefore).not.toBeNull();
|
|
133
|
+
await releaseSendLock(lockDir);
|
|
134
|
+
const existsAfter = await fs.stat(lockDir).catch(() => null);
|
|
135
|
+
expect(existsAfter).toBeNull();
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
describe('Given send lock acquired', () => {
|
|
139
|
+
it('When operation fails Then lock released via finally pattern', async () => {
|
|
140
|
+
const lockDir = sendLockDir(tmpDir, 'conv-finally');
|
|
141
|
+
const acquireResult = await tryAcquireSendLock(lockDir, 'agent-A');
|
|
142
|
+
expect(acquireResult.acquired).toBe(true);
|
|
143
|
+
let errorCaught = false;
|
|
144
|
+
try {
|
|
145
|
+
throw new Error('simulated failure');
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
errorCaught = true;
|
|
149
|
+
}
|
|
150
|
+
finally {
|
|
151
|
+
await releaseSendLock(lockDir);
|
|
152
|
+
}
|
|
153
|
+
expect(errorCaught).toBe(true);
|
|
154
|
+
const exists = await fs.stat(lockDir).catch(() => null);
|
|
155
|
+
expect(exists).toBeNull();
|
|
156
|
+
const reacquireResult = await tryAcquireSendLock(lockDir, 'agent-B');
|
|
157
|
+
expect(reacquireResult).toEqual({ acquired: true });
|
|
158
|
+
await releaseSendLock(lockDir);
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
describe('contention and waiting', () => {
|
|
163
|
+
describe('Given 2 agents try to acquire same conv lock', () => {
|
|
164
|
+
it('When first releases Then exactly one of the waiters acquires it', async () => {
|
|
165
|
+
const lockDir = sendLockDir(tmpDir, 'conv-contention');
|
|
166
|
+
const firstResult = await tryAcquireSendLock(lockDir, 'agent-A');
|
|
167
|
+
expect(firstResult.acquired).toBe(true);
|
|
168
|
+
const secondResult = await tryAcquireSendLock(lockDir, 'agent-B');
|
|
169
|
+
expect(secondResult.acquired).toBe(false);
|
|
170
|
+
const waitPromise = waitForSendLockRelease(lockDir, 2000);
|
|
171
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
172
|
+
await releaseSendLock(lockDir);
|
|
173
|
+
const waitResult = await waitPromise;
|
|
174
|
+
expect(waitResult).toEqual({ released: true });
|
|
175
|
+
const acquireAfterWait = await tryAcquireSendLock(lockDir, 'agent-B');
|
|
176
|
+
expect(acquireAfterWait.acquired).toBe(true);
|
|
177
|
+
await releaseSendLock(lockDir);
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
describe('getMessagesSince', () => {
|
|
182
|
+
describe('Given agent A sent messages while B waited', () => {
|
|
183
|
+
it('When B calls getMessagesSince with snapshot index Then only messages since snapshot returned', async () => {
|
|
184
|
+
const messagesPath = path.join(tmpDir, MESSAGES_DIR, 'conv-messages.json');
|
|
185
|
+
const messages = [
|
|
186
|
+
{ id: 'msg-1', conversationId: 'conv-messages', senderId: 'agent-A', content: 'Hello', type: MessageType.Message, timestamp: 1000 },
|
|
187
|
+
{ id: 'msg-2', conversationId: 'conv-messages', senderId: 'agent-A', content: 'World', type: MessageType.Message, timestamp: 2000 },
|
|
188
|
+
{ id: 'msg-3', conversationId: 'conv-messages', senderId: 'agent-A', content: 'New msg', type: MessageType.Message, timestamp: 3000 },
|
|
189
|
+
];
|
|
190
|
+
await writeJsonFile(messagesPath, messages);
|
|
191
|
+
const snapshotIndex = 1;
|
|
192
|
+
const result = await getMessagesSince(messagesPath, snapshotIndex);
|
|
193
|
+
expect(result).toHaveLength(2);
|
|
194
|
+
expect(result[0].id).toBe('msg-2');
|
|
195
|
+
expect(result[1].id).toBe('msg-3');
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
describe('getMessageCount', () => {
|
|
200
|
+
describe('Given messages file has messages', () => {
|
|
201
|
+
it('When getMessageCount called Then correct count returned', async () => {
|
|
202
|
+
const messagesPath = path.join(tmpDir, MESSAGES_DIR, 'conv-count.json');
|
|
203
|
+
const messages = [
|
|
204
|
+
{ id: 'msg-1', conversationId: 'conv-count', senderId: 'agent-A', content: 'Hello', type: MessageType.Message, timestamp: 1000 },
|
|
205
|
+
{ id: 'msg-2', conversationId: 'conv-count', senderId: 'agent-B', content: 'World', type: MessageType.Message, timestamp: 2000 },
|
|
206
|
+
{ id: 'msg-3', conversationId: 'conv-count', senderId: 'agent-A', content: 'Goodbye', type: MessageType.Message, timestamp: 3000 },
|
|
207
|
+
];
|
|
208
|
+
await writeJsonFile(messagesPath, messages);
|
|
209
|
+
const count = await getMessageCount(messagesPath);
|
|
210
|
+
expect(count).toBe(3);
|
|
211
|
+
});
|
|
212
|
+
});
|
|
213
|
+
describe('Given no messages file exists', () => {
|
|
214
|
+
it('When getMessageCount called Then 0 returned', async () => {
|
|
215
|
+
const messagesPath = path.join(tmpDir, MESSAGES_DIR, 'nonexistent.json');
|
|
216
|
+
const count = await getMessageCount(messagesPath);
|
|
217
|
+
expect(count).toBe(0);
|
|
218
|
+
});
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
describe('integration: participation check before lock', () => {
|
|
222
|
+
describe('Given agent not in conversation', () => {
|
|
223
|
+
it('When participation check runs before lock Then check fails before lock acquisition', async () => {
|
|
224
|
+
const conversationId = 'conv-participation';
|
|
225
|
+
const agentId = 'agent-outsider';
|
|
226
|
+
const participants = ['agent-A', 'agent-B'];
|
|
227
|
+
const isParticipant = participants.includes(agentId);
|
|
228
|
+
expect(isParticipant).toBe(false);
|
|
229
|
+
const lockDir = sendLockDir(tmpDir, conversationId);
|
|
230
|
+
if (!isParticipant) {
|
|
231
|
+
const exists = await fs.stat(lockDir).catch(() => null);
|
|
232
|
+
expect(exists).toBeNull();
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
await tryAcquireSendLock(lockDir, agentId);
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
});
|
|
239
|
+
//# sourceMappingURL=send-lock.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"send-lock.test.js","sourceRoot":"","sources":["../../src/__tests__/send-lock.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-handlers.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/tool-handlers.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
2
|
+
import fs from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import os from 'node:os';
|
|
5
|
+
import { StateService } from '../services/state-service.js';
|
|
6
|
+
import { handleToolCall } from '../services/tool-handlers.js';
|
|
7
|
+
import { tryAcquireSendLock, sendLockDir, releaseSendLock, } from '../utils/send-lock.js';
|
|
8
|
+
import { ConversationType } from '../enums/conversation-type.js';
|
|
9
|
+
let tmpDir;
|
|
10
|
+
let stateService;
|
|
11
|
+
beforeEach(async () => {
|
|
12
|
+
tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'gchat-toolhandlers-test-'));
|
|
13
|
+
stateService = new StateService(tmpDir);
|
|
14
|
+
await stateService.init();
|
|
15
|
+
});
|
|
16
|
+
afterEach(async () => {
|
|
17
|
+
vi.restoreAllMocks();
|
|
18
|
+
await fs.rm(tmpDir, { recursive: true, force: true });
|
|
19
|
+
});
|
|
20
|
+
describe('handleToolCall send_message', () => {
|
|
21
|
+
describe('Given a single agent in a conversation with no contention', () => {
|
|
22
|
+
it('When send_message is called Then the message is sent and no lock directory remains', async () => {
|
|
23
|
+
// Given
|
|
24
|
+
const agent = await stateService.registerAgent('/test/project');
|
|
25
|
+
const conversation = await stateService.createConversation({
|
|
26
|
+
type: ConversationType.Group,
|
|
27
|
+
name: 'test-conv',
|
|
28
|
+
participants: [agent.id],
|
|
29
|
+
});
|
|
30
|
+
await stateService.setHasAnnounced(agent.id, conversation.id);
|
|
31
|
+
// When
|
|
32
|
+
const result = await handleToolCall(stateService, 'send_message', agent.id, {
|
|
33
|
+
content: 'Hello world',
|
|
34
|
+
conversationId: conversation.id,
|
|
35
|
+
});
|
|
36
|
+
// Then
|
|
37
|
+
expect('isError' in result).toBe(false);
|
|
38
|
+
expect(result.content[0].text).toContain('Message sent');
|
|
39
|
+
const lockDir = sendLockDir(tmpDir, conversation.id);
|
|
40
|
+
const lockExists = await fs.stat(lockDir).catch(() => null);
|
|
41
|
+
expect(lockExists).toBeNull();
|
|
42
|
+
const messages = await stateService.getMessages(conversation.id);
|
|
43
|
+
expect(messages).toHaveLength(1);
|
|
44
|
+
expect(messages[0].content).toBe('Hello world');
|
|
45
|
+
expect(messages[0].senderId).toBe(agent.id);
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
describe('Given two agents in a conversation and agent A holds the send lock', () => {
|
|
49
|
+
it('When agent B calls send_message Then B receives a contention error containing the competing message', async () => {
|
|
50
|
+
// Given
|
|
51
|
+
const agentA = await stateService.registerAgent('/test/project');
|
|
52
|
+
const agentB = await stateService.registerAgent('/test/project');
|
|
53
|
+
const conversation = await stateService.createConversation({
|
|
54
|
+
type: ConversationType.Group,
|
|
55
|
+
name: 'contention-conv',
|
|
56
|
+
participants: [agentA.id, agentB.id],
|
|
57
|
+
});
|
|
58
|
+
await stateService.setHasAnnounced(agentA.id, conversation.id);
|
|
59
|
+
await stateService.setHasAnnounced(agentB.id, conversation.id);
|
|
60
|
+
const lockDir = sendLockDir(tmpDir, conversation.id);
|
|
61
|
+
await tryAcquireSendLock(lockDir, agentA.id);
|
|
62
|
+
// When
|
|
63
|
+
const agentBPromise = handleToolCall(stateService, 'send_message', agentB.id, {
|
|
64
|
+
content: 'Message from B',
|
|
65
|
+
conversationId: conversation.id,
|
|
66
|
+
});
|
|
67
|
+
await new Promise((resolve) => setTimeout(resolve, 200));
|
|
68
|
+
await stateService.addMessage(conversation.id, agentA.id, 'Message from A', 'message');
|
|
69
|
+
await releaseSendLock(lockDir);
|
|
70
|
+
const result = await agentBPromise;
|
|
71
|
+
// Then
|
|
72
|
+
expect(result.isError).toBe(true);
|
|
73
|
+
expect(result.content[0].text).toContain('Message from A');
|
|
74
|
+
expect(result.content[0].text).toContain('reconsider');
|
|
75
|
+
const messages = await stateService.getMessages(conversation.id);
|
|
76
|
+
const bMessages = messages.filter((m) => m.senderId === agentB.id);
|
|
77
|
+
expect(bMessages).toHaveLength(0);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
describe('Given an agent in a conversation and addMessage throws', () => {
|
|
81
|
+
it('When send_message is called Then the lock is released in finally and the error propagates', async () => {
|
|
82
|
+
// Given
|
|
83
|
+
const agent = await stateService.registerAgent('/test/project');
|
|
84
|
+
const conversation = await stateService.createConversation({
|
|
85
|
+
type: ConversationType.Group,
|
|
86
|
+
name: 'fail-conv',
|
|
87
|
+
participants: [agent.id],
|
|
88
|
+
});
|
|
89
|
+
await stateService.setHasAnnounced(agent.id, conversation.id);
|
|
90
|
+
vi.spyOn(stateService, 'addMessage').mockRejectedValueOnce(new Error('Disk write failed'));
|
|
91
|
+
// When / Then
|
|
92
|
+
await expect(handleToolCall(stateService, 'send_message', agent.id, {
|
|
93
|
+
content: 'This will fail',
|
|
94
|
+
conversationId: conversation.id,
|
|
95
|
+
})).rejects.toThrow('Disk write failed');
|
|
96
|
+
const lockDir = sendLockDir(tmpDir, conversation.id);
|
|
97
|
+
const lockExists = await fs.stat(lockDir).catch(() => null);
|
|
98
|
+
expect(lockExists).toBeNull();
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
//# sourceMappingURL=tool-handlers.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-handlers.test.js","sourceRoot":"","sources":["../../src/__tests__/tool-handlers.test.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -3,10 +3,10 @@ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
|
3
3
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
4
|
import { ListToolsRequestSchema, CallToolRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
5
5
|
import { GC_PROJECT_PATH, GC_POLL_INTERVAL_MS, GC_CLIENT_TYPE } from './constants/env.js';
|
|
6
|
-
import { BASE_DIR } from './constants/storage.js';
|
|
7
6
|
import { NotificationType } from './enums/notification-type.js';
|
|
8
7
|
import { handleToolCall } from './services/tool-handlers.js';
|
|
9
8
|
import { writeNotificationToParticipants, writeProfileSetupNotification } from './utils/notification-utils.js';
|
|
9
|
+
import { sendLockDir, readSendLockInfo, releaseSendLock } from './utils/send-lock.js';
|
|
10
10
|
import { toolDefinitions } from './schemas/tool-schemas.js';
|
|
11
11
|
import { StateService } from './services/state-service.js';
|
|
12
12
|
import { SessionStateService } from './services/session-state-service.js';
|
|
@@ -14,7 +14,7 @@ import { InboxPollerService } from './services/inbox-poller.js';
|
|
|
14
14
|
const stateService = new StateService();
|
|
15
15
|
const sessionStateService = new SessionStateService();
|
|
16
16
|
const inboxPoller = new InboxPollerService();
|
|
17
|
-
const server = new Server({ name: 'group-chat-mcp', version: '0.1.
|
|
17
|
+
const server = new Server({ name: 'group-chat-mcp', version: '0.1.6' }, {
|
|
18
18
|
capabilities: {
|
|
19
19
|
experimental: { 'claude/channel': {} },
|
|
20
20
|
tools: {},
|
|
@@ -65,7 +65,7 @@ async function main() {
|
|
|
65
65
|
}
|
|
66
66
|
});
|
|
67
67
|
if (GC_CLIENT_TYPE !== 'cursor') {
|
|
68
|
-
inboxPoller.start(agentId, GC_POLL_INTERVAL_MS, server,
|
|
68
|
+
inboxPoller.start(agentId, GC_POLL_INTERVAL_MS, server, stateService.baseDir);
|
|
69
69
|
}
|
|
70
70
|
const transport = new StdioServerTransport();
|
|
71
71
|
await server.connect(transport);
|
|
@@ -80,6 +80,18 @@ async function main() {
|
|
|
80
80
|
try {
|
|
81
81
|
const currentAgent = await stateService.getAgent(currentAgentId);
|
|
82
82
|
if (currentAgent) {
|
|
83
|
+
for (const convId of [...currentAgent.conversations]) {
|
|
84
|
+
try {
|
|
85
|
+
const lockDir = sendLockDir(stateService.baseDir, convId);
|
|
86
|
+
const lockInfo = await readSendLockInfo(lockDir);
|
|
87
|
+
if (lockInfo && lockInfo.agentId === currentAgentId) {
|
|
88
|
+
await releaseSendLock(lockDir);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
console.error(`Failed to release send lock for conversation ${convId}:`, err);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
83
95
|
for (const convId of [...currentAgent.conversations]) {
|
|
84
96
|
try {
|
|
85
97
|
const name = currentAgent.profile.name ?? currentAgentId;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC1F,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-handlers.d.ts","sourceRoot":"","sources":["../../src/services/tool-handlers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tool-handlers.d.ts","sourceRoot":"","sources":["../../src/services/tool-handlers.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAmB5D,wBAAsB,cAAc,CAClC,YAAY,EAAE,YAAY,EAC1B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS;;;;;GAoT7C"}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
1
2
|
import { ConversationType } from '../enums/conversation-type.js';
|
|
2
3
|
import { NotificationType } from '../enums/notification-type.js';
|
|
4
|
+
import { MESSAGES_DIR } from '../constants/storage.js';
|
|
3
5
|
import { ListConversationsArgsSchema, ListParticipantsArgsSchema, SendMessageArgsSchema, GetConversationArgsSchema, UpdateProfileArgsSchema, CreateConversationArgsSchema, JoinConversationArgsSchema, LeaveConversationArgsSchema, ReadNotificationsArgsSchema, } from '../schemas/tool-schemas.js';
|
|
4
6
|
import { formatNotificationContent, writeNotificationToParticipants, writeProfileSetupNotification } from '../utils/notification-utils.js';
|
|
7
|
+
import { tryAcquireSendLock, waitForSendLockRelease, getMessagesSince, getMessageCount, releaseSendLock, sendLockDir, } from '../utils/send-lock.js';
|
|
5
8
|
function textResult(text) {
|
|
6
9
|
return { content: [{ type: 'text', text }] };
|
|
7
10
|
}
|
|
@@ -80,14 +83,64 @@ export async function handleToolCall(stateService, name, agentId, rawArgs) {
|
|
|
80
83
|
await stateService.setHasAnnounced(targetAgentId, targetConversationId);
|
|
81
84
|
}
|
|
82
85
|
}
|
|
83
|
-
const
|
|
84
|
-
const
|
|
85
|
-
const
|
|
86
|
-
let
|
|
87
|
-
|
|
88
|
-
|
|
86
|
+
const lockDir = sendLockDir(stateService.baseDir, targetConversationId);
|
|
87
|
+
const messagesPath = path.join(stateService.baseDir, MESSAGES_DIR, `${targetConversationId}.json`);
|
|
88
|
+
const maxContentionRetries = 5;
|
|
89
|
+
let lockAcquired = false;
|
|
90
|
+
for (let attempt = 0; attempt < maxContentionRetries; attempt++) {
|
|
91
|
+
const messageCountBefore = await getMessageCount(messagesPath);
|
|
92
|
+
const lockResult = await tryAcquireSendLock(lockDir, agentId);
|
|
93
|
+
if (lockResult.acquired) {
|
|
94
|
+
lockAcquired = true;
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
const waitResult = await waitForSendLockRelease(lockDir);
|
|
98
|
+
if ('released' in waitResult) {
|
|
99
|
+
const competingMessages = await getMessagesSince(messagesPath, messageCountBefore);
|
|
100
|
+
if (competingMessages.length > 0) {
|
|
101
|
+
const allAgents = await stateService.getAgents();
|
|
102
|
+
const agentMap = new Map(allAgents.map((a) => [a.id, a]));
|
|
103
|
+
const messageLines = competingMessages.map((m) => {
|
|
104
|
+
const sender = agentMap.get(m.senderId);
|
|
105
|
+
const senderName = sender?.profile.name ?? m.senderId;
|
|
106
|
+
return `${senderName}: ${m.content}`;
|
|
107
|
+
});
|
|
108
|
+
const contentionResponse = [
|
|
109
|
+
`Conversation: ${targetConversationId}`,
|
|
110
|
+
'',
|
|
111
|
+
'Messages sent while you were preparing yours:',
|
|
112
|
+
...messageLines,
|
|
113
|
+
'',
|
|
114
|
+
'One or more messages were sent to this conversation while you were preparing your message. Read them carefully, reconsider your original intent in light of what was said, and send a new message. Do NOT resend your original message verbatim.',
|
|
115
|
+
].join('\n');
|
|
116
|
+
return { content: [{ type: 'text', text: contentionResponse }], isError: true };
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (!lockAcquired) {
|
|
121
|
+
const finalResult = await tryAcquireSendLock(lockDir, agentId);
|
|
122
|
+
if (!finalResult.acquired) {
|
|
123
|
+
return errorResult('Failed to acquire send lock after contention.');
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
try {
|
|
127
|
+
const message = await stateService.addMessage(targetConversationId, agentId, content, 'message');
|
|
128
|
+
const agent = await stateService.getAgent(agentId);
|
|
129
|
+
const conversation = await stateService.getConversation(targetConversationId);
|
|
130
|
+
let responseText = `Message sent (${message.id}) to conversation ${targetConversationId}.`;
|
|
131
|
+
if ((agent?.profile.name == null) && conversation && conversation.participants.length >= 2) {
|
|
132
|
+
responseText += '\n\nReminder: your profile is not set. Use update_profile to set your name, role, expertise, and status so other participants can identify you.';
|
|
133
|
+
}
|
|
134
|
+
return textResult(responseText);
|
|
135
|
+
}
|
|
136
|
+
finally {
|
|
137
|
+
try {
|
|
138
|
+
await releaseSendLock(lockDir);
|
|
139
|
+
}
|
|
140
|
+
catch (lockError) {
|
|
141
|
+
console.error('Failed to release send lock', { lockDir, error: lockError });
|
|
142
|
+
}
|
|
89
143
|
}
|
|
90
|
-
return textResult(responseText);
|
|
91
144
|
}
|
|
92
145
|
case 'get_conversation': {
|
|
93
146
|
const args = GetConversationArgsSchema.parse(rawArgs ?? {});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-handlers.js","sourceRoot":"","sources":["../../src/services/tool-handlers.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tool-handlers.js","sourceRoot":"","sources":["../../src/services/tool-handlers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
export declare const LOCK_INFO_FILENAME = "lock.info";
|
|
1
2
|
export declare function isProcessAlive(pid: number): boolean;
|
|
3
|
+
export declare function forceRemoveLock(lockPath: string): Promise<void>;
|
|
2
4
|
export declare function withFileLock<T>(filePath: string, fn: () => Promise<T>, timeoutMs?: number): Promise<T>;
|
|
3
5
|
//# sourceMappingURL=file-lock.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-lock.d.ts","sourceRoot":"","sources":["../../src/utils/file-lock.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"file-lock.d.ts","sourceRoot":"","sources":["../../src/utils/file-lock.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,kBAAkB,cAAc,CAAC;AAO9C,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOnD;AAoBD,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAWrE;AA4DD,wBAAsB,YAAY,CAAC,CAAC,EAClC,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,CAAC,CAAC,CAOZ"}
|
package/dist/utils/file-lock.js
CHANGED
|
@@ -3,7 +3,7 @@ import fs from 'node:fs/promises';
|
|
|
3
3
|
const DEFAULT_TIMEOUT_MS = 5000;
|
|
4
4
|
const DEFAULT_STALE_LOCK_AGE_MS = 10_000;
|
|
5
5
|
const RETRY_INTERVAL_MS = 50;
|
|
6
|
-
const LOCK_INFO_FILENAME = 'lock.info';
|
|
6
|
+
export const LOCK_INFO_FILENAME = 'lock.info';
|
|
7
7
|
export function isProcessAlive(pid) {
|
|
8
8
|
try {
|
|
9
9
|
process.kill(pid, 0);
|
|
@@ -30,7 +30,7 @@ async function writeLockInfo(lockPath) {
|
|
|
30
30
|
const info = { pid: process.pid, timestamp: Date.now() };
|
|
31
31
|
await fs.writeFile(path.join(lockPath, LOCK_INFO_FILENAME), JSON.stringify(info), 'utf-8');
|
|
32
32
|
}
|
|
33
|
-
async function forceRemoveLock(lockPath) {
|
|
33
|
+
export async function forceRemoveLock(lockPath) {
|
|
34
34
|
try {
|
|
35
35
|
await fs.unlink(path.join(lockPath, LOCK_INFO_FILENAME));
|
|
36
36
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-lock.js","sourceRoot":"","sources":["../../src/utils/file-lock.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAElC,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAChC,MAAM,yBAAyB,GAAG,MAAM,CAAC;AACzC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAC7B,MAAM,kBAAkB,GAAG,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"file-lock.js","sourceRoot":"","sources":["../../src/utils/file-lock.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Message } from '../types/message.js';
|
|
2
|
+
interface SendLockInfo {
|
|
3
|
+
pid: number;
|
|
4
|
+
agentId: string;
|
|
5
|
+
timestamp: number;
|
|
6
|
+
}
|
|
7
|
+
export declare function sendLockDir(baseDir: string, conversationId: string): string;
|
|
8
|
+
export declare function readSendLockInfo(lockDir: string): Promise<SendLockInfo | null>;
|
|
9
|
+
export declare function tryAcquireSendLock(lockDir: string, agentId: string): Promise<{
|
|
10
|
+
acquired: true;
|
|
11
|
+
} | {
|
|
12
|
+
acquired: false;
|
|
13
|
+
holderAgentId: string;
|
|
14
|
+
}>;
|
|
15
|
+
export declare function waitForSendLockRelease(lockDir: string, timeoutMs?: number): Promise<{
|
|
16
|
+
released: true;
|
|
17
|
+
} | {
|
|
18
|
+
timedOut: true;
|
|
19
|
+
}>;
|
|
20
|
+
export declare function getMessagesSince(messagesPath: string, sinceIndex: number): Promise<Message[]>;
|
|
21
|
+
export declare function getMessageCount(messagesPath: string): Promise<number>;
|
|
22
|
+
export declare function releaseSendLock(lockDir: string): Promise<void>;
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=send-lock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"send-lock.d.ts","sourceRoot":"","sources":["../../src/utils/send-lock.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAGnD,UAAU,YAAY;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CAE3E;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAepF;AAED,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,QAAQ,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,QAAQ,EAAE,KAAK,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC,CA0B1E;AAED,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,MAAM,EACf,SAAS,GAAE,MAAe,GACzB,OAAO,CAAC;IAAE,QAAQ,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,QAAQ,EAAE,IAAI,CAAA;CAAE,CAAC,CA8DlD;AAED,wBAAsB,gBAAgB,CACpC,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,OAAO,EAAE,CAAC,CAMpB;AAED,wBAAsB,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAG3E;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBpE"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import fs from 'node:fs/promises';
|
|
3
|
+
import { setTimeout } from 'node:timers/promises';
|
|
4
|
+
import { MESSAGES_DIR } from '../constants/storage.js';
|
|
5
|
+
import { readJsonFile } from './file-utils.js';
|
|
6
|
+
import { LOCK_INFO_FILENAME, isProcessAlive, forceRemoveLock } from './file-lock.js';
|
|
7
|
+
export function sendLockDir(baseDir, conversationId) {
|
|
8
|
+
return path.join(baseDir, MESSAGES_DIR, `${conversationId}.send-lock`);
|
|
9
|
+
}
|
|
10
|
+
export async function readSendLockInfo(lockDir) {
|
|
11
|
+
try {
|
|
12
|
+
const content = await fs.readFile(path.join(lockDir, LOCK_INFO_FILENAME), 'utf-8');
|
|
13
|
+
const parsed = JSON.parse(content);
|
|
14
|
+
if (typeof parsed.pid === 'number' &&
|
|
15
|
+
typeof parsed.agentId === 'string' &&
|
|
16
|
+
typeof parsed.timestamp === 'number') {
|
|
17
|
+
return parsed;
|
|
18
|
+
}
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export async function tryAcquireSendLock(lockDir, agentId) {
|
|
26
|
+
try {
|
|
27
|
+
await fs.mkdir(lockDir);
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
if (err.code === 'EEXIST') {
|
|
31
|
+
const info = await readSendLockInfo(lockDir);
|
|
32
|
+
const holderAgentId = info?.agentId ?? 'unknown';
|
|
33
|
+
console.error(`Send lock contention detected (holder: ${holderAgentId})`);
|
|
34
|
+
return { acquired: false, holderAgentId };
|
|
35
|
+
}
|
|
36
|
+
throw err;
|
|
37
|
+
}
|
|
38
|
+
const info = { pid: process.pid, agentId, timestamp: Date.now() };
|
|
39
|
+
try {
|
|
40
|
+
await fs.writeFile(path.join(lockDir, LOCK_INFO_FILENAME), JSON.stringify(info), 'utf-8');
|
|
41
|
+
console.error('Send lock acquired for conversation');
|
|
42
|
+
return { acquired: true };
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
try {
|
|
46
|
+
await forceRemoveLock(lockDir);
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
// Ignore cleanup errors; rethrow the original failure
|
|
50
|
+
}
|
|
51
|
+
throw err;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
export async function waitForSendLockRelease(lockDir, timeoutMs = 10_000) {
|
|
55
|
+
const originalInfo = await readSendLockInfo(lockDir);
|
|
56
|
+
const deadline = Date.now() + timeoutMs;
|
|
57
|
+
while (Date.now() < deadline) {
|
|
58
|
+
const exists = await fs.stat(lockDir).catch(() => null);
|
|
59
|
+
if (!exists) {
|
|
60
|
+
console.error('Send lock released by holder');
|
|
61
|
+
return { released: true };
|
|
62
|
+
}
|
|
63
|
+
const jitter = 50 + Math.floor(Math.random() * 101);
|
|
64
|
+
await setTimeout(jitter);
|
|
65
|
+
}
|
|
66
|
+
const currentInfo = await readSendLockInfo(lockDir);
|
|
67
|
+
if (currentInfo && originalInfo) {
|
|
68
|
+
const isReacquired = currentInfo.pid !== originalInfo.pid ||
|
|
69
|
+
currentInfo.agentId !== originalInfo.agentId ||
|
|
70
|
+
currentInfo.timestamp !== originalInfo.timestamp;
|
|
71
|
+
if (isReacquired) {
|
|
72
|
+
console.error('Send lock timeout reached');
|
|
73
|
+
return { timedOut: true };
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
else if (currentInfo && !originalInfo) {
|
|
77
|
+
const freshThresholdMs = 5000;
|
|
78
|
+
if (Date.now() - currentInfo.timestamp < freshThresholdMs) {
|
|
79
|
+
console.error('Send lock timeout reached');
|
|
80
|
+
return { timedOut: true };
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (currentInfo) {
|
|
84
|
+
const holderDead = !isProcessAlive(currentInfo.pid);
|
|
85
|
+
if (holderDead) {
|
|
86
|
+
console.error('Stale send lock broken (holder process dead)');
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
console.error('Send lock broken (timeout exceeded)');
|
|
90
|
+
}
|
|
91
|
+
await forceRemoveLock(lockDir);
|
|
92
|
+
return { released: true };
|
|
93
|
+
}
|
|
94
|
+
const dirStat = await fs.stat(lockDir).catch(() => null);
|
|
95
|
+
if (!dirStat) {
|
|
96
|
+
console.error('Send lock released by holder');
|
|
97
|
+
return { released: true };
|
|
98
|
+
}
|
|
99
|
+
const dirAgeMs = Date.now() - dirStat.mtimeMs;
|
|
100
|
+
const staleThresholdMs = timeoutMs;
|
|
101
|
+
if (dirAgeMs > staleThresholdMs) {
|
|
102
|
+
console.error('Stale send lock broken (metadata missing)');
|
|
103
|
+
await forceRemoveLock(lockDir);
|
|
104
|
+
return { released: true };
|
|
105
|
+
}
|
|
106
|
+
console.error('Send lock timeout reached');
|
|
107
|
+
return { timedOut: true };
|
|
108
|
+
}
|
|
109
|
+
export async function getMessagesSince(messagesPath, sinceIndex) {
|
|
110
|
+
const messages = await readJsonFile(messagesPath);
|
|
111
|
+
if (!messages || messages.length <= sinceIndex) {
|
|
112
|
+
return [];
|
|
113
|
+
}
|
|
114
|
+
return messages.slice(sinceIndex);
|
|
115
|
+
}
|
|
116
|
+
export async function getMessageCount(messagesPath) {
|
|
117
|
+
const messages = await readJsonFile(messagesPath);
|
|
118
|
+
return messages?.length ?? 0;
|
|
119
|
+
}
|
|
120
|
+
export async function releaseSendLock(lockDir) {
|
|
121
|
+
try {
|
|
122
|
+
await fs.unlink(path.join(lockDir, LOCK_INFO_FILENAME));
|
|
123
|
+
}
|
|
124
|
+
catch (err) {
|
|
125
|
+
if (err.code !== 'ENOENT') {
|
|
126
|
+
throw err;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
try {
|
|
130
|
+
await fs.rmdir(lockDir);
|
|
131
|
+
}
|
|
132
|
+
catch (err) {
|
|
133
|
+
if (err.code !== 'ENOENT') {
|
|
134
|
+
throw err;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
console.error('Send lock released');
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=send-lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"send-lock.js","sourceRoot":"","sources":["../../src/utils/send-lock.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAQrF,MAAM,UAAU,WAAW,CAAC,OAAe,EAAE,cAAsB;IACjE,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,cAAc,YAAY,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAAe;IACpD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,kBAAkB,CAAC,EAAE,OAAO,CAAC,CAAC;QACnF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAiB,CAAC;QACnD,IACE,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ;YAC9B,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ;YAClC,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,EACpC,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAAe,EACf,OAAe;IAEf,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrD,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAC7C,MAAM,aAAa,GAAG,IAAI,EAAE,OAAO,IAAI,SAAS,CAAC;YACjD,OAAO,CAAC,KAAK,CAAC,0CAA0C,aAAa,GAAG,CAAC,CAAC;YAC1E,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;QAC5C,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,MAAM,IAAI,GAAiB,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IAChF,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,kBAAkB,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;QAC1F,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACrD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC5B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC;YACH,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,sDAAsD;QACxD,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,OAAe,EACf,YAAoB,MAAM;IAE1B,MAAM,YAAY,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IAExC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;YAC9C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC5B,CAAC;QAED,MAAM,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC;QACpD,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAEpD,IAAI,WAAW,IAAI,YAAY,EAAE,CAAC;QAChC,MAAM,YAAY,GAChB,WAAW,CAAC,GAAG,KAAK,YAAY,CAAC,GAAG;YACpC,WAAW,CAAC,OAAO,KAAK,YAAY,CAAC,OAAO;YAC5C,WAAW,CAAC,SAAS,KAAK,YAAY,CAAC,SAAS,CAAC;QAEnD,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC3C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC;SAAM,IAAI,WAAW,IAAI,CAAC,YAAY,EAAE,CAAC;QACxC,MAAM,gBAAgB,GAAG,IAAI,CAAC;QAC9B,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC,SAAS,GAAG,gBAAgB,EAAE,CAAC;YAC1D,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC3C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,UAAU,GAAG,CAAC,cAAc,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACpD,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAChE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACvD,CAAC;QACD,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;QAC/B,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC5B,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IACzD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAC9C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC5B,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAC9C,MAAM,gBAAgB,GAAG,SAAS,CAAC;IACnC,IAAI,QAAQ,GAAG,gBAAgB,EAAE,CAAC;QAChC,OAAO,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC3D,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;QAC/B,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC5B,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC3C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC5B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,YAAoB,EACpB,UAAkB;IAElB,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAY,YAAY,CAAC,CAAC;IAC7D,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,IAAI,UAAU,EAAE,CAAC;QAC/C,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,YAAoB;IACxD,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAY,YAAY,CAAC,CAAC;IAC7D,OAAO,QAAQ,EAAE,MAAM,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAe;IACnD,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IACD,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;AACtC,CAAC"}
|