recall-mcp-v3 3.9.2 → 3.9.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/started-beacon.test.d.ts +14 -0
- package/dist/__tests__/started-beacon.test.d.ts.map +1 -0
- package/dist/__tests__/started-beacon.test.js +200 -0
- package/dist/__tests__/started-beacon.test.js.map +1 -0
- package/dist/auth/__tests__/heartbeat.test.d.ts +12 -0
- package/dist/auth/__tests__/heartbeat.test.d.ts.map +1 -0
- package/dist/auth/__tests__/heartbeat.test.js +140 -0
- package/dist/auth/__tests__/heartbeat.test.js.map +1 -0
- package/dist/auth/heartbeat.d.ts +51 -0
- package/dist/auth/heartbeat.d.ts.map +1 -0
- package/dist/auth/heartbeat.js +79 -0
- package/dist/auth/heartbeat.js.map +1 -0
- package/dist/auth/run-auth.d.ts.map +1 -1
- package/dist/auth/run-auth.js +66 -0
- package/dist/auth/run-auth.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +82 -0
- package/dist/cli.js.map +1 -1
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -1
- package/dist/started-beacon.d.ts +37 -0
- package/dist/started-beacon.d.ts.map +1 -0
- package/dist/started-beacon.js +80 -0
- package/dist/started-beacon.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for the MCP startup beacon factory (PR 7).
|
|
3
|
+
*
|
|
4
|
+
* Pinned contracts:
|
|
5
|
+
* - First invocation calls heartbeat() with state='mcp_started',
|
|
6
|
+
* mcp_client from detection, clientVersion from factory opts,
|
|
7
|
+
* transport='stdio'.
|
|
8
|
+
* - Subsequent invocations are no-ops (process-local guard).
|
|
9
|
+
* - Heartbeat failures are caught + logged; beacon function never throws.
|
|
10
|
+
* - The factory is independent — two factories from one process each
|
|
11
|
+
* have their own guard.
|
|
12
|
+
*/
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=started-beacon.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"started-beacon.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/started-beacon.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for the MCP startup beacon factory (PR 7).
|
|
3
|
+
*
|
|
4
|
+
* Pinned contracts:
|
|
5
|
+
* - First invocation calls heartbeat() with state='mcp_started',
|
|
6
|
+
* mcp_client from detection, clientVersion from factory opts,
|
|
7
|
+
* transport='stdio'.
|
|
8
|
+
* - Subsequent invocations are no-ops (process-local guard).
|
|
9
|
+
* - Heartbeat failures are caught + logged; beacon function never throws.
|
|
10
|
+
* - The factory is independent — two factories from one process each
|
|
11
|
+
* have their own guard.
|
|
12
|
+
*/
|
|
13
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
14
|
+
import { createStartedBeacon } from '../started-beacon.js';
|
|
15
|
+
const FAKE_DETECTION = {
|
|
16
|
+
mcp_client: 'claude-code',
|
|
17
|
+
ai_provider: 'anthropic',
|
|
18
|
+
environment: 'terminal',
|
|
19
|
+
os: 'darwin',
|
|
20
|
+
transport: 'stdio',
|
|
21
|
+
confidence: 'high',
|
|
22
|
+
raw: {},
|
|
23
|
+
};
|
|
24
|
+
describe('createStartedBeacon', () => {
|
|
25
|
+
it('first call fires heartbeat with mcp_started + injected detection + version', async () => {
|
|
26
|
+
const heartbeatMock = vi.fn(async (_input) => undefined);
|
|
27
|
+
const beacon = createStartedBeacon({
|
|
28
|
+
version: '3.9.4',
|
|
29
|
+
heartbeat: heartbeatMock,
|
|
30
|
+
getDetection: () => FAKE_DETECTION,
|
|
31
|
+
});
|
|
32
|
+
await beacon();
|
|
33
|
+
expect(heartbeatMock).toHaveBeenCalledTimes(1);
|
|
34
|
+
expect(heartbeatMock).toHaveBeenCalledWith({
|
|
35
|
+
state: 'mcp_started',
|
|
36
|
+
mcpClient: 'claude-code',
|
|
37
|
+
clientVersion: '3.9.4',
|
|
38
|
+
transport: 'stdio',
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
it('second call is a no-op (process-local guard)', async () => {
|
|
42
|
+
const heartbeatMock = vi.fn(async (_input) => undefined);
|
|
43
|
+
const beacon = createStartedBeacon({
|
|
44
|
+
version: '3.9.4',
|
|
45
|
+
heartbeat: heartbeatMock,
|
|
46
|
+
getDetection: () => FAKE_DETECTION,
|
|
47
|
+
});
|
|
48
|
+
await beacon();
|
|
49
|
+
await beacon();
|
|
50
|
+
await beacon();
|
|
51
|
+
expect(heartbeatMock).toHaveBeenCalledTimes(1);
|
|
52
|
+
});
|
|
53
|
+
it('does NOT fire detection more than once when called twice', async () => {
|
|
54
|
+
const heartbeatMock = vi.fn(async (_input) => undefined);
|
|
55
|
+
const detectionMock = vi.fn(() => FAKE_DETECTION);
|
|
56
|
+
const beacon = createStartedBeacon({
|
|
57
|
+
version: '3.9.4',
|
|
58
|
+
heartbeat: heartbeatMock,
|
|
59
|
+
getDetection: detectionMock,
|
|
60
|
+
});
|
|
61
|
+
await beacon();
|
|
62
|
+
await beacon();
|
|
63
|
+
expect(detectionMock).toHaveBeenCalledTimes(1);
|
|
64
|
+
});
|
|
65
|
+
it('catches and logs heartbeat failures (does not throw to caller)', async () => {
|
|
66
|
+
const heartbeatMock = vi.fn(async () => {
|
|
67
|
+
throw new Error('No auth token persisted');
|
|
68
|
+
});
|
|
69
|
+
const logMock = vi.fn();
|
|
70
|
+
const beacon = createStartedBeacon({
|
|
71
|
+
version: '3.9.4',
|
|
72
|
+
heartbeat: heartbeatMock,
|
|
73
|
+
getDetection: () => FAKE_DETECTION,
|
|
74
|
+
log: logMock,
|
|
75
|
+
});
|
|
76
|
+
// Must not reject — beacon is fire-and-forget at every call site.
|
|
77
|
+
await expect(beacon()).resolves.toBeUndefined();
|
|
78
|
+
expect(logMock).toHaveBeenCalledTimes(1);
|
|
79
|
+
expect(logMock.mock.calls[0][0]).toMatch(/mcp_started beacon.*No auth token persisted/);
|
|
80
|
+
});
|
|
81
|
+
it('locks the guard on permanent failures (no auth token) — avoids retry storm', async () => {
|
|
82
|
+
const heartbeatMock = vi.fn(async (_input) => {
|
|
83
|
+
throw new Error('No auth token persisted; run `recall-mcp-v3 auth` before sending heartbeats');
|
|
84
|
+
});
|
|
85
|
+
const beacon = createStartedBeacon({
|
|
86
|
+
version: '3.9.4',
|
|
87
|
+
heartbeat: heartbeatMock,
|
|
88
|
+
getDetection: () => FAKE_DETECTION,
|
|
89
|
+
log: () => undefined,
|
|
90
|
+
});
|
|
91
|
+
await beacon();
|
|
92
|
+
await beacon();
|
|
93
|
+
await beacon();
|
|
94
|
+
// No-token-persisted is stable for the life of the process; retrying
|
|
95
|
+
// would hammer the API on every request without changing the answer.
|
|
96
|
+
expect(heartbeatMock).toHaveBeenCalledTimes(1);
|
|
97
|
+
});
|
|
98
|
+
it('allows retry on transient failures (network error / timeout / 5xx)', async () => {
|
|
99
|
+
let attempt = 0;
|
|
100
|
+
const heartbeatMock = vi.fn(async (_input) => {
|
|
101
|
+
attempt += 1;
|
|
102
|
+
if (attempt === 1) {
|
|
103
|
+
throw new Error('Heartbeat failed: HTTP 503 Service Unavailable — transient');
|
|
104
|
+
}
|
|
105
|
+
// Subsequent attempts succeed.
|
|
106
|
+
});
|
|
107
|
+
const beacon = createStartedBeacon({
|
|
108
|
+
version: '3.9.4',
|
|
109
|
+
heartbeat: heartbeatMock,
|
|
110
|
+
getDetection: () => FAKE_DETECTION,
|
|
111
|
+
log: () => undefined,
|
|
112
|
+
});
|
|
113
|
+
await beacon();
|
|
114
|
+
await beacon();
|
|
115
|
+
// Transient failure unlocks the guard so the second request retries.
|
|
116
|
+
// A flaky moment must not permanently drop the funnel signal for the
|
|
117
|
+
// life of a long-running session.
|
|
118
|
+
expect(heartbeatMock).toHaveBeenCalledTimes(2);
|
|
119
|
+
});
|
|
120
|
+
it('locks the guard once a transient failure eventually succeeds', async () => {
|
|
121
|
+
let attempt = 0;
|
|
122
|
+
const heartbeatMock = vi.fn(async (_input) => {
|
|
123
|
+
attempt += 1;
|
|
124
|
+
if (attempt === 1) {
|
|
125
|
+
throw new Error('Heartbeat failed: AbortError');
|
|
126
|
+
}
|
|
127
|
+
// Second call succeeds.
|
|
128
|
+
});
|
|
129
|
+
const beacon = createStartedBeacon({
|
|
130
|
+
version: '3.9.4',
|
|
131
|
+
heartbeat: heartbeatMock,
|
|
132
|
+
getDetection: () => FAKE_DETECTION,
|
|
133
|
+
log: () => undefined,
|
|
134
|
+
});
|
|
135
|
+
await beacon();
|
|
136
|
+
await beacon();
|
|
137
|
+
// Third call after success should NOT re-fire.
|
|
138
|
+
await beacon();
|
|
139
|
+
expect(heartbeatMock).toHaveBeenCalledTimes(2);
|
|
140
|
+
});
|
|
141
|
+
it('catches detection failures + leaves guard open for retry', async () => {
|
|
142
|
+
let detectionAttempt = 0;
|
|
143
|
+
const detectionMock = vi.fn(() => {
|
|
144
|
+
detectionAttempt += 1;
|
|
145
|
+
if (detectionAttempt === 1) {
|
|
146
|
+
throw new Error('detect failed: ENOENT');
|
|
147
|
+
}
|
|
148
|
+
return FAKE_DETECTION;
|
|
149
|
+
});
|
|
150
|
+
const heartbeatMock = vi.fn(async (_input) => undefined);
|
|
151
|
+
const logMock = vi.fn();
|
|
152
|
+
const beacon = createStartedBeacon({
|
|
153
|
+
version: '3.9.4',
|
|
154
|
+
heartbeat: heartbeatMock,
|
|
155
|
+
getDetection: detectionMock,
|
|
156
|
+
log: logMock,
|
|
157
|
+
});
|
|
158
|
+
// First call: detection throws. Must NOT reject, must NOT call heartbeat,
|
|
159
|
+
// must log + leave the guard open so a future call retries. Without this,
|
|
160
|
+
// a single transient detection error permanently drops mcp_started for
|
|
161
|
+
// the life of the process.
|
|
162
|
+
await expect(beacon()).resolves.toBeUndefined();
|
|
163
|
+
expect(heartbeatMock).not.toHaveBeenCalled();
|
|
164
|
+
expect(logMock).toHaveBeenCalledTimes(1);
|
|
165
|
+
expect(logMock.mock.calls[0][0]).toMatch(/mcp_started beacon.*detection failed.*ENOENT/);
|
|
166
|
+
// Second call: detection succeeds, heartbeat fires.
|
|
167
|
+
await beacon();
|
|
168
|
+
expect(detectionMock).toHaveBeenCalledTimes(2);
|
|
169
|
+
expect(heartbeatMock).toHaveBeenCalledTimes(1);
|
|
170
|
+
});
|
|
171
|
+
it('two factories from one process have independent guards', async () => {
|
|
172
|
+
const heartbeatMock = vi.fn(async (_input) => undefined);
|
|
173
|
+
const detectionMock = () => FAKE_DETECTION;
|
|
174
|
+
const beaconA = createStartedBeacon({
|
|
175
|
+
version: '3.9.4',
|
|
176
|
+
heartbeat: heartbeatMock,
|
|
177
|
+
getDetection: detectionMock,
|
|
178
|
+
});
|
|
179
|
+
const beaconB = createStartedBeacon({
|
|
180
|
+
version: '3.9.4',
|
|
181
|
+
heartbeat: heartbeatMock,
|
|
182
|
+
getDetection: detectionMock,
|
|
183
|
+
});
|
|
184
|
+
await beaconA();
|
|
185
|
+
await beaconB();
|
|
186
|
+
// Each beacon fires once (independent state).
|
|
187
|
+
expect(heartbeatMock).toHaveBeenCalledTimes(2);
|
|
188
|
+
});
|
|
189
|
+
it('forwards different mcp_client values from detection', async () => {
|
|
190
|
+
const heartbeatMock = vi.fn(async (_input) => undefined);
|
|
191
|
+
const beacon = createStartedBeacon({
|
|
192
|
+
version: '3.9.4',
|
|
193
|
+
heartbeat: heartbeatMock,
|
|
194
|
+
getDetection: () => ({ ...FAKE_DETECTION, mcp_client: 'cursor' }),
|
|
195
|
+
});
|
|
196
|
+
await beacon();
|
|
197
|
+
expect(heartbeatMock.mock.calls[0][0]).toMatchObject({ mcpClient: 'cursor' });
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
//# sourceMappingURL=started-beacon.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"started-beacon.test.js","sourceRoot":"","sources":["../../src/__tests__/started-beacon.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for the install-health heartbeat client.
|
|
3
|
+
*
|
|
4
|
+
* Pinned contracts:
|
|
5
|
+
* - heartbeat() POSTs to /v1/clients/heartbeat with the persisted bearer token.
|
|
6
|
+
* - Resolves API base from explicit > env > auth-store > DEFAULT.
|
|
7
|
+
* - Wire body shape (state, mcp_client, client_version, transport, payload).
|
|
8
|
+
* - Throws on missing token, network errors, non-2xx responses.
|
|
9
|
+
* - Does NOT throw on 2xx (success path).
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=heartbeat.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heartbeat.test.d.ts","sourceRoot":"","sources":["../../../src/auth/__tests__/heartbeat.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for the install-health heartbeat client.
|
|
3
|
+
*
|
|
4
|
+
* Pinned contracts:
|
|
5
|
+
* - heartbeat() POSTs to /v1/clients/heartbeat with the persisted bearer token.
|
|
6
|
+
* - Resolves API base from explicit > env > auth-store > DEFAULT.
|
|
7
|
+
* - Wire body shape (state, mcp_client, client_version, transport, payload).
|
|
8
|
+
* - Throws on missing token, network errors, non-2xx responses.
|
|
9
|
+
* - Does NOT throw on 2xx (success path).
|
|
10
|
+
*/
|
|
11
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
12
|
+
import { heartbeat } from '../heartbeat.js';
|
|
13
|
+
function makeFetch(response = { status: 200 }) {
|
|
14
|
+
const calls = [];
|
|
15
|
+
const fetchImpl = vi.fn(async (input, init) => {
|
|
16
|
+
calls.push({ url: String(input), init: init ?? {} });
|
|
17
|
+
return new Response(response.body ?? '', {
|
|
18
|
+
status: response.status,
|
|
19
|
+
statusText: response.statusText ?? '',
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
return { fetch: fetchImpl, calls };
|
|
23
|
+
}
|
|
24
|
+
const TOKEN = 'rcl_FAKE_TOKEN_123';
|
|
25
|
+
const AUTH_STORE = {
|
|
26
|
+
token: TOKEN,
|
|
27
|
+
issued_at: '2026-05-06T18:00:00.000Z',
|
|
28
|
+
api_base: 'https://api-v3.recall.team',
|
|
29
|
+
client_version: '3.9.3',
|
|
30
|
+
};
|
|
31
|
+
describe('heartbeat', () => {
|
|
32
|
+
it('POSTs to /v1/clients/heartbeat with bearer token from auth store', async () => {
|
|
33
|
+
const { fetch, calls } = makeFetch({ status: 200 });
|
|
34
|
+
await heartbeat({
|
|
35
|
+
state: 'installer_completed',
|
|
36
|
+
mcpClient: 'claude-code',
|
|
37
|
+
clientVersion: '3.9.3',
|
|
38
|
+
transport: 'stdio',
|
|
39
|
+
}, {
|
|
40
|
+
fetch,
|
|
41
|
+
readAuthStore: () => AUTH_STORE,
|
|
42
|
+
});
|
|
43
|
+
expect(calls.length).toBe(1);
|
|
44
|
+
expect(calls[0].url).toBe('https://api-v3.recall.team/v1/clients/heartbeat');
|
|
45
|
+
expect(calls[0].init.method).toBe('POST');
|
|
46
|
+
const headers = calls[0].init.headers;
|
|
47
|
+
expect(headers['Content-Type']).toBe('application/json');
|
|
48
|
+
expect(headers.Authorization).toBe(`Bearer ${TOKEN}`);
|
|
49
|
+
});
|
|
50
|
+
it('serializes the request body with snake_case keys for the API contract', async () => {
|
|
51
|
+
const { fetch, calls } = makeFetch();
|
|
52
|
+
const payload = { tools: [{ id: 'claude-code', status: 'installed' }] };
|
|
53
|
+
await heartbeat({
|
|
54
|
+
state: 'tools_patched',
|
|
55
|
+
mcpClient: 'claude-code',
|
|
56
|
+
clientVersion: '3.9.3',
|
|
57
|
+
transport: 'stdio',
|
|
58
|
+
payload,
|
|
59
|
+
}, { fetch, readAuthStore: () => AUTH_STORE });
|
|
60
|
+
const body = JSON.parse(calls[0].init.body);
|
|
61
|
+
expect(body).toEqual({
|
|
62
|
+
state: 'tools_patched',
|
|
63
|
+
mcp_client: 'claude-code',
|
|
64
|
+
client_version: '3.9.3',
|
|
65
|
+
transport: 'stdio',
|
|
66
|
+
payload,
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
it('omits client_version when not provided', async () => {
|
|
70
|
+
const { fetch, calls } = makeFetch();
|
|
71
|
+
await heartbeat({ state: 'mcp_started', mcpClient: 'cursor', transport: 'stdio' }, { fetch, readAuthStore: () => AUTH_STORE });
|
|
72
|
+
const body = JSON.parse(calls[0].init.body);
|
|
73
|
+
// client_version absent (undefined fields don't survive JSON round-trip)
|
|
74
|
+
expect(body.client_version).toBeUndefined();
|
|
75
|
+
expect(body.payload).toBeUndefined();
|
|
76
|
+
});
|
|
77
|
+
it('resolves API base from explicit opts.apiBase first', async () => {
|
|
78
|
+
const { fetch, calls } = makeFetch();
|
|
79
|
+
await heartbeat({ state: 'mcp_started', mcpClient: 'cursor', transport: 'stdio' }, {
|
|
80
|
+
fetch,
|
|
81
|
+
apiBase: 'https://custom.example.com',
|
|
82
|
+
readAuthStore: () => AUTH_STORE,
|
|
83
|
+
});
|
|
84
|
+
expect(calls[0].url).toBe('https://custom.example.com/v1/clients/heartbeat');
|
|
85
|
+
});
|
|
86
|
+
it('resolves API base from RECALL_API_URL env when no explicit override', async () => {
|
|
87
|
+
const { fetch, calls } = makeFetch();
|
|
88
|
+
await heartbeat({ state: 'mcp_started', mcpClient: 'cursor', transport: 'stdio' }, {
|
|
89
|
+
fetch,
|
|
90
|
+
env: { RECALL_API_URL: 'https://staging.example.com' },
|
|
91
|
+
readAuthStore: () => AUTH_STORE,
|
|
92
|
+
});
|
|
93
|
+
expect(calls[0].url).toBe('https://staging.example.com/v1/clients/heartbeat');
|
|
94
|
+
});
|
|
95
|
+
it('falls back to auth-store api_base when no override or env', async () => {
|
|
96
|
+
const { fetch, calls } = makeFetch();
|
|
97
|
+
await heartbeat({ state: 'mcp_started', mcpClient: 'cursor', transport: 'stdio' }, {
|
|
98
|
+
fetch,
|
|
99
|
+
env: {},
|
|
100
|
+
readAuthStore: () => ({
|
|
101
|
+
...AUTH_STORE,
|
|
102
|
+
api_base: 'https://stored-api.example.com',
|
|
103
|
+
}),
|
|
104
|
+
});
|
|
105
|
+
expect(calls[0].url).toBe('https://stored-api.example.com/v1/clients/heartbeat');
|
|
106
|
+
});
|
|
107
|
+
it('throws when no token is persisted', async () => {
|
|
108
|
+
const { fetch } = makeFetch();
|
|
109
|
+
await expect(heartbeat({ state: 'mcp_started', mcpClient: 'cursor', transport: 'stdio' }, { fetch, readAuthStore: () => null })).rejects.toThrow(/No auth token persisted/);
|
|
110
|
+
});
|
|
111
|
+
it('throws on non-2xx response with status + truncated body', async () => {
|
|
112
|
+
const { fetch } = makeFetch({
|
|
113
|
+
status: 403,
|
|
114
|
+
statusText: 'Forbidden',
|
|
115
|
+
body: 'install-health heartbeat (requires API token)',
|
|
116
|
+
});
|
|
117
|
+
await expect(heartbeat({ state: 'mcp_started', mcpClient: 'cursor', transport: 'stdio' }, { fetch, readAuthStore: () => AUTH_STORE })).rejects.toThrow(/HTTP 403.*install-health heartbeat/);
|
|
118
|
+
});
|
|
119
|
+
it('propagates fetch rejections (network errors)', async () => {
|
|
120
|
+
const fetchImpl = vi.fn(async () => {
|
|
121
|
+
throw new Error('network down');
|
|
122
|
+
});
|
|
123
|
+
await expect(heartbeat({ state: 'mcp_started', mcpClient: 'cursor', transport: 'stdio' }, { fetch: fetchImpl, readAuthStore: () => AUTH_STORE })).rejects.toThrow(/network down/);
|
|
124
|
+
});
|
|
125
|
+
it('passes an AbortSignal so a hung server cannot hang the caller forever', async () => {
|
|
126
|
+
const { fetch, calls } = makeFetch({ status: 200 });
|
|
127
|
+
await heartbeat({ state: 'mcp_started', mcpClient: 'cursor', transport: 'stdio' }, { fetch, readAuthStore: () => AUTH_STORE });
|
|
128
|
+
const init = calls[0].init;
|
|
129
|
+
expect(init.signal).toBeDefined();
|
|
130
|
+
expect(init.signal).toBeInstanceOf(AbortSignal);
|
|
131
|
+
});
|
|
132
|
+
it('does not throw on 200 response', async () => {
|
|
133
|
+
const { fetch } = makeFetch({
|
|
134
|
+
status: 200,
|
|
135
|
+
body: JSON.stringify({ ok: true, connection_id: 'cc_abc' }),
|
|
136
|
+
});
|
|
137
|
+
await expect(heartbeat({ state: 'first_tool_call', mcpClient: 'claude-code', transport: 'stdio' }, { fetch, readAuthStore: () => AUTH_STORE })).resolves.toBeUndefined();
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
//# sourceMappingURL=heartbeat.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heartbeat.test.js","sourceRoot":"","sources":["../../../src/auth/__tests__/heartbeat.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Install-Health heartbeat client.
|
|
3
|
+
*
|
|
4
|
+
* Posts to `/v1/clients/heartbeat` (Phase 1 / PR 4 of the install-
|
|
5
|
+
* health rollout). Used by `recall-mcp-v3 auth` after a successful
|
|
6
|
+
* device-flow + tool-patching pass to record `installer_completed`
|
|
7
|
+
* and `tools_patched` per detected tool, and by the MCP server (PR 7)
|
|
8
|
+
* to record `mcp_started` on first initialize.
|
|
9
|
+
*
|
|
10
|
+
* Designed to be called fire-and-forget at every callsite — failure
|
|
11
|
+
* to heartbeat is non-fatal. The token is already persisted; the
|
|
12
|
+
* funnel signal is observability, not user-facing state.
|
|
13
|
+
*/
|
|
14
|
+
import { type AuthStorePayload } from './auth-store.js';
|
|
15
|
+
export type HeartbeatState = 'installer_completed' | 'tools_patched' | 'mcp_started' | 'first_tool_call' | 'first_session_saved';
|
|
16
|
+
export type HeartbeatTransport = 'stdio' | 'http';
|
|
17
|
+
export interface HeartbeatInput {
|
|
18
|
+
state: HeartbeatState;
|
|
19
|
+
/** Tool the heartbeat is for, e.g. 'claude-code', 'cursor'. */
|
|
20
|
+
mcpClient: string;
|
|
21
|
+
/** Optional version of the MCP client (recall-mcp-v3 version). */
|
|
22
|
+
clientVersion?: string;
|
|
23
|
+
transport: HeartbeatTransport;
|
|
24
|
+
/** Arbitrary JSON payload (e.g., per-tool patch result). */
|
|
25
|
+
payload?: unknown;
|
|
26
|
+
}
|
|
27
|
+
export interface HeartbeatOptions {
|
|
28
|
+
/** Override API base URL. Defaults to auth-store value or DEFAULT_API_BASE. */
|
|
29
|
+
apiBase?: string;
|
|
30
|
+
/** Injectable fetch for tests. */
|
|
31
|
+
fetch?: typeof globalThis.fetch;
|
|
32
|
+
/** Injectable env for testing path resolution + URL override. */
|
|
33
|
+
env?: NodeJS.ProcessEnv;
|
|
34
|
+
/** Injectable auth-store reader for tests. */
|
|
35
|
+
readAuthStore?: (env?: NodeJS.ProcessEnv) => AuthStorePayload | null;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Fire one heartbeat for a single (state, tool, transport) tuple.
|
|
39
|
+
*
|
|
40
|
+
* Resolves the API base URL from (in order): explicit `opts.apiBase`,
|
|
41
|
+
* `env.RECALL_API_URL`, the persisted auth store's `api_base` field,
|
|
42
|
+
* then DEFAULT_API_BASE. The auth-store fallback ensures heartbeats
|
|
43
|
+
* always target the same backend the token was issued against.
|
|
44
|
+
*
|
|
45
|
+
* Throws if no token is persisted, if the network call fails, or if
|
|
46
|
+
* the server responds with a non-2xx status. Callers should wrap in
|
|
47
|
+
* `try/catch` (or `.catch(...)`) and log — failure to heartbeat must
|
|
48
|
+
* never break the user-visible auth/MCP flow.
|
|
49
|
+
*/
|
|
50
|
+
export declare function heartbeat(input: HeartbeatInput, opts?: HeartbeatOptions): Promise<void>;
|
|
51
|
+
//# sourceMappingURL=heartbeat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heartbeat.d.ts","sourceRoot":"","sources":["../../src/auth/heartbeat.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAqB,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAY3E,MAAM,MAAM,cAAc,GACtB,qBAAqB,GACrB,eAAe,GACf,aAAa,GACb,iBAAiB,GACjB,qBAAqB,CAAC;AAE1B,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,MAAM,CAAC;AAElD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,cAAc,CAAC;IACtB,+DAA+D;IAC/D,SAAS,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,kBAAkB,CAAC;IAC9B,4DAA4D;IAC5D,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,+EAA+E;IAC/E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAChC,iEAAiE;IACjE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,8CAA8C;IAC9C,aAAa,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,KAAK,gBAAgB,GAAG,IAAI,CAAC;CACtE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,SAAS,CAC7B,KAAK,EAAE,cAAc,EACrB,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAiDf"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Install-Health heartbeat client.
|
|
3
|
+
*
|
|
4
|
+
* Posts to `/v1/clients/heartbeat` (Phase 1 / PR 4 of the install-
|
|
5
|
+
* health rollout). Used by `recall-mcp-v3 auth` after a successful
|
|
6
|
+
* device-flow + tool-patching pass to record `installer_completed`
|
|
7
|
+
* and `tools_patched` per detected tool, and by the MCP server (PR 7)
|
|
8
|
+
* to record `mcp_started` on first initialize.
|
|
9
|
+
*
|
|
10
|
+
* Designed to be called fire-and-forget at every callsite — failure
|
|
11
|
+
* to heartbeat is non-fatal. The token is already persisted; the
|
|
12
|
+
* funnel signal is observability, not user-facing state.
|
|
13
|
+
*/
|
|
14
|
+
import { readAuthStoreSync } from './auth-store.js';
|
|
15
|
+
const DEFAULT_API_BASE = 'https://api-v3.recall.team';
|
|
16
|
+
/**
|
|
17
|
+
* Per-call request timeout. Generous enough that a normally-loaded server
|
|
18
|
+
* always responds in time; short enough that a hung TCP connection bounds
|
|
19
|
+
* the user's `recall-mcp-v3 auth` blocking time. With per-tool fan-out in
|
|
20
|
+
* fireInstallHealthHeartbeats this also bounds the worst case at
|
|
21
|
+
* REQUEST_TIMEOUT_MS (Promise.allSettled across tools).
|
|
22
|
+
*/
|
|
23
|
+
const REQUEST_TIMEOUT_MS = 5_000;
|
|
24
|
+
/**
|
|
25
|
+
* Fire one heartbeat for a single (state, tool, transport) tuple.
|
|
26
|
+
*
|
|
27
|
+
* Resolves the API base URL from (in order): explicit `opts.apiBase`,
|
|
28
|
+
* `env.RECALL_API_URL`, the persisted auth store's `api_base` field,
|
|
29
|
+
* then DEFAULT_API_BASE. The auth-store fallback ensures heartbeats
|
|
30
|
+
* always target the same backend the token was issued against.
|
|
31
|
+
*
|
|
32
|
+
* Throws if no token is persisted, if the network call fails, or if
|
|
33
|
+
* the server responds with a non-2xx status. Callers should wrap in
|
|
34
|
+
* `try/catch` (or `.catch(...)`) and log — failure to heartbeat must
|
|
35
|
+
* never break the user-visible auth/MCP flow.
|
|
36
|
+
*/
|
|
37
|
+
export async function heartbeat(input, opts = {}) {
|
|
38
|
+
const env = opts.env ?? process.env;
|
|
39
|
+
const fetchImpl = opts.fetch ?? globalThis.fetch;
|
|
40
|
+
const readStore = opts.readAuthStore ?? readAuthStoreSync;
|
|
41
|
+
const auth = readStore(env);
|
|
42
|
+
if (!auth || !auth.token) {
|
|
43
|
+
throw new Error('No auth token persisted; run `recall-mcp-v3 auth` before sending heartbeats');
|
|
44
|
+
}
|
|
45
|
+
const apiBase = opts.apiBase ?? env.RECALL_API_URL ?? auth.api_base ?? DEFAULT_API_BASE;
|
|
46
|
+
const url = `${apiBase}/v1/clients/heartbeat`;
|
|
47
|
+
const body = JSON.stringify({
|
|
48
|
+
state: input.state,
|
|
49
|
+
mcp_client: input.mcpClient,
|
|
50
|
+
client_version: input.clientVersion,
|
|
51
|
+
transport: input.transport,
|
|
52
|
+
payload: input.payload,
|
|
53
|
+
});
|
|
54
|
+
const res = await fetchImpl(url, {
|
|
55
|
+
method: 'POST',
|
|
56
|
+
headers: {
|
|
57
|
+
'Content-Type': 'application/json',
|
|
58
|
+
Authorization: `Bearer ${auth.token}`,
|
|
59
|
+
},
|
|
60
|
+
body,
|
|
61
|
+
// Bound the request so a stuck server / dropped TCP / hostile network
|
|
62
|
+
// can't hang the caller forever. fetch has no default timeout in Node;
|
|
63
|
+
// without this signal, `recall-mcp-v3 auth` would never return after a
|
|
64
|
+
// network blip mid-funnel-write. AbortSignal.timeout is Node 18+
|
|
65
|
+
// (engines.node already pins ≥18.0.0).
|
|
66
|
+
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
|
|
67
|
+
});
|
|
68
|
+
if (!res.ok) {
|
|
69
|
+
let errBody = '';
|
|
70
|
+
try {
|
|
71
|
+
errBody = await res.text();
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
// Ignore — body read failures are best-effort diagnostic info.
|
|
75
|
+
}
|
|
76
|
+
throw new Error(`Heartbeat failed: HTTP ${res.status} ${res.statusText} — ${errBody.slice(0, 200)}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=heartbeat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../../src/auth/heartbeat.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,iBAAiB,EAAyB,MAAM,iBAAiB,CAAC;AAE3E,MAAM,gBAAgB,GAAG,4BAA4B,CAAC;AACtD;;;;;;GAMG;AACH,MAAM,kBAAkB,GAAG,KAAK,CAAC;AAiCjC;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,KAAqB,EACrB,OAAyB,EAAE;IAE3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACpC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC;IACjD,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,IAAI,iBAAiB,CAAC;IAE1D,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAC5B,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,6EAA6E,CAC9E,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,GAAG,CAAC,cAAc,IAAI,IAAI,CAAC,QAAQ,IAAI,gBAAgB,CAAC;IACxF,MAAM,GAAG,GAAG,GAAG,OAAO,uBAAuB,CAAC;IAE9C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;QAC1B,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,UAAU,EAAE,KAAK,CAAC,SAAS;QAC3B,cAAc,EAAE,KAAK,CAAC,aAAa;QACnC,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE;QAC/B,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE;SACtC;QACD,IAAI;QACJ,sEAAsE;QACtE,uEAAuE;QACvE,uEAAuE;QACvE,iEAAiE;QACjE,uCAAuC;QACvC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,kBAAkB,CAAC;KAChD,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,+DAA+D;QACjE,CAAC;QACD,MAAM,IAAI,KAAK,CACb,0BAA0B,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CACpF,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-auth.d.ts","sourceRoot":"","sources":["../../src/auth/run-auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AASH,OAAO,EAAE,WAAW,EAAqB,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAE,UAAU,EAAoB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"run-auth.d.ts","sourceRoot":"","sources":["../../src/auth/run-auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AASH,OAAO,EAAE,WAAW,EAAqB,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAE,UAAU,EAAoB,MAAM,oBAAoB,CAAC;AAGlE,MAAM,WAAW,cAAc;IAC7B,oEAAoE;IACpE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,aAAa,EAAE,MAAM,CAAC;IACtB,0EAA0E;IAC1E,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;IAC/B,8DAA8D;IAC9D,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;IAC/B,oEAAoE;IACpE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAChC,kCAAkC;IAClC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,6EAA6E;IAC7E,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,2CAA2C;IAC3C,WAAW,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC;IACvD,kDAAkD;IAClD,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,0CAA0C;IAC1C,WAAW,CAAC,EAAE,OAAO,WAAW,CAAC;IACjC,yCAAyC;IACzC,UAAU,CAAC,EAAE,OAAO,UAAU,CAAC;CAChC;AAED,MAAM,WAAW,aAAa;IAC5B,uCAAuC;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;CACjB;AAID;;;GAGG;AACH,wBAAsB,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CA+HnE"}
|
package/dist/auth/run-auth.js
CHANGED
|
@@ -13,6 +13,7 @@ import { runDeviceFlow, DeviceFlowClientError, } from './device-client.js';
|
|
|
13
13
|
import { writeAuthStore, resolveAuthPath } from './auth-store.js';
|
|
14
14
|
import { detectTools } from './tool-detection.js';
|
|
15
15
|
import { patchTools } from './tool-patching.js';
|
|
16
|
+
import { heartbeat } from './heartbeat.js';
|
|
16
17
|
const DEFAULT_API_BASE = 'https://api-v3.recall.team';
|
|
17
18
|
/**
|
|
18
19
|
* Returns 0 on success, non-zero on failure. Never throws — all errors
|
|
@@ -117,9 +118,74 @@ export async function runAuth(opts) {
|
|
|
117
118
|
return 0;
|
|
118
119
|
}
|
|
119
120
|
renderPatchResults(patchResults, stdout);
|
|
121
|
+
// Install-Health funnel: heartbeat installer_completed + tools_patched
|
|
122
|
+
// for each successfully-patched tool. Per-tool because the funnel is
|
|
123
|
+
// keyed on (user, team, mcp_client, transport) — each AI tool gets its
|
|
124
|
+
// own connection row. Fire-and-forget: a heartbeat failure must not
|
|
125
|
+
// turn a successful auth into a failed one.
|
|
126
|
+
await fireInstallHealthHeartbeats(patchResults, opts.clientVersion, stdout);
|
|
120
127
|
const anyFailed = patchResults.some((r) => r.status === 'failed');
|
|
121
128
|
return anyFailed ? 1 : 0;
|
|
122
129
|
}
|
|
130
|
+
/**
|
|
131
|
+
* For every patch result whose status indicates the tool is now
|
|
132
|
+
* configured (`installed`, `updated`, `already-installed`), record
|
|
133
|
+
* `installer_completed` then `tools_patched` against that tool's
|
|
134
|
+
* connection. Skips tools that were `skipped` (not detected) or
|
|
135
|
+
* `failed` — there's no successful install state to record.
|
|
136
|
+
*
|
|
137
|
+
* Failures here are logged to stdout and swallowed: the user's
|
|
138
|
+
* auth flow already succeeded, the funnel is observability.
|
|
139
|
+
*
|
|
140
|
+
* Concurrency: parallelize across tools via Promise.allSettled so the
|
|
141
|
+
* user-visible auth flow doesn't pay 2N round-trips of latency at the
|
|
142
|
+
* tail. Within a single tool the two state writes stay sequential to
|
|
143
|
+
* preserve the funnel ordering invariant. Each heartbeat is bounded
|
|
144
|
+
* by an internal AbortSignal.timeout (see heartbeat.ts).
|
|
145
|
+
*/
|
|
146
|
+
async function fireInstallHealthHeartbeats(results, clientVersion, stdout) {
|
|
147
|
+
const successful = results.filter((r) => r.status === 'installed' || r.status === 'updated' || r.status === 'already-installed');
|
|
148
|
+
if (successful.length === 0)
|
|
149
|
+
return;
|
|
150
|
+
await Promise.allSettled(successful.map((result) => fireForTool(result, clientVersion, stdout)));
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Fire both install-health states for a single tool. Per-state
|
|
154
|
+
* try/catch so a failed `installer_completed` doesn't suppress the
|
|
155
|
+
* `tools_patched` attempt for the same tool, and a failed
|
|
156
|
+
* `tools_patched` doesn't get blamed on `installer_completed` in
|
|
157
|
+
* support logs. The catch line names the state explicitly.
|
|
158
|
+
*/
|
|
159
|
+
async function fireForTool(result, clientVersion, stdout) {
|
|
160
|
+
try {
|
|
161
|
+
await heartbeat({
|
|
162
|
+
state: 'installer_completed',
|
|
163
|
+
mcpClient: result.id,
|
|
164
|
+
clientVersion,
|
|
165
|
+
transport: 'stdio',
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
catch (err) {
|
|
169
|
+
stdout.write(` (heartbeat installer_completed for ${result.displayName} [${result.id}] failed: ${err instanceof Error ? err.message : String(err)})\n`);
|
|
170
|
+
}
|
|
171
|
+
try {
|
|
172
|
+
await heartbeat({
|
|
173
|
+
state: 'tools_patched',
|
|
174
|
+
mcpClient: result.id,
|
|
175
|
+
clientVersion,
|
|
176
|
+
transport: 'stdio',
|
|
177
|
+
payload: {
|
|
178
|
+
status: result.status,
|
|
179
|
+
method: result.method,
|
|
180
|
+
path: result.path,
|
|
181
|
+
reason: result.reason,
|
|
182
|
+
},
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
catch (err) {
|
|
186
|
+
stdout.write(` (heartbeat tools_patched for ${result.displayName} [${result.id}] failed: ${err instanceof Error ? err.message : String(err)})\n`);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
123
189
|
// ============================================================================
|
|
124
190
|
// UX rendering — deliberately plain-text for broad terminal compatibility.
|
|
125
191
|
// Color + box drawing come in a follow-up PR once cross-platform behavior
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-auth.js","sourceRoot":"","sources":["../../src/auth/run-auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EACL,aAAa,EACb,qBAAqB,GAEtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAqB,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAE,UAAU,EAAoB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"run-auth.js","sourceRoot":"","sources":["../../src/auth/run-auth.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA8FH;;;GAGG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE;IAC5C,cAAc,EAAE,MAAM,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuEhB;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgDhB;AAmGD;;GAEG;AACH,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA+M1D"}
|
package/dist/cli.js
CHANGED
|
@@ -11,6 +11,7 @@ import { preprocessTranscript } from './preprocessor.js';
|
|
|
11
11
|
import * as api from './api.js';
|
|
12
12
|
import { extractPreliminarySummary } from './format.js';
|
|
13
13
|
import { runAuth } from './auth/run-auth.js';
|
|
14
|
+
import { heartbeat } from './auth/heartbeat.js';
|
|
14
15
|
// Pull MCP version lazily only when `auth` runs — avoids touching package.json
|
|
15
16
|
// for every cli invocation. If package.json is unreadable or missing a
|
|
16
17
|
// version, fail loud: recording '0.0.0-unknown' in auth stores would pollute
|
|
@@ -254,6 +255,34 @@ Options:
|
|
|
254
255
|
function hasHelpFlag(args) {
|
|
255
256
|
return args.includes('--help') || args.includes('-h');
|
|
256
257
|
}
|
|
258
|
+
function parseFlag(args, flag) {
|
|
259
|
+
const eqMatch = args.find((a) => a.startsWith(`${flag}=`))?.slice(flag.length + 1);
|
|
260
|
+
if (eqMatch !== undefined)
|
|
261
|
+
return eqMatch;
|
|
262
|
+
const idx = args.indexOf(flag);
|
|
263
|
+
if (idx >= 0 && idx + 1 < args.length)
|
|
264
|
+
return args[idx + 1];
|
|
265
|
+
return undefined;
|
|
266
|
+
}
|
|
267
|
+
function printHeartbeatHelp() {
|
|
268
|
+
console.log(`
|
|
269
|
+
Usage: recall-mcp-v3 heartbeat --state <state> --tool <mcp_client> --transport <stdio|http> [options]
|
|
270
|
+
|
|
271
|
+
Internal install-health debug subcommand. Emits one heartbeat against
|
|
272
|
+
/v1/clients/heartbeat using the persisted auth token. Used by
|
|
273
|
+
\`recall-mcp-v3 auth\` and the MCP server startup beacon; exposed as a
|
|
274
|
+
CLI for manual debugging.
|
|
275
|
+
|
|
276
|
+
Options:
|
|
277
|
+
--state <state> Funnel state to record. One of:
|
|
278
|
+
installer_completed, tools_patched, mcp_started,
|
|
279
|
+
first_tool_call, first_session_saved.
|
|
280
|
+
--tool <name> mcp_client value (e.g., claude-code, cursor).
|
|
281
|
+
--transport <t> 'stdio' or 'http'.
|
|
282
|
+
--payload <json> Optional JSON payload (e.g., patch-result detail).
|
|
283
|
+
-h, --help Show this help.
|
|
284
|
+
`);
|
|
285
|
+
}
|
|
257
286
|
/**
|
|
258
287
|
* CLI entry point - parses arguments and dispatches to commands.
|
|
259
288
|
*/
|
|
@@ -339,6 +368,59 @@ export async function runCli(args) {
|
|
|
339
368
|
});
|
|
340
369
|
process.exit(code);
|
|
341
370
|
}
|
|
371
|
+
case 'heartbeat': {
|
|
372
|
+
// Hidden internal subcommand for manual install-health debugging.
|
|
373
|
+
// Not advertised in main help. Emits one heartbeat to
|
|
374
|
+
// /v1/clients/heartbeat using the persisted auth-store token.
|
|
375
|
+
//
|
|
376
|
+
// Usage:
|
|
377
|
+
// recall-mcp-v3 heartbeat \
|
|
378
|
+
// --state mcp_started \
|
|
379
|
+
// --tool claude-code \
|
|
380
|
+
// --transport stdio \
|
|
381
|
+
// [--payload '{"foo":"bar"}']
|
|
382
|
+
if (hasHelpFlag(args)) {
|
|
383
|
+
printHeartbeatHelp();
|
|
384
|
+
break;
|
|
385
|
+
}
|
|
386
|
+
const state = parseFlag(args, '--state');
|
|
387
|
+
const tool = parseFlag(args, '--tool');
|
|
388
|
+
const transport = parseFlag(args, '--transport');
|
|
389
|
+
const payloadStr = parseFlag(args, '--payload');
|
|
390
|
+
if (!state || !tool || !transport) {
|
|
391
|
+
console.error('Usage: recall-mcp-v3 heartbeat --state <state> --tool <mcp_client> --transport <stdio|http> [--payload <json>]');
|
|
392
|
+
process.exit(1);
|
|
393
|
+
}
|
|
394
|
+
if (transport !== 'stdio' && transport !== 'http') {
|
|
395
|
+
console.error(`Unknown transport "${transport}". Expected stdio or http.`);
|
|
396
|
+
process.exit(1);
|
|
397
|
+
}
|
|
398
|
+
let payload;
|
|
399
|
+
if (payloadStr) {
|
|
400
|
+
try {
|
|
401
|
+
payload = JSON.parse(payloadStr);
|
|
402
|
+
}
|
|
403
|
+
catch (err) {
|
|
404
|
+
console.error(`--payload is not valid JSON: ${err instanceof Error ? err.message : String(err)}`);
|
|
405
|
+
process.exit(1);
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
try {
|
|
409
|
+
await heartbeat({
|
|
410
|
+
state: state,
|
|
411
|
+
mcpClient: tool,
|
|
412
|
+
clientVersion: getMcpVersion(),
|
|
413
|
+
transport: transport,
|
|
414
|
+
payload,
|
|
415
|
+
});
|
|
416
|
+
console.log(`Heartbeat sent: ${state} (tool=${tool}, transport=${transport})`);
|
|
417
|
+
}
|
|
418
|
+
catch (err) {
|
|
419
|
+
console.error(`Heartbeat failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
420
|
+
process.exit(1);
|
|
421
|
+
}
|
|
422
|
+
break;
|
|
423
|
+
}
|
|
342
424
|
case 'help':
|
|
343
425
|
case '--help':
|
|
344
426
|
case '-h': {
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -17,6 +17,7 @@ const { version: MCP_VERSION } = require('../package.json');
|
|
|
17
17
|
import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
18
18
|
import { getContext, getOrigin, getUserSessions, getHistory, getTranscripts, saveSession, logDecision, getTeamActivity, } from './tools.js';
|
|
19
19
|
import { runCli } from './cli.js';
|
|
20
|
+
import { createStartedBeacon } from './started-beacon.js';
|
|
20
21
|
// Tool definitions
|
|
21
22
|
const TOOLS = [
|
|
22
23
|
{
|
|
@@ -200,6 +201,7 @@ const TOOLS = [
|
|
|
200
201
|
];
|
|
201
202
|
class RecallServer {
|
|
202
203
|
server;
|
|
204
|
+
fireStartedBeacon;
|
|
203
205
|
constructor() {
|
|
204
206
|
this.server = new Server({
|
|
205
207
|
name: 'recall-mcp',
|
|
@@ -209,15 +211,26 @@ class RecallServer {
|
|
|
209
211
|
tools: {},
|
|
210
212
|
},
|
|
211
213
|
});
|
|
214
|
+
this.fireStartedBeacon = createStartedBeacon({ version: MCP_VERSION });
|
|
212
215
|
this.setupHandlers();
|
|
213
216
|
}
|
|
214
217
|
setupHandlers() {
|
|
215
218
|
// List available tools
|
|
216
219
|
this.server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
220
|
+
// Fire mcp_started exactly once per process. ListTools is the first
|
|
221
|
+
// method any AI tool calls after MCP initialize; firing here proves
|
|
222
|
+
// the tool actually loaded the server (not just enumerated the
|
|
223
|
+
// binary). Fire-and-forget so the response is never blocked.
|
|
224
|
+
void this.fireStartedBeacon();
|
|
217
225
|
return { tools: TOOLS };
|
|
218
226
|
});
|
|
219
227
|
// Handle tool calls
|
|
220
228
|
this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
229
|
+
// Belt-and-suspenders: some clients call CallTool without a
|
|
230
|
+
// prior ListTools (e.g., after a reconnection that skipped
|
|
231
|
+
// capability negotiation). The beacon's internal guard makes
|
|
232
|
+
// duplicate firings a cheap no-op.
|
|
233
|
+
void this.fireStartedBeacon();
|
|
221
234
|
const { name, arguments: args = {} } = request.params;
|
|
222
235
|
try {
|
|
223
236
|
let result;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAEvC,gCAAgC;AAChC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAC5D,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GAEvB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EACL,UAAU,EACV,SAAS,EACT,eAAe,EACf,UAAU,EACV,cAAc,EACd,WAAW,EACX,WAAW,EACX,eAAe,GAShB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP startup beacon factory — install-health PR 7 / P1.E.2.
|
|
3
|
+
*
|
|
4
|
+
* Lives in its own module (separate from index.ts) so tests can import
|
|
5
|
+
* it without booting a real `RecallServer` over stdio. The MCP entry
|
|
6
|
+
* binary's bottom-of-file bootstrap (`new RecallServer(); server.run()`)
|
|
7
|
+
* runs at module-load time; routing tests through this file keeps that
|
|
8
|
+
* side effect away from vitest workers.
|
|
9
|
+
*/
|
|
10
|
+
import { heartbeat } from './auth/heartbeat.js';
|
|
11
|
+
import { getCachedDetection } from './detect.js';
|
|
12
|
+
/**
|
|
13
|
+
* Build a once-only "MCP started" beacon callable.
|
|
14
|
+
*
|
|
15
|
+
* Calling the returned function fires `heartbeat({ state: 'mcp_started' })`
|
|
16
|
+
* exactly once per invocation of this factory, against a permanent
|
|
17
|
+
* failure mode. Transient failures (network blip, 5xx, AbortSignal
|
|
18
|
+
* timeout, or a detection probe error) leave the guard open so the
|
|
19
|
+
* next request retries.
|
|
20
|
+
*
|
|
21
|
+
* Designed to be called from the first incoming MCP request handler
|
|
22
|
+
* (ListTools or CallTool) — that's what proves the AI tool actually
|
|
23
|
+
* loaded the server, not just enumerated the binary.
|
|
24
|
+
*
|
|
25
|
+
* Failures are caught and logged to stderr; a beacon failure must
|
|
26
|
+
* never break the MCP request the user is making.
|
|
27
|
+
*
|
|
28
|
+
* Deps are injectable so tests can mock heartbeat + detection without
|
|
29
|
+
* patching modules.
|
|
30
|
+
*/
|
|
31
|
+
export declare function createStartedBeacon(opts: {
|
|
32
|
+
version: string;
|
|
33
|
+
heartbeat?: typeof heartbeat;
|
|
34
|
+
getDetection?: typeof getCachedDetection;
|
|
35
|
+
log?: (msg: string) => void;
|
|
36
|
+
}): () => Promise<void>;
|
|
37
|
+
//# sourceMappingURL=started-beacon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"started-beacon.d.ts","sourceRoot":"","sources":["../src/started-beacon.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,SAAS,CAAC;IAC7B,YAAY,CAAC,EAAE,OAAO,kBAAkB,CAAC;IACzC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAgDtB"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP startup beacon factory — install-health PR 7 / P1.E.2.
|
|
3
|
+
*
|
|
4
|
+
* Lives in its own module (separate from index.ts) so tests can import
|
|
5
|
+
* it without booting a real `RecallServer` over stdio. The MCP entry
|
|
6
|
+
* binary's bottom-of-file bootstrap (`new RecallServer(); server.run()`)
|
|
7
|
+
* runs at module-load time; routing tests through this file keeps that
|
|
8
|
+
* side effect away from vitest workers.
|
|
9
|
+
*/
|
|
10
|
+
import { heartbeat } from './auth/heartbeat.js';
|
|
11
|
+
import { getCachedDetection } from './detect.js';
|
|
12
|
+
/**
|
|
13
|
+
* Build a once-only "MCP started" beacon callable.
|
|
14
|
+
*
|
|
15
|
+
* Calling the returned function fires `heartbeat({ state: 'mcp_started' })`
|
|
16
|
+
* exactly once per invocation of this factory, against a permanent
|
|
17
|
+
* failure mode. Transient failures (network blip, 5xx, AbortSignal
|
|
18
|
+
* timeout, or a detection probe error) leave the guard open so the
|
|
19
|
+
* next request retries.
|
|
20
|
+
*
|
|
21
|
+
* Designed to be called from the first incoming MCP request handler
|
|
22
|
+
* (ListTools or CallTool) — that's what proves the AI tool actually
|
|
23
|
+
* loaded the server, not just enumerated the binary.
|
|
24
|
+
*
|
|
25
|
+
* Failures are caught and logged to stderr; a beacon failure must
|
|
26
|
+
* never break the MCP request the user is making.
|
|
27
|
+
*
|
|
28
|
+
* Deps are injectable so tests can mock heartbeat + detection without
|
|
29
|
+
* patching modules.
|
|
30
|
+
*/
|
|
31
|
+
export function createStartedBeacon(opts) {
|
|
32
|
+
let fired = false;
|
|
33
|
+
const heartbeatImpl = opts.heartbeat ?? heartbeat;
|
|
34
|
+
const detectionImpl = opts.getDetection ?? getCachedDetection;
|
|
35
|
+
const logImpl = opts.log ?? ((msg) => console.error(msg));
|
|
36
|
+
return async () => {
|
|
37
|
+
if (fired)
|
|
38
|
+
return;
|
|
39
|
+
fired = true;
|
|
40
|
+
let detection;
|
|
41
|
+
try {
|
|
42
|
+
detection = detectionImpl();
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
// Detection errors are always transient — env probing can blip on
|
|
46
|
+
// a transient FS/process read. Unlock the guard so the next request
|
|
47
|
+
// retries; never let detection failure silently drop the funnel
|
|
48
|
+
// signal for the life of a long-running session.
|
|
49
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
50
|
+
fired = false;
|
|
51
|
+
logImpl(`[mcp_started beacon] detection failed: ${msg}`);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
await heartbeatImpl({
|
|
56
|
+
state: 'mcp_started',
|
|
57
|
+
mcpClient: detection.mcp_client,
|
|
58
|
+
clientVersion: opts.version,
|
|
59
|
+
transport: 'stdio',
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
64
|
+
// Differentiate permanent from transient failures:
|
|
65
|
+
// - "No auth token persisted" is stable for the life of this
|
|
66
|
+
// process (user hasn't run `recall-mcp-v3 auth` yet). Keep
|
|
67
|
+
// fired=true so we don't hammer the API on every request.
|
|
68
|
+
// - Network blips, 5xx, AbortSignal timeout are transient. Let
|
|
69
|
+
// the next request retry — a flaky moment shouldn't
|
|
70
|
+
// permanently drop the funnel signal for a long-running
|
|
71
|
+
// Claude Code session.
|
|
72
|
+
const isPermanent = msg.includes('No auth token persisted');
|
|
73
|
+
if (!isPermanent) {
|
|
74
|
+
fired = false;
|
|
75
|
+
}
|
|
76
|
+
logImpl(`[mcp_started beacon] heartbeat failed: ${msg}`);
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=started-beacon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"started-beacon.js","sourceRoot":"","sources":["../src/started-beacon.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAKnC;IACC,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC;IAClD,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,IAAI,kBAAkB,CAAC;IAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAElE,OAAO,KAAK,IAAI,EAAE;QAChB,IAAI,KAAK;YAAE,OAAO;QAClB,KAAK,GAAG,IAAI,CAAC;QACb,IAAI,SAAS,CAAC;QACd,IAAI,CAAC;YACH,SAAS,GAAG,aAAa,EAAE,CAAC;QAC9B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,kEAAkE;YAClE,oEAAoE;YACpE,gEAAgE;YAChE,iDAAiD;YACjD,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,KAAK,GAAG,KAAK,CAAC;YACd,OAAO,CAAC,0CAA0C,GAAG,EAAE,CAAC,CAAC;YACzD,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,MAAM,aAAa,CAAC;gBAClB,KAAK,EAAE,aAAa;gBACpB,SAAS,EAAE,SAAS,CAAC,UAAU;gBAC/B,aAAa,EAAE,IAAI,CAAC,OAAO;gBAC3B,SAAS,EAAE,OAAO;aACnB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,mDAAmD;YACnD,8DAA8D;YAC9D,8DAA8D;YAC9D,6DAA6D;YAC7D,gEAAgE;YAChE,uDAAuD;YACvD,2DAA2D;YAC3D,0BAA0B;YAC1B,MAAM,WAAW,GAAG,GAAG,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAC;YAC5D,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,KAAK,GAAG,KAAK,CAAC;YAChB,CAAC;YACD,OAAO,CACL,0CAA0C,GAAG,EAAE,CAChD,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|