@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 +128 -22
- package/dist/index.js.map +1 -1
- package/dist/search-filters.d.ts +37 -0
- package/dist/search-filters.d.ts.map +1 -0
- package/dist/search-filters.js +48 -0
- package/dist/search-filters.js.map +1 -0
- package/dist/shape.d.ts.map +1 -1
- package/dist/shape.js +23 -5
- package/dist/shape.js.map +1 -1
- package/dist/telemetry.d.ts +62 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +259 -0
- package/dist/telemetry.js.map +1 -0
- package/package.json +5 -2
- package/scripts/postinstall.cjs +132 -0
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
|
-
'
|
|
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
|
|
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:
|
|
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
|
|
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"}
|
package/dist/shape.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
-
|
|
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
|
-
|
|
110
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
+
}
|