@opendatalabs/connect 0.11.6 → 0.12.0-canary.7843ac9

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.
@@ -0,0 +1,76 @@
1
+ import type { CliChannel, CliEvent, CliInstallMethod, CliOutcome } from "../core/cli-types.js";
2
+ type TelemetryReason = "default" | "config_enabled" | "config_disabled" | "env_disabled" | "env_debug" | "local_only";
3
+ type TelemetryMetadata = Record<string, string | number | boolean | null>;
4
+ export interface TelemetryCommandContext {
5
+ command: string;
6
+ subcommand?: string;
7
+ source?: string;
8
+ cliVersion: string;
9
+ channel: CliChannel;
10
+ installMethod: CliInstallMethod;
11
+ options: {
12
+ json: boolean;
13
+ noInput: boolean;
14
+ quiet: boolean;
15
+ detach: boolean;
16
+ ipc: boolean;
17
+ };
18
+ localOnly?: boolean;
19
+ }
20
+ export interface TelemetryStatus {
21
+ enabled: boolean;
22
+ mode: "normal" | "disabled" | "debug";
23
+ reason: TelemetryReason;
24
+ installId: string;
25
+ endpoint: string;
26
+ queuedBatches: number;
27
+ }
28
+ interface TelemetryStoredEvent {
29
+ eventId: string;
30
+ eventVersion: number;
31
+ timestamp: string;
32
+ installId: string;
33
+ runId: string;
34
+ eventName: string;
35
+ command: string;
36
+ subcommand: string | null;
37
+ source: string | null;
38
+ connectorVersion: string | null;
39
+ authMode: string | null;
40
+ platform: string;
41
+ os: string;
42
+ arch: string;
43
+ cliVersion: string;
44
+ channel: CliChannel;
45
+ installMethod: CliInstallMethod;
46
+ ci: boolean;
47
+ agent: boolean;
48
+ interactive: boolean;
49
+ outcome: string | null;
50
+ errorClass: string | null;
51
+ durationMs: number | null;
52
+ storedScopeCount: number | null;
53
+ failedScopeCount: number | null;
54
+ metadata: TelemetryMetadata | null;
55
+ }
56
+ interface CommandResult {
57
+ exitCode: number;
58
+ outcome?: string | null;
59
+ errorClass?: string | null;
60
+ }
61
+ export interface CliTelemetrySession {
62
+ trackCliEvent(event: CliEvent | CliOutcome): void;
63
+ trackCustomEvent(eventName: string, patch?: Partial<TelemetryStoredEvent>): void;
64
+ markCommandResult(result: CommandResult): void;
65
+ persist(): Promise<void>;
66
+ flush(): Promise<void>;
67
+ }
68
+ export declare function flushTelemetryOutbox(): Promise<void>;
69
+ export declare function getTelemetryStatus(): Promise<TelemetryStatus>;
70
+ export declare function setTelemetryEnabled(enabled: boolean): Promise<void>;
71
+ export declare function setActiveTelemetrySession(session: CliTelemetrySession | null): void;
72
+ export declare function getActiveTelemetrySession(): CliTelemetrySession | null;
73
+ export declare function trackActiveTelemetryEvent(eventName: string, patch?: Partial<TelemetryStoredEvent>): void;
74
+ export declare function createCliTelemetrySession(context: TelemetryCommandContext): Promise<CliTelemetrySession>;
75
+ export {};
76
+ //# sourceMappingURL=telemetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../src/cli/telemetry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,494 @@
1
+ import crypto from "node:crypto";
2
+ import fs from "node:fs/promises";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ import { getTelemetryOutboxDir, readCliConfig, updateCliConfig, } from "../core/index.js";
6
+ const TELEMETRY_ENDPOINT = "https://telemetry.opendatalabs.com/v1/cli/events";
7
+ const MAX_EVENTS_PER_BATCH = 100;
8
+ const MAX_BATCH_BYTES = 64 * 1024;
9
+ const MAX_FILES_PER_FLUSH = 10;
10
+ const FLUSH_TIMEOUT_MS = 1500;
11
+ const EVENT_VERSION = 1;
12
+ let activeSession = null;
13
+ function randomId(prefix) {
14
+ return `${prefix}_${crypto.randomUUID()}`;
15
+ }
16
+ function nowIso() {
17
+ return new Date().toISOString();
18
+ }
19
+ function getEndpoint() {
20
+ return process.env.VANA_TELEMETRY_URL?.trim() || TELEMETRY_ENDPOINT;
21
+ }
22
+ function getInteractive(options) {
23
+ return Boolean(process.stdin.isTTY && process.stdout.isTTY && !options.noInput);
24
+ }
25
+ function sanitizeMetadata(metadata) {
26
+ if (!metadata) {
27
+ return null;
28
+ }
29
+ return Object.fromEntries(Object.entries(metadata).slice(0, 16));
30
+ }
31
+ function countScopeResults(scopeResults) {
32
+ return {
33
+ storedScopeCount: scopeResults?.filter((item) => item.status === "stored").length ?? null,
34
+ failedScopeCount: scopeResults?.filter((item) => item.status === "failed").length ?? null,
35
+ };
36
+ }
37
+ function classifyError(reason) {
38
+ const value = (reason ?? "").toLowerCase();
39
+ if (!value)
40
+ return null;
41
+ if (value.includes("setup_declined"))
42
+ return "setup_declined";
43
+ if (value.includes("setup_required"))
44
+ return "setup_required";
45
+ if (value.includes("source_required"))
46
+ return "source_required";
47
+ if (value.includes("prompt_cancelled") || value.includes("cancelled"))
48
+ return "prompt_cancelled";
49
+ if (value.includes("needs_input") ||
50
+ value.includes("needs input") ||
51
+ value.includes("input required") ||
52
+ value.includes("manual step"))
53
+ return "needs_input";
54
+ if (value.includes("auth expired"))
55
+ return "auth_expired";
56
+ if (value.includes("auth"))
57
+ return "auth_failed";
58
+ if (value.includes("legacy"))
59
+ return "legacy_auth";
60
+ if (value.includes("personal_server_unavailable") ||
61
+ value.includes("personal server unavailable"))
62
+ return "personal_server_unavailable";
63
+ if (value.includes("timeout") || value.includes("timed out"))
64
+ return "timeout";
65
+ if (value.includes("network"))
66
+ return "network_error";
67
+ if (value.includes("ingest"))
68
+ return "ingest_failed";
69
+ if (value.includes("connector"))
70
+ return "connector_unavailable";
71
+ if (value.includes("runtime"))
72
+ return "runtime_error";
73
+ return "unknown";
74
+ }
75
+ function classifyOutcomeStatus(outcome) {
76
+ switch (outcome) {
77
+ case "needs_input":
78
+ return "needs_input";
79
+ case "auth_failed":
80
+ return "auth_failed";
81
+ case "legacy_auth":
82
+ return "legacy_auth";
83
+ case "personal_server_unavailable":
84
+ return "personal_server_unavailable";
85
+ case "ingest_failed":
86
+ return "ingest_failed";
87
+ case "connector_unavailable":
88
+ return "connector_unavailable";
89
+ case "runtime_error":
90
+ return "runtime_error";
91
+ case "setup_required":
92
+ return "setup_required";
93
+ case "setup_declined":
94
+ return "setup_declined";
95
+ case "source_required":
96
+ return "source_required";
97
+ case "prompt_cancelled":
98
+ return "prompt_cancelled";
99
+ case "invalid_connector":
100
+ return "invalid_connector";
101
+ case "unexpected_internal_error":
102
+ return "unexpected_internal_error";
103
+ default:
104
+ return null;
105
+ }
106
+ }
107
+ function resolveErrorClass(...candidates) {
108
+ const preferred = candidates.find((candidate) => Boolean(candidate && candidate !== "unknown"));
109
+ if (preferred) {
110
+ return preferred;
111
+ }
112
+ return (candidates.find((candidate) => Boolean(candidate)) ??
113
+ null);
114
+ }
115
+ function mapCliEventToTelemetry(event) {
116
+ switch (event.type) {
117
+ case "setup-check":
118
+ return {
119
+ eventName: "runtime_check_completed",
120
+ patch: {
121
+ metadata: sanitizeMetadata({ runtime: event.runtime ?? null }),
122
+ },
123
+ };
124
+ case "setup-complete":
125
+ return {
126
+ eventName: "runtime_install_completed",
127
+ patch: {
128
+ metadata: sanitizeMetadata({ runtime: event.runtime ?? null }),
129
+ },
130
+ };
131
+ case "connector-resolved":
132
+ return { eventName: "connector_resolved" };
133
+ case "needs-input":
134
+ return {
135
+ eventName: "input_required",
136
+ patch: {
137
+ errorClass: "needs_input",
138
+ metadata: sanitizeMetadata({ fieldCount: event.fields?.length ?? 0 }),
139
+ },
140
+ };
141
+ case "legacy-auth":
142
+ return {
143
+ eventName: "legacy_auth_required",
144
+ patch: { errorClass: "legacy_auth" },
145
+ };
146
+ case "collection-complete":
147
+ return { eventName: "collection_completed" };
148
+ case "runtime-error":
149
+ return {
150
+ eventName: "collection_failed",
151
+ patch: { errorClass: classifyError(event.message) ?? "runtime_error" },
152
+ };
153
+ case "ingest-started":
154
+ return { eventName: "ingest_started" };
155
+ case "ingest-complete":
156
+ return {
157
+ eventName: "ingest_completed",
158
+ patch: countScopeResults(event.scopeResults),
159
+ };
160
+ case "ingest-partial":
161
+ return {
162
+ eventName: "ingest_partial",
163
+ patch: {
164
+ ...countScopeResults(event.scopeResults),
165
+ errorClass: "ingest_failed",
166
+ },
167
+ };
168
+ case "ingest-failed":
169
+ return {
170
+ eventName: "ingest_failed",
171
+ patch: {
172
+ ...countScopeResults(event.scopeResults),
173
+ errorClass: "ingest_failed",
174
+ },
175
+ };
176
+ case "ingest-skipped":
177
+ return {
178
+ eventName: "ingest_skipped",
179
+ patch: {
180
+ errorClass: classifyError(event.reason) ?? null,
181
+ metadata: sanitizeMetadata({ reason: event.reason ?? null }),
182
+ },
183
+ };
184
+ case "outcome":
185
+ case "progress-update":
186
+ case "status-update":
187
+ case "headed-required":
188
+ case "jpeg":
189
+ return null;
190
+ }
191
+ return null;
192
+ }
193
+ async function ensureOutboxDir() {
194
+ await fs.mkdir(getTelemetryOutboxDir(), { recursive: true });
195
+ }
196
+ async function listOutboxFiles() {
197
+ try {
198
+ const dirents = await fs.readdir(getTelemetryOutboxDir(), {
199
+ withFileTypes: true,
200
+ });
201
+ return dirents
202
+ .filter((entry) => entry.isFile() && entry.name.endsWith(".json"))
203
+ .map((entry) => path.join(getTelemetryOutboxDir(), entry.name))
204
+ .sort();
205
+ }
206
+ catch {
207
+ return [];
208
+ }
209
+ }
210
+ async function countQueuedBatches() {
211
+ return (await listOutboxFiles()).length;
212
+ }
213
+ async function ensureTelemetryInstallId() {
214
+ const config = await readCliConfig();
215
+ if (config.telemetryInstallId) {
216
+ return config.telemetryInstallId;
217
+ }
218
+ const installId = randomId("inst");
219
+ await updateCliConfig({ telemetryInstallId: installId });
220
+ return installId;
221
+ }
222
+ async function resolveTelemetryState(localOnly = false) {
223
+ const config = await readCliConfig();
224
+ const installId = await ensureTelemetryInstallId();
225
+ const queuedBatches = await countQueuedBatches();
226
+ if (localOnly) {
227
+ return {
228
+ enabled: false,
229
+ mode: "local_only",
230
+ reason: "local_only",
231
+ endpoint: getEndpoint(),
232
+ installId,
233
+ queuedBatches,
234
+ };
235
+ }
236
+ if (process.env.VANA_TELEMETRY_DEBUG === "1") {
237
+ return {
238
+ enabled: true,
239
+ mode: "debug",
240
+ reason: "env_debug",
241
+ endpoint: getEndpoint(),
242
+ installId,
243
+ queuedBatches,
244
+ };
245
+ }
246
+ if (process.env.VANA_TELEMETRY_DISABLED === "1") {
247
+ return {
248
+ enabled: false,
249
+ mode: "disabled",
250
+ reason: "env_disabled",
251
+ endpoint: getEndpoint(),
252
+ installId,
253
+ queuedBatches,
254
+ };
255
+ }
256
+ if (config.telemetryEnabled === false) {
257
+ return {
258
+ enabled: false,
259
+ mode: "disabled",
260
+ reason: "config_disabled",
261
+ endpoint: getEndpoint(),
262
+ installId,
263
+ queuedBatches,
264
+ };
265
+ }
266
+ return {
267
+ enabled: true,
268
+ mode: "normal",
269
+ reason: config.telemetryEnabled ? "config_enabled" : "default",
270
+ endpoint: getEndpoint(),
271
+ installId,
272
+ queuedBatches,
273
+ };
274
+ }
275
+ function createEventFactory(context, state) {
276
+ const runId = randomId("run");
277
+ const base = {
278
+ installId: state.installId,
279
+ runId,
280
+ command: context.command,
281
+ subcommand: context.subcommand ?? null,
282
+ source: context.source ?? null,
283
+ connectorVersion: null,
284
+ authMode: null,
285
+ platform: `${process.platform}-${os.arch()}`,
286
+ os: process.platform,
287
+ arch: os.arch(),
288
+ cliVersion: context.cliVersion,
289
+ channel: context.channel,
290
+ installMethod: context.installMethod,
291
+ ci: Boolean(process.env.CI),
292
+ agent: Boolean(process.env.AGENT),
293
+ interactive: getInteractive(context.options),
294
+ };
295
+ return (eventName, patch = {}) => ({
296
+ eventId: randomId("evt"),
297
+ eventVersion: EVENT_VERSION,
298
+ timestamp: nowIso(),
299
+ eventName,
300
+ ...base,
301
+ ...patch,
302
+ outcome: patch.outcome ?? null,
303
+ errorClass: patch.errorClass ?? null,
304
+ durationMs: patch.durationMs ?? null,
305
+ storedScopeCount: patch.storedScopeCount ?? null,
306
+ failedScopeCount: patch.failedScopeCount ?? null,
307
+ metadata: sanitizeMetadata(patch.metadata),
308
+ });
309
+ }
310
+ function splitIntoEnvelopes(events, cliVersion) {
311
+ const envelopes = [];
312
+ let current = [];
313
+ const flushCurrent = () => {
314
+ if (current.length === 0) {
315
+ return;
316
+ }
317
+ envelopes.push({
318
+ batchId: randomId("batch"),
319
+ sentAt: nowIso(),
320
+ client: { name: "vana-cli", version: cliVersion },
321
+ events: current,
322
+ });
323
+ current = [];
324
+ };
325
+ for (const event of events) {
326
+ current.push(event);
327
+ const candidate = {
328
+ batchId: "batch_candidate",
329
+ sentAt: nowIso(),
330
+ client: { name: "vana-cli", version: cliVersion },
331
+ events: current,
332
+ };
333
+ const tooManyEvents = current.length > MAX_EVENTS_PER_BATCH;
334
+ const tooLarge = Buffer.byteLength(JSON.stringify(candidate), "utf8") > MAX_BATCH_BYTES;
335
+ if (tooManyEvents || tooLarge) {
336
+ const overflow = current.pop();
337
+ flushCurrent();
338
+ if (overflow) {
339
+ current.push(overflow);
340
+ }
341
+ }
342
+ }
343
+ flushCurrent();
344
+ return envelopes;
345
+ }
346
+ async function writeEnvelope(envelope, runId) {
347
+ await ensureOutboxDir();
348
+ const filename = `${Date.now()}-${process.pid}-${runId}-${crypto.randomUUID()}.json`;
349
+ const outboxPath = path.join(getTelemetryOutboxDir(), filename);
350
+ await fs.writeFile(outboxPath, `${JSON.stringify(envelope)}\n`, "utf8");
351
+ }
352
+ export async function flushTelemetryOutbox() {
353
+ const state = await resolveTelemetryState();
354
+ if (!state.enabled || state.mode !== "normal") {
355
+ return;
356
+ }
357
+ const files = (await listOutboxFiles()).slice(0, MAX_FILES_PER_FLUSH);
358
+ for (const filePath of files) {
359
+ let contents;
360
+ try {
361
+ contents = await fs.readFile(filePath, "utf8");
362
+ }
363
+ catch {
364
+ continue;
365
+ }
366
+ try {
367
+ const response = await fetch(state.endpoint, {
368
+ method: "POST",
369
+ headers: {
370
+ "Content-Type": "application/json",
371
+ "User-Agent": `vana-cli/${JSON.parse(contents).client?.version ?? "unknown"}`,
372
+ },
373
+ body: contents,
374
+ signal: AbortSignal.timeout(FLUSH_TIMEOUT_MS),
375
+ });
376
+ if (response.status === 202) {
377
+ await fs.rm(filePath, { force: true });
378
+ }
379
+ }
380
+ catch {
381
+ // Keep file in outbox for retry.
382
+ }
383
+ }
384
+ }
385
+ export async function getTelemetryStatus() {
386
+ const state = await resolveTelemetryState();
387
+ return {
388
+ enabled: state.enabled,
389
+ mode: state.mode === "local_only" ? "disabled" : state.mode,
390
+ reason: state.reason,
391
+ installId: state.installId,
392
+ endpoint: state.endpoint,
393
+ queuedBatches: state.queuedBatches,
394
+ };
395
+ }
396
+ export async function setTelemetryEnabled(enabled) {
397
+ await updateCliConfig({ telemetryEnabled: enabled });
398
+ }
399
+ export function setActiveTelemetrySession(session) {
400
+ activeSession = session;
401
+ }
402
+ export function getActiveTelemetrySession() {
403
+ return activeSession;
404
+ }
405
+ export function trackActiveTelemetryEvent(eventName, patch) {
406
+ activeSession?.trackCustomEvent(eventName, patch);
407
+ }
408
+ export async function createCliTelemetrySession(context) {
409
+ const state = await resolveTelemetryState(Boolean(context.localOnly));
410
+ const buildEvent = createEventFactory(context, state);
411
+ const startedAt = Date.now();
412
+ const events = [];
413
+ let latestOutcome = null;
414
+ let latestErrorClass = null;
415
+ let persisted = false;
416
+ const push = (eventName, patch = {}) => {
417
+ if (!state.enabled && state.mode !== "debug") {
418
+ return;
419
+ }
420
+ const next = buildEvent(eventName, patch);
421
+ events.push(next);
422
+ };
423
+ push("command_started", {
424
+ metadata: sanitizeMetadata({
425
+ launchMode: context.options.detach ? "detached" : "direct",
426
+ inputMode: context.options.ipc
427
+ ? "ipc"
428
+ : context.options.noInput
429
+ ? "no_input"
430
+ : "interactive",
431
+ }),
432
+ });
433
+ return {
434
+ trackCliEvent(event) {
435
+ const mapped = mapCliEventToTelemetry(event);
436
+ if (!mapped) {
437
+ if (event.type === "outcome") {
438
+ latestOutcome = event.status ?? null;
439
+ latestErrorClass = resolveErrorClass(classifyError(event.reason), classifyOutcomeStatus(event.status), latestErrorClass);
440
+ }
441
+ return;
442
+ }
443
+ push(mapped.eventName, {
444
+ ...mapped.patch,
445
+ source: event.source ?? context.source ?? null,
446
+ });
447
+ },
448
+ trackCustomEvent(eventName, patch = {}) {
449
+ push(eventName, patch);
450
+ },
451
+ markCommandResult(result) {
452
+ latestOutcome = result.outcome ?? latestOutcome;
453
+ latestErrorClass = resolveErrorClass(result.errorClass, latestErrorClass, classifyOutcomeStatus(latestOutcome));
454
+ const durationMs = Date.now() - startedAt;
455
+ if (result.exitCode === 0) {
456
+ push("command_completed", {
457
+ durationMs,
458
+ outcome: latestOutcome,
459
+ errorClass: null,
460
+ });
461
+ return;
462
+ }
463
+ push("command_failed", {
464
+ durationMs,
465
+ outcome: latestOutcome,
466
+ errorClass: latestErrorClass ?? "unknown",
467
+ });
468
+ },
469
+ async persist() {
470
+ if (persisted) {
471
+ return;
472
+ }
473
+ persisted = true;
474
+ if (state.mode === "debug") {
475
+ for (const envelope of splitIntoEnvelopes(events, context.cliVersion)) {
476
+ process.stderr.write(`${JSON.stringify(envelope)}\n`);
477
+ }
478
+ return;
479
+ }
480
+ if (!state.enabled) {
481
+ return;
482
+ }
483
+ const envelopes = splitIntoEnvelopes(events, context.cliVersion);
484
+ const runId = events[0]?.runId ?? randomId("run");
485
+ for (const envelope of envelopes) {
486
+ await writeEnvelope(envelope, runId);
487
+ }
488
+ },
489
+ async flush() {
490
+ await flushTelemetryOutbox();
491
+ },
492
+ };
493
+ }
494
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/cli/telemetry.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@ export { ConnectError, ConnectErrorCode } from "./errors.js";
2
2
  export { CliOutcomeStatus } from "./cli-types.js";
3
3
  export { isValidGrant } from "./grants.js";
4
4
  export { getEnvConfig, ENV_CONFIG, DEFAULT_ENVIRONMENT, type VanaEnvironment, } from "./constants.js";
5
- export { migrateLegacyDataHome, getVanaHome, getConnectorCacheDir, getBrowserProfilesDir, getCliStatePath, getResultsDir, getSourceResultPath, getPreviousResultPath, rotateResult, getLogsDir, getSessionsDir, getTimestampedLogPath, } from "./paths.js";
5
+ export { migrateLegacyDataHome, getVanaHome, getConnectorCacheDir, getBrowserProfilesDir, getCliStatePath, getResultsDir, getSourceResultPath, getPreviousResultPath, rotateResult, getLogsDir, getSessionsDir, getTelemetryDir, getTelemetryOutboxDir, getTimestampedLogPath, } from "./paths.js";
6
6
  export { readCliState, readCliConfig, updateCliConfig, updateSourceState, ensureParentDir, } from "./state-store.js";
7
7
  export type { CliConfig } from "./state-store.js";
8
8
  export type { ConnectionStatus, SessionInitParams, SessionInitResult, SessionPollResult, GrantPayload, DataFetchParams, RequestSignerConfig, SessionRelayConfig, DataClientConfig, ConnectConfig, GetDataConfig, VanaManifestConfig, VanaManifestBlock, } from "./types.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EACL,YAAY,EACZ,UAAU,EACV,mBAAmB,EACnB,KAAK,eAAe,GACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,qBAAqB,EACrB,WAAW,EACX,oBAAoB,EACpB,qBAAqB,EACrB,eAAe,EACf,aAAa,EACb,mBAAmB,EACnB,qBAAqB,EACrB,YAAY,EACZ,UAAU,EACV,cAAc,EACd,qBAAqB,GACtB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,YAAY,EACZ,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EACV,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EACL,YAAY,EACZ,UAAU,EACV,mBAAmB,EACnB,KAAK,eAAe,GACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,qBAAqB,EACrB,WAAW,EACX,oBAAoB,EACpB,qBAAqB,EACrB,eAAe,EACf,aAAa,EACb,mBAAmB,EACnB,qBAAqB,EACrB,YAAY,EACZ,UAAU,EACV,cAAc,EACd,eAAe,EACf,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,YAAY,EACZ,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EACV,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,YAAY,CAAC"}
@@ -2,6 +2,6 @@ export { ConnectError, ConnectErrorCode } from "./errors.js";
2
2
  export { CliOutcomeStatus } from "./cli-types.js";
3
3
  export { isValidGrant } from "./grants.js";
4
4
  export { getEnvConfig, ENV_CONFIG, DEFAULT_ENVIRONMENT, } from "./constants.js";
5
- export { migrateLegacyDataHome, getVanaHome, getConnectorCacheDir, getBrowserProfilesDir, getCliStatePath, getResultsDir, getSourceResultPath, getPreviousResultPath, rotateResult, getLogsDir, getSessionsDir, getTimestampedLogPath, } from "./paths.js";
5
+ export { migrateLegacyDataHome, getVanaHome, getConnectorCacheDir, getBrowserProfilesDir, getCliStatePath, getResultsDir, getSourceResultPath, getPreviousResultPath, rotateResult, getLogsDir, getSessionsDir, getTelemetryDir, getTelemetryOutboxDir, getTimestampedLogPath, } from "./paths.js";
6
6
  export { readCliState, readCliConfig, updateCliConfig, updateSourceState, ensureParentDir, } from "./state-store.js";
7
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EACL,YAAY,EACZ,UAAU,EACV,mBAAmB,GAEpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,qBAAqB,EACrB,WAAW,EACX,oBAAoB,EACpB,qBAAqB,EACrB,eAAe,EACf,aAAa,EACb,mBAAmB,EACnB,qBAAqB,EACrB,YAAY,EACZ,UAAU,EACV,cAAc,EACd,qBAAqB,GACtB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,YAAY,EACZ,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,eAAe,GAChB,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EACL,YAAY,EACZ,UAAU,EACV,mBAAmB,GAEpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,qBAAqB,EACrB,WAAW,EACX,oBAAoB,EACpB,qBAAqB,EACrB,eAAe,EACf,aAAa,EACb,mBAAmB,EACnB,qBAAqB,EACrB,YAAY,EACZ,UAAU,EACV,cAAc,EACd,eAAe,EACf,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,YAAY,EACZ,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,eAAe,GAChB,MAAM,kBAAkB,CAAC"}
@@ -24,5 +24,7 @@ export declare function getPreviousResultPath(source: string): string;
24
24
  export declare function rotateResult(source: string): Promise<void>;
25
25
  export declare function getSessionsDir(): string;
26
26
  export declare function getLogsDir(): string;
27
+ export declare function getTelemetryDir(): string;
28
+ export declare function getTelemetryOutboxDir(): string;
27
29
  export declare function getTimestampedLogPath(prefix: string): string;
28
30
  //# sourceMappingURL=paths.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/core/paths.ts"],"names":[],"mappings":"AAIA,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CA2B/C;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAG5D;AAED,6DAA6D;AAC7D,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQhE;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAM5D"}
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/core/paths.ts"],"names":[],"mappings":"AAIA,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CA2B/C;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAG5D;AAED,6DAA6D;AAC7D,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQhE;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAM5D"}
@@ -82,6 +82,12 @@ export function getSessionsDir() {
82
82
  export function getLogsDir() {
83
83
  return path.join(getVanaHome(), "logs");
84
84
  }
85
+ export function getTelemetryDir() {
86
+ return path.join(getVanaHome(), "telemetry");
87
+ }
88
+ export function getTelemetryOutboxDir() {
89
+ return path.join(getTelemetryDir(), "outbox");
90
+ }
85
91
  export function getTimestampedLogPath(prefix) {
86
92
  const safePrefix = prefix.replace(/[^a-z0-9-]+/gi, "-").toLowerCase();
87
93
  return path.join(getLogsDir(), `${safePrefix}-${new Date().toISOString().replace(/[:.]/g, "-")}.log`);