lurqrun 0.1.7 → 0.1.8
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 +312 -148
- package/dist/{auditHandler-JCOJSUYW.js → auditHandler-VWCXSDVO.js} +12 -11
- package/dist/autopilotInit-Q62MX5M6.js +178 -0
- package/dist/bin/lurq.js +235 -83
- package/dist/{browserAuth-B6G27USY.js → browserAuth-J7APSD4P.js} +4 -3
- package/dist/{cache-DKI34SVS.js → cache-AEAKCV4I.js} +2 -2
- package/dist/check-2JTQDQA6.js +2613 -0
- package/dist/{check-2FDGUOV7.js → check-PQSQ2MMA.js} +1 -1
- package/dist/checkUpgrade-5YW77OBL.js +24 -0
- package/dist/{chunk-BCANRN5B.js → chunk-2GAYNIHG.js} +8 -1
- package/dist/{chunk-EA3DP5HG.js → chunk-2O6Z37IT.js} +155 -25
- package/dist/{chunk-J5FZYN4A.js → chunk-2WD4QAH4.js} +1 -1
- package/dist/{chunk-CUP36ND3.js → chunk-3676XOBU.js} +145 -36
- package/dist/chunk-3D2MPGOQ.js +181 -0
- package/dist/{chunk-LYMPYETA.js → chunk-4JHDSVIN.js} +270 -6
- package/dist/chunk-53SG6XWA.js +141 -0
- package/dist/chunk-5ABNDB3I.js +37 -0
- package/dist/chunk-5ALIJFDA.js +114 -0
- package/dist/{chunk-BULZAX2U.js → chunk-64ZF7KO4.js} +55 -38
- package/dist/{chunk-2VMOWSRY.js → chunk-6DM6UQFD.js} +19 -1
- package/dist/{chunk-HWBBVLOT.js → chunk-6L67QMCP.js} +1 -1
- package/dist/{chunk-GPTKSNR6.js → chunk-72Y2FDVS.js} +2 -1
- package/dist/{chunk-B43LCXBM.js → chunk-A3TYI2TF.js} +81 -16
- package/dist/{chunk-IQ4SDKKY.js → chunk-B2UUYRBX.js} +31 -228
- package/dist/{chunk-DB2VF5UD.js → chunk-BJT2LHAR.js} +16 -11
- package/dist/chunk-BM3LF5T6.js +132 -0
- package/dist/{chunk-3N3Q3DSW.js → chunk-BN3NM47Q.js} +8 -8
- package/dist/chunk-D3K6IZVR.js +12845 -0
- package/dist/{chunk-AHBP533R.js → chunk-D3VTZS7V.js} +7 -5
- package/dist/{chunk-UDVNA7EA.js → chunk-DM37MTOO.js} +161 -8
- package/dist/chunk-DONTW3NE.js +171 -0
- package/dist/{chunk-M6NYEXCW.js → chunk-DSROTZ3Z.js} +1 -1
- package/dist/{chunk-4F7ZESPO.js → chunk-EQCXENKZ.js} +3 -5
- package/dist/{chunk-CW5HJ3LX.js → chunk-EYAKM6YN.js} +1 -1
- package/dist/{chunk-VL2E5T2A.js → chunk-FDFPMBCA.js} +6 -3
- package/dist/{chunk-BV32UNLL.js → chunk-FVYFV5HA.js} +2 -2
- package/dist/{chunk-DWAGCNEL.js → chunk-GM5Y555O.js} +36 -103
- package/dist/{chunk-PSX3GIAN.js → chunk-HWFX4BC4.js} +2 -1
- package/dist/chunk-IFNONGRQ.js +603 -0
- package/dist/chunk-J3U2CPSK.js +136 -0
- package/dist/{chunk-Y5GI7RL3.js → chunk-J6XQ7OPZ.js} +9 -1
- package/dist/{chunk-LBFGSSF2.js → chunk-KMV4Y6R3.js} +2 -1
- package/dist/{chunk-L6N4JFW2.js → chunk-KP5ZDDPE.js} +81 -4
- package/dist/{chunk-SJOVFF7B.js → chunk-KYKSZ3XZ.js} +3 -2
- package/dist/chunk-NEZNAPPN.js +41 -0
- package/dist/{chunk-NH5I4KHH.js → chunk-NPVN2THM.js} +1 -5
- package/dist/{chunk-6L3U7DZ5.js → chunk-NYZU5NCW.js} +1 -1
- package/dist/chunk-O4KHCV6I.js +320 -0
- package/dist/{chunk-LO35HLQZ.js → chunk-ONDVTXUO.js} +25 -4
- package/dist/{chunk-4ZYCIMY4.js → chunk-OTJFHESY.js} +25 -4
- package/dist/chunk-P6MIKSPY.js +243 -0
- package/dist/{checkUpgrade-F2WESBPM.js → chunk-QCRBX3LV.js} +72 -10
- package/dist/{chunk-LRD4GBYE.js → chunk-QUIMQ7YL.js} +1 -1
- package/dist/chunk-RG3YLU6E.js +49 -0
- package/dist/{chunk-ST2X2GYN.js → chunk-SHZFOSXC.js} +109 -20
- package/dist/{chunk-CIDWNUAP.js → chunk-SOXFMMXC.js} +8 -2
- package/dist/chunk-TDTYV6QI.js +119 -0
- package/dist/{chunk-FW6BD2NO.js → chunk-TUXQ32WE.js} +457 -121
- package/dist/{chunk-WQ23REYT.js → chunk-VGCDRK3S.js} +1 -1
- package/dist/{chunk-U5AT3TD4.js → chunk-X4W64MHU.js} +1735 -1858
- package/dist/chunk-XBQA4I36.js +92 -0
- package/dist/chunk-XGOV6KV4.js +413 -0
- package/dist/{chunk-OQS4GUSI.js → chunk-XIFQIFSZ.js} +210 -661
- package/dist/{chunk-XBIDMHSK.js → chunk-XLXPVN3Y.js} +2 -34
- package/dist/chunk-ZJMLQ37G.js +90 -0
- package/dist/{client-IRKAMDYZ.js → client-MU4EUDZV.js} +3 -3
- package/dist/{commands-FIL5ET6P.js → commands-UOOTMBKA.js} +145 -33
- package/dist/{compat-R3UTFQ5Q.js → compat-Q5DVPITN.js} +6 -6
- package/dist/constants-DJFOFZ44.js +24 -0
- package/dist/{dashboardIssue-WYYMBFIB.js → dashboardIssue-KBKLQMGC.js} +105 -23
- package/dist/{diff-GZA2774U.js → diff-I4SNUHU3.js} +1 -1
- package/dist/domains-VRT4BRVZ.js +14 -0
- package/dist/env-UN6KGZ7S.js +15 -0
- package/dist/envCheck-KUPTORFQ.js +71 -0
- package/dist/{extract-NKGKLIVT.js → extract-6WG265BL.js} +14 -3
- package/dist/{fetch-QYTUJVG2.js → fetch-PJ3SC32M.js} +4 -4
- package/dist/{firstTouch-QQTJH4QX.js → firstTouch-COJCMOB3.js} +1 -1
- package/dist/fix-3EDWNKW3.js +220 -0
- package/dist/{handlers-GEJAVZDK.js → handlers-4Q37WIFT.js} +19 -17
- package/dist/hook-NA66XJLC.js +412 -0
- package/dist/{http-ETPYMBGD.js → http-25GJ6SKK.js} +2078 -510
- package/dist/{ingestQueue-VKN4KBIF.js → ingestQueue-FSVJC3AA.js} +14 -12
- package/dist/{install-EK3W2COX.js → install-G2HHXYJ2.js} +6 -6
- package/dist/{installSkill-VQJWJVCL.js → installSkill-5TIMYIJZ.js} +21 -3
- package/dist/manifest-ENMIC54B.js +13 -0
- package/dist/{mcp-3JHD5SUZ.js → mcp-PENLL2PK.js} +60 -32
- package/dist/mcpConfig-3LYPRY5Q.js +80 -0
- package/dist/{mcpHandlers-QFN4MCFL.js → mcpHandlers-PO7GENA7.js} +7 -7
- package/dist/{mcpScan-QZHWENIP.js → mcpScan-ULP626TQ.js} +306 -442
- package/dist/{mcpScanWorkflow-JPYCBGC4.js → mcpScanWorkflow-27O44FOE.js} +29 -12
- package/dist/{mcpStack-BYJCZNIV.js → mcpStack-ZNYIFXZ5.js} +1 -1
- package/dist/model-ASMZWLM7.js +214 -0
- package/dist/{packages-THVFMWFP.js → packages-RWF2LXST.js} +3 -5
- package/dist/{plan-V4OEI3J4.js → plan-SDILIDZT.js} +23 -21
- package/dist/{planView-JRXGCG2N.js → planView-ZAKRTGVS.js} +4 -1
- package/dist/{policy-3P6BGRDN.js → policy-JAGNMQJI.js} +5 -5
- package/dist/probe-3IK646WN.js +610 -0
- package/dist/publicUpgrades-WTBGLDIK.js +42 -0
- package/dist/{references-6N7VEPHT.js → references-I6Y4BSRR.js} +3 -1
- package/dist/{release-4U4ABNSJ.js → release-7IU2R4YG.js} +5 -5
- package/dist/{remote-YGCXYI4V.js → remote-FN6225AH.js} +13 -3
- package/dist/rename-OS6JYBZQ.js +204 -0
- package/dist/{reportRuns-CKQQYLY4.js → reportRuns-O4X7ZFTX.js} +15 -2
- package/dist/safeFetch-COERXGFN.js +19 -0
- package/dist/{sandbox-MEZLAODF.js → sandbox-SAPSRKEI.js} +4 -4
- package/dist/sarif-WLVJFJ7U.js +125 -0
- package/dist/server-OLTY3NYT.js +59 -0
- package/dist/{surface-V62GE554.js → surface-7MHE3RL7.js} +18 -16
- package/dist/{surface-YL6O67W3.js → surface-JS2XU3U3.js} +5 -3
- package/dist/{surfaceHandlers-X2IZKA3E.js → surfaceHandlers-4B6TMZ34.js} +5 -5
- package/dist/{typecheck-X7U5ELMR.js → typecheck-NGOKNAJY.js} +23 -9
- package/dist/{uninstall-P7RGBX6G.js → uninstall-I2IJP5JZ.js} +30 -4
- package/dist/{upgrade-NQ5IWFZB.js → upgrade-FS26DJGG.js} +86 -32
- package/dist/{upgradePlan-A4LRKLEG.js → upgradePlan-ZS5IOVMZ.js} +46 -11
- package/dist/upkeepHandler-VFGYXJKB.js +13 -0
- package/dist/{userConfig-Z3GQE776.js → userConfig-ICASHI47.js} +1 -1
- package/dist/{watch-DGFMWUDL.js → watch-OCNEUXG6.js} +24 -34
- package/package.json +3 -2
- package/templates/skill-instructions.md +22 -3
- package/dist/chunk-6AAEVQ7I.js +0 -6336
- package/dist/chunk-I2JUKN6Z.js +0 -24
- package/dist/server-KFUD5X57.js +0 -55
|
@@ -0,0 +1,610 @@
|
|
|
1
|
+
import { createRequire as __lurqCreateRequire } from 'node:module'; const require = __lurqCreateRequire(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
Client,
|
|
4
|
+
LIMITS,
|
|
5
|
+
addTools,
|
|
6
|
+
emptySnapshot
|
|
7
|
+
} from "./chunk-XIFQIFSZ.js";
|
|
8
|
+
import "./chunk-XLXPVN3Y.js";
|
|
9
|
+
import {
|
|
10
|
+
UnsafeUrlError
|
|
11
|
+
} from "./chunk-J3U2CPSK.js";
|
|
12
|
+
import "./chunk-3D2MPGOQ.js";
|
|
13
|
+
import {
|
|
14
|
+
endpointIdentity
|
|
15
|
+
} from "./chunk-5ABNDB3I.js";
|
|
16
|
+
import {
|
|
17
|
+
SSEClientTransport,
|
|
18
|
+
StreamableHTTPClientTransport
|
|
19
|
+
} from "./chunk-X4W64MHU.js";
|
|
20
|
+
import {
|
|
21
|
+
external_exports
|
|
22
|
+
} from "./chunk-D3K6IZVR.js";
|
|
23
|
+
import "./chunk-6EQ3ARXA.js";
|
|
24
|
+
import "./chunk-SHCEBP3J.js";
|
|
25
|
+
import "./chunk-WHX2ZFCG.js";
|
|
26
|
+
import {
|
|
27
|
+
VERSION
|
|
28
|
+
} from "./chunk-72Y2FDVS.js";
|
|
29
|
+
import {
|
|
30
|
+
init_esm_shims
|
|
31
|
+
} from "./chunk-I3M2KJXB.js";
|
|
32
|
+
|
|
33
|
+
// src/remoteProbe/probe.ts
|
|
34
|
+
init_esm_shims();
|
|
35
|
+
|
|
36
|
+
// node_modules/zod/v4/classic/index.js
|
|
37
|
+
init_esm_shims();
|
|
38
|
+
|
|
39
|
+
// src/remoteProbe/oauth.ts
|
|
40
|
+
init_esm_shims();
|
|
41
|
+
var MAX_DOC_BYTES = 256e3;
|
|
42
|
+
function parseWwwAuthenticate(header) {
|
|
43
|
+
if (!header) return null;
|
|
44
|
+
const m = /^\s*([A-Za-z0-9!#$%&'*+.^_`|~-]+)\s*(.*)$/s.exec(header);
|
|
45
|
+
if (!m) return null;
|
|
46
|
+
const params = {};
|
|
47
|
+
const re = /([A-Za-z0-9!#$%&'*+.^_`|~-]+)\s*=\s*(?:"((?:[^"\\]|\\.)*)"|([^\s,]+))\s*,?/g;
|
|
48
|
+
let p;
|
|
49
|
+
while ((p = re.exec(m[2] ?? "")) !== null) {
|
|
50
|
+
const key = p[1].toLowerCase();
|
|
51
|
+
if (!(key in params)) params[key] = p[2] !== void 0 ? p[2].replace(/\\(.)/g, "$1") : p[3];
|
|
52
|
+
}
|
|
53
|
+
return { scheme: m[1].toLowerCase(), params };
|
|
54
|
+
}
|
|
55
|
+
async function readJson(fetch, url, signal) {
|
|
56
|
+
try {
|
|
57
|
+
const res = await fetch(url, { headers: { accept: "application/json" }, signal });
|
|
58
|
+
if (res.status !== 200) {
|
|
59
|
+
await res.body?.cancel().catch(() => {
|
|
60
|
+
});
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
const text = await res.text();
|
|
64
|
+
if (text.length > MAX_DOC_BYTES) return null;
|
|
65
|
+
const body = JSON.parse(text);
|
|
66
|
+
return body && typeof body === "object" && !Array.isArray(body) ? body : null;
|
|
67
|
+
} catch {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
var strings = (v) => Array.isArray(v) ? v.filter((x) => typeof x === "string" && x.length > 0) : null;
|
|
72
|
+
function resourceMetadataCandidates(endpoint, headerValue) {
|
|
73
|
+
const out = [];
|
|
74
|
+
if (headerValue) {
|
|
75
|
+
try {
|
|
76
|
+
out.push({ url: new URL(headerValue, endpoint).toString(), via: "www_authenticate" });
|
|
77
|
+
} catch {
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
const path = endpoint.pathname.replace(/\/+$/, "");
|
|
81
|
+
if (path)
|
|
82
|
+
out.push({
|
|
83
|
+
url: `${endpoint.origin}/.well-known/oauth-protected-resource${path}`,
|
|
84
|
+
via: "well_known_path"
|
|
85
|
+
});
|
|
86
|
+
out.push({
|
|
87
|
+
url: `${endpoint.origin}/.well-known/oauth-protected-resource`,
|
|
88
|
+
via: "well_known_root"
|
|
89
|
+
});
|
|
90
|
+
return out;
|
|
91
|
+
}
|
|
92
|
+
function authServerMetadataCandidates(issuer) {
|
|
93
|
+
let u;
|
|
94
|
+
try {
|
|
95
|
+
u = new URL(issuer);
|
|
96
|
+
} catch {
|
|
97
|
+
return [];
|
|
98
|
+
}
|
|
99
|
+
const path = u.pathname.replace(/\/+$/, "");
|
|
100
|
+
if (!path) {
|
|
101
|
+
return [
|
|
102
|
+
`${u.origin}/.well-known/oauth-authorization-server`,
|
|
103
|
+
`${u.origin}/.well-known/openid-configuration`
|
|
104
|
+
];
|
|
105
|
+
}
|
|
106
|
+
return [
|
|
107
|
+
`${u.origin}/.well-known/oauth-authorization-server${path}`,
|
|
108
|
+
`${u.origin}/.well-known/openid-configuration${path}`,
|
|
109
|
+
`${u.origin}${path}/.well-known/openid-configuration`
|
|
110
|
+
];
|
|
111
|
+
}
|
|
112
|
+
function resourceCovers(resource, endpoint) {
|
|
113
|
+
try {
|
|
114
|
+
const r = new URL(resource);
|
|
115
|
+
if (r.origin.toLowerCase() !== endpoint.origin.toLowerCase()) return false;
|
|
116
|
+
const rp = r.pathname.replace(/\/+$/, "");
|
|
117
|
+
const ep = endpoint.pathname.replace(/\/+$/, "");
|
|
118
|
+
return rp === "" || ep === rp || ep.startsWith(`${rp}/`);
|
|
119
|
+
} catch {
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
async function discoverOAuth(fetch, endpoint, challenge, signal) {
|
|
124
|
+
const violations = [];
|
|
125
|
+
const headerValue = challenge?.params.resource_metadata ?? null;
|
|
126
|
+
if (headerValue && !/^https?:\/\//i.test(headerValue)) {
|
|
127
|
+
violations.push({
|
|
128
|
+
code: "resource_metadata_not_absolute",
|
|
129
|
+
detail: `WWW-Authenticate resource_metadata is "${headerValue.slice(0, 200)}", not an absolute URL; clients that do not resolve it cannot find the authorization server`
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
let prm = null;
|
|
133
|
+
let found = null;
|
|
134
|
+
let sawInvalid = false;
|
|
135
|
+
for (const c of resourceMetadataCandidates(endpoint, headerValue)) {
|
|
136
|
+
const doc = await readJson(fetch, c.url, signal);
|
|
137
|
+
if (!doc) continue;
|
|
138
|
+
if (!strings(doc.authorization_servers)?.length) {
|
|
139
|
+
sawInvalid = true;
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
prm = doc;
|
|
143
|
+
found = c;
|
|
144
|
+
break;
|
|
145
|
+
}
|
|
146
|
+
if (!prm || !found) {
|
|
147
|
+
if (sawInvalid) {
|
|
148
|
+
violations.push({
|
|
149
|
+
code: "resource_metadata_invalid",
|
|
150
|
+
detail: "protected resource metadata lists no authorization_servers"
|
|
151
|
+
});
|
|
152
|
+
} else if (headerValue) {
|
|
153
|
+
violations.push({
|
|
154
|
+
code: "resource_metadata_unreachable",
|
|
155
|
+
detail: "the resource_metadata URL in WWW-Authenticate did not return a metadata document"
|
|
156
|
+
});
|
|
157
|
+
} else {
|
|
158
|
+
violations.push({
|
|
159
|
+
code: "challenge_without_resource_metadata",
|
|
160
|
+
detail: "refused without credentials but publishes no OAuth protected resource metadata; a key or token must be configured by hand"
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
return { oauth: null, violations };
|
|
164
|
+
}
|
|
165
|
+
const authorizationServers = strings(prm.authorization_servers);
|
|
166
|
+
const resource = typeof prm.resource === "string" ? prm.resource : null;
|
|
167
|
+
if (prm.resource !== void 0 && resource === null) {
|
|
168
|
+
violations.push({
|
|
169
|
+
code: "resource_metadata_invalid",
|
|
170
|
+
detail: "`resource` in protected resource metadata is not a string"
|
|
171
|
+
});
|
|
172
|
+
} else if (resource && !resourceCovers(resource, endpoint)) {
|
|
173
|
+
violations.push({
|
|
174
|
+
code: "resource_mismatch",
|
|
175
|
+
detail: `protected resource metadata names resource ${resource.slice(0, 200)}, which does not cover ${endpoint.toString()}; clients that validate it refuse the token`
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
const profile = {
|
|
179
|
+
resourceMetadataUrl: found.url,
|
|
180
|
+
resourceMetadataVia: found.via,
|
|
181
|
+
resource,
|
|
182
|
+
authorizationServers,
|
|
183
|
+
scopesSupported: strings(prm.scopes_supported),
|
|
184
|
+
challengeScope: challenge?.params.scope ?? null,
|
|
185
|
+
issuer: null,
|
|
186
|
+
asMetadataUrl: null,
|
|
187
|
+
cimd: false,
|
|
188
|
+
dcr: false,
|
|
189
|
+
pkceS256: false,
|
|
190
|
+
issParameter: null
|
|
191
|
+
};
|
|
192
|
+
const issuer = authorizationServers[0];
|
|
193
|
+
for (const candidate of authServerMetadataCandidates(issuer)) {
|
|
194
|
+
const asm = await readJson(fetch, candidate, signal);
|
|
195
|
+
if (!asm || typeof asm.issuer !== "string") continue;
|
|
196
|
+
profile.issuer = asm.issuer;
|
|
197
|
+
profile.asMetadataUrl = candidate;
|
|
198
|
+
profile.cimd = asm.client_id_metadata_document_supported === true;
|
|
199
|
+
profile.dcr = typeof asm.registration_endpoint === "string" && asm.registration_endpoint.length > 0;
|
|
200
|
+
profile.pkceS256 = strings(asm.code_challenge_methods_supported)?.includes("S256") ?? false;
|
|
201
|
+
profile.issParameter = typeof asm.authorization_response_iss_parameter_supported === "boolean" ? asm.authorization_response_iss_parameter_supported : null;
|
|
202
|
+
if (asm.issuer !== issuer) {
|
|
203
|
+
violations.push({
|
|
204
|
+
code: "issuer_mismatch",
|
|
205
|
+
detail: asm.issuer.replace(/\/+$/, "") === issuer.replace(/\/+$/, "") ? `authorization server metadata issuer "${asm.issuer}" differs from "${issuer}" only by a trailing slash; the spec requires an identical string, so strict clients reject it` : `authorization server metadata issuer "${asm.issuer.slice(0, 200)}" does not match "${issuer.slice(0, 200)}"; clients must not use it`
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
if (!profile.pkceS256) {
|
|
209
|
+
violations.push({
|
|
210
|
+
code: "pkce_s256_not_advertised",
|
|
211
|
+
detail: "code_challenge_methods_supported does not include S256; compliant clients refuse to proceed"
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
if (!profile.cimd && !profile.dcr) {
|
|
215
|
+
violations.push({
|
|
216
|
+
code: "no_client_registration",
|
|
217
|
+
detail: "neither Client ID Metadata Documents nor Dynamic Client Registration is offered; only clients where the user can enter a pre-registered client id can sign in"
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
return { oauth: profile, violations };
|
|
221
|
+
}
|
|
222
|
+
violations.push({
|
|
223
|
+
code: "as_metadata_unreachable",
|
|
224
|
+
detail: `no authorization server metadata found for ${issuer.slice(0, 200)}`
|
|
225
|
+
});
|
|
226
|
+
return { oauth: profile, violations };
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// src/remoteProbe/probe.ts
|
|
230
|
+
var PROBE_PROTOCOL_VERSION = "2026-07-28";
|
|
231
|
+
var CLIENT_INFO = { name: "lurq-probe", version: VERSION };
|
|
232
|
+
var PROBE_DEFAULTS = {
|
|
233
|
+
/** Whole probe, discovery included. */
|
|
234
|
+
budgetMs: 25e3,
|
|
235
|
+
requestTimeoutMs: 1e4,
|
|
236
|
+
/** Tool pages read at most; the snapshot's own caps still apply. */
|
|
237
|
+
maxPages: 20
|
|
238
|
+
};
|
|
239
|
+
var HttpStatusError = class extends Error {
|
|
240
|
+
constructor(status, wwwAuthenticate) {
|
|
241
|
+
super(`HTTP ${status}`);
|
|
242
|
+
this.status = status;
|
|
243
|
+
this.wwwAuthenticate = wwwAuthenticate;
|
|
244
|
+
}
|
|
245
|
+
status;
|
|
246
|
+
wwwAuthenticate;
|
|
247
|
+
};
|
|
248
|
+
function blankAuth(declared) {
|
|
249
|
+
return { mode: "unknown", challengeStatus: null, oauth: null, declaredHeaders: declared };
|
|
250
|
+
}
|
|
251
|
+
function base(url, declared) {
|
|
252
|
+
return {
|
|
253
|
+
url,
|
|
254
|
+
status: "unreachable",
|
|
255
|
+
httpStatus: null,
|
|
256
|
+
transport: null,
|
|
257
|
+
protocolMode: null,
|
|
258
|
+
protocolVersion: null,
|
|
259
|
+
serverName: null,
|
|
260
|
+
serverVersion: null,
|
|
261
|
+
auth: blankAuth(declared),
|
|
262
|
+
violations: [],
|
|
263
|
+
snapshot: null,
|
|
264
|
+
error: null,
|
|
265
|
+
latencyMs: null,
|
|
266
|
+
finalUrl: null
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
function classifyNetworkError(err) {
|
|
270
|
+
if (err instanceof UnsafeUrlError) return { status: "blocked", error: err.message };
|
|
271
|
+
const e = err;
|
|
272
|
+
const code = e?.code ?? e?.cause?.code ?? "";
|
|
273
|
+
const name = e?.name ?? e?.cause?.name ?? "";
|
|
274
|
+
if (code === "EPRIVATE")
|
|
275
|
+
return { status: "blocked", error: "the hostname resolves to a private network address" };
|
|
276
|
+
if (code === "ENOTFOUND" || code === "EAI_AGAIN")
|
|
277
|
+
return { status: "dns_failed", error: "the hostname does not resolve" };
|
|
278
|
+
if (name === "AbortError" || name === "TimeoutError" || code === "UND_ERR_HEADERS_TIMEOUT" || code === "UND_ERR_BODY_TIMEOUT" || code === "ETIMEDOUT") {
|
|
279
|
+
return { status: "timeout", error: "no response within the time limit" };
|
|
280
|
+
}
|
|
281
|
+
if (code === "ETOOLARGE")
|
|
282
|
+
return { status: "protocol_error", error: "the response was larger than lurq reads" };
|
|
283
|
+
if (/CERT|SSL|TLS|ERR_TLS/i.test(code))
|
|
284
|
+
return { status: "unreachable", error: `TLS failure (${code})` };
|
|
285
|
+
return {
|
|
286
|
+
status: "unreachable",
|
|
287
|
+
error: code ? `connection failed (${code})` : "connection failed"
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
function statusForHttp(status) {
|
|
291
|
+
if (status === 401 || status === 403) return "auth_required";
|
|
292
|
+
if (status === 404 || status === 410) return "not_found";
|
|
293
|
+
if (status >= 500) return "server_error";
|
|
294
|
+
return "protocol_error";
|
|
295
|
+
}
|
|
296
|
+
async function readRpc(res, id) {
|
|
297
|
+
const type = res.headers.get("content-type") ?? "";
|
|
298
|
+
const text = await res.text();
|
|
299
|
+
if (type.includes("text/event-stream")) {
|
|
300
|
+
for (const block of text.split(/\r?\n\r?\n/)) {
|
|
301
|
+
const data = block.split(/\r?\n/).filter((l) => l.startsWith("data:")).map((l) => l.slice(5).trimStart()).join("\n");
|
|
302
|
+
if (!data) continue;
|
|
303
|
+
try {
|
|
304
|
+
const msg = JSON.parse(data);
|
|
305
|
+
if (msg.id === id) return msg;
|
|
306
|
+
} catch {
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
return null;
|
|
310
|
+
}
|
|
311
|
+
try {
|
|
312
|
+
const msg = JSON.parse(text);
|
|
313
|
+
return msg && typeof msg === "object" && !Array.isArray(msg) ? msg : null;
|
|
314
|
+
} catch {
|
|
315
|
+
return null;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
var meta = () => ({
|
|
319
|
+
"io.modelcontextprotocol/protocolVersion": PROBE_PROTOCOL_VERSION,
|
|
320
|
+
"io.modelcontextprotocol/clientInfo": CLIENT_INFO,
|
|
321
|
+
"io.modelcontextprotocol/clientCapabilities": {}
|
|
322
|
+
});
|
|
323
|
+
async function statelessToolsList(fetch, url, opts, onFirst) {
|
|
324
|
+
const pages = [];
|
|
325
|
+
let cursor;
|
|
326
|
+
let info = {
|
|
327
|
+
serverName: null,
|
|
328
|
+
serverVersion: null
|
|
329
|
+
};
|
|
330
|
+
for (let page = 0; page < opts.maxPages; page++) {
|
|
331
|
+
const id = page + 1;
|
|
332
|
+
const res = await fetch(url, {
|
|
333
|
+
method: "POST",
|
|
334
|
+
signal: opts.signal,
|
|
335
|
+
headers: {
|
|
336
|
+
"content-type": "application/json",
|
|
337
|
+
accept: "application/json, text/event-stream",
|
|
338
|
+
"mcp-method": "tools/list",
|
|
339
|
+
"mcp-protocol-version": PROBE_PROTOCOL_VERSION
|
|
340
|
+
},
|
|
341
|
+
body: JSON.stringify({
|
|
342
|
+
jsonrpc: "2.0",
|
|
343
|
+
id,
|
|
344
|
+
method: "tools/list",
|
|
345
|
+
params: { ...cursor ? { cursor } : {}, _meta: meta() }
|
|
346
|
+
})
|
|
347
|
+
});
|
|
348
|
+
if (page === 0) onFirst(res);
|
|
349
|
+
if (res.status === 401 || res.status === 403) {
|
|
350
|
+
await res.body?.cancel().catch(() => {
|
|
351
|
+
});
|
|
352
|
+
throw new HttpStatusError(res.status, res.headers.get("www-authenticate"));
|
|
353
|
+
}
|
|
354
|
+
if (res.status !== 200) {
|
|
355
|
+
await res.body?.cancel().catch(() => {
|
|
356
|
+
});
|
|
357
|
+
if (page === 0 && [400, 404, 405, 406, 415].includes(res.status)) return null;
|
|
358
|
+
throw new HttpStatusError(res.status, null);
|
|
359
|
+
}
|
|
360
|
+
const msg = await readRpc(res, id);
|
|
361
|
+
const result = msg?.result;
|
|
362
|
+
if (!result || !Array.isArray(result.tools)) {
|
|
363
|
+
if (page === 0) return null;
|
|
364
|
+
break;
|
|
365
|
+
}
|
|
366
|
+
pages.push(result.tools);
|
|
367
|
+
const serverInfo = result._meta?.["io.modelcontextprotocol/serverInfo"];
|
|
368
|
+
if (page === 0 && serverInfo) {
|
|
369
|
+
info = {
|
|
370
|
+
serverName: typeof serverInfo.name === "string" ? serverInfo.name : null,
|
|
371
|
+
serverVersion: typeof serverInfo.version === "string" ? serverInfo.version : null
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
cursor = typeof result.nextCursor === "string" && result.nextCursor ? result.nextCursor : void 0;
|
|
375
|
+
if (!cursor)
|
|
376
|
+
return { tools: pages, truncated: false, ...info, protocolVersion: PROBE_PROTOCOL_VERSION };
|
|
377
|
+
}
|
|
378
|
+
return {
|
|
379
|
+
tools: pages,
|
|
380
|
+
truncated: Boolean(cursor),
|
|
381
|
+
...info,
|
|
382
|
+
protocolVersion: PROBE_PROTOCOL_VERSION
|
|
383
|
+
};
|
|
384
|
+
}
|
|
385
|
+
var ToolsPage = external_exports.looseObject({
|
|
386
|
+
tools: external_exports.array(external_exports.unknown()).optional(),
|
|
387
|
+
nextCursor: external_exports.string().optional()
|
|
388
|
+
});
|
|
389
|
+
async function handshakeToolsList(fetch, url, kind, opts) {
|
|
390
|
+
const client = new Client(CLIENT_INFO, { capabilities: {} });
|
|
391
|
+
const target = new URL(url);
|
|
392
|
+
const transport = kind === "streamable-http" ? new StreamableHTTPClientTransport(target, {
|
|
393
|
+
fetch,
|
|
394
|
+
reconnectionOptions: {
|
|
395
|
+
maxRetries: 0,
|
|
396
|
+
initialReconnectionDelay: 1e3,
|
|
397
|
+
maxReconnectionDelay: 1e3,
|
|
398
|
+
reconnectionDelayGrowFactor: 1
|
|
399
|
+
}
|
|
400
|
+
}) : new SSEClientTransport(target, {
|
|
401
|
+
fetch,
|
|
402
|
+
eventSourceInit: { fetch }
|
|
403
|
+
});
|
|
404
|
+
try {
|
|
405
|
+
await client.connect(transport, { timeout: opts.requestTimeoutMs, signal: opts.signal });
|
|
406
|
+
const pages = [];
|
|
407
|
+
let cursor;
|
|
408
|
+
for (let page = 0; page < opts.maxPages; page++) {
|
|
409
|
+
const res = await client.request(
|
|
410
|
+
{ method: "tools/list", params: cursor ? { cursor } : {} },
|
|
411
|
+
ToolsPage,
|
|
412
|
+
{
|
|
413
|
+
timeout: opts.requestTimeoutMs,
|
|
414
|
+
signal: opts.signal
|
|
415
|
+
}
|
|
416
|
+
);
|
|
417
|
+
pages.push(res.tools ?? []);
|
|
418
|
+
cursor = res.nextCursor || void 0;
|
|
419
|
+
if (!cursor) break;
|
|
420
|
+
}
|
|
421
|
+
const v = client.getServerVersion();
|
|
422
|
+
return {
|
|
423
|
+
tools: pages,
|
|
424
|
+
truncated: Boolean(cursor),
|
|
425
|
+
serverName: v?.name ?? null,
|
|
426
|
+
serverVersion: v?.version ?? null,
|
|
427
|
+
protocolVersion: transport.protocolVersion ?? null
|
|
428
|
+
};
|
|
429
|
+
} finally {
|
|
430
|
+
await client.close().catch(() => {
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
function httpFromSdkError(err) {
|
|
435
|
+
if (err instanceof HttpStatusError)
|
|
436
|
+
return { status: err.status, wwwAuthenticate: err.wwwAuthenticate };
|
|
437
|
+
const e = err;
|
|
438
|
+
if (e?.name === "UnauthorizedError") return { status: 401, wwwAuthenticate: null };
|
|
439
|
+
if (typeof e?.code === "number" && e.code >= 400 && e.code < 600)
|
|
440
|
+
return { status: e.code, wwwAuthenticate: null };
|
|
441
|
+
const m = /\b(?:HTTP|status(?: code)?)[\s:]*([45]\d\d)\b/i.exec(e?.message ?? "");
|
|
442
|
+
return m ? { status: Number(m[1]), wwwAuthenticate: null } : null;
|
|
443
|
+
}
|
|
444
|
+
function buildSnapshot(read) {
|
|
445
|
+
const snapshot = emptySnapshot();
|
|
446
|
+
snapshot.serverInfo = { name: read.serverName, version: read.serverVersion, title: null };
|
|
447
|
+
snapshot.protocolVersion = read.protocolVersion;
|
|
448
|
+
snapshot.capabilities.tools = true;
|
|
449
|
+
const seen = /* @__PURE__ */ new Map();
|
|
450
|
+
for (const page of read.tools) if (!addTools(page, seen, snapshot.issues)) break;
|
|
451
|
+
snapshot.tools = [...seen.values()];
|
|
452
|
+
if (read.truncated) {
|
|
453
|
+
snapshot.issues.push({
|
|
454
|
+
list: "tools",
|
|
455
|
+
kind: "truncated",
|
|
456
|
+
detail: `still paginating after ${LIMITS.pages} pages`
|
|
457
|
+
});
|
|
458
|
+
}
|
|
459
|
+
return snapshot;
|
|
460
|
+
}
|
|
461
|
+
async function probeEndpoint(rawUrl, opts) {
|
|
462
|
+
const declared = opts.declaredHeaders ?? [];
|
|
463
|
+
const identity = endpointIdentity(rawUrl);
|
|
464
|
+
const out = base(identity?.url ?? rawUrl, declared);
|
|
465
|
+
if (!identity) return { ...out, status: "blocked", error: "not an http(s) URL" };
|
|
466
|
+
if (identity.templated)
|
|
467
|
+
return {
|
|
468
|
+
...out,
|
|
469
|
+
status: "templated",
|
|
470
|
+
error: "the URL has placeholders that must be filled in first"
|
|
471
|
+
};
|
|
472
|
+
const started = Date.now();
|
|
473
|
+
const budget = AbortSignal.timeout(opts.budgetMs ?? PROBE_DEFAULTS.budgetMs);
|
|
474
|
+
const maxPages = Math.min(opts.maxPages ?? PROBE_DEFAULTS.maxPages, LIMITS.pages);
|
|
475
|
+
const requestTimeoutMs = opts.requestTimeoutMs ?? PROBE_DEFAULTS.requestTimeoutMs;
|
|
476
|
+
let challenge = null;
|
|
477
|
+
let read = null;
|
|
478
|
+
let mode = null;
|
|
479
|
+
let transport = null;
|
|
480
|
+
try {
|
|
481
|
+
read = await statelessToolsList(
|
|
482
|
+
opts.fetch,
|
|
483
|
+
identity.url,
|
|
484
|
+
{ signal: budget, maxPages },
|
|
485
|
+
(res) => {
|
|
486
|
+
out.latencyMs = Date.now() - started;
|
|
487
|
+
out.httpStatus = res.status;
|
|
488
|
+
if (res.url && res.url !== identity.url) out.finalUrl = res.url;
|
|
489
|
+
}
|
|
490
|
+
);
|
|
491
|
+
if (read) {
|
|
492
|
+
mode = "stateless";
|
|
493
|
+
transport = "streamable-http";
|
|
494
|
+
}
|
|
495
|
+
} catch (err) {
|
|
496
|
+
const http = httpFromSdkError(err);
|
|
497
|
+
if (http) {
|
|
498
|
+
out.httpStatus = http.status;
|
|
499
|
+
if (http.status === 401 || http.status === 403) challenge = http;
|
|
500
|
+
else
|
|
501
|
+
return {
|
|
502
|
+
...out,
|
|
503
|
+
status: statusForHttp(http.status),
|
|
504
|
+
error: `HTTP ${http.status}`,
|
|
505
|
+
auth: { ...out.auth, mode: "unknown" }
|
|
506
|
+
};
|
|
507
|
+
} else {
|
|
508
|
+
const c = classifyNetworkError(err);
|
|
509
|
+
return { ...out, ...c, latencyMs: out.latencyMs ?? Date.now() - started };
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
if (!read && !challenge) {
|
|
513
|
+
for (const kind of ["streamable-http", "sse"]) {
|
|
514
|
+
if (budget.aborted) break;
|
|
515
|
+
try {
|
|
516
|
+
read = await handshakeToolsList(opts.fetch, identity.url, kind, {
|
|
517
|
+
requestTimeoutMs,
|
|
518
|
+
maxPages,
|
|
519
|
+
signal: budget
|
|
520
|
+
});
|
|
521
|
+
mode = "initialize";
|
|
522
|
+
transport = kind;
|
|
523
|
+
break;
|
|
524
|
+
} catch (err) {
|
|
525
|
+
const http = httpFromSdkError(err);
|
|
526
|
+
if (http && (http.status === 401 || http.status === 403)) {
|
|
527
|
+
challenge = http;
|
|
528
|
+
out.httpStatus = http.status;
|
|
529
|
+
break;
|
|
530
|
+
}
|
|
531
|
+
if (http) out.httpStatus = http.status;
|
|
532
|
+
if (kind === "sse" || http && ![400, 404, 405].includes(http.status)) {
|
|
533
|
+
const c = http ? { status: statusForHttp(http.status), error: `HTTP ${http.status}` } : classifyNetworkError(err);
|
|
534
|
+
return { ...out, ...c, latencyMs: out.latencyMs ?? Date.now() - started };
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
if (read) {
|
|
540
|
+
const snapshot = buildSnapshot(read);
|
|
541
|
+
return {
|
|
542
|
+
...out,
|
|
543
|
+
status: "open",
|
|
544
|
+
transport,
|
|
545
|
+
protocolMode: mode,
|
|
546
|
+
protocolVersion: read.protocolVersion,
|
|
547
|
+
serverName: read.serverName,
|
|
548
|
+
serverVersion: read.serverVersion,
|
|
549
|
+
snapshot,
|
|
550
|
+
auth: { ...out.auth, mode: "none" },
|
|
551
|
+
latencyMs: out.latencyMs ?? Date.now() - started
|
|
552
|
+
};
|
|
553
|
+
}
|
|
554
|
+
if (challenge) {
|
|
555
|
+
let wwwAuthenticate = challenge.wwwAuthenticate;
|
|
556
|
+
if (wwwAuthenticate === null) {
|
|
557
|
+
try {
|
|
558
|
+
const res = await opts.fetch(identity.url, {
|
|
559
|
+
method: "POST",
|
|
560
|
+
signal: budget,
|
|
561
|
+
headers: {
|
|
562
|
+
"content-type": "application/json",
|
|
563
|
+
accept: "application/json, text/event-stream"
|
|
564
|
+
},
|
|
565
|
+
body: JSON.stringify({
|
|
566
|
+
jsonrpc: "2.0",
|
|
567
|
+
id: 1,
|
|
568
|
+
method: "initialize",
|
|
569
|
+
params: { protocolVersion: "2025-06-18", capabilities: {}, clientInfo: CLIENT_INFO }
|
|
570
|
+
})
|
|
571
|
+
});
|
|
572
|
+
wwwAuthenticate = res.headers.get("www-authenticate");
|
|
573
|
+
await res.body?.cancel().catch(() => {
|
|
574
|
+
});
|
|
575
|
+
} catch {
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
const discovery = await discoverOAuth(
|
|
579
|
+
opts.fetch,
|
|
580
|
+
new URL(identity.url),
|
|
581
|
+
parseWwwAuthenticate(wwwAuthenticate),
|
|
582
|
+
budget
|
|
583
|
+
);
|
|
584
|
+
return {
|
|
585
|
+
...out,
|
|
586
|
+
status: "auth_required",
|
|
587
|
+
transport: "streamable-http",
|
|
588
|
+
auth: {
|
|
589
|
+
mode: discovery.oauth ? "oauth" : "static",
|
|
590
|
+
challengeStatus: challenge.status,
|
|
591
|
+
oauth: discovery.oauth,
|
|
592
|
+
declaredHeaders: declared
|
|
593
|
+
},
|
|
594
|
+
violations: discovery.violations,
|
|
595
|
+
latencyMs: out.latencyMs ?? Date.now() - started
|
|
596
|
+
};
|
|
597
|
+
}
|
|
598
|
+
return {
|
|
599
|
+
...out,
|
|
600
|
+
status: "protocol_error",
|
|
601
|
+
error: "answered, but not as an MCP server",
|
|
602
|
+
latencyMs: out.latencyMs ?? Date.now() - started
|
|
603
|
+
};
|
|
604
|
+
}
|
|
605
|
+
export {
|
|
606
|
+
PROBE_DEFAULTS,
|
|
607
|
+
PROBE_PROTOCOL_VERSION,
|
|
608
|
+
classifyNetworkError,
|
|
609
|
+
probeEndpoint
|
|
610
|
+
};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { createRequire as __lurqCreateRequire } from 'node:module'; const require = __lurqCreateRequire(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
LIST_CAP,
|
|
4
|
+
PAIRS_PER_PACKAGE,
|
|
5
|
+
QUEUE_HEADROOM,
|
|
6
|
+
enqueuePublicUpgrades,
|
|
7
|
+
latestOfMajors,
|
|
8
|
+
majorPairs,
|
|
9
|
+
pendingUpgrade,
|
|
10
|
+
registerPublicUpgradeRoutes,
|
|
11
|
+
toPublicUpgrade,
|
|
12
|
+
unextractedSides,
|
|
13
|
+
upgradeGuideFor,
|
|
14
|
+
upgradePairsFor,
|
|
15
|
+
upgradeVerdict
|
|
16
|
+
} from "./chunk-O4KHCV6I.js";
|
|
17
|
+
import "./chunk-BJT2LHAR.js";
|
|
18
|
+
import "./chunk-SHCEBP3J.js";
|
|
19
|
+
import "./chunk-NPVN2THM.js";
|
|
20
|
+
import "./chunk-VLRHFMGJ.js";
|
|
21
|
+
import "./chunk-ONDVTXUO.js";
|
|
22
|
+
import "./chunk-4JHDSVIN.js";
|
|
23
|
+
import "./chunk-6L67QMCP.js";
|
|
24
|
+
import "./chunk-3GHJR7XR.js";
|
|
25
|
+
import "./chunk-MYGSLK44.js";
|
|
26
|
+
import "./chunk-72Y2FDVS.js";
|
|
27
|
+
import "./chunk-I3M2KJXB.js";
|
|
28
|
+
export {
|
|
29
|
+
LIST_CAP,
|
|
30
|
+
PAIRS_PER_PACKAGE,
|
|
31
|
+
QUEUE_HEADROOM,
|
|
32
|
+
enqueuePublicUpgrades,
|
|
33
|
+
latestOfMajors,
|
|
34
|
+
majorPairs,
|
|
35
|
+
pendingUpgrade,
|
|
36
|
+
registerPublicUpgradeRoutes,
|
|
37
|
+
toPublicUpgrade,
|
|
38
|
+
unextractedSides,
|
|
39
|
+
upgradeGuideFor,
|
|
40
|
+
upgradePairsFor,
|
|
41
|
+
upgradeVerdict
|
|
42
|
+
};
|
|
@@ -2,13 +2,15 @@ import { createRequire as __lurqCreateRequire } from 'node:module'; const requir
|
|
|
2
2
|
import {
|
|
3
3
|
SURFACE_CLAIM_KINDS,
|
|
4
4
|
isRootSpecifier,
|
|
5
|
+
listSourceFiles,
|
|
5
6
|
packageOfSpecifier,
|
|
6
7
|
scanReferences
|
|
7
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-SHZFOSXC.js";
|
|
8
9
|
import "./chunk-I3M2KJXB.js";
|
|
9
10
|
export {
|
|
10
11
|
SURFACE_CLAIM_KINDS,
|
|
11
12
|
isRootSpecifier,
|
|
13
|
+
listSourceFiles,
|
|
12
14
|
packageOfSpecifier,
|
|
13
15
|
scanReferences
|
|
14
16
|
};
|
|
@@ -7,14 +7,14 @@ import {
|
|
|
7
7
|
} from "./chunk-ELGCAM7P.js";
|
|
8
8
|
import {
|
|
9
9
|
fetchAndExtract
|
|
10
|
-
} from "./chunk-
|
|
11
|
-
import "./chunk-
|
|
12
|
-
import "./chunk-
|
|
10
|
+
} from "./chunk-FVYFV5HA.js";
|
|
11
|
+
import "./chunk-D3VTZS7V.js";
|
|
12
|
+
import "./chunk-KYKSZ3XZ.js";
|
|
13
13
|
import {
|
|
14
14
|
require_semver
|
|
15
15
|
} from "./chunk-3GHJR7XR.js";
|
|
16
16
|
import "./chunk-MYGSLK44.js";
|
|
17
|
-
import "./chunk-
|
|
17
|
+
import "./chunk-72Y2FDVS.js";
|
|
18
18
|
import {
|
|
19
19
|
__toESM,
|
|
20
20
|
init_esm_shims
|
|
@@ -61,7 +61,7 @@ async function checkRelease(dir, opts = {}) {
|
|
|
61
61
|
};
|
|
62
62
|
if (!name) return inconclusive(base, `no readable package.json in ${dir}`);
|
|
63
63
|
if (!manifest.version) return inconclusive(base, "package.json has no version field");
|
|
64
|
-
const { extractSurface } = await import("./extract-
|
|
64
|
+
const { extractSurface } = await import("./extract-6WG265BL.js");
|
|
65
65
|
const local = extractSurface(dir, { manifest });
|
|
66
66
|
if (local.undeclaredReason) {
|
|
67
67
|
return inconclusive(base, `${local.undeclaredReason} \u2014 build the package first`);
|