agenthub-multiagent-mcp 1.60.0 → 1.64.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.md +3 -3
- package/dist/brain/memvidBrain.d.ts +22 -0
- package/dist/brain/memvidBrain.d.ts.map +1 -1
- package/dist/brain/memvidBrain.js +41 -2
- package/dist/brain/memvidBrain.js.map +1 -1
- package/dist/brain/memvidBrain.test.js +90 -0
- package/dist/brain/memvidBrain.test.js.map +1 -1
- package/dist/brain/migrate.d.ts +43 -0
- package/dist/brain/migrate.d.ts.map +1 -1
- package/dist/brain/migrate.js +148 -23
- package/dist/brain/migrate.js.map +1 -1
- package/dist/brain/migrate.test.js +194 -1
- package/dist/brain/migrate.test.js.map +1 -1
- package/dist/channel.js +48 -6
- package/dist/channel.js.map +1 -1
- package/dist/channelDiagnostics.d.ts +53 -0
- package/dist/channelDiagnostics.d.ts.map +1 -1
- package/dist/channelDiagnostics.js +91 -0
- package/dist/channelDiagnostics.js.map +1 -1
- package/dist/channelDiagnostics.test.js +109 -1
- package/dist/channelDiagnostics.test.js.map +1 -1
- package/dist/client.d.ts +17 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +32 -0
- package/dist/client.js.map +1 -1
- package/dist/daemon.js +16 -22
- package/dist/daemon.js.map +1 -1
- package/dist/index.js +36 -3
- package/dist/index.js.map +1 -1
- package/dist/lib/pending-items.d.ts +63 -0
- package/dist/lib/pending-items.d.ts.map +1 -0
- package/dist/lib/pending-items.js +96 -0
- package/dist/lib/pending-items.js.map +1 -0
- package/dist/pinSweep.d.ts +83 -0
- package/dist/pinSweep.d.ts.map +1 -0
- package/dist/pinSweep.js +105 -0
- package/dist/pinSweep.js.map +1 -0
- package/dist/pinSweep.test.d.ts +12 -0
- package/dist/pinSweep.test.d.ts.map +1 -0
- package/dist/pinSweep.test.js +110 -0
- package/dist/pinSweep.test.js.map +1 -0
- package/dist/pinSweepCli.d.ts +20 -0
- package/dist/pinSweepCli.d.ts.map +1 -0
- package/dist/pinSweepCli.js +287 -0
- package/dist/pinSweepCli.js.map +1 -0
- package/dist/run-claude.sh +36 -5
- package/dist/sessionCapture.d.ts.map +1 -1
- package/dist/sessionCapture.js +7 -1
- package/dist/sessionCapture.js.map +1 -1
- package/dist/sessionCapture.test.js +20 -0
- package/dist/sessionCapture.test.js.map +1 -1
- package/dist/setup.js +11 -0
- package/dist/setup.js.map +1 -1
- package/dist/shiftFiles.d.ts +33 -0
- package/dist/shiftFiles.d.ts.map +1 -0
- package/dist/shiftFiles.js +57 -0
- package/dist/shiftFiles.js.map +1 -0
- package/dist/shiftFiles.test.d.ts +2 -0
- package/dist/shiftFiles.test.d.ts.map +1 -0
- package/dist/shiftFiles.test.js +141 -0
- package/dist/shiftFiles.test.js.map +1 -0
- package/dist/skillInstaller.d.ts.map +1 -1
- package/dist/skillInstaller.gate.test.js +2 -0
- package/dist/skillInstaller.gate.test.js.map +1 -1
- package/dist/skillInstaller.js +8 -0
- package/dist/skillInstaller.js.map +1 -1
- package/dist/skillInstaller.test.js +8 -1
- package/dist/skillInstaller.test.js.map +1 -1
- package/dist/tools/goshtiRead.d.ts +72 -0
- package/dist/tools/goshtiRead.d.ts.map +1 -0
- package/dist/tools/goshtiRead.js +274 -0
- package/dist/tools/goshtiRead.js.map +1 -0
- package/dist/tools/goshtiRead.test.d.ts +8 -0
- package/dist/tools/goshtiRead.test.d.ts.map +1 -0
- package/dist/tools/goshtiRead.test.js +182 -0
- package/dist/tools/goshtiRead.test.js.map +1 -0
- package/dist/tools/inboxBounds.d.ts +80 -0
- package/dist/tools/inboxBounds.d.ts.map +1 -0
- package/dist/tools/inboxBounds.js +105 -0
- package/dist/tools/inboxBounds.js.map +1 -0
- package/dist/tools/inboxBounds.test.d.ts +15 -0
- package/dist/tools/inboxBounds.test.d.ts.map +1 -0
- package/dist/tools/inboxBounds.test.js +135 -0
- package/dist/tools/inboxBounds.test.js.map +1 -0
- package/dist/tools/index.d.ts +11 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +79 -18
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/intakeRequests.d.ts +35 -0
- package/dist/tools/intakeRequests.d.ts.map +1 -0
- package/dist/tools/intakeRequests.js +344 -0
- package/dist/tools/intakeRequests.js.map +1 -0
- package/dist/tools/intakeRequests.test.d.ts +8 -0
- package/dist/tools/intakeRequests.test.d.ts.map +1 -0
- package/dist/tools/intakeRequests.test.js +183 -0
- package/dist/tools/intakeRequests.test.js.map +1 -0
- package/dist/tools/pushedItemsSafety.test.d.ts +12 -0
- package/dist/tools/pushedItemsSafety.test.d.ts.map +1 -0
- package/dist/tools/pushedItemsSafety.test.js +179 -0
- package/dist/tools/pushedItemsSafety.test.js.map +1 -0
- package/dist/tools/tools.test.js +17 -5
- package/dist/tools/tools.test.js.map +1 -1
- package/dist/tools/wrapperCost.test.d.ts +13 -0
- package/dist/tools/wrapperCost.test.d.ts.map +1 -0
- package/dist/tools/wrapperCost.test.js +149 -0
- package/dist/tools/wrapperCost.test.js.map +1 -0
- package/dist/websocket.d.ts +30 -1
- package/dist/websocket.d.ts.map +1 -1
- package/dist/websocket.js +40 -3
- package/dist/websocket.js.map +1 -1
- package/dist/websocketQueue.test.d.ts +10 -0
- package/dist/websocketQueue.test.d.ts.map +1 -0
- package/dist/websocketQueue.test.js +78 -0
- package/dist/websocketQueue.test.js.map +1 -0
- package/package.json +4 -4
- package/skills/catalog.json +23 -10
- package/skills/commands/close-session.md +144 -144
- package/skills/commands/start-session.md +25 -6
- package/skills/manifest.json +8 -1
- package/skills/skills/code-brain-hook/SKILL.md +61 -61
- package/skills/skills/file-bug/SKILL.md +75 -75
- package/skills/skills/inbox/SKILL.md +99 -0
- package/skills/skills/multiagent-brainstorm/SKILL.md +164 -164
package/dist/brain/migrate.js
CHANGED
|
@@ -41,12 +41,16 @@ function tempPathFor(dir, agentId) {
|
|
|
41
41
|
* Remove everything a failed attempt leaves behind: the partial brain, and the
|
|
42
42
|
* marker filed under the throwaway id.
|
|
43
43
|
*
|
|
44
|
-
* Best-effort
|
|
45
|
-
*
|
|
44
|
+
* Best-effort, and returns whether the temp brain is actually gone so the
|
|
45
|
+
* caller can report a leftover instead of inferring one. This is the FIRST line
|
|
46
|
+
* of defence only: on Windows the `.mv2` is memory-mapped by tantivy and this
|
|
47
|
+
* `unlinkSync` throws, which is why correctness rests on `clearLeftoverTemp`
|
|
48
|
+
* running before the next attempt writes rather than on this succeeding.
|
|
46
49
|
*/
|
|
47
50
|
function discardTempArtefacts(dir, agentId) {
|
|
51
|
+
const tempPath = tempPathFor(dir, agentId);
|
|
48
52
|
const paths = [
|
|
49
|
-
|
|
53
|
+
tempPath,
|
|
50
54
|
join(dir, `.${tempAgentFor(agentId).replace(/[^a-zA-Z0-9_-]/g, "_")}.write-failed.json`),
|
|
51
55
|
];
|
|
52
56
|
for (const p of paths) {
|
|
@@ -55,9 +59,41 @@ function discardTempArtefacts(dir, agentId) {
|
|
|
55
59
|
unlinkSync(p);
|
|
56
60
|
}
|
|
57
61
|
catch {
|
|
58
|
-
// Locked or already gone. The next attempt
|
|
62
|
+
// Locked or already gone. The next attempt clears it before writing.
|
|
59
63
|
}
|
|
60
64
|
}
|
|
65
|
+
return !existsSync(tempPath);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Make sure the temp brain is gone before anything is written into it.
|
|
69
|
+
*
|
|
70
|
+
* Refusing is the whole point. Appending onto a leftover is precisely what
|
|
71
|
+
* turns one transient failure into a permanent one, so "could not clear" must
|
|
72
|
+
* never degrade into "carry on" — the attempt is abandoned with the journal
|
|
73
|
+
* untouched so the next one can try again.
|
|
74
|
+
*
|
|
75
|
+
* The existence re-check after the unlink is not paranoia: on Windows a delete
|
|
76
|
+
* is accepted while the name stays visible until the last handle drops
|
|
77
|
+
* (delete-on-close), so a successful `unlinkSync` is not proof the file is
|
|
78
|
+
* gone. Catching that here costs one `existsSync`; not catching it produced an
|
|
79
|
+
* unexplainable count mismatch six weeks later.
|
|
80
|
+
*
|
|
81
|
+
* The message is phrased so `isTransientIOFault` classifies it retryable — a
|
|
82
|
+
* mapped file usually becomes deletable within a few hundred milliseconds,
|
|
83
|
+
* which is what the migration backoff is for.
|
|
84
|
+
*/
|
|
85
|
+
function clearLeftoverTemp(tempPath) {
|
|
86
|
+
if (!existsSync(tempPath))
|
|
87
|
+
return;
|
|
88
|
+
try {
|
|
89
|
+
unlinkSync(tempPath);
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
throw new Error(`temp brain ${tempPath} could not be cleared before writing: ${err instanceof Error ? err.message : String(err)}`);
|
|
93
|
+
}
|
|
94
|
+
if (existsSync(tempPath)) {
|
|
95
|
+
throw new Error(`temp brain ${tempPath} could not be cleared before writing: still present after delete`);
|
|
96
|
+
}
|
|
61
97
|
}
|
|
62
98
|
function parseJsonlLines(path) {
|
|
63
99
|
const raw = readFileSync(path, "utf-8");
|
|
@@ -89,16 +125,89 @@ function jsonlEntryToSession(entry) {
|
|
|
89
125
|
outcome: typeof entry.outcome === "string" ? entry.outcome : undefined,
|
|
90
126
|
};
|
|
91
127
|
}
|
|
128
|
+
/**
|
|
129
|
+
* How many times a migration attempt is retried on a transient IO fault, and how
|
|
130
|
+
* long to wait between attempts.
|
|
131
|
+
*
|
|
132
|
+
* The backoff is deliberately short. The fault is transient but not instantly
|
|
133
|
+
* self-healing (an immediate retry recovered 1 in 3, measured), so several
|
|
134
|
+
* closely-spaced attempts beat a few slow ones — and a migration that takes six
|
|
135
|
+
* attempts should still finish in under a second rather than stalling startup.
|
|
136
|
+
*
|
|
137
|
+
* Tunable so a test that forces permanent failure need not pay the full budget.
|
|
138
|
+
*/
|
|
139
|
+
function migrateAttempts() {
|
|
140
|
+
const v = Number(process.env.AGENTHUB_BRAIN_MIGRATE_ATTEMPTS);
|
|
141
|
+
return Number.isFinite(v) && v > 0 ? v : 6;
|
|
142
|
+
}
|
|
143
|
+
const MIGRATE_BACKOFF_MS = 40;
|
|
144
|
+
/**
|
|
145
|
+
* Is this the transient Windows fault that makes an append fail for no reason
|
|
146
|
+
* the caller can fix?
|
|
147
|
+
*
|
|
148
|
+
* Measured on the reference machine: fresh single-session appends fail ~10% of
|
|
149
|
+
* the time (3 in 30, at random positions), and an immediate retry recovered only
|
|
150
|
+
* 1 in 3 — transient, but not instantly self-healing.
|
|
151
|
+
*/
|
|
152
|
+
function isTransientIOFault(message) {
|
|
153
|
+
// `could not be cleared` is the leftover-temp refusal (AGHUB-1332). It is
|
|
154
|
+
// retryable for the same reason as the others: a memory-mapped `.mv2` is
|
|
155
|
+
// briefly undeletable and a delete-on-close name briefly lingers, and both
|
|
156
|
+
// clear within a short backoff. A `count mismatch` deliberately does NOT
|
|
157
|
+
// match — that is a real disagreement about what was written, and retrying it
|
|
158
|
+
// would be retrying a question already answered.
|
|
159
|
+
return /Access is denied|os error 5|Tantivy error|could not be cleared/i.test(message);
|
|
160
|
+
}
|
|
161
|
+
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
92
162
|
/**
|
|
93
163
|
* Migrate a single agent's JSONL brain to memvid. Idempotent.
|
|
164
|
+
*
|
|
165
|
+
* RETRIES, and why that is safe HERE when it is not safe for a normal append.
|
|
166
|
+
*
|
|
167
|
+
* A migration writes every session into a THROWAWAY temp brain, verifies the
|
|
168
|
+
* session count, and only then renames it over the real file. Each attempt
|
|
169
|
+
* CLEARS the temp before writing and refuses to start if it cannot, and a
|
|
170
|
+
* failed attempt leaves the journal unfrozen. That is what makes a retry
|
|
171
|
+
* idempotent and checked.
|
|
172
|
+
*
|
|
173
|
+
* This used to say the failed attempt's own cleanup was what guaranteed the
|
|
174
|
+
* next one "starts from nothing". It did not: that cleanup swallows a failed
|
|
175
|
+
* `unlinkSync`, which on Windows is the common case for a memory-mapped `.mv2`,
|
|
176
|
+
* and the next attempt then appended onto the leftover — making the count check
|
|
177
|
+
* unsatisfiable forever and wedging the agent (AGHUB-1332). The guarantee has
|
|
178
|
+
* to be made by the attempt that is about to write, not by the one that failed.
|
|
179
|
+
*
|
|
180
|
+
* `appendSession` on a real brain is the opposite case: the documented Windows
|
|
181
|
+
* fault can report failure *after* the frame has landed, so retrying there can
|
|
182
|
+
* duplicate a session. That is why there is no retry in the writer, and why
|
|
183
|
+
* `vitest.config.ts` argues against a global test retry — a retry that hides a
|
|
184
|
+
* landed-but-reported-failed write is how a real bug stayed invisible.
|
|
185
|
+
*
|
|
186
|
+
* Without this, a multi-session brain almost never migrates: at ~10% per append,
|
|
187
|
+
* ten sessions succeed about a third of the time.
|
|
94
188
|
*/
|
|
95
189
|
export async function migrateAgent(agentId) {
|
|
190
|
+
const attempts = migrateAttempts();
|
|
191
|
+
let last = null;
|
|
192
|
+
for (let attempt = 1; attempt <= attempts; attempt++) {
|
|
193
|
+
const result = await migrateAgentOnce(agentId);
|
|
194
|
+
if (!result.error || !isTransientIOFault(result.error))
|
|
195
|
+
return result;
|
|
196
|
+
last = result;
|
|
197
|
+
if (attempt < attempts) {
|
|
198
|
+
process.stderr.write(`[brain/migrate] ${agentId}: transient IO fault on attempt ${attempt}/${attempts}, retrying
|
|
199
|
+
`);
|
|
200
|
+
await sleep(attempt * MIGRATE_BACKOFF_MS);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
return last;
|
|
204
|
+
}
|
|
205
|
+
async function migrateAgentOnce(agentId) {
|
|
96
206
|
const started = Date.now();
|
|
97
207
|
const dir = brainsDir();
|
|
98
208
|
const safe = agentId.replace(/[^a-zA-Z0-9_-]/g, "_");
|
|
99
209
|
const jsonlPath = join(dir, `${safe}.jsonl`);
|
|
100
210
|
const mv2Path = join(dir, `${safe}.mv2`);
|
|
101
|
-
const mv2NewPath = join(dir, `${safe}.mv2.new`);
|
|
102
211
|
const result = {
|
|
103
212
|
agentId,
|
|
104
213
|
skipped: false,
|
|
@@ -123,16 +232,27 @@ export async function migrateAgent(agentId) {
|
|
|
123
232
|
return result;
|
|
124
233
|
}
|
|
125
234
|
}
|
|
126
|
-
//
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
235
|
+
// The temp id derives from the AGENT ALONE. It used to carry
|
|
236
|
+
// `Date.now()`, which meant every failed boot minted a new temp file and a
|
|
237
|
+
// new failure marker under an id that could never recur — so nothing could
|
|
238
|
+
// ever clean either up. 58 leftover files and 804 markers, 20 MB, on one
|
|
239
|
+
// machine.
|
|
240
|
+
const tempAgent = tempAgentFor(agentId);
|
|
241
|
+
const tempPath = tempPathFor(dir, agentId);
|
|
242
|
+
// Clear any leftover temp brain from a previous attempt, BEFORE writing.
|
|
243
|
+
//
|
|
244
|
+
// This is load-bearing, not hygiene. The verification below is
|
|
245
|
+
// `finalCount === sessionsWritten`, a CUMULATIVE count against a PER-PASS
|
|
246
|
+
// one, so it means nothing unless the temp starts empty. `appendSession`
|
|
247
|
+
// appends; a stable temp name does not overwrite its own leftover, it grows
|
|
248
|
+
// it. One surviving leftover therefore made the equality unsatisfiable for
|
|
249
|
+
// every future attempt and wedged the agent permanently — 17, 5 and 158
|
|
250
|
+
// accumulated sessions against 1, 1 and 25 written, on one machine
|
|
251
|
+
// (AGHUB-1332).
|
|
252
|
+
//
|
|
253
|
+
// Until this change the cleanup here targeted `<safe>.mv2.new`, a path
|
|
254
|
+
// nothing ever writes to, while the loop below wrote `<agent>__migrating.mv2`.
|
|
255
|
+
clearLeftoverTemp(tempPath);
|
|
136
256
|
const { entries, malformed } = parseJsonlLines(jsonlPath);
|
|
137
257
|
result.sessionsRead = entries.length;
|
|
138
258
|
result.malformedLines = malformed;
|
|
@@ -145,13 +265,6 @@ export async function migrateAgent(agentId) {
|
|
|
145
265
|
// writes to `<safe>.mv2`, so the only way to point it elsewhere is to hand
|
|
146
266
|
// it a different agent id and rename afterwards.
|
|
147
267
|
const brain = new MemvidBrain();
|
|
148
|
-
// The temp id derives from the AGENT ALONE. It used to carry
|
|
149
|
-
// `Date.now()`, which meant every failed boot minted a new temp file and a
|
|
150
|
-
// new failure marker under an id that could never recur — so nothing could
|
|
151
|
-
// ever clean either up. 58 leftover files and 804 markers, 20 MB, on one
|
|
152
|
-
// machine. A stable name overwrites its own leftover instead.
|
|
153
|
-
const tempAgent = tempAgentFor(agentId);
|
|
154
|
-
const tempPath = tempPathFor(dir, agentId);
|
|
155
268
|
for (const entry of entries) {
|
|
156
269
|
const session = jsonlEntryToSession(entry);
|
|
157
270
|
await brain.appendSession(tempAgent, session);
|
|
@@ -181,7 +294,12 @@ export async function migrateAgent(agentId) {
|
|
|
181
294
|
// that cleaned up its temp file; every other failure — which in practice
|
|
182
295
|
// meant every failure — stranded one, plus a marker under an id nothing
|
|
183
296
|
// could ever clear.
|
|
184
|
-
|
|
297
|
+
// A leftover that survives this is no longer fatal — the next attempt
|
|
298
|
+
// clears it before writing (`clearLeftoverTemp`) — but it is worth saying
|
|
299
|
+
// out loud rather than inferring from a later count mismatch.
|
|
300
|
+
if (!discardTempArtefacts(dir, agentId)) {
|
|
301
|
+
process.stderr.write(`[brain/migrate] ${agentId}: temp brain survived cleanup; the next attempt will clear it before writing\n`);
|
|
302
|
+
}
|
|
185
303
|
// File the failure under the REAL agent, so a later successful write for
|
|
186
304
|
// that agent clears it and so anyone reading the directory can tell which
|
|
187
305
|
// agent is affected.
|
|
@@ -214,4 +332,11 @@ export async function migrateAllPending() {
|
|
|
214
332
|
}
|
|
215
333
|
return results;
|
|
216
334
|
}
|
|
335
|
+
/**
|
|
336
|
+
* Exported for tests only: the transient-fault classifier decides whether a
|
|
337
|
+
* failed migration gets another attempt, and it is wrong in both directions —
|
|
338
|
+
* retrying a genuine error wastes six attempts, and not retrying a transient one
|
|
339
|
+
* leaves a brain permanently unmigrated.
|
|
340
|
+
*/
|
|
341
|
+
export const __testables = { isTransientIOFault };
|
|
217
342
|
//# sourceMappingURL=migrate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/brain/migrate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC7F,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAE7B,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAgBxE,SAAS,SAAS;IAChB,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAC9C,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,YAAY,CAAC,OAAe;IACnC,OAAO,GAAG,OAAO,aAAa,CAAC;AACjC,CAAC;AAED,SAAS,WAAW,CAAC,GAAW,EAAE,OAAe;IAC/C,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;AACnF,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/brain/migrate.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Unit tests for JSONL → memvid migration (§1.5 finish-agenthub-v1-backlog).
|
|
3
3
|
*/
|
|
4
4
|
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
5
|
-
import { mkdtempSync, mkdirSync, rmSync, writeFileSync, readFileSync, existsSync, readdirSync, } from "fs";
|
|
5
|
+
import { mkdtempSync, mkdirSync, rmSync, writeFileSync, readFileSync, existsSync, readdirSync, utimesSync, } from "fs";
|
|
6
6
|
import { tmpdir } from "os";
|
|
7
7
|
import { join } from "path";
|
|
8
8
|
let tempHome;
|
|
@@ -275,4 +275,197 @@ describe("migrateAgent leaves nothing behind when it fails", () => {
|
|
|
275
275
|
expect(tempFilesFor(agent)).toEqual([]);
|
|
276
276
|
});
|
|
277
277
|
});
|
|
278
|
+
// fix-brain-session-count §5 — the retry that unsticks a real brain.
|
|
279
|
+
describe("transient IO faults", () => {
|
|
280
|
+
it("classifies the Windows fault as transient and other errors as not", async () => {
|
|
281
|
+
const { __testables } = await import("./migrate.js");
|
|
282
|
+
// Only exported for this assertion; the classifier decides whether a failed
|
|
283
|
+
// migration is worth another attempt, and misclassifying either way is bad:
|
|
284
|
+
// retrying a real error wastes six attempts, not retrying a transient one
|
|
285
|
+
// leaves a brain permanently unmigrated.
|
|
286
|
+
expect(__testables.isTransientIOFault("Tantivy error: An IO error occurred: 'Access is denied. (os error 5)'")).toBe(true);
|
|
287
|
+
expect(__testables.isTransientIOFault("count mismatch: wrote 3 but .mv2 reports 25")).toBe(false);
|
|
288
|
+
expect(__testables.isTransientIOFault("leftover could not be removed")).toBe(false);
|
|
289
|
+
});
|
|
290
|
+
});
|
|
291
|
+
/**
|
|
292
|
+
* The leftover wedge (fix-brain-migration-leftover, AGHUB-1332).
|
|
293
|
+
*
|
|
294
|
+
* `migrateAgentOnce` verifies `finalCount === sessionsWritten` before renaming
|
|
295
|
+
* the temp brain over the real one. That compares a CUMULATIVE count against a
|
|
296
|
+
* PER-PASS count, so it only means anything if the temp starts empty.
|
|
297
|
+
*
|
|
298
|
+
* It did not. The pre-loop cleanup deleted `<safe>.mv2.new` — a path nothing
|
|
299
|
+
* ever writes to — while the write loop wrote `<agent>__migrating.mv2`, which
|
|
300
|
+
* was only ever removed by the best-effort cleanup in the `catch`. That cleanup
|
|
301
|
+
* swallows a failed `unlinkSync`, which on Windows is the common case for a
|
|
302
|
+
* memory-mapped `.mv2`. The next attempt then appended onto the leftover and the
|
|
303
|
+
* equality became unsatisfiable FOREVER.
|
|
304
|
+
*
|
|
305
|
+
* Observed live 2026-09-12: "wrote 1 but .mv2 reports 17" (17 accumulated
|
|
306
|
+
* attempts), "wrote 1 but reports 5", "wrote 25 but reports 158". One of the
|
|
307
|
+
* three, `sumit-lordclaw`, was a perfectly healthy brain.
|
|
308
|
+
*
|
|
309
|
+
* These tests model the temp brain the way it really behaves — an append adds a
|
|
310
|
+
* session, a count reads the file's total — because the accumulation IS the bug.
|
|
311
|
+
* A fake that ignores prior content cannot fail here.
|
|
312
|
+
*/
|
|
313
|
+
describe("a leftover temp brain never wedges a migration", () => {
|
|
314
|
+
beforeEach(() => {
|
|
315
|
+
tempHome = mkdtempSync(join(tmpdir(), "memvid-migrate-wedge-"));
|
|
316
|
+
process.env.__TEST_HOME__ = tempHome;
|
|
317
|
+
});
|
|
318
|
+
afterEach(() => {
|
|
319
|
+
vi.doUnmock("./memvidBrain.js");
|
|
320
|
+
vi.doUnmock("fs");
|
|
321
|
+
vi.resetModules();
|
|
322
|
+
try {
|
|
323
|
+
rmSync(tempHome, { recursive: true, force: true });
|
|
324
|
+
}
|
|
325
|
+
catch {
|
|
326
|
+
// best effort
|
|
327
|
+
}
|
|
328
|
+
delete process.env.__TEST_HOME__;
|
|
329
|
+
});
|
|
330
|
+
const safe = (id) => id.replace(/[^a-zA-Z0-9_-]/g, "_");
|
|
331
|
+
const tempPathOf = (agent) => join(brainsDirIn(tempHome), `${safe(agent)}__migrating.mv2`);
|
|
332
|
+
/** Sessions the fake brain has stored at a path, one per line. */
|
|
333
|
+
function sessionsAt(path) {
|
|
334
|
+
if (!existsSync(path))
|
|
335
|
+
return [];
|
|
336
|
+
return readFileSync(path, "utf-8").split("\n").filter(Boolean);
|
|
337
|
+
}
|
|
338
|
+
/** Plant a leftover temp brain holding `n` sessions, as a failed attempt would. */
|
|
339
|
+
function plantLeftover(agent, n) {
|
|
340
|
+
const dir = brainsDirIn(tempHome);
|
|
341
|
+
mkdirSync(dir, { recursive: true });
|
|
342
|
+
writeFileSync(tempPathOf(agent), Array.from({ length: n }, (_, i) => `stale-session-${i + 1}`).join("\n") + "\n", "utf-8");
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* A brain that APPENDS, and counts what is on disk. Records what each append
|
|
346
|
+
* saw so a test can assert the leftover was gone *before* the first write, not
|
|
347
|
+
* merely gone by the end.
|
|
348
|
+
*/
|
|
349
|
+
async function withAppendingBrain() {
|
|
350
|
+
const seenAtFirstAppend = { value: null };
|
|
351
|
+
const real = await vi.importActual("./memvidBrain.js");
|
|
352
|
+
vi.doMock("./memvidBrain.js", () => ({
|
|
353
|
+
...real,
|
|
354
|
+
MemvidBrain: class {
|
|
355
|
+
async appendSession(agentId, session) {
|
|
356
|
+
const dir = brainsDirIn(tempHome);
|
|
357
|
+
mkdirSync(dir, { recursive: true });
|
|
358
|
+
const p = join(dir, `${safe(agentId)}.mv2`);
|
|
359
|
+
const existing = sessionsAt(p);
|
|
360
|
+
if (seenAtFirstAppend.value === null)
|
|
361
|
+
seenAtFirstAppend.value = existing;
|
|
362
|
+
writeFileSync(p, [...existing, `session:${session?.summary ?? "?"}`].join("\n") + "\n", "utf-8");
|
|
363
|
+
return existing.length + 1;
|
|
364
|
+
}
|
|
365
|
+
async getSessionCount(agentId) {
|
|
366
|
+
return sessionsAt(join(brainsDirIn(tempHome), `${safe(agentId)}.mv2`)).length;
|
|
367
|
+
}
|
|
368
|
+
},
|
|
369
|
+
}));
|
|
370
|
+
vi.resetModules();
|
|
371
|
+
return { migrate: await import("./migrate.js"), seenAtFirstAppend };
|
|
372
|
+
}
|
|
373
|
+
// 1.1 — the wedge itself. On the unfixed code this fails with
|
|
374
|
+
// "count mismatch: wrote 1 but .mv2 reports 4".
|
|
375
|
+
it("migrates even when a previous attempt left a temp brain behind", async () => {
|
|
376
|
+
const agent = "wedged";
|
|
377
|
+
seedJsonl(agent, [{ session_number: 1, summary: "only", content: "c" }]);
|
|
378
|
+
plantLeftover(agent, 3);
|
|
379
|
+
const { migrate } = await withAppendingBrain();
|
|
380
|
+
const r = await migrate.migrateAgent(agent);
|
|
381
|
+
expect(r.error).toBeUndefined();
|
|
382
|
+
expect(r.sessionsWritten).toBe(1);
|
|
383
|
+
expect(r.frozenPath).toBeDefined();
|
|
384
|
+
// The migrated brain holds this journal's one session — not the stale three.
|
|
385
|
+
expect(sessionsAt(join(brainsDirIn(tempHome), `${safe(agent)}.mv2`))).toEqual(["session:only"]);
|
|
386
|
+
});
|
|
387
|
+
// 1.2 — the leftover must be gone BEFORE the first write, not cleaned up after.
|
|
388
|
+
// A fix that deletes it at the wrong moment still corrupts the count.
|
|
389
|
+
it("clears the leftover before writing the first session", async () => {
|
|
390
|
+
const agent = "wedged-order";
|
|
391
|
+
seedJsonl(agent, [{ session_number: 1, summary: "only", content: "c" }]);
|
|
392
|
+
plantLeftover(agent, 3);
|
|
393
|
+
const { migrate, seenAtFirstAppend } = await withAppendingBrain();
|
|
394
|
+
await migrate.migrateAgent(agent);
|
|
395
|
+
expect(seenAtFirstAppend.value).toEqual([]);
|
|
396
|
+
});
|
|
397
|
+
// 1.3 — refusing is the point. Appending onto a leftover is what makes one
|
|
398
|
+
// transient failure permanent, so "could not clear" must not degrade into
|
|
399
|
+
// "carry on".
|
|
400
|
+
it("fails the attempt, writing nothing, when the leftover cannot be removed", async () => {
|
|
401
|
+
const agent = "wedged-locked";
|
|
402
|
+
const dir = brainsDirIn(tempHome);
|
|
403
|
+
mkdirSync(dir, { recursive: true });
|
|
404
|
+
// Written BEFORE the journal, so the journal is newer and migration runs.
|
|
405
|
+
// Seeded the other way round it skips as "mv2 up-to-date" and the test
|
|
406
|
+
// passes without exercising anything — which is exactly what it did first.
|
|
407
|
+
writeFileSync(join(dir, `${safe(agent)}.mv2`), "the existing brain", "utf-8");
|
|
408
|
+
seedJsonl(agent, [{ session_number: 1, summary: "only", content: "c" }]);
|
|
409
|
+
// Write order alone is not enough. The skip is `mv2.mtime >= jsonl.mtime`,
|
|
410
|
+
// and two writes in the same millisecond tie — so the migration skipped as
|
|
411
|
+
// "mv2 up-to-date" and this test went green without exercising anything, on
|
|
412
|
+
// roughly one full-suite run in two. Backdate explicitly.
|
|
413
|
+
const old = new Date(Date.now() - 60_000);
|
|
414
|
+
utimesSync(join(dir, `${safe(agent)}.mv2`), old, old);
|
|
415
|
+
plantLeftover(agent, 3);
|
|
416
|
+
const actualFs = await vi.importActual("fs");
|
|
417
|
+
vi.doMock("fs", () => ({
|
|
418
|
+
...actualFs,
|
|
419
|
+
default: actualFs,
|
|
420
|
+
unlinkSync: (p) => {
|
|
421
|
+
if (String(p).includes("__migrating"))
|
|
422
|
+
throw new Error("EBUSY: resource busy or locked");
|
|
423
|
+
return actualFs.unlinkSync(p);
|
|
424
|
+
},
|
|
425
|
+
}));
|
|
426
|
+
const { migrate } = await withAppendingBrain();
|
|
427
|
+
const r = await migrate.migrateAgent(agent);
|
|
428
|
+
expect(r.error).toBeDefined();
|
|
429
|
+
expect(r.error).toContain("__migrating");
|
|
430
|
+
expect(r.sessionsWritten).toBe(0);
|
|
431
|
+
// Nothing appended onto the leftover — it still holds exactly the stale three.
|
|
432
|
+
expect(sessionsAt(tempPathOf(agent))).toHaveLength(3);
|
|
433
|
+
// The journal survives so a later attempt can retry from the original data.
|
|
434
|
+
expect(existsSync(join(dir, `${agent}.jsonl`))).toBe(true);
|
|
435
|
+
expect(r.frozenPath).toBeUndefined();
|
|
436
|
+
// The real brain is untouched.
|
|
437
|
+
expect(readFileSync(join(dir, `${safe(agent)}.mv2`), "utf-8")).toBe("the existing brain");
|
|
438
|
+
});
|
|
439
|
+
// 1.4 — Windows delete-on-close leaves the NAME visible until the last handle
|
|
440
|
+
// drops, so a delete that "succeeds" is not proof the file is gone.
|
|
441
|
+
it("fails the attempt when the leftover survives its own deletion", async () => {
|
|
442
|
+
const agent = "wedged-lingering";
|
|
443
|
+
seedJsonl(agent, [{ session_number: 1, summary: "only", content: "c" }]);
|
|
444
|
+
plantLeftover(agent, 3);
|
|
445
|
+
const actualFs = await vi.importActual("fs");
|
|
446
|
+
vi.doMock("fs", () => ({
|
|
447
|
+
...actualFs,
|
|
448
|
+
default: actualFs,
|
|
449
|
+
// Reports success and deletes nothing.
|
|
450
|
+
unlinkSync: (p) => {
|
|
451
|
+
if (String(p).includes("__migrating"))
|
|
452
|
+
return undefined;
|
|
453
|
+
return actualFs.unlinkSync(p);
|
|
454
|
+
},
|
|
455
|
+
}));
|
|
456
|
+
const { migrate } = await withAppendingBrain();
|
|
457
|
+
const r = await migrate.migrateAgent(agent);
|
|
458
|
+
expect(r.error).toBeDefined();
|
|
459
|
+
expect(r.sessionsWritten).toBe(0);
|
|
460
|
+
expect(sessionsAt(tempPathOf(agent))).toHaveLength(3);
|
|
461
|
+
});
|
|
462
|
+
// The refusal is worth retrying: a mapped file usually becomes deletable
|
|
463
|
+
// within a few hundred ms, which is exactly what the backoff is for.
|
|
464
|
+
it("classifies an uncleared leftover as transient so the backoff retries it", async () => {
|
|
465
|
+
const { __testables } = await import("./migrate.js");
|
|
466
|
+
expect(__testables.isTransientIOFault("temp brain x__migrating.mv2 could not be cleared before writing")).toBe(true);
|
|
467
|
+
// A count mismatch is still a real disagreement, not something to retry.
|
|
468
|
+
expect(__testables.isTransientIOFault("count mismatch: wrote 3 but .mv2 reports 25")).toBe(false);
|
|
469
|
+
});
|
|
470
|
+
});
|
|
278
471
|
//# sourceMappingURL=migrate.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrate.test.js","sourceRoot":"","sources":["../../src/brain/migrate.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"migrate.test.js","sourceRoot":"","sources":["../../src/brain/migrate.test.ts"],"names":[],"mappings":"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"}
|
package/dist/channel.js
CHANGED
|
@@ -22,7 +22,7 @@ import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextpro
|
|
|
22
22
|
import WebSocket from "ws";
|
|
23
23
|
import { buildSteerTurnContent, parseSteerFrame, sessionSteerEnabled } from "./streamingRuntimeLib.js";
|
|
24
24
|
import * as state from "./state.js";
|
|
25
|
-
import { channelSocketHeaders, describeChannelFailure, shouldNotifySession, sessionFailureNotice, } from "./channelDiagnostics.js";
|
|
25
|
+
import { channelSocketHeaders, channelFailureMeta, describeChannelFailure, shouldNotifySession, sessionFailureNotice, missingIdentity, describeMissingIdentity, missingIdentityNotice, missingIdentityMeta, } from "./channelDiagnostics.js";
|
|
26
26
|
// =============================================================================
|
|
27
27
|
// Config
|
|
28
28
|
// =============================================================================
|
|
@@ -291,7 +291,17 @@ function connectWebSocket() {
|
|
|
291
291
|
ws?.send(JSON.stringify({ type: "ack", message_id: m.id, timestamp: new Date().toISOString() }));
|
|
292
292
|
return;
|
|
293
293
|
}
|
|
294
|
-
// ACK the message
|
|
294
|
+
// ACK the message.
|
|
295
|
+
//
|
|
296
|
+
// This fires BEFORE the notification below is awaited, so a failed
|
|
297
|
+
// injection acks a message nobody saw. That is harmless *only* because
|
|
298
|
+
// the server's `ack` handler is a debug log and writes no message
|
|
299
|
+
// status (`server/internal/hub/websocket.go`, `case WSTypeAck`). If you
|
|
300
|
+
// ever give that handler a body — marking the message delivered or read
|
|
301
|
+
// — move this send to AFTER a successful notification, or you
|
|
302
|
+
// reintroduce the acked-but-never-delivered shape that lost four of
|
|
303
|
+
// krishi-dev's messages on 2026-10-14
|
|
304
|
+
// (fix-inbox-delivery-and-tool-wrapping, AGHUB-1426).
|
|
295
305
|
ws?.send(JSON.stringify({ type: "ack", message_id: m.id, timestamp: new Date().toISOString() }));
|
|
296
306
|
// Emit channel notification — this injects into the active session
|
|
297
307
|
const priority = m.priority === "urgent" ? " [URGENT]" : m.priority === "high" ? " [HIGH]" : "";
|
|
@@ -375,7 +385,7 @@ function reportFailure(url, status, error) {
|
|
|
375
385
|
method: "notifications/claude/channel",
|
|
376
386
|
params: {
|
|
377
387
|
content: sessionFailureNotice(failure),
|
|
378
|
-
meta:
|
|
388
|
+
meta: channelFailureMeta(failure),
|
|
379
389
|
},
|
|
380
390
|
})
|
|
381
391
|
.catch(() => { });
|
|
@@ -394,10 +404,42 @@ function scheduleReconnect() {
|
|
|
394
404
|
async function main() {
|
|
395
405
|
const transport = new StdioServerTransport();
|
|
396
406
|
await server.connect(transport);
|
|
397
|
-
// Connect WebSocket after MCP is ready
|
|
398
|
-
|
|
399
|
-
|
|
407
|
+
// Connect WebSocket after MCP is ready.
|
|
408
|
+
//
|
|
409
|
+
// A missing identity is REPORTED, not skipped. This used to be a bare
|
|
410
|
+
// `if (AGENT_ID && API_KEY)` with no else, which made a misconfigured channel
|
|
411
|
+
// indistinguishable from a healthy idle one: the MCP server is up, the tools
|
|
412
|
+
// are registered, and the instructions block above already claims a
|
|
413
|
+
// connection. The plugin form made this state reachable in practice — its
|
|
414
|
+
// manifest names these as `${...}` references for the launcher to supply.
|
|
415
|
+
const missing = missingIdentity({ agentId: AGENT_ID, apiKey: API_KEY, url: API_URL });
|
|
416
|
+
if (missing.length > 0) {
|
|
417
|
+
reportMissingIdentity();
|
|
418
|
+
return;
|
|
400
419
|
}
|
|
420
|
+
connectWebSocket();
|
|
421
|
+
}
|
|
422
|
+
/**
|
|
423
|
+
* Say — to stderr and into the session — that this channel has no identity and
|
|
424
|
+
* will deliver nothing.
|
|
425
|
+
*
|
|
426
|
+
* Both, for the same reason a transport failure reports both: stderr is where an
|
|
427
|
+
* MCP server's diagnostics are visible without disturbing the stdio protocol, and
|
|
428
|
+
* the person who needs to know is not reading logs.
|
|
429
|
+
*/
|
|
430
|
+
function reportMissingIdentity() {
|
|
431
|
+
const id = { agentId: AGENT_ID, apiKey: API_KEY, url: API_URL };
|
|
432
|
+
process.stderr.write(`${describeMissingIdentity(id)}\n`);
|
|
433
|
+
// Best effort, and never fatal: failing to report a failure must not throw.
|
|
434
|
+
void server
|
|
435
|
+
.notification({
|
|
436
|
+
method: "notifications/claude/channel",
|
|
437
|
+
params: {
|
|
438
|
+
content: missingIdentityNotice(id),
|
|
439
|
+
meta: missingIdentityMeta(id),
|
|
440
|
+
},
|
|
441
|
+
})
|
|
442
|
+
.catch(() => { });
|
|
401
443
|
}
|
|
402
444
|
main().catch(() => process.exit(1));
|
|
403
445
|
//# sourceMappingURL=channel.js.map
|