@ait-co/devtools 0.1.134 → 0.1.136
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/{chii-relay-DkTOopRj.js → chii-relay-BZ3HqWL5.js} +2 -1
- package/dist/{chii-relay-DkTOopRj.js.map → chii-relay-BZ3HqWL5.js.map} +1 -1
- package/dist/{chii-relay-P6SKmB1g.cjs → chii-relay-D7eK2acz.cjs} +2 -1
- package/dist/{chii-relay-P6SKmB1g.cjs.map → chii-relay-D7eK2acz.cjs.map} +1 -1
- package/dist/{debug-server-BcSBrajf.js → debug-server-BZtH2Z5b.js} +8 -2
- package/dist/debug-server-BZtH2Z5b.js.map +1 -0
- package/dist/{debug-server-DnNCoNiR.js → debug-server-D2wpPK3_.js} +3 -2
- package/dist/debug-server-D2wpPK3_.js.map +1 -0
- package/dist/{debug-server-D9SmprUI.js → debug-server-DApo0o3t.js} +9 -3
- package/dist/debug-server-DApo0o3t.js.map +1 -0
- package/dist/mcp/cli.js +69 -9
- package/dist/mcp/cli.js.map +1 -1
- package/dist/mcp/server.js +1 -1
- package/dist/panel/index.js +1 -1
- package/dist/{qr-http-server-C_DTp9WU.js → qr-http-server-C7q8Gn04.js} +61 -7
- package/dist/{qr-http-server-C_DTp9WU.js.map → qr-http-server-C7q8Gn04.js.map} +1 -1
- package/dist/{qr-http-server-FVn61xAq.js → qr-http-server-CTLdclg_.js} +61 -7
- package/dist/{qr-http-server-V0xuU5TJ.js.map → qr-http-server-CTLdclg_.js.map} +1 -1
- package/dist/{qr-http-server-iH_Hh_si.cjs → qr-http-server-Cz1mA07b.cjs} +61 -7
- package/dist/{qr-http-server-iH_Hh_si.cjs.map → qr-http-server-Cz1mA07b.cjs.map} +1 -1
- package/dist/{qr-http-server-DX_9UA-p.cjs → qr-http-server-D16Lq2ag.cjs} +61 -7
- package/dist/{qr-http-server-DX_9UA-p.cjs.map → qr-http-server-D16Lq2ag.cjs.map} +1 -1
- package/dist/{qr-http-server-V0xuU5TJ.js → qr-http-server-ZkT6F7is.js} +61 -7
- package/dist/{qr-http-server-FVn61xAq.js.map → qr-http-server-ZkT6F7is.js.map} +1 -1
- package/dist/{qr-http-server-DeRrKp_R.js → qr-http-server-wy3L7Yut.js} +61 -7
- package/dist/{qr-http-server-DeRrKp_R.js.map → qr-http-server-wy3L7Yut.js.map} +1 -1
- package/dist/{relay-factory-CsVO9o25.js → relay-factory-DnuTH4v-.js} +4 -4
- package/dist/relay-factory-DnuTH4v-.js.map +1 -0
- package/dist/test-runner/bin.js +124 -5
- package/dist/test-runner/bin.js.map +1 -1
- package/dist/test-runner/config.d.ts +8 -0
- package/dist/test-runner/config.d.ts.map +1 -1
- package/dist/test-runner/config.js +1 -1
- package/dist/test-runner/relay-factory.d.ts +8 -0
- package/dist/test-runner/relay-factory.d.ts.map +1 -1
- package/dist/test-runner/relay-factory.js +3 -3
- package/dist/test-runner/relay-factory.js.map +1 -1
- package/dist/{tunnel-Djf-zmjJ.js → tunnel-5eBncITa.js} +2 -2
- package/dist/{tunnel-Djf-zmjJ.js.map → tunnel-5eBncITa.js.map} +1 -1
- package/dist/{tunnel-DP453L4e.cjs → tunnel-DjtSENJU.cjs} +2 -2
- package/dist/{tunnel-DP453L4e.cjs.map → tunnel-DjtSENJU.cjs.map} +1 -1
- package/dist/unplugin/index.cjs +2 -2
- package/dist/unplugin/index.js +2 -2
- package/dist/unplugin/tunnel.cjs +1 -1
- package/dist/unplugin/tunnel.js +1 -1
- package/package.json +1 -1
- package/dist/debug-server-BcSBrajf.js.map +0 -1
- package/dist/debug-server-D9SmprUI.js.map +0 -1
- package/dist/debug-server-DnNCoNiR.js.map +0 -1
- package/dist/relay-factory-CsVO9o25.js.map +0 -1
package/dist/mcp/server.js
CHANGED
|
@@ -1022,7 +1022,7 @@ function createDevServer(deps = {}) {
|
|
|
1022
1022
|
const aitSource = deps.aitSource ?? new HttpAitSource({ stateEndpoint });
|
|
1023
1023
|
const server = new Server({
|
|
1024
1024
|
name: "ait-devtools",
|
|
1025
|
-
version: "0.1.
|
|
1025
|
+
version: "0.1.136"
|
|
1026
1026
|
}, { capabilities: { tools: {} } });
|
|
1027
1027
|
server.setRequestHandler(ListToolsRequestSchema, () => ({ tools: DEV_TOOL_DEFINITIONS.map((tool) => ({ ...tool })) }));
|
|
1028
1028
|
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
package/dist/panel/index.js
CHANGED
|
@@ -30146,7 +30146,7 @@ function Panel() {
|
|
|
30146
30146
|
color: "#666",
|
|
30147
30147
|
fontWeight: 400
|
|
30148
30148
|
},
|
|
30149
|
-
children: ["v", "0.1.
|
|
30149
|
+
children: ["v", "0.1.136"]
|
|
30150
30150
|
}),
|
|
30151
30151
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
|
|
30152
30152
|
type: "button",
|
|
@@ -1357,13 +1357,70 @@ function buildAttachHtml(qrDataUrl, safeLabel, safeAttachUrl, locale, path = "/a
|
|
|
1357
1357
|
return filled.replace("</body>", `${sseScript}\n</body>`);
|
|
1358
1358
|
}
|
|
1359
1359
|
/**
|
|
1360
|
-
*
|
|
1360
|
+
* base 포트부터 EADDRINUSE 시 +1씩 증가하며 bind를 시도한다. EADDRINUSE가
|
|
1361
|
+
* 아닌 에러는 즉시 reject한다(스캔 대상 아님). `range`번 모두 점유 상태면
|
|
1362
|
+
* ephemeral(포트 0)로 폴백하고 한국어 안내를 stderr에 1회 출력한다.
|
|
1363
|
+
*
|
|
1364
|
+
* 매 시도마다 이전에 등록한 `error` 리스너를 제거한다 — 성공 시 listener가
|
|
1365
|
+
* 누적돼 다음 실패에서 중복 reject/EventEmitter 경고가 나는 것을 방지한다.
|
|
1366
|
+
*
|
|
1367
|
+
* `basePort === 0`이면 스캔 없이 즉시 ephemeral bind (명시적 opt-out, 기존
|
|
1368
|
+
* 순수 랜덤 포트 동작 유지).
|
|
1369
|
+
*/
|
|
1370
|
+
async function bindWithIncrement(server, basePort, range = 20) {
|
|
1371
|
+
if (basePort === 0) return new Promise((resolve, reject) => {
|
|
1372
|
+
const onError = (err) => reject(err);
|
|
1373
|
+
server.once("error", onError);
|
|
1374
|
+
server.listen(0, "127.0.0.1", () => {
|
|
1375
|
+
server.removeListener("error", onError);
|
|
1376
|
+
resolve();
|
|
1377
|
+
});
|
|
1378
|
+
});
|
|
1379
|
+
for (let attempt = 0; attempt < range; attempt++) {
|
|
1380
|
+
const candidatePort = basePort + attempt;
|
|
1381
|
+
try {
|
|
1382
|
+
await new Promise((resolve, reject) => {
|
|
1383
|
+
const onError = (err) => {
|
|
1384
|
+
server.removeListener("error", onError);
|
|
1385
|
+
reject(err);
|
|
1386
|
+
};
|
|
1387
|
+
server.once("error", onError);
|
|
1388
|
+
server.listen(candidatePort, "127.0.0.1", () => {
|
|
1389
|
+
server.removeListener("error", onError);
|
|
1390
|
+
resolve();
|
|
1391
|
+
});
|
|
1392
|
+
});
|
|
1393
|
+
return;
|
|
1394
|
+
} catch (err) {
|
|
1395
|
+
if (err.code !== "EADDRINUSE") throw err;
|
|
1396
|
+
}
|
|
1397
|
+
}
|
|
1398
|
+
process.stderr.write(`devtools: 대시보드 포트 ${basePort}~${basePort + range - 1}이 모두 사용 중이라 임의 포트로 대체합니다.\n`);
|
|
1399
|
+
return new Promise((resolve, reject) => {
|
|
1400
|
+
const onError = (err) => reject(err);
|
|
1401
|
+
server.once("error", onError);
|
|
1402
|
+
server.listen(0, "127.0.0.1", () => {
|
|
1403
|
+
server.removeListener("error", onError);
|
|
1404
|
+
resolve();
|
|
1405
|
+
});
|
|
1406
|
+
});
|
|
1407
|
+
}
|
|
1408
|
+
/**
|
|
1409
|
+
* 로컬 HTTP 서버를 127.0.0.1에 고정 base 포트({@link DEFAULT_DASHBOARD_PORT},
|
|
1410
|
+
* `AIT_DEBUG_HTTP_PORT` env, 또는 `options.dashboardPort`)에서 시작한다.
|
|
1411
|
+
* base 포트가 점유(EADDRINUSE) 상태면 +1씩 증가하며 재시도하고(최대
|
|
1412
|
+
* {@link PORT_SCAN_RANGE}회), 전부 점유면 ephemeral 포트로 폴백한다 —
|
|
1413
|
+
* rerun 시 대시보드 URL이 안정적으로 유지되어 브라우저 탭/북마크가
|
|
1414
|
+
* run마다 무효화되지 않는다 (devtools#752). base 포트를 명시적으로 `0`으로
|
|
1415
|
+
* 주면(env 또는 옵션) 기존 순수 ephemeral 동작을 유지한다.
|
|
1416
|
+
*
|
|
1361
1417
|
* MCP debug server 생애주기에 묶어 사용 — `runDebugServer` shutdown 시 `close()`로 정리.
|
|
1362
1418
|
*
|
|
1363
1419
|
* @param getDashboardState - dashboard 상태를 반환하는 클로저. 주입 시 `GET /` dashboard와
|
|
1364
1420
|
* `GET /events` SSE 스트림이 활성화된다. 미주입 시 두 라우트는 204/서비스 없음으로 응답.
|
|
1365
1421
|
* @param options - 서버 옵션. `sseRefreshIntervalMs`로 idle 탭 TOTP 만료 방지 주기를 조정.
|
|
1366
1422
|
* `getDirectInspectorUrl`로 /inspector 라우트에서 직접 조립 URL을 제공해 redirect 루프를 방지.
|
|
1423
|
+
* `dashboardPort`로 bind base 포트를 override.
|
|
1367
1424
|
*/
|
|
1368
1425
|
async function startQrHttpServer(getDashboardState, options) {
|
|
1369
1426
|
const { default: QRCode } = await import("qrcode");
|
|
@@ -1543,11 +1600,7 @@ async function startQrHttpServer(getDashboardState, options) {
|
|
|
1543
1600
|
res.writeHead(404, { "Content-Type": "text/plain; charset=utf-8" });
|
|
1544
1601
|
res.end("Not Found");
|
|
1545
1602
|
});
|
|
1546
|
-
|
|
1547
|
-
await new Promise((resolve, reject) => {
|
|
1548
|
-
server.listen(listenPort, "127.0.0.1", () => resolve());
|
|
1549
|
-
server.once("error", reject);
|
|
1550
|
-
});
|
|
1603
|
+
await bindWithIncrement(server, options?.dashboardPort ?? (process.env.AIT_DEBUG_HTTP_PORT !== void 0 ? Number(process.env.AIT_DEBUG_HTTP_PORT) : 8317), options?.portScanRange);
|
|
1551
1604
|
const address = server.address();
|
|
1552
1605
|
if (!address || typeof address === "string") throw new Error("qr-http-server: server.address()가 예상하지 못한 형태입니다.");
|
|
1553
1606
|
const port = address.port;
|
|
@@ -1575,6 +1628,7 @@ async function startQrHttpServer(getDashboardState, options) {
|
|
|
1575
1628
|
},
|
|
1576
1629
|
close() {
|
|
1577
1630
|
clearInterval(refreshHandle);
|
|
1631
|
+
server.closeAllConnections();
|
|
1578
1632
|
return new Promise((resolve, reject) => {
|
|
1579
1633
|
server.close((err) => err ? reject(err) : resolve());
|
|
1580
1634
|
});
|
|
@@ -1584,4 +1638,4 @@ async function startQrHttpServer(getDashboardState, options) {
|
|
|
1584
1638
|
//#endregion
|
|
1585
1639
|
export { startQrHttpServer };
|
|
1586
1640
|
|
|
1587
|
-
//# sourceMappingURL=qr-http-server-
|
|
1641
|
+
//# sourceMappingURL=qr-http-server-C7q8Gn04.js.map
|