@indigoai-us/hq-cloud 5.19.1 → 5.21.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/.github/workflows/ci.yml +8 -4
- package/.github/workflows/publish.yml +9 -3
- package/dist/bin/sync-runner.d.ts +9 -0
- package/dist/bin/sync-runner.d.ts.map +1 -1
- package/dist/bin/sync-runner.js +58 -0
- package/dist/bin/sync-runner.js.map +1 -1
- package/dist/entity-resolver.d.ts +53 -0
- package/dist/entity-resolver.d.ts.map +1 -0
- package/dist/entity-resolver.js +127 -0
- package/dist/entity-resolver.js.map +1 -0
- package/dist/entity-resolver.test.d.ts +10 -0
- package/dist/entity-resolver.test.d.ts.map +1 -0
- package/dist/entity-resolver.test.js +244 -0
- package/dist/entity-resolver.test.js.map +1 -0
- package/dist/index.d.ts +17 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -1
- package/dist/schemas/signal-types.d.ts +16 -0
- package/dist/schemas/signal-types.d.ts.map +1 -0
- package/dist/schemas/signal-types.js +30 -0
- package/dist/schemas/signal-types.js.map +1 -0
- package/dist/schemas/signal-types.test.d.ts +2 -0
- package/dist/schemas/signal-types.test.d.ts.map +1 -0
- package/dist/schemas/signal-types.test.js +65 -0
- package/dist/schemas/signal-types.test.js.map +1 -0
- package/dist/schemas/source-channels.d.ts +15 -0
- package/dist/schemas/source-channels.d.ts.map +1 -0
- package/dist/schemas/source-channels.js +28 -0
- package/dist/schemas/source-channels.js.map +1 -0
- package/dist/schemas/source-channels.test.d.ts +2 -0
- package/dist/schemas/source-channels.test.d.ts.map +1 -0
- package/dist/schemas/source-channels.test.js +65 -0
- package/dist/schemas/source-channels.test.js.map +1 -0
- package/dist/signals/get.d.ts +13 -0
- package/dist/signals/get.d.ts.map +1 -0
- package/dist/signals/get.js +74 -0
- package/dist/signals/get.js.map +1 -0
- package/dist/signals/get.test.d.ts +5 -0
- package/dist/signals/get.test.d.ts.map +1 -0
- package/dist/signals/get.test.js +170 -0
- package/dist/signals/get.test.js.map +1 -0
- package/dist/signals/internals.d.ts +16 -0
- package/dist/signals/internals.d.ts.map +1 -0
- package/dist/signals/internals.js +39 -0
- package/dist/signals/internals.js.map +1 -0
- package/dist/signals/list.d.ts +10 -0
- package/dist/signals/list.d.ts.map +1 -0
- package/dist/signals/list.js +76 -0
- package/dist/signals/list.js.map +1 -0
- package/dist/signals/list.test.d.ts +9 -0
- package/dist/signals/list.test.d.ts.map +1 -0
- package/dist/signals/list.test.js +227 -0
- package/dist/signals/list.test.js.map +1 -0
- package/dist/signals/parse.d.ts +8 -0
- package/dist/signals/parse.d.ts.map +1 -0
- package/dist/signals/parse.js +8 -0
- package/dist/signals/parse.js.map +1 -0
- package/dist/signals/types.d.ts +69 -0
- package/dist/signals/types.d.ts.map +1 -0
- package/dist/signals/types.js +10 -0
- package/dist/signals/types.js.map +1 -0
- package/dist/sources/get.d.ts +11 -0
- package/dist/sources/get.d.ts.map +1 -0
- package/dist/sources/get.js +67 -0
- package/dist/sources/get.js.map +1 -0
- package/dist/sources/get.test.d.ts +5 -0
- package/dist/sources/get.test.d.ts.map +1 -0
- package/dist/sources/get.test.js +132 -0
- package/dist/sources/get.test.js.map +1 -0
- package/dist/sources/internals.d.ts +16 -0
- package/dist/sources/internals.d.ts.map +1 -0
- package/dist/sources/internals.js +39 -0
- package/dist/sources/internals.js.map +1 -0
- package/dist/sources/list.d.ts +10 -0
- package/dist/sources/list.d.ts.map +1 -0
- package/dist/sources/list.js +76 -0
- package/dist/sources/list.js.map +1 -0
- package/dist/sources/list.test.d.ts +8 -0
- package/dist/sources/list.test.d.ts.map +1 -0
- package/dist/sources/list.test.js +198 -0
- package/dist/sources/list.test.js.map +1 -0
- package/dist/sources/parse.d.ts +18 -0
- package/dist/sources/parse.d.ts.map +1 -0
- package/dist/sources/parse.js +35 -0
- package/dist/sources/parse.js.map +1 -0
- package/dist/sources/types.d.ts +62 -0
- package/dist/sources/types.d.ts.map +1 -0
- package/dist/sources/types.js +8 -0
- package/dist/sources/types.js.map +1 -0
- package/dist/telemetry.d.ts +87 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +349 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/telemetry.test.d.ts +11 -0
- package/dist/telemetry.test.d.ts.map +1 -0
- package/dist/telemetry.test.js +309 -0
- package/dist/telemetry.test.js.map +1 -0
- package/dist/vault-client.d.ts +43 -0
- package/dist/vault-client.d.ts.map +1 -1
- package/dist/vault-client.js +28 -0
- package/dist/vault-client.js.map +1 -1
- package/package.json +5 -3
- package/src/bin/sync-runner.ts +73 -0
- package/src/entity-resolver.test.ts +315 -0
- package/src/entity-resolver.ts +180 -0
- package/src/index.ts +76 -0
- package/src/schemas/signal-types.test.ts +82 -0
- package/src/schemas/signal-types.ts +38 -0
- package/src/schemas/source-channels.test.ts +82 -0
- package/src/schemas/source-channels.ts +36 -0
- package/src/signals/get.test.ts +204 -0
- package/src/signals/get.ts +79 -0
- package/src/signals/internals.ts +46 -0
- package/src/signals/list.test.ts +283 -0
- package/src/signals/list.ts +92 -0
- package/src/signals/parse.ts +8 -0
- package/src/signals/types.ts +74 -0
- package/src/sources/get.test.ts +166 -0
- package/src/sources/get.ts +75 -0
- package/src/sources/internals.ts +46 -0
- package/src/sources/list.test.ts +247 -0
- package/src/sources/list.ts +95 -0
- package/src/sources/parse.ts +43 -0
- package/src/sources/types.ts +67 -0
- package/src/telemetry.test.ts +394 -0
- package/src/telemetry.ts +436 -0
- package/src/vault-client.ts +60 -0
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for the usage telemetry collector. Mirrors the Rust test matrix at
|
|
3
|
+
* `hq-workspace/apps/hq-sync/src-tauri/src/commands/telemetry.rs::tests` so a
|
|
4
|
+
* behavioral regression in either implementation surfaces in both suites.
|
|
5
|
+
*
|
|
6
|
+
* The vault client is stubbed structurally rather than via fetch-mock so the
|
|
7
|
+
* tests stay deterministic without spinning up wiremock — the production
|
|
8
|
+
* boundary is `TelemetryClientSurface`, not the HTTP layer.
|
|
9
|
+
*/
|
|
10
|
+
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
11
|
+
import * as fs from "fs";
|
|
12
|
+
import * as os from "os";
|
|
13
|
+
import * as path from "path";
|
|
14
|
+
import { collectAndSendTelemetry, sanitizeRow, } from "./telemetry.js";
|
|
15
|
+
function makeClient(opts = {}) {
|
|
16
|
+
const optInResponse = opts.optInResponse ?? { enabled: true, updatedAt: null };
|
|
17
|
+
const postResponse = opts.postResponse ?? { ok: true, written: 0, skipped: [] };
|
|
18
|
+
const posts = [];
|
|
19
|
+
const stub = {
|
|
20
|
+
posts,
|
|
21
|
+
optInCalls: 0,
|
|
22
|
+
async getTelemetryOptIn() {
|
|
23
|
+
this.optInCalls++;
|
|
24
|
+
if (optInResponse instanceof Error)
|
|
25
|
+
throw optInResponse;
|
|
26
|
+
return optInResponse;
|
|
27
|
+
},
|
|
28
|
+
async postUsage(batch) {
|
|
29
|
+
posts.push(batch);
|
|
30
|
+
if (postResponse instanceof Error)
|
|
31
|
+
throw postResponse;
|
|
32
|
+
return postResponse;
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
return stub;
|
|
36
|
+
}
|
|
37
|
+
function setupEnv() {
|
|
38
|
+
const root = fs.mkdtempSync(path.join(os.tmpdir(), "hq-telemetry-test-"));
|
|
39
|
+
const claudeProjects = path.join(root, ".claude", "projects");
|
|
40
|
+
fs.mkdirSync(claudeProjects, { recursive: true });
|
|
41
|
+
fs.mkdirSync(path.join(root, ".hq"), { recursive: true });
|
|
42
|
+
return {
|
|
43
|
+
root,
|
|
44
|
+
claudeProjects,
|
|
45
|
+
cursorPath: path.join(root, ".hq", "telemetry-cursor.json"),
|
|
46
|
+
menubarPath: path.join(root, ".hq", "menubar.json"),
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function teardownEnv(env) {
|
|
50
|
+
fs.rmSync(env.root, { recursive: true, force: true });
|
|
51
|
+
}
|
|
52
|
+
function writeJsonl(env, sub, name, lines) {
|
|
53
|
+
const dir = path.join(env.claudeProjects, sub);
|
|
54
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
55
|
+
const p = path.join(dir, name);
|
|
56
|
+
fs.writeFileSync(p, lines.map((l) => `${l}\n`).join(""));
|
|
57
|
+
return p;
|
|
58
|
+
}
|
|
59
|
+
function readCursor(env) {
|
|
60
|
+
return JSON.parse(fs.readFileSync(env.cursorPath, "utf-8"));
|
|
61
|
+
}
|
|
62
|
+
function makeOpts(env, client) {
|
|
63
|
+
return {
|
|
64
|
+
client,
|
|
65
|
+
machineId: "test-machine",
|
|
66
|
+
installerVersion: "test-version",
|
|
67
|
+
claudeProjectsRoot: env.claudeProjects,
|
|
68
|
+
cursorPath: env.cursorPath,
|
|
69
|
+
menubarPath: env.menubarPath,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
// Representative Claude Code session rows. Mirror the Rust fixtures exactly so
|
|
73
|
+
// drift between implementations is detectable.
|
|
74
|
+
const USER_ROW = JSON.stringify({
|
|
75
|
+
type: "user",
|
|
76
|
+
timestamp: "2026-04-25T10:00:00Z",
|
|
77
|
+
sessionId: "s1",
|
|
78
|
+
uuid: "u1",
|
|
79
|
+
parentUuid: null,
|
|
80
|
+
userType: "human",
|
|
81
|
+
entrypoint: "cli",
|
|
82
|
+
cwd: "/Users/x/proj",
|
|
83
|
+
gitBranch: "main",
|
|
84
|
+
version: "1.0",
|
|
85
|
+
message: { role: "user", content: [{ type: "text", text: "hello world" }], id: "msg_1" },
|
|
86
|
+
});
|
|
87
|
+
const ASST_ROW = JSON.stringify({
|
|
88
|
+
type: "assistant",
|
|
89
|
+
timestamp: "2026-04-25T10:00:01Z",
|
|
90
|
+
sessionId: "s1",
|
|
91
|
+
uuid: "u2",
|
|
92
|
+
parentUuid: "u1",
|
|
93
|
+
message: {
|
|
94
|
+
role: "assistant",
|
|
95
|
+
model: "claude-opus",
|
|
96
|
+
content: [{ type: "text", text: "hi" }, { type: "thinking", thinking: "hmm" }],
|
|
97
|
+
stop_sequence: "</end>",
|
|
98
|
+
usage: { input_tokens: 42, output_tokens: 7, cache_read_input_tokens: 100 },
|
|
99
|
+
id: "msg_2",
|
|
100
|
+
},
|
|
101
|
+
toolUseIds: ["t1"],
|
|
102
|
+
toolResults: [{ id: "t1", output: "x" }],
|
|
103
|
+
requestId: "req_1",
|
|
104
|
+
});
|
|
105
|
+
// ── sanitizeRow ───────────────────────────────────────────────────────────────
|
|
106
|
+
describe("sanitizeRow", () => {
|
|
107
|
+
it("returns null for non-objects", () => {
|
|
108
|
+
expect(sanitizeRow(null)).toBeNull();
|
|
109
|
+
expect(sanitizeRow("string")).toBeNull();
|
|
110
|
+
expect(sanitizeRow(42)).toBeNull();
|
|
111
|
+
expect(sanitizeRow([])).toBeNull();
|
|
112
|
+
});
|
|
113
|
+
it("keeps only top-level allowlist fields", () => {
|
|
114
|
+
const row = JSON.parse(USER_ROW);
|
|
115
|
+
const out = sanitizeRow(row);
|
|
116
|
+
expect(out).not.toBeNull();
|
|
117
|
+
const keys = new Set(Object.keys(out));
|
|
118
|
+
// KEEP: sessionId, timestamp, uuid, cwd, gitBranch, userType
|
|
119
|
+
for (const expected of ["sessionId", "timestamp", "uuid", "cwd", "gitBranch", "userType"]) {
|
|
120
|
+
expect(keys.has(expected)).toBe(true);
|
|
121
|
+
}
|
|
122
|
+
// Sensitive / unknown fields must be absent:
|
|
123
|
+
for (const removed of ["type", "parentUuid", "entrypoint", "version", "message", "content", "thinking", "text", "toolUseIds", "toolResults"]) {
|
|
124
|
+
expect(keys.has(removed)).toBe(false);
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
it("promotes message.model and flattens message.usage to camelCase", () => {
|
|
128
|
+
const row = JSON.parse(ASST_ROW);
|
|
129
|
+
const out = sanitizeRow(row);
|
|
130
|
+
expect(out).not.toBeNull();
|
|
131
|
+
expect(out.model).toBe("claude-opus");
|
|
132
|
+
expect(out.inputTokens).toBe(42);
|
|
133
|
+
expect(out.outputTokens).toBe(7);
|
|
134
|
+
expect(out.cacheReadInputTokens).toBe(100);
|
|
135
|
+
// cacheCreationInputTokens not present in fixture; must be absent (not 0/null).
|
|
136
|
+
expect("cacheCreationInputTokens" in out).toBe(false);
|
|
137
|
+
// `message` must not survive — its prompt/thinking/tools are exactly what
|
|
138
|
+
// we're trying to keep off the wire.
|
|
139
|
+
expect("message" in out).toBe(false);
|
|
140
|
+
});
|
|
141
|
+
it("rejects every field outside the server KEEP allowlist", () => {
|
|
142
|
+
const out = sanitizeRow(JSON.parse(ASST_ROW));
|
|
143
|
+
const allowed = new Set([
|
|
144
|
+
"sessionId", "timestamp", "uuid", "cwd", "gitBranch", "userType",
|
|
145
|
+
"model", "inputTokens", "outputTokens",
|
|
146
|
+
"cacheCreationInputTokens", "cacheReadInputTokens",
|
|
147
|
+
]);
|
|
148
|
+
for (const key of Object.keys(out)) {
|
|
149
|
+
expect(allowed.has(key), `field "${key}" must be in server allowlist`).toBe(true);
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
// ── collectAndSendTelemetry ───────────────────────────────────────────────────
|
|
154
|
+
describe("collectAndSendTelemetry", () => {
|
|
155
|
+
let env;
|
|
156
|
+
beforeEach(() => { env = setupEnv(); });
|
|
157
|
+
afterEach(() => { teardownEnv(env); });
|
|
158
|
+
it("(a) opt-in=false → sends nothing and does not write cursor", async () => {
|
|
159
|
+
const client = makeClient({ optInResponse: { enabled: false, updatedAt: null } });
|
|
160
|
+
writeJsonl(env, "proj", "s.jsonl", [USER_ROW, ASST_ROW]);
|
|
161
|
+
const result = await collectAndSendTelemetry(makeOpts(env, client));
|
|
162
|
+
expect(result.enabled).toBe(false);
|
|
163
|
+
expect(result.optInSource).toBe("server");
|
|
164
|
+
expect(client.posts).toHaveLength(0);
|
|
165
|
+
expect(fs.existsSync(env.cursorPath)).toBe(false);
|
|
166
|
+
});
|
|
167
|
+
it("(b) missing cursor → reads all rows from offset 0, advances to EOF", async () => {
|
|
168
|
+
const client = makeClient();
|
|
169
|
+
const jsonlPath = writeJsonl(env, "proj", "s.jsonl", [USER_ROW, ASST_ROW]);
|
|
170
|
+
const fileSize = fs.statSync(jsonlPath).size;
|
|
171
|
+
const result = await collectAndSendTelemetry(makeOpts(env, client));
|
|
172
|
+
expect(result.enabled).toBe(true);
|
|
173
|
+
expect(result.eventsSent).toBe(2);
|
|
174
|
+
expect(client.posts).toHaveLength(1);
|
|
175
|
+
expect(client.posts[0].events).toHaveLength(2);
|
|
176
|
+
expect(client.posts[0].machineId).toBe("test-machine");
|
|
177
|
+
expect(client.posts[0].installerVersion).toBe("test-version");
|
|
178
|
+
const cursor = readCursor(env);
|
|
179
|
+
expect(cursor.files[jsonlPath].offset).toBe(fileSize);
|
|
180
|
+
});
|
|
181
|
+
it("(c) sanitizer strips REMOVE fields — only allowlisted fields reach wire", async () => {
|
|
182
|
+
const client = makeClient();
|
|
183
|
+
writeJsonl(env, "proj", "full.jsonl", [USER_ROW, ASST_ROW]);
|
|
184
|
+
await collectAndSendTelemetry(makeOpts(env, client));
|
|
185
|
+
expect(client.posts).toHaveLength(1);
|
|
186
|
+
const allowed = new Set([
|
|
187
|
+
"sessionId", "timestamp", "uuid", "cwd", "gitBranch", "userType",
|
|
188
|
+
"model", "inputTokens", "outputTokens",
|
|
189
|
+
"cacheCreationInputTokens", "cacheReadInputTokens",
|
|
190
|
+
]);
|
|
191
|
+
for (const ev of client.posts[0].events) {
|
|
192
|
+
for (const key of Object.keys(ev)) {
|
|
193
|
+
expect(allowed.has(key), `field "${key}" must be in allowlist`).toBe(true);
|
|
194
|
+
}
|
|
195
|
+
expect("message" in ev).toBe(false);
|
|
196
|
+
for (const banned of ["content", "thinking", "text", "toolUseIds", "toolResults"]) {
|
|
197
|
+
expect(banned in ev).toBe(false);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
it("(d) 1 MiB cap forces ≥2 batches when rows are large", async () => {
|
|
202
|
+
const client = makeClient();
|
|
203
|
+
// ~25 KiB per row × 50 rows ≈ 1.25 MiB → ≥2 batches.
|
|
204
|
+
const longBranch = "x".repeat(25_000);
|
|
205
|
+
const lines = [];
|
|
206
|
+
for (let i = 0; i < 50; i++) {
|
|
207
|
+
lines.push(JSON.stringify({
|
|
208
|
+
type: "user",
|
|
209
|
+
timestamp: `2026-04-25T10:00:${String(i % 60).padStart(2, "0")}Z`,
|
|
210
|
+
sessionId: "s1",
|
|
211
|
+
uuid: `u${i}`,
|
|
212
|
+
cwd: "/Users/x",
|
|
213
|
+
gitBranch: longBranch,
|
|
214
|
+
userType: "human",
|
|
215
|
+
message: { role: "user", content: [{ type: "text", text: "hi" }], id: "m" },
|
|
216
|
+
}));
|
|
217
|
+
}
|
|
218
|
+
writeJsonl(env, "proj", "large.jsonl", lines);
|
|
219
|
+
const result = await collectAndSendTelemetry(makeOpts(env, client));
|
|
220
|
+
expect(result.batchesSent).toBeGreaterThanOrEqual(2);
|
|
221
|
+
expect(result.eventsSent).toBe(50);
|
|
222
|
+
// Final batch must be < 1 MiB on the wire.
|
|
223
|
+
const lastWire = Buffer.byteLength(JSON.stringify(client.posts.at(-1)), "utf-8");
|
|
224
|
+
expect(lastWire).toBeLessThan(1_000_000);
|
|
225
|
+
});
|
|
226
|
+
it("(e) POST 500 → cursor NOT advanced", async () => {
|
|
227
|
+
const client = makeClient({ postResponse: new Error("server 500") });
|
|
228
|
+
writeJsonl(env, "proj", "s.jsonl", [USER_ROW, ASST_ROW, USER_ROW]);
|
|
229
|
+
const result = await collectAndSendTelemetry(makeOpts(env, client));
|
|
230
|
+
expect(result.eventsSent).toBe(0);
|
|
231
|
+
expect(result.batchesSent).toBe(0);
|
|
232
|
+
expect(client.posts).toHaveLength(1); // we still tried
|
|
233
|
+
// Cursor file is written (with rotation/empty resets), but the file's
|
|
234
|
+
// entry must NOT carry a non-zero offset.
|
|
235
|
+
if (fs.existsSync(env.cursorPath)) {
|
|
236
|
+
const cursor = readCursor(env);
|
|
237
|
+
const allOffsets = Object.values(cursor.files).map((e) => e.offset);
|
|
238
|
+
expect(allOffsets.every((off) => off === 0)).toBe(true);
|
|
239
|
+
}
|
|
240
|
+
});
|
|
241
|
+
it("(f) atomic cursor write — no .tmp leftover", async () => {
|
|
242
|
+
const client = makeClient();
|
|
243
|
+
writeJsonl(env, "proj", "s.jsonl", [USER_ROW]);
|
|
244
|
+
await collectAndSendTelemetry(makeOpts(env, client));
|
|
245
|
+
expect(fs.existsSync(env.cursorPath)).toBe(true);
|
|
246
|
+
expect(fs.existsSync(`${env.cursorPath}.tmp`)).toBe(false);
|
|
247
|
+
});
|
|
248
|
+
it("(g) new file between runs starts at offset 0", async () => {
|
|
249
|
+
const client = makeClient();
|
|
250
|
+
writeJsonl(env, "proj-a", "a.jsonl", [USER_ROW]);
|
|
251
|
+
await collectAndSendTelemetry(makeOpts(env, client));
|
|
252
|
+
const postsAfterRun1 = client.posts.length;
|
|
253
|
+
expect(postsAfterRun1).toBeGreaterThanOrEqual(1);
|
|
254
|
+
// Add a new fixture between runs.
|
|
255
|
+
const pathB = writeJsonl(env, "proj-b", "b.jsonl", [ASST_ROW]);
|
|
256
|
+
await collectAndSendTelemetry(makeOpts(env, client));
|
|
257
|
+
const cursor = readCursor(env);
|
|
258
|
+
const sizeB = fs.statSync(pathB).size;
|
|
259
|
+
expect(cursor.files[pathB].offset).toBe(sizeB);
|
|
260
|
+
});
|
|
261
|
+
it("(h) truncated/rotated file resets cursor to 0", async () => {
|
|
262
|
+
const client = makeClient();
|
|
263
|
+
const pathA = writeJsonl(env, "proj", "a.jsonl", [USER_ROW, ASST_ROW, USER_ROW]);
|
|
264
|
+
const originalSize = fs.statSync(pathA).size;
|
|
265
|
+
await collectAndSendTelemetry(makeOpts(env, client));
|
|
266
|
+
let cursor = readCursor(env);
|
|
267
|
+
expect(cursor.files[pathA].offset).toBe(originalSize);
|
|
268
|
+
// Truncate to 0 → next run must detect rotation and reset.
|
|
269
|
+
fs.truncateSync(pathA, 0);
|
|
270
|
+
await collectAndSendTelemetry(makeOpts(env, client));
|
|
271
|
+
cursor = readCursor(env);
|
|
272
|
+
expect(cursor.files[pathA].offset).toBe(0);
|
|
273
|
+
});
|
|
274
|
+
it("(i) opt-in GET fails → falls back to menubar.json (telemetryEnabled=true → runs)", async () => {
|
|
275
|
+
const client = makeClient({ optInResponse: new Error("server 500") });
|
|
276
|
+
fs.writeFileSync(env.menubarPath, JSON.stringify({ telemetryEnabled: true }));
|
|
277
|
+
writeJsonl(env, "proj", "s.jsonl", [USER_ROW]);
|
|
278
|
+
const result = await collectAndSendTelemetry(makeOpts(env, client));
|
|
279
|
+
expect(result.enabled).toBe(true);
|
|
280
|
+
expect(result.optInSource).toBe("menubar-fallback");
|
|
281
|
+
expect(client.posts).toHaveLength(1);
|
|
282
|
+
});
|
|
283
|
+
it("(i') opt-in GET fails AND menubar.json says false → skips", async () => {
|
|
284
|
+
const client = makeClient({ optInResponse: new Error("server 500") });
|
|
285
|
+
fs.writeFileSync(env.menubarPath, JSON.stringify({ telemetryEnabled: false }));
|
|
286
|
+
writeJsonl(env, "proj", "s.jsonl", [USER_ROW]);
|
|
287
|
+
const result = await collectAndSendTelemetry(makeOpts(env, client));
|
|
288
|
+
expect(result.enabled).toBe(false);
|
|
289
|
+
expect(result.optInSource).toBe("menubar-fallback");
|
|
290
|
+
expect(client.posts).toHaveLength(0);
|
|
291
|
+
});
|
|
292
|
+
it("(j) missing claude/projects directory → no crash, no posts", async () => {
|
|
293
|
+
fs.rmSync(env.claudeProjects, { recursive: true });
|
|
294
|
+
const client = makeClient();
|
|
295
|
+
const result = await collectAndSendTelemetry(makeOpts(env, client));
|
|
296
|
+
expect(result.enabled).toBe(true);
|
|
297
|
+
expect(result.filesScanned).toBe(0);
|
|
298
|
+
expect(client.posts).toHaveLength(0);
|
|
299
|
+
});
|
|
300
|
+
it("(k) second run with no new content sends nothing", async () => {
|
|
301
|
+
const client = makeClient();
|
|
302
|
+
writeJsonl(env, "proj", "s.jsonl", [USER_ROW, ASST_ROW]);
|
|
303
|
+
await collectAndSendTelemetry(makeOpts(env, client));
|
|
304
|
+
expect(client.posts).toHaveLength(1);
|
|
305
|
+
await collectAndSendTelemetry(makeOpts(env, client));
|
|
306
|
+
expect(client.posts).toHaveLength(1); // no second POST
|
|
307
|
+
});
|
|
308
|
+
});
|
|
309
|
+
//# sourceMappingURL=telemetry.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.test.js","sourceRoot":"","sources":["../src/telemetry.test.ts"],"names":[],"mappings":"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"}
|
package/dist/vault-client.d.ts
CHANGED
|
@@ -126,6 +126,32 @@ export interface VendChildResult {
|
|
|
126
126
|
/** ISO-8601 session expiration. */
|
|
127
127
|
expiresAt: string;
|
|
128
128
|
}
|
|
129
|
+
export interface TelemetryOptInResponse {
|
|
130
|
+
enabled: boolean;
|
|
131
|
+
updatedAt: string | null;
|
|
132
|
+
}
|
|
133
|
+
export interface UsageBatch {
|
|
134
|
+
machineId: string;
|
|
135
|
+
installerVersion: string;
|
|
136
|
+
/**
|
|
137
|
+
* Sanitized event rows. Each row is a plain object containing only the
|
|
138
|
+
* fields in the server's KEEP allowlist (sessionId, timestamp, uuid, cwd,
|
|
139
|
+
* gitBranch, userType, model, inputTokens, outputTokens,
|
|
140
|
+
* cacheCreationInputTokens, cacheReadInputTokens). Any extra field is
|
|
141
|
+
* rejected by hq-pro with `unexpected-event-field`, so the sanitizer in
|
|
142
|
+
* `./telemetry.ts` is the only thing allowed to produce these.
|
|
143
|
+
*/
|
|
144
|
+
events: Array<Record<string, unknown>>;
|
|
145
|
+
}
|
|
146
|
+
export interface UsageIngestResult {
|
|
147
|
+
ok: boolean;
|
|
148
|
+
written: number;
|
|
149
|
+
skipped: Array<{
|
|
150
|
+
index: number;
|
|
151
|
+
code: string;
|
|
152
|
+
error: string;
|
|
153
|
+
}>;
|
|
154
|
+
}
|
|
129
155
|
export declare class VaultClient {
|
|
130
156
|
private readonly apiUrl;
|
|
131
157
|
private readonly getAuthToken;
|
|
@@ -252,6 +278,23 @@ export declare class VaultClient {
|
|
|
252
278
|
expiresAt: string;
|
|
253
279
|
}>;
|
|
254
280
|
};
|
|
281
|
+
/**
|
|
282
|
+
* `GET /v1/usage/opt-in` — read whether the authenticated caller has opted
|
|
283
|
+
* in to per-event usage telemetry. Defaults to `false` server-side when the
|
|
284
|
+
* person row carries no `telemetryOptIn` field. Callers should treat any
|
|
285
|
+
* thrown error as "unknown — fall back to the local gate" rather than
|
|
286
|
+
* either yes or no; see `./telemetry.ts::collectAndSendTelemetry`.
|
|
287
|
+
*/
|
|
288
|
+
getTelemetryOptIn(): Promise<TelemetryOptInResponse>;
|
|
289
|
+
/**
|
|
290
|
+
* `POST /v1/usage` — upload a batch of sanitized telemetry events.
|
|
291
|
+
*
|
|
292
|
+
* `personUid` MUST NOT appear in the batch — server-side resolution from
|
|
293
|
+
* the JWT is the only path. The server caps the body at 256 KiB and the
|
|
294
|
+
* event list at 100 rows; the collector in `./telemetry.ts` enforces a
|
|
295
|
+
* 1 MiB pre-flush cap which is the binding limit in practice.
|
|
296
|
+
*/
|
|
297
|
+
postUsage(batch: UsageBatch): Promise<UsageIngestResult>;
|
|
255
298
|
private get;
|
|
256
299
|
private post;
|
|
257
300
|
private request;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vault-client.d.ts","sourceRoot":"","sources":["../src/vault-client.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"vault-client.d.ts","sourceRoot":"","sources":["../src/vault-client.ts"],"names":[],"mappings":"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"}
|
package/dist/vault-client.js
CHANGED
|
@@ -267,6 +267,34 @@ export class VaultClient {
|
|
|
267
267
|
return this.post("/sts/vend-self", input);
|
|
268
268
|
},
|
|
269
269
|
};
|
|
270
|
+
// -- Usage telemetry ------------------------------------------------------
|
|
271
|
+
//
|
|
272
|
+
// The server resolves `personUid` from the JWT (`extractCallerSub` →
|
|
273
|
+
// `resolveCallerPersonUid` in hq-pro `src/vault-service/handlers/_shared.ts`)
|
|
274
|
+
// and explicitly rejects any request body that carries a top-level
|
|
275
|
+
// `personUid`. So clients only send `{ machineId, installerVersion, events }`
|
|
276
|
+
// — tenant isolation is preserved no matter how this client is wrapped.
|
|
277
|
+
/**
|
|
278
|
+
* `GET /v1/usage/opt-in` — read whether the authenticated caller has opted
|
|
279
|
+
* in to per-event usage telemetry. Defaults to `false` server-side when the
|
|
280
|
+
* person row carries no `telemetryOptIn` field. Callers should treat any
|
|
281
|
+
* thrown error as "unknown — fall back to the local gate" rather than
|
|
282
|
+
* either yes or no; see `./telemetry.ts::collectAndSendTelemetry`.
|
|
283
|
+
*/
|
|
284
|
+
async getTelemetryOptIn() {
|
|
285
|
+
return this.get("/v1/usage/opt-in");
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* `POST /v1/usage` — upload a batch of sanitized telemetry events.
|
|
289
|
+
*
|
|
290
|
+
* `personUid` MUST NOT appear in the batch — server-side resolution from
|
|
291
|
+
* the JWT is the only path. The server caps the body at 256 KiB and the
|
|
292
|
+
* event list at 100 rows; the collector in `./telemetry.ts` enforces a
|
|
293
|
+
* 1 MiB pre-flush cap which is the binding limit in practice.
|
|
294
|
+
*/
|
|
295
|
+
async postUsage(batch) {
|
|
296
|
+
return this.post("/v1/usage", batch);
|
|
297
|
+
}
|
|
270
298
|
// -- HTTP primitives with retry -------------------------------------------
|
|
271
299
|
async get(path) {
|
|
272
300
|
return this.request("GET", path);
|
package/dist/vault-client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vault-client.js","sourceRoot":"","sources":["../src/vault-client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IAGvB;IACA;IAHlB,YACE,OAAe,EACC,UAAkB,EAClB,IAAa;QAE7B,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,eAAU,GAAV,UAAU,CAAQ;QAClB,SAAI,GAAJ,IAAI,CAAS;QAG7B,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,gBAAgB;IAClD,YAAY,OAAO,GAAG,oDAAoD;QACxE,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACpB,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED,MAAM,OAAO,0BAA2B,SAAQ,gBAAgB;IAC9D,YAAY,OAAO,GAAG,yCAAyC;QAC7D,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACpB,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;IAC3C,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,gBAAgB;IACtD,YAAY,OAAO,GAAG,oBAAoB;QACxC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACpB,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,gBAAgB;IACtD,YAAY,OAAO,GAAG,4DAA4D;QAChF,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACpB,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AA+DD,MAAM,UAAU,yBAAyB,CACvC,IAAkB;IAElB,iFAAiF;IACjF,iFAAiF;IACjF,4BAA4B;IAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IACxD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACxC,MAAM,EAAE,GAAI,CAAC,CAAC,SAAgC,IAAI,EAAE,CAAC;QACrD,MAAM,EAAE,GAAI,CAAC,CAAC,SAAgC,IAAI,EAAE,CAAC;QACrD,IAAI,EAAE,KAAK,EAAE;YAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvC,OAAO,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;AACnB,CAAC;
|
|
1
|
+
{"version":3,"file":"vault-client.js","sourceRoot":"","sources":["../src/vault-client.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@indigoai-us/hq-cloud",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.21.0",
|
|
4
4
|
"description": "HQ by Indigo cloud sync engine — bidirectional S3 sync for mobile access",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -21,12 +21,14 @@
|
|
|
21
21
|
"@aws-sdk/credential-providers": "^3.700.0",
|
|
22
22
|
"chokidar": "^4.0.0",
|
|
23
23
|
"ignore": "^6.0.0",
|
|
24
|
-
"open": "^10.1.0"
|
|
24
|
+
"open": "^10.1.0",
|
|
25
|
+
"js-yaml": "^4.1.0"
|
|
25
26
|
},
|
|
26
27
|
"devDependencies": {
|
|
27
28
|
"@types/node": "^22.0.0",
|
|
28
29
|
"typescript": "^5.7.0",
|
|
29
|
-
"vitest": "^3.0.0"
|
|
30
|
+
"vitest": "^3.0.0",
|
|
31
|
+
"@types/js-yaml": "^4.0.9"
|
|
30
32
|
},
|
|
31
33
|
"repository": {
|
|
32
34
|
"type": "git",
|
package/src/bin/sync-runner.ts
CHANGED
|
@@ -83,6 +83,7 @@ import { share as defaultShare } from "../cli/share.js";
|
|
|
83
83
|
import type { ShareOptions, ShareResult } from "../cli/share.js";
|
|
84
84
|
import type { ConflictStrategy } from "../cli/conflict.js";
|
|
85
85
|
import type { UploadAuthor } from "../s3.js";
|
|
86
|
+
import { collectAndSendTelemetry } from "../telemetry.js";
|
|
86
87
|
|
|
87
88
|
/**
|
|
88
89
|
* Sync direction for a run.
|
|
@@ -278,6 +279,15 @@ export interface RunnerDeps {
|
|
|
278
279
|
sync?: (options: SyncOptions) => Promise<SyncResult>;
|
|
279
280
|
/** Share function (push phase). Defaults to `cli/share.share`. */
|
|
280
281
|
share?: (options: ShareOptions) => Promise<ShareResult>;
|
|
282
|
+
/**
|
|
283
|
+
* Telemetry collector — runs just before the `all-complete` emit. Default
|
|
284
|
+
* implementation calls `collectAndSendTelemetry` from `../telemetry.js`
|
|
285
|
+
* using the real VaultClient; tests that inject `createVaultClient` are
|
|
286
|
+
* implicitly opted out (the default skips when the client isn't a real
|
|
287
|
+
* `VaultClient`). Tests that want to assert telemetry behavior should pass
|
|
288
|
+
* an explicit stub here.
|
|
289
|
+
*/
|
|
290
|
+
collectTelemetry?: () => Promise<void>;
|
|
281
291
|
}
|
|
282
292
|
|
|
283
293
|
// ---------------------------------------------------------------------------
|
|
@@ -445,6 +455,55 @@ function parseArgs(argv: string[]): ParsedArgs | { error: string } {
|
|
|
445
455
|
return { companies, company, onConflict, hqRoot, direction, watch, pollRemoteMs };
|
|
446
456
|
}
|
|
447
457
|
|
|
458
|
+
// ---------------------------------------------------------------------------
|
|
459
|
+
// Telemetry default — closes over the runner's vault client. Skipped when
|
|
460
|
+
// the caller injected a `createVaultClient` stub, because we have no
|
|
461
|
+
// guarantee the stub implements `getTelemetryOptIn` / `postUsage`. The real
|
|
462
|
+
// `VaultClient` from `../vault-client.js` always does. All errors are
|
|
463
|
+
// swallowed — telemetry must never abort or delay sync.
|
|
464
|
+
// ---------------------------------------------------------------------------
|
|
465
|
+
|
|
466
|
+
async function defaultCollectTelemetry(
|
|
467
|
+
client: VaultClientSurface,
|
|
468
|
+
clientIsStub: boolean,
|
|
469
|
+
): Promise<void> {
|
|
470
|
+
if (clientIsStub) return;
|
|
471
|
+
try {
|
|
472
|
+
// machineId: prefer ~/.hq/menubar.json (set by the menubar app on first
|
|
473
|
+
// launch). When absent — e.g. fresh CLI-only install — fall back to a
|
|
474
|
+
// value that makes the row identifiable as "unattributed" rather than
|
|
475
|
+
// crashing or spoofing another machine's id.
|
|
476
|
+
const menubarPath = path.join(os.homedir(), ".hq", "menubar.json");
|
|
477
|
+
let machineId = "unknown";
|
|
478
|
+
try {
|
|
479
|
+
const raw = await fs.promises.readFile(menubarPath, "utf-8");
|
|
480
|
+
const parsed = JSON.parse(raw) as { machineId?: unknown };
|
|
481
|
+
if (typeof parsed.machineId === "string" && parsed.machineId.length > 0) {
|
|
482
|
+
machineId = parsed.machineId;
|
|
483
|
+
}
|
|
484
|
+
} catch {
|
|
485
|
+
// No menubar.json — proceed with "unknown".
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
// installerVersion: callers (the Tauri menubar) set this when spawning
|
|
489
|
+
// the runner so the historical `installerVersion` dimension on
|
|
490
|
+
// CloudWatch keeps reporting the menubar version, not the runner's
|
|
491
|
+
// package version. CLI callers can leave it unset.
|
|
492
|
+
const installerVersion = process.env.HQ_INSTALLER_VERSION ?? "hq-cloud";
|
|
493
|
+
|
|
494
|
+
await collectAndSendTelemetry({
|
|
495
|
+
// The runtime guarantee here is that `clientIsStub === false` means
|
|
496
|
+
// `client` came from `new VaultClient(vaultConfig)` (see runRunner),
|
|
497
|
+
// which structurally satisfies `TelemetryClientSurface`.
|
|
498
|
+
client: client as unknown as Parameters<typeof collectAndSendTelemetry>[0]["client"],
|
|
499
|
+
machineId,
|
|
500
|
+
installerVersion,
|
|
501
|
+
});
|
|
502
|
+
} catch {
|
|
503
|
+
// Fire-and-forget; nothing escapes the boundary.
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
|
|
448
507
|
// ---------------------------------------------------------------------------
|
|
449
508
|
// runRunner — testable entrypoint
|
|
450
509
|
// ---------------------------------------------------------------------------
|
|
@@ -922,6 +981,20 @@ export async function runRunner(
|
|
|
922
981
|
});
|
|
923
982
|
}
|
|
924
983
|
|
|
984
|
+
// Fire telemetry collector before the all-complete emit so the cursor at
|
|
985
|
+
// `~/.hq/telemetry-cursor.json` is consistent with what the menubar sees.
|
|
986
|
+
// Awaited fully — fire-and-forget would lose in-flight POSTs at process
|
|
987
|
+
// exit, and the previous 10s race was wrong: a first-run user with
|
|
988
|
+
// backlog (e.g. 60K Claude session events) takes well over 10s legitimately,
|
|
989
|
+
// and the race silently dropped the entire batch when it fired. Errors
|
|
990
|
+
// are swallowed inside `defaultCollectTelemetry`; per-request timeouts
|
|
991
|
+
// come from `VaultClient`'s retry loop (3 attempts × exponential backoff),
|
|
992
|
+
// which naturally bounds the outer wait.
|
|
993
|
+
const telemetryFn =
|
|
994
|
+
deps.collectTelemetry ??
|
|
995
|
+
(() => defaultCollectTelemetry(client, deps.createVaultClient !== undefined));
|
|
996
|
+
await telemetryFn().catch(() => undefined);
|
|
997
|
+
|
|
925
998
|
emit({
|
|
926
999
|
type: "all-complete",
|
|
927
1000
|
companiesAttempted: plan.length,
|