@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/cli.js
CHANGED
|
@@ -2024,7 +2024,7 @@ async function readMcpSdkVersion() {
|
|
|
2024
2024
|
* some test environments that skip the build step).
|
|
2025
2025
|
*/
|
|
2026
2026
|
function readDevtoolsVersion() {
|
|
2027
|
-
return "0.1.
|
|
2027
|
+
return "0.1.136";
|
|
2028
2028
|
}
|
|
2029
2029
|
/**
|
|
2030
2030
|
* Derives the next recommended action from a completed diagnostics snapshot.
|
|
@@ -4462,6 +4462,11 @@ OPTIONS
|
|
|
4462
4462
|
(report: <sdkLine>.<platform>.json; captures:
|
|
4463
4463
|
<dir>/.ait-capture/<category>.<sdkLine>.<platform>.json).
|
|
4464
4464
|
Omitted = nothing saved. Enables console capture.
|
|
4465
|
+
--dashboard-port <port> Base port for the QR dashboard HTTP server. On
|
|
4466
|
+
EADDRINUSE it increments (+1, up to 20 tries) before
|
|
4467
|
+
falling back to an ephemeral port. Omit to use
|
|
4468
|
+
AIT_DEBUG_HTTP_PORT env or the built-in default
|
|
4469
|
+
(8317) — pass 0 to force a random ephemeral port.
|
|
4465
4470
|
--no-qr-stdout Suppress the QR/attach block on stdout (auto-on for
|
|
4466
4471
|
non-interactive stdout / CI / AIT_NO_QR_STDOUT)
|
|
4467
4472
|
--headless Disable browser auto-open (text QR only)
|
|
@@ -4844,6 +4849,7 @@ async function startChiiRelay(options = {}) {
|
|
|
4844
4849
|
clearInterval(keepaliveHandle);
|
|
4845
4850
|
keepaliveHandle = null;
|
|
4846
4851
|
}
|
|
4852
|
+
if (capturedChiiWss !== null) for (const client of capturedChiiWss._wss.clients) client.terminate();
|
|
4847
4853
|
httpServer.close(() => resolve());
|
|
4848
4854
|
})
|
|
4849
4855
|
};
|
|
@@ -6812,13 +6818,70 @@ function buildAttachHtml(qrDataUrl, safeLabel, safeAttachUrl, locale, path = "/a
|
|
|
6812
6818
|
return filled.replace("</body>", `${sseScript}\n</body>`);
|
|
6813
6819
|
}
|
|
6814
6820
|
/**
|
|
6815
|
-
*
|
|
6821
|
+
* base 포트부터 EADDRINUSE 시 +1씩 증가하며 bind를 시도한다. EADDRINUSE가
|
|
6822
|
+
* 아닌 에러는 즉시 reject한다(스캔 대상 아님). `range`번 모두 점유 상태면
|
|
6823
|
+
* ephemeral(포트 0)로 폴백하고 한국어 안내를 stderr에 1회 출력한다.
|
|
6824
|
+
*
|
|
6825
|
+
* 매 시도마다 이전에 등록한 `error` 리스너를 제거한다 — 성공 시 listener가
|
|
6826
|
+
* 누적돼 다음 실패에서 중복 reject/EventEmitter 경고가 나는 것을 방지한다.
|
|
6827
|
+
*
|
|
6828
|
+
* `basePort === 0`이면 스캔 없이 즉시 ephemeral bind (명시적 opt-out, 기존
|
|
6829
|
+
* 순수 랜덤 포트 동작 유지).
|
|
6830
|
+
*/
|
|
6831
|
+
async function bindWithIncrement(server, basePort, range = 20) {
|
|
6832
|
+
if (basePort === 0) return new Promise((resolve, reject) => {
|
|
6833
|
+
const onError = (err) => reject(err);
|
|
6834
|
+
server.once("error", onError);
|
|
6835
|
+
server.listen(0, "127.0.0.1", () => {
|
|
6836
|
+
server.removeListener("error", onError);
|
|
6837
|
+
resolve();
|
|
6838
|
+
});
|
|
6839
|
+
});
|
|
6840
|
+
for (let attempt = 0; attempt < range; attempt++) {
|
|
6841
|
+
const candidatePort = basePort + attempt;
|
|
6842
|
+
try {
|
|
6843
|
+
await new Promise((resolve, reject) => {
|
|
6844
|
+
const onError = (err) => {
|
|
6845
|
+
server.removeListener("error", onError);
|
|
6846
|
+
reject(err);
|
|
6847
|
+
};
|
|
6848
|
+
server.once("error", onError);
|
|
6849
|
+
server.listen(candidatePort, "127.0.0.1", () => {
|
|
6850
|
+
server.removeListener("error", onError);
|
|
6851
|
+
resolve();
|
|
6852
|
+
});
|
|
6853
|
+
});
|
|
6854
|
+
return;
|
|
6855
|
+
} catch (err) {
|
|
6856
|
+
if (err.code !== "EADDRINUSE") throw err;
|
|
6857
|
+
}
|
|
6858
|
+
}
|
|
6859
|
+
process.stderr.write(`devtools: 대시보드 포트 ${basePort}~${basePort + range - 1}이 모두 사용 중이라 임의 포트로 대체합니다.\n`);
|
|
6860
|
+
return new Promise((resolve, reject) => {
|
|
6861
|
+
const onError = (err) => reject(err);
|
|
6862
|
+
server.once("error", onError);
|
|
6863
|
+
server.listen(0, "127.0.0.1", () => {
|
|
6864
|
+
server.removeListener("error", onError);
|
|
6865
|
+
resolve();
|
|
6866
|
+
});
|
|
6867
|
+
});
|
|
6868
|
+
}
|
|
6869
|
+
/**
|
|
6870
|
+
* 로컬 HTTP 서버를 127.0.0.1에 고정 base 포트({@link DEFAULT_DASHBOARD_PORT},
|
|
6871
|
+
* `AIT_DEBUG_HTTP_PORT` env, 또는 `options.dashboardPort`)에서 시작한다.
|
|
6872
|
+
* base 포트가 점유(EADDRINUSE) 상태면 +1씩 증가하며 재시도하고(최대
|
|
6873
|
+
* {@link PORT_SCAN_RANGE}회), 전부 점유면 ephemeral 포트로 폴백한다 —
|
|
6874
|
+
* rerun 시 대시보드 URL이 안정적으로 유지되어 브라우저 탭/북마크가
|
|
6875
|
+
* run마다 무효화되지 않는다 (devtools#752). base 포트를 명시적으로 `0`으로
|
|
6876
|
+
* 주면(env 또는 옵션) 기존 순수 ephemeral 동작을 유지한다.
|
|
6877
|
+
*
|
|
6816
6878
|
* MCP debug server 생애주기에 묶어 사용 — `runDebugServer` shutdown 시 `close()`로 정리.
|
|
6817
6879
|
*
|
|
6818
6880
|
* @param getDashboardState - dashboard 상태를 반환하는 클로저. 주입 시 `GET /` dashboard와
|
|
6819
6881
|
* `GET /events` SSE 스트림이 활성화된다. 미주입 시 두 라우트는 204/서비스 없음으로 응답.
|
|
6820
6882
|
* @param options - 서버 옵션. `sseRefreshIntervalMs`로 idle 탭 TOTP 만료 방지 주기를 조정.
|
|
6821
6883
|
* `getDirectInspectorUrl`로 /inspector 라우트에서 직접 조립 URL을 제공해 redirect 루프를 방지.
|
|
6884
|
+
* `dashboardPort`로 bind base 포트를 override.
|
|
6822
6885
|
*/
|
|
6823
6886
|
async function startQrHttpServer(getDashboardState, options) {
|
|
6824
6887
|
const { default: QRCode } = await import("qrcode");
|
|
@@ -6998,11 +7061,7 @@ async function startQrHttpServer(getDashboardState, options) {
|
|
|
6998
7061
|
res.writeHead(404, { "Content-Type": "text/plain; charset=utf-8" });
|
|
6999
7062
|
res.end("Not Found");
|
|
7000
7063
|
});
|
|
7001
|
-
|
|
7002
|
-
await new Promise((resolve, reject) => {
|
|
7003
|
-
server.listen(listenPort, "127.0.0.1", () => resolve());
|
|
7004
|
-
server.once("error", reject);
|
|
7005
|
-
});
|
|
7064
|
+
await bindWithIncrement(server, options?.dashboardPort ?? (process.env.AIT_DEBUG_HTTP_PORT !== void 0 ? Number(process.env.AIT_DEBUG_HTTP_PORT) : 8317), options?.portScanRange);
|
|
7006
7065
|
const address = server.address();
|
|
7007
7066
|
if (!address || typeof address === "string") throw new Error("qr-http-server: server.address()가 예상하지 못한 형태입니다.");
|
|
7008
7067
|
const port = address.port;
|
|
@@ -7030,6 +7089,7 @@ async function startQrHttpServer(getDashboardState, options) {
|
|
|
7030
7089
|
},
|
|
7031
7090
|
close() {
|
|
7032
7091
|
clearInterval(refreshHandle);
|
|
7092
|
+
server.closeAllConnections();
|
|
7033
7093
|
return new Promise((resolve, reject) => {
|
|
7034
7094
|
server.close((err) => err ? reject(err) : resolve());
|
|
7035
7095
|
});
|
|
@@ -7145,7 +7205,7 @@ function createDebugServer(deps) {
|
|
|
7145
7205
|
};
|
|
7146
7206
|
const server = new Server({
|
|
7147
7207
|
name: "ait-debug",
|
|
7148
|
-
version: "0.1.
|
|
7208
|
+
version: "0.1.136"
|
|
7149
7209
|
}, { capabilities: { tools: { listChanged: true } } });
|
|
7150
7210
|
server.setRequestHandler(ListToolsRequestSchema, () => {
|
|
7151
7211
|
const conn = router.active;
|
|
@@ -9129,7 +9189,7 @@ function createDevServer(deps = {}) {
|
|
|
9129
9189
|
const aitSource = deps.aitSource ?? new HttpAitSource({ stateEndpoint });
|
|
9130
9190
|
const server = new Server({
|
|
9131
9191
|
name: "ait-devtools",
|
|
9132
|
-
version: "0.1.
|
|
9192
|
+
version: "0.1.136"
|
|
9133
9193
|
}, { capabilities: { tools: {} } });
|
|
9134
9194
|
server.setRequestHandler(ListToolsRequestSchema, () => ({ tools: DEV_TOOL_DEFINITIONS.map((tool) => ({ ...tool })) }));
|
|
9135
9195
|
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|