vana-cli 0.15.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.
Files changed (223) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +320 -0
  3. package/dist/cli/auth.d.ts +119 -0
  4. package/dist/cli/auth.d.ts.map +1 -0
  5. package/dist/cli/auth.js +528 -0
  6. package/dist/cli/auth.js.map +1 -0
  7. package/dist/cli/bin.d.ts +3 -0
  8. package/dist/cli/bin.d.ts.map +1 -0
  9. package/dist/cli/bin.js +15 -0
  10. package/dist/cli/bin.js.map +1 -0
  11. package/dist/cli/index.d.ts +92 -0
  12. package/dist/cli/index.d.ts.map +1 -0
  13. package/dist/cli/index.js +4703 -0
  14. package/dist/cli/index.js.map +1 -0
  15. package/dist/cli/main.d.ts +2 -0
  16. package/dist/cli/main.d.ts.map +1 -0
  17. package/dist/cli/main.js +10 -0
  18. package/dist/cli/main.js.map +1 -0
  19. package/dist/cli/mcp-server.d.ts +15 -0
  20. package/dist/cli/mcp-server.d.ts.map +1 -0
  21. package/dist/cli/mcp-server.js +199 -0
  22. package/dist/cli/mcp-server.js.map +1 -0
  23. package/dist/cli/queries.d.ts +128 -0
  24. package/dist/cli/queries.d.ts.map +1 -0
  25. package/dist/cli/queries.js +422 -0
  26. package/dist/cli/queries.js.map +1 -0
  27. package/dist/cli/render/capabilities.d.ts +9 -0
  28. package/dist/cli/render/capabilities.d.ts.map +1 -0
  29. package/dist/cli/render/capabilities.js +24 -0
  30. package/dist/cli/render/capabilities.js.map +1 -0
  31. package/dist/cli/render/connect-renderer.d.ts +23 -0
  32. package/dist/cli/render/connect-renderer.d.ts.map +1 -0
  33. package/dist/cli/render/connect-renderer.js +259 -0
  34. package/dist/cli/render/connect-renderer.js.map +1 -0
  35. package/dist/cli/render/flow-theme.d.ts +17 -0
  36. package/dist/cli/render/flow-theme.d.ts.map +1 -0
  37. package/dist/cli/render/flow-theme.js +26 -0
  38. package/dist/cli/render/flow-theme.js.map +1 -0
  39. package/dist/cli/render/format.d.ts +27 -0
  40. package/dist/cli/render/format.d.ts.map +1 -0
  41. package/dist/cli/render/format.js +111 -0
  42. package/dist/cli/render/format.js.map +1 -0
  43. package/dist/cli/render/index.d.ts +8 -0
  44. package/dist/cli/render/index.d.ts.map +1 -0
  45. package/dist/cli/render/index.js +8 -0
  46. package/dist/cli/render/index.js.map +1 -0
  47. package/dist/cli/render/progress.d.ts +11 -0
  48. package/dist/cli/render/progress.d.ts.map +1 -0
  49. package/dist/cli/render/progress.js +56 -0
  50. package/dist/cli/render/progress.js.map +1 -0
  51. package/dist/cli/render/symbols.d.ts +11 -0
  52. package/dist/cli/render/symbols.d.ts.map +1 -0
  53. package/dist/cli/render/symbols.js +21 -0
  54. package/dist/cli/render/symbols.js.map +1 -0
  55. package/dist/cli/render/theme.d.ts +16 -0
  56. package/dist/cli/render/theme.d.ts.map +1 -0
  57. package/dist/cli/render/theme.js +57 -0
  58. package/dist/cli/render/theme.js.map +1 -0
  59. package/dist/cli/search-select.d.ts +17 -0
  60. package/dist/cli/search-select.d.ts.map +1 -0
  61. package/dist/cli/search-select.js +29 -0
  62. package/dist/cli/search-select.js.map +1 -0
  63. package/dist/cli/telemetry-contract.d.ts +146 -0
  64. package/dist/cli/telemetry-contract.d.ts.map +1 -0
  65. package/dist/cli/telemetry-contract.js +56 -0
  66. package/dist/cli/telemetry-contract.js.map +1 -0
  67. package/dist/cli/telemetry.d.ts +60 -0
  68. package/dist/cli/telemetry.d.ts.map +1 -0
  69. package/dist/cli/telemetry.js +621 -0
  70. package/dist/cli/telemetry.js.map +1 -0
  71. package/dist/cli/update-check.d.ts +21 -0
  72. package/dist/cli/update-check.d.ts.map +1 -0
  73. package/dist/cli/update-check.js +86 -0
  74. package/dist/cli/update-check.js.map +1 -0
  75. package/dist/connectors/index.d.ts +2 -0
  76. package/dist/connectors/index.d.ts.map +1 -0
  77. package/dist/connectors/index.js +2 -0
  78. package/dist/connectors/index.js.map +1 -0
  79. package/dist/connectors/registry.d.ts +55 -0
  80. package/dist/connectors/registry.d.ts.map +1 -0
  81. package/dist/connectors/registry.js +301 -0
  82. package/dist/connectors/registry.js.map +1 -0
  83. package/dist/core/cli-types.d.ts +722 -0
  84. package/dist/core/cli-types.d.ts.map +1 -0
  85. package/dist/core/cli-types.js +328 -0
  86. package/dist/core/cli-types.js.map +1 -0
  87. package/dist/core/constants.d.ts +33 -0
  88. package/dist/core/constants.d.ts.map +1 -0
  89. package/dist/core/constants.js +25 -0
  90. package/dist/core/constants.js.map +1 -0
  91. package/dist/core/errors.d.ts +47 -0
  92. package/dist/core/errors.d.ts.map +1 -0
  93. package/dist/core/errors.js +50 -0
  94. package/dist/core/errors.js.map +1 -0
  95. package/dist/core/grants.d.ts +19 -0
  96. package/dist/core/grants.d.ts.map +1 -0
  97. package/dist/core/grants.js +31 -0
  98. package/dist/core/grants.js.map +1 -0
  99. package/dist/core/index.d.ts +9 -0
  100. package/dist/core/index.d.ts.map +1 -0
  101. package/dist/core/index.js +7 -0
  102. package/dist/core/index.js.map +1 -0
  103. package/dist/core/paths.d.ts +30 -0
  104. package/dist/core/paths.d.ts.map +1 -0
  105. package/dist/core/paths.js +95 -0
  106. package/dist/core/paths.js.map +1 -0
  107. package/dist/core/state-store.d.ts +44 -0
  108. package/dist/core/state-store.d.ts.map +1 -0
  109. package/dist/core/state-store.js +101 -0
  110. package/dist/core/state-store.js.map +1 -0
  111. package/dist/core/types.d.ts +148 -0
  112. package/dist/core/types.d.ts.map +1 -0
  113. package/dist/core/types.js +2 -0
  114. package/dist/core/types.js.map +1 -0
  115. package/dist/index.d.ts +2 -0
  116. package/dist/index.d.ts.map +1 -0
  117. package/dist/index.js +2 -0
  118. package/dist/index.js.map +1 -0
  119. package/dist/personal-server/client.d.ts +34 -0
  120. package/dist/personal-server/client.d.ts.map +1 -0
  121. package/dist/personal-server/client.js +108 -0
  122. package/dist/personal-server/client.js.map +1 -0
  123. package/dist/personal-server/index.d.ts +28 -0
  124. package/dist/personal-server/index.d.ts.map +1 -0
  125. package/dist/personal-server/index.js +157 -0
  126. package/dist/personal-server/index.js.map +1 -0
  127. package/dist/personal-server/scope-resolver.d.ts +22 -0
  128. package/dist/personal-server/scope-resolver.d.ts.map +1 -0
  129. package/dist/personal-server/scope-resolver.js +80 -0
  130. package/dist/personal-server/scope-resolver.js.map +1 -0
  131. package/dist/react/ConnectButton.d.ts +27 -0
  132. package/dist/react/ConnectButton.d.ts.map +1 -0
  133. package/dist/react/ConnectButton.js +39 -0
  134. package/dist/react/ConnectButton.js.map +1 -0
  135. package/dist/react/index.d.ts +4 -0
  136. package/dist/react/index.d.ts.map +1 -0
  137. package/dist/react/index.js +4 -0
  138. package/dist/react/index.js.map +1 -0
  139. package/dist/react/useVanaConnect.d.ts +50 -0
  140. package/dist/react/useVanaConnect.d.ts.map +1 -0
  141. package/dist/react/useVanaConnect.js +114 -0
  142. package/dist/react/useVanaConnect.js.map +1 -0
  143. package/dist/react/useVanaData.d.ts +69 -0
  144. package/dist/react/useVanaData.d.ts.map +1 -0
  145. package/dist/react/useVanaData.js +144 -0
  146. package/dist/react/useVanaData.js.map +1 -0
  147. package/dist/runtime/core/contracts.d.ts +84 -0
  148. package/dist/runtime/core/contracts.d.ts.map +1 -0
  149. package/dist/runtime/core/contracts.js +2 -0
  150. package/dist/runtime/core/contracts.js.map +1 -0
  151. package/dist/runtime/core/index.d.ts +2 -0
  152. package/dist/runtime/core/index.d.ts.map +1 -0
  153. package/dist/runtime/core/index.js +2 -0
  154. package/dist/runtime/core/index.js.map +1 -0
  155. package/dist/runtime/index.d.ts +4 -0
  156. package/dist/runtime/index.d.ts.map +1 -0
  157. package/dist/runtime/index.js +3 -0
  158. package/dist/runtime/index.js.map +1 -0
  159. package/dist/runtime/managed-playwright.d.ts +42 -0
  160. package/dist/runtime/managed-playwright.d.ts.map +1 -0
  161. package/dist/runtime/managed-playwright.js +178 -0
  162. package/dist/runtime/managed-playwright.js.map +1 -0
  163. package/dist/runtime/playwright/browser.d.ts +12 -0
  164. package/dist/runtime/playwright/browser.d.ts.map +1 -0
  165. package/dist/runtime/playwright/browser.js +229 -0
  166. package/dist/runtime/playwright/browser.js.map +1 -0
  167. package/dist/runtime/playwright/in-process-run.d.ts +6 -0
  168. package/dist/runtime/playwright/in-process-run.d.ts.map +1 -0
  169. package/dist/runtime/playwright/in-process-run.js +625 -0
  170. package/dist/runtime/playwright/in-process-run.js.map +1 -0
  171. package/dist/runtime/playwright/index.d.ts +3 -0
  172. package/dist/runtime/playwright/index.d.ts.map +1 -0
  173. package/dist/runtime/playwright/index.js +3 -0
  174. package/dist/runtime/playwright/index.js.map +1 -0
  175. package/dist/runtime/repo-paths.d.ts +2 -0
  176. package/dist/runtime/repo-paths.d.ts.map +1 -0
  177. package/dist/runtime/repo-paths.js +36 -0
  178. package/dist/runtime/repo-paths.js.map +1 -0
  179. package/dist/server/config.d.ts +38 -0
  180. package/dist/server/config.d.ts.map +1 -0
  181. package/dist/server/config.js +45 -0
  182. package/dist/server/config.js.map +1 -0
  183. package/dist/server/connect.d.ts +43 -0
  184. package/dist/server/connect.d.ts.map +1 -0
  185. package/dist/server/connect.js +115 -0
  186. package/dist/server/connect.js.map +1 -0
  187. package/dist/server/data-client.d.ts +31 -0
  188. package/dist/server/data-client.d.ts.map +1 -0
  189. package/dist/server/data-client.js +95 -0
  190. package/dist/server/data-client.js.map +1 -0
  191. package/dist/server/index.d.ts +8 -0
  192. package/dist/server/index.d.ts.map +1 -0
  193. package/dist/server/index.js +8 -0
  194. package/dist/server/index.js.map +1 -0
  195. package/dist/server/manifest-signer.d.ts +25 -0
  196. package/dist/server/manifest-signer.d.ts.map +1 -0
  197. package/dist/server/manifest-signer.js +51 -0
  198. package/dist/server/manifest-signer.js.map +1 -0
  199. package/dist/server/request-signer.d.ts +31 -0
  200. package/dist/server/request-signer.d.ts.map +1 -0
  201. package/dist/server/request-signer.js +72 -0
  202. package/dist/server/request-signer.js.map +1 -0
  203. package/dist/server/session-relay.d.ts +39 -0
  204. package/dist/server/session-relay.d.ts.map +1 -0
  205. package/dist/server/session-relay.js +74 -0
  206. package/dist/server/session-relay.js.map +1 -0
  207. package/dist/server/webhook.d.ts +11 -0
  208. package/dist/server/webhook.d.ts.map +1 -0
  209. package/dist/server/webhook.js +18 -0
  210. package/dist/server/webhook.js.map +1 -0
  211. package/dist/skills/index.d.ts +4 -0
  212. package/dist/skills/index.d.ts.map +1 -0
  213. package/dist/skills/index.js +3 -0
  214. package/dist/skills/index.js.map +1 -0
  215. package/dist/skills/paths.d.ts +33 -0
  216. package/dist/skills/paths.d.ts.map +1 -0
  217. package/dist/skills/paths.js +81 -0
  218. package/dist/skills/paths.js.map +1 -0
  219. package/dist/skills/registry.d.ts +48 -0
  220. package/dist/skills/registry.d.ts.map +1 -0
  221. package/dist/skills/registry.js +173 -0
  222. package/dist/skills/registry.js.map +1 -0
  223. package/package.json +147 -0
@@ -0,0 +1,621 @@
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
+ import { TELEMETRY_ENDPOINT, TELEMETRY_EVENT_VERSION, TELEMETRY_PRODUCER_NAME, } from "./telemetry-contract.js";
7
+ // ── Config ──────────────────────────────────────────────────────────────────
8
+ const MAX_EVENTS_PER_BATCH = 100;
9
+ const MAX_BATCH_BYTES = 64 * 1024;
10
+ const MAX_FILES_PER_FLUSH = 10;
11
+ const FLUSH_TIMEOUT_MS = 1500;
12
+ let activeSession = null;
13
+ // ── Helpers ─────────────────────────────────────────────────────────────────
14
+ function randomId(prefix) {
15
+ return `${prefix}_${crypto.randomUUID()}`;
16
+ }
17
+ function nowIso() {
18
+ return new Date().toISOString();
19
+ }
20
+ function getEndpoint() {
21
+ return process.env.VANA_TELEMETRY_URL?.trim() || TELEMETRY_ENDPOINT;
22
+ }
23
+ function detectOs() {
24
+ const platform = process.platform;
25
+ if (platform === "linux")
26
+ return "linux";
27
+ if (platform === "darwin")
28
+ return "macos";
29
+ if (platform === "win32")
30
+ return "windows";
31
+ return "linux"; // fallback
32
+ }
33
+ function detectArch() {
34
+ const arch = os.arch();
35
+ if (arch === "arm64")
36
+ return "arm64";
37
+ return "x86_64";
38
+ }
39
+ function makeHostPlatform(osName, arch) {
40
+ return `${osName}-${arch}`;
41
+ }
42
+ // Classify a free-form CLI error/reason string into a canonical error class.
43
+ // The CLI's own classification produced richer values (e.g. setup_required,
44
+ // legacy_auth); we collapse these into the canonical whitelist here.
45
+ function classifyCanonicalError(value) {
46
+ const normalized = (value ?? "").toLowerCase();
47
+ if (!normalized)
48
+ return "unknown";
49
+ if (normalized.includes("personal_server_unavailable") ||
50
+ normalized.includes("personal server")) {
51
+ return "personal_server_unavailable";
52
+ }
53
+ if (normalized.includes("auth") || normalized.includes("legacy")) {
54
+ return "auth_failed";
55
+ }
56
+ if (normalized.includes("timeout") || normalized.includes("timed out")) {
57
+ return "timeout";
58
+ }
59
+ if (normalized.includes("network")) {
60
+ return "network_error";
61
+ }
62
+ if (normalized.includes("runtime") ||
63
+ normalized.includes("connector") ||
64
+ normalized.includes("unexpected") ||
65
+ normalized.includes("ingest_failed") ||
66
+ normalized.includes("setup_required") ||
67
+ normalized.includes("invalid_connector")) {
68
+ return "runtime_error";
69
+ }
70
+ return "unknown";
71
+ }
72
+ // Map a CLI interaction indicator to a canonical InteractionKind.
73
+ function mapInteractionKind(value) {
74
+ const normalized = (value ?? "").toLowerCase();
75
+ if (!normalized)
76
+ return undefined;
77
+ if (normalized.includes("otp"))
78
+ return "otp";
79
+ if (normalized.includes("captcha"))
80
+ return "captcha";
81
+ if (normalized.includes("login") || normalized.includes("credential"))
82
+ return "login";
83
+ return "manual_action";
84
+ }
85
+ // ── Outbox (file-backed) ────────────────────────────────────────────────────
86
+ //
87
+ // Events are batched into TelemetryBatch envelopes, written to individual
88
+ // JSON files in getTelemetryOutboxDir(), and flushed on command exit and on
89
+ // subsequent runs (retry across restarts). This survives crashes — the
90
+ // pattern is worth preserving for the desktop app too.
91
+ async function ensureOutboxDir() {
92
+ await fs.mkdir(getTelemetryOutboxDir(), { recursive: true });
93
+ }
94
+ async function listOutboxFiles() {
95
+ try {
96
+ const dirents = await fs.readdir(getTelemetryOutboxDir(), {
97
+ withFileTypes: true,
98
+ });
99
+ return dirents
100
+ .filter((entry) => entry.isFile() && entry.name.endsWith(".json"))
101
+ .map((entry) => path.join(getTelemetryOutboxDir(), entry.name))
102
+ .sort();
103
+ }
104
+ catch {
105
+ return [];
106
+ }
107
+ }
108
+ async function countQueuedBatches() {
109
+ return (await listOutboxFiles()).length;
110
+ }
111
+ async function ensureTelemetryInstallId() {
112
+ const config = await readCliConfig();
113
+ if (config.telemetryInstallId) {
114
+ return config.telemetryInstallId;
115
+ }
116
+ const installId = randomId("inst");
117
+ await updateCliConfig({ telemetryInstallId: installId });
118
+ return installId;
119
+ }
120
+ async function resolveTelemetryState(localOnly = false) {
121
+ const config = await readCliConfig();
122
+ const installId = await ensureTelemetryInstallId();
123
+ const queuedBatches = await countQueuedBatches();
124
+ if (localOnly) {
125
+ return {
126
+ enabled: false,
127
+ mode: "local_only",
128
+ reason: "local_only",
129
+ endpoint: getEndpoint(),
130
+ installId,
131
+ queuedBatches,
132
+ };
133
+ }
134
+ if (process.env.VANA_TELEMETRY_DEBUG === "1") {
135
+ return {
136
+ enabled: true,
137
+ mode: "debug",
138
+ reason: "env_debug",
139
+ endpoint: getEndpoint(),
140
+ installId,
141
+ queuedBatches,
142
+ };
143
+ }
144
+ if (process.env.VANA_TELEMETRY_DISABLED === "1") {
145
+ return {
146
+ enabled: false,
147
+ mode: "disabled",
148
+ reason: "env_disabled",
149
+ endpoint: getEndpoint(),
150
+ installId,
151
+ queuedBatches,
152
+ };
153
+ }
154
+ if (config.telemetryEnabled === false) {
155
+ return {
156
+ enabled: false,
157
+ mode: "disabled",
158
+ reason: "config_disabled",
159
+ endpoint: getEndpoint(),
160
+ installId,
161
+ queuedBatches,
162
+ };
163
+ }
164
+ return {
165
+ enabled: true,
166
+ mode: "normal",
167
+ reason: config.telemetryEnabled ? "config_enabled" : "default",
168
+ endpoint: getEndpoint(),
169
+ installId,
170
+ queuedBatches,
171
+ };
172
+ }
173
+ // ── Event factory ───────────────────────────────────────────────────────────
174
+ //
175
+ // Builds canonical TelemetryEvent values with identity + time + attribution +
176
+ // context auto-populated. The caller supplies correlation + kind.
177
+ function createEventFactory(context, state) {
178
+ const hostRunId = randomId("host");
179
+ const osName = detectOs();
180
+ const arch = detectArch();
181
+ const hostPlatform = makeHostPlatform(osName, arch);
182
+ const baseContext = {
183
+ hostPlatform,
184
+ os: osName,
185
+ arch,
186
+ producerVersion: context.cliVersion,
187
+ };
188
+ return {
189
+ hostRunId,
190
+ build(args) {
191
+ return {
192
+ identity: {
193
+ eventId: randomId("evt"),
194
+ eventVersion: TELEMETRY_EVENT_VERSION,
195
+ },
196
+ time: {
197
+ occurredAt: nowIso(),
198
+ ...(args.durationMs !== undefined
199
+ ? { durationMs: args.durationMs }
200
+ : {}),
201
+ },
202
+ attribution: {
203
+ producer: TELEMETRY_PRODUCER_NAME,
204
+ installId: state.installId,
205
+ },
206
+ context: {
207
+ ...baseContext,
208
+ ...(args.connectorVersion
209
+ ? { connectorVersion: args.connectorVersion }
210
+ : {}),
211
+ ...(args.authMode ? { authMode: args.authMode } : {}),
212
+ },
213
+ correlation: args.correlation,
214
+ kind: args.kind,
215
+ ...(args.debug ? { debug: args.debug } : {}),
216
+ ...(args.extensions ? { extensions: args.extensions } : {}),
217
+ };
218
+ },
219
+ };
220
+ }
221
+ // ── Batch serialization ─────────────────────────────────────────────────────
222
+ function splitIntoEnvelopes(events) {
223
+ const envelopes = [];
224
+ let current = [];
225
+ const flushCurrent = () => {
226
+ if (current.length === 0)
227
+ return;
228
+ envelopes.push({
229
+ batchId: randomId("batch"),
230
+ sentAt: nowIso(),
231
+ events: current,
232
+ });
233
+ current = [];
234
+ };
235
+ for (const event of events) {
236
+ current.push(event);
237
+ const candidate = {
238
+ batchId: "batch_candidate",
239
+ sentAt: nowIso(),
240
+ events: current,
241
+ };
242
+ const tooManyEvents = current.length > MAX_EVENTS_PER_BATCH;
243
+ const tooLarge = Buffer.byteLength(JSON.stringify(candidate), "utf8") > MAX_BATCH_BYTES;
244
+ if (tooManyEvents || tooLarge) {
245
+ const overflow = current.pop();
246
+ flushCurrent();
247
+ if (overflow)
248
+ current.push(overflow);
249
+ }
250
+ }
251
+ flushCurrent();
252
+ return envelopes;
253
+ }
254
+ async function writeEnvelope(envelope, hostRunId) {
255
+ await ensureOutboxDir();
256
+ const filename = `${Date.now()}-${process.pid}-${hostRunId}-${crypto.randomUUID()}.json`;
257
+ const outboxPath = path.join(getTelemetryOutboxDir(), filename);
258
+ await fs.writeFile(outboxPath, `${JSON.stringify(envelope)}\n`, "utf8");
259
+ }
260
+ export async function flushTelemetryOutbox() {
261
+ const state = await resolveTelemetryState();
262
+ if (!state.enabled || state.mode !== "normal")
263
+ return;
264
+ const files = (await listOutboxFiles()).slice(0, MAX_FILES_PER_FLUSH);
265
+ for (const filePath of files) {
266
+ let contents;
267
+ try {
268
+ contents = await fs.readFile(filePath, "utf8");
269
+ }
270
+ catch {
271
+ continue;
272
+ }
273
+ try {
274
+ const response = await fetch(state.endpoint, {
275
+ method: "POST",
276
+ headers: {
277
+ "Content-Type": "application/json",
278
+ "User-Agent": `vana-cli/unknown`,
279
+ },
280
+ body: contents,
281
+ signal: AbortSignal.timeout(FLUSH_TIMEOUT_MS),
282
+ });
283
+ if (response.status === 202) {
284
+ await fs.rm(filePath, { force: true });
285
+ }
286
+ }
287
+ catch {
288
+ // Keep file in outbox for retry.
289
+ }
290
+ }
291
+ }
292
+ // ── Public helpers ──────────────────────────────────────────────────────────
293
+ export async function getTelemetryStatus() {
294
+ const state = await resolveTelemetryState();
295
+ return {
296
+ enabled: state.enabled,
297
+ mode: state.mode === "local_only" ? "disabled" : state.mode,
298
+ reason: state.reason,
299
+ installId: state.installId,
300
+ endpoint: state.endpoint,
301
+ queuedBatches: state.queuedBatches,
302
+ };
303
+ }
304
+ export async function setTelemetryEnabled(enabled) {
305
+ await updateCliConfig({ telemetryEnabled: enabled });
306
+ }
307
+ export function setActiveTelemetrySession(session) {
308
+ activeSession = session;
309
+ }
310
+ export function getActiveTelemetrySession() {
311
+ return activeSession;
312
+ }
313
+ // ── Session ─────────────────────────────────────────────────────────────────
314
+ export async function createCliTelemetrySession(context) {
315
+ const state = await resolveTelemetryState(Boolean(context.localOnly));
316
+ const factory = createEventFactory(context, state);
317
+ const startedAt = Date.now();
318
+ const events = [];
319
+ // Per-session state. A single CLI invocation is ONE host run, with zero
320
+ // or more collection runs and sync attempts nested within.
321
+ const hostRunId = factory.hostRunId;
322
+ let collectionRunId = null;
323
+ let collectionSource = context.source ?? null;
324
+ let connectorVersion;
325
+ let authMode;
326
+ let syncRunId = null;
327
+ let latestOutcomeRaw = null;
328
+ let persisted = false;
329
+ // Host-level extensions captured from the command context. These are
330
+ // producer-specific details that don't belong in the canonical Kind.
331
+ const hostExtensions = {
332
+ command: context.command,
333
+ subcommand: context.subcommand ?? null,
334
+ channel: context.channel,
335
+ installMethod: context.installMethod,
336
+ isCi: Boolean(process.env.CI),
337
+ isAgent: Boolean(process.env.AGENT),
338
+ isInteractive: Boolean(process.stdin.isTTY && process.stdout.isTTY && !context.options.noInput),
339
+ };
340
+ const push = (event) => {
341
+ if (!state.enabled && state.mode !== "debug")
342
+ return;
343
+ events.push(event);
344
+ };
345
+ // Emit host/started immediately.
346
+ push(factory.build({
347
+ correlation: { scope: "host", hostRunId },
348
+ kind: { lifecycle: "host", phase: "started" },
349
+ extensions: hostExtensions,
350
+ }));
351
+ // Helper to lazily start a collection run the first time we see collection activity.
352
+ const ensureCollectionStarted = () => {
353
+ if (collectionRunId)
354
+ return;
355
+ if (!collectionSource)
356
+ return;
357
+ collectionRunId = randomId("col");
358
+ push(factory.build({
359
+ correlation: {
360
+ scope: "collection",
361
+ hostRunId,
362
+ collectionRunId,
363
+ source: collectionSource,
364
+ },
365
+ kind: { lifecycle: "collection", phase: "started" },
366
+ connectorVersion,
367
+ authMode,
368
+ }));
369
+ };
370
+ const emitCollectionEvent = (kind) => {
371
+ ensureCollectionStarted();
372
+ if (!collectionRunId || !collectionSource)
373
+ return;
374
+ push(factory.build({
375
+ correlation: {
376
+ scope: "collection",
377
+ hostRunId,
378
+ collectionRunId,
379
+ source: collectionSource,
380
+ },
381
+ kind,
382
+ connectorVersion,
383
+ }));
384
+ };
385
+ const ensureSyncRunId = () => {
386
+ if (!syncRunId)
387
+ syncRunId = randomId("sync");
388
+ return syncRunId;
389
+ };
390
+ const emitSyncEvent = (kind) => {
391
+ if (!collectionSource)
392
+ return;
393
+ push(factory.build({
394
+ correlation: {
395
+ scope: "sync",
396
+ hostRunId,
397
+ syncRunId: ensureSyncRunId(),
398
+ source: collectionSource,
399
+ ...(collectionRunId ? { collectionRunId } : {}),
400
+ },
401
+ kind,
402
+ }));
403
+ };
404
+ const countScopeResults = (scopeResults) => {
405
+ const stored = scopeResults?.filter((s) => s.status === "stored").length ?? 0;
406
+ const failed = scopeResults?.filter((s) => s.status === "failed").length ?? 0;
407
+ return { stored, failed };
408
+ };
409
+ return {
410
+ trackCliEvent(event) {
411
+ // Capture connector version / source / auth mode from any event that carries them.
412
+ if ("source" in event && event.source)
413
+ collectionSource = event.source;
414
+ switch (event.type) {
415
+ case "setup-check":
416
+ // Setup-phase events are producer-specific and don't fit the shared
417
+ // lifecycle. Attach them to the host extensions instead.
418
+ hostExtensions.runtimeCheckCompleted = true;
419
+ break;
420
+ case "setup-complete":
421
+ hostExtensions.runtimeInstallCompleted = true;
422
+ break;
423
+ case "connector-resolved":
424
+ hostExtensions.connectorResolved = true;
425
+ break;
426
+ case "needs-input":
427
+ emitCollectionEvent({
428
+ lifecycle: "collection",
429
+ phase: "needs_input",
430
+ ...(mapInteractionKind(event.fields?.join(",") ?? null)
431
+ ? {
432
+ interactionKind: mapInteractionKind(event.fields?.join(",") ?? null),
433
+ }
434
+ : {}),
435
+ });
436
+ break;
437
+ case "legacy-auth":
438
+ // Legacy auth is effectively a "needs manual action" interaction.
439
+ emitCollectionEvent({
440
+ lifecycle: "collection",
441
+ phase: "needs_input",
442
+ interactionKind: "manual_action",
443
+ });
444
+ break;
445
+ case "collection-complete":
446
+ emitCollectionEvent({
447
+ lifecycle: "collection",
448
+ phase: "terminal",
449
+ outcome: "success",
450
+ });
451
+ break;
452
+ case "runtime-error":
453
+ emitCollectionEvent({
454
+ lifecycle: "collection",
455
+ phase: "terminal",
456
+ outcome: "failure",
457
+ errorClass: classifyCanonicalError(event.message),
458
+ });
459
+ break;
460
+ case "ingest-started":
461
+ emitSyncEvent({ lifecycle: "sync", phase: "started" });
462
+ break;
463
+ case "ingest-complete": {
464
+ const { stored, failed } = countScopeResults(event.scopeResults);
465
+ emitSyncEvent({
466
+ lifecycle: "sync",
467
+ phase: "terminal",
468
+ outcome: "success",
469
+ storedScopeCount: stored,
470
+ failedScopeCount: failed,
471
+ });
472
+ syncRunId = null;
473
+ break;
474
+ }
475
+ case "ingest-partial": {
476
+ // Partial in the CLI means "some scopes stored, some failed" — in
477
+ // the canonical contract that is `outcome: success` with
478
+ // failedScopeCount > 0. The UI derives the "partial" label.
479
+ const { stored, failed } = countScopeResults(event.scopeResults);
480
+ emitSyncEvent({
481
+ lifecycle: "sync",
482
+ phase: "terminal",
483
+ outcome: "success",
484
+ storedScopeCount: stored,
485
+ failedScopeCount: failed,
486
+ });
487
+ syncRunId = null;
488
+ break;
489
+ }
490
+ case "ingest-failed":
491
+ emitSyncEvent({
492
+ lifecycle: "sync",
493
+ phase: "terminal",
494
+ outcome: "failure",
495
+ errorClass: classifyCanonicalError("ingest_failed"),
496
+ });
497
+ syncRunId = null;
498
+ break;
499
+ case "ingest-skipped":
500
+ // Skip is standalone — no preceding `started` event.
501
+ syncRunId = randomId("sync"); // fresh ID for the standalone skip
502
+ emitSyncEvent({
503
+ lifecycle: "sync",
504
+ phase: "skipped",
505
+ reason: classifyCanonicalError(event.reason) ===
506
+ "personal_server_unavailable"
507
+ ? "server_unavailable"
508
+ : "not_requested",
509
+ });
510
+ syncRunId = null;
511
+ break;
512
+ case "outcome":
513
+ latestOutcomeRaw = event.status ?? null;
514
+ break;
515
+ case "progress-update":
516
+ case "status-update":
517
+ case "headed-required":
518
+ case "jpeg":
519
+ // Not modeled in canonical telemetry.
520
+ break;
521
+ }
522
+ },
523
+ markCommandResult(result) {
524
+ const durationMs = Date.now() - startedAt;
525
+ latestOutcomeRaw = result.outcome ?? latestOutcomeRaw;
526
+ // If a collection run was started but never terminated, close it here.
527
+ // If the CLI exited with a non-zero code, record collection_failed;
528
+ // otherwise let the lifecycle's own terminal stand.
529
+ if (collectionRunId && collectionSource) {
530
+ const hasCollectionTerminal = events.some((e) => e.correlation.scope === "collection" &&
531
+ e.correlation.collectionRunId === collectionRunId &&
532
+ e.kind.lifecycle === "collection" &&
533
+ e.kind.phase === "terminal");
534
+ if (!hasCollectionTerminal) {
535
+ if (result.exitCode === 0) {
536
+ push(factory.build({
537
+ correlation: {
538
+ scope: "collection",
539
+ hostRunId,
540
+ collectionRunId,
541
+ source: collectionSource,
542
+ },
543
+ kind: {
544
+ lifecycle: "collection",
545
+ phase: "terminal",
546
+ outcome: "success",
547
+ },
548
+ }));
549
+ }
550
+ else {
551
+ push(factory.build({
552
+ correlation: {
553
+ scope: "collection",
554
+ hostRunId,
555
+ collectionRunId,
556
+ source: collectionSource,
557
+ },
558
+ kind: {
559
+ lifecycle: "collection",
560
+ phase: "terminal",
561
+ outcome: "failure",
562
+ errorClass: classifyCanonicalError(result.errorClass ?? latestOutcomeRaw),
563
+ },
564
+ }));
565
+ }
566
+ }
567
+ }
568
+ // Host terminal.
569
+ if (result.exitCode === 0) {
570
+ push(factory.build({
571
+ correlation: { scope: "host", hostRunId },
572
+ kind: { lifecycle: "host", phase: "terminal", outcome: "success" },
573
+ durationMs,
574
+ }));
575
+ }
576
+ else {
577
+ push(factory.build({
578
+ correlation: { scope: "host", hostRunId },
579
+ kind: {
580
+ lifecycle: "host",
581
+ phase: "terminal",
582
+ outcome: "failure",
583
+ errorClass: classifyCanonicalError(result.errorClass ?? latestOutcomeRaw),
584
+ },
585
+ durationMs,
586
+ }));
587
+ }
588
+ },
589
+ async persist() {
590
+ if (persisted)
591
+ return;
592
+ persisted = true;
593
+ if (state.mode === "debug") {
594
+ for (const envelope of splitIntoEnvelopes(events)) {
595
+ process.stderr.write(`${JSON.stringify(envelope)}\n`);
596
+ }
597
+ return;
598
+ }
599
+ if (!state.enabled)
600
+ return;
601
+ const envelopes = splitIntoEnvelopes(events);
602
+ for (const envelope of envelopes) {
603
+ await writeEnvelope(envelope, hostRunId);
604
+ }
605
+ },
606
+ trackCustomEvent() {
607
+ // No-op. See the CliTelemetrySession interface doc.
608
+ },
609
+ async flush() {
610
+ await flushTelemetryOutbox();
611
+ },
612
+ };
613
+ }
614
+ // ── Deprecated ──────────────────────────────────────────────────────────────
615
+ /** @deprecated trackCustomEvent on the session is a no-op in the canonical
616
+ * model. This top-level helper is also a no-op — kept only to satisfy
617
+ * existing call sites. */
618
+ export function trackActiveTelemetryEvent(_eventName, _patch) {
619
+ /* intentionally blank */
620
+ }
621
+ //# 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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"}
@@ -0,0 +1,21 @@
1
+ import type { CliInstallMethod } from "../core/cli-types.js";
2
+ export interface UpdateCheckCache {
3
+ lastCheckedAt: string;
4
+ latestVersion: string;
5
+ currentVersion: string;
6
+ }
7
+ export declare function getUpdateCheckPath(): string;
8
+ /**
9
+ * Read cached update check result. Returns null if missing or expired.
10
+ */
11
+ export declare function readUpdateCheck(maxAgeMs?: number): Promise<UpdateCheckCache | null>;
12
+ /**
13
+ * Check for the latest CLI version and write the result to the cache file.
14
+ * Runs inline with a short timeout — no child process needed.
15
+ */
16
+ export declare function checkForUpdate(currentVersion: string, installMethod: CliInstallMethod): Promise<void>;
17
+ /**
18
+ * Simple semver comparison: returns true if `latest` is newer than `current`.
19
+ */
20
+ export declare function isNewerVersion(current: string, latest: string): boolean;
21
+ //# sourceMappingURL=update-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-check.d.ts","sourceRoot":"","sources":["../../src/cli/update-check.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;CACxB;AAMD,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,QAAQ,SAAa,GACpB,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAUlC;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,cAAc,EAAE,MAAM,EACtB,aAAa,EAAE,gBAAgB,GAC9B,OAAO,CAAC,IAAI,CAAC,CAkDf;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAQvE"}