@relayburn/mcp 1.9.0 → 2.0.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/CHANGELOG.md +6 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js.map +1 -1
- package/package.json +2 -5
- package/dist/tools/archive-backed.test.d.ts +0 -2
- package/dist/tools/archive-backed.test.d.ts.map +0 -1
- package/dist/tools/archive-backed.test.js +0 -139
- package/dist/tools/archive-backed.test.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,12 @@ All notable changes to `@relayburn/mcp`.
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [2.0.0] - 2026-05-07
|
|
8
|
+
|
|
9
|
+
### Changed
|
|
10
|
+
|
|
11
|
+
- Drop `@relayburn/{reader, ledger, analyze}` from MCP entirely; `@relayburn/sdk` is now the only `@relayburn/*` package edge.
|
|
12
|
+
|
|
7
13
|
## [1.9.0] - 2026-05-03
|
|
8
14
|
|
|
9
15
|
### Changed
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAGlB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IAGnC,MAAM,EAAE,MAAM,CAAC;CAChB;AAUD,wBAAgB,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,oBAAoB,CAYnF"}
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAaA,0EAA0E;AAC1E,yEAAyE;AACzE,yEAAyE;AACzE,sEAAsE;AACtE,EAAE;AACF,0EAA0E;AAC1E,2EAA2E;AAC3E,8DAA8D;AAC9D,MAAM,UAAU,cAAc,CAAC,OAA8B;IAC3D,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC;IAC1C,MAAM,MAAM,GAAG;QACb,UAAU,EAAE;YACV,IAAI,EAAE;gBACJ,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,OAAO;gBAChB,IAAI,EAAE,CAAC,YAAY,EAAE,cAAc,EAAE,OAAO,CAAC,SAAS,CAAC;aACxD;SACF;KACF,CAAC;IACF,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;AAC5C,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@relayburn/mcp",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "MCP (Model Context Protocol) server exposing read-only relayburn ledger queries for in-session self-query",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -19,10 +19,7 @@
|
|
|
19
19
|
"node": ">=22"
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"@relayburn/
|
|
23
|
-
"@relayburn/ledger": "1.9.0",
|
|
24
|
-
"@relayburn/sdk": "1.9.0",
|
|
25
|
-
"@relayburn/analyze": "1.9.0"
|
|
22
|
+
"@relayburn/sdk": "1.10.0"
|
|
26
23
|
},
|
|
27
24
|
"repository": {
|
|
28
25
|
"type": "git",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"archive-backed.test.d.ts","sourceRoot":"","sources":["../../src/tools/archive-backed.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
import { strict as assert } from 'node:assert';
|
|
2
|
-
import { mkdtemp, rm, writeFile } from 'node:fs/promises';
|
|
3
|
-
import { tmpdir } from 'node:os';
|
|
4
|
-
import * as path from 'node:path';
|
|
5
|
-
import { after, before, beforeEach, describe, it } from 'node:test';
|
|
6
|
-
import { __resetIndexCacheForTesting, appendTurns, archivePath, buildArchive, } from '@relayburn/ledger';
|
|
7
|
-
import { createSessionCostTool } from './session-cost.js';
|
|
8
|
-
// Verifies the archive-backed default `queryTurns` path that issue #97 wires
|
|
9
|
-
// onto MCP tool handlers — including the transparent fallback to `queryAll`
|
|
10
|
-
// when the archive cannot be opened or queried.
|
|
11
|
-
function fakeTurn(overrides = {}) {
|
|
12
|
-
return {
|
|
13
|
-
v: 1,
|
|
14
|
-
source: 'claude-code',
|
|
15
|
-
sessionId: 's-cost',
|
|
16
|
-
messageId: 'm-1',
|
|
17
|
-
turnIndex: 0,
|
|
18
|
-
ts: '2026-04-24T10:00:00.000Z',
|
|
19
|
-
model: 'claude-sonnet-4-5',
|
|
20
|
-
usage: {
|
|
21
|
-
input: 1_000_000,
|
|
22
|
-
output: 0,
|
|
23
|
-
reasoning: 0,
|
|
24
|
-
cacheRead: 0,
|
|
25
|
-
cacheCreate5m: 0,
|
|
26
|
-
cacheCreate1h: 0,
|
|
27
|
-
},
|
|
28
|
-
toolCalls: [],
|
|
29
|
-
project: '/tmp/project',
|
|
30
|
-
...overrides,
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
describe('MCP tool handlers backed by archive (issue #97)', () => {
|
|
34
|
-
let tmpDir;
|
|
35
|
-
const originalHome = process.env['RELAYBURN_HOME'];
|
|
36
|
-
before(async () => {
|
|
37
|
-
tmpDir = await mkdtemp(path.join(tmpdir(), 'relayburn-mcp-archive-'));
|
|
38
|
-
});
|
|
39
|
-
beforeEach(async () => {
|
|
40
|
-
await rm(tmpDir, { recursive: true, force: true });
|
|
41
|
-
tmpDir = await mkdtemp(path.join(tmpdir(), 'relayburn-mcp-archive-'));
|
|
42
|
-
process.env['RELAYBURN_HOME'] = tmpDir;
|
|
43
|
-
__resetIndexCacheForTesting();
|
|
44
|
-
});
|
|
45
|
-
after(async () => {
|
|
46
|
-
if (originalHome !== undefined) {
|
|
47
|
-
process.env['RELAYBURN_HOME'] = originalHome;
|
|
48
|
-
}
|
|
49
|
-
else {
|
|
50
|
-
delete process.env['RELAYBURN_HOME'];
|
|
51
|
-
}
|
|
52
|
-
await rm(tmpDir, { recursive: true, force: true });
|
|
53
|
-
});
|
|
54
|
-
describe('burn__sessionCost', () => {
|
|
55
|
-
it('returns the same total whether the data is read from archive or ledger', async () => {
|
|
56
|
-
// Same fixture, identical pricing — archive-backed query should be
|
|
57
|
-
// bit-equivalent to the ledger-walk implementation it replaces.
|
|
58
|
-
await appendTurns([
|
|
59
|
-
fakeTurn(),
|
|
60
|
-
fakeTurn({
|
|
61
|
-
messageId: 'm-2',
|
|
62
|
-
turnIndex: 1,
|
|
63
|
-
usage: {
|
|
64
|
-
input: 0,
|
|
65
|
-
output: 1_000_000,
|
|
66
|
-
reasoning: 0,
|
|
67
|
-
cacheRead: 0,
|
|
68
|
-
cacheCreate5m: 0,
|
|
69
|
-
cacheCreate1h: 0,
|
|
70
|
-
},
|
|
71
|
-
}),
|
|
72
|
-
]);
|
|
73
|
-
await buildArchive();
|
|
74
|
-
const tool = createSessionCostTool({
|
|
75
|
-
defaultSessionId: 's-cost',
|
|
76
|
-
});
|
|
77
|
-
const result = (await tool.handler({}));
|
|
78
|
-
assert.equal(result.sessionId, 's-cost');
|
|
79
|
-
assert.equal(result.turnCount, 2);
|
|
80
|
-
assert.equal(result.totalTokens, 2_000_000);
|
|
81
|
-
// 1M input @ $3/M + 1M output @ $15/M = $18.
|
|
82
|
-
assert.equal(result.totalUSD, 18);
|
|
83
|
-
assert.deepEqual(result.models, ['claude-sonnet-4-5']);
|
|
84
|
-
});
|
|
85
|
-
it('reflects ledger turns appended after the initial archive build', async () => {
|
|
86
|
-
// Hooks append to the JSONL ledger throughout a session but the archive
|
|
87
|
-
// is only built on demand. The default queryTurns lambda runs an
|
|
88
|
-
// incremental buildArchive before each query so a tool call after a
|
|
89
|
-
// hook fires reflects the new turns (Devin review on #97).
|
|
90
|
-
await appendTurns([fakeTurn()]);
|
|
91
|
-
await buildArchive();
|
|
92
|
-
// Simulate a hook firing mid-session: a new turn is appended after the
|
|
93
|
-
// initial build but no explicit rebuild has been triggered.
|
|
94
|
-
await appendTurns([
|
|
95
|
-
fakeTurn({
|
|
96
|
-
messageId: 'm-2',
|
|
97
|
-
turnIndex: 1,
|
|
98
|
-
ts: '2026-04-24T10:05:00.000Z',
|
|
99
|
-
usage: {
|
|
100
|
-
input: 0,
|
|
101
|
-
output: 1_000_000,
|
|
102
|
-
reasoning: 0,
|
|
103
|
-
cacheRead: 0,
|
|
104
|
-
cacheCreate5m: 0,
|
|
105
|
-
cacheCreate1h: 0,
|
|
106
|
-
},
|
|
107
|
-
}),
|
|
108
|
-
]);
|
|
109
|
-
const tool = createSessionCostTool({
|
|
110
|
-
defaultSessionId: 's-cost',
|
|
111
|
-
});
|
|
112
|
-
const result = (await tool.handler({}));
|
|
113
|
-
assert.equal(result.turnCount, 2);
|
|
114
|
-
assert.equal(result.totalTokens, 2_000_000);
|
|
115
|
-
// 1M input @ $3/M + 1M output @ $15/M = $18.
|
|
116
|
-
assert.equal(result.totalUSD, 18);
|
|
117
|
-
});
|
|
118
|
-
it('falls back to queryAll and logs when the archive cannot be opened', async () => {
|
|
119
|
-
await appendTurns([fakeTurn()]);
|
|
120
|
-
// Don't build the archive. Then corrupt the archive file so
|
|
121
|
-
// openArchive() throws once it tries to read the SQLite header. The
|
|
122
|
-
// tool should swallow the error, route to queryAll, and still return
|
|
123
|
-
// the same numbers.
|
|
124
|
-
await writeFile(archivePath(), 'this is not a sqlite database', 'utf8');
|
|
125
|
-
const logs = [];
|
|
126
|
-
const tool = createSessionCostTool({
|
|
127
|
-
defaultSessionId: 's-cost',
|
|
128
|
-
onLog: (m) => logs.push(m),
|
|
129
|
-
});
|
|
130
|
-
const result = (await tool.handler({}));
|
|
131
|
-
assert.equal(result.turnCount, 1);
|
|
132
|
-
assert.equal(result.totalTokens, 1_000_000);
|
|
133
|
-
// 1M input @ $3/M = $3.
|
|
134
|
-
assert.equal(result.totalUSD, 3);
|
|
135
|
-
assert.ok(logs.some((m) => /archive query failed/.test(m)), `expected an archive-fallback log line, got: ${JSON.stringify(logs)}`);
|
|
136
|
-
});
|
|
137
|
-
});
|
|
138
|
-
});
|
|
139
|
-
//# sourceMappingURL=archive-backed.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"archive-backed.test.js","sourceRoot":"","sources":["../../src/tools/archive-backed.test.ts"],"names":[],"mappings":"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"}
|