@relayhistory/capture 0.0.0 → 0.18.8
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 +94 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +84 -0
- package/dist/cli.js.map +1 -0
- package/dist/cloud-client.d.ts +225 -0
- package/dist/cloud-client.d.ts.map +1 -0
- package/dist/cloud-client.js +276 -0
- package/dist/cloud-client.js.map +1 -0
- package/dist/helper.d.ts +29 -0
- package/dist/helper.d.ts.map +1 -0
- package/dist/helper.js +159 -0
- package/dist/helper.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin.d.ts +100 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +452 -0
- package/dist/plugin.js.map +1 -0
- package/dist/plugin.test.d.ts +2 -0
- package/dist/plugin.test.d.ts.map +1 -0
- package/dist/plugin.test.js +295 -0
- package/dist/plugin.test.js.map +1 -0
- package/package.json +55 -3
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { createHash } from 'node:crypto';
|
|
3
|
+
import { mkdtemp, writeFile, chmod, rm } from 'node:fs/promises';
|
|
4
|
+
import { tmpdir } from 'node:os';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import test from 'node:test';
|
|
7
|
+
import { HistoryPluginRegistry, HistoryDeliveryError, RelayHistoryError, hydrateSession, getSessionEventsPage, } from 'ai-hist';
|
|
8
|
+
import { createHistoryPlugin, projectDeliveredTranscript, relayHistoryDestination, relayHistoryInstance, getSessionThreadWithHistory, relayHistorySource, } from './plugin.js';
|
|
9
|
+
const account = 'relayhistory:' +
|
|
10
|
+
createHash('sha256')
|
|
11
|
+
.update(JSON.stringify(['org-fixture', 'workspace-fixture']))
|
|
12
|
+
.digest('hex');
|
|
13
|
+
function record(kind, id, payload) {
|
|
14
|
+
return {
|
|
15
|
+
schema_version: 1,
|
|
16
|
+
origin_id: 'origin-fixture',
|
|
17
|
+
record_id: id,
|
|
18
|
+
revision_id: 'revision-' + id,
|
|
19
|
+
revision: 1,
|
|
20
|
+
kind,
|
|
21
|
+
source: 'claude',
|
|
22
|
+
session_id: 'session-fixture',
|
|
23
|
+
operation: 'upsert',
|
|
24
|
+
payload: {
|
|
25
|
+
source: 'claude',
|
|
26
|
+
session_id: 'session-fixture',
|
|
27
|
+
...payload,
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
const records = [
|
|
32
|
+
record('session_event', 'a', {
|
|
33
|
+
event_uid: 'later',
|
|
34
|
+
ts_ms: 20,
|
|
35
|
+
role: 'assistant',
|
|
36
|
+
text: 'answer',
|
|
37
|
+
}),
|
|
38
|
+
record('history', 'b', { timestamp_ms: 10, prompt: 'question' }),
|
|
39
|
+
record('session_event', 'z', { event_uid: 'earlier', ts_ms: 10, role: 'user', text: 'question' }),
|
|
40
|
+
record('tool_call', 'tool', { args_json: '{"path":"fixture.ts"}' }),
|
|
41
|
+
record('file_edit', 'edit', { patches: '[{"patch":"+fixture"}]' }),
|
|
42
|
+
];
|
|
43
|
+
/** Answers the delivery operations the way the real Rust helper does: its
|
|
44
|
+
* receiver applies the legacy-scheduler, account and instance guards before it
|
|
45
|
+
* maps or sends anything, so these tests still assert user-visible behaviour.
|
|
46
|
+
* Nothing past those guards is emulated. */
|
|
47
|
+
async function fixtureHelper(t, state = 'clear', recordsPath) {
|
|
48
|
+
const dir = await mkdtemp(join(tmpdir(), 'rh-plugin-fixture-'));
|
|
49
|
+
t.after(() => rm(dir, { recursive: true, force: true }));
|
|
50
|
+
const path = join(dir, 'helper');
|
|
51
|
+
await writeFile(path, `#!${process.execPath}\nlet input='';process.stdin.on('data',chunk=>input+=chunk);process.stdin.on('end',()=>{const request=JSON.parse(input);let value;switch(request.operation){case 'deliveryMigrationStatus':value={state:${JSON.stringify(state)},jobs:[]};break;case 'deliveryRead':if(request.args.readOptions.expectedAccount!==${JSON.stringify(account)}){process.stdout.write(JSON.stringify({version:1,ok:false,error:{code:'DELIVERY_PERMISSION_DENIED'}}));return;}value={protocolVersion:1,listing:'live',records:${recordsPath ? `JSON.parse(require('node:fs').readFileSync(${JSON.stringify(recordsPath)},'utf8'))` : JSON.stringify(records)},nextCursor:null};break;case 'deliveryPrepare':case 'deliverySend':{const state=${JSON.stringify(state)};if(state==='active'||(state==='unknown'&&request.args.acknowledgeUninspectedSchedules!==true)){process.stdout.write(JSON.stringify({version:1,ok:false,error:{code:'DELIVERY_PERMISSION_DENIED'}}));return;}if(request.args.expectedAccount&&request.args.batch.account_id!==request.args.expectedAccount){process.stdout.write(JSON.stringify({version:1,ok:false,error:{code:'DELIVERY_PERMISSION_DENIED'}}));return;}if(request.args.instanceId&&request.args.batch.instance_id!==request.args.instanceId){process.stdout.write(JSON.stringify({version:1,ok:false,error:{code:'DELIVERY_MAPPING_VERSION_MISMATCH'}}));return;}process.stdout.write(JSON.stringify({version:1,ok:false,error:{code:'INVALID_ARGUMENT'}}));return;}case 'cloudResolveSession':value={auth:{baseUrl:'https://fixture.invalid',accessToken:'fixture-token',orgId:'org-fixture',workspaceId:'workspace-fixture'}};break;default:process.stdout.write(JSON.stringify({version:1,ok:false,error:{code:'INVALID_ARGUMENT'}}));return;}process.stdout.write(JSON.stringify({version:1,ok:true,value}));});\n`);
|
|
52
|
+
await chmod(path, 0o700);
|
|
53
|
+
return path;
|
|
54
|
+
}
|
|
55
|
+
test('transcript prefers events, orders timestamps, and preserves evidence separately', () => {
|
|
56
|
+
assert.deepEqual(projectDeliveredTranscript(records).map((row) => row.text), ['question', 'answer']);
|
|
57
|
+
assert.equal(records.length, 5);
|
|
58
|
+
assert.equal(projectDeliveredTranscript([records[1]])[0].representation, 'history');
|
|
59
|
+
});
|
|
60
|
+
test('standard plugin thread sees delivery-only sessions and pins one account across legacy reads', async (t) => {
|
|
61
|
+
const binaryPath = await fixtureHelper(t);
|
|
62
|
+
const original = globalThis.fetch;
|
|
63
|
+
let token = null;
|
|
64
|
+
globalThis.fetch = (async (_url, init) => {
|
|
65
|
+
token = new Headers(init?.headers).get('authorization');
|
|
66
|
+
return new Response(JSON.stringify({ session: null, outcomes: [], links: [], nextCursor: null }), { headers: { 'content-type': 'application/json' } });
|
|
67
|
+
});
|
|
68
|
+
t.after(() => {
|
|
69
|
+
globalThis.fetch = original;
|
|
70
|
+
});
|
|
71
|
+
const plugin = createHistoryPlugin({
|
|
72
|
+
binaryPath,
|
|
73
|
+
baseUrl: 'https://fixture.invalid',
|
|
74
|
+
expectedAccount: account,
|
|
75
|
+
});
|
|
76
|
+
const result = (await plugin
|
|
77
|
+
.tools.find((tool) => tool.name === 'get_session_thread')
|
|
78
|
+
.run({ source: 'claude', session_id: 'session-fixture' }));
|
|
79
|
+
assert.deepEqual(result.transcript.map((row) => row.text), ['question', 'answer']);
|
|
80
|
+
assert.deepEqual(result.deliveredHistory, records);
|
|
81
|
+
assert.equal(result.legacyStatus.available, true);
|
|
82
|
+
assert.equal(token, 'Bearer fixture-token');
|
|
83
|
+
let resolves = 0;
|
|
84
|
+
const composed = await getSessionThreadWithHistory({ source: 'claude', sessionId: 'session-fixture' }, {
|
|
85
|
+
binaryPath,
|
|
86
|
+
expectedAccount: account,
|
|
87
|
+
resolveSession: async () => {
|
|
88
|
+
resolves++;
|
|
89
|
+
return {
|
|
90
|
+
auth: {
|
|
91
|
+
baseUrl: 'https://fixture.invalid',
|
|
92
|
+
accessToken: 'pinned-token',
|
|
93
|
+
orgId: 'org-fixture',
|
|
94
|
+
workspaceId: 'workspace-fixture',
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
},
|
|
98
|
+
});
|
|
99
|
+
assert.equal(resolves, 1);
|
|
100
|
+
assert.equal(token, 'Bearer pinned-token');
|
|
101
|
+
assert.equal(composed.deliveredHistory.length, 5);
|
|
102
|
+
});
|
|
103
|
+
test('thread refuses changed account before reading or combining either representation', async (t) => {
|
|
104
|
+
const binaryPath = await fixtureHelper(t);
|
|
105
|
+
await assert.rejects(getSessionThreadWithHistory({ source: 'claude', sessionId: 'session-fixture' }, {
|
|
106
|
+
binaryPath,
|
|
107
|
+
expectedAccount: account,
|
|
108
|
+
resolveSession: async () => ({
|
|
109
|
+
auth: {
|
|
110
|
+
baseUrl: 'https://fixture.invalid',
|
|
111
|
+
accessToken: 'other-token',
|
|
112
|
+
orgId: 'other-org',
|
|
113
|
+
},
|
|
114
|
+
}),
|
|
115
|
+
}), HistoryDeliveryError);
|
|
116
|
+
});
|
|
117
|
+
test('loading and registering optional plugin is inert with unavailable auth helper', () => {
|
|
118
|
+
const registry = new HistoryPluginRegistry();
|
|
119
|
+
registry.register(createHistoryPlugin({ binaryPath: '/fixture/never-execute', expectedAccount: account }));
|
|
120
|
+
assert.equal(registry.sourceConnectors(['cloud']).length, 1);
|
|
121
|
+
});
|
|
122
|
+
test('pending batches cannot follow changed endpoint even when account and user label match', async (t) => {
|
|
123
|
+
const binaryPath = await fixtureHelper(t);
|
|
124
|
+
const oldOptions = { binaryPath, baseUrl: 'https://stage-one.invalid', instanceId: 'fixture' };
|
|
125
|
+
const batch = {
|
|
126
|
+
instance_id: relayHistoryInstance(oldOptions),
|
|
127
|
+
account_id: account,
|
|
128
|
+
};
|
|
129
|
+
const next = relayHistoryDestination({ ...oldOptions, baseUrl: 'https://stage-two.invalid' });
|
|
130
|
+
await assert.rejects(next.send({
|
|
131
|
+
mapping_version: 'relayhistory-delivery-v1',
|
|
132
|
+
body: 'immutable',
|
|
133
|
+
content_type: 'application/json',
|
|
134
|
+
sha256: 'fixture',
|
|
135
|
+
}, { signal: new AbortController().signal, batch, idempotencyKey: 'fixture' }), (error) => error instanceof HistoryDeliveryError && error.failure === 'mapping_version_mismatch');
|
|
136
|
+
assert.equal(relayHistoryInstance(oldOptions), relayHistoryInstance({ ...oldOptions, baseUrl: 'https://stage-one.invalid/' }));
|
|
137
|
+
});
|
|
138
|
+
test('active legacy schedule cannot be acknowledged away; unknown requires explicit acknowledgment', async (t) => {
|
|
139
|
+
for (const state of ['active', 'unknown']) {
|
|
140
|
+
const binaryPath = await fixtureHelper(t, state);
|
|
141
|
+
const options = { binaryPath, baseUrl: 'https://fixture.invalid' };
|
|
142
|
+
const batch = { instance_id: relayHistoryInstance(options) };
|
|
143
|
+
await assert.rejects(relayHistoryDestination(options).prepare(batch, { signal: new AbortController().signal }), (error) => error instanceof HistoryDeliveryError && error.failure === 'permission_denied');
|
|
144
|
+
if (state === 'active')
|
|
145
|
+
await assert.rejects(relayHistoryDestination({
|
|
146
|
+
...options,
|
|
147
|
+
acknowledgeUninspectedLegacySchedules: true,
|
|
148
|
+
}).prepare(batch, { signal: new AbortController().signal }), (error) => error instanceof HistoryDeliveryError && error.failure === 'permission_denied');
|
|
149
|
+
else
|
|
150
|
+
await assert.rejects(relayHistoryDestination({
|
|
151
|
+
...options,
|
|
152
|
+
acknowledgeUninspectedLegacySchedules: true,
|
|
153
|
+
}).prepare(batch, { signal: new AbortController().signal }), (error) => error instanceof RelayHistoryError &&
|
|
154
|
+
!(error instanceof HistoryDeliveryError && error.failure === 'permission_denied'));
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
test('MCP startup and cached reads with a configured cloud plugin never invoke its auth helper', async (t) => {
|
|
158
|
+
const { Client } = await import('@modelcontextprotocol/sdk/client/index.js');
|
|
159
|
+
const { StdioClientTransport } = await import('@modelcontextprotocol/sdk/client/stdio.js');
|
|
160
|
+
const { fileURLToPath } = await import('node:url');
|
|
161
|
+
const { access } = await import('node:fs/promises');
|
|
162
|
+
const dir = await mkdtemp(join(tmpdir(), 'rh-mcp-auth-trap-'));
|
|
163
|
+
t.after(() => rm(dir, { recursive: true, force: true }));
|
|
164
|
+
const marker = join(dir, 'auth-was-read');
|
|
165
|
+
const helper = join(dir, 'trap');
|
|
166
|
+
await writeFile(helper, `#!${process.execPath}\nrequire('node:fs').writeFileSync(${JSON.stringify(marker)},'unexpected');process.exit(1);\n`);
|
|
167
|
+
await chmod(helper, 0o700);
|
|
168
|
+
const config = join(dir, 'config.json');
|
|
169
|
+
await writeFile(config, JSON.stringify({
|
|
170
|
+
plugins: [
|
|
171
|
+
{
|
|
172
|
+
module: fileURLToPath(new URL('./index.js', import.meta.url)),
|
|
173
|
+
options: { binaryPath: helper, expectedAccount: account },
|
|
174
|
+
},
|
|
175
|
+
],
|
|
176
|
+
}));
|
|
177
|
+
const env = Object.fromEntries(Object.entries(process.env).filter((entry) => entry[1] !== undefined));
|
|
178
|
+
Object.assign(env, {
|
|
179
|
+
HOME: dir,
|
|
180
|
+
USERPROFILE: dir,
|
|
181
|
+
XDG_DATA_HOME: join(dir, 'share'),
|
|
182
|
+
AI_HIST_DB: join(dir, 'history.db'),
|
|
183
|
+
AI_HIST_PLUGIN_CONFIG: config,
|
|
184
|
+
});
|
|
185
|
+
const transport = new StdioClientTransport({
|
|
186
|
+
command: process.execPath,
|
|
187
|
+
args: [fileURLToPath(new URL('../../../../sdk-ts/dist/mcp-server.js', import.meta.url))],
|
|
188
|
+
env,
|
|
189
|
+
stderr: 'pipe',
|
|
190
|
+
});
|
|
191
|
+
const client = new Client({ name: 'auth-trap-fixture', version: '1' });
|
|
192
|
+
t.after(() => client.close());
|
|
193
|
+
await client.connect(transport);
|
|
194
|
+
assert.ok((await client.listTools()).tools.some((tool) => tool.name === 'get_session_thread'));
|
|
195
|
+
await client.callTool({ name: 'recent_history', arguments: { scope: 'remote' } });
|
|
196
|
+
await assert.rejects(access(marker));
|
|
197
|
+
});
|
|
198
|
+
test('multi-origin delivery merges canonical identities without comparing origin revisions', async (t) => {
|
|
199
|
+
const dir = await mkdtemp(join(tmpdir(), 'rh-origin-merge-'));
|
|
200
|
+
t.after(() => rm(dir, { recursive: true, force: true }));
|
|
201
|
+
const recordsPath = join(dir, 'records.json');
|
|
202
|
+
const binaryPath = await fixtureHelper(t, 'clear', recordsPath);
|
|
203
|
+
const dbPath = join(dir, 'history.db');
|
|
204
|
+
const a = {
|
|
205
|
+
...record('session_event', 'event-a', {
|
|
206
|
+
event_uid: 'shared',
|
|
207
|
+
ts_ms: 1,
|
|
208
|
+
role: 'assistant',
|
|
209
|
+
kind: 'text',
|
|
210
|
+
text: 'origin-a',
|
|
211
|
+
}),
|
|
212
|
+
origin_id: 'a',
|
|
213
|
+
revision: 2,
|
|
214
|
+
};
|
|
215
|
+
const b = {
|
|
216
|
+
...record('session_event', 'event-b', {
|
|
217
|
+
event_uid: 'shared',
|
|
218
|
+
ts_ms: 1,
|
|
219
|
+
role: 'assistant',
|
|
220
|
+
kind: 'text',
|
|
221
|
+
text: 'origin-b',
|
|
222
|
+
}),
|
|
223
|
+
origin_id: 'b',
|
|
224
|
+
revision: 900,
|
|
225
|
+
};
|
|
226
|
+
const registry = new HistoryPluginRegistry();
|
|
227
|
+
registry.register({ sources: [relayHistorySource({ binaryPath, expectedAccount: account })] });
|
|
228
|
+
const hydrate = () => hydrateSession({
|
|
229
|
+
source: 'claude',
|
|
230
|
+
sessionId: 'session-fixture',
|
|
231
|
+
scope: 'remote',
|
|
232
|
+
plugins: registry,
|
|
233
|
+
dbPath,
|
|
234
|
+
});
|
|
235
|
+
await writeFile(recordsPath, JSON.stringify([b, a]));
|
|
236
|
+
await hydrate();
|
|
237
|
+
assert.deepEqual((await getSessionEventsPage('session-fixture', { source: 'claude', dbPath })).events.map((row) => row.text), ['origin-a']);
|
|
238
|
+
b.payload = { ...b.payload, text: 'origin-b-updated' };
|
|
239
|
+
b.revision = 901;
|
|
240
|
+
b.revision_id = 'revision-b-updated';
|
|
241
|
+
await writeFile(recordsPath, JSON.stringify([a, b]));
|
|
242
|
+
await hydrate();
|
|
243
|
+
assert.equal((await getSessionEventsPage('session-fixture', { source: 'claude', dbPath })).events[0].text, 'origin-a');
|
|
244
|
+
await writeFile(recordsPath, JSON.stringify([{ ...a, operation: 'delete', payload: null, revision_id: 'a-deleted' }, b]));
|
|
245
|
+
await hydrate();
|
|
246
|
+
assert.equal((await getSessionEventsPage('session-fixture', { source: 'claude', dbPath })).events[0].text, 'origin-b-updated');
|
|
247
|
+
await writeFile(recordsPath, JSON.stringify([
|
|
248
|
+
{ ...a, operation: 'delete', payload: null, revision_id: 'a-deleted' },
|
|
249
|
+
{ ...b, operation: 'delete', payload: null, revision_id: 'b-deleted' },
|
|
250
|
+
]));
|
|
251
|
+
await hydrate();
|
|
252
|
+
assert.equal((await getSessionEventsPage('session-fixture', { source: 'claude', dbPath })).events.length, 0);
|
|
253
|
+
await writeFile(recordsPath, JSON.stringify([record('session', 'metadata', { first_prompt: 'metadata only' })]));
|
|
254
|
+
const result = await hydrate();
|
|
255
|
+
assert.equal(result.status, 'capability_limited');
|
|
256
|
+
assert.equal(result.capability, 'shallow_only');
|
|
257
|
+
});
|
|
258
|
+
test('source discovery orders by evidence recency before applying its limit', async (t) => {
|
|
259
|
+
const dir = await mkdtemp(join(tmpdir(), 'rh-discovery-recency-'));
|
|
260
|
+
t.after(() => rm(dir, { recursive: true, force: true }));
|
|
261
|
+
const recordsPath = join(dir, 'records.json');
|
|
262
|
+
const rows = [
|
|
263
|
+
['old', 1],
|
|
264
|
+
['new', 900],
|
|
265
|
+
['middle', 20],
|
|
266
|
+
].map(([session, ts]) => ({
|
|
267
|
+
...record('session_event', String(session), {
|
|
268
|
+
event_uid: 'event-' + session,
|
|
269
|
+
ts_ms: ts,
|
|
270
|
+
role: 'user',
|
|
271
|
+
kind: 'text',
|
|
272
|
+
text: session,
|
|
273
|
+
session_id: session,
|
|
274
|
+
}),
|
|
275
|
+
session_id: String(session),
|
|
276
|
+
}));
|
|
277
|
+
await writeFile(recordsPath, JSON.stringify(rows));
|
|
278
|
+
const binaryPath = await fixtureHelper(t, 'clear', recordsPath);
|
|
279
|
+
const source = relayHistorySource({ binaryPath, expectedAccount: account });
|
|
280
|
+
const page = await source.discover({ limit: 1 });
|
|
281
|
+
assert.equal(page.observations[0].session_id, 'new');
|
|
282
|
+
assert.equal(page.observations[0].first_activity_ms, 900);
|
|
283
|
+
assert.equal(page.observations[0].last_activity_ms, 900);
|
|
284
|
+
});
|
|
285
|
+
test('oversized persisted helper requests block as invalid payload instead of retrying forever', async (t) => {
|
|
286
|
+
const { helperRequest } = await import('./helper.js');
|
|
287
|
+
const binaryPath = await fixtureHelper(t);
|
|
288
|
+
const options = { binaryPath, baseUrl: 'https://fixture.invalid' };
|
|
289
|
+
const prepared = { mapping_version: 'relayhistory-delivery-v1', content_type: 'application/json', body: 'x'.repeat(16 * 1_048_576), sha256: 'fixture' };
|
|
290
|
+
// The actual serializer bound fires before any helper executable is launched.
|
|
291
|
+
await assert.rejects(helperRequest('deliverySend', { prepared }, { binaryPath: '/never-launched-for-oversize' }), (error) => error instanceof RelayHistoryError && error.code === 'INVALID_ARGUMENT');
|
|
292
|
+
const batch = { instance_id: relayHistoryInstance(options), account_id: account };
|
|
293
|
+
await assert.rejects(relayHistoryDestination(options).send(prepared, { signal: new AbortController().signal, batch, idempotencyKey: 'fixture' }), (error) => error instanceof HistoryDeliveryError && error.failure === 'invalid_payload');
|
|
294
|
+
});
|
|
295
|
+
//# sourceMappingURL=plugin.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.test.js","sourceRoot":"","sources":["../src/plugin.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,60 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@relayhistory/capture",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "0.18.8",
|
|
4
|
+
"description": "Optional RelayHistory destination, auth, sharing and recall plugin for ai-hist.",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "https://github.com/AgentWorkforce/relayhistory",
|
|
8
|
+
"directory": "plugins/relayhistory/sdk"
|
|
9
|
+
},
|
|
10
|
+
"type": "module",
|
|
11
|
+
"main": "dist/index.js",
|
|
12
|
+
"types": "dist/index.d.ts",
|
|
13
|
+
"exports": {
|
|
14
|
+
".": {
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"default": "./dist/index.js"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"files": [
|
|
20
|
+
"dist/index.*",
|
|
21
|
+
"dist/helper.*",
|
|
22
|
+
"dist/plugin.*",
|
|
23
|
+
"dist/cloud-client.*",
|
|
24
|
+
"dist/cloud-auth-runtime.*",
|
|
25
|
+
"dist/cli.*",
|
|
26
|
+
"bin/",
|
|
27
|
+
"README.md"
|
|
28
|
+
],
|
|
29
|
+
"scripts": {
|
|
30
|
+
"build": "tsc -p tsconfig.json",
|
|
31
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
32
|
+
"test": "npm run build && node --test dist/*.test.js"
|
|
33
|
+
},
|
|
34
|
+
"peerDependencies": {
|
|
35
|
+
"ai-hist": "^0.18.8"
|
|
36
|
+
},
|
|
37
|
+
"devDependencies": {
|
|
38
|
+
"ai-hist": "file:../../../sdk-ts",
|
|
39
|
+
"@types/node": "^22.18.0",
|
|
40
|
+
"typescript": "^5.9.2",
|
|
41
|
+
"@modelcontextprotocol/sdk": "^1.29.0"
|
|
42
|
+
},
|
|
43
|
+
"engines": {
|
|
44
|
+
"node": ">=20"
|
|
45
|
+
},
|
|
46
|
+
"bin": {
|
|
47
|
+
"relayhistory-plugin": "./dist/cli.js"
|
|
48
|
+
},
|
|
49
|
+
"optionalDependencies": {
|
|
50
|
+
"@relayhistory/capture-darwin-arm64": "0.18.8",
|
|
51
|
+
"@relayhistory/capture-darwin-x64": "0.18.8",
|
|
52
|
+
"@relayhistory/capture-linux-x64-gnu": "0.18.8",
|
|
53
|
+
"@relayhistory/capture-linux-arm64-gnu": "0.18.8",
|
|
54
|
+
"@relayhistory/capture-linux-x64-musl": "0.18.8",
|
|
55
|
+
"@relayhistory/capture-linux-arm64-musl": "0.18.8",
|
|
56
|
+
"@relayhistory/capture-win32-x64-msvc": "0.18.8"
|
|
57
|
+
},
|
|
6
58
|
"publishConfig": {
|
|
7
59
|
"access": "public"
|
|
8
60
|
}
|