@extenshi/mcp 0.0.5 → 0.1.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.
package/dist/index.js CHANGED
@@ -23,9 +23,12 @@ import { DocsError, getDocsIndex, searchDocs } from './docs.js';
23
23
  import { PublishSetupError, publishArtifact, readStoreCredentials, validateStoreCredentials, } from './publish.js';
24
24
  import { checkPublishAccess } from './publish-access.js';
25
25
  import { ScanError, scanArtifact } from './scan.js';
26
+ import { validateSearchFilters } from './search-filters.js';
26
27
  import { shapeExtension, shapeSearch, shapeSecurity } from './shape.js';
28
+ import { captureError, captureEvent, classifyError, flushTelemetry, initTelemetry } from './telemetry.js';
27
29
  const require = createRequire(import.meta.url);
28
30
  const pkg = require('../package.json');
31
+ initTelemetry({ surface: 'mcp', version: pkg.version });
29
32
  const KEY_PAGE = 'https://dojo.extenshi.io/api-keys';
30
33
  const SIGNUP_PAGE = 'https://auth.extenshi.io/signup';
31
34
  const BILLING_PAGE = 'https://dojo.extenshi.io/billing';
@@ -54,6 +57,38 @@ function readError(err) {
54
57
  }
55
58
  throw new UserError(message);
56
59
  }
60
+ /**
61
+ * Wrap a tool definition so every call emits anonymous telemetry: which tool
62
+ * ran, how long it took, and how it failed (coarse error_kind + sanitized
63
+ * exception). The generic preserves the Zod-inferred `args` type — `parameters`
64
+ * fixes Params, so the inner execute stays as strongly typed as before.
65
+ * Fail-soft: telemetry never alters the tool's result or its thrown error.
66
+ */
67
+ function instrument(tool) {
68
+ const { name } = tool;
69
+ const original = tool.execute;
70
+ return {
71
+ ...tool,
72
+ execute: async (args, context) => {
73
+ const startedAt = Date.now();
74
+ captureEvent('mcp_tool_called', { tool: name });
75
+ try {
76
+ const result = await original(args, context);
77
+ captureEvent('mcp_tool_succeeded', { tool: name, duration_ms: Date.now() - startedAt });
78
+ return result;
79
+ }
80
+ catch (err) {
81
+ captureEvent('mcp_tool_failed', {
82
+ tool: name,
83
+ error_kind: classifyError(err),
84
+ duration_ms: Date.now() - startedAt,
85
+ });
86
+ captureError(err, { tool: name });
87
+ throw err;
88
+ }
89
+ },
90
+ };
91
+ }
57
92
  const server = new FastMCP({
58
93
  name: 'extenshi',
59
94
  // FastMCP types `version` as a semver template literal; package.json gives a plain string.
@@ -68,10 +103,13 @@ const server = new FastMCP({
68
103
  `and reads, never expire) at ${BILLING_PAGE}.`,
69
104
  });
70
105
  // ── Read tools (free; key required) ─────────────────────────────────────────
71
- server.addTool({
106
+ server.addTool(instrument({
72
107
  name: 'search_extensions',
73
108
  description: 'Search the cross-store extension catalog (Chrome, Firefox, Edge) with hybrid relevance. ' +
74
- 'Filter by store, category, pricing, rating, risk level, or requested permissions. ' +
109
+ 'ALL filters are applied server-side by the catalog database always narrow with the ' +
110
+ 'parameters below (rating/users/reviews thresholds, store, category, pricing, risk, ' +
111
+ 'permissions, freshness, manifest version, trader status) rather than fetching a broad ' +
112
+ 'list and filtering the results yourself. Use `skip` to page through large result sets. ' +
75
113
  'Returns a compact list for market research and competitive analysis.',
76
114
  parameters: z.object({
77
115
  query: z.string().optional().describe('Free-text search query (name, description, keywords).'),
@@ -89,15 +127,53 @@ server.addTool({
89
127
  .optional()
90
128
  .describe('Risk categories to include.'),
91
129
  permissions: z.array(z.string()).optional().describe('Only extensions requesting these permissions.'),
92
- minRating: z.number().min(0).max(5).optional(),
130
+ minRating: z.number().min(0).max(5).optional().describe('Only ratings ≥ this (0–5).'),
131
+ maxRating: z.number().min(0).max(5).optional().describe('Only ratings ≤ this (0–5).'),
132
+ minWeeklyDownloads: z
133
+ .number()
134
+ .min(0)
135
+ .optional()
136
+ .describe('Minimum weekly downloads — FIREFOX-ONLY metric (Chrome/Edge do not report it). ' +
137
+ 'For Chrome/Edge popularity use sortBy:"popular" instead. Conflicts with a ' +
138
+ 'Chrome/Edge-only `stores` filter and will be rejected.'),
139
+ minReviews: z.number().min(0).optional().describe('Minimum number of store reviews/ratings.'),
140
+ updatedWithin: z
141
+ .enum(['30d', '90d', '1y', 'stale'])
142
+ .optional()
143
+ .describe('Freshness: updated within 30d / 90d / 1y, or "stale" (older than 1y).'),
144
+ manifestVersions: z
145
+ .array(z.union([z.literal(2), z.literal(3)]))
146
+ .optional()
147
+ .describe('Manifest version(s): 2 and/or 3.'),
148
+ traderStatuses: z
149
+ .array(z.enum(['TRADER', 'NON_TRADER']))
150
+ .optional()
151
+ .describe('EU DSA trader status.'),
152
+ monetizationModels: z
153
+ .array(z.enum(['FREE', 'ONE_TIME', 'SUBSCRIPTION', 'FREEMIUM', 'DONATIONS', 'ADS']))
154
+ .optional()
155
+ .describe('Author-declared monetization model (questionnaire).'),
156
+ hasPaywall: z.boolean().optional().describe('Author-declared paywall present.'),
157
+ isOpenSource: z.boolean().optional().describe('Author-declared open source.'),
158
+ noTelemetry: z.boolean().optional().describe('Author-declared no telemetry.'),
159
+ collectsHealthData: z.boolean().optional().describe('Author-declared collects health data.'),
160
+ includeDelisted: z
161
+ .boolean()
162
+ .optional()
163
+ .describe('Include extensions whose store listing was removed (default: hidden).'),
93
164
  sortBy: z
94
- .enum(['relevance', 'popular', 'rating', 'recent', 'name', 'safety'])
165
+ .enum(['relevance', 'popular', 'rating', 'recent', 'name', 'safety', 'trader', 'size'])
95
166
  .optional()
96
- .describe('Sort order (default: popular, or relevance when a query is given).'),
167
+ .describe('Sort field (default: popular, or relevance when a query is given).'),
168
+ sortOrder: z.enum(['asc', 'desc']).optional().describe('Sort direction (default: desc).'),
169
+ skip: z.number().int().min(0).optional().describe('Offset for pagination (default: 0).'),
97
170
  limit: z.number().int().min(1).max(25).default(20).describe('Max results to return (1–25).'),
98
171
  }),
99
172
  execute: async (args) => {
100
173
  try {
174
+ const conflict = validateSearchFilters(args);
175
+ if (conflict)
176
+ throw new UserError(conflict);
101
177
  const limit = args.limit ?? 20;
102
178
  const result = await bff().searchExtensions({
103
179
  query: args.query,
@@ -107,7 +183,21 @@ server.addTool({
107
183
  riskCategories: args.risk,
108
184
  permissions: args.permissions,
109
185
  minRating: args.minRating,
186
+ maxRating: args.maxRating,
187
+ minWeeklyDownloads: args.minWeeklyDownloads,
188
+ minReviews: args.minReviews,
189
+ updatedWithin: args.updatedWithin,
190
+ manifestVersions: args.manifestVersions,
191
+ traderStatuses: args.traderStatuses,
192
+ monetizationModels: args.monetizationModels,
193
+ hasPaywall: args.hasPaywall,
194
+ isOpenSource: args.isOpenSource,
195
+ noTelemetry: args.noTelemetry,
196
+ collectsHealthData: args.collectsHealthData,
197
+ includeDelisted: args.includeDelisted,
110
198
  sortBy: args.sortBy ?? (args.query ? 'relevance' : 'popular'),
199
+ sortOrder: args.sortOrder,
200
+ skip: args.skip,
111
201
  take: limit,
112
202
  });
113
203
  return JSON.stringify(shapeSearch(result, limit), null, 2);
@@ -116,8 +206,8 @@ server.addTool({
116
206
  return readError(err);
117
207
  }
118
208
  },
119
- });
120
- server.addTool({
209
+ }));
210
+ server.addTool(instrument({
121
211
  name: 'get_extension',
122
212
  description: 'Get full catalog detail for one extension by its numeric catalog ID: metadata, ' +
123
213
  'per-store ratings, install counts, categories, and a security badge.',
@@ -135,10 +225,11 @@ server.addTool({
135
225
  return readError(err);
136
226
  }
137
227
  },
138
- });
139
- server.addTool({
228
+ }));
229
+ server.addTool(instrument({
140
230
  name: 'get_security',
141
- description: 'Get the security analysis for an extension: risk score/category, finding counts by ' +
231
+ description: 'Get the security analysis for an extension: safety score (0–100, higher = safer — the ' +
232
+ 'same coefficient the website shows), risk category, finding counts by ' +
142
233
  'severity, and the top grouped findings (scanner, rule, severity, count). Also returns ' +
143
234
  'the install-dialog preview — exactly what Chrome/Firefox show users in the permission ' +
144
235
  'prompt at install (consolidated + deduped from the manifest), available even for ' +
@@ -166,8 +257,8 @@ server.addTool({
166
257
  return readError(err);
167
258
  }
168
259
  },
169
- });
170
- server.addTool({
260
+ }));
261
+ server.addTool(instrument({
171
262
  name: 'get_related_extensions',
172
263
  description: 'Find similar/competing extensions for a given extension — useful for competitive ' +
173
264
  'analysis and alternatives research.',
@@ -184,8 +275,8 @@ server.addTool({
184
275
  return readError(err);
185
276
  }
186
277
  },
187
- });
188
- server.addTool({
278
+ }));
279
+ server.addTool(instrument({
189
280
  name: 'market_overview',
190
281
  description: 'Get aggregate catalog market stats and facet counts (by category, pricing model, and ' +
191
282
  'risk level). Pass an optional query/filters to scope the facets to a search.',
@@ -212,9 +303,9 @@ server.addTool({
212
303
  return readError(err);
213
304
  }
214
305
  },
215
- });
306
+ }));
216
307
  // ── Documentation (free; no API key required) ───────────────────────────────
217
- server.addTool({
308
+ server.addTool(instrument({
218
309
  name: 'search_docs',
219
310
  description: 'Search the official Extenshi documentation (docs.extenshi.io) — product guides plus the ' +
220
311
  'full @extenshi/cli command reference (scan, review-risk, publish, login). Use it to answer ' +
@@ -247,15 +338,17 @@ server.addTool({
247
338
  throw new UserError(err instanceof Error ? err.message : String(err));
248
339
  }
249
340
  },
250
- });
341
+ }));
251
342
  // ── Action tool (paid; key required) ────────────────────────────────────────
252
- server.addTool({
343
+ server.addTool(instrument({
253
344
  name: 'scan_extension',
254
345
  description: 'Run a pre-publish security scan on a local extension artifact (.zip/.crx/.xpi) and ' +
255
346
  'return the report. Uses one scan from your free monthly allowance (5 scans/month) or a ' +
256
347
  'purchased scan credit once that runs out. Streams live per-scanner progress.',
257
348
  parameters: z.object({
258
- artifact_path: z.string().describe('Absolute or relative path to the built extension artifact (≤50 MB).'),
349
+ artifact_path: z
350
+ .string()
351
+ .describe('Absolute or relative path to the built extension artifact (≤50 MB).'),
259
352
  extension_id: z
260
353
  .number()
261
354
  .int()
@@ -284,8 +377,8 @@ server.addTool({
284
377
  throw err;
285
378
  }
286
379
  },
287
- });
288
- server.addTool({
380
+ }));
381
+ server.addTool(instrument({
289
382
  name: 'publish_extension',
290
383
  description: 'Publish an extension artifact (.zip/.crx/.xpi) to Chrome Web Store, Firefox AMO, and/or Edge Add-ons. ' +
291
384
  'FREE and fully local: the upload goes from this machine straight to the store APIs using store ' +
@@ -361,7 +454,7 @@ server.addTool({
361
454
  throw err;
362
455
  }
363
456
  },
364
- });
457
+ }));
365
458
  /** Map a scan backend failure to an actionable next step. */
366
459
  function scanErrorMessage(err) {
367
460
  switch (err.status) {
@@ -382,5 +475,18 @@ function scanErrorMessage(err) {
382
475
  return err.message;
383
476
  }
384
477
  }
478
+ // Flush buffered telemetry on shutdown. 'beforeExit' covers the natural
479
+ // stdin-closed exit; SIGTERM/SIGINT (the MCP client killing the server) bypass
480
+ // it, so handle those explicitly and then exit. During a session posthog-node's
481
+ // interval flush already drains events, so at most the last few seconds are at
482
+ // risk. Never blocks: flushTelemetry is hard-capped (~2.5s).
483
+ for (const signal of ['SIGTERM', 'SIGINT']) {
484
+ process.once(signal, () => {
485
+ void flushTelemetry().then(() => process.exit(0));
486
+ });
487
+ }
488
+ process.once('beforeExit', () => {
489
+ void flushTelemetry();
490
+ });
385
491
  server.start({ transportType: 'stdio' });
386
492
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Cross-store filter validation for `search_extensions`.
3
+ *
4
+ * Some catalog filters are backed by STORE-SPECIFIC metrics, so combining them
5
+ * with a `stores` filter that excludes every store reporting that metric yields
6
+ * a silently-empty (or misleading) result set. We reject those combinations up
7
+ * front with an actionable message instead of letting the caller "search half
8
+ * the catalog and wonder why nothing matched".
9
+ *
10
+ * Field population (source of truth: catalog/scraper/src):
11
+ * - weeklyDownloads → Firefox ONLY (`addon.weekly_downloads`). Chrome reports
12
+ * install counts via `usersNumeric`; Edge via `activeInstallCount`; neither
13
+ * sets weeklyDownloads. There is no server-side min-usersNumeric filter, so
14
+ * for Chrome/Edge popularity the only lever is `sortBy: 'popular'`.
15
+ *
16
+ * Kept free of any `fastmcp` import so it stays unit-testable in isolation; the
17
+ * caller (index.ts) turns a returned message into a `UserError`.
18
+ */
19
+ export type StoreType = 'CHROME' | 'FIREFOX' | 'EDGE';
20
+ interface StoreSpecificFilter {
21
+ /** The arg key whose presence triggers the check. */
22
+ field: string;
23
+ /** Stores whose snapshots actually populate the metric this filter needs. */
24
+ supportedStores: readonly StoreType[];
25
+ /** Actionable guidance appended to the conflict message. */
26
+ hint: string;
27
+ }
28
+ export declare const STORE_SPECIFIC_FILTERS: readonly StoreSpecificFilter[];
29
+ /**
30
+ * Returns a human-readable conflict message when the args combine a
31
+ * store-specific filter with a `stores` set that supports none of it; otherwise
32
+ * null. A missing/empty `stores` filter never conflicts (the metric simply
33
+ * narrows results to the stores that report it).
34
+ */
35
+ export declare function validateSearchFilters(args: Record<string, unknown>): string | null;
36
+ export {};
37
+ //# sourceMappingURL=search-filters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-filters.d.ts","sourceRoot":"","sources":["../src/search-filters.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAA;AAErD,UAAU,mBAAmB;IAC5B,qDAAqD;IACrD,KAAK,EAAE,MAAM,CAAA;IACb,6EAA6E;IAC7E,eAAe,EAAE,SAAS,SAAS,EAAE,CAAA;IACrC,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAA;CACZ;AAED,eAAO,MAAM,sBAAsB,EAAE,SAAS,mBAAmB,EAShE,CAAA;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,IAAI,CAWlF"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Cross-store filter validation for `search_extensions`.
3
+ *
4
+ * Some catalog filters are backed by STORE-SPECIFIC metrics, so combining them
5
+ * with a `stores` filter that excludes every store reporting that metric yields
6
+ * a silently-empty (or misleading) result set. We reject those combinations up
7
+ * front with an actionable message instead of letting the caller "search half
8
+ * the catalog and wonder why nothing matched".
9
+ *
10
+ * Field population (source of truth: catalog/scraper/src):
11
+ * - weeklyDownloads → Firefox ONLY (`addon.weekly_downloads`). Chrome reports
12
+ * install counts via `usersNumeric`; Edge via `activeInstallCount`; neither
13
+ * sets weeklyDownloads. There is no server-side min-usersNumeric filter, so
14
+ * for Chrome/Edge popularity the only lever is `sortBy: 'popular'`.
15
+ *
16
+ * Kept free of any `fastmcp` import so it stays unit-testable in isolation; the
17
+ * caller (index.ts) turns a returned message into a `UserError`.
18
+ */
19
+ export const STORE_SPECIFIC_FILTERS = [
20
+ {
21
+ field: 'minWeeklyDownloads',
22
+ supportedStores: ['FIREFOX'],
23
+ hint: '`minWeeklyDownloads` is a Firefox-only metric — Chrome and Edge do not report weekly ' +
24
+ 'downloads (they report install counts). Include FIREFOX in `stores`, drop the `stores` ' +
25
+ 'filter, or rank by installs across stores with `sortBy: "popular"` instead.',
26
+ },
27
+ ];
28
+ /**
29
+ * Returns a human-readable conflict message when the args combine a
30
+ * store-specific filter with a `stores` set that supports none of it; otherwise
31
+ * null. A missing/empty `stores` filter never conflicts (the metric simply
32
+ * narrows results to the stores that report it).
33
+ */
34
+ export function validateSearchFilters(args) {
35
+ const stores = Array.isArray(args.stores) ? args.stores : null;
36
+ if (!stores || stores.length === 0)
37
+ return null;
38
+ for (const f of STORE_SPECIFIC_FILTERS) {
39
+ if (args[f.field] === undefined || args[f.field] === null)
40
+ continue;
41
+ const supported = f.supportedStores.some((s) => stores.includes(s));
42
+ if (!supported) {
43
+ return `Filter conflict: ${f.hint} (requested stores: ${stores.join(', ')})`;
44
+ }
45
+ }
46
+ return null;
47
+ }
48
+ //# sourceMappingURL=search-filters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-filters.js","sourceRoot":"","sources":["../src/search-filters.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAaH,MAAM,CAAC,MAAM,sBAAsB,GAAmC;IACrE;QACC,KAAK,EAAE,oBAAoB;QAC3B,eAAe,EAAE,CAAC,SAAS,CAAC;QAC5B,IAAI,EACH,uFAAuF;YACvF,yFAAyF;YACzF,6EAA6E;KAC9E;CACD,CAAA;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAA6B;IAClE,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAE,IAAI,CAAC,MAAmB,CAAC,CAAC,CAAC,IAAI,CAAA;IAC5E,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IAC/C,KAAK,MAAM,CAAC,IAAI,sBAAsB,EAAE,CAAC;QACxC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI;YAAE,SAAQ;QACnE,MAAM,SAAS,GAAG,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;QACnE,IAAI,CAAC,SAAS,EAAE,CAAC;YAChB,OAAO,oBAAoB,CAAC,CAAC,IAAI,uBAAuB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAA;QAC7E,CAAC;IACF,CAAC;IACD,OAAO,IAAI,CAAA;AACZ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"shape.d.ts","sourceRoot":"","sources":["../src/shape.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,UAAU,WAAW;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,mFAAmF;AACnF,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,GAAE,WAAgB,EAAE,KAAK,SAAI,GAAG,OAAO,CAqBlF;AAED,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AA+ClC,yEAAyE;AACzE,wBAAgB,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,GAAG,CAS/D;AAED,6DAA6D;AAC7D,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAkCvD;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,GAAG,GAAG,SAAS,CAqBpE;AAkBD,sFAAsF;AACtF,wBAAgB,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,oBAAoB,CAAC,EAAE,OAAO,GAAG,GAAG,CA+C1G"}
1
+ {"version":3,"file":"shape.d.ts","sourceRoot":"","sources":["../src/shape.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,UAAU,WAAW;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,mFAAmF;AACnF,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,GAAE,WAAgB,EAAE,KAAK,SAAI,GAAG,OAAO,CAqBlF;AAED,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AA6DlC,yEAAyE;AACzE,wBAAgB,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,GAAG,CAS/D;AAED,6DAA6D;AAC7D,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAkCvD;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,GAAG,GAAG,SAAS,CAqBpE;AAkBD,sFAAsF;AACtF,wBAAgB,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,oBAAoB,CAAC,EAAE,OAAO,GAAG,GAAG,CAkD1G"}
package/dist/shape.js CHANGED
@@ -47,6 +47,21 @@ function prune(obj) {
47
47
  delete obj[k];
48
48
  return obj;
49
49
  }
50
+ /**
51
+ * Convert a backend risk score (0 = safest, 100 = most dangerous) into the
52
+ * user-facing safety score (0 = most dangerous, 100 = safest) — the SAME
53
+ * coefficient the website shows everywhere (catalog-frontend `toSafetyScore`:
54
+ * `clamp(0, 100, 100 - risk)`). Returns undefined for a missing score so an
55
+ * unscanned extension surfaces no score at all (rather than a misleading 100).
56
+ */
57
+ function toSafetyScore(risk) {
58
+ if (risk === undefined || risk === null)
59
+ return undefined;
60
+ const r = Number(risk);
61
+ if (!Number.isFinite(r))
62
+ return undefined;
63
+ return Math.max(0, Math.min(100, 100 - r));
64
+ }
50
65
  function primaryCategory(snap) {
51
66
  const cats = snap.categories;
52
67
  if (Array.isArray(cats) && isObj(cats[0]))
@@ -76,7 +91,7 @@ function shapeSearchItem(item) {
76
91
  version: snap.version,
77
92
  lastUpdated: snap.lastUpdated,
78
93
  sizeBytes: item.latestSizeBytes,
79
- riskScore: riskAssessment?.overallScore ?? security?.overallScore,
94
+ safetyScore: toSafetyScore(riskAssessment?.overallScore ?? security?.overallScore),
80
95
  shortDescription: typeof snap.shortDescription === 'string' ? snap.shortDescription.slice(0, 200) : undefined,
81
96
  });
82
97
  }
@@ -106,8 +121,8 @@ export function shapeExtension(result) {
106
121
  users: result.latestUsersNumeric,
107
122
  lastUpdated: result.latestUpdatedAt,
108
123
  traderStatus: result.latestTraderStatus,
109
- riskScore: result.latestRiskScore,
110
- riskScoreAt: result.latestRiskScoreAt,
124
+ safetyScore: toSafetyScore(result.latestRiskScore),
125
+ safetyScoreAt: result.latestRiskScoreAt,
111
126
  sizeBytes: result.latestSizeBytes,
112
127
  hidden: result.hidden || undefined,
113
128
  stores: stores.length ? stores : undefined,
@@ -176,12 +191,15 @@ function shapeFinding(f) {
176
191
  export function shapeSecurity(security, riskSummary, installDialogPreview) {
177
192
  const out = {};
178
193
  if (isObj(riskSummary)) {
179
- out.summary = riskSummary;
194
+ // Replace the backend `overallScore` (0 = safest) with the website's
195
+ // `safetyScore` (100 = safest) so the MCP and the site never disagree.
196
+ const { overallScore, ...rest } = riskSummary;
197
+ out.summary = prune({ safetyScore: toSafetyScore(overallScore), ...rest });
180
198
  }
181
199
  else if (isObj(security) && isObj(security.riskAssessment)) {
182
200
  const ra = security.riskAssessment;
183
201
  out.summary = prune({
184
- overallScore: ra.overallScore,
202
+ safetyScore: toSafetyScore(ra.overallScore),
185
203
  riskCategory: ra.riskCategory,
186
204
  severityBreakdown: isObj(ra.contributingFactors)
187
205
  ? ra.contributingFactors.severity_breakdown
package/dist/shape.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"shape.js","sourceRoot":"","sources":["../src/shape.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shape.js","sourceRoot":"","sources":["../src/shape.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Anonymous, opt-out usage telemetry — VENDORED, kept byte-identical between
3
+ * @extenshi/cli and @extenshi/mcp (same pattern as validate-artifact.ts). Edit
4
+ * one, copy to the other.
5
+ *
6
+ * Why it exists: we want to know which commands/tools are used most, which fail,
7
+ * and what errors recur — without shipping a heavyweight client or leaking PII.
8
+ *
9
+ * What it sends (and ONLY this):
10
+ * - command/tool name, surface ('cli' | 'mcp'), package + Node version,
11
+ * coarse os/arch, a CI bool
12
+ * - the NAMES of CLI flags used (never their values — see flagsFromArgv)
13
+ * - a coarse error_kind classification + durations
14
+ * - a path-redacted exception signature (message + stack, $HOME stripped)
15
+ *
16
+ * What it NEVER sends: file paths, artifact names/contents, API keys, manifest
17
+ * data, or raw user input.
18
+ *
19
+ * Identity is an anonymous per-install UUID in ~/.extenshi/config.json
20
+ * (`anonId`) — it identifies an install, not a person, and is never linked to
21
+ * the API key client-side.
22
+ *
23
+ * On by default: the shared-project ingestion key is embedded (see
24
+ * EMBEDDED_KEY), so telemetry is active unless the user opts out. Disabled
25
+ * (no-op, never blocks the command) when ANY holds:
26
+ * - DO_NOT_TRACK is truthy (industry standard, https://consoledonottrack.com)
27
+ * - EXTENSHI_TELEMETRY in {0,false,off,no}
28
+ * - config file has "telemetry": false
29
+ * - the key is cleared (EMBEDDED_KEY emptied AND no EXTENSHI_POSTHOG_KEY)
30
+ *
31
+ * Everything here is fail-soft: any throw inside telemetry is swallowed so a
32
+ * PostHog/network/disk problem can never break or slow the actual command.
33
+ */
34
+ /** Record the surface + version once at process startup. */
35
+ export declare function initTelemetry(opts: {
36
+ surface: string;
37
+ version: string;
38
+ }): void;
39
+ export declare function telemetryEnabled(): boolean;
40
+ /** Strip absolute home paths from any string before it leaves the machine. */
41
+ export declare function redactText(s: string): string;
42
+ /**
43
+ * Coarse error bucket. Driven by a numeric `status` when the error carries one
44
+ * (MCP ScanError), else by message patterns (CLI throws plain Errors). Order
45
+ * matters — status first, then transport, then semantic buckets.
46
+ */
47
+ export declare function classifyError(err: unknown): string;
48
+ /**
49
+ * The NAMES of long flags the user passed, with values stripped. `--out=/x`
50
+ * becomes `--out`; the separate-token value of `--output /x` is never a `--`
51
+ * token, so it is never collected. No flag VALUE can leak through here.
52
+ */
53
+ export declare function flagsFromArgv(argv?: string[]): string[];
54
+ export declare function captureEvent(event: string, properties?: Record<string, unknown>): void;
55
+ export declare function captureError(err: unknown, context?: Record<string, unknown>): void;
56
+ /**
57
+ * Flush buffered events and close the client. Hard-capped so a slow/hung
58
+ * PostHog endpoint can never delay the command's exit. Safe to call when
59
+ * telemetry is disabled (no-op) or more than once.
60
+ */
61
+ export declare function flushTelemetry(): Promise<void>;
62
+ //# sourceMappingURL=telemetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AA+BH,4DAA4D;AAC5D,wBAAgB,aAAa,CAAC,IAAI,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAG9E;AAmCD,wBAAgB,gBAAgB,IAAI,OAAO,CAO1C;AA6CD,8EAA8E;AAC9E,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAO5C;AAUD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAsBlD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,GAAE,MAAM,EAA0B,GAAG,MAAM,EAAE,CAM9E;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,IAAI,CAQ1F;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,IAAI,CAQtF;AASD;;;;GAIG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CASpD"}
@@ -0,0 +1,259 @@
1
+ /**
2
+ * Anonymous, opt-out usage telemetry — VENDORED, kept byte-identical between
3
+ * @extenshi/cli and @extenshi/mcp (same pattern as validate-artifact.ts). Edit
4
+ * one, copy to the other.
5
+ *
6
+ * Why it exists: we want to know which commands/tools are used most, which fail,
7
+ * and what errors recur — without shipping a heavyweight client or leaking PII.
8
+ *
9
+ * What it sends (and ONLY this):
10
+ * - command/tool name, surface ('cli' | 'mcp'), package + Node version,
11
+ * coarse os/arch, a CI bool
12
+ * - the NAMES of CLI flags used (never their values — see flagsFromArgv)
13
+ * - a coarse error_kind classification + durations
14
+ * - a path-redacted exception signature (message + stack, $HOME stripped)
15
+ *
16
+ * What it NEVER sends: file paths, artifact names/contents, API keys, manifest
17
+ * data, or raw user input.
18
+ *
19
+ * Identity is an anonymous per-install UUID in ~/.extenshi/config.json
20
+ * (`anonId`) — it identifies an install, not a person, and is never linked to
21
+ * the API key client-side.
22
+ *
23
+ * On by default: the shared-project ingestion key is embedded (see
24
+ * EMBEDDED_KEY), so telemetry is active unless the user opts out. Disabled
25
+ * (no-op, never blocks the command) when ANY holds:
26
+ * - DO_NOT_TRACK is truthy (industry standard, https://consoledonottrack.com)
27
+ * - EXTENSHI_TELEMETRY in {0,false,off,no}
28
+ * - config file has "telemetry": false
29
+ * - the key is cleared (EMBEDDED_KEY emptied AND no EXTENSHI_POSTHOG_KEY)
30
+ *
31
+ * Everything here is fail-soft: any throw inside telemetry is swallowed so a
32
+ * PostHog/network/disk problem can never break or slow the actual command.
33
+ */
34
+ import { randomUUID } from 'node:crypto';
35
+ import fs from 'node:fs';
36
+ import os from 'node:os';
37
+ import path from 'node:path';
38
+ import { PostHog } from 'posthog-node';
39
+ // Shared PostHog *project* ingestion key (EU project 114791 — the same project
40
+ // the web apps use; we run on the free tier so CLI/MCP share it). It is the
41
+ // public, write-only key already shipped in our web bundles, so embedding it
42
+ // here is not a secret leak. CLI/MCP events are namespaced (`cli_*` / `mcp_*`,
43
+ // plus a `surface` property) so they stay separable from web analytics.
44
+ // Override at runtime with EXTENSHI_POSTHOG_KEY; set it empty to ship dark.
45
+ const EMBEDDED_KEY = 'phc_fqKrAmtNZvJqe0krpYB3UwYqALLpT1WM8m5LtNs9eUu';
46
+ const DEFAULT_HOST = 'https://eu.i.posthog.com';
47
+ const CONFIG_PATH = path.join(os.homedir(), '.extenshi', 'config.json');
48
+ const HOME = os.homedir();
49
+ let surface = 'unknown';
50
+ let appVersion = '0.0.0';
51
+ let client = null;
52
+ let triedInit = false;
53
+ let cachedAnonId = null;
54
+ /** Record the surface + version once at process startup. */
55
+ export function initTelemetry(opts) {
56
+ surface = opts.surface;
57
+ appVersion = opts.version;
58
+ }
59
+ function telemetryKey() {
60
+ return (process.env.EXTENSHI_POSTHOG_KEY ?? EMBEDDED_KEY).trim();
61
+ }
62
+ function telemetryHost() {
63
+ return (process.env.EXTENSHI_POSTHOG_HOST ?? DEFAULT_HOST).trim();
64
+ }
65
+ function readConfig() {
66
+ try {
67
+ return JSON.parse(fs.readFileSync(CONFIG_PATH, 'utf8'));
68
+ }
69
+ catch {
70
+ return {};
71
+ }
72
+ }
73
+ /** Merge-write so we never clobber apiKey/apiUrl written by `extenshi login`. */
74
+ function mergeWriteConfig(update) {
75
+ try {
76
+ const existing = readConfig();
77
+ const merged = { ...existing, ...update };
78
+ fs.mkdirSync(path.dirname(CONFIG_PATH), { recursive: true });
79
+ fs.writeFileSync(CONFIG_PATH, `${JSON.stringify(merged, null, 2)}\n`, { mode: 0o600 });
80
+ }
81
+ catch {
82
+ // Read-only home / unwritable config — fall back to an ephemeral id.
83
+ }
84
+ }
85
+ function isTruthy(v) {
86
+ const t = (v ?? '').trim().toLowerCase();
87
+ return t === '1' || t === 'true' || t === 'yes' || t === 'on';
88
+ }
89
+ export function telemetryEnabled() {
90
+ if (!telemetryKey())
91
+ return false;
92
+ if (isTruthy(process.env.DO_NOT_TRACK))
93
+ return false;
94
+ const t = (process.env.EXTENSHI_TELEMETRY ?? '').trim().toLowerCase();
95
+ if (t === '0' || t === 'false' || t === 'off' || t === 'no')
96
+ return false;
97
+ if (readConfig().telemetry === false)
98
+ return false;
99
+ return true;
100
+ }
101
+ function anonId() {
102
+ if (cachedAnonId)
103
+ return cachedAnonId;
104
+ const existing = readConfig().anonId;
105
+ if (existing) {
106
+ cachedAnonId = existing;
107
+ return existing;
108
+ }
109
+ const id = randomUUID();
110
+ cachedAnonId = id;
111
+ mergeWriteConfig({ anonId: id });
112
+ return id;
113
+ }
114
+ function getClient() {
115
+ // Fast path after the first call: never re-read the config file
116
+ // (telemetryEnabled does a sync read) on subsequent events — matters for the
117
+ // long-running MCP server, which can handle many tool calls.
118
+ if (client)
119
+ return client;
120
+ if (triedInit)
121
+ return null;
122
+ triedInit = true;
123
+ if (!telemetryEnabled())
124
+ return null;
125
+ try {
126
+ // Batch events; the 2–3 events a CLI run emits flush together on
127
+ // flushTelemetry()/shutdown(). The MCP server (long-running) also gets a
128
+ // periodic interval flush.
129
+ client = new PostHog(telemetryKey(), { host: telemetryHost(), flushAt: 20, flushInterval: 5000 });
130
+ }
131
+ catch {
132
+ client = null;
133
+ }
134
+ return client;
135
+ }
136
+ function baseProps() {
137
+ return {
138
+ surface,
139
+ version: appVersion,
140
+ node: process.version,
141
+ os: process.platform,
142
+ arch: process.arch,
143
+ ci: Boolean(process.env.CI),
144
+ };
145
+ }
146
+ /** Strip absolute home paths from any string before it leaves the machine. */
147
+ export function redactText(s) {
148
+ if (!s)
149
+ return s;
150
+ let out = s;
151
+ if (HOME)
152
+ out = out.split(HOME).join('~');
153
+ out = out.replace(/\/(?:Users|home)\/[^/\s]+/g, '~');
154
+ out = out.replace(/[A-Za-z]:\\Users\\[^\\\s]+/g, '~');
155
+ return out;
156
+ }
157
+ function sanitizeError(err) {
158
+ const original = err instanceof Error ? err : new Error(String(err));
159
+ const e = new Error(redactText(original.message));
160
+ e.name = original.name;
161
+ if (original.stack)
162
+ e.stack = redactText(original.stack);
163
+ return e;
164
+ }
165
+ /**
166
+ * Coarse error bucket. Driven by a numeric `status` when the error carries one
167
+ * (MCP ScanError), else by message patterns (CLI throws plain Errors). Order
168
+ * matters — status first, then transport, then semantic buckets.
169
+ */
170
+ export function classifyError(err) {
171
+ const status = typeof err?.status === 'number' ? err.status : undefined;
172
+ const msg = (err instanceof Error ? err.message : String(err)).toLowerCase();
173
+ if (status === 401 || status === 403)
174
+ return 'auth';
175
+ if (status === 402)
176
+ return 'quota';
177
+ if (status === 429)
178
+ return 'rate_limit';
179
+ if (status && status >= 500)
180
+ return 'api_5xx';
181
+ if (status && status >= 400)
182
+ return 'api_4xx';
183
+ if (/enotfound|econnrefused|econnreset|eai_again|fetch failed|network|socket hang|und_err/.test(msg))
184
+ return 'network';
185
+ if (/timed out|timeout|aborted|aborterror/.test(msg))
186
+ return 'timeout';
187
+ if (/authentication failed|unauthorized|api key|access denied|forbidden/.test(msg))
188
+ return 'auth';
189
+ if (/insufficient credits|out of .*credits|\bquota\b/.test(msg))
190
+ return 'quota';
191
+ if (/rate limit/.test(msg))
192
+ return 'rate_limit';
193
+ if (/artifact|not a file|file not found|exceeds .*mb|invalid .*(crx|xpi|zip)|magic|unsupported/.test(msg))
194
+ return 'invalid_artifact';
195
+ if (/http 4\d{2}/.test(msg))
196
+ return 'api_4xx';
197
+ if (/non-json response|http 5\d{2}|server returned/.test(msg))
198
+ return 'api_5xx';
199
+ return 'unexpected';
200
+ }
201
+ /**
202
+ * The NAMES of long flags the user passed, with values stripped. `--out=/x`
203
+ * becomes `--out`; the separate-token value of `--output /x` is never a `--`
204
+ * token, so it is never collected. No flag VALUE can leak through here.
205
+ */
206
+ export function flagsFromArgv(argv = process.argv.slice(2)) {
207
+ const flags = new Set();
208
+ for (const tok of argv) {
209
+ if (tok.startsWith('--'))
210
+ flags.add(tok.split('=')[0]);
211
+ }
212
+ return [...flags];
213
+ }
214
+ export function captureEvent(event, properties = {}) {
215
+ const c = getClient();
216
+ if (!c)
217
+ return;
218
+ try {
219
+ c.capture({ distinctId: anonId(), event, properties: { ...baseProps(), ...properties } });
220
+ }
221
+ catch {
222
+ // Telemetry must never throw into the command path.
223
+ }
224
+ }
225
+ export function captureError(err, context = {}) {
226
+ const c = getClient();
227
+ if (!c)
228
+ return;
229
+ try {
230
+ c.captureException(sanitizeError(err), anonId(), { ...baseProps(), ...context });
231
+ }
232
+ catch {
233
+ // Swallow — see captureEvent.
234
+ }
235
+ }
236
+ function timeout(ms) {
237
+ return new Promise((resolve) => {
238
+ // unref so the flush timer can't keep a short-lived CLI process alive.
239
+ setTimeout(resolve, ms).unref();
240
+ });
241
+ }
242
+ /**
243
+ * Flush buffered events and close the client. Hard-capped so a slow/hung
244
+ * PostHog endpoint can never delay the command's exit. Safe to call when
245
+ * telemetry is disabled (no-op) or more than once.
246
+ */
247
+ export async function flushTelemetry() {
248
+ if (!client)
249
+ return;
250
+ const c = client;
251
+ client = null;
252
+ try {
253
+ await Promise.race([c.shutdown(2000), timeout(2500)]);
254
+ }
255
+ catch {
256
+ // Best-effort.
257
+ }
258
+ }
259
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@extenshi/mcp",
3
- "version": "0.0.5",
3
+ "version": "0.1.1",
4
4
  "description": "Extenshi MCP server — bring the extension catalog (search, security, market research) and pre-publish scanning into your AI tools",
5
5
  "type": "module",
6
6
  "publishConfig": {
@@ -10,18 +10,21 @@
10
10
  "extenshi-mcp": "dist/index.js"
11
11
  },
12
12
  "files": [
13
- "dist"
13
+ "dist",
14
+ "scripts/postinstall.cjs"
14
15
  ],
15
16
  "scripts": {
16
17
  "build": "tsc",
17
18
  "dev": "tsc --watch",
18
19
  "test": "vitest run",
20
+ "postinstall": "node scripts/postinstall.cjs",
19
21
  "prepublishOnly": "yarn build"
20
22
  },
21
23
  "dependencies": {
22
24
  "@extenshi/publisher": "^0.8.0",
23
25
  "@trpc/client": "^11.17.0",
24
26
  "fastmcp": "^4.0.1",
27
+ "posthog-node": "^5.35.1",
25
28
  "undici": "^7.28.0",
26
29
  "zod": "^3.25.76"
27
30
  },
@@ -0,0 +1,132 @@
1
+ 'use strict'
2
+ /**
3
+ * Anonymous install ping — VENDORED, kept byte-identical between @extenshi/cli
4
+ * and @extenshi/mcp (it figures out which one it is from its own package.json).
5
+ *
6
+ * Fires a single `cli_installed` / `mcp_installed` event when the package is
7
+ * installed as a real dependency, so we can see adoption in PostHog. It is a
8
+ * standalone CommonJS script using ONLY Node built-ins (no posthog-node, no
9
+ * build step) so it can run the instant npm extracts the tarball.
10
+ *
11
+ * Hard rules (a postinstall that breaks `npm install` is unacceptable):
12
+ * - ALWAYS exits 0, even on any error — wrapped in try/catch + a hard timeout.
13
+ * - Fully fail-soft and fire-and-forget; the request is capped at ~2s.
14
+ *
15
+ * It self-skips (no event, no network) when:
16
+ * - the package is NOT under node_modules — i.e. our own monorepo workspace
17
+ * install (tools/<pkg>), so dev installs never inflate adoption counts;
18
+ * - DO_NOT_TRACK is truthy, EXTENSHI_TELEMETRY is off, or config
19
+ * ~/.extenshi/config.json has "telemetry": false;
20
+ * - CI is set (CI re-installs would massively inflate the count);
21
+ * - no ingestion key is configured.
22
+ *
23
+ * Privacy: sends only the package version, Node version, coarse os/arch, and an
24
+ * anonymous per-install UUID (the same id the runtime telemetry uses). Never any
25
+ * path, package contents, or user input.
26
+ */
27
+
28
+ // Shared EU PostHog project key (114791) — public, write-only, already in our
29
+ // web bundles. Override with EXTENSHI_POSTHOG_KEY; empty disables the ping.
30
+ const EMBEDDED_KEY = 'phc_fqKrAmtNZvJqe0krpYB3UwYqALLpT1WM8m5LtNs9eUu'
31
+ const DEFAULT_HOST = 'https://eu.i.posthog.com'
32
+
33
+ function done() {
34
+ process.exit(0)
35
+ }
36
+
37
+ try {
38
+ const path = require('node:path')
39
+ const fs = require('node:fs')
40
+ const os = require('node:os')
41
+ const https = require('node:https')
42
+ const { randomUUID } = require('node:crypto')
43
+
44
+ // Real dependency install only — workspace path has no /node_modules/ segment.
45
+ if (!__dirname.includes(`${path.sep}node_modules${path.sep}`)) done()
46
+
47
+ // CI re-installs would inflate the adoption count — skip them.
48
+ if (process.env.CI) done()
49
+
50
+ const key = (process.env.EXTENSHI_POSTHOG_KEY || EMBEDDED_KEY).trim()
51
+ if (!key) done()
52
+
53
+ const dnt = String(process.env.DO_NOT_TRACK || '')
54
+ .trim()
55
+ .toLowerCase()
56
+ if (['1', 'true', 'yes', 'on'].includes(dnt)) done()
57
+ const optOut = String(process.env.EXTENSHI_TELEMETRY || '')
58
+ .trim()
59
+ .toLowerCase()
60
+ if (['0', 'false', 'off', 'no'].includes(optOut)) done()
61
+
62
+ // Anonymous per-install id, shared with the runtime telemetry module.
63
+ const configPath = path.join(os.homedir(), '.extenshi', 'config.json')
64
+ let cfg = {}
65
+ try {
66
+ cfg = JSON.parse(fs.readFileSync(configPath, 'utf8'))
67
+ } catch {}
68
+ if (cfg && cfg.telemetry === false) done()
69
+ let anonId = cfg && cfg.anonId
70
+ if (!anonId) {
71
+ anonId = randomUUID()
72
+ try {
73
+ fs.mkdirSync(path.dirname(configPath), { recursive: true })
74
+ fs.writeFileSync(configPath, `${JSON.stringify({ ...cfg, anonId }, null, 2)}\n`, { mode: 0o600 })
75
+ } catch {}
76
+ }
77
+
78
+ // Identify the surface + version from our own package.json.
79
+ let pkg = {}
80
+ try {
81
+ pkg = require(path.join(__dirname, '..', 'package.json'))
82
+ } catch {}
83
+ const surface = String(pkg.name || '').includes('mcp') ? 'mcp' : 'cli'
84
+ const host = (process.env.EXTENSHI_POSTHOG_HOST || DEFAULT_HOST).trim()
85
+
86
+ const payload = JSON.stringify({
87
+ api_key: key,
88
+ event: `${surface}_installed`,
89
+ distinct_id: anonId,
90
+ properties: {
91
+ surface,
92
+ version: pkg.version || '0.0.0',
93
+ node: process.version,
94
+ os: process.platform,
95
+ arch: process.arch,
96
+ ci: false,
97
+ source: 'npm_postinstall',
98
+ },
99
+ })
100
+
101
+ const url = new URL('/i/v0/e/', host)
102
+ const req = https.request(
103
+ {
104
+ method: 'POST',
105
+ hostname: url.hostname,
106
+ port: url.port || 443,
107
+ path: url.pathname,
108
+ headers: { 'content-type': 'application/json', 'content-length': Buffer.byteLength(payload) },
109
+ timeout: 2000,
110
+ },
111
+ (res) => {
112
+ res.on('data', () => {})
113
+ res.on('end', done)
114
+ res.on('error', done)
115
+ },
116
+ )
117
+ req.on('error', done)
118
+ req.on('timeout', () => {
119
+ try {
120
+ req.destroy()
121
+ } catch {}
122
+ done()
123
+ })
124
+ req.write(payload)
125
+ req.end()
126
+
127
+ // Backstop: never let the ping hold the install open.
128
+ const guard = setTimeout(done, 2500)
129
+ if (guard.unref) guard.unref()
130
+ } catch {
131
+ done()
132
+ }