@ait-co/devtools 0.1.56 → 0.1.58
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.en.md +26 -32
- package/README.md +26 -32
- package/dist/mcp/cli.js +577 -354
- package/dist/mcp/cli.js.map +1 -1
- package/dist/mcp/server.js +24 -18
- package/dist/mcp/server.js.map +1 -1
- package/dist/panel/index.js +2 -2
- package/dist/relay-secret-store-DnTNl-9z.cjs +140 -0
- package/dist/relay-secret-store-DnTNl-9z.cjs.map +1 -0
- package/dist/relay-secret-store-DqyUoeXy.js +140 -0
- package/dist/relay-secret-store-DqyUoeXy.js.map +1 -0
- package/dist/{totp-CxHsagqY.js → totp-BkP5yU2K.js} +4 -2
- package/dist/totp-BkP5yU2K.js.map +1 -0
- package/dist/totp-CQFmgOhM.js +3 -0
- package/dist/totp-D0a8VwoR.js +187 -0
- package/dist/totp-D0a8VwoR.js.map +1 -0
- package/dist/{totp-BkKP4m8H.cjs → totp-DLgGbySX.cjs} +4 -1
- package/dist/totp-DLgGbySX.cjs.map +1 -0
- package/dist/{tunnel-Cj8g1LIL.js → tunnel-CI61NvPI.js} +2 -2
- package/dist/{tunnel-Cj8g1LIL.js.map → tunnel-CI61NvPI.js.map} +1 -1
- package/dist/{tunnel-p-q6eVWT.cjs → tunnel-nKYPtc-g.cjs} +2 -2
- package/dist/{tunnel-p-q6eVWT.cjs.map → tunnel-nKYPtc-g.cjs.map} +1 -1
- package/dist/unplugin/index.cjs +4 -2
- package/dist/unplugin/index.cjs.map +1 -1
- package/dist/unplugin/index.d.cts.map +1 -1
- package/dist/unplugin/index.d.ts.map +1 -1
- package/dist/unplugin/index.js +4 -2
- package/dist/unplugin/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/totp-BkKP4m8H.cjs.map +0 -1
- package/dist/totp-CxHsagqY.js.map +0 -1
package/dist/mcp/server.js
CHANGED
|
@@ -251,6 +251,8 @@ SIGNATURES.map((s) => s.name);
|
|
|
251
251
|
[
|
|
252
252
|
"[ait-debug] AIT_DEBUG_TOTP_SECRET이 필수입니다. 32자 이상 16진수(hex) 문자열을 설정하세요.",
|
|
253
253
|
"발급: openssl rand -hex 32",
|
|
254
|
+
"데몬은 start_debug의 projectRoot 인자로 받은 디렉토리에서 .ait_relay 파일을 읽어 이 시크릿을 채웁니다.",
|
|
255
|
+
"프로젝트에서 pnpm dev를 한 번 띄우면 unplugin이 .ait_relay를 자동 생성하니, projectRoot를 전달하세요.",
|
|
254
256
|
"자세히: https://docs.aitc.dev/guides/relay-auth-totp"
|
|
255
257
|
].join("\n");
|
|
256
258
|
new Set([
|
|
@@ -286,13 +288,13 @@ new Set([
|
|
|
286
288
|
},
|
|
287
289
|
{
|
|
288
290
|
name: "build_attach_url",
|
|
289
|
-
description: "The tool result already shows the QR to the user directly (Claude Code renders MCP tool output to the user's screen; they press Ctrl+O to expand if it's collapsed). Do NOT re-print or re-render the QR in your reply — that just wastes output tokens. Simply tell the user to scan the QR shown in this tool's output with their phone camera. Builds a self-attaching deep link for the active relay environment and returns a QR code. Scan the QR with the phone camera to open the mini-app and attach it to this debug session (QR is the single entry path — no USB cable or platform CLI needed). Call list_pages first to confirm the relay/tunnel is up. If the tunnel is not up, restart: `npx @ait-co/devtools devtools-mcp`.\n\nEnvironment-specific behaviour:\n • env 3 / staging (start_debug mode=\"staging\"): requires scheme_url — the intoss-private://…?_deploymentId=<uuid> URL from `ait deploy --scheme-only`. Splices debug=1 + relay URL into the scheme URL to produce a self-attach deep link.\n • env 2 /
|
|
291
|
+
description: "The tool result already shows the QR to the user directly (Claude Code renders MCP tool output to the user's screen; they press Ctrl+O to expand if it's collapsed). Do NOT re-print or re-render the QR in your reply — that just wastes output tokens. Simply tell the user to scan the QR shown in this tool's output with their phone camera. Builds a self-attaching deep link for the active relay environment and returns a QR code. Scan the QR with the phone camera to open the mini-app and attach it to this debug session (QR is the single entry path — no USB cable or platform CLI needed). Call list_pages first to confirm the relay/tunnel is up. If the tunnel is not up, restart: `npx @ait-co/devtools devtools-mcp`.\n\nEnvironment-specific behaviour:\n • env 3 / relay-staging (start_debug mode=\"relay-staging\"): requires scheme_url — the intoss-private://…?_deploymentId=<uuid> URL from `ait deploy --scheme-only`. Splices debug=1 + relay URL into the scheme URL to produce a self-attach deep link.\n • env 2 / relay-sandbox (start_debug mode=\"relay-sandbox\"): scheme_url is NOT used. Instead, reads AIT_TUNNEL_BASE_URL (the https://*.trycloudflare.com app tunnel from `tunnel:{cdp:true}`) and builds a launcher PWA deep-link (https://devtools.aitc.dev/launcher/?url=…&debug=1&relay=…). Scan the QR with the phone to open the launcher, which frames the tunnel URL and attaches CDP.\n\nSet wait_for_attach=true to block until a page attaches (polls up to 30 s). On timeout, call build_attach_url again to resume polling. When open_in_browser=true (default), saves the QR as a PNG and opens it in the OS default browser — only works when the MCP server runs on a local GUI machine (not headless/remote containers). \n\nTOTP auth: when AIT_DEBUG_TOTP_SECRET is set on the MCP server, the returned attachUrl automatically includes the current one-time code (at=<code>) — the URL is single-use for that 30-second step. The response includes a `totp` field with `expiresAt` (ISO timestamp). If the phone scan happens after expiresAt, the relay will reject the code — just call build_attach_url again to get a fresh one-time URL. Without AIT_DEBUG_TOTP_SECRET, the attachUrl has no expiry.",
|
|
290
292
|
inputSchema: {
|
|
291
293
|
type: "object",
|
|
292
294
|
properties: {
|
|
293
295
|
scheme_url: {
|
|
294
296
|
type: "string",
|
|
295
|
-
description: "The intoss-private:// scheme URL from `ait deploy --scheme-only` (must carry _deploymentId). Required for env 3/staging mode. Not used in env 2/
|
|
297
|
+
description: "The intoss-private:// scheme URL from `ait deploy --scheme-only` (must carry _deploymentId). Required for env 3/relay-staging mode. Not used in env 2/relay-sandbox mode (use AIT_TUNNEL_BASE_URL instead). The authority (host) must be the app name (e.g. intoss-private://aitc-sdk-example?_deploymentId=…). Generic values like \"web\" or an empty host indicate a malformed URL."
|
|
296
298
|
},
|
|
297
299
|
wait_for_attach: {
|
|
298
300
|
type: "boolean",
|
|
@@ -435,23 +437,27 @@ new Set([
|
|
|
435
437
|
},
|
|
436
438
|
{
|
|
437
439
|
name: "start_debug",
|
|
438
|
-
description: "Switches the active debug environment in-place (issue #348) — no Claude Code restart and no MCP re-handshake. One daemon holds both a local (env 1, mock SDK in a Chromium) and a relay (env 3/4, real-device Toss WebView over the Chii relay + cloudflared tunnel) connection at once; this tool flips which one every other tool reads from, lazily booting the requested family's infra on first use and keeping the inactive one warm so an existing attach survives the switch. After switching it emits notifications/tools/list_changed — call tools/list again to see the updated tool surface for the new environment.\n\nmodes:\n local — env 1: desktop Chromium with the MOCK SDK and a local CDP attach. Side-effect tools (call_sdk/evaluate) run unguarded against the mock; nothing touches a real device or real users. No prerequisites — the default, always-available environment for state/contract and visual-layout work.\n
|
|
440
|
+
description: "Switches the active debug environment in-place (issue #348) — no Claude Code restart and no MCP re-handshake. One daemon holds both a local (env 1, mock SDK in a Chromium) and a relay (env 3/4, real-device Toss WebView over the Chii relay + cloudflared tunnel) connection at once; this tool flips which one every other tool reads from, lazily booting the requested family's infra on first use and keeping the inactive one warm so an existing attach survives the switch. After switching it emits notifications/tools/list_changed — call tools/list again to see the updated tool surface for the new environment.\n\nmodes:\n local-browser — env 1: desktop Chromium with the MOCK SDK and a local CDP attach. Side-effect tools (call_sdk/evaluate) run unguarded against the mock; nothing touches a real device or real users. No prerequisites — the default, always-available environment for state/contract and visual-layout work.\n relay-sandbox — env 2: a real-device PWA (real WebKit engine, MOCK SDK) over an external Chii relay. CDP covers real-device WebKit DOM, console, exceptions, and safe-area observation; call_sdk still hits the mock (SDK fidelity needs relay-staging). liveIntent off — dev-intent, LIVE guard inactive, side-effect tools run unguarded against the mock. Only the dual-connection daemon can enter relay-sandbox in-place; a single-connection session rejects it with \"동적 전환할 수 없습니다 … relay-sandbox 모드로 재시작하세요\" — follow that hint and restart the MCP server in relay-sandbox mode rather than retrying. Prerequisites: both AIT_RELAY_BASE_URL (the relay base the unplugin emits when started with tunnel:{cdp:true}, used for the CDP attach) and AIT_TUNNEL_BASE_URL (the dev-server tunnel host, required by build_attach_url to render the launcher QR) must be set before the MCP server starts — the unplugin does not auto-forward either; set them explicitly. Both carry relay/tunnel hosts (secret-class) — keep them out of logs.\n relay-staging — env 3: a real-device Toss WebView dogfood build with the REAL SDK over the intoss-private relay. The first environment where call_sdk exercises the genuine native bridge. Side-effect tools run unguarded (dogfood, not released to real users). Prerequisite: a dogfood candidate bundle built with `RELEASE_CHANNEL=dogfood ait build`, then uploaded with `ait deploy` (add `--scheme-only` to print the resulting intoss-private://…?_deploymentId=… deep-link); open that deep-link/QR on the device to cold-load the bundle with the relay injected. Unlike env 2, env 3 is NOT a dev-server tunnel — it is a deployed bundle reached via the intoss-private scheme, so `pnpm dev` plays no part here.\n relay-live — env 4: the REVIEW-PASSED, released production runtime with the REAL SDK over the intoss relay — real end users are on the other side. Read-only debugging is the intent: the LIVE guard is armed, so call_sdk/evaluate require confirm:true per call, and ENTERING relay-live ALSO requires confirm:true on this call. Use it only to observe a shipped regression; verify fixes in relay-staging first.\n\nSwitching back to local-browser automatically disarms the LIVE guard.\n\nFor a relay mode (relay-sandbox/relay-staging/relay-live), also pass projectRoot — the absolute mini-app project root — so the daemon can read the relay auth secret from <projectRoot>/.ait_relay (read-only; the daemon never mints it). Omit it for local-browser.",
|
|
439
441
|
inputSchema: {
|
|
440
442
|
type: "object",
|
|
441
443
|
properties: {
|
|
442
444
|
mode: {
|
|
443
445
|
type: "string",
|
|
444
446
|
enum: [
|
|
445
|
-
"local",
|
|
446
|
-
"
|
|
447
|
-
"staging",
|
|
448
|
-
"live"
|
|
447
|
+
"local-browser",
|
|
448
|
+
"relay-sandbox",
|
|
449
|
+
"relay-staging",
|
|
450
|
+
"relay-live"
|
|
449
451
|
],
|
|
450
|
-
description: "Target environment to switch to. mode=live additionally requires confirm: true (and arms the read-only LIVE guard)."
|
|
452
|
+
description: "Target environment to switch to. mode=relay-live additionally requires confirm: true (and arms the read-only LIVE guard)."
|
|
451
453
|
},
|
|
452
454
|
confirm: {
|
|
453
455
|
type: "boolean",
|
|
454
|
-
description: "Required when mode=live — set true to acknowledge entering LIVE (env 4) debugging that can affect real users. Ignored for the other modes."
|
|
456
|
+
description: "Required when mode=relay-live — set true to acknowledge entering LIVE (env 4) debugging that can affect real users. Ignored for the other modes."
|
|
457
|
+
},
|
|
458
|
+
projectRoot: {
|
|
459
|
+
type: "string",
|
|
460
|
+
description: "Absolute path to the mini-app project root (the directory containing its package.json and .ait_relay). The daemon reads the relay auth secret from <projectRoot>/.ait_relay (read-only) when switching to a relay environment (relay-staging/relay-live/relay-sandbox). Pass this because the daemon's own cwd is fixed at launch and may not be the project being debugged. Omit for mode=local-browser (no secret needed)."
|
|
455
461
|
}
|
|
456
462
|
},
|
|
457
463
|
required: ["mode"]
|
|
@@ -459,8 +465,8 @@ new Set([
|
|
|
459
465
|
availableIn: "both"
|
|
460
466
|
},
|
|
461
467
|
{
|
|
462
|
-
name: "
|
|
463
|
-
description: "
|
|
468
|
+
name: "get_debug_status",
|
|
469
|
+
description: "Reports the current debug session state — which environment/mode is active, whether a page is attached, and a full diagnostic snapshot — in one call. Use this any time to answer \"what mode am I in right now?\" or \"why is this not working?\" without chaining tools. Fields: mcpVersion (MCP SDK version), devtoolsVersion (@ait-co/devtools package version), tunnel (up/wssUrl/pid/startedAt), pages (list_pages result + lastSeenAt stats), lastAttachAt, lastDetachAt, recentErrors (last N server-side errors, PII/secret redacted), environment (kind: mock|relay-dev|relay-live|relay-mobile, env: mock|relay backward-compat, reason, liveGuardActive: true when relay-live LIVE guard is active), serverLockHolder (pid + startedAt from the lock file, or null), nextRecommendedAction ({tool, reason} or null — the single next tool to call; in local-target mode tunnel.up=false is normal so \"restart\" is never recommended). All fields are nullable — missing data is null, not an error. debug-mode only — dev-mode (--mode=dev) does not support relay diagnostics. Tier C (both mock and relay).",
|
|
464
470
|
inputSchema: {
|
|
465
471
|
type: "object",
|
|
466
472
|
properties: { recent_errors_limit: {
|
|
@@ -586,13 +592,13 @@ function getOperationalEnvironment(source) {
|
|
|
586
592
|
* backward-compatible alias of `AIT.getMockState`.
|
|
587
593
|
*
|
|
588
594
|
* Issue #305 (M2-1) — dev/debug tool-surface unification:
|
|
589
|
-
* dev-mode now also exposes `list_pages`, `
|
|
595
|
+
* dev-mode now also exposes `list_pages`, `get_debug_status`, `measure_safe_area`,
|
|
590
596
|
* and `call_sdk` so the docs/qa/scenarios.md acceptance sequence
|
|
591
597
|
* `list_pages → measure_safe_area → call_sdk` works in dev mode without
|
|
592
598
|
* "Unknown tool" failures.
|
|
593
599
|
*
|
|
594
600
|
* - `list_pages` — shim: returns the Vite dev URL as a single-entry array.
|
|
595
|
-
* - `
|
|
601
|
+
* - `get_debug_status` — dumps dev-mode server state (endpoint URL, last fetch
|
|
596
602
|
* error, reachability, mode/environment metadata).
|
|
597
603
|
* - `measure_safe_area`— reads safeAreaInsets from the mock state snapshot
|
|
598
604
|
* (source: 'mock-vite').
|
|
@@ -685,8 +691,8 @@ const DEV_TOOL_DEFINITIONS = [
|
|
|
685
691
|
availableIn: "both"
|
|
686
692
|
},
|
|
687
693
|
{
|
|
688
|
-
name: "
|
|
689
|
-
description: "dev-mode:
|
|
694
|
+
name: "get_debug_status",
|
|
695
|
+
description: "dev-mode: reports the current dev session state — Vite endpoint URL, last fetch timestamp/error, mock state endpoint reachability, mode (\"dev\"), and environment metadata — in one call. Use this any time to confirm what the dev server is doing or when its connection is suspect. In debug mode this returns tunnel/relay/attach status instead.",
|
|
690
696
|
inputSchema: {
|
|
691
697
|
type: "object",
|
|
692
698
|
properties: { recent_errors_limit: {
|
|
@@ -862,7 +868,7 @@ function buildDevListPagesResult(devtoolsUrl) {
|
|
|
862
868
|
};
|
|
863
869
|
}
|
|
864
870
|
/**
|
|
865
|
-
* Builds the `
|
|
871
|
+
* Builds the `get_debug_status` dev-mode response.
|
|
866
872
|
* Probes the mock state endpoint reachability and returns server metadata.
|
|
867
873
|
*/
|
|
868
874
|
async function buildDevDiagnostics(devtoolsUrl, stateEndpoint, fetchImpl) {
|
|
@@ -954,7 +960,7 @@ function createDevServer(deps = {}) {
|
|
|
954
960
|
const aitSource = deps.aitSource ?? new HttpAitSource({ stateEndpoint });
|
|
955
961
|
const server = new Server({
|
|
956
962
|
name: "ait-devtools",
|
|
957
|
-
version: "0.1.
|
|
963
|
+
version: "0.1.58"
|
|
958
964
|
}, { capabilities: { tools: {} } });
|
|
959
965
|
server.setRequestHandler(ListToolsRequestSchema, () => ({ tools: DEV_TOOL_DEFINITIONS.map((tool) => ({ ...tool })) }));
|
|
960
966
|
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
@@ -972,7 +978,7 @@ function createDevServer(deps = {}) {
|
|
|
972
978
|
}
|
|
973
979
|
switch (name) {
|
|
974
980
|
case "list_pages": return envelopeResult("list_pages", buildDevListPagesResult(devtoolsUrl));
|
|
975
|
-
case "
|
|
981
|
+
case "get_debug_status": return envelopeResult("get_debug_status", await buildDevDiagnostics(devtoolsUrl, stateEndpoint, (url) => fetch(url)));
|
|
976
982
|
case "measure_safe_area": return envelopeResult("measure_safe_area", await buildDevMeasureSafeArea(aitSource));
|
|
977
983
|
case "call_sdk": {
|
|
978
984
|
const sdkName = request.params.arguments?.name;
|