@extentos/mcp-server 0.0.1

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 (202) hide show
  1. package/README.md +56 -0
  2. package/dist/cli/login.d.ts +2 -0
  3. package/dist/cli/login.d.ts.map +1 -0
  4. package/dist/cli/login.js +71 -0
  5. package/dist/cli/login.js.map +1 -0
  6. package/dist/cli/logout.d.ts +2 -0
  7. package/dist/cli/logout.d.ts.map +1 -0
  8. package/dist/cli/logout.js +65 -0
  9. package/dist/cli/logout.js.map +1 -0
  10. package/dist/cli/privacy.d.ts +3 -0
  11. package/dist/cli/privacy.d.ts.map +1 -0
  12. package/dist/cli/privacy.js +39 -0
  13. package/dist/cli/privacy.js.map +1 -0
  14. package/dist/cli/status.d.ts +2 -0
  15. package/dist/cli/status.d.ts.map +1 -0
  16. package/dist/cli/status.js +9 -0
  17. package/dist/cli/status.js.map +1 -0
  18. package/dist/cli/update.d.ts +2 -0
  19. package/dist/cli/update.d.ts.map +1 -0
  20. package/dist/cli/update.js +8 -0
  21. package/dist/cli/update.js.map +1 -0
  22. package/dist/cli/whoami.d.ts +2 -0
  23. package/dist/cli/whoami.d.ts.map +1 -0
  24. package/dist/cli/whoami.js +8 -0
  25. package/dist/cli/whoami.js.map +1 -0
  26. package/dist/cli.d.ts +3 -0
  27. package/dist/cli.d.ts.map +1 -0
  28. package/dist/cli.js +69 -0
  29. package/dist/cli.js.map +1 -0
  30. package/dist/generated/schemas.d.ts +4 -0
  31. package/dist/generated/schemas.d.ts.map +1 -0
  32. package/dist/generated/schemas.js +2697 -0
  33. package/dist/generated/schemas.js.map +1 -0
  34. package/dist/index.d.ts +3 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +69 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/stub.d.ts +15 -0
  39. package/dist/stub.d.ts.map +1 -0
  40. package/dist/stub.js +20 -0
  41. package/dist/stub.js.map +1 -0
  42. package/dist/telemetry/client.d.ts +73 -0
  43. package/dist/telemetry/client.d.ts.map +1 -0
  44. package/dist/telemetry/client.js +207 -0
  45. package/dist/telemetry/client.js.map +1 -0
  46. package/dist/telemetry/consent.d.ts +19 -0
  47. package/dist/telemetry/consent.d.ts.map +1 -0
  48. package/dist/telemetry/consent.js +68 -0
  49. package/dist/telemetry/consent.js.map +1 -0
  50. package/dist/telemetry/index.d.ts +56 -0
  51. package/dist/telemetry/index.d.ts.map +1 -0
  52. package/dist/telemetry/index.js +151 -0
  53. package/dist/telemetry/index.js.map +1 -0
  54. package/dist/telemetry/installRegistry.d.ts +18 -0
  55. package/dist/telemetry/installRegistry.d.ts.map +1 -0
  56. package/dist/telemetry/installRegistry.js +102 -0
  57. package/dist/telemetry/installRegistry.js.map +1 -0
  58. package/dist/tools/data/capabilities.d.ts +566 -0
  59. package/dist/tools/data/capabilities.d.ts.map +1 -0
  60. package/dist/tools/data/capabilities.js +243 -0
  61. package/dist/tools/data/capabilities.js.map +1 -0
  62. package/dist/tools/data/examplePatterns.d.ts +4 -0
  63. package/dist/tools/data/examplePatterns.d.ts.map +1 -0
  64. package/dist/tools/data/examplePatterns.js +546 -0
  65. package/dist/tools/data/examplePatterns.js.map +1 -0
  66. package/dist/tools/data/presetTriggers.d.ts +4 -0
  67. package/dist/tools/data/presetTriggers.d.ts.map +1 -0
  68. package/dist/tools/data/presetTriggers.js +47 -0
  69. package/dist/tools/data/presetTriggers.js.map +1 -0
  70. package/dist/tools/data/version.d.ts +31 -0
  71. package/dist/tools/data/version.d.ts.map +1 -0
  72. package/dist/tools/data/version.js +34 -0
  73. package/dist/tools/data/version.js.map +1 -0
  74. package/dist/tools/definitions.d.ts +13 -0
  75. package/dist/tools/definitions.d.ts.map +1 -0
  76. package/dist/tools/definitions.js +347 -0
  77. package/dist/tools/definitions.js.map +1 -0
  78. package/dist/tools/docs/index.d.ts +10 -0
  79. package/dist/tools/docs/index.d.ts.map +1 -0
  80. package/dist/tools/docs/index.js +220 -0
  81. package/dist/tools/docs/index.js.map +1 -0
  82. package/dist/tools/handlers/completeAuthLink.d.ts +3 -0
  83. package/dist/tools/handlers/completeAuthLink.d.ts.map +1 -0
  84. package/dist/tools/handlers/completeAuthLink.js +152 -0
  85. package/dist/tools/handlers/completeAuthLink.js.map +1 -0
  86. package/dist/tools/handlers/createSimulatorSession.d.ts +3 -0
  87. package/dist/tools/handlers/createSimulatorSession.d.ts.map +1 -0
  88. package/dist/tools/handlers/createSimulatorSession.js +231 -0
  89. package/dist/tools/handlers/createSimulatorSession.js.map +1 -0
  90. package/dist/tools/handlers/generateConnectionModule.d.ts +3 -0
  91. package/dist/tools/handlers/generateConnectionModule.d.ts.map +1 -0
  92. package/dist/tools/handlers/generateConnectionModule.js +222 -0
  93. package/dist/tools/handlers/generateConnectionModule.js.map +1 -0
  94. package/dist/tools/handlers/generateConsumer.d.ts +3 -0
  95. package/dist/tools/handlers/generateConsumer.d.ts.map +1 -0
  96. package/dist/tools/handlers/generateConsumer.js +257 -0
  97. package/dist/tools/handlers/generateConsumer.js.map +1 -0
  98. package/dist/tools/handlers/getCredentialGuide.d.ts +3 -0
  99. package/dist/tools/handlers/getCredentialGuide.d.ts.map +1 -0
  100. package/dist/tools/handlers/getCredentialGuide.js +296 -0
  101. package/dist/tools/handlers/getCredentialGuide.js.map +1 -0
  102. package/dist/tools/handlers/getEventLog.d.ts +3 -0
  103. package/dist/tools/handlers/getEventLog.d.ts.map +1 -0
  104. package/dist/tools/handlers/getEventLog.js +90 -0
  105. package/dist/tools/handlers/getEventLog.js.map +1 -0
  106. package/dist/tools/handlers/getExampleSpec.d.ts +3 -0
  107. package/dist/tools/handlers/getExampleSpec.d.ts.map +1 -0
  108. package/dist/tools/handlers/getExampleSpec.js +44 -0
  109. package/dist/tools/handlers/getExampleSpec.js.map +1 -0
  110. package/dist/tools/handlers/getPermissions.d.ts +3 -0
  111. package/dist/tools/handlers/getPermissions.d.ts.map +1 -0
  112. package/dist/tools/handlers/getPermissions.js +50 -0
  113. package/dist/tools/handlers/getPermissions.js.map +1 -0
  114. package/dist/tools/handlers/getPlatformInfo.d.ts +3 -0
  115. package/dist/tools/handlers/getPlatformInfo.d.ts.map +1 -0
  116. package/dist/tools/handlers/getPlatformInfo.js +78 -0
  117. package/dist/tools/handlers/getPlatformInfo.js.map +1 -0
  118. package/dist/tools/handlers/getProductionChecklist.d.ts +3 -0
  119. package/dist/tools/handlers/getProductionChecklist.d.ts.map +1 -0
  120. package/dist/tools/handlers/getProductionChecklist.js +238 -0
  121. package/dist/tools/handlers/getProductionChecklist.js.map +1 -0
  122. package/dist/tools/handlers/getSimulatorStatus.d.ts +3 -0
  123. package/dist/tools/handlers/getSimulatorStatus.d.ts.map +1 -0
  124. package/dist/tools/handlers/getSimulatorStatus.js +56 -0
  125. package/dist/tools/handlers/getSimulatorStatus.js.map +1 -0
  126. package/dist/tools/handlers/getVoiceCommandGuidance.d.ts +3 -0
  127. package/dist/tools/handlers/getVoiceCommandGuidance.d.ts.map +1 -0
  128. package/dist/tools/handlers/getVoiceCommandGuidance.js +200 -0
  129. package/dist/tools/handlers/getVoiceCommandGuidance.js.map +1 -0
  130. package/dist/tools/handlers/initSpec.d.ts +3 -0
  131. package/dist/tools/handlers/initSpec.d.ts.map +1 -0
  132. package/dist/tools/handlers/initSpec.js +234 -0
  133. package/dist/tools/handlers/initSpec.js.map +1 -0
  134. package/dist/tools/handlers/inspectIntegration.d.ts +3 -0
  135. package/dist/tools/handlers/inspectIntegration.d.ts.map +1 -0
  136. package/dist/tools/handlers/inspectIntegration.js +204 -0
  137. package/dist/tools/handlers/inspectIntegration.js.map +1 -0
  138. package/dist/tools/handlers/planIntegration.d.ts +3 -0
  139. package/dist/tools/handlers/planIntegration.d.ts.map +1 -0
  140. package/dist/tools/handlers/planIntegration.js +279 -0
  141. package/dist/tools/handlers/planIntegration.js.map +1 -0
  142. package/dist/tools/handlers/searchDocs.d.ts +3 -0
  143. package/dist/tools/handlers/searchDocs.d.ts.map +1 -0
  144. package/dist/tools/handlers/searchDocs.js +41 -0
  145. package/dist/tools/handlers/searchDocs.js.map +1 -0
  146. package/dist/tools/handlers/updateSpec.d.ts +3 -0
  147. package/dist/tools/handlers/updateSpec.d.ts.map +1 -0
  148. package/dist/tools/handlers/updateSpec.js +453 -0
  149. package/dist/tools/handlers/updateSpec.js.map +1 -0
  150. package/dist/tools/handlers/validateIntegration.d.ts +3 -0
  151. package/dist/tools/handlers/validateIntegration.d.ts.map +1 -0
  152. package/dist/tools/handlers/validateIntegration.js +546 -0
  153. package/dist/tools/handlers/validateIntegration.js.map +1 -0
  154. package/dist/tools/handlers/validateSpec.d.ts +3 -0
  155. package/dist/tools/handlers/validateSpec.d.ts.map +1 -0
  156. package/dist/tools/handlers/validateSpec.js +26 -0
  157. package/dist/tools/handlers/validateSpec.js.map +1 -0
  158. package/dist/tools/registry.d.ts +4 -0
  159. package/dist/tools/registry.d.ts.map +1 -0
  160. package/dist/tools/registry.js +43 -0
  161. package/dist/tools/registry.js.map +1 -0
  162. package/dist/tools/response.d.ts +12 -0
  163. package/dist/tools/response.d.ts.map +1 -0
  164. package/dist/tools/response.js +19 -0
  165. package/dist/tools/response.js.map +1 -0
  166. package/dist/tools/templates/androidBootstrap.d.ts +2 -0
  167. package/dist/tools/templates/androidBootstrap.d.ts.map +1 -0
  168. package/dist/tools/templates/androidBootstrap.js +40 -0
  169. package/dist/tools/templates/androidBootstrap.js.map +1 -0
  170. package/dist/tools/templates/callbackHandler.d.ts +11 -0
  171. package/dist/tools/templates/callbackHandler.d.ts.map +1 -0
  172. package/dist/tools/templates/callbackHandler.js +177 -0
  173. package/dist/tools/templates/callbackHandler.js.map +1 -0
  174. package/dist/tools/templates/iosBootstrap.d.ts +3 -0
  175. package/dist/tools/templates/iosBootstrap.d.ts.map +1 -0
  176. package/dist/tools/templates/iosBootstrap.js +50 -0
  177. package/dist/tools/templates/iosBootstrap.js.map +1 -0
  178. package/dist/tools/templates/streamConsumer.d.ts +8 -0
  179. package/dist/tools/templates/streamConsumer.d.ts.map +1 -0
  180. package/dist/tools/templates/streamConsumer.js +248 -0
  181. package/dist/tools/templates/streamConsumer.js.map +1 -0
  182. package/dist/tools/util/appPackage.d.ts +4 -0
  183. package/dist/tools/util/appPackage.d.ts.map +1 -0
  184. package/dist/tools/util/appPackage.js +16 -0
  185. package/dist/tools/util/appPackage.js.map +1 -0
  186. package/dist/tools/util/backendClient.d.ts +25 -0
  187. package/dist/tools/util/backendClient.d.ts.map +1 -0
  188. package/dist/tools/util/backendClient.js +144 -0
  189. package/dist/tools/util/backendClient.js.map +1 -0
  190. package/dist/tools/util/manifest.d.ts +9 -0
  191. package/dist/tools/util/manifest.d.ts.map +1 -0
  192. package/dist/tools/util/manifest.js +62 -0
  193. package/dist/tools/util/manifest.js.map +1 -0
  194. package/dist/tools/util/permissions.d.ts +32 -0
  195. package/dist/tools/util/permissions.d.ts.map +1 -0
  196. package/dist/tools/util/permissions.js +165 -0
  197. package/dist/tools/util/permissions.js.map +1 -0
  198. package/dist/tools/validation/validateSpec.d.ts +22 -0
  199. package/dist/tools/validation/validateSpec.d.ts.map +1 -0
  200. package/dist/tools/validation/validateSpec.js +370 -0
  201. package/dist/tools/validation/validateSpec.js.map +1 -0
  202. package/package.json +58 -0
@@ -0,0 +1,56 @@
1
+ import { McpTelemetryClient } from "./client.js";
2
+ export declare function getTelemetry(): McpTelemetryClient;
3
+ /** Reset helper — tests only. */
4
+ export declare function __resetTelemetry(): void;
5
+ /** Replace the singleton with a pre-built instance. Tests only. */
6
+ export declare function __installTelemetry(client: McpTelemetryClient): void;
7
+ export declare function drainTelemetry(): Promise<void>;
8
+ export type ToolOutcome = "success" | "error" | "validation_failed";
9
+ export declare function emitToolCalled(params: {
10
+ toolName: string;
11
+ durationMs: number;
12
+ outcome: ToolOutcome;
13
+ }): void;
14
+ /** Fired once per install. Caller must have already claimed via claimFirstRun(). */
15
+ export declare function emitInstalled(params: {
16
+ mcpVersion: string;
17
+ npmVersion?: string | null;
18
+ os: string;
19
+ arch: string;
20
+ agentHint?: string | null;
21
+ }): void;
22
+ export declare function emitConsentAccepted(policyVersion: string): void;
23
+ export declare function emitConsentDeclined(policyVersion: string): void;
24
+ export declare function emitSessionCreated(params: {
25
+ glasses: string;
26
+ recordingEnabled: boolean;
27
+ platform: "android" | "ios";
28
+ tier?: string | null;
29
+ }): void;
30
+ export type LoginInitiatedTrigger = "cli_explicit" | "meter_exhausted" | "meter_warning_followup";
31
+ export declare function emitLoginInitiated(trigger: LoginInitiatedTrigger): void;
32
+ export type LoginCompletedOutcome = "success" | "code_expired" | "user_denied" | "network_error" | "polling_aborted";
33
+ export declare function emitLoginCompleted(params: {
34
+ outcome: LoginCompletedOutcome;
35
+ durationMs: number;
36
+ }): void;
37
+ /** Fires once when the install transitions from anonymous to linked. */
38
+ export declare function emitAccountLinked(): void;
39
+ export declare function emitLoggedOut(sessionLifetimeDays: number | null): void;
40
+ /**
41
+ * Emit `mcp.installed` iff this is the first run on this machine. Uses the
42
+ * install registry's `claimFirstRun()` flag so repeated invocations are safe.
43
+ * Returns true if the event fired.
44
+ */
45
+ export declare function emitInstalledOnce(params: {
46
+ mcpVersion: string;
47
+ npmVersion?: string | null;
48
+ agentHint?: string | null;
49
+ }): boolean;
50
+ /**
51
+ * Best-effort detection of the host MCP client. Reads env vars that known
52
+ * clients set, falling back to `null`. Purely a heuristic — the telemetry
53
+ * spec only calls for a "detected agent" hint.
54
+ */
55
+ export declare function detectAgentHint(): string | null;
56
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/telemetry/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAMjD,wBAAgB,YAAY,IAAI,kBAAkB,CAKjD;AAED,iCAAiC;AACjC,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAED,mEAAmE;AACnE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAEnE;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAGpD;AAID,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,OAAO,GAAG,mBAAmB,CAAC;AAEpE,wBAAgB,cAAc,CAAC,MAAM,EAAE;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,WAAW,CAAC;CACtB,GAAG,IAAI,CAUP;AAED,oFAAoF;AACpF,wBAAgB,aAAa,CAAC,MAAM,EAAE;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,GAAG,IAAI,CASP;AAED,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAM/D;AAED,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAQ/D;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,QAAQ,EAAE,SAAS,GAAG,KAAK,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,GAAG,IAAI,CAQP;AAED,MAAM,MAAM,qBAAqB,GAC7B,cAAc,GACd,iBAAiB,GACjB,wBAAwB,CAAC;AAE7B,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,qBAAqB,GAAG,IAAI,CAMvE;AAED,MAAM,MAAM,qBAAqB,GAC7B,SAAS,GACT,cAAc,GACd,aAAa,GACb,eAAe,GACf,iBAAiB,CAAC;AAEtB,wBAAgB,kBAAkB,CAAC,MAAM,EAAE;IACzC,OAAO,EAAE,qBAAqB,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,IAAI,CAMP;AAED,wEAAwE;AACxE,wBAAgB,iBAAiB,IAAI,IAAI,CAKxC;AAED,wBAAgB,aAAa,CAAC,mBAAmB,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAQtE;AAID;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,GAAG,OAAO,CAWV;AAED;;;;GAIG;AACH,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CAQ/C"}
@@ -0,0 +1,151 @@
1
+ // Public entry point for MCP-server telemetry.
2
+ // - getTelemetry(): process-wide singleton (lazy; zero cost when consent=declined)
3
+ // - emit* helpers: one per spec event so call sites don't hand-build envelopes
4
+ // - drainTelemetry(): flush + retry drain, called from the process exit hook
5
+ //
6
+ // Event catalog: docs/mcp/TELEMETRY.md § Event catalog (MCP server events)
7
+ import { McpTelemetryClient } from "./client.js";
8
+ import { claimFirstRun, msSinceInstall } from "./installRegistry.js";
9
+ import { telemetryEnabled } from "./consent.js";
10
+ let singleton = null;
11
+ export function getTelemetry() {
12
+ if (!singleton) {
13
+ singleton = new McpTelemetryClient();
14
+ }
15
+ return singleton;
16
+ }
17
+ /** Reset helper — tests only. */
18
+ export function __resetTelemetry() {
19
+ singleton = null;
20
+ }
21
+ /** Replace the singleton with a pre-built instance. Tests only. */
22
+ export function __installTelemetry(client) {
23
+ singleton = client;
24
+ }
25
+ export async function drainTelemetry() {
26
+ if (!singleton)
27
+ return;
28
+ await singleton.drain();
29
+ }
30
+ export function emitToolCalled(params) {
31
+ getTelemetry().emit({
32
+ name: "tool.called",
33
+ category: "mcp",
34
+ properties: {
35
+ toolName: params.toolName,
36
+ durationMs: params.durationMs,
37
+ outcome: params.outcome,
38
+ },
39
+ });
40
+ }
41
+ /** Fired once per install. Caller must have already claimed via claimFirstRun(). */
42
+ export function emitInstalled(params) {
43
+ const props = {
44
+ mcpVersion: params.mcpVersion,
45
+ os: params.os,
46
+ arch: params.arch,
47
+ };
48
+ if (params.npmVersion)
49
+ props.npmVersion = params.npmVersion;
50
+ if (params.agentHint)
51
+ props.agentHint = params.agentHint;
52
+ getTelemetry().emit({ name: "mcp.installed", category: "mcp", properties: props });
53
+ }
54
+ export function emitConsentAccepted(policyVersion) {
55
+ getTelemetry().emit({
56
+ name: "mcp.consent_accepted",
57
+ category: "mcp",
58
+ properties: { policyVersion },
59
+ });
60
+ }
61
+ export function emitConsentDeclined(policyVersion) {
62
+ // We deliberately emit this BEFORE writing "declined" to the consent file so
63
+ // it passes the enabled() gate. Once the file is written, the gate closes.
64
+ getTelemetry().emit({
65
+ name: "mcp.consent_declined",
66
+ category: "mcp",
67
+ properties: { policyVersion },
68
+ });
69
+ }
70
+ export function emitSessionCreated(params) {
71
+ const props = {
72
+ glasses: params.glasses,
73
+ recordingEnabled: params.recordingEnabled,
74
+ platform: params.platform,
75
+ };
76
+ if (params.tier)
77
+ props.tier = params.tier;
78
+ getTelemetry().emit({ name: "session.created", category: "mcp", properties: props });
79
+ }
80
+ export function emitLoginInitiated(trigger) {
81
+ getTelemetry().emit({
82
+ name: "account.login_initiated",
83
+ category: "mcp",
84
+ properties: { trigger },
85
+ });
86
+ }
87
+ export function emitLoginCompleted(params) {
88
+ getTelemetry().emit({
89
+ name: "account.login_completed",
90
+ category: "mcp",
91
+ properties: { outcome: params.outcome, durationMs: params.durationMs },
92
+ });
93
+ }
94
+ /** Fires once when the install transitions from anonymous to linked. */
95
+ export function emitAccountLinked() {
96
+ const since = msSinceInstall();
97
+ const props = {};
98
+ if (since !== null)
99
+ props.timeSinceInstallMs = since;
100
+ getTelemetry().emit({ name: "account.linked", category: "mcp", properties: props });
101
+ }
102
+ export function emitLoggedOut(sessionLifetimeDays) {
103
+ const props = {};
104
+ if (sessionLifetimeDays !== null)
105
+ props.sessionLifetimeDays = sessionLifetimeDays;
106
+ getTelemetry().emit({
107
+ name: "account.logged_out",
108
+ category: "mcp",
109
+ properties: props,
110
+ });
111
+ }
112
+ // ---------- First-run helper ----------
113
+ /**
114
+ * Emit `mcp.installed` iff this is the first run on this machine. Uses the
115
+ * install registry's `claimFirstRun()` flag so repeated invocations are safe.
116
+ * Returns true if the event fired.
117
+ */
118
+ export function emitInstalledOnce(params) {
119
+ if (!telemetryEnabled())
120
+ return false;
121
+ if (!claimFirstRun())
122
+ return false;
123
+ emitInstalled({
124
+ mcpVersion: params.mcpVersion,
125
+ npmVersion: params.npmVersion ?? null,
126
+ os: process.platform,
127
+ arch: process.arch,
128
+ agentHint: params.agentHint ?? detectAgentHint(),
129
+ });
130
+ return true;
131
+ }
132
+ /**
133
+ * Best-effort detection of the host MCP client. Reads env vars that known
134
+ * clients set, falling back to `null`. Purely a heuristic — the telemetry
135
+ * spec only calls for a "detected agent" hint.
136
+ */
137
+ export function detectAgentHint() {
138
+ const env = process.env;
139
+ if (env.CLAUDECODE === "1" || env.CLAUDE_CODE_ENTRYPOINT)
140
+ return "claude-code";
141
+ if (env.CLAUDE_DESKTOP === "1")
142
+ return "claude-desktop";
143
+ if (env.CURSOR_TRACE_ID || env.CURSOR_SESSION_ID)
144
+ return "cursor";
145
+ if (env.VSCODE_MCP_SERVER)
146
+ return "vscode";
147
+ if (env.WINDSURF_MCP_SERVER)
148
+ return "windsurf";
149
+ return null;
150
+ }
151
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/telemetry/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Resolve the install ID, lazy-creating the file on first call.
3
+ * Returns the stable ID used for ingest headers.
4
+ */
5
+ export declare function resolveInstallId(): string;
6
+ /**
7
+ * True when this call site is the first to observe this install. The caller
8
+ * is responsible for emitting `mcp.installed`; this function marks the flag
9
+ * so the event does not fire again on subsequent runs.
10
+ */
11
+ export declare function claimFirstRun(): boolean;
12
+ /**
13
+ * Millis since the install file was first created. Used for `account.linked`
14
+ * as `timeSinceInstallMs`. Returns null if the install file is missing
15
+ * (shouldn't happen, but the telemetry should not crash).
16
+ */
17
+ export declare function msSinceInstall(): number | null;
18
+ //# sourceMappingURL=installRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installRegistry.d.ts","sourceRoot":"","sources":["../../src/telemetry/installRegistry.ts"],"names":[],"mappings":"AA8DA;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAUzC;AAED;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAUvC;AAED;;;;GAIG;AACH,wBAAgB,cAAc,IAAI,MAAM,GAAG,IAAI,CAM9C"}
@@ -0,0 +1,102 @@
1
+ // Install registry — tracks install-id + first-run metadata in
2
+ // ~/.extentos/install.json. Used to:
3
+ // - Resolve a stable installId for ingest headers (matches backendClient)
4
+ // - Know whether `mcp.installed` has already fired on this machine
5
+ // - Compute `timeSinceInstallMs` for `account.linked`
6
+ //
7
+ // Spec: docs/mcp/TELEMETRY.md § Event catalog (mcp.installed fires once)
8
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs";
9
+ import { join } from "node:path";
10
+ import { randomBytes } from "node:crypto";
11
+ import { configDir } from "./consent.js";
12
+ function installPath() {
13
+ return join(configDir(), "install.json");
14
+ }
15
+ function ensureConfigDir() {
16
+ const dir = configDir();
17
+ if (!existsSync(dir)) {
18
+ try {
19
+ mkdirSync(dir, { recursive: true });
20
+ }
21
+ catch {
22
+ // best-effort
23
+ }
24
+ }
25
+ }
26
+ function readInstall() {
27
+ const path = installPath();
28
+ if (!existsSync(path))
29
+ return null;
30
+ try {
31
+ const raw = readFileSync(path, "utf-8");
32
+ const parsed = JSON.parse(raw);
33
+ if (typeof parsed.installId === "string" && typeof parsed.createdAt === "string") {
34
+ return {
35
+ installId: parsed.installId,
36
+ createdAt: parsed.createdAt,
37
+ installedEventEmitted: parsed.installedEventEmitted === true,
38
+ };
39
+ }
40
+ return null;
41
+ }
42
+ catch {
43
+ return null;
44
+ }
45
+ }
46
+ function writeInstall(file) {
47
+ try {
48
+ ensureConfigDir();
49
+ writeFileSync(installPath(), JSON.stringify(file, null, 2));
50
+ }
51
+ catch {
52
+ // best-effort
53
+ }
54
+ }
55
+ /**
56
+ * Resolve the install ID, lazy-creating the file on first call.
57
+ * Returns the stable ID used for ingest headers.
58
+ */
59
+ export function resolveInstallId() {
60
+ const existing = readInstall();
61
+ if (existing)
62
+ return existing.installId;
63
+ const fresh = {
64
+ installId: `inst_${randomBytes(16).toString("hex")}`,
65
+ createdAt: new Date().toISOString(),
66
+ installedEventEmitted: false,
67
+ };
68
+ writeInstall(fresh);
69
+ return fresh.installId;
70
+ }
71
+ /**
72
+ * True when this call site is the first to observe this install. The caller
73
+ * is responsible for emitting `mcp.installed`; this function marks the flag
74
+ * so the event does not fire again on subsequent runs.
75
+ */
76
+ export function claimFirstRun() {
77
+ const file = readInstall() ?? {
78
+ installId: `inst_${randomBytes(16).toString("hex")}`,
79
+ createdAt: new Date().toISOString(),
80
+ installedEventEmitted: false,
81
+ };
82
+ if (file.installedEventEmitted)
83
+ return false;
84
+ const updated = { ...file, installedEventEmitted: true };
85
+ writeInstall(updated);
86
+ return true;
87
+ }
88
+ /**
89
+ * Millis since the install file was first created. Used for `account.linked`
90
+ * as `timeSinceInstallMs`. Returns null if the install file is missing
91
+ * (shouldn't happen, but the telemetry should not crash).
92
+ */
93
+ export function msSinceInstall() {
94
+ const existing = readInstall();
95
+ if (!existing)
96
+ return null;
97
+ const created = Date.parse(existing.createdAt);
98
+ if (Number.isNaN(created))
99
+ return null;
100
+ return Math.max(0, Date.now() - created);
101
+ }
102
+ //# sourceMappingURL=installRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installRegistry.js","sourceRoot":"","sources":["../../src/telemetry/installRegistry.ts"],"names":[],"mappings":"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"}