@agent-native/core 0.91.0 → 0.91.1

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/corpus/README.md CHANGED
@@ -28,4 +28,4 @@ rg -n "defineAction|useActionQuery" node_modules/@agent-native/core/corpus
28
28
  ## Generated Counts
29
29
 
30
30
  - core files: 2149
31
- - template files: 4940
31
+ - template files: 4941
@@ -1,5 +1,17 @@
1
1
  # @agent-native/core
2
2
 
3
+ ## 0.91.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 942165f: Fix design live-edit preview showing a 404/NotFound for client-side-routed
8
+ (SPA) dev apps. The bridge served every snapshot from its own `/live-edit`
9
+ path, so the proxied app's router booted at `location.pathname === "/live-edit"`
10
+ and matched no route. The bridge now injects a synchronous pre-boot
11
+ `history.replaceState` shim that rewrites the iframe path to the real target
12
+ route before the app bundle runs. Asset resolution (via the injected
13
+ `<base href>`) is unchanged, and static/non-SPA apps are unaffected.
14
+
3
15
  ## 0.91.0
4
16
 
5
17
  ### Minor Changes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-native/core",
3
- "version": "0.91.0",
3
+ "version": "0.91.1",
4
4
  "description": "Framework for agent-native application development — where AI agents and UI share SQL state, actions, and context",
5
5
  "homepage": "https://github.com/BuilderIO/agent-native#readme",
6
6
  "bugs": {
@@ -708,8 +708,42 @@ function addLiveEditBaseHref(html: string, href: string): string {
708
708
  return `<!DOCTYPE html><html><head>${baseTag}<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"></head><body>${html}</body></html>`;
709
709
  }
710
710
 
711
- function injectLiveEditBridge(html: string, targetUrl: string, script: string) {
712
- const withBase = addLiveEditBaseHref(html, targetUrl);
711
+ /**
712
+ * Rewrite the iframe path to the real target route before the proxied app's
713
+ * bundle runs. The bridge serves snapshots from its own `/live-edit` path, so a
714
+ * client-side-routed SPA would otherwise boot at "/live-edit", match no route,
715
+ * and render its 404. A synchronous inline script in `<head>` runs during parse
716
+ * (before deferred module bundles), so `history.replaceState` lands the SPA on
717
+ * the intended route. Assets still resolve via the injected `<base href>`.
718
+ */
719
+ function injectPreBootLocationShim(html: string, targetPath: string): string {
720
+ const path = targetPath.trim();
721
+ if (!path || path === "/live-edit") return html;
722
+ const shim = `<script data-agent-native-live-edit-location>
723
+ (function(){try{var p=${JSON.stringify(path)};if(p&&(location.pathname+location.search)!==p){history.replaceState(null,"",p);}}catch(e){}})();
724
+ </script>`;
725
+ if (/<head\b[^>]*>/i.test(html)) {
726
+ return html.replace(/<head\b[^>]*>/i, (match) => `${match}${shim}`);
727
+ }
728
+ if (/<html\b[^>]*>/i.test(html)) {
729
+ return html.replace(
730
+ /<html\b[^>]*>/i,
731
+ (match) => `${match}<head>${shim}</head>`,
732
+ );
733
+ }
734
+ return `${shim}${html}`;
735
+ }
736
+
737
+ function injectLiveEditBridge(
738
+ html: string,
739
+ baseHref: string,
740
+ script: string,
741
+ targetPath: string,
742
+ ) {
743
+ const withBase = injectPreBootLocationShim(
744
+ addLiveEditBaseHref(html, baseHref),
745
+ targetPath,
746
+ );
713
747
  if (!script) return withBase;
714
748
  if (withBase.includes("</body>")) {
715
749
  return withBase.replace("</body>", `${script}</body>`);
@@ -1288,10 +1322,17 @@ export async function startDesignConnectBridge(
1288
1322
  );
1289
1323
  const includeEditorBridge =
1290
1324
  requestUrl.searchParams.get("bridge") !== "0";
1325
+ // The dev server route the SPA must boot on (e.g. "/todo"), taken
1326
+ // from the resolved snapshot target rather than the bridge's own
1327
+ // "/live-edit" request path.
1328
+ const targetParsed = new URL(targetUrl);
1329
+ const targetPath =
1330
+ `${targetParsed.pathname}${targetParsed.search}` || "/";
1291
1331
  const html = injectLiveEditBridge(
1292
1332
  snapshot.html,
1293
1333
  new URL("/", manifest.bridgeUrl).toString(),
1294
1334
  includeEditorBridge ? liveEditBridgeScript : "",
1335
+ targetPath,
1295
1336
  );
1296
1337
  sendText(
1297
1338
  res,
@@ -1897,15 +1938,18 @@ export async function runDesign(argv: string[]) {
1897
1938
  console.error(`Routes: ${manifest.routeCount}`);
1898
1939
  console.error(`Dev URL: ${manifest.devServerUrl}`);
1899
1940
 
1900
- // Self-register with the design app server (best-effort). When an app URL
1901
- // is available (via --app-url or env var) the CLI POSTs the bridge token to
1902
- // connect-localhost so the server row stores the real token. Without this
1903
- // step grant-localhost-write-consent would mint a different token, causing
1904
- // every bridge write to return 401.
1941
+ // Self-register with the design app server (best-effort): POST the bridge
1942
+ // token to connect-localhost so the server row stores the real token. Without
1943
+ // it, the bridge and server tokens diverge and every write returns 401.
1905
1944
  const appUrl = resolveAppUrl(parsed.appUrl);
1906
1945
  if (appUrl) {
1907
- const authToken = resolveAuthToken();
1908
- void registerConnectionWithServer(appUrl, bridge, authToken);
1946
+ void registerConnectionWithServer(appUrl, bridge, resolveAuthToken());
1947
+ } else {
1948
+ // No app URL means the token never reaches the DB — surface it instead of
1949
+ // silently skipping, since live-edit will then 401.
1950
+ console.error(
1951
+ "[design connect] No app URL resolved (pass --app-url or set AGENT_NATIVE_URL); skipping self-registration — live-edit will fail to authorize.",
1952
+ );
1909
1953
  }
1910
1954
 
1911
1955
  return await new Promise<number>((resolve) => {
@@ -246,6 +246,15 @@ patterns live in `.agents/skills/`.
246
246
  the latest localhost connection or a specific `connectionId`. Pass `routes`
247
247
  with `path`/`url` when visualizing a flow; pass `paths` for a concise route
248
248
  list. Then call `navigate --view editor --designId <id> --editorView overview`.
249
+ - `write-local-file`: writes/patches a local file through the bridge, but only
250
+ when a user-approved write-consent grant exists. Granting is human-only
251
+ (`grant-localhost-write-consent` is hidden from agents), so you cannot approve
252
+ it yourself.
253
+ - `request-localhost-write-consent`: call this when `write-local-file` fails
254
+ with "no write-consent grant". It opens the write-consent dialog in the
255
+ editor (or reports `alreadyGranted`). Tell the user to click "Allow writes",
256
+ then retry `write-local-file`. Do not keep retrying blindly — the write stays
257
+ blocked until the user approves.
249
258
 
250
259
  ## Review, Breakpoints, Screen States & Components
251
260
 
@@ -0,0 +1,141 @@
1
+ import { defineAction } from "@agent-native/core";
2
+ import {
3
+ readAppStateForCurrentTab,
4
+ writeAppState,
5
+ } from "@agent-native/core/application-state";
6
+ import { getRequestUserEmail } from "@agent-native/core/server/request-context";
7
+ import { assertAccess } from "@agent-native/core/sharing";
8
+ import { and, eq } from "drizzle-orm";
9
+ import { z } from "zod";
10
+
11
+ import { getDb, schema } from "../server/db/index.js";
12
+
13
+ /**
14
+ * Surface the LocalhostWriteConsentDialog so the user can approve local file
15
+ * writes. Granting is human-only (`grant-localhost-write-consent` is
16
+ * `agentTool: false`), so an agent writing from chat can only *request* the
17
+ * prompt: this writes an app-state key the editor observes and opens the dialog.
18
+ * If a valid grant already exists it reports that instead of prompting again.
19
+ */
20
+ export default defineAction({
21
+ description:
22
+ "Prompt the user to allow local file writes for a design's localhost " +
23
+ "connection by opening the write-consent dialog in the editor. Write " +
24
+ "consent itself is human-only and cannot be granted by the agent. Call " +
25
+ "this when write-local-file fails because no write-consent grant exists, " +
26
+ "then retry write-local-file after the user approves. Requires editor " +
27
+ "access on the design.",
28
+ schema: z.object({
29
+ designId: z.string().describe("Design ID."),
30
+ connectionId: z
31
+ .string()
32
+ .describe("Localhost connection ID (from list-localhost-connections)."),
33
+ files: z
34
+ .array(z.string())
35
+ .optional()
36
+ .describe("File paths about to be written, shown in the dialog."),
37
+ }),
38
+ run: async ({ designId, connectionId, files }) => {
39
+ await assertAccess("design", designId, "editor");
40
+
41
+ const ownerEmail = getRequestUserEmail();
42
+ if (!ownerEmail) throw new Error("no authenticated user");
43
+
44
+ const db = getDb();
45
+ const [connection] = await db
46
+ .select({
47
+ rootPath: schema.designLocalhostConnections.rootPath,
48
+ bridgeToken: schema.designLocalhostConnections.bridgeToken,
49
+ })
50
+ .from(schema.designLocalhostConnections)
51
+ .where(
52
+ and(
53
+ eq(schema.designLocalhostConnections.id, connectionId),
54
+ eq(schema.designLocalhostConnections.ownerEmail, ownerEmail),
55
+ ),
56
+ )
57
+ .limit(1);
58
+
59
+ if (!connection) {
60
+ throw new Error(
61
+ `Localhost connection "${connectionId}" not found for the current user.`,
62
+ );
63
+ }
64
+
65
+ // Fail fast on the same preconditions grant-localhost-write-consent
66
+ // enforces, so we never show a dialog that would hard-fail on approval —
67
+ // or one labeled with the connection id instead of a real folder.
68
+ if (!connection.rootPath || !connection.bridgeToken) {
69
+ throw new Error(
70
+ `Connection "${connectionId}" is not ready for writes (missing root ` +
71
+ "path or bridge token). Re-run `npx @agent-native/core@latest design " +
72
+ "connect` so the CLI records both, then retry.",
73
+ );
74
+ }
75
+
76
+ // Skip the prompt when a non-expired grant already covers this connection —
77
+ // the agent can just retry write-local-file.
78
+ const [grant] = await db
79
+ .select({
80
+ grantedUntil: schema.designLocalhostWriteGrants.grantedUntil,
81
+ })
82
+ .from(schema.designLocalhostWriteGrants)
83
+ .where(
84
+ and(
85
+ eq(schema.designLocalhostWriteGrants.designId, designId),
86
+ eq(schema.designLocalhostWriteGrants.connectionId, connectionId),
87
+ eq(schema.designLocalhostWriteGrants.ownerEmail, ownerEmail),
88
+ ),
89
+ )
90
+ .limit(1);
91
+ if (grant && grant.grantedUntil > new Date().toISOString()) {
92
+ return {
93
+ designId,
94
+ connectionId,
95
+ alreadyGranted: true,
96
+ message:
97
+ "A valid write-consent grant already exists. Retry write-local-file.",
98
+ };
99
+ }
100
+
101
+ await writeAppState(`design-localhost-write-consent-request:${designId}`, {
102
+ designId,
103
+ connectionId,
104
+ rootPath: connection.rootPath,
105
+ files: files ?? [],
106
+ requestedAt: new Date().toISOString(),
107
+ });
108
+
109
+ // The dialog only renders from this design's editor, so only claim it
110
+ // surfaced when the user is actually there. Otherwise the request stays
111
+ // queued and fires when they open the design — report that honestly instead
112
+ // of implying a dialog is on screen.
113
+ const navigation = await readAppStateForCurrentTab("navigation").catch(
114
+ () => null,
115
+ );
116
+ const onThisEditor =
117
+ navigation?.["view"] === "editor" &&
118
+ navigation?.["designId"] === designId;
119
+
120
+ if (onThisEditor) {
121
+ return {
122
+ designId,
123
+ connectionId,
124
+ surfaced: true,
125
+ message:
126
+ "Opened the write-consent dialog. Ask the user to click 'Allow " +
127
+ "writes', then retry write-local-file.",
128
+ };
129
+ }
130
+
131
+ return {
132
+ designId,
133
+ connectionId,
134
+ surfaced: false,
135
+ message:
136
+ "Queued a write-consent request, but the user is not on this design's " +
137
+ "editor so no dialog is showing yet. Ask them to open the design; the " +
138
+ "prompt appears then, and you can retry write-local-file after they approve.",
139
+ };
140
+ },
141
+ });
@@ -1315,25 +1315,21 @@ export function DesignCanvas({
1315
1315
  (fetchedExternalSnapshot?.url === rawExternalPreviewUrl
1316
1316
  ? fetchedExternalSnapshot.html
1317
1317
  : undefined);
1318
+ // Bake a neutral scale of 1 here (not the zoom-folded scale): this script is
1319
+ // registered with the localhost bridge via a large POST, so folding live zoom
1320
+ // in would re-fire the registration effect on every zoom tick. Live scale is
1321
+ // pushed separately over the `set-editor-chrome-scale` postMessage below.
1318
1322
  const editorChromeBridgeForCurrentState = useMemo(
1319
1323
  () =>
1320
1324
  buildEditorChromeBridgeScript({
1321
1325
  readOnly,
1322
1326
  editMode,
1323
- editorChromeScaleX: effectiveEditorChromeScaleX,
1324
- editorChromeScaleY: effectiveEditorChromeScaleY,
1327
+ editorChromeScaleX: 1,
1328
+ editorChromeScaleY: 1,
1325
1329
  screenId: screenId ?? contentKey ?? "",
1326
1330
  boardSurface,
1327
1331
  }),
1328
- [
1329
- boardSurface,
1330
- contentKey,
1331
- editMode,
1332
- effectiveEditorChromeScaleX,
1333
- effectiveEditorChromeScaleY,
1334
- readOnly,
1335
- screenId,
1336
- ],
1332
+ [boardSurface, contentKey, editMode, readOnly, screenId],
1337
1333
  );
1338
1334
  const embeddedWheelBridgeForCurrentState = useMemo(
1339
1335
  () =>
@@ -1400,6 +1396,9 @@ export function DesignCanvas({
1400
1396
  onExternalContentSnapshotRef.current = onExternalContentSnapshot;
1401
1397
  }, [onExternalContentSnapshot]);
1402
1398
 
1399
+ // Register the editor bridge script with the localhost live-edit bridge so
1400
+ // it gets injected into the proxied preview. Re-runs only when the script
1401
+ // content (liveEditBridgeKey) or the bridge target changes.
1403
1402
  useEffect(() => {
1404
1403
  if (!usesLiveEditEditorBridge || !bridgeUrl) {
1405
1404
  setRegisteredLiveEditBridgeKey(null);
@@ -1410,8 +1409,8 @@ export function DesignCanvas({
1410
1409
  current === liveEditBridgeKey ? current : null,
1411
1410
  );
1412
1411
  void (async () => {
1412
+ const endpoint = new URL("/live-edit-bridge", bridgeUrl).toString();
1413
1413
  try {
1414
- const endpoint = new URL("/live-edit-bridge", bridgeUrl).toString();
1415
1414
  const response = await fetch(endpoint, {
1416
1415
  method: "POST",
1417
1416
  headers: {
@@ -1423,15 +1422,10 @@ export function DesignCanvas({
1423
1422
  if (!response.ok) {
1424
1423
  throw new Error(`Bridge registration failed (${response.status})`);
1425
1424
  }
1426
- if (!cancelled) {
1427
- setRegisteredLiveEditBridgeKey(liveEditBridgeKey);
1428
- }
1425
+ if (!cancelled) setRegisteredLiveEditBridgeKey(liveEditBridgeKey);
1429
1426
  } catch (error) {
1430
1427
  if (!cancelled) {
1431
- console.warn(
1432
- "[DesignCanvas] live edit bridge registration failed",
1433
- error,
1434
- );
1428
+ console.warn("live-edit bridge registration failed", error);
1435
1429
  setRegisteredLiveEditBridgeKey(null);
1436
1430
  }
1437
1431
  }
@@ -59,7 +59,8 @@ export async function verifyWriteGrant(
59
59
  if (!grant) {
60
60
  throw new Error(
61
61
  "No localhost write-consent grant found for this design + connection. " +
62
- "The user must approve writes via the LocalhostWriteConsentDialog first.",
62
+ "Call request-localhost-write-consent to prompt the user, then retry " +
63
+ "this write after they click 'Allow writes'.",
63
64
  );
64
65
  }
65
66
 
@@ -67,7 +68,8 @@ export async function verifyWriteGrant(
67
68
  if (grant.grantedUntil < now) {
68
69
  throw new Error(
69
70
  `Localhost write-consent grant expired at ${grant.grantedUntil}. ` +
70
- "Request a new grant via the LocalhostWriteConsentDialog.",
71
+ "Call request-localhost-write-consent to prompt the user for a new " +
72
+ "grant, then retry this write.",
71
73
  );
72
74
  }
73
75
 
@@ -1 +1 @@
1
- {"version":3,"file":"design-connect.d.ts","sourceRoot":"","sources":["../../src/cli/design-connect.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"design-connect.d.ts","sourceRoot":"","sources":["../../src/cli/design-connect.ts"],"names":[],"mappings":"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"}
@@ -563,8 +563,31 @@ function addLiveEditBaseHref(html, href) {
563
563
  }
564
564
  return `<!DOCTYPE html><html><head>${baseTag}<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"></head><body>${html}</body></html>`;
565
565
  }
566
- function injectLiveEditBridge(html, targetUrl, script) {
567
- const withBase = addLiveEditBaseHref(html, targetUrl);
566
+ /**
567
+ * Rewrite the iframe path to the real target route before the proxied app's
568
+ * bundle runs. The bridge serves snapshots from its own `/live-edit` path, so a
569
+ * client-side-routed SPA would otherwise boot at "/live-edit", match no route,
570
+ * and render its 404. A synchronous inline script in `<head>` runs during parse
571
+ * (before deferred module bundles), so `history.replaceState` lands the SPA on
572
+ * the intended route. Assets still resolve via the injected `<base href>`.
573
+ */
574
+ function injectPreBootLocationShim(html, targetPath) {
575
+ const path = targetPath.trim();
576
+ if (!path || path === "/live-edit")
577
+ return html;
578
+ const shim = `<script data-agent-native-live-edit-location>
579
+ (function(){try{var p=${JSON.stringify(path)};if(p&&(location.pathname+location.search)!==p){history.replaceState(null,"",p);}}catch(e){}})();
580
+ </script>`;
581
+ if (/<head\b[^>]*>/i.test(html)) {
582
+ return html.replace(/<head\b[^>]*>/i, (match) => `${match}${shim}`);
583
+ }
584
+ if (/<html\b[^>]*>/i.test(html)) {
585
+ return html.replace(/<html\b[^>]*>/i, (match) => `${match}<head>${shim}</head>`);
586
+ }
587
+ return `${shim}${html}`;
588
+ }
589
+ function injectLiveEditBridge(html, baseHref, script, targetPath) {
590
+ const withBase = injectPreBootLocationShim(addLiveEditBaseHref(html, baseHref), targetPath);
568
591
  if (!script)
569
592
  return withBase;
570
593
  if (withBase.includes("</body>")) {
@@ -1073,7 +1096,12 @@ export async function startDesignConnectBridge(manifest) {
1073
1096
  requestUrl.searchParams.get("path"));
1074
1097
  const snapshot = await fetchPreviewSnapshot(manifest.devServerUrl, targetUrl);
1075
1098
  const includeEditorBridge = requestUrl.searchParams.get("bridge") !== "0";
1076
- const html = injectLiveEditBridge(snapshot.html, new URL("/", manifest.bridgeUrl).toString(), includeEditorBridge ? liveEditBridgeScript : "");
1099
+ // The dev server route the SPA must boot on (e.g. "/todo"), taken
1100
+ // from the resolved snapshot target rather than the bridge's own
1101
+ // "/live-edit" request path.
1102
+ const targetParsed = new URL(targetUrl);
1103
+ const targetPath = `${targetParsed.pathname}${targetParsed.search}` || "/";
1104
+ const html = injectLiveEditBridge(snapshot.html, new URL("/", manifest.bridgeUrl).toString(), includeEditorBridge ? liveEditBridgeScript : "", targetPath);
1077
1105
  sendText(res, snapshot.status >= 400 ? snapshot.status : 200, html, snapshot.contentType.includes("html")
1078
1106
  ? snapshot.contentType
1079
1107
  : "text/html; charset=utf-8");
@@ -1577,15 +1605,17 @@ export async function runDesign(argv) {
1577
1605
  console.error(`Manifest: ${manifest.bridgeUrl}/manifest.json`);
1578
1606
  console.error(`Routes: ${manifest.routeCount}`);
1579
1607
  console.error(`Dev URL: ${manifest.devServerUrl}`);
1580
- // Self-register with the design app server (best-effort). When an app URL
1581
- // is available (via --app-url or env var) the CLI POSTs the bridge token to
1582
- // connect-localhost so the server row stores the real token. Without this
1583
- // step grant-localhost-write-consent would mint a different token, causing
1584
- // every bridge write to return 401.
1608
+ // Self-register with the design app server (best-effort): POST the bridge
1609
+ // token to connect-localhost so the server row stores the real token. Without
1610
+ // it, the bridge and server tokens diverge and every write returns 401.
1585
1611
  const appUrl = resolveAppUrl(parsed.appUrl);
1586
1612
  if (appUrl) {
1587
- const authToken = resolveAuthToken();
1588
- void registerConnectionWithServer(appUrl, bridge, authToken);
1613
+ void registerConnectionWithServer(appUrl, bridge, resolveAuthToken());
1614
+ }
1615
+ else {
1616
+ // No app URL means the token never reaches the DB — surface it instead of
1617
+ // silently skipping, since live-edit will then 401.
1618
+ console.error("[design connect] No app URL resolved (pass --app-url or set AGENT_NATIVE_URL); skipping self-registration — live-edit will fail to authorize.");
1589
1619
  }
1590
1620
  return await new Promise((resolve) => {
1591
1621
  const stop = () => {
@@ -1 +1 @@
1
- {"version":3,"file":"design-connect.js","sourceRoot":"","sources":["../../src/cli/design-connect.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn } from \"node:child_process\";\nimport crypto from \"node:crypto\";\nimport fsSync from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport http, {\n type IncomingMessage,\n type Server,\n type ServerResponse,\n} from \"node:http\";\nimport path from \"node:path\";\n\nconst DEFAULT_BRIDGE_PORT = 7331;\nconst ROUTE_MANIFEST_FILE = path.join(\".agent-native\", \"design-routes.json\");\nconst DEFAULT_DEV_SERVER_CANDIDATES = [\n \"http://127.0.0.1:5173\",\n \"http://localhost:5173\",\n \"http://127.0.0.1:3000\",\n \"http://localhost:3000\",\n \"http://127.0.0.1:8080\",\n \"http://localhost:8080\",\n];\n\nconst BRIDGE_OPERATIONS = [\n \"select\",\n \"resolveNodeToFile\",\n \"readFile\",\n \"applyEdit\",\n \"writeFile\",\n \"captureSnapshot\",\n \"captureState\",\n \"listFiles\",\n] as const;\n\ntype BridgeOperation = (typeof BRIDGE_OPERATIONS)[number];\n\nconst SERVER_REGISTRATION_BRIDGE_OPERATIONS = new Set<BridgeOperation>([\n \"select\",\n \"resolveNodeToFile\",\n \"readFile\",\n \"applyEdit\",\n \"writeFile\",\n \"captureSnapshot\",\n \"captureState\",\n]);\n\n/** Additive manifest capability flags advertised alongside the operation list. */\nconst MANIFEST_CAPABILITIES = {\n listFiles: true,\n readTextFiles: true,\n writeTextFiles: true,\n} as const;\n\nexport interface DesignConnectArgs {\n url?: string;\n port: number;\n root: string;\n routeManifest?: string;\n /** Optional deployed design app URL used to self-register the bridge on\n * startup. When set (or when AGENT_NATIVE_URL / DESIGN_APP_URL env vars\n * are present) the CLI POSTs to `/_agent-native/actions/connect-localhost`\n * with the real bridge token so the server can store it for grant minting. */\n appUrl?: string;\n json: boolean;\n once: boolean;\n dryRun: boolean;\n daemon: boolean;\n help: boolean;\n}\n\nexport interface DesignConnectRoute {\n id: string;\n path: string;\n title: string;\n sourceFile?: string;\n sourceKind: \"react-router\" | \"html\" | \"manual\";\n}\n\nexport interface DesignConnectManifest {\n version: 1;\n source: \"agent-native-design-connect\";\n sourceType: \"localhost\";\n localOnly: true;\n devServerUrl: string;\n bridgeUrl: string;\n rootPath: string;\n routeManifestPath: string;\n routeManifestCreated: boolean;\n routes: DesignConnectRoute[];\n routeCount: number;\n generatedAt: string;\n capabilities: Array<{\n operation: BridgeOperation;\n status: \"available\" | \"planned\" | \"disabled\";\n reason?: string;\n }>;\n /**\n * Additive high-level capability flags beyond the low-level operation list.\n * `connect-localhost` persists this so `list-design-source-capabilities` can\n * reflect readFile/writeFile/listFiles availability for localhost sources.\n */\n manifestCapabilities: typeof MANIFEST_CAPABILITIES;\n}\n\nexport interface DesignConnectBridge {\n server: Server;\n manifest: DesignConnectManifest;\n /** Per-rootPath bridge token. Kept in-process only; never serialised into\n * the manifest JSON so it is not exposed over the network via GET /manifest.\n * The server-side grant action reads it from the running bridge instance. */\n bridgeToken: string;\n}\n\nfunction stringFlagValue(argv: string[], index: number, flag: string) {\n const value = argv[index + 1];\n if (!value || value.startsWith(\"-\")) {\n throw new Error(`${flag} requires a value`);\n }\n return value;\n}\n\nfunction normalizeSlash(value: string) {\n return value.replace(/\\\\/g, \"/\");\n}\n\nfunction normalizeHttpUrl(value: string): string {\n const raw = value.trim();\n const withProtocol = /^[a-z]+:\\/\\//i.test(raw) ? raw : `http://${raw}`;\n const parsed = new URL(withProtocol);\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n throw new Error(\"--url must be an http(s) URL\");\n }\n parsed.hash = \"\";\n return parsed.toString().replace(/\\/$/, \"\");\n}\n\nexport function parseDesignConnectArgs(argv: string[]): DesignConnectArgs {\n const args = argv[0] === \"connect\" ? argv.slice(1) : argv;\n const parsed: DesignConnectArgs = {\n port: DEFAULT_BRIDGE_PORT,\n root: process.cwd(),\n json: false,\n once: false,\n dryRun: false,\n daemon: false,\n help: false,\n };\n\n for (let index = 0; index < args.length; index += 1) {\n const arg = args[index]!;\n if (arg === \"help\" || arg === \"--help\" || arg === \"-h\") {\n parsed.help = true;\n } else if (arg === \"--url\") {\n parsed.url = stringFlagValue(args, index, arg);\n index += 1;\n } else if (arg.startsWith(\"--url=\")) {\n parsed.url = arg.slice(\"--url=\".length);\n } else if (arg === \"--port\") {\n parsed.port = Number.parseInt(stringFlagValue(args, index, arg), 10);\n index += 1;\n } else if (arg.startsWith(\"--port=\")) {\n parsed.port = Number.parseInt(arg.slice(\"--port=\".length), 10);\n } else if (arg === \"--root\") {\n parsed.root = stringFlagValue(args, index, arg);\n index += 1;\n } else if (arg.startsWith(\"--root=\")) {\n parsed.root = arg.slice(\"--root=\".length);\n } else if (arg === \"--route-manifest\") {\n parsed.routeManifest = stringFlagValue(args, index, arg);\n index += 1;\n } else if (arg.startsWith(\"--route-manifest=\")) {\n parsed.routeManifest = arg.slice(\"--route-manifest=\".length);\n } else if (arg === \"--app-url\") {\n parsed.appUrl = stringFlagValue(args, index, arg);\n index += 1;\n } else if (arg.startsWith(\"--app-url=\")) {\n parsed.appUrl = arg.slice(\"--app-url=\".length);\n } else if (arg === \"--json\") {\n parsed.json = true;\n parsed.once = true;\n } else if (arg === \"--once\") {\n parsed.once = true;\n } else if (arg === \"--dry-run\") {\n parsed.dryRun = true;\n parsed.once = true;\n } else if (arg === \"--daemon\") {\n parsed.daemon = true;\n } else if (arg.startsWith(\"-\")) {\n throw new Error(`Unknown option: ${arg}`);\n } else {\n throw new Error(`Unexpected argument: ${arg}`);\n }\n }\n\n if (!Number.isInteger(parsed.port) || parsed.port <= 0) {\n throw new Error(\"--port must be a positive integer\");\n }\n if (parsed.daemon && (parsed.json || parsed.once || parsed.dryRun)) {\n throw new Error(\n \"--daemon cannot be combined with --json, --once, or --dry-run\",\n );\n }\n parsed.root = path.resolve(parsed.root);\n parsed.url = parsed.url ? normalizeHttpUrl(parsed.url) : undefined;\n return parsed;\n}\n\nfunction routeId(routePath: string): string {\n if (routePath === \"/\") return \"route-root\";\n const slug = routePath\n .replace(/^\\/+/, \"\")\n .replace(/[^a-zA-Z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .toLowerCase();\n return slug ? `route-${slug}` : \"route-wildcard\";\n}\n\nfunction titleFromRoutePath(routePath: string): string {\n if (routePath === \"/\") return \"Home\";\n if (routePath === \"/*\" || routePath === \"*\") return \"Wildcard\";\n return (\n routePath\n .replace(/^\\/+/, \"\")\n .replace(/[:$]/g, \"\")\n .replace(/[-_/]+/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim()\n .replace(/\\b\\w/g, (char) => char.toUpperCase()) || \"Screen\"\n );\n}\n\nfunction walkFiles(dir: string, files: string[] = []): string[] {\n if (!fsSync.existsSync(dir)) return files;\n for (const entry of fsSync.readdirSync(dir, { withFileTypes: true })) {\n if (entry.name === \"node_modules\" || entry.name === \".git\") continue;\n const absolute = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n walkFiles(absolute, files);\n } else {\n files.push(absolute);\n }\n }\n return files;\n}\n\nfunction routePathFromReactRouterFile(filePath: string, routesDir: string) {\n const withoutExt = normalizeSlash(path.relative(routesDir, filePath)).replace(\n /\\.[cm]?[jt]sx?$/,\n \"\",\n );\n const parts: string[] = [];\n for (const segment of withoutExt.split(\"/\")) {\n for (const token of segment.split(\".\")) {\n if (!token || token === \"route\" || token === \"index\") continue;\n if (token === \"_index\") continue;\n if (token.startsWith(\"_\")) continue;\n const pathToken = token.endsWith(\"_\") ? token.slice(0, -1) : token;\n if (pathToken === \"$\") {\n parts.push(\"*\");\n } else if (pathToken.startsWith(\"$\")) {\n const param = pathToken.slice(1) || \"param\";\n parts.push(`:${param}`);\n } else {\n parts.push(pathToken);\n }\n }\n }\n return `/${parts.join(\"/\")}`.replace(/\\/+/g, \"/\");\n}\n\nexport function discoverDesignRoutes(root: string): DesignConnectRoute[] {\n const absoluteRoot = path.resolve(root);\n const routeDirs = [\n path.join(absoluteRoot, \"app\", \"routes\"),\n path.join(absoluteRoot, \"src\", \"routes\"),\n path.join(absoluteRoot, \"pages\"),\n ].filter((dir) => fsSync.existsSync(dir));\n const routes = new Map<string, DesignConnectRoute>();\n\n for (const routeDir of routeDirs) {\n for (const file of walkFiles(routeDir)) {\n if (!/\\.[cm]?[jt]sx?$/.test(file)) continue;\n if (/\\.test\\.|\\.spec\\./.test(file)) continue;\n const pathName = routePathFromReactRouterFile(file, routeDir);\n routes.set(pathName, {\n id: routeId(pathName),\n path: pathName,\n title: titleFromRoutePath(pathName),\n sourceFile: normalizeSlash(path.relative(absoluteRoot, file)),\n sourceKind: \"react-router\",\n });\n }\n }\n\n if (routes.size === 0) {\n for (const dir of [absoluteRoot, path.join(absoluteRoot, \"public\")]) {\n for (const file of walkFiles(dir)) {\n if (!file.endsWith(\".html\")) continue;\n const rel = normalizeSlash(path.relative(dir, file));\n const pathName =\n rel === \"index.html\" ? \"/\" : `/${rel.replace(/\\.html$/, \"\")}`;\n routes.set(pathName, {\n id: routeId(pathName),\n path: pathName,\n title: titleFromRoutePath(pathName),\n sourceFile: normalizeSlash(path.relative(absoluteRoot, file)),\n sourceKind: \"html\",\n });\n }\n }\n }\n\n return [...routes.values()].sort((a, b) => {\n if (a.path === \"/\") return -1;\n if (b.path === \"/\") return 1;\n return a.path.localeCompare(b.path);\n });\n}\n\nasync function probeDevServer(url: string): Promise<boolean> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 800);\n try {\n const response = await fetch(url, {\n method: \"GET\",\n signal: controller.signal,\n });\n return response.status < 500;\n } catch {\n return false;\n } finally {\n clearTimeout(timeout);\n }\n}\n\nasync function waitForBridgeHealth(\n bridgeUrl: string,\n timeoutMs = 5_000,\n): Promise<boolean> {\n const healthUrl = new URL(\"/health\", bridgeUrl).toString();\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline) {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 400);\n try {\n const response = await fetch(healthUrl, {\n method: \"GET\",\n signal: controller.signal,\n });\n if (response.ok) return true;\n } catch {\n // Keep polling until the detached process finishes binding the port.\n } finally {\n clearTimeout(timeout);\n }\n await new Promise((resolve) => setTimeout(resolve, 150));\n }\n return false;\n}\n\nfunction isDesignConnectManifest(\n value: unknown,\n): value is DesignConnectManifest {\n if (!value || typeof value !== \"object\") return false;\n const manifest = value as Partial<DesignConnectManifest>;\n return (\n manifest.version === 1 &&\n manifest.source === \"agent-native-design-connect\" &&\n manifest.sourceType === \"localhost\" &&\n manifest.localOnly === true &&\n typeof manifest.devServerUrl === \"string\" &&\n typeof manifest.bridgeUrl === \"string\" &&\n typeof manifest.rootPath === \"string\"\n );\n}\n\nasync function fetchRunningBridgeManifest(\n bridgeUrl: string,\n): Promise<DesignConnectManifest | null> {\n const manifestUrl = new URL(\"/manifest.json\", bridgeUrl).toString();\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 800);\n try {\n const response = await fetch(manifestUrl, {\n method: \"GET\",\n signal: controller.signal,\n });\n if (!response.ok) return null;\n const body = (await response.json()) as unknown;\n return isDesignConnectManifest(body) ? body : null;\n } catch {\n return null;\n } finally {\n clearTimeout(timeout);\n }\n}\n\nexport function designConnectManifestsTargetSameApp(\n running: Pick<DesignConnectManifest, \"devServerUrl\" | \"rootPath\">,\n requested: Pick<DesignConnectManifest, \"devServerUrl\" | \"rootPath\">,\n): boolean {\n let runningUrl = running.devServerUrl;\n let requestedUrl = requested.devServerUrl;\n try {\n runningUrl = normalizeHttpUrl(runningUrl);\n requestedUrl = normalizeHttpUrl(requestedUrl);\n } catch {\n // Fall through to direct string comparison for malformed legacy manifests.\n }\n return (\n runningUrl === requestedUrl &&\n path.resolve(running.rootPath) === path.resolve(requested.rootPath)\n );\n}\n\nasync function resolveDevServerUrl(url?: string): Promise<string> {\n if (url) return normalizeHttpUrl(url);\n for (const candidate of DEFAULT_DEV_SERVER_CANDIDATES) {\n if (await probeDevServer(candidate)) return candidate;\n }\n return DEFAULT_DEV_SERVER_CANDIDATES[0]!;\n}\n\nasync function ensureRouteManifest(options: {\n root: string;\n routeManifestPath: string;\n routes: DesignConnectRoute[];\n devServerUrl: string;\n dryRun: boolean;\n}): Promise<{ path: string; created: boolean }> {\n const manifestPath = path.isAbsolute(options.routeManifestPath)\n ? options.routeManifestPath\n : path.join(options.root, options.routeManifestPath);\n if (fsSync.existsSync(manifestPath)) {\n return { path: manifestPath, created: false };\n }\n if (!options.dryRun) {\n await fs.mkdir(path.dirname(manifestPath), { recursive: true });\n await fs.writeFile(\n manifestPath,\n `${JSON.stringify(\n {\n version: 1,\n sourceType: \"localhost\",\n devServerUrl: options.devServerUrl,\n rootPath: options.root,\n routes: options.routes,\n generatedAt: new Date().toISOString(),\n },\n null,\n 2,\n )}\\n`,\n \"utf8\",\n );\n }\n return { path: manifestPath, created: !options.dryRun };\n}\n\nexport async function prepareDesignConnectManifest(\n options: Partial<DesignConnectArgs> & { root?: string } = {},\n): Promise<DesignConnectManifest> {\n const root = path.resolve(options.root ?? process.cwd());\n const port = options.port ?? DEFAULT_BRIDGE_PORT;\n const devServerUrl = await resolveDevServerUrl(options.url);\n const bridgeUrl = `http://127.0.0.1:${port}`;\n const routes = discoverDesignRoutes(root);\n const routeManifest = await ensureRouteManifest({\n root,\n routeManifestPath: options.routeManifest ?? ROUTE_MANIFEST_FILE,\n routes,\n devServerUrl,\n dryRun: Boolean(options.dryRun),\n });\n const generatedAt = new Date().toISOString();\n\n return {\n version: 1,\n source: \"agent-native-design-connect\",\n sourceType: \"localhost\",\n localOnly: true,\n devServerUrl,\n bridgeUrl,\n rootPath: root,\n routeManifestPath: routeManifest.path,\n routeManifestCreated: routeManifest.created,\n routes,\n routeCount: routes.length,\n generatedAt,\n manifestCapabilities: MANIFEST_CAPABILITIES,\n capabilities: BRIDGE_OPERATIONS.map((operation) => ({\n operation,\n status: \"available\" as const,\n reason:\n operation === \"resolveNodeToFile\"\n ? // resolveNodeToFile maps a runtime DOM node id (from the editor's\n // 'select' payload) to { file, line, component } provenance. The\n // bridge endpoint exists; per-element provenance data must be\n // emitted by the connected app at build time — see the provenance\n // note in the help text below.\n \"Requires the connected app to emit data-source-file / data-source-line / data-component-name attributes (e.g. via @vitejs/plugin-react jsxDEV or a Babel source plugin).\"\n : undefined,\n })),\n };\n}\n\nfunction sendJson(\n res: ServerResponse,\n statusCode: number,\n body: Record<string, unknown>,\n) {\n res.writeHead(statusCode, {\n \"content-type\": \"application/json; charset=utf-8\",\n \"access-control-allow-origin\": \"*\",\n \"access-control-allow-methods\": \"GET, POST, OPTIONS\",\n \"access-control-allow-headers\": \"content-type, x-bridge-token\",\n \"access-control-allow-private-network\": \"true\",\n });\n res.end(`${JSON.stringify(body, null, 2)}\\n`);\n}\n\nfunction sendText(\n res: ServerResponse,\n statusCode: number,\n body: string,\n contentType: string,\n) {\n res.writeHead(statusCode, {\n \"content-type\": contentType,\n \"access-control-allow-origin\": \"*\",\n \"access-control-allow-methods\": \"GET, POST, OPTIONS\",\n \"access-control-allow-headers\": \"content-type, x-bridge-token\",\n \"access-control-allow-private-network\": \"true\",\n });\n res.end(body);\n}\n\nfunction sendBytes(\n res: ServerResponse,\n statusCode: number,\n body: Buffer,\n headers: Headers,\n) {\n const responseHeaders: Record<string, string> = {\n \"access-control-allow-origin\": \"*\",\n \"access-control-allow-methods\": \"GET, HEAD, POST, OPTIONS\",\n \"access-control-allow-headers\": \"content-type, x-bridge-token\",\n \"access-control-allow-private-network\": \"true\",\n };\n for (const name of [\n \"content-type\",\n \"cache-control\",\n \"etag\",\n \"last-modified\",\n ]) {\n const value = headers.get(name);\n if (value) responseHeaders[name] = value;\n }\n res.writeHead(statusCode, responseHeaders);\n res.end(body);\n}\n\nfunction sameOrigin(a: string, b: string): boolean {\n try {\n return new URL(a).origin === new URL(b).origin;\n } catch {\n return false;\n }\n}\n\nfunction resolvePreviewSnapshotUrl(\n devServerUrl: string,\n rawUrl: string | null,\n): string {\n const base = normalizeHttpUrl(devServerUrl);\n const parsed = new URL(rawUrl?.trim() || \"/\", `${base}/`);\n parsed.hash = \"\";\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n throw new Error(\"Snapshot URL must use http(s).\");\n }\n if (!sameOrigin(parsed.toString(), base)) {\n throw new Error(\"Snapshot URL must stay on the connected dev server.\");\n }\n return parsed.toString();\n}\n\nfunction resolvePreviewProxyUrl(\n devServerUrl: string,\n requestUrl: string | undefined,\n): string {\n const base = normalizeHttpUrl(devServerUrl);\n const parsedRequest = new URL(requestUrl ?? \"/\", base);\n const parsed = new URL(\n `${parsedRequest.pathname}${parsedRequest.search}`,\n `${base}/`,\n );\n parsed.hash = \"\";\n if (!sameOrigin(parsed.toString(), base)) {\n throw new Error(\"Proxy URL must stay on the connected dev server.\");\n }\n return parsed.toString();\n}\n\nasync function fetchPreviewSnapshot(\n devServerUrl: string,\n targetUrl: string,\n redirects = 0,\n): Promise<{\n url: string;\n status: number;\n contentType: string;\n html: string;\n}> {\n if (redirects > 5) {\n throw new Error(\"Too many redirects while fetching preview snapshot.\");\n }\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 10_000);\n try {\n const response = await fetch(targetUrl, {\n method: \"GET\",\n redirect: \"manual\",\n signal: controller.signal,\n headers: {\n accept: \"text/html,application/xhtml+xml;q=0.9,*/*;q=0.8\",\n },\n });\n const location = response.headers.get(\"location\");\n if (location && response.status >= 300 && response.status < 400) {\n const redirected = new URL(location, targetUrl);\n redirected.hash = \"\";\n if (!sameOrigin(redirected.toString(), devServerUrl)) {\n throw new Error(\"Snapshot redirect left the connected dev server.\");\n }\n return fetchPreviewSnapshot(\n devServerUrl,\n redirected.toString(),\n redirects + 1,\n );\n }\n return {\n url: response.url || targetUrl,\n status: response.status,\n contentType: response.headers.get(\"content-type\") ?? \"\",\n html: await response.text(),\n };\n } finally {\n clearTimeout(timeout);\n }\n}\n\nasync function fetchPreviewProxyResource(\n devServerUrl: string,\n targetUrl: string,\n redirects = 0,\n): Promise<{\n url: string;\n status: number;\n headers: Headers;\n body: Buffer;\n}> {\n if (redirects > 5) {\n throw new Error(\"Too many redirects while proxying preview resource.\");\n }\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 10_000);\n try {\n const response = await fetch(targetUrl, {\n method: \"GET\",\n redirect: \"manual\",\n signal: controller.signal,\n });\n const location = response.headers.get(\"location\");\n if (location && response.status >= 300 && response.status < 400) {\n const redirected = new URL(location, targetUrl);\n redirected.hash = \"\";\n if (!sameOrigin(redirected.toString(), devServerUrl)) {\n throw new Error(\"Proxy redirect left the connected dev server.\");\n }\n return fetchPreviewProxyResource(\n devServerUrl,\n redirected.toString(),\n redirects + 1,\n );\n }\n return {\n url: response.url || targetUrl,\n status: response.status,\n headers: response.headers,\n body: Buffer.from(await response.arrayBuffer()),\n };\n } finally {\n clearTimeout(timeout);\n }\n}\n\nfunction addLiveEditBaseHref(html: string, href: string): string {\n const escapedHref = href.replace(/&/g, \"&amp;\").replace(/\"/g, \"&quot;\");\n const baseTag = `<base href=\"${escapedHref}\">`;\n if (/<base\\b/i.test(html)) return html;\n if (/<head\\b[^>]*>/i.test(html)) {\n return html.replace(/<head\\b[^>]*>/i, (match) => `${match}${baseTag}`);\n }\n if (/<html\\b[^>]*>/i.test(html)) {\n return html.replace(\n /<html\\b[^>]*>/i,\n (match) => `${match}<head>${baseTag}</head>`,\n );\n }\n return `<!DOCTYPE html><html><head>${baseTag}<meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\"></head><body>${html}</body></html>`;\n}\n\nfunction injectLiveEditBridge(html: string, targetUrl: string, script: string) {\n const withBase = addLiveEditBaseHref(html, targetUrl);\n if (!script) return withBase;\n if (withBase.includes(\"</body>\")) {\n return withBase.replace(\"</body>\", `${script}</body>`);\n }\n if (withBase.includes(\"</html>\")) {\n return withBase.replace(\"</html>\", `${script}</html>`);\n }\n return `${withBase}${script}`;\n}\n\n/** Read the full request body as a UTF-8 string. */\nasync function readRequestBody(req: IncomingMessage): Promise<string> {\n return new Promise<string>((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n req.on(\"end\", () => resolve(Buffer.concat(chunks).toString(\"utf8\")));\n req.on(\"error\", reject);\n });\n}\n\n/**\n * Resolve `targetDir` under `rootPath` with realpath so that symlinks and\n * traversal sequences (../../etc) cannot escape the root. Throws if the\n * resolved path does not start with the resolved root.\n *\n * This also guards against a symlink LEAF inside root (e.g.\n * `rootPath/link.css` -> `/Users/me/.ssh/id_rsa`): the parent-directory\n * realpath check alone would pass confinement because the parent is inside\n * root, letting reads/writes silently follow the symlink outside root. After\n * the parent check we additionally lstat the target itself — if it exists and\n * is a symlink, or if its realpath resolves outside `resolvedRoot`, we reject.\n */\nasync function assertPathInside(\n rootPath: string,\n targetPath: string,\n): Promise<void> {\n const resolvedRoot = await fs.realpath(rootPath).catch(() => {\n throw new Error(`Bridge root path does not exist: ${rootPath}`);\n });\n\n // Resolve the parent directory (the file itself may not exist yet for writes).\n const targetParent = path.dirname(path.resolve(rootPath, targetPath));\n const resolvedParent = await fs.realpath(targetParent).catch(async () => {\n // Parent may not exist yet; walk up until we find a real ancestor.\n let candidate = targetParent;\n for (let i = 0; i < 32; i++) {\n const up = path.dirname(candidate);\n if (up === candidate) break;\n candidate = up;\n try {\n return await fs.realpath(candidate);\n } catch {\n // keep walking\n }\n }\n throw new Error(`Cannot resolve parent directory: ${targetParent}`);\n });\n\n if (\n !resolvedParent.startsWith(resolvedRoot + path.sep) &&\n resolvedParent !== resolvedRoot\n ) {\n throw new Error(`Path traversal detected: resolved target is outside root`);\n }\n\n // Reject a symlink LEAF, even though its parent directory is confined to\n // root. A pre-existing symlink at the target path (file or directory) could\n // otherwise be followed straight out of root by the caller's subsequent\n // fs.readFile/fs.writeFile call.\n const targetAbsolute = path.resolve(rootPath, targetPath);\n const lstat = await fs.lstat(targetAbsolute).catch(() => null);\n if (lstat?.isSymbolicLink()) {\n throw new Error(\n `Path traversal detected: \"${targetPath}\" is a symlink, which is not allowed inside the connected root`,\n );\n }\n if (lstat) {\n const resolvedTarget = await fs.realpath(targetAbsolute).catch(() => null);\n if (\n resolvedTarget &&\n resolvedTarget !== resolvedRoot &&\n !resolvedTarget.startsWith(resolvedRoot + path.sep)\n ) {\n throw new Error(\n `Path traversal detected: \"${targetPath}\" resolves outside the connected root`,\n );\n }\n }\n}\n\n/** Allowed file extensions for write/apply-edit operations. */\nconst ALLOWED_WRITE_EXTENSIONS = new Set([\n \".html\",\n \".htm\",\n \".css\",\n \".scss\",\n \".less\",\n \".js\",\n \".jsx\",\n \".ts\",\n \".tsx\",\n \".mjs\",\n \".cjs\",\n \".json\",\n \".md\",\n \".mdx\",\n \".vue\",\n \".svelte\",\n \".astro\",\n \".txt\",\n \".yml\",\n \".yaml\",\n \".svg\",\n]);\n\nfunction assertAllowedExtension(relPath: string): void {\n const ext = path.extname(relPath).toLowerCase();\n if (!ALLOWED_WRITE_EXTENSIONS.has(ext)) {\n throw new Error(\n `Write rejected: extension \"${ext || \"(no extension)\"}\" is not in the allowed text-file list for bridge writes.`,\n );\n }\n}\n\n/**\n * Blocklist for secret-looking paths. Applied to /read-file, /write-file,\n * /apply-edit, AND /list-files so secrets are never returned or served\n * through the bridge, even to a caller holding a valid write grant. Reads of\n * other dotfiles (.gitignore, .prettierrc, etc.) remain allowed.\n *\n * All comparisons are case-insensitive: macOS's default filesystem (and\n * Windows) is case-insensitive, so \".ENV\", \"ID_RSA\", or \"KEY.PEM\" refer to\n * the exact same on-disk file as their lowercase form and must be blocked\n * identically.\n */\nfunction isBlockedSecretPath(relPath: string): boolean {\n const normalized = normalizeSlash(relPath).replace(/^\\/+/, \"\").toLowerCase();\n const segments = normalized.split(\"/\").filter(Boolean);\n if (segments.some((segment) => segment === \".git\")) return true;\n const basename = segments[segments.length - 1] ?? normalized;\n if (/^\\.env/.test(basename)) return true;\n if (/\\.pem$/.test(basename)) return true;\n if (/\\.key$/.test(basename)) return true;\n if (/^id_rsa/.test(basename)) return true;\n return false;\n}\n\nfunction assertNotBlockedSecretPath(relPath: string): void {\n if (isBlockedSecretPath(relPath)) {\n throw new Error(\n `Access rejected: \"${relPath}\" matches a blocked secret-file pattern.`,\n );\n }\n}\n\n/**\n * Compute a cheap, stable version identifier for a file from its stat: mtime\n * plus size. Not a content hash — it is only meant to detect \"did this file\n * change on disk since the caller last read it\", the same tradeoff the inline\n * (SQL-backed) workspace provider's versionHash already makes. Returns\n * undefined when the file does not exist (new-file case).\n */\nasync function computeVersionHash(\n absolutePath: string,\n): Promise<string | undefined> {\n const stat = await fs.stat(absolutePath).catch(() => null);\n if (!stat) return undefined;\n return `${stat.mtimeMs}-${stat.size}`;\n}\n\nfunction countOccurrences(haystack: string, needle: string): number {\n if (!needle) return 0;\n let count = 0;\n let index = haystack.indexOf(needle);\n while (index !== -1) {\n count += 1;\n if (count > 1) return count;\n index = haystack.indexOf(needle, index + 1);\n }\n return count;\n}\n\n// ── /list-files: recursive walk with .gitignore + always-ignore + size/binary\n// filtering ───────────────────────────────────────────────────────────────\n\n/** Directories always excluded from /list-files, regardless of .gitignore. */\nconst ALWAYS_IGNORED_DIR_NAMES = new Set([\n \".git\",\n \"node_modules\",\n \"dist\",\n \"build\",\n \".next\",\n \".output\",\n \".nuxt\",\n \"coverage\",\n \".cache\",\n]);\n\nconst ALWAYS_IGNORED_FILE_NAMES = new Set([\".DS_Store\"]);\n\n/** Binary-looking extensions skipped from /list-files results. */\nconst BINARY_LOOKING_EXTENSIONS = new Set([\n \".png\",\n \".jpg\",\n \".jpeg\",\n \".gif\",\n \".webp\",\n \".ico\",\n \".woff\",\n \".woff2\",\n \".ttf\",\n \".otf\",\n \".eot\",\n \".mp3\",\n \".mp4\",\n \".mov\",\n \".webm\",\n \".zip\",\n \".gz\",\n \".tar\",\n \".pdf\",\n \".wasm\",\n \".fig\",\n \".sketch\",\n]);\n\nconst LIST_FILES_MAX_ENTRIES = 20_000;\nconst LIST_FILES_MAX_BYTES = 2 * 1024 * 1024;\n\nexport interface GitignoreRule {\n /** Raw pattern as read from .gitignore, already trimmed of comments/blank lines. */\n pattern: string;\n /** True when the pattern is anchored to the root (leading \"/\"). */\n anchored: boolean;\n /** True when the pattern only matches directories (trailing \"/\"). */\n dirOnly: boolean;\n}\n\n/**\n * Parse a simple subset of .gitignore syntax: exact names, `dir/`, `*.ext`,\n * and leading-slash root-anchored patterns. This intentionally does not\n * implement full gitignore glob semantics (double-star, negation, etc.) —\n * good enough to keep obviously-ignored build output and local files out of\n * the workbench file tree.\n */\nexport function parseGitignore(contents: string): GitignoreRule[] {\n const rules: GitignoreRule[] = [];\n for (const rawLine of contents.split(/\\r?\\n/)) {\n const line = rawLine.trim();\n if (!line || line.startsWith(\"#\")) continue;\n if (line.startsWith(\"!\")) continue; // negation unsupported in this subset\n const anchored = line.startsWith(\"/\");\n const withoutAnchor = anchored ? line.slice(1) : line;\n const dirOnly = withoutAnchor.endsWith(\"/\");\n const pattern = dirOnly ? withoutAnchor.slice(0, -1) : withoutAnchor;\n if (!pattern) continue;\n rules.push({ pattern, anchored, dirOnly });\n }\n return rules;\n}\n\nfunction globToRegExp(pattern: string): RegExp {\n let out = \"\";\n for (const char of pattern) {\n if (char === \"*\") out += \"[^/]*\";\n else if (char === \"?\") out += \"[^/]\";\n else out += char.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n return new RegExp(`^${out}$`);\n}\n\n/**\n * Test one path segment (or full relative path, for anchored patterns)\n * against a parsed gitignore rule.\n */\nfunction ruleMatches(\n rule: GitignoreRule,\n relPath: string,\n isDir: boolean,\n): boolean {\n if (rule.dirOnly && !isDir) return false;\n const regex = globToRegExp(rule.pattern);\n if (rule.anchored) {\n return regex.test(relPath);\n }\n // Unanchored: match against any path segment (basename) or the full path,\n // mirroring gitignore's \"matches at any depth\" behavior for simple patterns.\n const segments = relPath.split(\"/\");\n return segments.some((segment) => regex.test(segment)) || regex.test(relPath);\n}\n\nexport function isIgnoredByGitignore(\n rules: GitignoreRule[],\n relPath: string,\n isDir: boolean,\n): boolean {\n return rules.some((rule) => ruleMatches(rule, relPath, isDir));\n}\n\n/**\n * Pure predicate: should this file be excluded from /list-files results?\n * Combines the always-ignored directory/file names, the parsed .gitignore\n * rules, the binary-looking extension list, the secret-path blocklist, and\n * the per-file size cap. `sizeBytes` may be omitted when unknown (the always/\n * gitignore/binary/secret checks still apply).\n */\nexport function shouldExcludeFromListing(\n relPath: string,\n options: { gitignore: GitignoreRule[]; sizeBytes?: number },\n): boolean {\n const normalized = normalizeSlash(relPath).replace(/^\\/+/, \"\");\n const segments = normalized.split(\"/\").filter(Boolean);\n if (segments.some((segment) => ALWAYS_IGNORED_DIR_NAMES.has(segment))) {\n return true;\n }\n const basename = segments[segments.length - 1] ?? normalized;\n if (ALWAYS_IGNORED_FILE_NAMES.has(basename)) return true;\n if (isBlockedSecretPath(normalized)) return true;\n if (isIgnoredByGitignore(options.gitignore, normalized, false)) return true;\n // A `dir/` gitignore rule matches the file's ancestor directories too, not\n // just the file itself (e.g. \"build-output/\" must ignore\n // \"build-output/index.html\").\n for (let depth = 1; depth < segments.length; depth += 1) {\n const ancestorPath = segments.slice(0, depth).join(\"/\");\n if (isIgnoredByGitignore(options.gitignore, ancestorPath, true)) {\n return true;\n }\n }\n const ext = path.extname(basename).toLowerCase();\n if (BINARY_LOOKING_EXTENSIONS.has(ext)) return true;\n if (\n typeof options.sizeBytes === \"number\" &&\n options.sizeBytes > LIST_FILES_MAX_BYTES\n ) {\n return true;\n }\n return false;\n}\n\n/**\n * Should this directory be pruned entirely from the walk? Cheaper than\n * checking every descendant file individually once a directory itself is\n * ignored (always-ignored names, gitignore dir rules, or the .git/secret\n * blocklist).\n */\nfunction shouldPruneDirectory(\n relPath: string,\n gitignore: GitignoreRule[],\n): boolean {\n const normalized = normalizeSlash(relPath).replace(/^\\/+/, \"\");\n const segments = normalized.split(\"/\").filter(Boolean);\n const basename = segments[segments.length - 1] ?? normalized;\n if (ALWAYS_IGNORED_DIR_NAMES.has(basename)) return true;\n if (basename === \".git\") return true;\n if (isIgnoredByGitignore(gitignore, normalized, true)) return true;\n return false;\n}\n\nexport interface ListedBridgeFile {\n path: string;\n size: number;\n}\n\nexport interface ListFilesResult {\n files: ListedBridgeFile[];\n truncated: boolean;\n}\n\n/**\n * Recursively walk `rootPath`, honoring .gitignore + the always-ignore list +\n * binary/size/secret filtering, never following symlinks that would escape\n * root (delegates to `assertPathInside`'s realpath confinement per-entry).\n * Caps at `LIST_FILES_MAX_ENTRIES` and reports `truncated` when the cap is\n * hit.\n */\nasync function walkBridgeFiles(rootPath: string): Promise<ListFilesResult> {\n let gitignore: GitignoreRule[] = [];\n try {\n const raw = await fs.readFile(path.join(rootPath, \".gitignore\"), \"utf8\");\n gitignore = parseGitignore(raw);\n } catch {\n // No root .gitignore — proceed with only the always-ignore list.\n }\n\n const files: ListedBridgeFile[] = [];\n let truncated = false;\n const resolvedRoot = await fs.realpath(rootPath);\n\n async function walk(absoluteDir: string, relDir: string): Promise<void> {\n if (truncated) return;\n let entries: fsSync.Dirent[];\n try {\n entries = await fs.readdir(absoluteDir, { withFileTypes: true });\n } catch {\n return;\n }\n // Sort for deterministic output.\n entries.sort((a, b) => a.name.localeCompare(b.name));\n for (const entry of entries) {\n if (truncated) return;\n const relPath = relDir ? `${relDir}/${entry.name}` : entry.name;\n const absolutePath = path.join(absoluteDir, entry.name);\n\n if (entry.isSymbolicLink()) {\n // Never follow symlinks that escape root; resolve and re-check.\n let real: string;\n try {\n real = await fs.realpath(absolutePath);\n } catch {\n continue;\n }\n if (\n real !== resolvedRoot &&\n !real.startsWith(resolvedRoot + path.sep)\n ) {\n continue;\n }\n const stat = await fs.stat(absolutePath).catch(() => null);\n if (!stat) continue;\n if (stat.isDirectory()) {\n if (shouldPruneDirectory(relPath, gitignore)) continue;\n await walk(absolutePath, relPath);\n } else if (stat.isFile()) {\n if (\n !shouldExcludeFromListing(relPath, {\n gitignore,\n sizeBytes: stat.size,\n })\n ) {\n files.push({ path: normalizeSlash(relPath), size: stat.size });\n if (files.length >= LIST_FILES_MAX_ENTRIES) {\n truncated = true;\n return;\n }\n }\n }\n continue;\n }\n\n if (entry.isDirectory()) {\n if (shouldPruneDirectory(relPath, gitignore)) continue;\n await walk(absolutePath, relPath);\n continue;\n }\n\n if (entry.isFile()) {\n const stat = await fs.stat(absolutePath).catch(() => null);\n if (!stat) continue;\n if (\n shouldExcludeFromListing(relPath, {\n gitignore,\n sizeBytes: stat.size,\n })\n ) {\n continue;\n }\n files.push({ path: normalizeSlash(relPath), size: stat.size });\n if (files.length >= LIST_FILES_MAX_ENTRIES) {\n truncated = true;\n return;\n }\n }\n }\n }\n\n await walk(resolvedRoot, \"\");\n return { files, truncated };\n}\n\nexport async function startDesignConnectBridge(\n manifest: DesignConnectManifest,\n): Promise<DesignConnectBridge> {\n // Mint a cryptographically random per-rootPath bridge token. This token is\n // kept in-process only and is never emitted via the public GET routes so that\n // an unauthenticated caller cannot read it. The server-side grant action\n // obtains it out-of-band (via the exported bridge reference).\n const bridgeToken = crypto.randomBytes(32).toString(\"hex\");\n let liveEditBridgeScript = \"\";\n\n const server = http.createServer(\n (req: IncomingMessage, res: ServerResponse) => {\n if (req.method === \"OPTIONS\") {\n sendJson(res, 204, {});\n return;\n }\n\n const pathname = new URL(req.url ?? \"/\", manifest.bridgeUrl).pathname;\n\n // ── Public read-only routes (no token required) ──────────────────────\n\n if (pathname === \"/\" || pathname === \"/manifest.json\") {\n sendJson(res, 200, manifest as unknown as Record<string, unknown>);\n return;\n }\n if (pathname === \"/routes.json\") {\n sendJson(res, 200, {\n version: 1,\n sourceType: \"localhost\",\n devServerUrl: manifest.devServerUrl,\n rootPath: manifest.rootPath,\n routes: manifest.routes,\n generatedAt: manifest.generatedAt,\n });\n return;\n }\n if (pathname === \"/health\") {\n sendJson(res, 200, { ok: true, source: manifest.source });\n return;\n }\n if (pathname === \"/live-edit-bridge\") {\n if (req.method !== \"POST\") {\n sendJson(res, 405, { ok: false, error: \"method not allowed\" });\n return;\n }\n const tokenHeader = req.headers[\"x-bridge-token\"];\n const providedToken =\n typeof tokenHeader === \"string\" ? tokenHeader : \"\";\n let tokenValid = false;\n try {\n tokenValid =\n providedToken.length === bridgeToken.length &&\n crypto.timingSafeEqual(\n Buffer.from(providedToken, \"utf8\"),\n Buffer.from(bridgeToken, \"utf8\"),\n );\n } catch {\n tokenValid = false;\n }\n if (!tokenValid) {\n sendJson(res, 401, {\n ok: false,\n error: \"invalid or missing bridge token\",\n });\n return;\n }\n void (async () => {\n try {\n const raw = await readRequestBody(req);\n const body = JSON.parse(raw) as Record<string, unknown>;\n const script =\n typeof body[\"script\"] === \"string\" ? body[\"script\"] : \"\";\n if (!script.includes(\"agent-native:editor-chrome-ready\")) {\n sendJson(res, 400, {\n ok: false,\n error: \"script must install the Agent Native editor bridge\",\n });\n return;\n }\n liveEditBridgeScript = script;\n sendJson(res, 200, { ok: true });\n } catch (err: unknown) {\n sendJson(res, 400, {\n ok: false,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n })();\n return;\n }\n if (pathname === \"/live-edit\") {\n if (req.method !== \"GET\") {\n sendJson(res, 405, { ok: false, error: \"method not allowed\" });\n return;\n }\n void (async () => {\n try {\n const requestUrl = new URL(req.url ?? \"/\", manifest.bridgeUrl);\n const targetUrl = resolvePreviewSnapshotUrl(\n manifest.devServerUrl,\n requestUrl.searchParams.get(\"url\") ??\n requestUrl.searchParams.get(\"path\"),\n );\n const snapshot = await fetchPreviewSnapshot(\n manifest.devServerUrl,\n targetUrl,\n );\n const includeEditorBridge =\n requestUrl.searchParams.get(\"bridge\") !== \"0\";\n const html = injectLiveEditBridge(\n snapshot.html,\n new URL(\"/\", manifest.bridgeUrl).toString(),\n includeEditorBridge ? liveEditBridgeScript : \"\",\n );\n sendText(\n res,\n snapshot.status >= 400 ? snapshot.status : 200,\n html,\n snapshot.contentType.includes(\"html\")\n ? snapshot.contentType\n : \"text/html; charset=utf-8\",\n );\n } catch (err: unknown) {\n sendJson(res, 400, {\n ok: false,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n })();\n return;\n }\n if (pathname === \"/snapshot\") {\n if (req.method !== \"GET\") {\n sendJson(res, 405, { ok: false, error: \"method not allowed\" });\n return;\n }\n void (async () => {\n try {\n const requestUrl = new URL(req.url ?? \"/\", manifest.bridgeUrl);\n const targetUrl = resolvePreviewSnapshotUrl(\n manifest.devServerUrl,\n requestUrl.searchParams.get(\"url\") ??\n requestUrl.searchParams.get(\"path\"),\n );\n const snapshot = await fetchPreviewSnapshot(\n manifest.devServerUrl,\n targetUrl,\n );\n sendJson(res, snapshot.status >= 400 ? snapshot.status : 200, {\n ok: snapshot.status < 400,\n source: manifest.source,\n url: snapshot.url,\n status: snapshot.status,\n contentType: snapshot.contentType,\n html: snapshot.html,\n });\n } catch (err: unknown) {\n sendJson(res, 400, {\n ok: false,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n })();\n return;\n }\n\n // ── Token-gated write endpoints (POST only) ───────────────────────────\n\n if (\n pathname === \"/read-file\" ||\n pathname === \"/write-file\" ||\n pathname === \"/apply-edit\" ||\n pathname === \"/list-files\"\n ) {\n if (req.method !== \"POST\") {\n sendJson(res, 405, { ok: false, error: \"method not allowed\" });\n return;\n }\n\n // Authenticate with constant-time comparison to prevent timing attacks.\n const tokenHeader = req.headers[\"x-bridge-token\"];\n const providedToken =\n typeof tokenHeader === \"string\" ? tokenHeader : \"\";\n let tokenValid = false;\n try {\n tokenValid =\n providedToken.length === bridgeToken.length &&\n crypto.timingSafeEqual(\n Buffer.from(providedToken, \"utf8\"),\n Buffer.from(bridgeToken, \"utf8\"),\n );\n } catch {\n tokenValid = false;\n }\n if (!tokenValid) {\n sendJson(res, 401, {\n ok: false,\n error: \"invalid or missing bridge token\",\n });\n return;\n }\n\n // Handle asynchronously so we can use await.\n void (async () => {\n try {\n const raw = await readRequestBody(req);\n const body = JSON.parse(raw) as Record<string, unknown>;\n\n if (pathname === \"/list-files\") {\n try {\n const result = await walkBridgeFiles(manifest.rootPath);\n sendJson(res, 200, {\n ok: true,\n files: result.files,\n truncated: result.truncated,\n });\n } catch (err: unknown) {\n sendJson(res, 500, {\n ok: false,\n error: `list-files failed: ${err instanceof Error ? err.message : String(err)}`,\n });\n }\n return;\n }\n\n const relPath =\n typeof body[\"relPath\"] === \"string\" ? body[\"relPath\"] : undefined;\n\n if (!relPath) {\n sendJson(res, 400, { ok: false, error: \"relPath is required\" });\n return;\n }\n\n await assertPathInside(manifest.rootPath, relPath);\n assertNotBlockedSecretPath(relPath);\n const absolutePath = path.resolve(manifest.rootPath, relPath);\n\n if (pathname === \"/read-file\") {\n // Read-file: no extension restriction (agents need to read any\n // non-secret file), but the secret-path blocklist above still\n // applies to .env*, *.pem, *.key, id_rsa*, and anything under .git/.\n let content: string;\n try {\n content = await fs.readFile(absolutePath, \"utf8\");\n } catch (err: unknown) {\n const code =\n err instanceof Error &&\n \"code\" in err &&\n (err as NodeJS.ErrnoException).code;\n if (code === \"ENOENT\") {\n sendJson(res, 404, { ok: false, error: \"file not found\" });\n } else {\n sendJson(res, 500, {\n ok: false,\n error: `read failed: ${err instanceof Error ? err.message : String(err)}`,\n });\n }\n return;\n }\n const versionHash = await computeVersionHash(absolutePath);\n sendJson(res, 200, { ok: true, content, versionHash });\n return;\n }\n\n // write-file and apply-edit only allow known text/code extensions.\n assertAllowedExtension(relPath);\n\n // Optional optimistic-concurrency check: when the caller supplies\n // expectedVersionHash, compare it against the file's CURRENT hash\n // before writing. A missing file is treated as no-conflict (new\n // file case) so first-time writes always succeed.\n const expectedVersionHash =\n typeof body[\"expectedVersionHash\"] === \"string\"\n ? body[\"expectedVersionHash\"]\n : undefined;\n if (expectedVersionHash !== undefined) {\n const currentVersionHash = await computeVersionHash(absolutePath);\n if (\n currentVersionHash !== undefined &&\n currentVersionHash !== expectedVersionHash\n ) {\n sendJson(res, 409, {\n ok: false,\n error: \"version conflict\",\n currentVersionHash,\n });\n return;\n }\n }\n\n if (pathname === \"/write-file\") {\n const content =\n typeof body[\"content\"] === \"string\"\n ? body[\"content\"]\n : undefined;\n if (content === undefined) {\n sendJson(res, 400, {\n ok: false,\n error: \"content is required for write-file\",\n });\n return;\n }\n await fs.mkdir(path.dirname(absolutePath), { recursive: true });\n await fs.writeFile(absolutePath, content, \"utf8\");\n const versionHash = await computeVersionHash(absolutePath);\n sendJson(res, 200, { ok: true, relPath, versionHash });\n return;\n }\n\n // /apply-edit: supports either full replace ({content}) or\n // search-and-replace ({search, replace}).\n if (typeof body[\"content\"] === \"string\") {\n // Full-file replace via apply-edit — same as write-file but keeps\n // the endpoint semantically separate for callers that want to\n // distinguish intent.\n await fs.mkdir(path.dirname(absolutePath), { recursive: true });\n await fs.writeFile(\n absolutePath,\n body[\"content\"] as string,\n \"utf8\",\n );\n const versionHash = await computeVersionHash(absolutePath);\n sendJson(res, 200, {\n ok: true,\n relPath,\n method: \"replace\",\n versionHash,\n });\n return;\n }\n\n const search =\n typeof body[\"search\"] === \"string\" ? body[\"search\"] : undefined;\n const replace =\n typeof body[\"replace\"] === \"string\" ? body[\"replace\"] : undefined;\n if (search === undefined || replace === undefined) {\n sendJson(res, 400, {\n ok: false,\n error:\n \"apply-edit requires either {content} for a full replace, or {search, replace} for a patch\",\n });\n return;\n }\n\n let existing: string;\n try {\n existing = await fs.readFile(absolutePath, \"utf8\");\n } catch (err: unknown) {\n const code =\n err instanceof Error &&\n \"code\" in err &&\n (err as NodeJS.ErrnoException).code;\n if (code === \"ENOENT\") {\n sendJson(res, 404, {\n ok: false,\n error: \"file not found — use write-file to create new files\",\n });\n } else {\n sendJson(res, 500, {\n ok: false,\n error: `read failed: ${err instanceof Error ? err.message : String(err)}`,\n });\n }\n return;\n }\n\n if (search.length === 0) {\n sendJson(res, 400, {\n ok: false,\n error: \"search string must not be empty\",\n });\n return;\n }\n\n const occurrenceCount = countOccurrences(existing, search);\n if (occurrenceCount === 0) {\n sendJson(res, 422, {\n ok: false,\n error: \"search string not found in file\",\n });\n return;\n }\n if (occurrenceCount > 1) {\n sendJson(res, 422, {\n ok: false,\n error:\n \"search string is ambiguous; it appears more than once in the file\",\n });\n return;\n }\n\n const updated = existing.replace(search, replace);\n await fs.writeFile(absolutePath, updated, \"utf8\");\n const versionHash = await computeVersionHash(absolutePath);\n sendJson(res, 200, {\n ok: true,\n relPath,\n method: \"patch\",\n versionHash,\n });\n } catch (err: unknown) {\n sendJson(res, 500, {\n ok: false,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n })();\n return;\n }\n\n if (req.method === \"GET\" || req.method === \"HEAD\") {\n void (async () => {\n try {\n const targetUrl = resolvePreviewProxyUrl(\n manifest.devServerUrl,\n req.url,\n );\n const proxied = await fetchPreviewProxyResource(\n manifest.devServerUrl,\n targetUrl,\n );\n sendBytes(\n res,\n proxied.status >= 400 ? proxied.status : 200,\n req.method === \"HEAD\" ? Buffer.alloc(0) : proxied.body,\n proxied.headers,\n );\n } catch (err: unknown) {\n sendJson(res, 400, {\n ok: false,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n })();\n return;\n }\n\n sendJson(res, 404, { ok: false, error: \"not found\" });\n },\n );\n\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(new URL(manifest.bridgeUrl).port, \"127.0.0.1\", () => {\n server.off(\"error\", reject);\n resolve();\n });\n });\n\n return { server, manifest, bridgeToken };\n}\n\n/**\n * Resolve the design app URL from an explicit value or environment variables.\n * Returns undefined when no URL is configured (registration is optional).\n */\nexport function resolveAppUrl(explicit?: string): string | undefined {\n const raw =\n explicit ||\n process.env[\"AGENT_NATIVE_URL\"] ||\n process.env[\"DESIGN_APP_URL\"] ||\n process.env[\"APP_URL\"] ||\n process.env[\"VITE_APP_URL\"] ||\n process.env[\"BETTER_AUTH_URL\"] ||\n process.env[\"VITE_BETTER_AUTH_URL\"];\n if (!raw) return undefined;\n try {\n const parsed = new URL(raw.trim());\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n return undefined;\n }\n return parsed.toString().replace(/\\/+$/, \"\");\n } catch {\n return undefined;\n }\n}\n\n/**\n * Resolve a bearer token from environment variables for authenticating the\n * self-registration POST. The CLI does not perform a device-code flow — it\n * relies on a pre-minted token supplied via env var (e.g. the same token\n * already written into the agent's MCP config).\n */\nfunction resolveAuthToken(): string | undefined {\n return (\n process.env[\"AGENT_NATIVE_TOKEN\"] ||\n process.env[\"DESIGN_ACCESS_TOKEN\"] ||\n process.env[\"ACCESS_TOKEN\"] ||\n undefined\n );\n}\n\n/**\n * POST to the design app's `connect-localhost` action endpoint to register\n * (or refresh) the bridge connection and persist the real bridge token on the\n * server row. This is a best-effort call: failures are logged but do not\n * abort the bridge process.\n *\n * @param appUrl - Deployed design app base URL (e.g. https://design.agent-native.com)\n * @param bridge - The running bridge returned by startDesignConnectBridge\n * @param authToken - Optional bearer token for the authenticated action route\n */\nexport async function registerConnectionWithServer(\n appUrl: string,\n bridge: DesignConnectBridge,\n authToken?: string,\n): Promise<void> {\n const endpoint = `${appUrl}/_agent-native/actions/connect-localhost`;\n const { manifest, bridgeToken } = bridge;\n const payload = {\n devServerUrl: manifest.devServerUrl,\n bridgeUrl: manifest.bridgeUrl,\n rootPath: manifest.rootPath,\n capabilities: manifest.capabilities.filter((capability) =>\n SERVER_REGISTRATION_BRIDGE_OPERATIONS.has(capability.operation),\n ),\n routeManifest: {\n version: 1 as const,\n sourceType: \"localhost\" as const,\n devServerUrl: manifest.devServerUrl,\n rootPath: manifest.rootPath,\n routes: manifest.routes,\n generatedAt: manifest.generatedAt,\n },\n // Include the real bridge token so the server stores it on the connection\n // row. grant-localhost-write-consent then reads it from the row instead of\n // minting its own unrelated token, which would always produce a 401.\n bridgeToken,\n status: \"connected\" as const,\n };\n\n const headers: Record<string, string> = {\n \"content-type\": \"application/json\",\n };\n if (authToken) {\n headers[\"authorization\"] = `Bearer ${authToken}`;\n }\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 15_000);\n try {\n const res = await fetch(endpoint, {\n method: \"POST\",\n headers,\n body: JSON.stringify(payload),\n signal: controller.signal,\n });\n if (!res.ok) {\n const message = await res.text().catch(() => res.statusText);\n throw new Error(`${res.status} ${message || res.statusText}`);\n }\n } catch (error) {\n // Best-effort: network errors or auth issues are non-fatal, but make the\n // problem discoverable before the user tries \"Apply to source\".\n console.error(\n `[design connect] Could not register bridge with ${endpoint}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n } finally {\n clearTimeout(timeout);\n }\n}\n\nfunction printHelp() {\n console.log(`Usage:\n agent-native design connect [options]\n\nOptions:\n --url <url> Dev server URL to inspect (auto-detected if omitted)\n --port <number> Local bridge port (default ${DEFAULT_BRIDGE_PORT})\n --root <path> App/repo root for route discovery (default cwd)\n --route-manifest <path> Non-destructive route manifest output path\n --app-url <url> Deployed design app URL for self-registration\n (also reads AGENT_NATIVE_URL / DESIGN_APP_URL env)\n --daemon Start the bridge detached, wait for /health, then exit\n --json Print the manifest JSON and exit\n --once Prepare/scaffold the manifest and exit\n --dry-run Print what would be exposed without writing files\n\nElement provenance (resolveNodeToFile):\n The design editor can map a selected DOM element back to its source file,\n line, and React component name when the connected app emits provenance\n attributes at build time. Add one of the following to your app's build:\n\n • @vitejs/plugin-react with jsxDEV enabled (development mode default):\n Sets data-source-file and data-source-line on each JSX element\n automatically when using the Babel transform.\n\n • A Babel source plugin (e.g. babel-plugin-react-source or a custom plugin):\n Emits data-source-file=\"src/Button.tsx\" data-source-line=\"12\"\n data-source-column=\"4\" data-component-name=\"Button\" on each element.\n\n • data-loc=\"src/Button.tsx:12:4\" shorthand attribute (Babel source convention):\n The bridge parses this as { sourceFile, line, column } automatically.\n\n Without these attributes the editor still works; provenance is simply absent.\n Cross-origin localhost iframes cannot be read regardless of attributes (CSP).`);\n}\n\nfunction removeDaemonFlag(argv: string[]): string[] {\n return argv.filter((arg) => arg !== \"--daemon\");\n}\n\nfunction resolveCurrentCliInvocation(argv: string[]): {\n command: string;\n args: string[];\n} {\n const suffixLength = argv.length + 1; // leading \"design\" command + runDesign argv\n const prefixEnd = Math.max(1, process.argv.length - suffixLength);\n const cliPrefix = process.argv.slice(1, prefixEnd);\n const entry = cliPrefix[0] ?? process.argv[1];\n if (!entry) {\n throw new Error(\"Could not resolve current CLI entrypoint for --daemon\");\n }\n if (entry.endsWith(\".ts\") || entry.endsWith(\".tsx\")) {\n return {\n command: \"tsx\",\n args: [...cliPrefix, \"design\", ...removeDaemonFlag(argv)],\n };\n }\n return {\n command: process.execPath,\n args: [...cliPrefix, \"design\", ...removeDaemonFlag(argv)],\n };\n}\n\nasync function startDetachedDesignBridge(\n argv: string[],\n manifest: DesignConnectManifest,\n): Promise<number> {\n if (await waitForBridgeHealth(manifest.bridgeUrl, 800)) {\n const runningManifest = await fetchRunningBridgeManifest(\n manifest.bridgeUrl,\n );\n if (\n runningManifest &&\n designConnectManifestsTargetSameApp(runningManifest, manifest)\n ) {\n console.error(\n `Design localhost bridge already running at ${manifest.bridgeUrl}`,\n );\n console.log(JSON.stringify(runningManifest, null, 2));\n return 0;\n }\n\n console.error(\n [\n `Design localhost bridge already running at ${manifest.bridgeUrl} for a different app.`,\n runningManifest\n ? `Running app: ${runningManifest.devServerUrl} (${runningManifest.rootPath})`\n : \"Running bridge did not expose a compatible manifest.\",\n `Requested app: ${manifest.devServerUrl} (${manifest.rootPath})`,\n \"Stop the existing bridge or choose a different --port.\",\n ].join(\"\\n\"),\n );\n return 1;\n }\n\n const invocation = resolveCurrentCliInvocation(argv);\n const child = spawn(invocation.command, invocation.args, {\n cwd: process.cwd(),\n detached: true,\n env: process.env,\n stdio: \"ignore\",\n shell: process.platform === \"win32\",\n });\n child.unref();\n\n if (await waitForBridgeHealth(manifest.bridgeUrl)) {\n console.error(`Design localhost bridge running at ${manifest.bridgeUrl}`);\n console.log(JSON.stringify(manifest, null, 2));\n return 0;\n }\n\n console.error(\n `Timed out waiting for detached Design bridge at ${manifest.bridgeUrl}`,\n );\n return 1;\n}\n\nexport async function runDesign(argv: string[]) {\n const subcommand = argv[0];\n if (subcommand !== \"connect\") {\n if (\n subcommand === \"help\" ||\n subcommand === \"--help\" ||\n subcommand === \"-h\"\n ) {\n printHelp();\n return 0;\n }\n console.error(\"Usage: agent-native design connect [options]\");\n return 1;\n }\n\n const parsed = parseDesignConnectArgs(argv);\n if (parsed.help) {\n printHelp();\n return 0;\n }\n\n const manifest = await prepareDesignConnectManifest(parsed);\n if (parsed.daemon) {\n return startDetachedDesignBridge(argv, manifest);\n }\n if (parsed.json || parsed.once || parsed.dryRun) {\n console.log(JSON.stringify(manifest, null, 2));\n return 0;\n }\n\n const bridge = await startDesignConnectBridge(manifest);\n console.error(\"Design localhost bridge running\");\n console.error(`Bridge: ${manifest.bridgeUrl}`);\n console.error(`Manifest: ${manifest.bridgeUrl}/manifest.json`);\n console.error(`Routes: ${manifest.routeCount}`);\n console.error(`Dev URL: ${manifest.devServerUrl}`);\n\n // Self-register with the design app server (best-effort). When an app URL\n // is available (via --app-url or env var) the CLI POSTs the bridge token to\n // connect-localhost so the server row stores the real token. Without this\n // step grant-localhost-write-consent would mint a different token, causing\n // every bridge write to return 401.\n const appUrl = resolveAppUrl(parsed.appUrl);\n if (appUrl) {\n const authToken = resolveAuthToken();\n void registerConnectionWithServer(appUrl, bridge, authToken);\n }\n\n return await new Promise<number>((resolve) => {\n const stop = () => {\n bridge.server.close(() => resolve(0));\n };\n for (const signal of [\"SIGINT\", \"SIGTERM\", \"SIGHUP\"] as const) {\n process.once(signal, stop);\n }\n });\n}\n"]}
1
+ {"version":3,"file":"design-connect.js","sourceRoot":"","sources":["../../src/cli/design-connect.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn } from \"node:child_process\";\nimport crypto from \"node:crypto\";\nimport fsSync from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport http, {\n type IncomingMessage,\n type Server,\n type ServerResponse,\n} from \"node:http\";\nimport path from \"node:path\";\n\nconst DEFAULT_BRIDGE_PORT = 7331;\nconst ROUTE_MANIFEST_FILE = path.join(\".agent-native\", \"design-routes.json\");\nconst DEFAULT_DEV_SERVER_CANDIDATES = [\n \"http://127.0.0.1:5173\",\n \"http://localhost:5173\",\n \"http://127.0.0.1:3000\",\n \"http://localhost:3000\",\n \"http://127.0.0.1:8080\",\n \"http://localhost:8080\",\n];\n\nconst BRIDGE_OPERATIONS = [\n \"select\",\n \"resolveNodeToFile\",\n \"readFile\",\n \"applyEdit\",\n \"writeFile\",\n \"captureSnapshot\",\n \"captureState\",\n \"listFiles\",\n] as const;\n\ntype BridgeOperation = (typeof BRIDGE_OPERATIONS)[number];\n\nconst SERVER_REGISTRATION_BRIDGE_OPERATIONS = new Set<BridgeOperation>([\n \"select\",\n \"resolveNodeToFile\",\n \"readFile\",\n \"applyEdit\",\n \"writeFile\",\n \"captureSnapshot\",\n \"captureState\",\n]);\n\n/** Additive manifest capability flags advertised alongside the operation list. */\nconst MANIFEST_CAPABILITIES = {\n listFiles: true,\n readTextFiles: true,\n writeTextFiles: true,\n} as const;\n\nexport interface DesignConnectArgs {\n url?: string;\n port: number;\n root: string;\n routeManifest?: string;\n /** Optional deployed design app URL used to self-register the bridge on\n * startup. When set (or when AGENT_NATIVE_URL / DESIGN_APP_URL env vars\n * are present) the CLI POSTs to `/_agent-native/actions/connect-localhost`\n * with the real bridge token so the server can store it for grant minting. */\n appUrl?: string;\n json: boolean;\n once: boolean;\n dryRun: boolean;\n daemon: boolean;\n help: boolean;\n}\n\nexport interface DesignConnectRoute {\n id: string;\n path: string;\n title: string;\n sourceFile?: string;\n sourceKind: \"react-router\" | \"html\" | \"manual\";\n}\n\nexport interface DesignConnectManifest {\n version: 1;\n source: \"agent-native-design-connect\";\n sourceType: \"localhost\";\n localOnly: true;\n devServerUrl: string;\n bridgeUrl: string;\n rootPath: string;\n routeManifestPath: string;\n routeManifestCreated: boolean;\n routes: DesignConnectRoute[];\n routeCount: number;\n generatedAt: string;\n capabilities: Array<{\n operation: BridgeOperation;\n status: \"available\" | \"planned\" | \"disabled\";\n reason?: string;\n }>;\n /**\n * Additive high-level capability flags beyond the low-level operation list.\n * `connect-localhost` persists this so `list-design-source-capabilities` can\n * reflect readFile/writeFile/listFiles availability for localhost sources.\n */\n manifestCapabilities: typeof MANIFEST_CAPABILITIES;\n}\n\nexport interface DesignConnectBridge {\n server: Server;\n manifest: DesignConnectManifest;\n /** Per-rootPath bridge token. Kept in-process only; never serialised into\n * the manifest JSON so it is not exposed over the network via GET /manifest.\n * The server-side grant action reads it from the running bridge instance. */\n bridgeToken: string;\n}\n\nfunction stringFlagValue(argv: string[], index: number, flag: string) {\n const value = argv[index + 1];\n if (!value || value.startsWith(\"-\")) {\n throw new Error(`${flag} requires a value`);\n }\n return value;\n}\n\nfunction normalizeSlash(value: string) {\n return value.replace(/\\\\/g, \"/\");\n}\n\nfunction normalizeHttpUrl(value: string): string {\n const raw = value.trim();\n const withProtocol = /^[a-z]+:\\/\\//i.test(raw) ? raw : `http://${raw}`;\n const parsed = new URL(withProtocol);\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n throw new Error(\"--url must be an http(s) URL\");\n }\n parsed.hash = \"\";\n return parsed.toString().replace(/\\/$/, \"\");\n}\n\nexport function parseDesignConnectArgs(argv: string[]): DesignConnectArgs {\n const args = argv[0] === \"connect\" ? argv.slice(1) : argv;\n const parsed: DesignConnectArgs = {\n port: DEFAULT_BRIDGE_PORT,\n root: process.cwd(),\n json: false,\n once: false,\n dryRun: false,\n daemon: false,\n help: false,\n };\n\n for (let index = 0; index < args.length; index += 1) {\n const arg = args[index]!;\n if (arg === \"help\" || arg === \"--help\" || arg === \"-h\") {\n parsed.help = true;\n } else if (arg === \"--url\") {\n parsed.url = stringFlagValue(args, index, arg);\n index += 1;\n } else if (arg.startsWith(\"--url=\")) {\n parsed.url = arg.slice(\"--url=\".length);\n } else if (arg === \"--port\") {\n parsed.port = Number.parseInt(stringFlagValue(args, index, arg), 10);\n index += 1;\n } else if (arg.startsWith(\"--port=\")) {\n parsed.port = Number.parseInt(arg.slice(\"--port=\".length), 10);\n } else if (arg === \"--root\") {\n parsed.root = stringFlagValue(args, index, arg);\n index += 1;\n } else if (arg.startsWith(\"--root=\")) {\n parsed.root = arg.slice(\"--root=\".length);\n } else if (arg === \"--route-manifest\") {\n parsed.routeManifest = stringFlagValue(args, index, arg);\n index += 1;\n } else if (arg.startsWith(\"--route-manifest=\")) {\n parsed.routeManifest = arg.slice(\"--route-manifest=\".length);\n } else if (arg === \"--app-url\") {\n parsed.appUrl = stringFlagValue(args, index, arg);\n index += 1;\n } else if (arg.startsWith(\"--app-url=\")) {\n parsed.appUrl = arg.slice(\"--app-url=\".length);\n } else if (arg === \"--json\") {\n parsed.json = true;\n parsed.once = true;\n } else if (arg === \"--once\") {\n parsed.once = true;\n } else if (arg === \"--dry-run\") {\n parsed.dryRun = true;\n parsed.once = true;\n } else if (arg === \"--daemon\") {\n parsed.daemon = true;\n } else if (arg.startsWith(\"-\")) {\n throw new Error(`Unknown option: ${arg}`);\n } else {\n throw new Error(`Unexpected argument: ${arg}`);\n }\n }\n\n if (!Number.isInteger(parsed.port) || parsed.port <= 0) {\n throw new Error(\"--port must be a positive integer\");\n }\n if (parsed.daemon && (parsed.json || parsed.once || parsed.dryRun)) {\n throw new Error(\n \"--daemon cannot be combined with --json, --once, or --dry-run\",\n );\n }\n parsed.root = path.resolve(parsed.root);\n parsed.url = parsed.url ? normalizeHttpUrl(parsed.url) : undefined;\n return parsed;\n}\n\nfunction routeId(routePath: string): string {\n if (routePath === \"/\") return \"route-root\";\n const slug = routePath\n .replace(/^\\/+/, \"\")\n .replace(/[^a-zA-Z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .toLowerCase();\n return slug ? `route-${slug}` : \"route-wildcard\";\n}\n\nfunction titleFromRoutePath(routePath: string): string {\n if (routePath === \"/\") return \"Home\";\n if (routePath === \"/*\" || routePath === \"*\") return \"Wildcard\";\n return (\n routePath\n .replace(/^\\/+/, \"\")\n .replace(/[:$]/g, \"\")\n .replace(/[-_/]+/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim()\n .replace(/\\b\\w/g, (char) => char.toUpperCase()) || \"Screen\"\n );\n}\n\nfunction walkFiles(dir: string, files: string[] = []): string[] {\n if (!fsSync.existsSync(dir)) return files;\n for (const entry of fsSync.readdirSync(dir, { withFileTypes: true })) {\n if (entry.name === \"node_modules\" || entry.name === \".git\") continue;\n const absolute = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n walkFiles(absolute, files);\n } else {\n files.push(absolute);\n }\n }\n return files;\n}\n\nfunction routePathFromReactRouterFile(filePath: string, routesDir: string) {\n const withoutExt = normalizeSlash(path.relative(routesDir, filePath)).replace(\n /\\.[cm]?[jt]sx?$/,\n \"\",\n );\n const parts: string[] = [];\n for (const segment of withoutExt.split(\"/\")) {\n for (const token of segment.split(\".\")) {\n if (!token || token === \"route\" || token === \"index\") continue;\n if (token === \"_index\") continue;\n if (token.startsWith(\"_\")) continue;\n const pathToken = token.endsWith(\"_\") ? token.slice(0, -1) : token;\n if (pathToken === \"$\") {\n parts.push(\"*\");\n } else if (pathToken.startsWith(\"$\")) {\n const param = pathToken.slice(1) || \"param\";\n parts.push(`:${param}`);\n } else {\n parts.push(pathToken);\n }\n }\n }\n return `/${parts.join(\"/\")}`.replace(/\\/+/g, \"/\");\n}\n\nexport function discoverDesignRoutes(root: string): DesignConnectRoute[] {\n const absoluteRoot = path.resolve(root);\n const routeDirs = [\n path.join(absoluteRoot, \"app\", \"routes\"),\n path.join(absoluteRoot, \"src\", \"routes\"),\n path.join(absoluteRoot, \"pages\"),\n ].filter((dir) => fsSync.existsSync(dir));\n const routes = new Map<string, DesignConnectRoute>();\n\n for (const routeDir of routeDirs) {\n for (const file of walkFiles(routeDir)) {\n if (!/\\.[cm]?[jt]sx?$/.test(file)) continue;\n if (/\\.test\\.|\\.spec\\./.test(file)) continue;\n const pathName = routePathFromReactRouterFile(file, routeDir);\n routes.set(pathName, {\n id: routeId(pathName),\n path: pathName,\n title: titleFromRoutePath(pathName),\n sourceFile: normalizeSlash(path.relative(absoluteRoot, file)),\n sourceKind: \"react-router\",\n });\n }\n }\n\n if (routes.size === 0) {\n for (const dir of [absoluteRoot, path.join(absoluteRoot, \"public\")]) {\n for (const file of walkFiles(dir)) {\n if (!file.endsWith(\".html\")) continue;\n const rel = normalizeSlash(path.relative(dir, file));\n const pathName =\n rel === \"index.html\" ? \"/\" : `/${rel.replace(/\\.html$/, \"\")}`;\n routes.set(pathName, {\n id: routeId(pathName),\n path: pathName,\n title: titleFromRoutePath(pathName),\n sourceFile: normalizeSlash(path.relative(absoluteRoot, file)),\n sourceKind: \"html\",\n });\n }\n }\n }\n\n return [...routes.values()].sort((a, b) => {\n if (a.path === \"/\") return -1;\n if (b.path === \"/\") return 1;\n return a.path.localeCompare(b.path);\n });\n}\n\nasync function probeDevServer(url: string): Promise<boolean> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 800);\n try {\n const response = await fetch(url, {\n method: \"GET\",\n signal: controller.signal,\n });\n return response.status < 500;\n } catch {\n return false;\n } finally {\n clearTimeout(timeout);\n }\n}\n\nasync function waitForBridgeHealth(\n bridgeUrl: string,\n timeoutMs = 5_000,\n): Promise<boolean> {\n const healthUrl = new URL(\"/health\", bridgeUrl).toString();\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline) {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 400);\n try {\n const response = await fetch(healthUrl, {\n method: \"GET\",\n signal: controller.signal,\n });\n if (response.ok) return true;\n } catch {\n // Keep polling until the detached process finishes binding the port.\n } finally {\n clearTimeout(timeout);\n }\n await new Promise((resolve) => setTimeout(resolve, 150));\n }\n return false;\n}\n\nfunction isDesignConnectManifest(\n value: unknown,\n): value is DesignConnectManifest {\n if (!value || typeof value !== \"object\") return false;\n const manifest = value as Partial<DesignConnectManifest>;\n return (\n manifest.version === 1 &&\n manifest.source === \"agent-native-design-connect\" &&\n manifest.sourceType === \"localhost\" &&\n manifest.localOnly === true &&\n typeof manifest.devServerUrl === \"string\" &&\n typeof manifest.bridgeUrl === \"string\" &&\n typeof manifest.rootPath === \"string\"\n );\n}\n\nasync function fetchRunningBridgeManifest(\n bridgeUrl: string,\n): Promise<DesignConnectManifest | null> {\n const manifestUrl = new URL(\"/manifest.json\", bridgeUrl).toString();\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 800);\n try {\n const response = await fetch(manifestUrl, {\n method: \"GET\",\n signal: controller.signal,\n });\n if (!response.ok) return null;\n const body = (await response.json()) as unknown;\n return isDesignConnectManifest(body) ? body : null;\n } catch {\n return null;\n } finally {\n clearTimeout(timeout);\n }\n}\n\nexport function designConnectManifestsTargetSameApp(\n running: Pick<DesignConnectManifest, \"devServerUrl\" | \"rootPath\">,\n requested: Pick<DesignConnectManifest, \"devServerUrl\" | \"rootPath\">,\n): boolean {\n let runningUrl = running.devServerUrl;\n let requestedUrl = requested.devServerUrl;\n try {\n runningUrl = normalizeHttpUrl(runningUrl);\n requestedUrl = normalizeHttpUrl(requestedUrl);\n } catch {\n // Fall through to direct string comparison for malformed legacy manifests.\n }\n return (\n runningUrl === requestedUrl &&\n path.resolve(running.rootPath) === path.resolve(requested.rootPath)\n );\n}\n\nasync function resolveDevServerUrl(url?: string): Promise<string> {\n if (url) return normalizeHttpUrl(url);\n for (const candidate of DEFAULT_DEV_SERVER_CANDIDATES) {\n if (await probeDevServer(candidate)) return candidate;\n }\n return DEFAULT_DEV_SERVER_CANDIDATES[0]!;\n}\n\nasync function ensureRouteManifest(options: {\n root: string;\n routeManifestPath: string;\n routes: DesignConnectRoute[];\n devServerUrl: string;\n dryRun: boolean;\n}): Promise<{ path: string; created: boolean }> {\n const manifestPath = path.isAbsolute(options.routeManifestPath)\n ? options.routeManifestPath\n : path.join(options.root, options.routeManifestPath);\n if (fsSync.existsSync(manifestPath)) {\n return { path: manifestPath, created: false };\n }\n if (!options.dryRun) {\n await fs.mkdir(path.dirname(manifestPath), { recursive: true });\n await fs.writeFile(\n manifestPath,\n `${JSON.stringify(\n {\n version: 1,\n sourceType: \"localhost\",\n devServerUrl: options.devServerUrl,\n rootPath: options.root,\n routes: options.routes,\n generatedAt: new Date().toISOString(),\n },\n null,\n 2,\n )}\\n`,\n \"utf8\",\n );\n }\n return { path: manifestPath, created: !options.dryRun };\n}\n\nexport async function prepareDesignConnectManifest(\n options: Partial<DesignConnectArgs> & { root?: string } = {},\n): Promise<DesignConnectManifest> {\n const root = path.resolve(options.root ?? process.cwd());\n const port = options.port ?? DEFAULT_BRIDGE_PORT;\n const devServerUrl = await resolveDevServerUrl(options.url);\n const bridgeUrl = `http://127.0.0.1:${port}`;\n const routes = discoverDesignRoutes(root);\n const routeManifest = await ensureRouteManifest({\n root,\n routeManifestPath: options.routeManifest ?? ROUTE_MANIFEST_FILE,\n routes,\n devServerUrl,\n dryRun: Boolean(options.dryRun),\n });\n const generatedAt = new Date().toISOString();\n\n return {\n version: 1,\n source: \"agent-native-design-connect\",\n sourceType: \"localhost\",\n localOnly: true,\n devServerUrl,\n bridgeUrl,\n rootPath: root,\n routeManifestPath: routeManifest.path,\n routeManifestCreated: routeManifest.created,\n routes,\n routeCount: routes.length,\n generatedAt,\n manifestCapabilities: MANIFEST_CAPABILITIES,\n capabilities: BRIDGE_OPERATIONS.map((operation) => ({\n operation,\n status: \"available\" as const,\n reason:\n operation === \"resolveNodeToFile\"\n ? // resolveNodeToFile maps a runtime DOM node id (from the editor's\n // 'select' payload) to { file, line, component } provenance. The\n // bridge endpoint exists; per-element provenance data must be\n // emitted by the connected app at build time — see the provenance\n // note in the help text below.\n \"Requires the connected app to emit data-source-file / data-source-line / data-component-name attributes (e.g. via @vitejs/plugin-react jsxDEV or a Babel source plugin).\"\n : undefined,\n })),\n };\n}\n\nfunction sendJson(\n res: ServerResponse,\n statusCode: number,\n body: Record<string, unknown>,\n) {\n res.writeHead(statusCode, {\n \"content-type\": \"application/json; charset=utf-8\",\n \"access-control-allow-origin\": \"*\",\n \"access-control-allow-methods\": \"GET, POST, OPTIONS\",\n \"access-control-allow-headers\": \"content-type, x-bridge-token\",\n \"access-control-allow-private-network\": \"true\",\n });\n res.end(`${JSON.stringify(body, null, 2)}\\n`);\n}\n\nfunction sendText(\n res: ServerResponse,\n statusCode: number,\n body: string,\n contentType: string,\n) {\n res.writeHead(statusCode, {\n \"content-type\": contentType,\n \"access-control-allow-origin\": \"*\",\n \"access-control-allow-methods\": \"GET, POST, OPTIONS\",\n \"access-control-allow-headers\": \"content-type, x-bridge-token\",\n \"access-control-allow-private-network\": \"true\",\n });\n res.end(body);\n}\n\nfunction sendBytes(\n res: ServerResponse,\n statusCode: number,\n body: Buffer,\n headers: Headers,\n) {\n const responseHeaders: Record<string, string> = {\n \"access-control-allow-origin\": \"*\",\n \"access-control-allow-methods\": \"GET, HEAD, POST, OPTIONS\",\n \"access-control-allow-headers\": \"content-type, x-bridge-token\",\n \"access-control-allow-private-network\": \"true\",\n };\n for (const name of [\n \"content-type\",\n \"cache-control\",\n \"etag\",\n \"last-modified\",\n ]) {\n const value = headers.get(name);\n if (value) responseHeaders[name] = value;\n }\n res.writeHead(statusCode, responseHeaders);\n res.end(body);\n}\n\nfunction sameOrigin(a: string, b: string): boolean {\n try {\n return new URL(a).origin === new URL(b).origin;\n } catch {\n return false;\n }\n}\n\nfunction resolvePreviewSnapshotUrl(\n devServerUrl: string,\n rawUrl: string | null,\n): string {\n const base = normalizeHttpUrl(devServerUrl);\n const parsed = new URL(rawUrl?.trim() || \"/\", `${base}/`);\n parsed.hash = \"\";\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n throw new Error(\"Snapshot URL must use http(s).\");\n }\n if (!sameOrigin(parsed.toString(), base)) {\n throw new Error(\"Snapshot URL must stay on the connected dev server.\");\n }\n return parsed.toString();\n}\n\nfunction resolvePreviewProxyUrl(\n devServerUrl: string,\n requestUrl: string | undefined,\n): string {\n const base = normalizeHttpUrl(devServerUrl);\n const parsedRequest = new URL(requestUrl ?? \"/\", base);\n const parsed = new URL(\n `${parsedRequest.pathname}${parsedRequest.search}`,\n `${base}/`,\n );\n parsed.hash = \"\";\n if (!sameOrigin(parsed.toString(), base)) {\n throw new Error(\"Proxy URL must stay on the connected dev server.\");\n }\n return parsed.toString();\n}\n\nasync function fetchPreviewSnapshot(\n devServerUrl: string,\n targetUrl: string,\n redirects = 0,\n): Promise<{\n url: string;\n status: number;\n contentType: string;\n html: string;\n}> {\n if (redirects > 5) {\n throw new Error(\"Too many redirects while fetching preview snapshot.\");\n }\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 10_000);\n try {\n const response = await fetch(targetUrl, {\n method: \"GET\",\n redirect: \"manual\",\n signal: controller.signal,\n headers: {\n accept: \"text/html,application/xhtml+xml;q=0.9,*/*;q=0.8\",\n },\n });\n const location = response.headers.get(\"location\");\n if (location && response.status >= 300 && response.status < 400) {\n const redirected = new URL(location, targetUrl);\n redirected.hash = \"\";\n if (!sameOrigin(redirected.toString(), devServerUrl)) {\n throw new Error(\"Snapshot redirect left the connected dev server.\");\n }\n return fetchPreviewSnapshot(\n devServerUrl,\n redirected.toString(),\n redirects + 1,\n );\n }\n return {\n url: response.url || targetUrl,\n status: response.status,\n contentType: response.headers.get(\"content-type\") ?? \"\",\n html: await response.text(),\n };\n } finally {\n clearTimeout(timeout);\n }\n}\n\nasync function fetchPreviewProxyResource(\n devServerUrl: string,\n targetUrl: string,\n redirects = 0,\n): Promise<{\n url: string;\n status: number;\n headers: Headers;\n body: Buffer;\n}> {\n if (redirects > 5) {\n throw new Error(\"Too many redirects while proxying preview resource.\");\n }\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 10_000);\n try {\n const response = await fetch(targetUrl, {\n method: \"GET\",\n redirect: \"manual\",\n signal: controller.signal,\n });\n const location = response.headers.get(\"location\");\n if (location && response.status >= 300 && response.status < 400) {\n const redirected = new URL(location, targetUrl);\n redirected.hash = \"\";\n if (!sameOrigin(redirected.toString(), devServerUrl)) {\n throw new Error(\"Proxy redirect left the connected dev server.\");\n }\n return fetchPreviewProxyResource(\n devServerUrl,\n redirected.toString(),\n redirects + 1,\n );\n }\n return {\n url: response.url || targetUrl,\n status: response.status,\n headers: response.headers,\n body: Buffer.from(await response.arrayBuffer()),\n };\n } finally {\n clearTimeout(timeout);\n }\n}\n\nfunction addLiveEditBaseHref(html: string, href: string): string {\n const escapedHref = href.replace(/&/g, \"&amp;\").replace(/\"/g, \"&quot;\");\n const baseTag = `<base href=\"${escapedHref}\">`;\n if (/<base\\b/i.test(html)) return html;\n if (/<head\\b[^>]*>/i.test(html)) {\n return html.replace(/<head\\b[^>]*>/i, (match) => `${match}${baseTag}`);\n }\n if (/<html\\b[^>]*>/i.test(html)) {\n return html.replace(\n /<html\\b[^>]*>/i,\n (match) => `${match}<head>${baseTag}</head>`,\n );\n }\n return `<!DOCTYPE html><html><head>${baseTag}<meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\"></head><body>${html}</body></html>`;\n}\n\n/**\n * Rewrite the iframe path to the real target route before the proxied app's\n * bundle runs. The bridge serves snapshots from its own `/live-edit` path, so a\n * client-side-routed SPA would otherwise boot at \"/live-edit\", match no route,\n * and render its 404. A synchronous inline script in `<head>` runs during parse\n * (before deferred module bundles), so `history.replaceState` lands the SPA on\n * the intended route. Assets still resolve via the injected `<base href>`.\n */\nfunction injectPreBootLocationShim(html: string, targetPath: string): string {\n const path = targetPath.trim();\n if (!path || path === \"/live-edit\") return html;\n const shim = `<script data-agent-native-live-edit-location>\n(function(){try{var p=${JSON.stringify(path)};if(p&&(location.pathname+location.search)!==p){history.replaceState(null,\"\",p);}}catch(e){}})();\n</script>`;\n if (/<head\\b[^>]*>/i.test(html)) {\n return html.replace(/<head\\b[^>]*>/i, (match) => `${match}${shim}`);\n }\n if (/<html\\b[^>]*>/i.test(html)) {\n return html.replace(\n /<html\\b[^>]*>/i,\n (match) => `${match}<head>${shim}</head>`,\n );\n }\n return `${shim}${html}`;\n}\n\nfunction injectLiveEditBridge(\n html: string,\n baseHref: string,\n script: string,\n targetPath: string,\n) {\n const withBase = injectPreBootLocationShim(\n addLiveEditBaseHref(html, baseHref),\n targetPath,\n );\n if (!script) return withBase;\n if (withBase.includes(\"</body>\")) {\n return withBase.replace(\"</body>\", `${script}</body>`);\n }\n if (withBase.includes(\"</html>\")) {\n return withBase.replace(\"</html>\", `${script}</html>`);\n }\n return `${withBase}${script}`;\n}\n\n/** Read the full request body as a UTF-8 string. */\nasync function readRequestBody(req: IncomingMessage): Promise<string> {\n return new Promise<string>((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n req.on(\"end\", () => resolve(Buffer.concat(chunks).toString(\"utf8\")));\n req.on(\"error\", reject);\n });\n}\n\n/**\n * Resolve `targetDir` under `rootPath` with realpath so that symlinks and\n * traversal sequences (../../etc) cannot escape the root. Throws if the\n * resolved path does not start with the resolved root.\n *\n * This also guards against a symlink LEAF inside root (e.g.\n * `rootPath/link.css` -> `/Users/me/.ssh/id_rsa`): the parent-directory\n * realpath check alone would pass confinement because the parent is inside\n * root, letting reads/writes silently follow the symlink outside root. After\n * the parent check we additionally lstat the target itself — if it exists and\n * is a symlink, or if its realpath resolves outside `resolvedRoot`, we reject.\n */\nasync function assertPathInside(\n rootPath: string,\n targetPath: string,\n): Promise<void> {\n const resolvedRoot = await fs.realpath(rootPath).catch(() => {\n throw new Error(`Bridge root path does not exist: ${rootPath}`);\n });\n\n // Resolve the parent directory (the file itself may not exist yet for writes).\n const targetParent = path.dirname(path.resolve(rootPath, targetPath));\n const resolvedParent = await fs.realpath(targetParent).catch(async () => {\n // Parent may not exist yet; walk up until we find a real ancestor.\n let candidate = targetParent;\n for (let i = 0; i < 32; i++) {\n const up = path.dirname(candidate);\n if (up === candidate) break;\n candidate = up;\n try {\n return await fs.realpath(candidate);\n } catch {\n // keep walking\n }\n }\n throw new Error(`Cannot resolve parent directory: ${targetParent}`);\n });\n\n if (\n !resolvedParent.startsWith(resolvedRoot + path.sep) &&\n resolvedParent !== resolvedRoot\n ) {\n throw new Error(`Path traversal detected: resolved target is outside root`);\n }\n\n // Reject a symlink LEAF, even though its parent directory is confined to\n // root. A pre-existing symlink at the target path (file or directory) could\n // otherwise be followed straight out of root by the caller's subsequent\n // fs.readFile/fs.writeFile call.\n const targetAbsolute = path.resolve(rootPath, targetPath);\n const lstat = await fs.lstat(targetAbsolute).catch(() => null);\n if (lstat?.isSymbolicLink()) {\n throw new Error(\n `Path traversal detected: \"${targetPath}\" is a symlink, which is not allowed inside the connected root`,\n );\n }\n if (lstat) {\n const resolvedTarget = await fs.realpath(targetAbsolute).catch(() => null);\n if (\n resolvedTarget &&\n resolvedTarget !== resolvedRoot &&\n !resolvedTarget.startsWith(resolvedRoot + path.sep)\n ) {\n throw new Error(\n `Path traversal detected: \"${targetPath}\" resolves outside the connected root`,\n );\n }\n }\n}\n\n/** Allowed file extensions for write/apply-edit operations. */\nconst ALLOWED_WRITE_EXTENSIONS = new Set([\n \".html\",\n \".htm\",\n \".css\",\n \".scss\",\n \".less\",\n \".js\",\n \".jsx\",\n \".ts\",\n \".tsx\",\n \".mjs\",\n \".cjs\",\n \".json\",\n \".md\",\n \".mdx\",\n \".vue\",\n \".svelte\",\n \".astro\",\n \".txt\",\n \".yml\",\n \".yaml\",\n \".svg\",\n]);\n\nfunction assertAllowedExtension(relPath: string): void {\n const ext = path.extname(relPath).toLowerCase();\n if (!ALLOWED_WRITE_EXTENSIONS.has(ext)) {\n throw new Error(\n `Write rejected: extension \"${ext || \"(no extension)\"}\" is not in the allowed text-file list for bridge writes.`,\n );\n }\n}\n\n/**\n * Blocklist for secret-looking paths. Applied to /read-file, /write-file,\n * /apply-edit, AND /list-files so secrets are never returned or served\n * through the bridge, even to a caller holding a valid write grant. Reads of\n * other dotfiles (.gitignore, .prettierrc, etc.) remain allowed.\n *\n * All comparisons are case-insensitive: macOS's default filesystem (and\n * Windows) is case-insensitive, so \".ENV\", \"ID_RSA\", or \"KEY.PEM\" refer to\n * the exact same on-disk file as their lowercase form and must be blocked\n * identically.\n */\nfunction isBlockedSecretPath(relPath: string): boolean {\n const normalized = normalizeSlash(relPath).replace(/^\\/+/, \"\").toLowerCase();\n const segments = normalized.split(\"/\").filter(Boolean);\n if (segments.some((segment) => segment === \".git\")) return true;\n const basename = segments[segments.length - 1] ?? normalized;\n if (/^\\.env/.test(basename)) return true;\n if (/\\.pem$/.test(basename)) return true;\n if (/\\.key$/.test(basename)) return true;\n if (/^id_rsa/.test(basename)) return true;\n return false;\n}\n\nfunction assertNotBlockedSecretPath(relPath: string): void {\n if (isBlockedSecretPath(relPath)) {\n throw new Error(\n `Access rejected: \"${relPath}\" matches a blocked secret-file pattern.`,\n );\n }\n}\n\n/**\n * Compute a cheap, stable version identifier for a file from its stat: mtime\n * plus size. Not a content hash — it is only meant to detect \"did this file\n * change on disk since the caller last read it\", the same tradeoff the inline\n * (SQL-backed) workspace provider's versionHash already makes. Returns\n * undefined when the file does not exist (new-file case).\n */\nasync function computeVersionHash(\n absolutePath: string,\n): Promise<string | undefined> {\n const stat = await fs.stat(absolutePath).catch(() => null);\n if (!stat) return undefined;\n return `${stat.mtimeMs}-${stat.size}`;\n}\n\nfunction countOccurrences(haystack: string, needle: string): number {\n if (!needle) return 0;\n let count = 0;\n let index = haystack.indexOf(needle);\n while (index !== -1) {\n count += 1;\n if (count > 1) return count;\n index = haystack.indexOf(needle, index + 1);\n }\n return count;\n}\n\n// ── /list-files: recursive walk with .gitignore + always-ignore + size/binary\n// filtering ───────────────────────────────────────────────────────────────\n\n/** Directories always excluded from /list-files, regardless of .gitignore. */\nconst ALWAYS_IGNORED_DIR_NAMES = new Set([\n \".git\",\n \"node_modules\",\n \"dist\",\n \"build\",\n \".next\",\n \".output\",\n \".nuxt\",\n \"coverage\",\n \".cache\",\n]);\n\nconst ALWAYS_IGNORED_FILE_NAMES = new Set([\".DS_Store\"]);\n\n/** Binary-looking extensions skipped from /list-files results. */\nconst BINARY_LOOKING_EXTENSIONS = new Set([\n \".png\",\n \".jpg\",\n \".jpeg\",\n \".gif\",\n \".webp\",\n \".ico\",\n \".woff\",\n \".woff2\",\n \".ttf\",\n \".otf\",\n \".eot\",\n \".mp3\",\n \".mp4\",\n \".mov\",\n \".webm\",\n \".zip\",\n \".gz\",\n \".tar\",\n \".pdf\",\n \".wasm\",\n \".fig\",\n \".sketch\",\n]);\n\nconst LIST_FILES_MAX_ENTRIES = 20_000;\nconst LIST_FILES_MAX_BYTES = 2 * 1024 * 1024;\n\nexport interface GitignoreRule {\n /** Raw pattern as read from .gitignore, already trimmed of comments/blank lines. */\n pattern: string;\n /** True when the pattern is anchored to the root (leading \"/\"). */\n anchored: boolean;\n /** True when the pattern only matches directories (trailing \"/\"). */\n dirOnly: boolean;\n}\n\n/**\n * Parse a simple subset of .gitignore syntax: exact names, `dir/`, `*.ext`,\n * and leading-slash root-anchored patterns. This intentionally does not\n * implement full gitignore glob semantics (double-star, negation, etc.) —\n * good enough to keep obviously-ignored build output and local files out of\n * the workbench file tree.\n */\nexport function parseGitignore(contents: string): GitignoreRule[] {\n const rules: GitignoreRule[] = [];\n for (const rawLine of contents.split(/\\r?\\n/)) {\n const line = rawLine.trim();\n if (!line || line.startsWith(\"#\")) continue;\n if (line.startsWith(\"!\")) continue; // negation unsupported in this subset\n const anchored = line.startsWith(\"/\");\n const withoutAnchor = anchored ? line.slice(1) : line;\n const dirOnly = withoutAnchor.endsWith(\"/\");\n const pattern = dirOnly ? withoutAnchor.slice(0, -1) : withoutAnchor;\n if (!pattern) continue;\n rules.push({ pattern, anchored, dirOnly });\n }\n return rules;\n}\n\nfunction globToRegExp(pattern: string): RegExp {\n let out = \"\";\n for (const char of pattern) {\n if (char === \"*\") out += \"[^/]*\";\n else if (char === \"?\") out += \"[^/]\";\n else out += char.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n return new RegExp(`^${out}$`);\n}\n\n/**\n * Test one path segment (or full relative path, for anchored patterns)\n * against a parsed gitignore rule.\n */\nfunction ruleMatches(\n rule: GitignoreRule,\n relPath: string,\n isDir: boolean,\n): boolean {\n if (rule.dirOnly && !isDir) return false;\n const regex = globToRegExp(rule.pattern);\n if (rule.anchored) {\n return regex.test(relPath);\n }\n // Unanchored: match against any path segment (basename) or the full path,\n // mirroring gitignore's \"matches at any depth\" behavior for simple patterns.\n const segments = relPath.split(\"/\");\n return segments.some((segment) => regex.test(segment)) || regex.test(relPath);\n}\n\nexport function isIgnoredByGitignore(\n rules: GitignoreRule[],\n relPath: string,\n isDir: boolean,\n): boolean {\n return rules.some((rule) => ruleMatches(rule, relPath, isDir));\n}\n\n/**\n * Pure predicate: should this file be excluded from /list-files results?\n * Combines the always-ignored directory/file names, the parsed .gitignore\n * rules, the binary-looking extension list, the secret-path blocklist, and\n * the per-file size cap. `sizeBytes` may be omitted when unknown (the always/\n * gitignore/binary/secret checks still apply).\n */\nexport function shouldExcludeFromListing(\n relPath: string,\n options: { gitignore: GitignoreRule[]; sizeBytes?: number },\n): boolean {\n const normalized = normalizeSlash(relPath).replace(/^\\/+/, \"\");\n const segments = normalized.split(\"/\").filter(Boolean);\n if (segments.some((segment) => ALWAYS_IGNORED_DIR_NAMES.has(segment))) {\n return true;\n }\n const basename = segments[segments.length - 1] ?? normalized;\n if (ALWAYS_IGNORED_FILE_NAMES.has(basename)) return true;\n if (isBlockedSecretPath(normalized)) return true;\n if (isIgnoredByGitignore(options.gitignore, normalized, false)) return true;\n // A `dir/` gitignore rule matches the file's ancestor directories too, not\n // just the file itself (e.g. \"build-output/\" must ignore\n // \"build-output/index.html\").\n for (let depth = 1; depth < segments.length; depth += 1) {\n const ancestorPath = segments.slice(0, depth).join(\"/\");\n if (isIgnoredByGitignore(options.gitignore, ancestorPath, true)) {\n return true;\n }\n }\n const ext = path.extname(basename).toLowerCase();\n if (BINARY_LOOKING_EXTENSIONS.has(ext)) return true;\n if (\n typeof options.sizeBytes === \"number\" &&\n options.sizeBytes > LIST_FILES_MAX_BYTES\n ) {\n return true;\n }\n return false;\n}\n\n/**\n * Should this directory be pruned entirely from the walk? Cheaper than\n * checking every descendant file individually once a directory itself is\n * ignored (always-ignored names, gitignore dir rules, or the .git/secret\n * blocklist).\n */\nfunction shouldPruneDirectory(\n relPath: string,\n gitignore: GitignoreRule[],\n): boolean {\n const normalized = normalizeSlash(relPath).replace(/^\\/+/, \"\");\n const segments = normalized.split(\"/\").filter(Boolean);\n const basename = segments[segments.length - 1] ?? normalized;\n if (ALWAYS_IGNORED_DIR_NAMES.has(basename)) return true;\n if (basename === \".git\") return true;\n if (isIgnoredByGitignore(gitignore, normalized, true)) return true;\n return false;\n}\n\nexport interface ListedBridgeFile {\n path: string;\n size: number;\n}\n\nexport interface ListFilesResult {\n files: ListedBridgeFile[];\n truncated: boolean;\n}\n\n/**\n * Recursively walk `rootPath`, honoring .gitignore + the always-ignore list +\n * binary/size/secret filtering, never following symlinks that would escape\n * root (delegates to `assertPathInside`'s realpath confinement per-entry).\n * Caps at `LIST_FILES_MAX_ENTRIES` and reports `truncated` when the cap is\n * hit.\n */\nasync function walkBridgeFiles(rootPath: string): Promise<ListFilesResult> {\n let gitignore: GitignoreRule[] = [];\n try {\n const raw = await fs.readFile(path.join(rootPath, \".gitignore\"), \"utf8\");\n gitignore = parseGitignore(raw);\n } catch {\n // No root .gitignore — proceed with only the always-ignore list.\n }\n\n const files: ListedBridgeFile[] = [];\n let truncated = false;\n const resolvedRoot = await fs.realpath(rootPath);\n\n async function walk(absoluteDir: string, relDir: string): Promise<void> {\n if (truncated) return;\n let entries: fsSync.Dirent[];\n try {\n entries = await fs.readdir(absoluteDir, { withFileTypes: true });\n } catch {\n return;\n }\n // Sort for deterministic output.\n entries.sort((a, b) => a.name.localeCompare(b.name));\n for (const entry of entries) {\n if (truncated) return;\n const relPath = relDir ? `${relDir}/${entry.name}` : entry.name;\n const absolutePath = path.join(absoluteDir, entry.name);\n\n if (entry.isSymbolicLink()) {\n // Never follow symlinks that escape root; resolve and re-check.\n let real: string;\n try {\n real = await fs.realpath(absolutePath);\n } catch {\n continue;\n }\n if (\n real !== resolvedRoot &&\n !real.startsWith(resolvedRoot + path.sep)\n ) {\n continue;\n }\n const stat = await fs.stat(absolutePath).catch(() => null);\n if (!stat) continue;\n if (stat.isDirectory()) {\n if (shouldPruneDirectory(relPath, gitignore)) continue;\n await walk(absolutePath, relPath);\n } else if (stat.isFile()) {\n if (\n !shouldExcludeFromListing(relPath, {\n gitignore,\n sizeBytes: stat.size,\n })\n ) {\n files.push({ path: normalizeSlash(relPath), size: stat.size });\n if (files.length >= LIST_FILES_MAX_ENTRIES) {\n truncated = true;\n return;\n }\n }\n }\n continue;\n }\n\n if (entry.isDirectory()) {\n if (shouldPruneDirectory(relPath, gitignore)) continue;\n await walk(absolutePath, relPath);\n continue;\n }\n\n if (entry.isFile()) {\n const stat = await fs.stat(absolutePath).catch(() => null);\n if (!stat) continue;\n if (\n shouldExcludeFromListing(relPath, {\n gitignore,\n sizeBytes: stat.size,\n })\n ) {\n continue;\n }\n files.push({ path: normalizeSlash(relPath), size: stat.size });\n if (files.length >= LIST_FILES_MAX_ENTRIES) {\n truncated = true;\n return;\n }\n }\n }\n }\n\n await walk(resolvedRoot, \"\");\n return { files, truncated };\n}\n\nexport async function startDesignConnectBridge(\n manifest: DesignConnectManifest,\n): Promise<DesignConnectBridge> {\n // Mint a cryptographically random per-rootPath bridge token. This token is\n // kept in-process only and is never emitted via the public GET routes so that\n // an unauthenticated caller cannot read it. The server-side grant action\n // obtains it out-of-band (via the exported bridge reference).\n const bridgeToken = crypto.randomBytes(32).toString(\"hex\");\n let liveEditBridgeScript = \"\";\n\n const server = http.createServer(\n (req: IncomingMessage, res: ServerResponse) => {\n if (req.method === \"OPTIONS\") {\n sendJson(res, 204, {});\n return;\n }\n\n const pathname = new URL(req.url ?? \"/\", manifest.bridgeUrl).pathname;\n\n // ── Public read-only routes (no token required) ──────────────────────\n\n if (pathname === \"/\" || pathname === \"/manifest.json\") {\n sendJson(res, 200, manifest as unknown as Record<string, unknown>);\n return;\n }\n if (pathname === \"/routes.json\") {\n sendJson(res, 200, {\n version: 1,\n sourceType: \"localhost\",\n devServerUrl: manifest.devServerUrl,\n rootPath: manifest.rootPath,\n routes: manifest.routes,\n generatedAt: manifest.generatedAt,\n });\n return;\n }\n if (pathname === \"/health\") {\n sendJson(res, 200, { ok: true, source: manifest.source });\n return;\n }\n if (pathname === \"/live-edit-bridge\") {\n if (req.method !== \"POST\") {\n sendJson(res, 405, { ok: false, error: \"method not allowed\" });\n return;\n }\n const tokenHeader = req.headers[\"x-bridge-token\"];\n const providedToken =\n typeof tokenHeader === \"string\" ? tokenHeader : \"\";\n let tokenValid = false;\n try {\n tokenValid =\n providedToken.length === bridgeToken.length &&\n crypto.timingSafeEqual(\n Buffer.from(providedToken, \"utf8\"),\n Buffer.from(bridgeToken, \"utf8\"),\n );\n } catch {\n tokenValid = false;\n }\n if (!tokenValid) {\n sendJson(res, 401, {\n ok: false,\n error: \"invalid or missing bridge token\",\n });\n return;\n }\n void (async () => {\n try {\n const raw = await readRequestBody(req);\n const body = JSON.parse(raw) as Record<string, unknown>;\n const script =\n typeof body[\"script\"] === \"string\" ? body[\"script\"] : \"\";\n if (!script.includes(\"agent-native:editor-chrome-ready\")) {\n sendJson(res, 400, {\n ok: false,\n error: \"script must install the Agent Native editor bridge\",\n });\n return;\n }\n liveEditBridgeScript = script;\n sendJson(res, 200, { ok: true });\n } catch (err: unknown) {\n sendJson(res, 400, {\n ok: false,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n })();\n return;\n }\n if (pathname === \"/live-edit\") {\n if (req.method !== \"GET\") {\n sendJson(res, 405, { ok: false, error: \"method not allowed\" });\n return;\n }\n void (async () => {\n try {\n const requestUrl = new URL(req.url ?? \"/\", manifest.bridgeUrl);\n const targetUrl = resolvePreviewSnapshotUrl(\n manifest.devServerUrl,\n requestUrl.searchParams.get(\"url\") ??\n requestUrl.searchParams.get(\"path\"),\n );\n const snapshot = await fetchPreviewSnapshot(\n manifest.devServerUrl,\n targetUrl,\n );\n const includeEditorBridge =\n requestUrl.searchParams.get(\"bridge\") !== \"0\";\n // The dev server route the SPA must boot on (e.g. \"/todo\"), taken\n // from the resolved snapshot target rather than the bridge's own\n // \"/live-edit\" request path.\n const targetParsed = new URL(targetUrl);\n const targetPath =\n `${targetParsed.pathname}${targetParsed.search}` || \"/\";\n const html = injectLiveEditBridge(\n snapshot.html,\n new URL(\"/\", manifest.bridgeUrl).toString(),\n includeEditorBridge ? liveEditBridgeScript : \"\",\n targetPath,\n );\n sendText(\n res,\n snapshot.status >= 400 ? snapshot.status : 200,\n html,\n snapshot.contentType.includes(\"html\")\n ? snapshot.contentType\n : \"text/html; charset=utf-8\",\n );\n } catch (err: unknown) {\n sendJson(res, 400, {\n ok: false,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n })();\n return;\n }\n if (pathname === \"/snapshot\") {\n if (req.method !== \"GET\") {\n sendJson(res, 405, { ok: false, error: \"method not allowed\" });\n return;\n }\n void (async () => {\n try {\n const requestUrl = new URL(req.url ?? \"/\", manifest.bridgeUrl);\n const targetUrl = resolvePreviewSnapshotUrl(\n manifest.devServerUrl,\n requestUrl.searchParams.get(\"url\") ??\n requestUrl.searchParams.get(\"path\"),\n );\n const snapshot = await fetchPreviewSnapshot(\n manifest.devServerUrl,\n targetUrl,\n );\n sendJson(res, snapshot.status >= 400 ? snapshot.status : 200, {\n ok: snapshot.status < 400,\n source: manifest.source,\n url: snapshot.url,\n status: snapshot.status,\n contentType: snapshot.contentType,\n html: snapshot.html,\n });\n } catch (err: unknown) {\n sendJson(res, 400, {\n ok: false,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n })();\n return;\n }\n\n // ── Token-gated write endpoints (POST only) ───────────────────────────\n\n if (\n pathname === \"/read-file\" ||\n pathname === \"/write-file\" ||\n pathname === \"/apply-edit\" ||\n pathname === \"/list-files\"\n ) {\n if (req.method !== \"POST\") {\n sendJson(res, 405, { ok: false, error: \"method not allowed\" });\n return;\n }\n\n // Authenticate with constant-time comparison to prevent timing attacks.\n const tokenHeader = req.headers[\"x-bridge-token\"];\n const providedToken =\n typeof tokenHeader === \"string\" ? tokenHeader : \"\";\n let tokenValid = false;\n try {\n tokenValid =\n providedToken.length === bridgeToken.length &&\n crypto.timingSafeEqual(\n Buffer.from(providedToken, \"utf8\"),\n Buffer.from(bridgeToken, \"utf8\"),\n );\n } catch {\n tokenValid = false;\n }\n if (!tokenValid) {\n sendJson(res, 401, {\n ok: false,\n error: \"invalid or missing bridge token\",\n });\n return;\n }\n\n // Handle asynchronously so we can use await.\n void (async () => {\n try {\n const raw = await readRequestBody(req);\n const body = JSON.parse(raw) as Record<string, unknown>;\n\n if (pathname === \"/list-files\") {\n try {\n const result = await walkBridgeFiles(manifest.rootPath);\n sendJson(res, 200, {\n ok: true,\n files: result.files,\n truncated: result.truncated,\n });\n } catch (err: unknown) {\n sendJson(res, 500, {\n ok: false,\n error: `list-files failed: ${err instanceof Error ? err.message : String(err)}`,\n });\n }\n return;\n }\n\n const relPath =\n typeof body[\"relPath\"] === \"string\" ? body[\"relPath\"] : undefined;\n\n if (!relPath) {\n sendJson(res, 400, { ok: false, error: \"relPath is required\" });\n return;\n }\n\n await assertPathInside(manifest.rootPath, relPath);\n assertNotBlockedSecretPath(relPath);\n const absolutePath = path.resolve(manifest.rootPath, relPath);\n\n if (pathname === \"/read-file\") {\n // Read-file: no extension restriction (agents need to read any\n // non-secret file), but the secret-path blocklist above still\n // applies to .env*, *.pem, *.key, id_rsa*, and anything under .git/.\n let content: string;\n try {\n content = await fs.readFile(absolutePath, \"utf8\");\n } catch (err: unknown) {\n const code =\n err instanceof Error &&\n \"code\" in err &&\n (err as NodeJS.ErrnoException).code;\n if (code === \"ENOENT\") {\n sendJson(res, 404, { ok: false, error: \"file not found\" });\n } else {\n sendJson(res, 500, {\n ok: false,\n error: `read failed: ${err instanceof Error ? err.message : String(err)}`,\n });\n }\n return;\n }\n const versionHash = await computeVersionHash(absolutePath);\n sendJson(res, 200, { ok: true, content, versionHash });\n return;\n }\n\n // write-file and apply-edit only allow known text/code extensions.\n assertAllowedExtension(relPath);\n\n // Optional optimistic-concurrency check: when the caller supplies\n // expectedVersionHash, compare it against the file's CURRENT hash\n // before writing. A missing file is treated as no-conflict (new\n // file case) so first-time writes always succeed.\n const expectedVersionHash =\n typeof body[\"expectedVersionHash\"] === \"string\"\n ? body[\"expectedVersionHash\"]\n : undefined;\n if (expectedVersionHash !== undefined) {\n const currentVersionHash = await computeVersionHash(absolutePath);\n if (\n currentVersionHash !== undefined &&\n currentVersionHash !== expectedVersionHash\n ) {\n sendJson(res, 409, {\n ok: false,\n error: \"version conflict\",\n currentVersionHash,\n });\n return;\n }\n }\n\n if (pathname === \"/write-file\") {\n const content =\n typeof body[\"content\"] === \"string\"\n ? body[\"content\"]\n : undefined;\n if (content === undefined) {\n sendJson(res, 400, {\n ok: false,\n error: \"content is required for write-file\",\n });\n return;\n }\n await fs.mkdir(path.dirname(absolutePath), { recursive: true });\n await fs.writeFile(absolutePath, content, \"utf8\");\n const versionHash = await computeVersionHash(absolutePath);\n sendJson(res, 200, { ok: true, relPath, versionHash });\n return;\n }\n\n // /apply-edit: supports either full replace ({content}) or\n // search-and-replace ({search, replace}).\n if (typeof body[\"content\"] === \"string\") {\n // Full-file replace via apply-edit — same as write-file but keeps\n // the endpoint semantically separate for callers that want to\n // distinguish intent.\n await fs.mkdir(path.dirname(absolutePath), { recursive: true });\n await fs.writeFile(\n absolutePath,\n body[\"content\"] as string,\n \"utf8\",\n );\n const versionHash = await computeVersionHash(absolutePath);\n sendJson(res, 200, {\n ok: true,\n relPath,\n method: \"replace\",\n versionHash,\n });\n return;\n }\n\n const search =\n typeof body[\"search\"] === \"string\" ? body[\"search\"] : undefined;\n const replace =\n typeof body[\"replace\"] === \"string\" ? body[\"replace\"] : undefined;\n if (search === undefined || replace === undefined) {\n sendJson(res, 400, {\n ok: false,\n error:\n \"apply-edit requires either {content} for a full replace, or {search, replace} for a patch\",\n });\n return;\n }\n\n let existing: string;\n try {\n existing = await fs.readFile(absolutePath, \"utf8\");\n } catch (err: unknown) {\n const code =\n err instanceof Error &&\n \"code\" in err &&\n (err as NodeJS.ErrnoException).code;\n if (code === \"ENOENT\") {\n sendJson(res, 404, {\n ok: false,\n error: \"file not found — use write-file to create new files\",\n });\n } else {\n sendJson(res, 500, {\n ok: false,\n error: `read failed: ${err instanceof Error ? err.message : String(err)}`,\n });\n }\n return;\n }\n\n if (search.length === 0) {\n sendJson(res, 400, {\n ok: false,\n error: \"search string must not be empty\",\n });\n return;\n }\n\n const occurrenceCount = countOccurrences(existing, search);\n if (occurrenceCount === 0) {\n sendJson(res, 422, {\n ok: false,\n error: \"search string not found in file\",\n });\n return;\n }\n if (occurrenceCount > 1) {\n sendJson(res, 422, {\n ok: false,\n error:\n \"search string is ambiguous; it appears more than once in the file\",\n });\n return;\n }\n\n const updated = existing.replace(search, replace);\n await fs.writeFile(absolutePath, updated, \"utf8\");\n const versionHash = await computeVersionHash(absolutePath);\n sendJson(res, 200, {\n ok: true,\n relPath,\n method: \"patch\",\n versionHash,\n });\n } catch (err: unknown) {\n sendJson(res, 500, {\n ok: false,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n })();\n return;\n }\n\n if (req.method === \"GET\" || req.method === \"HEAD\") {\n void (async () => {\n try {\n const targetUrl = resolvePreviewProxyUrl(\n manifest.devServerUrl,\n req.url,\n );\n const proxied = await fetchPreviewProxyResource(\n manifest.devServerUrl,\n targetUrl,\n );\n sendBytes(\n res,\n proxied.status >= 400 ? proxied.status : 200,\n req.method === \"HEAD\" ? Buffer.alloc(0) : proxied.body,\n proxied.headers,\n );\n } catch (err: unknown) {\n sendJson(res, 400, {\n ok: false,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n })();\n return;\n }\n\n sendJson(res, 404, { ok: false, error: \"not found\" });\n },\n );\n\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(new URL(manifest.bridgeUrl).port, \"127.0.0.1\", () => {\n server.off(\"error\", reject);\n resolve();\n });\n });\n\n return { server, manifest, bridgeToken };\n}\n\n/**\n * Resolve the design app URL from an explicit value or environment variables.\n * Returns undefined when no URL is configured (registration is optional).\n */\nexport function resolveAppUrl(explicit?: string): string | undefined {\n const raw =\n explicit ||\n process.env[\"AGENT_NATIVE_URL\"] ||\n process.env[\"DESIGN_APP_URL\"] ||\n process.env[\"APP_URL\"] ||\n process.env[\"VITE_APP_URL\"] ||\n process.env[\"BETTER_AUTH_URL\"] ||\n process.env[\"VITE_BETTER_AUTH_URL\"];\n if (!raw) return undefined;\n try {\n const parsed = new URL(raw.trim());\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n return undefined;\n }\n return parsed.toString().replace(/\\/+$/, \"\");\n } catch {\n return undefined;\n }\n}\n\n/**\n * Resolve a bearer token from environment variables for authenticating the\n * self-registration POST. The CLI does not perform a device-code flow — it\n * relies on a pre-minted token supplied via env var (e.g. the same token\n * already written into the agent's MCP config).\n */\nfunction resolveAuthToken(): string | undefined {\n return (\n process.env[\"AGENT_NATIVE_TOKEN\"] ||\n process.env[\"DESIGN_ACCESS_TOKEN\"] ||\n process.env[\"ACCESS_TOKEN\"] ||\n undefined\n );\n}\n\n/**\n * POST to the design app's `connect-localhost` action endpoint to register\n * (or refresh) the bridge connection and persist the real bridge token on the\n * server row. This is a best-effort call: failures are logged but do not\n * abort the bridge process.\n *\n * @param appUrl - Deployed design app base URL (e.g. https://design.agent-native.com)\n * @param bridge - The running bridge returned by startDesignConnectBridge\n * @param authToken - Optional bearer token for the authenticated action route\n */\nexport async function registerConnectionWithServer(\n appUrl: string,\n bridge: DesignConnectBridge,\n authToken?: string,\n): Promise<void> {\n const endpoint = `${appUrl}/_agent-native/actions/connect-localhost`;\n const { manifest, bridgeToken } = bridge;\n const payload = {\n devServerUrl: manifest.devServerUrl,\n bridgeUrl: manifest.bridgeUrl,\n rootPath: manifest.rootPath,\n capabilities: manifest.capabilities.filter((capability) =>\n SERVER_REGISTRATION_BRIDGE_OPERATIONS.has(capability.operation),\n ),\n routeManifest: {\n version: 1 as const,\n sourceType: \"localhost\" as const,\n devServerUrl: manifest.devServerUrl,\n rootPath: manifest.rootPath,\n routes: manifest.routes,\n generatedAt: manifest.generatedAt,\n },\n // Include the real bridge token so the server stores it on the connection\n // row. grant-localhost-write-consent then reads it from the row instead of\n // minting its own unrelated token, which would always produce a 401.\n bridgeToken,\n status: \"connected\" as const,\n };\n\n const headers: Record<string, string> = {\n \"content-type\": \"application/json\",\n };\n if (authToken) {\n headers[\"authorization\"] = `Bearer ${authToken}`;\n }\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 15_000);\n try {\n const res = await fetch(endpoint, {\n method: \"POST\",\n headers,\n body: JSON.stringify(payload),\n signal: controller.signal,\n });\n if (!res.ok) {\n const message = await res.text().catch(() => res.statusText);\n throw new Error(`${res.status} ${message || res.statusText}`);\n }\n } catch (error) {\n // Best-effort: network errors or auth issues are non-fatal, but make the\n // problem discoverable before the user tries \"Apply to source\".\n console.error(\n `[design connect] Could not register bridge with ${endpoint}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n } finally {\n clearTimeout(timeout);\n }\n}\n\nfunction printHelp() {\n console.log(`Usage:\n agent-native design connect [options]\n\nOptions:\n --url <url> Dev server URL to inspect (auto-detected if omitted)\n --port <number> Local bridge port (default ${DEFAULT_BRIDGE_PORT})\n --root <path> App/repo root for route discovery (default cwd)\n --route-manifest <path> Non-destructive route manifest output path\n --app-url <url> Deployed design app URL for self-registration\n (also reads AGENT_NATIVE_URL / DESIGN_APP_URL env)\n --daemon Start the bridge detached, wait for /health, then exit\n --json Print the manifest JSON and exit\n --once Prepare/scaffold the manifest and exit\n --dry-run Print what would be exposed without writing files\n\nElement provenance (resolveNodeToFile):\n The design editor can map a selected DOM element back to its source file,\n line, and React component name when the connected app emits provenance\n attributes at build time. Add one of the following to your app's build:\n\n • @vitejs/plugin-react with jsxDEV enabled (development mode default):\n Sets data-source-file and data-source-line on each JSX element\n automatically when using the Babel transform.\n\n • A Babel source plugin (e.g. babel-plugin-react-source or a custom plugin):\n Emits data-source-file=\"src/Button.tsx\" data-source-line=\"12\"\n data-source-column=\"4\" data-component-name=\"Button\" on each element.\n\n • data-loc=\"src/Button.tsx:12:4\" shorthand attribute (Babel source convention):\n The bridge parses this as { sourceFile, line, column } automatically.\n\n Without these attributes the editor still works; provenance is simply absent.\n Cross-origin localhost iframes cannot be read regardless of attributes (CSP).`);\n}\n\nfunction removeDaemonFlag(argv: string[]): string[] {\n return argv.filter((arg) => arg !== \"--daemon\");\n}\n\nfunction resolveCurrentCliInvocation(argv: string[]): {\n command: string;\n args: string[];\n} {\n const suffixLength = argv.length + 1; // leading \"design\" command + runDesign argv\n const prefixEnd = Math.max(1, process.argv.length - suffixLength);\n const cliPrefix = process.argv.slice(1, prefixEnd);\n const entry = cliPrefix[0] ?? process.argv[1];\n if (!entry) {\n throw new Error(\"Could not resolve current CLI entrypoint for --daemon\");\n }\n if (entry.endsWith(\".ts\") || entry.endsWith(\".tsx\")) {\n return {\n command: \"tsx\",\n args: [...cliPrefix, \"design\", ...removeDaemonFlag(argv)],\n };\n }\n return {\n command: process.execPath,\n args: [...cliPrefix, \"design\", ...removeDaemonFlag(argv)],\n };\n}\n\nasync function startDetachedDesignBridge(\n argv: string[],\n manifest: DesignConnectManifest,\n): Promise<number> {\n if (await waitForBridgeHealth(manifest.bridgeUrl, 800)) {\n const runningManifest = await fetchRunningBridgeManifest(\n manifest.bridgeUrl,\n );\n if (\n runningManifest &&\n designConnectManifestsTargetSameApp(runningManifest, manifest)\n ) {\n console.error(\n `Design localhost bridge already running at ${manifest.bridgeUrl}`,\n );\n console.log(JSON.stringify(runningManifest, null, 2));\n return 0;\n }\n\n console.error(\n [\n `Design localhost bridge already running at ${manifest.bridgeUrl} for a different app.`,\n runningManifest\n ? `Running app: ${runningManifest.devServerUrl} (${runningManifest.rootPath})`\n : \"Running bridge did not expose a compatible manifest.\",\n `Requested app: ${manifest.devServerUrl} (${manifest.rootPath})`,\n \"Stop the existing bridge or choose a different --port.\",\n ].join(\"\\n\"),\n );\n return 1;\n }\n\n const invocation = resolveCurrentCliInvocation(argv);\n const child = spawn(invocation.command, invocation.args, {\n cwd: process.cwd(),\n detached: true,\n env: process.env,\n stdio: \"ignore\",\n shell: process.platform === \"win32\",\n });\n child.unref();\n\n if (await waitForBridgeHealth(manifest.bridgeUrl)) {\n console.error(`Design localhost bridge running at ${manifest.bridgeUrl}`);\n console.log(JSON.stringify(manifest, null, 2));\n return 0;\n }\n\n console.error(\n `Timed out waiting for detached Design bridge at ${manifest.bridgeUrl}`,\n );\n return 1;\n}\n\nexport async function runDesign(argv: string[]) {\n const subcommand = argv[0];\n if (subcommand !== \"connect\") {\n if (\n subcommand === \"help\" ||\n subcommand === \"--help\" ||\n subcommand === \"-h\"\n ) {\n printHelp();\n return 0;\n }\n console.error(\"Usage: agent-native design connect [options]\");\n return 1;\n }\n\n const parsed = parseDesignConnectArgs(argv);\n if (parsed.help) {\n printHelp();\n return 0;\n }\n\n const manifest = await prepareDesignConnectManifest(parsed);\n if (parsed.daemon) {\n return startDetachedDesignBridge(argv, manifest);\n }\n if (parsed.json || parsed.once || parsed.dryRun) {\n console.log(JSON.stringify(manifest, null, 2));\n return 0;\n }\n\n const bridge = await startDesignConnectBridge(manifest);\n console.error(\"Design localhost bridge running\");\n console.error(`Bridge: ${manifest.bridgeUrl}`);\n console.error(`Manifest: ${manifest.bridgeUrl}/manifest.json`);\n console.error(`Routes: ${manifest.routeCount}`);\n console.error(`Dev URL: ${manifest.devServerUrl}`);\n\n // Self-register with the design app server (best-effort): POST the bridge\n // token to connect-localhost so the server row stores the real token. Without\n // it, the bridge and server tokens diverge and every write returns 401.\n const appUrl = resolveAppUrl(parsed.appUrl);\n if (appUrl) {\n void registerConnectionWithServer(appUrl, bridge, resolveAuthToken());\n } else {\n // No app URL means the token never reaches the DB — surface it instead of\n // silently skipping, since live-edit will then 401.\n console.error(\n \"[design connect] No app URL resolved (pass --app-url or set AGENT_NATIVE_URL); skipping self-registration — live-edit will fail to authorize.\",\n );\n }\n\n return await new Promise<number>((resolve) => {\n const stop = () => {\n bridge.server.close(() => resolve(0));\n };\n for (const signal of [\"SIGINT\", \"SIGTERM\", \"SIGHUP\"] as const) {\n process.once(signal, stop);\n }\n });\n}\n"]}
@@ -26,8 +26,8 @@ export declare const getCollabState: import("h3").EventHandlerWithFetch<import("
26
26
  * Body: { update: string (base64), requestSource?: string }
27
27
  */
28
28
  export declare const postCollabUpdate: import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
29
- ok?: undefined;
30
29
  error: string;
30
+ ok?: undefined;
31
31
  } | {
32
32
  error?: undefined;
33
33
  ok: boolean;
@@ -13,8 +13,8 @@
13
13
  * Body: { json: any, fieldName?: string, type?: "map"|"array", requestSource?: string }
14
14
  */
15
15
  export declare const postCollabJson: import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
16
- ok?: undefined;
17
16
  error: string;
17
+ ok?: undefined;
18
18
  } | {
19
19
  error?: undefined;
20
20
  ok: boolean;
@@ -17,12 +17,12 @@ declare const _default: import("../../action.js").ActionDefinition<{
17
17
  id?: undefined;
18
18
  provider?: undefined;
19
19
  } | {
20
- error?: undefined;
21
20
  configured?: undefined;
22
21
  connectPath?: undefined;
23
22
  url: string;
24
23
  id: string;
25
24
  provider: string;
25
+ error?: undefined;
26
26
  }>;
27
27
  export default _default;
28
28
  //# sourceMappingURL=upload-image.d.ts.map
@@ -28,7 +28,7 @@ export declare function createNotificationsHandler(): import("h3").EventHandlerW
28
28
  } | {
29
29
  count?: undefined;
30
30
  updated?: undefined;
31
- error?: undefined;
32
31
  ok: boolean;
32
+ error?: undefined;
33
33
  }>>;
34
34
  //# sourceMappingURL=routes.d.ts.map
@@ -62,7 +62,7 @@ export declare function createObservabilityHandler(): import("h3").EventHandlerW
62
62
  summary?: undefined;
63
63
  spans?: undefined;
64
64
  id?: undefined;
65
- error?: undefined;
66
65
  ok: boolean;
66
+ error?: undefined;
67
67
  }>>;
68
68
  //# sourceMappingURL=routes.d.ts.map
@@ -49,11 +49,11 @@ export declare function handleUpdateResource(event: any): Promise<import("./stor
49
49
  }>;
50
50
  /** DELETE /_agent-native/resources/:id — delete a resource */
51
51
  export declare function handleDeleteResource(event: any): Promise<{
52
- ok?: undefined;
53
52
  error: string;
53
+ ok?: undefined;
54
54
  } | {
55
- error?: undefined;
56
55
  ok: boolean;
56
+ error?: undefined;
57
57
  }>;
58
58
  /** POST /_agent-native/resources/upload — upload a file as a resource */
59
59
  export declare function handleUploadResource(event: any): Promise<import("./store.js").Resource | {
@@ -73,9 +73,9 @@ export declare function handleUploadResource(event: any): Promise<import("./stor
73
73
  runId: string | null;
74
74
  expiresAt: number | null;
75
75
  metadata: string | null;
76
- error?: undefined;
77
76
  url: string;
78
77
  provider: string;
78
+ error?: undefined;
79
79
  }>;
80
80
  export {};
81
81
  //# sourceMappingURL=handlers.d.ts.map
@@ -27,11 +27,11 @@ export declare function resolveAgentEngineApiKeyWriteTarget(event: H3Event, scop
27
27
  export declare function createAgentEngineApiKeyHandler(): import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
28
28
  error: any;
29
29
  } | {
30
- error?: undefined;
31
30
  ok: boolean;
32
31
  key: string;
33
32
  baseUrlKey?: string;
34
33
  scope: AgentEngineApiKeyScope;
34
+ error?: undefined;
35
35
  }>>;
36
36
  export {};
37
37
  //# sourceMappingURL=agent-engine-api-key-route.d.ts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-native/core",
3
- "version": "0.91.0",
3
+ "version": "0.91.1",
4
4
  "description": "Framework for agent-native application development — where AI agents and UI share SQL state, actions, and context",
5
5
  "homepage": "https://github.com/BuilderIO/agent-native#readme",
6
6
  "bugs": {