next-ai-editor 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{AIEditorProvider-D-w9-GZb.js → AIEditorProvider-CFFnEtEB.js} +849 -402
- package/dist/AIEditorProvider-CFFnEtEB.js.map +1 -0
- package/dist/{AIEditorProvider-Bs9zUVrL.cjs → AIEditorProvider-CmiACRfw.cjs} +825 -378
- package/dist/AIEditorProvider-CmiACRfw.cjs.map +1 -0
- package/dist/client/AIEditorProvider.d.ts +8 -16
- package/dist/client/AIEditorProvider.d.ts.map +1 -1
- package/dist/client/fiber-utils.d.ts +35 -0
- package/dist/client/fiber-utils.d.ts.map +1 -0
- package/dist/client/index.d.ts +1 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/query-params.d.ts +9 -0
- package/dist/client/query-params.d.ts.map +1 -0
- package/dist/client.cjs +1 -1
- package/dist/client.js +1 -1
- package/dist/{index-BFa7H-uO.js → index-3OMXRwpD.js} +601 -224
- package/dist/index-3OMXRwpD.js.map +1 -0
- package/dist/{index-DnoYi4f8.cjs → index-9QODCOgD.cjs} +595 -218
- package/dist/index-9QODCOgD.cjs.map +1 -0
- package/dist/index.cjs +6 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +14 -10
- package/dist/path-utils-Bai2xKx9.js +36 -0
- package/dist/path-utils-Bai2xKx9.js.map +1 -0
- package/dist/path-utils-DYzEWUGy.cjs +35 -0
- package/dist/path-utils-DYzEWUGy.cjs.map +1 -0
- package/dist/server/handlers/edit.d.ts.map +1 -1
- package/dist/server/handlers/index.d.ts +1 -0
- package/dist/server/handlers/index.d.ts.map +1 -1
- package/dist/server/handlers/read.d.ts.map +1 -1
- package/dist/server/handlers/resolve.d.ts.map +1 -1
- package/dist/server/handlers/suggestions.d.ts +3 -0
- package/dist/server/handlers/suggestions.d.ts.map +1 -0
- package/dist/server/index.d.ts +1 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/utils/ast.d.ts +10 -0
- package/dist/server/utils/ast.d.ts.map +1 -1
- package/dist/server/utils/source-map.d.ts +5 -0
- package/dist/server/utils/source-map.d.ts.map +1 -1
- package/dist/server.cjs +5 -1
- package/dist/server.cjs.map +1 -1
- package/dist/server.js +13 -9
- package/dist/shared/path-utils.d.ts +24 -0
- package/dist/shared/path-utils.d.ts.map +1 -0
- package/dist/shared/types.d.ts +30 -0
- package/dist/shared/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/AIEditorProvider-Bs9zUVrL.cjs.map +0 -1
- package/dist/AIEditorProvider-D-w9-GZb.js.map +0 -1
- package/dist/index-BFa7H-uO.js.map +0 -1
- package/dist/index-DnoYi4f8.cjs.map +0 -1
package/dist/server.js
CHANGED
|
@@ -1,24 +1,28 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { k, j, m, q, o, x, h, e, a, b, d, g, c, f, i, n, t, u, p, r, w, s, v, l } from "./index-3OMXRwpD.js";
|
|
2
2
|
export {
|
|
3
|
-
|
|
4
|
-
j as
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
k as extractComponentName,
|
|
4
|
+
j as fileExists,
|
|
5
|
+
m as findTargetElement,
|
|
6
|
+
q as getAttributeValue,
|
|
7
|
+
o as getJSXMemberName,
|
|
8
|
+
x as getOriginalPositionFromDebugStack,
|
|
8
9
|
h as handleAIEditorRequest,
|
|
9
10
|
e as handleAbsolutePath,
|
|
10
11
|
a as handleEdit,
|
|
11
12
|
b as handleRead,
|
|
12
13
|
d as handleResolve,
|
|
14
|
+
g as handleSuggestions,
|
|
13
15
|
c as handleUndo,
|
|
14
16
|
f as handleValidateSession,
|
|
15
17
|
i as isPathSecure,
|
|
16
18
|
n as normalizePath,
|
|
17
|
-
|
|
19
|
+
t as parseDebugStack,
|
|
20
|
+
u as parseDebugStackFrames,
|
|
18
21
|
p as parseFile,
|
|
19
22
|
r as resolveFilePath,
|
|
20
|
-
|
|
23
|
+
w as resolveOriginalPosition,
|
|
21
24
|
s as scoreElementMatch,
|
|
22
|
-
v as validateDevMode
|
|
25
|
+
v as validateDevMode,
|
|
26
|
+
l as validateGeneratedCode
|
|
23
27
|
};
|
|
24
28
|
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared path utilities for cleaning and normalizing file paths
|
|
3
|
+
* Used by both client and server for consistent path handling
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Clean a file path by removing protocol prefixes and URL encoding
|
|
7
|
+
* Works with Turbopack, Webpack, and React Server Components paths
|
|
8
|
+
*/
|
|
9
|
+
export declare function cleanPath(filePath: string): string;
|
|
10
|
+
/**
|
|
11
|
+
* Normalize a source path by cleaning it and making it relative to project root
|
|
12
|
+
* @param source - The source path to normalize
|
|
13
|
+
* @param projectRoot - The project root directory
|
|
14
|
+
* @returns Normalized relative path
|
|
15
|
+
*/
|
|
16
|
+
export declare function normalizeSourcePath(source: string, projectRoot: string): string;
|
|
17
|
+
/**
|
|
18
|
+
* Check if a file path should be skipped (e.g., node_modules, framework internals)
|
|
19
|
+
* @param filePath - The file path to check
|
|
20
|
+
* @param additionalSkipPatterns - Additional patterns to skip (optional)
|
|
21
|
+
* @returns true if the path should be skipped
|
|
22
|
+
*/
|
|
23
|
+
export declare function shouldSkipPath(filePath: string, additionalSkipPatterns?: string[]): boolean;
|
|
24
|
+
//# sourceMappingURL=path-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-utils.d.ts","sourceRoot":"","sources":["../../src/shared/path-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAiClD;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAa/E;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,sBAAsB,GAAE,MAAM,EAAO,GACpC,OAAO,CAOT"}
|
package/dist/shared/types.d.ts
CHANGED
|
@@ -6,6 +6,22 @@ export interface ElementContext {
|
|
|
6
6
|
nthOfType?: number;
|
|
7
7
|
props?: Record<string, unknown>;
|
|
8
8
|
}
|
|
9
|
+
export interface SourceLocation {
|
|
10
|
+
filePath: string;
|
|
11
|
+
lineNumber: number;
|
|
12
|
+
columnNumber: number;
|
|
13
|
+
componentName: string;
|
|
14
|
+
elementContext?: ElementContext;
|
|
15
|
+
debugStack?: string;
|
|
16
|
+
parentComponent?: {
|
|
17
|
+
filePath: string;
|
|
18
|
+
lineNumber: number;
|
|
19
|
+
columnNumber: number;
|
|
20
|
+
componentName: string;
|
|
21
|
+
debugStack?: string;
|
|
22
|
+
childKey?: string;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
9
25
|
export interface PersistedSession {
|
|
10
26
|
sessionId: string;
|
|
11
27
|
version: string;
|
|
@@ -25,6 +41,7 @@ export interface PersistedSession {
|
|
|
25
41
|
error?: string;
|
|
26
42
|
timestamp: number;
|
|
27
43
|
fileSnapshot?: string;
|
|
44
|
+
editedFilePath?: string;
|
|
28
45
|
modifiedLines?: {
|
|
29
46
|
start: number;
|
|
30
47
|
end: number;
|
|
@@ -41,4 +58,17 @@ export interface PersistedSession {
|
|
|
41
58
|
modalWasOpen: boolean;
|
|
42
59
|
};
|
|
43
60
|
}
|
|
61
|
+
export interface SuggestionsRequest {
|
|
62
|
+
componentName: string;
|
|
63
|
+
elementTag?: string;
|
|
64
|
+
className?: string;
|
|
65
|
+
textContent?: string;
|
|
66
|
+
lastSuggestion?: string;
|
|
67
|
+
editHistory?: string;
|
|
68
|
+
}
|
|
69
|
+
export interface SuggestionsResponse {
|
|
70
|
+
success: boolean;
|
|
71
|
+
suggestions: string[];
|
|
72
|
+
error?: string;
|
|
73
|
+
}
|
|
44
74
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IAErB,cAAc,EAAE;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,cAAc,CAAC,EAAE,cAAc,CAAC;QAChC,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IAEF,WAAW,EAAE,KAAK,CAAC;QACjB,EAAE,EAAE,MAAM,CAAC;QACX,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,OAAO,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,aAAa,CAAC,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,MAAM,CAAA;SAAE,CAAC;QAC/C,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC,CAAC;IAEH,cAAc,EAAE;QACd,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;QACtB,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;IAEF,OAAO,EAAE;QACP,iBAAiB,EAAE,MAAM,CAAC;QAC1B,YAAY,EAAE,OAAO,CAAC;KACvB,CAAC;CACH"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IAErB,cAAc,EAAE;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,cAAc,CAAC,EAAE,cAAc,CAAC;QAChC,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IAEF,WAAW,EAAE,KAAK,CAAC;QACjB,EAAE,EAAE,MAAM,CAAC;QACX,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,OAAO,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,aAAa,CAAC,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,MAAM,CAAA;SAAE,CAAC;QAC/C,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC,CAAC;IAEH,cAAc,EAAE;QACd,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;QACtB,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;IAEF,OAAO,EAAE;QACP,iBAAiB,EAAE,MAAM,CAAC;QAC1B,YAAY,EAAE,OAAO,CAAC;KACvB,CAAC;CACH;AAED,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AIEditorProvider-Bs9zUVrL.cjs","sources":["../src/shared/storage.ts","../src/client/AIEditorProvider.tsx"],"sourcesContent":["// =============================================================================\n// FILE: lib/ai-editor-storage.ts\n// Session storage management for AI editor using localStorage\n// =============================================================================\n\nimport type { ElementContext, PersistedSession } from \"./types\";\n\n// Re-export types for convenience\nexport type { ElementContext, PersistedSession };\n\n// =============================================================================\n// STORAGE UTILITY CLASS\n// =============================================================================\n\nexport class AIEditorStorage {\n private static readonly STORAGE_PREFIX = \"ai-editor:session:\";\n private static readonly VERSION = \"1.0.0\";\n private static readonly MAX_STORAGE_SIZE = 5 * 1024 * 1024; // 5MB\n\n /**\n * Generate storage key from file path and component name\n * Format: \"ai-editor:session:components/Header.tsx#Header\"\n */\n static getSessionKey(filePath: string, componentName: string): string {\n // Normalize path separators\n const normalizedPath = filePath.replace(/\\\\/g, \"/\");\n return `${this.STORAGE_PREFIX}${normalizedPath}#${componentName}`;\n }\n\n /**\n * Save session to localStorage\n */\n static saveSession(session: PersistedSession): boolean {\n try {\n const key = this.getSessionKey(\n session.sourceLocation.filePath,\n session.sourceLocation.componentName\n );\n\n // Check storage size before saving\n if (this.getStorageSize() > this.MAX_STORAGE_SIZE) {\n console.warn(\"Storage size exceeded, pruning old sessions...\");\n this.pruneOldSessions(7 * 24 * 60 * 60 * 1000); // 7 days\n }\n\n const serialized = JSON.stringify(session);\n localStorage.setItem(key, serialized);\n return true;\n } catch (e) {\n if (e instanceof Error && e.name === \"QuotaExceededError\") {\n console.error(\"localStorage quota exceeded\");\n // Try pruning and retry\n this.pruneOldSessions(7 * 24 * 60 * 60 * 1000);\n try {\n const key = this.getSessionKey(\n session.sourceLocation.filePath,\n session.sourceLocation.componentName\n );\n const serialized = JSON.stringify(session);\n localStorage.setItem(key, serialized);\n return true;\n } catch {\n return false;\n }\n }\n console.error(\"Failed to save session:\", e);\n return false;\n }\n }\n\n /**\n * Load session by filePath + componentName\n */\n static loadSession(\n filePath: string,\n componentName: string\n ): PersistedSession | null {\n try {\n const key = this.getSessionKey(filePath, componentName);\n const stored = localStorage.getItem(key);\n\n if (!stored) return null;\n\n const session = JSON.parse(stored) as PersistedSession;\n\n // Validate schema\n if (!session.version || !session.sourceLocation || !session.editHistory) {\n console.warn(\"Invalid session schema, removing corrupted data\");\n localStorage.removeItem(key);\n return null;\n }\n\n return session;\n } catch (e) {\n console.error(\"Failed to load session:\", e);\n // Remove corrupted data\n const key = this.getSessionKey(filePath, componentName);\n localStorage.removeItem(key);\n return null;\n }\n }\n\n /**\n * Delete specific session\n */\n static deleteSession(filePath: string, componentName: string): void {\n try {\n const key = this.getSessionKey(filePath, componentName);\n localStorage.removeItem(key);\n } catch (e) {\n console.error(\"Failed to delete session:\", e);\n }\n }\n\n /**\n * Get all session keys\n */\n static getAllSessionKeys(): string[] {\n const keys: string[] = [];\n try {\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key && key.startsWith(this.STORAGE_PREFIX)) {\n keys.push(key);\n }\n }\n } catch (e) {\n console.error(\"Failed to get session keys:\", e);\n }\n return keys;\n }\n\n /**\n * Clear all sessions\n */\n static clearAllSessions(): void {\n try {\n const keys = this.getAllSessionKeys();\n keys.forEach((key) => localStorage.removeItem(key));\n console.log(`Cleared ${keys.length} session(s)`);\n } catch (e) {\n console.error(\"Failed to clear sessions:\", e);\n }\n }\n\n /**\n * Get total storage usage in bytes\n */\n static getStorageSize(): number {\n let total = 0;\n try {\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key && key.startsWith(this.STORAGE_PREFIX)) {\n const value = localStorage.getItem(key);\n if (value) {\n // Approximate size: 2 bytes per character in UTF-16\n total += (key.length + value.length) * 2;\n }\n }\n }\n } catch (e) {\n console.error(\"Failed to calculate storage size:\", e);\n }\n return total;\n }\n\n /**\n * Remove sessions older than maxAge milliseconds\n */\n static pruneOldSessions(maxAge: number): void {\n try {\n const now = Date.now();\n const keys = this.getAllSessionKeys();\n\n keys.forEach((key) => {\n const value = localStorage.getItem(key);\n if (!value) return;\n\n try {\n const session = JSON.parse(value) as PersistedSession;\n const age = now - session.lastModified;\n\n if (age > maxAge) {\n console.log(`Pruning old session: ${key} (age: ${Math.round(age / (24 * 60 * 60 * 1000))} days)`);\n localStorage.removeItem(key);\n }\n } catch (e) {\n // Corrupted data, remove it\n console.warn(`Removing corrupted session: ${key}`);\n localStorage.removeItem(key);\n }\n });\n } catch (e) {\n console.error(\"Failed to prune sessions:\", e);\n }\n }\n\n /**\n * Compute SHA-256 hash of file content using Web Crypto API\n */\n static async hashFileContent(content: string): Promise<string> {\n try {\n // Use Web Crypto API (available in browsers)\n const encoder = new TextEncoder();\n const data = encoder.encode(content);\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", data);\n\n // Convert buffer to hex string\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n const hashHex = hashArray\n .map((byte) => byte.toString(16).padStart(2, \"0\"))\n .join(\"\");\n\n return hashHex;\n } catch (e) {\n console.error(\"Failed to hash content:\", e);\n // Fallback: use simple hash for consistency\n return this.simpleHash(content);\n }\n }\n\n /**\n * Simple hash fallback (for environments without Web Crypto API)\n */\n private static simpleHash(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32-bit integer\n }\n return hash.toString(16);\n }\n\n /**\n * Get most recently modified session\n */\n static getLastActiveSession(): PersistedSession | null {\n try {\n const keys = this.getAllSessionKeys();\n if (keys.length === 0) return null;\n\n let latestSession: PersistedSession | null = null;\n let latestTime = 0;\n\n keys.forEach((key) => {\n const value = localStorage.getItem(key);\n if (!value) return;\n\n try {\n const session = JSON.parse(value) as PersistedSession;\n\n // Validate schema\n if (!session.version || !session.sourceLocation || !session.editHistory) {\n console.warn(`Skipping invalid session: ${key}`);\n return;\n }\n\n if (session.lastModified > latestTime) {\n latestTime = session.lastModified;\n latestSession = session;\n }\n } catch (e) {\n console.warn(`Skipping corrupted session: ${key}`);\n }\n });\n\n return latestSession;\n } catch (e) {\n console.error(\"Failed to get last active session:\", e);\n return null;\n }\n }\n}\n","\"use client\";\n\nimport React, {\n createContext,\n useContext,\n useState,\n useCallback,\n useEffect,\n ReactNode,\n} from \"react\";\nimport { Prism as SyntaxHighlighter } from \"react-syntax-highlighter\";\nimport { vscDarkPlus, vs } from \"react-syntax-highlighter/dist/esm/styles/prism\";\nimport { AIEditorStorage, type PersistedSession } from \"../shared/storage\";\n\n// =============================================================================\n// FEATURE FLAGS\n// =============================================================================\n\nconst ENABLE_SESSION_PERSISTENCE = false; // TODO: Enable when fully tested\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\ninterface ElementContext {\n tagName: string;\n textContent?: string;\n className?: string;\n key?: string;\n nthOfType?: number;\n props?: Record<string, any>;\n}\n\nexport interface SourceLocation {\n filePath: string;\n lineNumber: number;\n columnNumber: number;\n componentName: string;\n elementContext?: ElementContext;\n debugStack?: string; // Raw _debugStack for server-side source map resolution\n}\n\ninterface ResolvedSourceInfo {\n filePath: string;\n lineNumber: number;\n columnNumber: number;\n}\n\nconst sourceResolutionCache = new Map<string, ResolvedSourceInfo>();\nconst inflightSourceResolutions = new Map<\n string,\n Promise<ResolvedSourceInfo | null>\n>();\n\nfunction inferComponentNameFromPath(filePath: string): string {\n // Extract component name from file path\n // e.g., \"components/ProductCard.tsx\" -> \"ProductCard\"\n const fileName = filePath.split(\"/\").pop() || \"\";\n const nameWithoutExt = fileName.replace(/\\.(tsx?|jsx?)$/, \"\");\n return nameWithoutExt.charAt(0).toUpperCase() + nameWithoutExt.slice(1);\n}\n\nasync function resolveSourceLocation(\n source: SourceLocation,\n): Promise<SourceLocation | null> {\n if (typeof window === \"undefined\" || process.env.NODE_ENV !== \"development\") {\n return null;\n }\n\n // Need debugStack to resolve\n if (!source.debugStack) {\n console.warn(\"No debugStack available for resolution:\", source);\n return null;\n }\n\n const cacheKey = source.debugStack;\n const cached = sourceResolutionCache.get(cacheKey);\n if (cached) {\n const resolved = { ...source, ...cached };\n // If component name is Unknown, infer from resolved file path\n if (resolved.componentName === \"Unknown\" && resolved.filePath) {\n resolved.componentName = inferComponentNameFromPath(resolved.filePath);\n }\n return resolved;\n }\n\n let inflight = inflightSourceResolutions.get(cacheKey);\n if (!inflight) {\n inflight = fetch(\"/api/ai-editor/resolve\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ debugStack: cacheKey }),\n })\n .then(async (res) => {\n if (!res.ok) {\n const errorText = await res.text();\n console.error(\n `Resolve API error ${res.status}:`,\n errorText,\n \"for stack:\",\n cacheKey.substring(0, 200),\n );\n // Fallback: Try to infer file path from component name\n return inferFilePathFromComponentName(source.componentName);\n }\n const data = await res.json();\n if (data?.success && data.filePath && data.lineNumber) {\n const resolved: ResolvedSourceInfo = {\n filePath: data.filePath,\n lineNumber: data.lineNumber,\n columnNumber:\n typeof data.columnNumber === \"number\"\n ? data.columnNumber\n : source.columnNumber,\n };\n sourceResolutionCache.set(cacheKey, resolved);\n return resolved;\n }\n console.warn(\"Resolve API returned unsuccessful response:\", data);\n // Fallback: Try to infer file path from component name\n return inferFilePathFromComponentName(source.componentName);\n })\n .catch((err) => {\n console.error(\"Error calling resolve API:\", err);\n // Fallback: Try to infer file path from component name\n return inferFilePathFromComponentName(source.componentName);\n })\n .finally(() => {\n inflightSourceResolutions.delete(cacheKey);\n });\n\n inflightSourceResolutions.set(cacheKey, inflight);\n }\n\n const resolvedInfo = await inflight;\n if (!resolvedInfo) return null;\n\n const resolved = {\n ...source,\n filePath: resolvedInfo.filePath,\n lineNumber: resolvedInfo.lineNumber,\n columnNumber: resolvedInfo.columnNumber,\n };\n\n // If component name is Unknown, infer from resolved file path\n if (resolved.componentName === \"Unknown\" && resolved.filePath) {\n resolved.componentName = inferComponentNameFromPath(resolved.filePath);\n }\n\n return resolved;\n}\n\nasync function inferFilePathFromComponentName(\n componentName: string,\n): Promise<ResolvedSourceInfo | null> {\n if (!componentName || componentName === \"Unknown\") return null;\n\n // Try common locations for components\n const possiblePaths = [\n `components/${componentName}.tsx`,\n `components/${componentName}.jsx`,\n `app/${componentName}.tsx`,\n `app/${componentName}.jsx`,\n `src/components/${componentName}.tsx`,\n `src/components/${componentName}.jsx`,\n ];\n\n // Check which file exists by trying to read it\n for (const tryPath of possiblePaths) {\n try {\n const response = await fetch(\n `/api/ai-editor/absolute-path?path=${encodeURIComponent(tryPath)}`,\n );\n if (response.ok) {\n const data = await response.json();\n if (data.success) {\n console.log(\n `Inferred file path for ${componentName}: ${tryPath}`,\n );\n return {\n filePath: tryPath,\n lineNumber: 1,\n columnNumber: 0,\n };\n }\n }\n } catch (err) {\n // Continue trying other paths\n }\n }\n\n console.warn(`Could not infer file path for component: ${componentName}`);\n return null;\n}\n\ninterface FiberNode {\n tag: number;\n type: any;\n return: FiberNode | null;\n key: string | null;\n memoizedProps?: any;\n pendingProps?: any;\n _debugSource?: {\n fileName: string;\n lineNumber: number;\n columnNumber?: number;\n };\n _debugOwner?: FiberNode;\n _debugInfo?: any;\n _debugStack?: any;\n}\n\ninterface EditHistoryItem {\n id: string; // Unique identifier for each edit\n suggestion: string;\n success: boolean;\n error?: string;\n timestamp: number;\n // Undo support\n fileSnapshot?: string; // File content BEFORE this edit\n modifiedLines?: {\n // Lines that were changed\n start: number;\n end: number;\n };\n generatedCode?: string; // AI-generated code\n}\n\ninterface EditorContextType {\n isEnabled: boolean;\n setEnabled: (enabled: boolean) => void;\n selectedSource: SourceLocation | null;\n setSelectedSource: (el: SourceLocation | null) => void;\n selectedDOMElement: Element | null;\n isLoading: boolean;\n setIsLoading: (loading: boolean) => void;\n editHistory: EditHistoryItem[];\n setEditHistory: React.Dispatch<React.SetStateAction<EditHistoryItem[]>>;\n submitEdit: (\n suggestion: string,\n ) => Promise<{ success: boolean; error?: string }>;\n}\n\n// =============================================================================\n// CONTEXT\n// =============================================================================\n\nconst EditorContext = createContext<EditorContextType | null>(null);\n\nexport function useAIEditor() {\n const ctx = useContext(EditorContext);\n if (!ctx) throw new Error(\"useAIEditor must be used within AIEditorProvider\");\n return ctx;\n}\n\n// =============================================================================\n// FIBER UTILITIES\n// =============================================================================\n\nfunction getFiberFromElement(element: Element): FiberNode | null {\n const key = Object.keys(element).find(\n (k) =>\n k.startsWith(\"__reactFiber$\") || k.startsWith(\"__reactInternalInstance$\"),\n );\n return key ? (element as any)[key] : null;\n}\n\nfunction getComponentName(fiber: FiberNode | null): string {\n if (!fiber) return \"Unknown\";\n const type = fiber.type;\n if (typeof type === \"string\") return type;\n if (typeof type === \"function\")\n return type.displayName || type.name || \"Anonymous\";\n if (type?.displayName) return type.displayName;\n if (type?.render?.name) return type.render.name;\n return \"Unknown\";\n}\n\nfunction isUserComponent(fiber: FiberNode): boolean {\n if (fiber.tag === 5 || fiber.tag === 6 || fiber.tag === 3) return false;\n const type = fiber.type;\n if (!type || typeof type === \"string\") return false;\n return true;\n}\n\n// =============================================================================\n// ELEMENT CONTEXT CAPTURE\n// =============================================================================\n\nfunction captureElementContext(\n element: Element,\n fiber: FiberNode | null,\n): ElementContext {\n const tagName = element.tagName.toLowerCase();\n\n // Text content (direct text only, truncated)\n let textContent: string | undefined;\n const directText = Array.from(element.childNodes)\n .filter((n) => n.nodeType === Node.TEXT_NODE)\n .map((n) => n.textContent?.trim())\n .filter(Boolean)\n .join(\" \");\n\n if (directText) {\n textContent = directText.slice(0, 50);\n } else if (element.textContent) {\n textContent = element.textContent.trim().slice(0, 50);\n }\n\n // Class name\n const className =\n typeof element.className === \"string\"\n ? element.className.slice(0, 100)\n : undefined;\n\n // Count nth of type within component\n const nthOfType = countNthOfType(element, tagName);\n\n // React key\n const key = fiber?.key ? String(fiber.key) : undefined;\n\n // Identifying props\n const props = extractProps(fiber);\n\n return { tagName, textContent, className, key, nthOfType, props };\n}\n\nfunction countNthOfType(element: Element, tagName: string): number {\n let boundary: Element | null = element.parentElement;\n\n // Find component boundary\n while (boundary) {\n const fiber = getFiberFromElement(boundary);\n if (fiber && isUserComponent(fiber)) break;\n boundary = boundary.parentElement;\n }\n\n if (!boundary) boundary = element.parentElement;\n if (!boundary) return 1;\n\n // Get all matching elements INCLUDING the boundary itself\n const sameTagElements: Element[] = [];\n\n // Check if boundary itself matches\n if (boundary.tagName.toLowerCase() === tagName.toLowerCase()) {\n sameTagElements.push(boundary);\n }\n\n // Add all descendants that match\n sameTagElements.push(...Array.from(boundary.querySelectorAll(tagName)));\n\n let count = 1;\n for (const el of sameTagElements) {\n if (el === element) break;\n count++;\n }\n\n console.log(\n `[countNthOfType] tagName=${tagName}, found ${sameTagElements.length} elements (including boundary), this is #${count}`,\n );\n\n return count;\n}\n\nfunction extractProps(\n fiber: FiberNode | null,\n): Record<string, any> | undefined {\n if (!fiber) return undefined;\n\n const fiberProps = fiber.memoizedProps || fiber.pendingProps;\n if (!fiberProps || typeof fiberProps !== \"object\") return undefined;\n\n const props: Record<string, any> = {};\n const identifyingKeys = [\n \"id\",\n \"name\",\n \"type\",\n \"href\",\n \"src\",\n \"alt\",\n \"role\",\n \"aria-label\",\n \"data-testid\",\n ];\n\n for (const key of identifyingKeys) {\n if (key in fiberProps && typeof fiberProps[key] === \"string\") {\n props[key] = fiberProps[key];\n }\n }\n\n if (fiberProps.style && typeof fiberProps.style === \"object\") {\n props._styleKeys = Object.keys(fiberProps.style).slice(0, 5);\n }\n\n return Object.keys(props).length > 0 ? props : undefined;\n}\n\n// =============================================================================\n// SOURCE LOCATION FINDER\n// =============================================================================\n\nfunction findSourceFromFiber(\n fiber: FiberNode | null,\n): Omit<SourceLocation, \"elementContext\"> | null {\n if (!fiber) return null;\n\n let current: FiberNode | null = fiber;\n const visited = new Set<FiberNode>();\n\n while (current && !visited.has(current)) {\n visited.add(current);\n\n // Try to get source from various debug properties\n const sourceData =\n current._debugSource ||\n extractFromDebugStack(current) ||\n extractFromDebugOwner(current);\n\n if (sourceData?.fileName) {\n const filePath = cleanPath(sourceData.fileName);\n\n if (!shouldSkip(filePath)) {\n // Walk up to find the nearest user component (skip Next.js internals)\n let componentFiber: FiberNode | null = current;\n while (componentFiber) {\n if (isUserComponent(componentFiber)) {\n const componentName = getComponentName(componentFiber);\n\n // Skip Next.js internal components\n const isNextJSInternal = [\n \"Segment\",\n \"Boundary\",\n \"Router\",\n \"Handler\",\n \"Context\",\n \"Layout\",\n \"Template\",\n \"Scroll\",\n \"Focus\",\n \"Loading\",\n \"Error\",\n ].some((pattern) => componentName.includes(pattern));\n\n if (!isNextJSInternal) {\n // Capture the raw _debugStack for server-side source map resolution\n const rawDebugStack = current._debugStack\n ? String(current._debugStack.stack || current._debugStack)\n : undefined;\n\n return {\n filePath,\n lineNumber: sourceData.lineNumber || 1,\n columnNumber: sourceData.columnNumber || 0,\n componentName,\n debugStack: rawDebugStack,\n };\n }\n }\n componentFiber =\n componentFiber.return || componentFiber._debugOwner || null;\n }\n }\n }\n\n current = current.return || current._debugOwner || null;\n }\n\n return null;\n}\n\nfunction extractFromDebugStack(\n fiber: FiberNode,\n): { fileName: string; lineNumber: number; columnNumber?: number } | null {\n const stack = (fiber as any)._debugStack;\n if (!stack) return null;\n\n const stackStr = stack.stack || String(stack);\n const frames = stackStr.split(\"\\n\");\n\n const skipPatterns = [\n \"node_modules\",\n \"SegmentViewNode\",\n \"LayoutRouter\",\n \"ErrorBoundary\",\n \"fakeJSXCallSite\",\n ];\n\n for (const frame of frames) {\n if (skipPatterns.some((p) => frame.includes(p))) continue;\n\n // Match: at Name (path:line:col)\n const match = frame.match(/at\\s+(\\w+)\\s+\\((.+?):(\\d+):(\\d+)\\)?$/);\n if (match) {\n const fileName = cleanPath(match[2].replace(/\\?[^:]*$/, \"\"));\n if (!shouldSkip(fileName)) {\n return {\n fileName,\n lineNumber: parseInt(match[3], 10),\n columnNumber: parseInt(match[4], 10),\n };\n }\n }\n }\n return null;\n}\n\nfunction extractFromDebugOwner(\n fiber: FiberNode,\n): { fileName: string; lineNumber: number; columnNumber?: number } | null {\n const owner = (fiber as any)._debugOwner;\n if (!owner) return null;\n\n if (owner._debugSource?.fileName) {\n return owner._debugSource;\n }\n\n const stack = owner.stack;\n if (Array.isArray(stack) && stack[0]?.fileName) {\n return stack[0];\n }\n\n return null;\n}\n\nfunction cleanPath(p: string): string {\n // With turbopack, preserve the actual file path, only remove protocol prefixes\n // Handle file:// URLs and URL encoding\n let cleaned = p;\n\n // Remove file:// protocol first\n if (cleaned.startsWith(\"file://\")) {\n cleaned = cleaned.replace(/^file:\\/\\//, \"\");\n }\n\n // Decode URL-encoded paths\n try {\n if (cleaned.includes(\"%\")) {\n cleaned = decodeURIComponent(cleaned);\n }\n } catch (e) {\n // If decoding fails, continue with original\n }\n\n // Remove other protocol prefixes\n cleaned = cleaned\n .replace(/^webpack-internal:\\/\\/\\/\\([^)]+\\)\\/\\.\\//, \"\")\n .replace(/^webpack-internal:\\/\\/\\/\\([^)]+\\)\\//, \"\")\n .replace(/^webpack-internal:\\/\\//, \"\")\n .replace(/^webpack:\\/\\/[^/]*\\//, \"\")\n .replace(/^about:\\/\\/React\\/Server\\//, \"\")\n .replace(/^\\([^)]+\\)\\//, \"\")\n .replace(/^\\.\\//, \"\")\n .replace(/\\?.*$/, \"\");\n\n return cleaned;\n}\n\nfunction shouldSkip(p: string): boolean {\n if (!p) return true;\n return [\"node_modules\", \"next/dist\", \"react-dom\", \"ai-editor-provider\"].some(\n (s) => p.includes(s),\n );\n}\n\n// =============================================================================\n// GET SOURCE FROM ELEMENT (Main export)\n// =============================================================================\n\nfunction getSourceFromElement(element: Element): SourceLocation | null {\n // Walk up DOM to find element with fiber\n let current: Element | null = element;\n let fiber: FiberNode | null = null;\n\n while (current && current !== document.body) {\n fiber = getFiberFromElement(current);\n if (fiber) break;\n current = current.parentElement;\n }\n\n if (!fiber) return null;\n\n const source = findSourceFromFiber(fiber);\n if (!source) return null;\n\n // Add element context for precise matching\n const elementContext = captureElementContext(element, fiber);\n\n return { ...source, elementContext };\n}\n\n// Debug helper\nif (typeof window !== \"undefined\") {\n (window as any).__getSource = getSourceFromElement;\n}\n\n// =============================================================================\n// PROVIDER\n// =============================================================================\n\nexport function AIEditorProvider({\n children,\n theme = \"dark\",\n}: {\n children: ReactNode;\n theme?: \"light\" | \"dark\";\n}) {\n const [isEnabled, setEnabled] = useState(false);\n const [selectedSource, setSelectedSource] = useState<SourceLocation | null>(\n null,\n );\n const [selectedDOMElement, setSelectedDOMElement] = useState<Element | null>(\n null,\n );\n const [isLoading, setIsLoading] = useState(false);\n const [editHistory, setEditHistory] = useState<EditHistoryItem[]>([]);\n const [showStaleWarning, setShowStaleWarning] = useState(false);\n const [staleSession, setStaleSession] = useState<PersistedSession | null>(null);\n const [hasActiveSession, setHasActiveSession] = useState(false);\n\n useEffect(() => {\n const handleKey = (e: KeyboardEvent) => {\n if (\n (e.ctrlKey || e.metaKey) &&\n e.shiftKey &&\n e.key.toLowerCase() === \"e\"\n ) {\n e.preventDefault();\n setEnabled((p) => !p);\n }\n };\n window.addEventListener(\"keydown\", handleKey);\n return () => window.removeEventListener(\"keydown\", handleKey);\n }, []);\n\n // Auto-restore last session on mount\n useEffect(() => {\n if (!ENABLE_SESSION_PERSISTENCE) return;\n if (typeof window === \"undefined\") return;\n\n const lastSession = AIEditorStorage.getLastActiveSession();\n if (!lastSession) return;\n\n setHasActiveSession(true);\n\n // Validate session\n fetch(\"/api/ai-editor/validate-session\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n filePath: lastSession.sourceLocation.filePath,\n lastKnownHash: lastSession.fileValidation.lastKnownHash,\n lastKnownSize: lastSession.fileValidation.lastKnownSize,\n }),\n })\n .then((r) => r.json())\n .then((result) => {\n if (!result.isValid) {\n setStaleSession(lastSession);\n setShowStaleWarning(true);\n } else {\n restoreSession(lastSession);\n }\n })\n .catch((err) => {\n console.error(\"Session validation failed:\", err);\n // On error, show warning (safer than auto-restore)\n setStaleSession(lastSession);\n setShowStaleWarning(true);\n });\n }, []);\n\n const restoreSession = useCallback(async (session: PersistedSession) => {\n const sourceLocation = session.sourceLocation;\n\n setSelectedSource(sourceLocation);\n setEditHistory(session.editHistory);\n\n // Trigger async source resolution if needed\n if (sourceLocation.debugStack) {\n const resolved = await resolveSourceLocation(sourceLocation);\n if (resolved) {\n setSelectedSource(resolved);\n }\n }\n }, []);\n\n const handleClearSession = useCallback(() => {\n if (selectedSource) {\n AIEditorStorage.deleteSession(\n selectedSource.filePath,\n selectedSource.componentName\n );\n setHasActiveSession(false);\n setSelectedSource(null);\n setEditHistory([]);\n }\n }, [selectedSource]);\n\n const submitEdit = useCallback(\n async (suggestion: string) => {\n if (!selectedSource)\n return { success: false, error: \"No element selected\" };\n\n setIsLoading(true);\n try {\n const res = await fetch(\"/api/ai-editor/edit\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n filePath: selectedSource.filePath,\n lineNumber: selectedSource.lineNumber,\n componentName: selectedSource.componentName,\n suggestion,\n // NEW: Pass element context for precise matching\n elementContext: selectedSource.elementContext,\n // Pass debugStack for server-side source map resolution\n debugStack: selectedSource.debugStack,\n // Pass edit history for context\n editHistory: editHistory.map((item) => ({\n suggestion: item.suggestion,\n success: item.success,\n })),\n }),\n });\n const result = await res.json();\n\n // Generate unique ID for this edit\n const editId =\n Date.now().toString(36) + Math.random().toString(36).substring(2);\n\n // Create new history item\n const newHistoryItem = {\n id: editId,\n suggestion,\n success: result.success,\n error: result.error,\n timestamp: Date.now(),\n fileSnapshot: result.fileSnapshot,\n generatedCode: result.generatedCode,\n modifiedLines: result.modifiedLines,\n };\n\n // Add to history\n setEditHistory((prev) => [...prev, newHistoryItem]);\n\n // Save session to localStorage\n if (ENABLE_SESSION_PERSISTENCE && selectedSource && result.fileSnapshot) {\n try {\n const hash = await AIEditorStorage.hashFileContent(result.fileSnapshot);\n const session: PersistedSession = {\n sessionId: `${selectedSource.filePath}#${selectedSource.componentName}`,\n version: \"1.0.0\",\n lastModified: Date.now(),\n sourceLocation: selectedSource,\n editHistory: [...editHistory, newHistoryItem],\n fileValidation: {\n lastKnownHash: hash,\n lastKnownSize: result.fileSnapshot.length,\n lastEditTimestamp: Date.now(),\n },\n uiState: {\n currentSuggestion: \"\", // Clear after successful edit\n modalWasOpen: true,\n },\n };\n AIEditorStorage.saveSession(session);\n setHasActiveSession(true);\n } catch (e) {\n console.error(\"Failed to save session:\", e);\n }\n }\n\n return result;\n } catch (err) {\n const error = String(err);\n const editId =\n Date.now().toString(36) + Math.random().toString(36).substring(2);\n setEditHistory((prev) => [\n ...prev,\n {\n id: editId,\n suggestion,\n success: false,\n error,\n timestamp: Date.now(),\n },\n ]);\n return { success: false, error };\n } finally {\n setIsLoading(false);\n }\n },\n [selectedSource, editHistory],\n );\n\n const handleSelect = useCallback(\n (element: Element, source: SourceLocation) => {\n setSelectedDOMElement(element);\n setSelectedSource(source);\n // Clear edit history when selecting a new component\n setEditHistory([]);\n\n resolveSourceLocation(source).then((resolved) => {\n if (resolved) {\n setSelectedSource((prev) => (prev === source ? resolved : prev));\n }\n });\n },\n [setSelectedDOMElement, setSelectedSource],\n );\n\n if (process.env.NODE_ENV !== \"development\") {\n return <>{children}</>;\n }\n\n return (\n <EditorContext.Provider\n value={{\n isEnabled,\n setEnabled,\n selectedSource,\n setSelectedSource,\n selectedDOMElement,\n isLoading,\n setIsLoading,\n editHistory,\n setEditHistory,\n submitEdit,\n }}\n >\n {children}\n {isEnabled && (\n <EditorOverlay\n theme={theme}\n onSelect={handleSelect}\n showStaleWarning={showStaleWarning}\n staleSession={staleSession}\n hasActiveSession={hasActiveSession}\n setShowStaleWarning={setShowStaleWarning}\n setStaleSession={setStaleSession}\n setHasActiveSession={setHasActiveSession}\n restoreSession={restoreSession}\n handleClearSession={handleClearSession}\n />\n )}\n </EditorContext.Provider>\n );\n}\n\n// =============================================================================\n// OVERLAY\n// =============================================================================\n\nfunction EditorOverlay({\n theme,\n onSelect,\n showStaleWarning,\n staleSession,\n hasActiveSession,\n setShowStaleWarning,\n setStaleSession,\n setHasActiveSession,\n restoreSession,\n handleClearSession,\n}: {\n theme: \"light\" | \"dark\";\n onSelect: (el: Element, source: SourceLocation) => void;\n showStaleWarning: boolean;\n staleSession: PersistedSession | null;\n hasActiveSession: boolean;\n setShowStaleWarning: (value: boolean) => void;\n setStaleSession: (value: PersistedSession | null) => void;\n setHasActiveSession: (value: boolean) => void;\n restoreSession: (session: PersistedSession) => void;\n handleClearSession: () => void;\n}) {\n const {\n selectedSource,\n setSelectedSource,\n submitEdit,\n isLoading,\n setIsLoading,\n setEnabled,\n selectedDOMElement,\n editHistory,\n setEditHistory,\n } = useAIEditor();\n const [hoveredSource, setHoveredSource] = useState<SourceLocation | null>(\n null,\n );\n const [hoveredElement, setHoveredElement] = useState<Element | null>(null);\n const [hoveredRect, setHoveredRect] = useState<DOMRect | null>(null);\n const [mousePos, setMousePos] = useState({ x: 0, y: 0 });\n const [isResolvingSource, setIsResolvingSource] = useState(false);\n const [suggestion, setSuggestion] = useState(\"\");\n const [result, setResult] = useState<{\n success: boolean;\n error?: string;\n } | null>(null);\n const [code, setCode] = useState(\"\");\n const [codeLineStart, setCodeLineStart] = useState(1);\n const [targetStartLine, setTargetStartLine] = useState<number | null>(null);\n const [targetEndLine, setTargetEndLine] = useState<number | null>(null);\n const [absolutePath, setAbsolutePath] = useState<string | null>(null);\n const [parsedComponentName, setParsedComponentName] = useState<string | null>(\n null,\n );\n\n const isDark = theme === \"dark\";\n\n // Fetch code preview and absolute path\n useEffect(() => {\n if (selectedSource) {\n const params: Record<string, string> = {\n path: selectedSource.filePath,\n line: String(selectedSource.lineNumber),\n tagName: selectedSource.elementContext?.tagName || \"\",\n nthOfType: String(selectedSource.elementContext?.nthOfType || 0),\n textContent: selectedSource.elementContext?.textContent || \"\",\n className: selectedSource.elementContext?.className || \"\",\n };\n\n // Include debugStack if available for server-side source map resolution\n if (selectedSource.debugStack) {\n params.debugStack = selectedSource.debugStack;\n }\n\n fetch(`/api/ai-editor/read?` + new URLSearchParams(params))\n .then((r) => r.json())\n .then((d) => {\n if (d.success) {\n console.log('[AI Editor] Read response:', {\n lineStart: d.lineStart,\n targetStartLine: d.targetStartLine,\n targetEndLine: d.targetEndLine,\n componentName: d.componentName\n });\n setCode(d.content);\n setCodeLineStart(d.lineStart || 1);\n setTargetStartLine(d.targetStartLine || null);\n setTargetEndLine(d.targetEndLine || null);\n\n // Store component name from parsed code if available\n if (d.componentName) {\n setParsedComponentName(d.componentName);\n }\n }\n })\n .catch(() => {\n setCode(\"// Could not load\");\n setCodeLineStart(1);\n setTargetStartLine(null);\n setTargetEndLine(null);\n });\n\n // Fetch absolute path\n fetch(\n `/api/ai-editor/absolute-path?` +\n new URLSearchParams({ path: selectedSource.filePath }),\n )\n .then((r) => r.json())\n .then((d) => d.success && setAbsolutePath(d.absolutePath))\n .catch(() => setAbsolutePath(null));\n } else {\n setAbsolutePath(null);\n setParsedComponentName(null);\n }\n }, [selectedSource]);\n\n // Mouse tracking\n useEffect(() => {\n let lastEl: Element | null = null;\n let raf: number;\n\n const onMove = (e: MouseEvent) => {\n setMousePos({ x: e.clientX, y: e.clientY });\n if (selectedSource) return;\n\n cancelAnimationFrame(raf);\n raf = requestAnimationFrame(() => {\n const el = document.elementFromPoint(e.clientX, e.clientY);\n if (!el || el.closest(\".ai-editor-ui\") || el === lastEl) return;\n lastEl = el;\n\n const source = getSourceFromElement(el);\n if (source) {\n setHoveredElement(el);\n setHoveredRect(el.getBoundingClientRect());\n\n // Check if this looks like a compiled path that needs resolution\n const isCompiledPath =\n source.filePath.includes(\".next/\") ||\n source.filePath.includes(\"/chunks/\") ||\n source.filePath.startsWith(\"file://\") ||\n (source.filePath.endsWith(\".js\") &&\n (source.filePath.includes(\"/server/\") ||\n source.filePath.includes(\"/static/\")));\n\n if (isCompiledPath && source.debugStack) {\n // Wait for resolution before showing the tooltip\n setIsResolvingSource(true);\n resolveSourceLocation(source)\n .then((resolved) => {\n setIsResolvingSource(false);\n if (resolved) {\n console.log(\"Resolved source location:\", resolved);\n setHoveredSource(resolved);\n } else {\n console.warn(\n \"Failed to resolve source location for:\",\n source,\n );\n // If resolution fails, still show the source (might be a client component)\n setHoveredSource(source);\n }\n })\n .catch((err) => {\n console.error(\"Error resolving source location:\", err);\n setIsResolvingSource(false);\n setHoveredSource(source);\n });\n } else if (isCompiledPath && !source.debugStack) {\n // Compiled path but no debugStack - can't resolve, show as-is\n console.warn(\"Compiled path but no debugStack:\", source);\n setIsResolvingSource(false);\n setHoveredSource(source);\n } else {\n // Not a compiled path, show immediately\n setIsResolvingSource(false);\n setHoveredSource(source);\n }\n } else {\n setHoveredSource(null);\n setHoveredElement(null);\n setHoveredRect(null);\n setIsResolvingSource(false);\n }\n });\n };\n\n const onClick = (e: MouseEvent) => {\n if ((e.target as Element).closest(\".ai-editor-ui\")) return;\n if (hoveredSource && hoveredElement) {\n e.preventDefault();\n e.stopPropagation();\n onSelect(hoveredElement, hoveredSource);\n setSuggestion(\"\");\n setResult(null);\n }\n };\n\n document.addEventListener(\"mousemove\", onMove, { passive: true });\n document.addEventListener(\"click\", onClick, true);\n return () => {\n document.removeEventListener(\"mousemove\", onMove);\n document.removeEventListener(\"click\", onClick, true);\n cancelAnimationFrame(raf);\n };\n }, [hoveredSource, hoveredElement, selectedSource, onSelect]);\n\n const handleSubmit = async () => {\n if (!suggestion.trim()) return;\n const res = await submitEdit(suggestion);\n setResult(res);\n // Don't auto-reload, let user continue editing or manually finish\n if (res.success) {\n setSuggestion(\"\"); // Clear input for next edit\n\n // Refresh code preview to show the updated code\n if (selectedSource) {\n const params: Record<string, string> = {\n path: selectedSource.filePath,\n line: String(selectedSource.lineNumber),\n tagName: selectedSource.elementContext?.tagName || \"\",\n nthOfType: String(selectedSource.elementContext?.nthOfType || 0),\n textContent: selectedSource.elementContext?.textContent || \"\",\n className: selectedSource.elementContext?.className || \"\",\n };\n\n if (selectedSource.debugStack) {\n params.debugStack = selectedSource.debugStack;\n }\n\n fetch(`/api/ai-editor/read?` + new URLSearchParams(params))\n .then((r) => r.json())\n .then((d) => {\n if (d.success) {\n setCode(d.content);\n setCodeLineStart(d.lineStart || 1);\n setTargetStartLine(d.targetStartLine || null);\n setTargetEndLine(d.targetEndLine || null);\n if (d.componentName) {\n setParsedComponentName(d.componentName);\n }\n }\n })\n .catch(console.error);\n }\n\n // Reset result after a delay\n setTimeout(() => setResult(null), 3000);\n }\n };\n\n const handleUndo = async () => {\n if (editHistory.length === 0 || !selectedSource) return;\n\n // Find the last successful edit with a snapshot\n const lastSuccessfulEdit = [...editHistory]\n .reverse()\n .find((edit) => edit.success && edit.fileSnapshot);\n\n if (!lastSuccessfulEdit) {\n console.warn(\"No successful edit with snapshot found to undo\");\n return;\n }\n\n setIsLoading(true);\n try {\n // Call undo endpoint to restore file\n const response = await fetch(\"/api/ai-editor/undo\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n filePath: selectedSource.filePath,\n content: lastSuccessfulEdit.fileSnapshot,\n }),\n });\n\n const result = await response.json();\n\n if (!result.success) {\n throw new Error(result.error || \"Undo failed\");\n }\n\n // Remove the last successful edit from history\n setEditHistory((prev) => {\n const lastIndex = prev.lastIndexOf(lastSuccessfulEdit);\n return prev.filter((_, idx) => idx !== lastIndex);\n });\n\n // Refresh code preview\n const params: Record<string, string> = {\n path: selectedSource.filePath,\n line: String(selectedSource.lineNumber),\n tagName: selectedSource.elementContext?.tagName || \"\",\n nthOfType: String(selectedSource.elementContext?.nthOfType || 0),\n textContent: selectedSource.elementContext?.textContent || \"\",\n className: selectedSource.elementContext?.className || \"\",\n };\n\n if (selectedSource.debugStack) {\n params.debugStack = selectedSource.debugStack;\n }\n\n fetch(`/api/ai-editor/read?` + new URLSearchParams(params))\n .then((r) => r.json())\n .then((d) => {\n if (d.success) {\n setCode(d.content);\n setCodeLineStart(d.lineStart || 1);\n setTargetStartLine(d.targetStartLine || null);\n setTargetEndLine(d.targetEndLine || null);\n if (d.componentName) {\n setParsedComponentName(d.componentName);\n }\n }\n })\n .catch(console.error);\n\n setResult({ success: true, error: undefined });\n setTimeout(() => setResult(null), 3000);\n } catch (error) {\n console.error(\"Undo error:\", error);\n setResult({ success: false, error: String(error) });\n } finally {\n setIsLoading(false);\n }\n };\n\n const handleRetry = async (editIndex: number) => {\n const editToRetry = editHistory[editIndex];\n if (!editToRetry) return;\n\n // Re-submit the same suggestion\n const res = await submitEdit(editToRetry.suggestion);\n\n // Refresh code preview if successful\n if (res.success && selectedSource) {\n const params: Record<string, string> = {\n path: selectedSource.filePath,\n line: String(selectedSource.lineNumber),\n tagName: selectedSource.elementContext?.tagName || \"\",\n nthOfType: String(selectedSource.elementContext?.nthOfType || 0),\n textContent: selectedSource.elementContext?.textContent || \"\",\n className: selectedSource.elementContext?.className || \"\",\n };\n\n if (selectedSource.debugStack) {\n params.debugStack = selectedSource.debugStack;\n }\n\n fetch(`/api/ai-editor/read?` + new URLSearchParams(params))\n .then((r) => r.json())\n .then((d) => {\n if (d.success) {\n setCode(d.content);\n setCodeLineStart(d.lineStart || 1);\n setTargetStartLine(d.targetStartLine || null);\n setTargetEndLine(d.targetEndLine || null);\n if (d.componentName) {\n setParsedComponentName(d.componentName);\n }\n }\n })\n .catch(console.error);\n }\n };\n\n const handleUndoAndRetry = async () => {\n if (editHistory.length === 0 || !selectedSource) return;\n\n // Find the last successful edit with a snapshot\n const lastSuccessfulEdit = [...editHistory]\n .reverse()\n .find((edit) => edit.success && edit.fileSnapshot);\n\n if (!lastSuccessfulEdit) {\n console.warn(\"No successful edit with snapshot found to undo and retry\");\n return;\n }\n\n setIsLoading(true);\n try {\n // Step 1: Undo the last edit\n const undoResponse = await fetch(\"/api/ai-editor/undo\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n filePath: selectedSource.filePath,\n content: lastSuccessfulEdit.fileSnapshot,\n }),\n });\n\n const undoResult = await undoResponse.json();\n\n if (!undoResult.success) {\n throw new Error(undoResult.error || \"Undo failed\");\n }\n\n // Remove the last successful edit from history\n setEditHistory((prev) => {\n const lastIndex = prev.lastIndexOf(lastSuccessfulEdit);\n return prev.filter((_, idx) => idx !== lastIndex);\n });\n\n // Refresh code preview\n const params: Record<string, string> = {\n path: selectedSource.filePath,\n line: String(selectedSource.lineNumber),\n tagName: selectedSource.elementContext?.tagName || \"\",\n nthOfType: String(selectedSource.elementContext?.nthOfType || 0),\n textContent: selectedSource.elementContext?.textContent || \"\",\n className: selectedSource.elementContext?.className || \"\",\n };\n\n if (selectedSource.debugStack) {\n params.debugStack = selectedSource.debugStack;\n }\n\n await fetch(`/api/ai-editor/read?` + new URLSearchParams(params))\n .then((r) => r.json())\n .then((d) => {\n if (d.success) {\n setCode(d.content);\n setCodeLineStart(d.lineStart || 1);\n setTargetStartLine(d.targetStartLine || null);\n setTargetEndLine(d.targetEndLine || null);\n if (d.componentName) {\n setParsedComponentName(d.componentName);\n }\n }\n })\n .catch(console.error);\n\n // Step 2: Retry the same suggestion\n setIsLoading(true); // Keep loading state\n const retryResult = await submitEdit(lastSuccessfulEdit.suggestion);\n\n // Refresh code preview after retry\n if (retryResult.success && selectedSource) {\n await fetch(`/api/ai-editor/read?` + new URLSearchParams(params))\n .then((r) => r.json())\n .then((d) => {\n if (d.success) {\n setCode(d.content);\n setCodeLineStart(d.lineStart || 1);\n setTargetStartLine(d.targetStartLine || null);\n setTargetEndLine(d.targetEndLine || null);\n if (d.componentName) {\n setParsedComponentName(d.componentName);\n }\n }\n })\n .catch(console.error);\n }\n\n if (retryResult.success) {\n setResult({ success: true, error: undefined });\n } else {\n setResult({ success: false, error: retryResult.error });\n }\n\n setTimeout(() => setResult(null), 3000);\n } catch (error) {\n console.error(\"Undo and retry error:\", error);\n setResult({ success: false, error: String(error) });\n } finally {\n setIsLoading(false);\n }\n };\n\n const handleDone = () => {\n // Clear session before reload\n if (ENABLE_SESSION_PERSISTENCE && selectedSource) {\n AIEditorStorage.deleteSession(\n selectedSource.filePath,\n selectedSource.componentName\n );\n }\n // Close modal and reload page to see all changes\n window.location.reload();\n };\n\n const c = {\n bg: isDark ? \"#0d0d14\" : \"#fff\",\n bgAlt: isDark ? \"#16162a\" : \"#f5f5f5\",\n text: isDark ? \"#e4e4e7\" : \"#18181b\",\n muted: isDark ? \"#71717a\" : \"#a1a1aa\",\n accent: \"#818cf8\",\n border: isDark ? \"#27273f\" : \"#e4e4e7\",\n success: \"#34d399\",\n error: \"#f87171\",\n };\n\n const elCtx = selectedSource?.elementContext;\n\n return (\n <div\n className=\"ai-editor-ui\"\n style={{ fontFamily: \"system-ui, sans-serif\" }}\n >\n {/* Highlight */}\n {hoveredRect && !selectedSource && (\n <div\n style={{\n position: \"fixed\",\n left: hoveredRect.left - 2,\n top: hoveredRect.top - 2,\n width: hoveredRect.width + 4,\n height: hoveredRect.height + 4,\n border: `2px solid ${c.accent}`,\n borderRadius: 6,\n background: `${c.accent}15`,\n pointerEvents: \"none\",\n zIndex: 99998,\n }}\n />\n )}\n\n {/* Tooltip */}\n {hoveredSource && !selectedSource && !isResolvingSource && (\n <div\n style={{\n position: \"fixed\",\n left: Math.min(mousePos.x + 14, window.innerWidth - 340),\n top: mousePos.y + 14,\n background: c.bg,\n color: c.text,\n border: `1px solid ${c.border}`,\n borderRadius: 10,\n padding: \"12px 16px\",\n fontSize: 12,\n fontFamily: \"ui-monospace, monospace\",\n zIndex: 99999,\n boxShadow: `0 8px 30px rgba(0,0,0,${isDark ? 0.5 : 0.15})`,\n maxWidth: 320,\n pointerEvents: \"none\",\n }}\n >\n <div\n style={{\n fontWeight: 700,\n color: c.accent,\n marginBottom: 4,\n fontSize: 14,\n }}\n >\n <{hoveredSource.componentName} />\n </div>\n <div style={{ color: c.muted, fontSize: 11 }}>\n {hoveredSource.filePath}:{hoveredSource.lineNumber}\n </div>\n {hoveredSource.elementContext?.textContent && (\n <div\n style={{\n color: c.muted,\n fontSize: 10,\n marginTop: 4,\n fontStyle: \"italic\",\n }}\n >\n \"{hoveredSource.elementContext.textContent}\"\n </div>\n )}\n </div>\n )}\n\n {/* Stale File Warning Modal */}\n {ENABLE_SESSION_PERSISTENCE && showStaleWarning && staleSession && (\n <div\n style={{\n position: \"fixed\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n background: \"rgba(0,0,0,0.7)\",\n zIndex: 100001,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <div\n style={{\n background: c.bg,\n color: c.text,\n borderRadius: 16,\n padding: 32,\n maxWidth: 500,\n border: `1px solid ${c.border}`,\n boxShadow: `0 24px 80px rgba(0,0,0,0.8)`,\n }}\n >\n <div style={{ fontSize: 24, marginBottom: 16 }}>\n ⚠️ File Modified Externally\n </div>\n <p style={{ marginBottom: 12, color: c.muted }}>\n The file has been modified since your last edit session.\n </p>\n <div\n style={{\n background: c.bgAlt,\n padding: 12,\n borderRadius: 8,\n marginBottom: 20,\n fontFamily: \"monospace\",\n fontSize: 12,\n }}\n >\n <div>\n <strong>Component:</strong>{\" \"}\n {staleSession.sourceLocation.componentName}\n </div>\n <div>\n <strong>File:</strong> {staleSession.sourceLocation.filePath}\n </div>\n <div>\n <strong>Last edit:</strong>{\" \"}\n {new Date(staleSession.lastModified).toLocaleString()}\n </div>\n <div>\n <strong>Edits:</strong> {staleSession.editHistory.length}\n </div>\n </div>\n <p style={{ marginBottom: 20, fontSize: 14 }}>\n Continuing may cause conflicts. You can discard this session or\n continue anyway.\n </p>\n <div style={{ display: \"flex\", gap: 12 }}>\n <button\n onClick={() => {\n AIEditorStorage.deleteSession(\n staleSession.sourceLocation.filePath,\n staleSession.sourceLocation.componentName\n );\n setShowStaleWarning(false);\n setStaleSession(null);\n setHasActiveSession(false);\n }}\n style={{\n flex: 1,\n padding: \"12px 20px\",\n borderRadius: 10,\n border: `1px solid ${c.border}`,\n background: \"transparent\",\n color: c.text,\n cursor: \"pointer\",\n }}\n >\n Discard Session\n </button>\n <button\n onClick={() => {\n restoreSession(staleSession);\n setShowStaleWarning(false);\n }}\n style={{\n flex: 1,\n padding: \"12px 20px\",\n borderRadius: 10,\n border: \"none\",\n background: \"#f59e0b\",\n color: \"#fff\",\n fontWeight: 600,\n cursor: \"pointer\",\n }}\n >\n Continue Anyway\n </button>\n </div>\n </div>\n </div>\n )}\n\n {/* Modal */}\n {selectedSource && (\n <div\n style={{\n position: \"fixed\",\n bottom: 20,\n right: 20,\n background: c.bg,\n color: c.text,\n borderRadius: 16,\n padding: 24,\n width: 560,\n maxWidth: \"calc(100vw - 40px)\",\n maxHeight: \"calc(100vh - 40px)\",\n overflowY: \"auto\",\n overflowX: \"hidden\",\n zIndex: 100000,\n boxShadow: `0 24px 80px rgba(0,0,0,${isDark ? 0.6 : 0.25})`,\n border: `1px solid ${c.border}`,\n }}\n >\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n marginBottom: 20,\n }}\n >\n <div>\n <div\n style={{\n fontSize: 11,\n textTransform: \"uppercase\",\n letterSpacing: 1,\n color: c.muted,\n }}\n >\n Editing\n </div>\n <div style={{ fontSize: 20, fontWeight: 700, color: c.accent }}>\n <{parsedComponentName || selectedSource.componentName} />\n </div>\n <div\n style={{\n fontSize: 12,\n color: c.muted,\n fontFamily: \"monospace\",\n marginTop: 4,\n }}\n >\n <a\n href={\n absolutePath\n ? `cursor://file/${absolutePath}:${selectedSource.lineNumber}`\n : `cursor://file/${selectedSource.filePath}:${selectedSource.lineNumber}`\n }\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n const path = absolutePath || selectedSource.filePath;\n const cursorPath = path.startsWith(\"/\") ? path : `/${path}`;\n window.location.href = `cursor://file${cursorPath}:${selectedSource.lineNumber}`;\n }}\n style={{\n color: c.accent,\n textDecoration: \"none\",\n cursor: \"pointer\",\n borderBottom: `1px solid ${c.accent}40`,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.borderBottomColor = c.accent;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.borderBottomColor = `${c.accent}40`;\n }}\n >\n {selectedSource.filePath}:{selectedSource.lineNumber}\n </a>\n </div>\n {elCtx?.textContent && (\n <div\n style={{\n fontSize: 11,\n color: c.muted,\n marginTop: 4,\n fontStyle: \"italic\",\n }}\n >\n Element text: \"{elCtx.textContent}\"\n </div>\n )}\n </div>\n <button\n onClick={() => setSelectedSource(null)}\n style={{\n width: 36,\n height: 36,\n borderRadius: 10,\n border: \"none\",\n background: c.bgAlt,\n color: c.muted,\n fontSize: 20,\n cursor: \"pointer\",\n }}\n >\n ×\n </button>\n </div>\n\n {code && (\n <div style={{ marginBottom: 20 }}>\n <div\n style={{\n fontSize: 11,\n fontWeight: 600,\n marginBottom: 8,\n color: c.muted,\n textTransform: \"uppercase\",\n }}\n >\n Source Preview\n </div>\n <SyntaxHighlighter\n language=\"tsx\"\n style={isDark ? vscDarkPlus : vs}\n showLineNumbers={true}\n startingLineNumber={codeLineStart}\n customStyle={{\n background: c.bgAlt,\n borderRadius: 10,\n fontSize: 14,\n margin: 0,\n maxHeight: 180,\n overflowX: \"auto\",\n border: `1px solid ${c.border}`,\n }}\n lineNumberStyle={{\n minWidth: \"2.5em\",\n paddingRight: \"1em\",\n color: c.muted,\n textAlign: \"right\",\n userSelect: \"none\",\n }}\n wrapLines={true}\n lineProps={(lineNumber) => {\n const isHighlighted =\n targetStartLine !== null &&\n targetEndLine !== null &&\n lineNumber >= targetStartLine &&\n lineNumber <= targetEndLine;\n return {\n style: {\n backgroundColor: isHighlighted\n ? isDark\n ? \"rgba(102, 126, 234, 0.15)\"\n : \"rgba(147, 197, 253, 0.3)\"\n : \"transparent\",\n },\n };\n }}\n >\n {code}\n </SyntaxHighlighter>\n </div>\n )}\n\n {editHistory.length > 0 && (\n <div style={{ marginBottom: 20 }}>\n <div\n style={{\n fontSize: 11,\n fontWeight: 600,\n marginBottom: 8,\n color: c.muted,\n textTransform: \"uppercase\",\n }}\n >\n Edit History ({editHistory.length})\n </div>\n <div\n style={{\n background: c.bgAlt,\n borderRadius: 10,\n border: `1px solid ${c.border}`,\n maxHeight: 200,\n overflow: \"auto\",\n }}\n >\n {editHistory.map((item, idx) => {\n const isLastEdit = idx === editHistory.length - 1;\n const hasSnapshot = item.success && item.fileSnapshot;\n\n return (\n <div\n key={idx}\n style={{\n padding: \"10px 14px\",\n borderBottom:\n idx < editHistory.length - 1\n ? `1px solid ${c.border}`\n : \"none\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: 8,\n }}\n >\n <div style={{ flex: 1 }}>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n marginBottom: 4,\n }}\n >\n <span\n style={{\n color: item.success ? c.success : c.error,\n fontSize: 16,\n }}\n >\n {item.success ? \"✓\" : \"✗\"}\n </span>\n <span\n style={{\n fontSize: 11,\n color: c.muted,\n }}\n >\n Edit {idx + 1}\n </span>\n </div>\n <div\n style={{\n fontSize: 13,\n color: c.text,\n marginLeft: 24,\n }}\n >\n {item.suggestion}\n </div>\n {item.error && (\n <div\n style={{\n fontSize: 11,\n color: c.error,\n marginLeft: 24,\n marginTop: 4,\n }}\n >\n {item.error}\n </div>\n )}\n </div>\n <div style={{ display: \"flex\", gap: 6, flexWrap: \"wrap\" }}>\n {isLastEdit && hasSnapshot && (\n <>\n <button\n onClick={handleUndo}\n disabled={isLoading}\n style={{\n padding: \"4px 10px\",\n fontSize: 11,\n borderRadius: 6,\n border: \"none\",\n background: isLoading ? c.muted : \"#f59e0b\",\n color: \"#fff\",\n fontWeight: 600,\n cursor: isLoading ? \"wait\" : \"pointer\",\n whiteSpace: \"nowrap\",\n }}\n title=\"Undo this edit\"\n onMouseEnter={(e) => {\n if (!isLoading)\n e.currentTarget.style.background = \"#d97706\";\n }}\n onMouseLeave={(e) => {\n if (!isLoading)\n e.currentTarget.style.background = \"#f59e0b\";\n }}\n >\n ↶ Undo\n </button>\n <button\n onClick={handleUndoAndRetry}\n disabled={isLoading}\n style={{\n padding: \"4px 10px\",\n fontSize: 11,\n borderRadius: 6,\n border: \"none\",\n background: isLoading ? c.muted : \"#8b5cf6\",\n color: \"#fff\",\n fontWeight: 600,\n cursor: isLoading ? \"wait\" : \"pointer\",\n whiteSpace: \"nowrap\",\n }}\n title=\"Undo and retry with AI\"\n onMouseEnter={(e) => {\n if (!isLoading)\n e.currentTarget.style.background = \"#7c3aed\";\n }}\n onMouseLeave={(e) => {\n if (!isLoading)\n e.currentTarget.style.background = \"#8b5cf6\";\n }}\n >\n ↶↻ Undo & Retry\n </button>\n </>\n )}\n <button\n onClick={() => handleRetry(idx)}\n disabled={isLoading}\n style={{\n padding: \"4px 10px\",\n fontSize: 11,\n borderRadius: 6,\n border: \"none\",\n background: isLoading ? c.muted : c.accent,\n color: \"#fff\",\n fontWeight: 600,\n cursor: isLoading ? \"wait\" : \"pointer\",\n whiteSpace: \"nowrap\",\n }}\n title=\"Retry this edit\"\n onMouseEnter={(e) => {\n if (!isLoading)\n e.currentTarget.style.background = \"#6366f1\";\n }}\n onMouseLeave={(e) => {\n if (!isLoading)\n e.currentTarget.style.background = c.accent;\n }}\n >\n ↻ Retry\n </button>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n )}\n\n <div style={{ marginBottom: 20 }}>\n <div\n style={{\n fontSize: 11,\n fontWeight: 600,\n marginBottom: 8,\n color: c.muted,\n textTransform: \"uppercase\",\n }}\n >\n Describe Changes\n </div>\n <textarea\n value={suggestion}\n onChange={(e) => setSuggestion(e.target.value)}\n placeholder={`e.g., Make this ${\n elCtx?.tagName || \"element\"\n } blue with rounded corners...`}\n autoFocus\n style={{\n width: \"100%\",\n height: 100,\n padding: 14,\n borderRadius: 10,\n border: `1px solid ${c.border}`,\n background: c.bgAlt,\n color: c.text,\n fontSize: 14,\n resize: \"vertical\",\n fontFamily: \"inherit\",\n boxSizing: \"border-box\",\n }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n handleSubmit();\n }\n }}\n />\n </div>\n\n {result && (\n <div\n style={{\n marginBottom: 20,\n padding: 14,\n borderRadius: 10,\n background: result.success ? `${c.success}15` : `${c.error}15`,\n color: result.success ? c.success : c.error,\n fontWeight: 500,\n }}\n >\n {result.success ? \"✓ Applied!\" : `✗ ${result.error}`}\n </div>\n )}\n\n <div style={{ display: \"flex\", gap: 12, flexWrap: \"wrap\" }}>\n <button\n onClick={() => setSelectedSource(null)}\n style={{\n flex: \"1 1 auto\",\n padding: \"12px 20px\",\n borderRadius: 10,\n border: `1px solid ${c.border}`,\n background: \"transparent\",\n color: c.text,\n cursor: \"pointer\",\n }}\n >\n Cancel\n </button>\n\n {/* Clear Session Button */}\n {ENABLE_SESSION_PERSISTENCE && (\n <button\n onClick={handleClearSession}\n style={{\n flex: \"0 0 auto\",\n padding: \"12px 20px\",\n borderRadius: 10,\n border: `1px solid ${c.error}`,\n background: \"transparent\",\n color: c.error,\n cursor: \"pointer\",\n fontSize: 12,\n }}\n title=\"Clear this session and start fresh\"\n >\n Clear Session\n </button>\n )}\n\n {editHistory.length > 0 && (\n <button\n onClick={handleDone}\n style={{\n flex: \"1 1 auto\",\n padding: \"12px 20px\",\n borderRadius: 10,\n border: `1px solid ${c.success}`,\n background: \"transparent\",\n color: c.success,\n fontWeight: 600,\n cursor: \"pointer\",\n }}\n >\n Finish & Reload\n </button>\n )}\n <button\n onClick={handleSubmit}\n disabled={isLoading || !suggestion.trim()}\n style={{\n flex: \"2 1 auto\",\n padding: \"12px 20px\",\n borderRadius: 10,\n border: \"none\",\n background: isLoading ? c.muted : c.accent,\n color: \"#fff\",\n fontWeight: 600,\n cursor: isLoading ? \"wait\" : \"pointer\",\n opacity: !suggestion.trim() ? 0.5 : 1,\n }}\n >\n {isLoading ? \"Applying...\" : \"Apply Changes ⌘↵\"}\n </button>\n </div>\n </div>\n )}\n\n {/* Badge */}\n {!selectedSource && (\n <div\n style={{\n position: \"fixed\",\n bottom: 20,\n right: 20,\n background: c.bg,\n color: c.success,\n padding: \"10px 16px\",\n borderRadius: 20,\n fontSize: 13,\n fontWeight: 600,\n zIndex: 99997,\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n border: `1px solid ${c.border}`,\n boxShadow: `0 4px 20px rgba(0,0,0,${isDark ? 0.4 : 0.1})`,\n }}\n >\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: \"50%\",\n background: c.success,\n }}\n />\n AI Editor\n <span style={{ color: c.muted, fontSize: 11 }}>⌘⇧E</span>\n\n {ENABLE_SESSION_PERSISTENCE && hasActiveSession && (\n <>\n <span style={{ color: c.muted }}>|</span>\n <span style={{ color: \"#f59e0b\", fontSize: 11 }}>📝 Session</span>\n <button\n onClick={handleClearSession}\n style={{\n background: \"none\",\n border: \"none\",\n color: c.muted,\n cursor: \"pointer\",\n fontSize: 11,\n }}\n title=\"Clear active session\"\n >\n 🗑️\n </button>\n </>\n )}\n\n <button\n onClick={() => setEnabled(false)}\n style={{\n background: \"none\",\n border: \"none\",\n color: c.muted,\n cursor: \"pointer\",\n }}\n >\n ×\n </button>\n </div>\n )}\n </div>\n );\n}\n"],"names":["resolved","createContext","useContext","useState","useEffect","useCallback","jsxs","jsx","_a","result","SyntaxHighlighter","vscDarkPlus","vs","Fragment"],"mappings":"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"}
|