@extenshi/mcp 0.13.1 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -0
- package/dist/bff.d.ts +32 -0
- package/dist/bff.d.ts.map +1 -1
- package/dist/bff.js +5 -0
- package/dist/bff.js.map +1 -1
- package/dist/development-guide.d.ts +17 -17
- package/dist/development-guide.d.ts.map +1 -1
- package/dist/development-guide.js +6 -1
- package/dist/development-guide.js.map +1 -1
- package/dist/mcp-analytics.d.ts.map +1 -1
- package/dist/mcp-analytics.js +56 -7
- package/dist/mcp-analytics.js.map +1 -1
- package/dist/session-telemetry.d.ts +3 -0
- package/dist/session-telemetry.d.ts.map +1 -0
- package/dist/session-telemetry.js +13 -0
- package/dist/session-telemetry.js.map +1 -0
- package/dist/telemetry.d.ts +3 -1
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +7 -2
- package/dist/telemetry.js.map +1 -1
- package/dist/tools.d.ts +2 -0
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +33 -29
- package/dist/tools.js.map +1 -1
- package/dist/uninstall-form-tools.d.ts +120 -0
- package/dist/uninstall-form-tools.d.ts.map +1 -0
- package/dist/uninstall-form-tools.js +184 -0
- package/dist/uninstall-form-tools.js.map +1 -0
- package/dist/update-check.d.ts +9 -0
- package/dist/update-check.d.ts.map +1 -1
- package/dist/update-check.js +18 -1
- package/dist/update-check.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Uninstall survey tools (plan 2026-10-18 §3).
|
|
3
|
+
*
|
|
4
|
+
* Until these, the survey was editable only in Dojo: an extension renamed after
|
|
5
|
+
* launch kept its old name in the survey headline, the thank-you screens and
|
|
6
|
+
* their translations, and an agent could not fix it. These read, preview and
|
|
7
|
+
* update one survey through the same validation the Dojo editor uses; its
|
|
8
|
+
* translations stay with get/set_page_translations (surface `uninstall`).
|
|
9
|
+
* find_brand_mentions finds the old name across every hosted text first.
|
|
10
|
+
*/
|
|
11
|
+
import { z } from 'zod';
|
|
12
|
+
const READ_ONLY = { readOnlyHint: true, idempotentHint: true, destructiveHint: false, openWorldHint: true };
|
|
13
|
+
const UNINSTALL_REASONS = [
|
|
14
|
+
'too_buggy',
|
|
15
|
+
'found_alternative',
|
|
16
|
+
'not_needed',
|
|
17
|
+
'privacy_concerns',
|
|
18
|
+
'too_expensive',
|
|
19
|
+
'confusing',
|
|
20
|
+
'missing_features',
|
|
21
|
+
'slows_browser',
|
|
22
|
+
];
|
|
23
|
+
const httpUrl = z.string().url().max(500);
|
|
24
|
+
/** Mirrors the BFF's partial patch; the server validates the merged form again. */
|
|
25
|
+
export const uninstallFormPatchSchema = z
|
|
26
|
+
.object({
|
|
27
|
+
name: z.string().min(1).max(80).describe('Dev-facing variant name (not shown on the page).'),
|
|
28
|
+
enabled: z.boolean(),
|
|
29
|
+
accentColor: z.string().regex(/^#[0-9a-fA-F]{3,8}$/),
|
|
30
|
+
theme: z.enum(['light', 'dark']),
|
|
31
|
+
headline: z
|
|
32
|
+
.string()
|
|
33
|
+
.max(120)
|
|
34
|
+
.nullable()
|
|
35
|
+
.describe('Page heading. null = the built-in "Sorry to see you uninstall <title>" in the page language.'),
|
|
36
|
+
thankYouMessage: z.string().max(300).nullable().describe('Shown after an answer. null = built-in text.'),
|
|
37
|
+
reasons: z.array(z.enum(UNINSTALL_REASONS)).min(1).max(UNINSTALL_REASONS.length),
|
|
38
|
+
customReasons: z.array(z.string().min(1).max(60)).max(2).describe('Your own reason chips (max 2).'),
|
|
39
|
+
askComment: z.boolean(),
|
|
40
|
+
askContact: z
|
|
41
|
+
.boolean()
|
|
42
|
+
.describe('Ask for an email address. Turning it on needs confirmPrivacyChange: true.'),
|
|
43
|
+
winbackUrl: httpUrl.nullable().describe('Form-level win-back button link (http/https).'),
|
|
44
|
+
winbackLabel: z.string().max(80).nullable(),
|
|
45
|
+
reasonOutcomes: z
|
|
46
|
+
.array(z.object({
|
|
47
|
+
reason: z.string().min(1).max(80).describe('A reason key, `custom:<label>`, or `other`.'),
|
|
48
|
+
thankYouMessage: z.string().max(300).optional(),
|
|
49
|
+
winbackUrl: httpUrl.optional(),
|
|
50
|
+
winbackLabel: z.string().max(80).optional(),
|
|
51
|
+
}))
|
|
52
|
+
.describe('Per-reason after-submit screen. Replaces the whole list.'),
|
|
53
|
+
reasonFollowups: z
|
|
54
|
+
.array(z.object({
|
|
55
|
+
reason: z.string().min(1).max(80),
|
|
56
|
+
prompt: z.string().min(1).max(200),
|
|
57
|
+
kind: z.enum(['text', 'choice']),
|
|
58
|
+
choices: z.array(z.string().min(1).max(60)).max(8).optional(),
|
|
59
|
+
multiple: z.boolean().optional(),
|
|
60
|
+
}))
|
|
61
|
+
.describe('Per-reason follow-up question. Replaces the whole list.'),
|
|
62
|
+
})
|
|
63
|
+
.partial()
|
|
64
|
+
.strict();
|
|
65
|
+
export function registerUninstallFormTools(add, bff, fail) {
|
|
66
|
+
const ids = {
|
|
67
|
+
projectId: z.string().uuid(),
|
|
68
|
+
formId: z.string().uuid().describe('From list_uninstall_forms.'),
|
|
69
|
+
};
|
|
70
|
+
add({
|
|
71
|
+
name: 'list_uninstall_forms',
|
|
72
|
+
description: "The project's hosted uninstall surveys: {id, name, publicCode, url, enabled, primary, responseCount, " +
|
|
73
|
+
'createdAt, updatedAt}. `primary` is the one generated setUninstallURL code points at; a survey keeps ' +
|
|
74
|
+
'its URL for life. Requires project.read. FREE.',
|
|
75
|
+
parameters: z.object({ projectId: z.string().uuid() }),
|
|
76
|
+
annotations: { title: 'List uninstall surveys', ...READ_ONLY },
|
|
77
|
+
execute: async (args, context) => {
|
|
78
|
+
try {
|
|
79
|
+
return JSON.stringify(await bff(context).listUninstallForms(args));
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
return fail(err);
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
add({
|
|
87
|
+
name: 'get_uninstall_form',
|
|
88
|
+
description: 'One uninstall survey in full: every setting, the per-reason outcomes and follow-up questions, its ' +
|
|
89
|
+
'URL, `updatedAt` (pass it back as expectedUpdatedAt to update_uninstall_form), the page heading and ' +
|
|
90
|
+
'where it comes from (`headline`, or `default` built from `title`, which is the store listing name ' +
|
|
91
|
+
'or the project name), and translation status per project language {translated, missing, outdated}. ' +
|
|
92
|
+
'Requires project.read. FREE.',
|
|
93
|
+
parameters: z.object(ids),
|
|
94
|
+
annotations: { title: 'Read an uninstall survey', ...READ_ONLY },
|
|
95
|
+
execute: async (args, context) => {
|
|
96
|
+
try {
|
|
97
|
+
return JSON.stringify(await bff(context).getUninstallForm(args));
|
|
98
|
+
}
|
|
99
|
+
catch (err) {
|
|
100
|
+
return fail(err);
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
});
|
|
104
|
+
add({
|
|
105
|
+
name: 'update_uninstall_form',
|
|
106
|
+
description: 'Change an uninstall survey. `patch` is partial: absent fields keep their value, null clears an ' +
|
|
107
|
+
'optional text, list fields replace the whole list. The merged survey passes the same validation as ' +
|
|
108
|
+
'the Dojo editor (lengths, http(s) links, outcomes and questions only for reasons the survey offers). ' +
|
|
109
|
+
'dryRun: true returns {changes [{field, before, after}], staleTranslations [{locale, paths}], ' +
|
|
110
|
+
'warnings} and writes nothing. A write needs expectedUpdatedAt (from get_uninstall_form) and an ' +
|
|
111
|
+
'idempotencyKey (UUID): a survey saved since you read it is refused (CONFLICT FORM_CHANGED); a retry ' +
|
|
112
|
+
'with the same key returns the first result (replayed: true). Translations whose original changed ' +
|
|
113
|
+
'are kept and listed as stale: re-translate them with set_page_translations. Turning askContact on ' +
|
|
114
|
+
'needs confirmPrivacyChange: true, since the privacy policy then has to cover email collection. The public ' +
|
|
115
|
+
'URL and the collected responses stay as they are. The change is listed for the owner in Dojo with ' +
|
|
116
|
+
'proposedBy. Requires hosted.write.',
|
|
117
|
+
parameters: z.object({
|
|
118
|
+
...ids,
|
|
119
|
+
patch: uninstallFormPatchSchema,
|
|
120
|
+
expectedUpdatedAt: z.string().datetime().optional().describe('`updatedAt` from get_uninstall_form.'),
|
|
121
|
+
dryRun: z.boolean().optional(),
|
|
122
|
+
idempotencyKey: z.string().uuid().optional().describe('Required for a write; reuse it only to retry.'),
|
|
123
|
+
confirmPrivacyChange: z.boolean().optional(),
|
|
124
|
+
proposedBy: z.string().max(120).optional().describe('Your agent/tool name, shown to the owner.'),
|
|
125
|
+
}),
|
|
126
|
+
annotations: {
|
|
127
|
+
title: 'Update an uninstall survey',
|
|
128
|
+
readOnlyHint: false,
|
|
129
|
+
idempotentHint: true,
|
|
130
|
+
destructiveHint: false,
|
|
131
|
+
openWorldHint: true,
|
|
132
|
+
},
|
|
133
|
+
execute: async (args, context) => {
|
|
134
|
+
try {
|
|
135
|
+
return JSON.stringify(await bff(context).updateUninstallForm(args));
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
return fail(err);
|
|
139
|
+
}
|
|
140
|
+
},
|
|
141
|
+
});
|
|
142
|
+
add({
|
|
143
|
+
name: 'preview_uninstall_form',
|
|
144
|
+
description: 'What the live survey shows in one language, built by the functions the page uses: heading, ' +
|
|
145
|
+
'subheading, the reason chips with their labels and follow-up questions, whether a comment or email ' +
|
|
146
|
+
'is asked, and the after-submit screen per reason (message and win-back button). `locale` is ' +
|
|
147
|
+
'resolved as for a visitor (an unoffered language falls back to the default; the answer says which ' +
|
|
148
|
+
'was used). Also returns previewUrl, which renders the page in a browser without counting an ' +
|
|
149
|
+
'uninstall. Records no visit and no response. Requires project.read. FREE.',
|
|
150
|
+
parameters: z.object({ ...ids, locale: z.string().max(35).optional() }),
|
|
151
|
+
annotations: { title: 'Preview an uninstall survey', ...READ_ONLY },
|
|
152
|
+
execute: async (args, context) => {
|
|
153
|
+
try {
|
|
154
|
+
return JSON.stringify(await bff(context).previewUninstallForm(args));
|
|
155
|
+
}
|
|
156
|
+
catch (err) {
|
|
157
|
+
return fail(err);
|
|
158
|
+
}
|
|
159
|
+
},
|
|
160
|
+
});
|
|
161
|
+
add({
|
|
162
|
+
name: 'find_brand_mentions',
|
|
163
|
+
description: "Find where a name (e.g. the extension's old name) still appears in the project's hosted text: " +
|
|
164
|
+
'uninstall surveys, welcome pages, install instructions, the live homepage, the live privacy policy ' +
|
|
165
|
+
'and its form, and with pay.read also the license terms and Pay offers — each with its translations. ' +
|
|
166
|
+
'Case-insensitive. Each match: {surface, id, publicCode, name, path, locale, term, excerpt, fix}, ' +
|
|
167
|
+
'where `fix` names the tool that changes that field. `skipped` lists surfaces this credential cannot ' +
|
|
168
|
+
'read. Read-only. Requires project.read. FREE.',
|
|
169
|
+
parameters: z.object({
|
|
170
|
+
projectId: z.string().uuid(),
|
|
171
|
+
terms: z.array(z.string().min(2).max(120)).min(1).max(5),
|
|
172
|
+
}),
|
|
173
|
+
annotations: { title: 'Find a name in hosted pages', ...READ_ONLY },
|
|
174
|
+
execute: async (args, context) => {
|
|
175
|
+
try {
|
|
176
|
+
return JSON.stringify(await bff(context).findBrandMentions(args));
|
|
177
|
+
}
|
|
178
|
+
catch (err) {
|
|
179
|
+
return fail(err);
|
|
180
|
+
}
|
|
181
|
+
},
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=uninstall-form-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall-form-tools.js","sourceRoot":"","sources":["../src/uninstall-form-tools.ts"],"names":[],"mappings":"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"}
|
package/dist/update-check.d.ts
CHANGED
|
@@ -23,6 +23,15 @@ export declare function updateCheckOptedOut(env?: NodeJS.ProcessEnv): boolean;
|
|
|
23
23
|
export declare function isNewerVersion(current: string, latest: string): boolean;
|
|
24
24
|
/** Build the stderr hint (exported for testability). */
|
|
25
25
|
export declare function updateMessage(current: string, latest: string): string;
|
|
26
|
+
/** What the last check learned, for connection_diagnostics: stderr never reaches the agent. */
|
|
27
|
+
export interface KnownUpdate {
|
|
28
|
+
version: string;
|
|
29
|
+
latestVersion: string;
|
|
30
|
+
updateAvailable: boolean;
|
|
31
|
+
howToUpdate: string | null;
|
|
32
|
+
}
|
|
33
|
+
/** The result of this process's update check, or null when none finished (opted out, offline, remote). */
|
|
34
|
+
export declare function knownUpdate(): KnownUpdate | null;
|
|
26
35
|
/**
|
|
27
36
|
* Fire-and-forget update check. Never throws; writes at most one line to stderr.
|
|
28
37
|
* `fetchImpl`/`out` are injectable for tests.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-check.d.ts","sourceRoot":"","sources":["../src/update-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH,sEAAsE;AACtE,wBAAgB,mBAAmB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAOjF;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAevE;AAED,wDAAwD;AACxD,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAOrE;AAED;;;GAGG;AACH,wBAAsB,cAAc,CACnC,OAAO,EAAE,MAAM,EACf,SAAS,GAAE,OAAO,KAAa,EAC/B,GAAG,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAqC,GACzD,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"update-check.d.ts","sourceRoot":"","sources":["../src/update-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH,sEAAsE;AACtE,wBAAgB,mBAAmB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAOjF;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAevE;AAED,wDAAwD;AACxD,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAOrE;AAED,+FAA+F;AAC/F,MAAM,WAAW,WAAW;IAC3B,OAAO,EAAE,MAAM,CAAA;IACf,aAAa,EAAE,MAAM,CAAA;IACrB,eAAe,EAAE,OAAO,CAAA;IACxB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1B;AAGD,0GAA0G;AAC1G,wBAAgB,WAAW,IAAI,WAAW,GAAG,IAAI,CAEhD;AAED;;;GAGG;AACH,wBAAsB,cAAc,CACnC,OAAO,EAAE,MAAM,EACf,SAAS,GAAE,OAAO,KAAa,EAC/B,GAAG,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAqC,GACzD,OAAO,CAAC,IAAI,CAAC,CAgCf"}
|
package/dist/update-check.js
CHANGED
|
@@ -51,6 +51,11 @@ export function updateMessage(current, latest) {
|
|
|
51
51
|
'For a pinned global install: `npm i -g @extenshi/mcp@latest`, then restart. ' +
|
|
52
52
|
'(Silence this with EXTENSHI_NO_UPDATE_CHECK=1.)\n');
|
|
53
53
|
}
|
|
54
|
+
let known = null;
|
|
55
|
+
/** The result of this process's update check, or null when none finished (opted out, offline, remote). */
|
|
56
|
+
export function knownUpdate() {
|
|
57
|
+
return known;
|
|
58
|
+
}
|
|
54
59
|
/**
|
|
55
60
|
* Fire-and-forget update check. Never throws; writes at most one line to stderr.
|
|
56
61
|
* `fetchImpl`/`out` are injectable for tests.
|
|
@@ -75,7 +80,19 @@ export async function checkForUpdate(current, fetchImpl = fetch, out = (m) => pr
|
|
|
75
80
|
return;
|
|
76
81
|
const json = (await res.json());
|
|
77
82
|
const latest = typeof json.version === 'string' ? json.version : undefined;
|
|
78
|
-
if (latest
|
|
83
|
+
if (!latest)
|
|
84
|
+
return;
|
|
85
|
+
const updateAvailable = isNewerVersion(current, latest);
|
|
86
|
+
known = {
|
|
87
|
+
version: current,
|
|
88
|
+
latestVersion: latest,
|
|
89
|
+
updateAvailable,
|
|
90
|
+
// A client with a cached npx copy keeps an older tool list until it fetches @latest.
|
|
91
|
+
howToUpdate: updateAvailable
|
|
92
|
+
? 'Restart the client with `npx -y @extenshi/mcp@latest` (or `npm i -g @extenshi/mcp@latest`).'
|
|
93
|
+
: null,
|
|
94
|
+
};
|
|
95
|
+
if (updateAvailable)
|
|
79
96
|
out(updateMessage(current, latest));
|
|
80
97
|
}
|
|
81
98
|
catch {
|
package/dist/update-check.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-check.js","sourceRoot":"","sources":["../src/update-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,YAAY,GAAG,iDAAiD,CAAA;AACtE,MAAM,UAAU,GAAG,IAAI,CAAA;AAEvB,sEAAsE;AACtE,MAAM,UAAU,mBAAmB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACvE,OAAO,CACN,GAAG,CAAC,wBAAwB,KAAK,GAAG;QACpC,GAAG,CAAC,YAAY,KAAK,GAAG;QACxB,GAAG,CAAC,kBAAkB,KAAK,GAAG;QAC9B,GAAG,CAAC,EAAE,KAAK,MAAM,CACjB,CAAA;AACF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,MAAc;IAC7D,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAC3B,CAAC;SACC,KAAK,CAAC,GAAG,CAAC;SACV,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;IACrC,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAA;IACxB,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAA;IACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAC1C,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAC1C,IAAI,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAA;QACtB,IAAI,CAAC,GAAG,CAAC;YAAE,OAAO,KAAK,CAAA;IACxB,CAAC;IACD,OAAO,KAAK,CAAA;AACb,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,MAAc;IAC5D,OAAO,CACN,gDAAgD,OAAO,MAAM,MAAM,IAAI;QACvE,sEAAsE;QACtE,8EAA8E;QAC9E,mDAAmD,CACnD,CAAA;AACF,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CACnC,OAAe,EACf,YAA0B,KAAK,EAC/B,MAA6B,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAE3D,IAAI,mBAAmB,EAAE;QAAE,OAAM;IACjC,IAAI,CAAC;QACJ,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;QACxC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,UAAU,CAAC,CAAA;QAC9D,IAAI,GAAa,CAAA;QACjB,IAAI,CAAC;YACJ,GAAG,GAAG,MAAM,SAAS,CAAC,YAAY,EAAE;gBACnC,MAAM,EAAE,UAAU,CAAC,MAAM;gBACzB,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;aACvC,CAAC,CAAA;QACH,CAAC;gBAAS,CAAC;YACV,YAAY,CAAC,KAAK,CAAC,CAAA;QACpB,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAM;QACnB,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA0B,CAAA;QACxD,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAA;QAC1E,IAAI,MAAM,
|
|
1
|
+
{"version":3,"file":"update-check.js","sourceRoot":"","sources":["../src/update-check.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED