hale-commenting-system 1.0.2 → 1.0.3

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/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/components/CommentOverlay.tsx","../src/components/CommentDrawer.tsx","../src/components/CommentPin.tsx","../src/components/AIAssistant.tsx","../src/components/AIChatPanel.tsx","../src/contexts/CommentContext.tsx","../src/contexts/VersionContext.tsx","../src/contexts/GitHubAuthContext.tsx","../src/contexts/GitLabAuthContext.tsx","../src/contexts/AIContext.tsx","../src/services/githubAdapter.ts","../src/services/gitlabAdapter.ts"],"sourcesContent":["// Placeholder for the main commenting system exports\n// TODO: Copy your actual commenting system components, contexts, and services here\n\n// Components (to be implemented)\nexport { CommentOverlay } from './components/CommentOverlay';\nexport { CommentDrawer } from './components/CommentDrawer';\nexport { CommentPin } from './components/CommentPin';\nexport { AIAssistant } from './components/AIAssistant';\nexport { AIChatPanel } from './components/AIChatPanel';\n\n// Contexts / Providers (to be implemented)\nexport { CommentProvider, useComments } from './contexts/CommentContext';\nexport { VersionProvider, useVersion } from './contexts/VersionContext';\nexport { GitHubAuthProvider, useGitHubAuth } from './contexts/GitHubAuthContext';\nexport { GitLabAuthProvider, useGitLabAuth } from './contexts/GitLabAuthContext';\nexport { AIProvider, useAIContext } from './contexts/AIContext';\n\n// Services (to be implemented)\nexport { \n githubAdapter, \n isGitHubConfigured\n} from './services/githubAdapter';\nexport { \n gitlabAdapter, \n isGitLabConfigured \n} from './services/gitlabAdapter';\n\n// Types (to be implemented)\nexport type { \n Comment, \n Thread, \n SyncStatus,\n AIMessage,\n GitHubResult\n} from './types';\n\n","// Placeholder component - replace with your actual implementation\nimport React from 'react';\n\ninterface CommentOverlayProps {\n selectedThreadId: string | null;\n onThreadSelect: (threadId: string | null) => void;\n}\n\nexport const CommentOverlay: React.FC<CommentOverlayProps> = ({ selectedThreadId, onThreadSelect }) => {\n return (\n <div>\n {/* TODO: Implement CommentOverlay - copy from your existing implementation */}\n <div>Comment Overlay Placeholder</div>\n </div>\n );\n};\n\n","// Placeholder component - replace with your actual implementation\nimport React from 'react';\n\ninterface CommentDrawerProps {\n selectedThreadId: string | null;\n onThreadSelect: (threadId: string | null) => void;\n children: React.ReactNode;\n}\n\nexport const CommentDrawer: React.FC<CommentDrawerProps> = ({ selectedThreadId, onThreadSelect, children }) => {\n return (\n <div>\n {/* TODO: Implement CommentDrawer - copy from your existing implementation */}\n {children}\n </div>\n );\n};\n\n","// Placeholder component\nimport React from 'react';\n\nexport const CommentPin: React.FC = () => {\n return <div>CommentPin Placeholder</div>;\n};\n\n","// Placeholder component\nimport React from 'react';\n\nexport const AIAssistant: React.FC = () => {\n return <div>AIAssistant Placeholder</div>;\n};\n\n","// Placeholder component\nimport React from 'react';\n\nexport const AIChatPanel: React.FC = () => {\n return <div>AIChatPanel Placeholder</div>;\n};\n\n","// Placeholder context\nimport React, { createContext, useContext } from 'react';\n\nconst CommentContext = createContext<any>(null);\n\nexport const CommentProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {\n return <CommentContext.Provider value={{}}>{children}</CommentContext.Provider>;\n};\n\nexport const useComments = () => {\n const context = useContext(CommentContext);\n if (!context) {\n throw new Error('useComments must be used within CommentProvider');\n }\n return context;\n};\n\n","// Placeholder context\nimport React, { createContext, useContext } from 'react';\n\nconst VersionContext = createContext<any>(null);\n\nexport const VersionProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {\n return <VersionContext.Provider value={{}}>{children}</VersionContext.Provider>;\n};\n\nexport const useVersion = () => {\n const context = useContext(VersionContext);\n if (!context) {\n throw new Error('useVersion must be used within VersionProvider');\n }\n return context;\n};\n\n","// Placeholder context\nimport React, { createContext, useContext } from 'react';\n\nconst GitHubAuthContext = createContext<any>(null);\n\nexport const GitHubAuthProvider: React.FC<{ children: React.ReactNode; config?: any }> = ({ children, config }) => {\n return <GitHubAuthContext.Provider value={{}}>{children}</GitHubAuthContext.Provider>;\n};\n\nexport const useGitHubAuth = () => {\n const context = useContext(GitHubAuthContext);\n if (!context) {\n throw new Error('useGitHubAuth must be used within GitHubAuthProvider');\n }\n return context;\n};\n\n","// Placeholder context\nimport React, { createContext, useContext } from 'react';\n\nconst GitLabAuthContext = createContext<any>(null);\n\nexport const GitLabAuthProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {\n return <GitLabAuthContext.Provider value={{}}>{children}</GitLabAuthContext.Provider>;\n};\n\nexport const useGitLabAuth = () => {\n const context = useContext(GitLabAuthContext);\n if (!context) {\n throw new Error('useGitLabAuth must be used within GitLabAuthProvider');\n }\n return context;\n};\n\n","// Placeholder context\nimport React, { createContext, useContext } from 'react';\n\nconst AIContext = createContext<any>(null);\n\nexport const AIProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {\n return <AIContext.Provider value={{}}>{children}</AIContext.Provider>;\n};\n\nexport const useAIContext = () => {\n const context = useContext(AIContext);\n if (!context) {\n throw new Error('useAIContext must be used within AIProvider');\n }\n return context;\n};\n\n","// Placeholder service\nexport const githubAdapter = {\n // TODO: Implement GitHub adapter methods\n};\n\nexport const isGitHubConfigured = () => {\n return false;\n};\n\n","// Placeholder service\nexport const gitlabAdapter = {\n // TODO: Implement GitLab adapter methods\n};\n\nexport const isGitLabConfigured = () => {\n return false;\n};\n\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACYM;AAJC,IAAM,iBAAgD,CAAC,EAAE,kBAAkB,eAAe,MAAM;AACrG,SACE,4CAAC,SAEC,sDAAC,SAAI,yCAA2B,GAClC;AAEJ;;;ACJI,IAAAA,sBAAA;AAFG,IAAM,gBAA8C,CAAC,EAAE,kBAAkB,gBAAgB,SAAS,MAAM;AAC7G,SACE,6CAAC,SAEE,UACH;AAEJ;;;ACZS,IAAAC,sBAAA;AADF,IAAM,aAAuB,MAAM;AACxC,SAAO,6CAAC,SAAI,oCAAsB;AACpC;;;ACDS,IAAAC,sBAAA;AADF,IAAM,cAAwB,MAAM;AACzC,SAAO,6CAAC,SAAI,qCAAuB;AACrC;;;ACDS,IAAAC,sBAAA;AADF,IAAM,cAAwB,MAAM;AACzC,SAAO,6CAAC,SAAI,qCAAuB;AACrC;;;ACJA,mBAAiD;AAKxC,IAAAC,sBAAA;AAHT,IAAM,qBAAiB,4BAAmB,IAAI;AAEvC,IAAM,kBAA2D,CAAC,EAAE,SAAS,MAAM;AACxF,SAAO,6CAAC,eAAe,UAAf,EAAwB,OAAO,CAAC,GAAI,UAAS;AACvD;AAEO,IAAM,cAAc,MAAM;AAC/B,QAAM,cAAU,yBAAW,cAAc;AACzC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,iDAAiD;AAAA,EACnE;AACA,SAAO;AACT;;;ACdA,IAAAC,gBAAiD;AAKxC,IAAAC,sBAAA;AAHT,IAAM,qBAAiB,6BAAmB,IAAI;AAEvC,IAAM,kBAA2D,CAAC,EAAE,SAAS,MAAM;AACxF,SAAO,6CAAC,eAAe,UAAf,EAAwB,OAAO,CAAC,GAAI,UAAS;AACvD;AAEO,IAAM,aAAa,MAAM;AAC9B,QAAM,cAAU,0BAAW,cAAc;AACzC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,gDAAgD;AAAA,EAClE;AACA,SAAO;AACT;;;ACdA,IAAAC,gBAAiD;AAKxC,IAAAC,sBAAA;AAHT,IAAM,wBAAoB,6BAAmB,IAAI;AAE1C,IAAM,qBAA4E,CAAC,EAAE,UAAU,OAAO,MAAM;AACjH,SAAO,6CAAC,kBAAkB,UAAlB,EAA2B,OAAO,CAAC,GAAI,UAAS;AAC1D;AAEO,IAAM,gBAAgB,MAAM;AACjC,QAAM,cAAU,0BAAW,iBAAiB;AAC5C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,sDAAsD;AAAA,EACxE;AACA,SAAO;AACT;;;ACdA,IAAAC,gBAAiD;AAKxC,IAAAC,sBAAA;AAHT,IAAM,wBAAoB,6BAAmB,IAAI;AAE1C,IAAM,qBAA8D,CAAC,EAAE,SAAS,MAAM;AAC3F,SAAO,6CAAC,kBAAkB,UAAlB,EAA2B,OAAO,CAAC,GAAI,UAAS;AAC1D;AAEO,IAAM,gBAAgB,MAAM;AACjC,QAAM,cAAU,0BAAW,iBAAiB;AAC5C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,sDAAsD;AAAA,EACxE;AACA,SAAO;AACT;;;ACdA,IAAAC,gBAAiD;AAKxC,IAAAC,uBAAA;AAHT,IAAM,gBAAY,6BAAmB,IAAI;AAElC,IAAM,aAAsD,CAAC,EAAE,SAAS,MAAM;AACnF,SAAO,8CAAC,UAAU,UAAV,EAAmB,OAAO,CAAC,GAAI,UAAS;AAClD;AAEO,IAAM,eAAe,MAAM;AAChC,QAAM,cAAU,0BAAW,SAAS;AACpC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,6CAA6C;AAAA,EAC/D;AACA,SAAO;AACT;;;ACdO,IAAM,gBAAgB;AAAA;AAE7B;AAEO,IAAM,qBAAqB,MAAM;AACtC,SAAO;AACT;;;ACNO,IAAM,gBAAgB;AAAA;AAE7B;AAEO,IAAM,qBAAqB,MAAM;AACtC,SAAO;AACT;","names":["import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/components/CommentOverlay.tsx","../src/contexts/CommentContext.tsx","../src/services/githubAdapter.ts","../src/services/gitlabAdapter.ts","../src/contexts/VersionContext.tsx","../src/components/CommentPin.tsx","../src/components/CommentDrawer.tsx","../src/contexts/GitLabAuthContext.tsx","../src/contexts/AIContext.tsx","../src/components/AIAssistant.tsx","../src/components/AIChatPanel.tsx","../src/contexts/GitHubAuthContext.tsx"],"sourcesContent":["// Components\nexport { CommentOverlay } from './components/CommentOverlay';\nexport { CommentDrawer } from './components/CommentDrawer';\nexport { CommentPin } from './components/CommentPin';\nexport { AIAssistant } from './components/AIAssistant';\nexport { AIChatPanel } from './components/AIChatPanel';\n\n// Contexts / Providers\nexport { CommentProvider, useComments } from './contexts/CommentContext';\nexport { VersionProvider, useVersion } from './contexts/VersionContext';\nexport { GitHubAuthProvider, useGitHubAuth } from './contexts/GitHubAuthContext';\nexport { GitLabAuthProvider, useGitLabAuth } from './contexts/GitLabAuthContext';\nexport { AIProvider, useAIContext } from './contexts/AIContext';\n\n// Services\nexport { \n githubAdapter, \n isGitHubConfigured\n} from './services/githubAdapter';\nexport { \n gitlabAdapter, \n isGitLabConfigured \n} from './services/gitlabAdapter';\n\n// Types\nexport type { \n Comment, \n Thread, \n SyncStatus,\n AIMessage,\n GitHubResult\n} from './types';\n\n","import * as React from 'react';\nimport { useLocation } from 'react-router-dom';\nimport { useComments } from '../contexts/CommentContext';\nimport { useVersion } from '../contexts/VersionContext';\nimport { CommentPin } from './CommentPin';\n\ninterface CommentOverlayProps {\n selectedThreadId: string | null;\n onThreadSelect: (id: string) => void;\n}\n\nexport const CommentOverlay: React.FunctionComponent<CommentOverlayProps> = ({\n selectedThreadId,\n onThreadSelect\n}) => {\n const location = useLocation();\n const { showPins, enableCommenting, addThread, getThreadsForRoute } = useComments();\n const { currentVersion } = useVersion();\n const overlayRef = React.useRef<HTMLDivElement>(null);\n\n const currentRouteThreads = React.useMemo(\n () => getThreadsForRoute(location.pathname, currentVersion),\n [getThreadsForRoute, location.pathname, currentVersion]\n );\n\n const handleOverlayClick = React.useCallback(\n (event: React.MouseEvent<HTMLDivElement>) => {\n if (!enableCommenting) return;\n\n // Only add thread if clicking the overlay itself, not a pin\n if (event.target === overlayRef.current) {\n const rect = overlayRef.current.getBoundingClientRect();\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n const newThreadId = addThread(x, y, location.pathname, currentVersion);\n \n // Auto-open the drawer for the newly created thread\n onThreadSelect(newThreadId);\n }\n },\n [enableCommenting, addThread, location.pathname, currentVersion, onThreadSelect]\n );\n\n // Don't render anything if neither showPins nor enableCommenting are true\n if (!showPins && !enableCommenting) {\n return null;\n }\n\n return (\n <div\n ref={overlayRef}\n id=\"comment-overlay\"\n onClick={handleOverlayClick}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n pointerEvents: enableCommenting ? 'auto' : 'none',\n cursor: enableCommenting ? 'crosshair' : 'default',\n zIndex: 999\n }}\n >\n {showPins && currentRouteThreads.map((thread) => (\n <div\n key={thread.id}\n style={{ pointerEvents: 'auto' }}\n onClick={(e) => e.stopPropagation()}\n >\n <CommentPin\n thread={thread}\n onPinClick={() => onThreadSelect(thread.id)}\n isSelected={thread.id === selectedThreadId}\n />\n </div>\n ))}\n </div>\n );\n};\n\n","import * as React from 'react';\nimport { githubAdapter, isGitHubConfigured, GitHubResult } from '../services/githubAdapter';\nimport { gitlabAdapter, isGitLabConfigured } from '../services/gitlabAdapter';\n\nexport type SyncStatus = 'synced' | 'local' | 'pending' | 'syncing' | 'error';\n\nexport interface Comment {\n id: string;\n author?: string;\n text: string;\n createdAt: string;\n githubCommentId?: number; // GitHub comment ID for syncing\n}\n\nexport interface Thread {\n id: string;\n x: number;\n y: number;\n route: string;\n comments: Comment[];\n issueNumber?: number; // GitHub Issue number\n syncStatus: SyncStatus; // Sync state\n syncError?: string; // Error message if sync failed\n version?: string; // Version (e.g., \"1\", \"2\", \"3\")\n provider?: 'github' | 'gitlab';\n}\n\ninterface CommentContextType {\n threads: Thread[];\n showPins: boolean;\n enableCommenting: boolean;\n toggleShowPins: () => void;\n toggleEnableCommenting: () => void;\n addThread: (x: number, y: number, route: string, version?: string) => string;\n addReply: (threadId: string, text: string) => Promise<void>;\n updateComment: (threadId: string, commentId: string, text: string) => Promise<void>;\n deleteComment: (threadId: string, commentId: string) => Promise<void>;\n deleteThread: (threadId: string) => Promise<void>;\n clearAllThreads: () => void;\n getThreadsForRoute: (route: string, version?: string) => Thread[];\n syncFromGitHub: (route: string) => Promise<void>;\n retrySync: () => Promise<void>;\n isSyncing: boolean;\n hasPendingSync: boolean;\n}\n\nconst CommentContext = React.createContext<CommentContextType | undefined>(undefined);\n\nconst STORAGE_KEY = 'apollo-threads';\nconst SHOW_PINS_KEY = 'apollo-show-pins';\nconst ENABLE_COMMENTING_KEY = 'apollo-enable-commenting';\n\n// Migration function to convert old comments to threads\nconst migrateOldComments = (): Thread[] => {\n try {\n const oldComments = localStorage.getItem('apollo-comments');\n if (oldComments) {\n const parsed = JSON.parse(oldComments);\n // Convert old single comments to threads\n const threads: Thread[] = parsed.map((oldComment: any) => ({\n id: oldComment.id,\n x: oldComment.x,\n y: oldComment.y,\n route: oldComment.route,\n comments: [\n {\n id: `${oldComment.id}-comment-0`,\n text: oldComment.text || '',\n createdAt: oldComment.createdAt\n }\n ]\n }));\n // Save to new key\n localStorage.setItem(STORAGE_KEY, JSON.stringify(threads));\n // Remove old key\n localStorage.removeItem('apollo-comments');\n return threads;\n }\n } catch (error) {\n console.error('Failed to migrate old comments:', error);\n }\n return [];\n};\n\nexport const CommentProvider: React.FunctionComponent<{ children: React.ReactNode }> = ({ children }) => {\n // Load initial state from localStorage with migration\n const [threads, setThreads] = React.useState<Thread[]>(() => {\n try {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (stored) {\n return JSON.parse(stored);\n }\n // Try to migrate old comments\n return migrateOldComments();\n } catch (error) {\n console.error('Failed to load threads from localStorage:', error);\n return [];\n }\n });\n\n const [showPins, setShowPins] = React.useState<boolean>(() => {\n try {\n const stored = localStorage.getItem(SHOW_PINS_KEY);\n return stored === 'true';\n } catch (error) {\n return false;\n }\n });\n\n const [enableCommenting, setEnableCommenting] = React.useState<boolean>(() => {\n try {\n const stored = localStorage.getItem(ENABLE_COMMENTING_KEY);\n return stored === 'true';\n } catch (error) {\n return false;\n }\n });\n\n const [isSyncing, setIsSyncing] = React.useState<boolean>(false);\n\n // Persist threads to localStorage whenever they change\n React.useEffect(() => {\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(threads));\n } catch (error) {\n console.error('Failed to save threads to localStorage:', error);\n }\n }, [threads]);\n\n // Persist showPins to localStorage\n React.useEffect(() => {\n try {\n localStorage.setItem(SHOW_PINS_KEY, String(showPins));\n } catch (error) {\n console.error('Failed to save showPins to localStorage:', error);\n }\n }, [showPins]);\n\n // Persist enableCommenting to localStorage\n React.useEffect(() => {\n try {\n localStorage.setItem(ENABLE_COMMENTING_KEY, String(enableCommenting));\n } catch (error) {\n console.error('Failed to save enableCommenting to localStorage:', error);\n }\n }, [enableCommenting]);\n\n const toggleShowPins = React.useCallback(() => {\n setShowPins(prev => !prev);\n }, []);\n\n const toggleEnableCommenting = React.useCallback(() => {\n setEnableCommenting(prev => !prev);\n }, []);\n\n const addThread = React.useCallback((x: number, y: number, route: string, version?: string): string => {\n const threadId = `thread-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n const newThread: Thread = {\n id: threadId,\n x,\n y,\n route,\n comments: [], // Start with no comments\n syncStatus: 'local',\n version\n };\n setThreads(prev => [...prev, newThread]);\n\n // Async remote sync (GitHub or GitLab) - non-blocking\n if (isGitHubConfigured() || isGitLabConfigured()) {\n (async () => {\n setThreads(prev => prev.map(t => \n t.id === threadId ? { ...t, syncStatus: 'syncing' as const } : t\n ));\n\n // Create a readable page name from route\n const pageName = route === '/' ? 'Home page' : route.split('/').filter(Boolean).join(' > ') || 'Page';\n const versionStr = version ? ` [v${version}]` : '';\n // Prefer GitHub if configured, otherwise GitLab\n let createdProvider: 'github' | 'gitlab' | undefined;\n let createdNumber: number | undefined;\n let createError: string | undefined;\n\n if (isGitHubConfigured()) {\n const issue = await githubAdapter.createIssue(\n `💬 ${pageName} comment${versionStr}`,\n `Thread created on route: ${route}\\n\\nCoordinates: (${Math.round(x)}, ${Math.round(y)})\\n\\n**Version:** ${version || 'N/A'}\\n\\n(Initial comment will be added as a reply)`,\n route,\n x,\n y,\n version\n );\n if (issue.success && issue.data) {\n createdProvider = 'github';\n createdNumber = issue.data.number;\n } else {\n createError = issue.error;\n }\n } else if (isGitLabConfigured()) {\n const issue = await gitlabAdapter.createIssue(\n `💬 ${pageName} comment${versionStr}`,\n `Thread created on route: ${route}\\n\\nCoordinates: (${Math.round(x)}, ${Math.round(y)})\\n\\n**Version:** ${version || 'N/A'}\\n\\n(Initial comment will be added as a reply)`,\n route,\n x,\n y,\n version\n );\n if (issue.success && issue.data) {\n createdProvider = 'gitlab';\n createdNumber = issue.data.number;\n } else {\n createError = issue.error;\n }\n }\n\n if (createdNumber && createdProvider) {\n setThreads(prev => prev.map(t => \n t.id === threadId \n ? { ...t, issueNumber: createdNumber, provider: createdProvider, syncStatus: 'synced' as const }\n : t\n ));\n } else if (createError) {\n setThreads(prev => prev.map(t => \n t.id === threadId ? { ...t, syncStatus: 'error' as const, syncError: createError } : t\n ));\n }\n })();\n }\n\n return threadId;\n }, []);\n\n const addReply = React.useCallback(async (threadId: string, text: string) => {\n const commentId = `${threadId}-comment-${Date.now()}`;\n const newComment: Comment = {\n id: commentId,\n text,\n createdAt: new Date().toISOString()\n };\n\n // Find thread BEFORE optimistic update (to get issueNumber)\n const thread = threads.find(t => t.id === threadId);\n\n // Optimistically add comment locally\n setThreads(prev =>\n prev.map(t => {\n if (t.id === threadId) {\n return {\n ...t,\n comments: [...t.comments, newComment],\n syncStatus: 'pending' as const // Mark as pending sync\n };\n }\n return t;\n })\n );\n\n // Sync to remote provider if configured\n if (thread) {\n // If thread doesn't have an issue number, create one first\n if (!thread.issueNumber) {\n console.log('🔵 Thread has no issue number, creating remote issue first...');\n setThreads(prev => prev.map(t => \n t.id === threadId ? { ...t, syncStatus: 'syncing' as const } : t\n ));\n\n // Create a readable page name from route\n const pageName = thread.route === '/' ? 'Home page' : thread.route.split('/').filter(Boolean).join(' > ') || 'Page';\n const versionStr = thread.version ? ` [v${thread.version}]` : '';\n\n let createdProvider: 'github' | 'gitlab' | undefined;\n let createdNumber: number | undefined;\n // Choose provider: preserve existing, else prefer GitHub, else GitLab\n const providerPref: ('github' | 'gitlab' | undefined) = thread.provider || (isGitHubConfigured() ? 'github' : (isGitLabConfigured() ? 'gitlab' : undefined));\n\n if (providerPref === 'github' && isGitHubConfigured()) {\n const issue = await githubAdapter.createIssue(\n `💬 ${pageName} comment${versionStr}`,\n `Thread created on route: ${thread.route}\\n\\nCoordinates: (${Math.round(thread.x)}, ${Math.round(thread.y)})\\n\\n**Version:** ${thread.version || 'N/A'}`,\n thread.route,\n thread.x,\n thread.y,\n thread.version\n );\n if (issue.success && issue.data) {\n createdProvider = 'github';\n createdNumber = issue.data.number;\n } else {\n console.error('❌ Failed to create GitHub issue:', issue.error);\n }\n } else if (providerPref === 'gitlab' && isGitLabConfigured()) {\n const issue = await gitlabAdapter.createIssue(\n `💬 ${pageName} comment${versionStr}`,\n `Thread created on route: ${thread.route}\\n\\nCoordinates: (${Math.round(thread.x)}, ${Math.round(thread.y)})\\n\\n**Version:** ${thread.version || 'N/A'}`,\n thread.route,\n thread.x,\n thread.y,\n thread.version\n );\n if (issue.success && issue.data) {\n createdProvider = 'gitlab';\n createdNumber = issue.data.number;\n } else {\n console.error('❌ Failed to create GitLab issue:', issue.error);\n }\n }\n\n if (createdNumber && createdProvider) {\n console.log('✅ Created remote issue #', createdNumber);\n // Update thread with issue number\n setThreads(prev => prev.map(t => \n t.id === threadId \n ? { ...t, issueNumber: createdNumber, provider: createdProvider, syncStatus: 'pending' as const }\n : t\n ));\n\n // Now sync all existing comments to the new issue\n const updatedThread = threads.find(t => t.id === threadId);\n if (updatedThread) {\n for (const comment of updatedThread.comments) {\n if (!comment.githubCommentId) {\n const commentResult = createdProvider === 'github'\n ? await githubAdapter.createComment(createdNumber, comment.text)\n : await gitlabAdapter.createComment(createdNumber, comment.text);\n if (commentResult.success && commentResult.data) {\n setThreads(prev => prev.map(t => {\n if (t.id === threadId) {\n return {\n ...t,\n comments: t.comments.map(c =>\n c.id === comment.id ? { ...c, githubCommentId: commentResult.data.id } : c\n )\n };\n }\n return t;\n }));\n }\n }\n }\n }\n\n // Now add the new comment\n const result = createdProvider === 'github'\n ? await githubAdapter.createComment(createdNumber, text)\n : await gitlabAdapter.createComment(createdNumber, text);\n if (result.success && result.data) {\n setThreads(prev =>\n prev.map(t => {\n if (t.id === threadId) {\n return {\n ...t,\n syncStatus: 'synced' as const,\n comments: t.comments.map(c =>\n c.id === commentId ? { ...c, githubCommentId: result.data.id } : c\n )\n };\n }\n return t;\n })\n );\n } else {\n setThreads(prev =>\n prev.map(t =>\n t.id === threadId ? { ...t, syncStatus: 'error' as const, syncError: result.error } : t\n )\n );\n }\n } else {\n setThreads(prev => prev.map(t => \n t.id === threadId ? { ...t, syncStatus: 'error' as const, syncError: 'Failed to create remote issue' } : t\n ));\n }\n } else {\n // Thread already has an issue number, just add the comment to the selected provider\n const isGitHub = thread.provider === 'github';\n const isGitLab = thread.provider === 'gitlab';\n let result: GitHubResult;\n if (isGitHub && isGitHubConfigured()) {\n result = await githubAdapter.createComment(thread.issueNumber, text);\n } else if (isGitLab && isGitLabConfigured()) {\n result = await gitlabAdapter.createComment(thread.issueNumber, text);\n } else {\n return;\n }\n if (result.success && result.data) {\n // Update comment with GitHub ID and mark synced\n setThreads(prev =>\n prev.map(t => {\n if (t.id === threadId) {\n return {\n ...t,\n syncStatus: 'synced' as const,\n comments: t.comments.map(c =>\n c.id === commentId ? { ...c, githubCommentId: result.data.id } : c\n )\n };\n }\n return t;\n })\n );\n } else {\n // Mark as error if sync failed\n setThreads(prev =>\n prev.map(t =>\n t.id === threadId ? { ...t, syncStatus: 'error' as const, syncError: result.error } : t\n )\n );\n }\n }\n }\n }, [threads]);\n\n const updateComment = React.useCallback(async (threadId: string, commentId: string, text: string) => {\n // Find thread and comment BEFORE optimistic update\n const thread = threads.find(t => t.id === threadId);\n const comment = thread?.comments.find(c => c.id === commentId);\n\n // Optimistically update locally\n setThreads(prev =>\n prev.map(t => {\n if (t.id === threadId) {\n return {\n ...t,\n syncStatus: 'pending' as const,\n comments: t.comments.map(c =>\n c.id === commentId ? { ...c, text } : c\n )\n };\n }\n return t;\n })\n );\n\n // Sync to remote if configured\n if (comment?.githubCommentId) {\n let ok = false;\n if (thread?.provider === 'github' && isGitHubConfigured()) {\n const result = await githubAdapter.updateComment(comment.githubCommentId, text);\n ok = !!result.success;\n } else if (thread?.provider === 'gitlab' && isGitLabConfigured()) {\n const result = await gitlabAdapter.updateComment(comment.githubCommentId, text);\n ok = !!result.success;\n }\n if (ok) {\n setThreads(prev =>\n prev.map(t => t.id === threadId ? { ...t, syncStatus: 'synced' as const } : t)\n );\n } else {\n setThreads(prev =>\n prev.map(t =>\n t.id === threadId ? { ...t, syncStatus: 'error' as const, syncError: 'Update failed' } : t\n )\n );\n }\n }\n }, [threads]);\n\n const deleteComment = React.useCallback(async (threadId: string, commentId: string) => {\n // Get thread and comment BEFORE deleting\n const thread = threads.find(t => t.id === threadId);\n const comment = thread?.comments.find(c => c.id === commentId);\n\n // Optimistically delete locally\n setThreads(prev =>\n prev.map(t => {\n if (t.id === threadId) {\n return {\n ...t,\n syncStatus: 'pending' as const,\n comments: t.comments.filter(c => c.id !== commentId)\n };\n }\n return t;\n })\n );\n\n // Sync to remote if configured\n if (comment?.githubCommentId) {\n let ok = false;\n if (thread?.provider === 'github' && isGitHubConfigured()) {\n const result = await githubAdapter.deleteComment(comment.githubCommentId);\n ok = !!result.success;\n } else if (thread?.provider === 'gitlab' && isGitLabConfigured()) {\n const result = await gitlabAdapter.deleteComment(comment.githubCommentId);\n ok = !!result.success;\n }\n if (ok) {\n setThreads(prev =>\n prev.map(t => t.id === threadId ? { ...t, syncStatus: 'synced' as const } : t)\n );\n } else {\n setThreads(prev =>\n prev.map(t =>\n t.id === threadId ? { ...t, syncStatus: 'error' as const, syncError: 'Delete failed' } : t\n )\n );\n }\n }\n }, [threads]);\n\n const deleteThread = React.useCallback(async (threadId: string) => {\n // Get thread BEFORE deleting\n const thread = threads.find(t => t.id === threadId);\n\n // Optimistically delete locally\n setThreads(prev => prev.filter(t => t.id !== threadId));\n\n // Close remote Issue if configured\n if (thread?.issueNumber) {\n if (thread.provider === 'github' && isGitHubConfigured()) {\n const result = await githubAdapter.closeIssue(thread.issueNumber);\n if (!result.success) {\n console.error('Failed to close GitHub issue:', result.error);\n }\n } else if (thread.provider === 'gitlab' && isGitLabConfigured()) {\n const result = await gitlabAdapter.closeIssue(thread.issueNumber);\n if (!(result as any).success) {\n console.error('Failed to close GitLab issue:', (result as any).error);\n }\n }\n }\n }, [threads]);\n\n const clearAllThreads = React.useCallback(() => {\n setThreads([]);\n }, []);\n\n const getThreadsForRoute = React.useCallback((route: string, version?: string): Thread[] => {\n return threads.filter(thread => {\n const routeMatch = thread.route === route;\n // Treat legacy comments (without version) as Version 3 (current)\n const threadVersion = thread.version || '3';\n const versionMatch = !version || threadVersion === version;\n return routeMatch && versionMatch;\n });\n }, [threads]);\n\n const syncFromGitHub = React.useCallback(async (route: string) => {\n setIsSyncing(true);\n console.log(`🔄 Syncing threads from remote providers for route: ${route}`);\n try {\n const newThreads: Thread[] = [];\n\n // GitHub\n if (isGitHubConfigured()) {\n const issues = await githubAdapter.fetchIssues(route);\n for (const issue of issues) {\n // Parse coordinates from issue body metadata or labels (for backward compatibility)\n let coords: number[] | null = null;\n\n // Try to parse from body metadata first\n if (issue.body) {\n const coordMatch = issue.body.match(/Coordinates: `\\((\\d+),\\s*(\\d+)\\)`/);\n if (coordMatch) {\n coords = [parseInt(coordMatch[1]), parseInt(coordMatch[2])];\n }\n }\n \n // Fallback: try to parse from labels\n if (!coords) {\n const coordLabel = issue.labels.find((l: any) => \n typeof l === 'string' ? l.startsWith('coords:') : l.name?.startsWith('coords:')\n );\n const coordString = typeof coordLabel === 'string' ? coordLabel : coordLabel?.name;\n if (coordString) {\n const coordParts = coordString.replace('coords:', '').split(',').map(Number);\n if (coordParts.length === 2) {\n coords = coordParts;\n }\n }\n }\n \n if (!coords || coords.length !== 2 || isNaN(coords[0]) || isNaN(coords[1])) {\n console.warn(`Skipping issue #${issue.number}: invalid or missing coords`);\n continue;\n }\n\n // Fetch comments for this issue\n const ghComments = await githubAdapter.fetchComments(issue.number);\n\n // Convert GitHub issue body to first comment\n const comments: Comment[] = [];\n \n // Add issue body as first comment if it exists\n if (issue.body) {\n comments.push({\n id: `issue-${issue.number}-body`,\n text: issue.body,\n createdAt: issue.created_at,\n author: issue.user?.login,\n githubCommentId: undefined // Body is not a comment\n });\n }\n\n // Add all GitHub comments\n ghComments.forEach((ghComment: any) => {\n comments.push({\n id: `comment-${ghComment.id}`,\n text: ghComment.body,\n createdAt: ghComment.created_at,\n author: ghComment.user?.login,\n githubCommentId: ghComment.id\n });\n });\n\n newThreads.push({\n id: `github-${issue.number}`,\n x: coords[0],\n y: coords[1],\n route,\n comments,\n issueNumber: issue.number,\n provider: 'github',\n syncStatus: 'synced'\n });\n }\n }\n\n // GitLab\n if (isGitLabConfigured()) {\n const issues = await gitlabAdapter.fetchIssues(route);\n for (const issue of issues) {\n let coords: number[] | null = null;\n const labels: string[] = issue.labels || [];\n const coordLabel = labels.find((l: string) => l.startsWith('coords:'));\n if (coordLabel) {\n const parts = coordLabel.replace('coords:', '').split(',').map((n: string) => parseInt(n, 10));\n if (parts.length === 2 && !Number.isNaN(parts[0]) && !Number.isNaN(parts[1])) {\n coords = parts as number[];\n }\n }\n if (!coords && issue.description) {\n const m = issue.description.match(/Coordinates:\\s*`?\\((\\d+),\\s*(\\d+)\\)`?/);\n if (m) coords = [parseInt(m[1], 10), parseInt(m[2], 10)];\n }\n if (!coords) {\n console.warn(`Skipping GitLab issue #${issue.iid}: invalid or missing coords`);\n continue;\n }\n const glComments = await gitlabAdapter.fetchComments(issue.iid);\n const comments: Comment[] = [];\n if (issue.description) {\n comments.push({\n id: `issue-${issue.iid}-body`,\n text: issue.description,\n createdAt: issue.created_at,\n author: issue.author?.username,\n githubCommentId: undefined\n });\n }\n glComments.forEach((note: any) => {\n comments.push({\n id: `comment-${note.id}`,\n text: note.body,\n createdAt: note.created_at,\n author: note.author?.username,\n githubCommentId: note.id\n });\n });\n\n newThreads.push({\n id: `gitlab-${issue.iid}`,\n x: coords[0],\n y: coords[1],\n route,\n comments,\n issueNumber: issue.iid,\n provider: 'gitlab',\n syncStatus: 'synced'\n });\n }\n }\n\n // Merge with existing local-only threads\n setThreads(prev => {\n const localOnlyThreads = prev.filter(t => t.route === route && !t.issueNumber);\n const mergedThreads = [\n ...prev.filter(t => t.route !== route), // Keep threads from other routes\n ...newThreads, // Add synced threads\n ...localOnlyThreads // Keep local-only threads\n ];\n return mergedThreads;\n });\n\n console.log(`✅ Synced ${newThreads.length} threads from providers`);\n } catch (error) {\n console.error('Failed to sync from providers:', error);\n } finally {\n setIsSyncing(false);\n }\n }, []);\n\n const retrySync = React.useCallback(async () => {\n console.log('🔄 Retrying sync for pending/error threads...');\n const threadsToSync = threads.filter(t => \n (t.syncStatus === 'pending' || t.syncStatus === 'error') && !t.issueNumber\n );\n\n if (threadsToSync.length === 0) {\n console.log('No threads to sync');\n return;\n }\n\n if (!isGitHubConfigured()) {\n console.warn('GitHub not configured. Cannot retry sync.');\n return;\n }\n\n for (const thread of threadsToSync) {\n console.log(`🔵 Syncing thread ${thread.id}...`);\n \n // Set status to syncing\n setThreads(prev => prev.map(t => \n t.id === thread.id ? { ...t, syncStatus: 'syncing' as const } : t\n ));\n\n // Create a readable page name from route\n const pageName = thread.route === '/' ? 'Home page' : thread.route.split('/').filter(Boolean).join(' > ') || 'Page';\n const versionStr = thread.version ? ` [v${thread.version}]` : '';\n \n const issue = await githubAdapter.createIssue(\n `💬 ${pageName} comment${versionStr}`,\n `Thread created on route: ${thread.route}\\n\\nCoordinates: (${Math.round(thread.x)}, ${Math.round(thread.y)})\\n\\n**Version:** ${thread.version || 'N/A'}`,\n thread.route,\n thread.x,\n thread.y,\n thread.version\n );\n\n if (issue.success && issue.data) {\n console.log('✅ Created GitHub issue #', issue.data.number);\n \n // Update thread with issue number\n setThreads(prev => prev.map(t => \n t.id === thread.id \n ? { ...t, issueNumber: issue.data.number }\n : t\n ));\n\n // Sync all comments to the new issue\n for (const comment of thread.comments) {\n if (!comment.githubCommentId) {\n const commentResult = await githubAdapter.createComment(issue.data.number, comment.text);\n if (commentResult.success && commentResult.data) {\n setThreads(prev => prev.map(t => {\n if (t.id === thread.id) {\n return {\n ...t,\n comments: t.comments.map(c =>\n c.id === comment.id ? { ...c, githubCommentId: commentResult.data.id } : c\n )\n };\n }\n return t;\n }));\n }\n }\n }\n\n // Mark as synced\n setThreads(prev => prev.map(t => \n t.id === thread.id ? { ...t, syncStatus: 'synced' as const } : t\n ));\n } else {\n console.error('❌ Failed to create GitHub issue:', issue.error);\n setThreads(prev => prev.map(t => \n t.id === thread.id ? { ...t, syncStatus: 'error' as const, syncError: issue.error } : t\n ));\n }\n }\n\n console.log('✅ Retry sync complete');\n }, [threads]);\n\n const hasPendingSync = React.useMemo(() => {\n return threads.some(t => t.syncStatus === 'pending' || t.syncStatus === 'error');\n }, [threads]);\n\n const value = React.useMemo(\n () => ({\n threads,\n showPins,\n enableCommenting,\n toggleShowPins,\n toggleEnableCommenting,\n addThread,\n addReply,\n updateComment,\n deleteComment,\n deleteThread,\n clearAllThreads,\n getThreadsForRoute,\n syncFromGitHub,\n retrySync,\n isSyncing,\n hasPendingSync\n }),\n [threads, showPins, enableCommenting, toggleShowPins, toggleEnableCommenting, addThread, addReply, updateComment, deleteComment, deleteThread, clearAllThreads, getThreadsForRoute, syncFromGitHub, retrySync, isSyncing, hasPendingSync]\n );\n\n return <CommentContext.Provider value={value}>{children}</CommentContext.Provider>;\n};\n\nexport const useComments = (): CommentContextType => {\n const context = React.useContext(CommentContext);\n if (!context) {\n throw new Error('useComments must be used within a CommentProvider');\n }\n return context;\n};\n\n","import axios from 'axios';\n\n// Auto-detect platform at runtime: Netlify or Vercel\nconst getApiBase = (): string => {\n if (typeof window === 'undefined') return '/api/github-api'; // SSR default\n const isNetlify = window.location.hostname.includes('netlify.app');\n const apiBase = isNetlify ? '/.netlify/functions/github-api' : '/api/github-api';\n console.log('🔍 API detection:', { hostname: window.location.hostname, isNetlify, apiBase });\n return apiBase;\n};\n\n// Get stored OAuth token from localStorage\nconst getStoredToken = (): string | null => {\n if (typeof window === 'undefined') return null;\n const token = localStorage.getItem('github_access_token');\n console.log('🔑 getStoredToken:', token ? 'Token found' : 'No token found');\n return token;\n};\n\nconst getStoredUser = (): { login: string; avatar: string } | null => {\n if (typeof window === 'undefined') return null;\n const userStr = localStorage.getItem('github_user');\n return userStr ? JSON.parse(userStr) : null;\n};\n\n// Store OAuth token and user info\nexport const storeGitHubAuth = (token: string, login: string, avatar: string) => {\n localStorage.setItem('github_access_token', token);\n localStorage.setItem('github_user', JSON.stringify({ login, avatar }));\n};\n\n// Clear OAuth token and user info\nexport const clearGitHubAuth = () => {\n localStorage.removeItem('github_access_token');\n localStorage.removeItem('github_user');\n};\n\n// Get current authenticated user\nexport const getAuthenticatedUser = () => {\n return getStoredUser();\n};\n\nexport const isGitHubConfigured = (): boolean => {\n const token = getStoredToken();\n const owner = process.env.VITE_GITHUB_OWNER;\n const repo = process.env.VITE_GITHUB_REPO;\n console.log('🔍 isGitHubConfigured check:', { hasToken: !!token, owner, repo });\n return !!(token && owner && repo);\n};\n\n// Structured result type for GitHub API calls\nexport interface GitHubResult<T = any> {\n success: boolean;\n data?: T;\n error?: string;\n}\n\n// Helper to make authenticated GitHub API requests via proxy\nasync function makeGitHubRequest(\n method: string,\n endpoint: string,\n data?: any\n): Promise<any> {\n const token = getStoredToken();\n if (!token) {\n throw new Error('Not authenticated with GitHub');\n }\n\n const response = await axios.post(getApiBase(), {\n token,\n method,\n endpoint,\n data,\n });\n\n return response.data;\n}\n\nexport const githubAdapter = {\n /**\n * Create a new GitHub Issue for a comment thread\n */\n async createIssue(title: string, body: string, route: string, x: number, y: number, version?: string): Promise<GitHubResult> {\n console.log('🔵 createIssue called', { title, route, x, y, version });\n \n if (!isGitHubConfigured()) {\n console.warn('⚠️ GitHub not configured. Skipping issue creation.');\n return { success: false, error: 'Please sign in with GitHub' };\n }\n\n const owner = process.env.VITE_GITHUB_OWNER;\n const repo = process.env.VITE_GITHUB_REPO;\n console.log('🔵 GitHub config:', { owner, repo, hasToken: !!getStoredToken() });\n\n try {\n const metadata = [\n `- Route: \\`${route}\\``,\n version ? `- Version: \\`${version}\\`` : null,\n `- Coordinates: \\`(${Math.round(x)}, ${Math.round(y)})\\``\n ].filter(Boolean).join('\\n');\n\n const issueBody = {\n title,\n body: `${body}\\n\\n---\\n**Metadata:**\\n${metadata}`,\n };\n\n console.log('🔵 Calling makeGitHubRequest...');\n const issueData = await makeGitHubRequest('POST', `/repos/${owner}/${repo}/issues`, issueBody);\n console.log('✅ Created GitHub Issue #', issueData.number);\n\n // Try to add labels (non-blocking)\n try {\n const labels = [\n 'apollo-comment',\n `route:${route}`,\n `coords:${Math.round(x)},${Math.round(y)}`\n ];\n if (version) labels.push(`version:${version}`);\n \n await makeGitHubRequest(\n 'POST',\n `/repos/${owner}/${repo}/issues/${issueData.number}/labels`,\n { labels }\n );\n console.log('✅ Added labels to Issue #', issueData.number);\n } catch (labelError) {\n console.warn('⚠️ Could not add labels (labels may not exist in repo)');\n }\n\n return { success: true, data: issueData };\n } catch (error: any) {\n const errorMessage = error?.response?.data?.message || error?.message || 'Failed to create issue';\n console.error('❌ Failed to create GitHub Issue:', {\n message: errorMessage,\n error: error?.response?.data || error,\n status: error?.response?.status\n });\n return { success: false, error: errorMessage };\n }\n },\n\n /**\n * Add a comment to an existing GitHub Issue\n */\n async createComment(issueNumber: number, body: string): Promise<GitHubResult> {\n if (!isGitHubConfigured()) {\n return { success: false, error: 'Please sign in with GitHub' };\n }\n\n const owner = process.env.VITE_GITHUB_OWNER;\n const repo = process.env.VITE_GITHUB_REPO;\n\n try {\n const commentData = await makeGitHubRequest(\n 'POST',\n `/repos/${owner}/${repo}/issues/${issueNumber}/comments`,\n { body }\n );\n console.log(`✅ Added comment to Issue #${issueNumber}`);\n return { success: true, data: commentData };\n } catch (error: any) {\n const errorMessage = error?.response?.data?.message || error?.message || 'Failed to create comment';\n console.error(`❌ Failed to add comment to Issue #${issueNumber}:`, errorMessage);\n return { success: false, error: errorMessage };\n }\n },\n\n /**\n * Fetch all issues for a specific route\n */\n async fetchIssues(route: string) {\n if (!isGitHubConfigured()) {\n console.warn('GitHub not configured. Skipping issue fetch.');\n return [];\n }\n\n const owner = process.env.VITE_GITHUB_OWNER;\n const repo = process.env.VITE_GITHUB_REPO;\n\n try {\n const issues = await makeGitHubRequest(\n 'GET',\n `/repos/${owner}/${repo}/issues?state=open`\n );\n\n // Filter issues by route\n const filteredIssues = issues.filter((issue: any) => {\n if (issue.body && issue.body.includes(`Route: \\`${route}\\``)) {\n return true;\n }\n if (issue.labels && issue.labels.some((l: any) => {\n const labelName = typeof l === 'string' ? l : l.name;\n return labelName === `route:${route}`;\n })) {\n return true;\n }\n return false;\n });\n\n console.log(`✅ Fetched ${filteredIssues.length} issues for route: ${route}`);\n return filteredIssues;\n } catch (error) {\n console.error(`❌ Failed to fetch issues for route ${route}:`, error);\n return [];\n }\n },\n\n /**\n * Fetch all comments for a specific issue\n */\n async fetchComments(issueNumber: number) {\n if (!isGitHubConfigured()) {\n return [];\n }\n\n const owner = process.env.VITE_GITHUB_OWNER;\n const repo = process.env.VITE_GITHUB_REPO;\n\n try {\n const comments = await makeGitHubRequest(\n 'GET',\n `/repos/${owner}/${repo}/issues/${issueNumber}/comments`\n );\n console.log(`✅ Fetched ${comments.length} comments for Issue #${issueNumber}`);\n return comments;\n } catch (error) {\n console.error(`❌ Failed to fetch comments for Issue #${issueNumber}:`, error);\n return [];\n }\n },\n\n /**\n * Close a GitHub Issue (when deleting a thread)\n */\n async closeIssue(issueNumber: number): Promise<GitHubResult> {\n if (!isGitHubConfigured()) {\n return { success: false, error: 'Please sign in with GitHub' };\n }\n\n const owner = process.env.VITE_GITHUB_OWNER;\n const repo = process.env.VITE_GITHUB_REPO;\n\n try {\n const issueData = await makeGitHubRequest(\n 'PATCH',\n `/repos/${owner}/${repo}/issues/${issueNumber}`,\n { state: 'closed' }\n );\n console.log(`✅ Closed Issue #${issueNumber}`);\n return { success: true, data: issueData };\n } catch (error: any) {\n const errorMessage = error?.response?.data?.message || error?.message || 'Failed to close issue';\n console.error(`❌ Failed to close Issue #${issueNumber}:`, errorMessage);\n return { success: false, error: errorMessage };\n }\n },\n\n /**\n * Update an existing comment on a GitHub Issue\n */\n async updateComment(commentId: number, body: string): Promise<GitHubResult> {\n if (!isGitHubConfigured()) {\n return { success: false, error: 'Please sign in with GitHub' };\n }\n\n const owner = process.env.VITE_GITHUB_OWNER;\n const repo = process.env.VITE_GITHUB_REPO;\n\n try {\n const commentData = await makeGitHubRequest(\n 'PATCH',\n `/repos/${owner}/${repo}/issues/comments/${commentId}`,\n { body }\n );\n console.log(`✅ Updated comment #${commentId}`);\n return { success: true, data: commentData };\n } catch (error: any) {\n const errorMessage = error?.response?.data?.message || error?.message || 'Failed to update comment';\n console.error(`❌ Failed to update comment #${commentId}:`, errorMessage);\n return { success: false, error: errorMessage };\n }\n },\n\n /**\n * Delete a comment on a GitHub Issue\n */\n async deleteComment(commentId: number): Promise<GitHubResult> {\n if (!isGitHubConfigured()) {\n return { success: false, error: 'Please sign in with GitHub' };\n }\n\n const owner = process.env.VITE_GITHUB_OWNER;\n const repo = process.env.VITE_GITHUB_REPO;\n\n try {\n await makeGitHubRequest(\n 'DELETE',\n `/repos/${owner}/${repo}/issues/comments/${commentId}`\n );\n console.log(`✅ Deleted comment #${commentId}`);\n return { success: true };\n } catch (error: any) {\n const errorMessage = error?.response?.data?.message || error?.message || 'Failed to delete comment';\n console.error(`❌ Failed to delete comment #${commentId}:`, errorMessage);\n return { success: false, error: errorMessage };\n }\n },\n};\n","import axios from 'axios';\n\nconst getApiBase = (): string => {\n if (typeof window === 'undefined') return '/api/gitlab-api';\n const isNetlify = window.location.hostname.includes('netlify.app');\n return isNetlify ? '/.netlify/functions/gitlab-api' : '/api/gitlab-api';\n};\n\nconst getStoredToken = (): string | null => {\n if (typeof window === 'undefined') return null;\n return localStorage.getItem('gitlab_access_token');\n};\n\nexport const isGitLabConfigured = (): boolean => {\n const token = getStoredToken();\n const projectPath = process.env.VITE_GITLAB_PROJECT_PATH;\n const baseUrl = process.env.VITE_GITLAB_BASE_URL || 'https://gitlab.com';\n return !!(token && projectPath && baseUrl);\n};\n\nexport interface GitLabResult<T = any> {\n success: boolean;\n data?: T;\n error?: string;\n}\n\nasync function makeGitLabRequest(\n method: string,\n endpoint: string,\n data?: any\n): Promise<any> {\n const token = getStoredToken();\n if (!token) {\n throw new Error('Not authenticated with GitLab');\n }\n const baseUrl = process.env.VITE_GITLAB_BASE_URL || 'https://gitlab.com';\n const response = await axios.post(getApiBase(), {\n token,\n method,\n endpoint,\n data,\n baseUrl\n });\n return response.data;\n}\n\nconst encodeProject = (p: string) => encodeURIComponent(p);\n\nexport const gitlabAdapter = {\n async createIssue(\n title: string,\n body: string,\n route: string,\n x: number,\n y: number,\n version?: string\n ): Promise<GitLabResult> {\n if (!isGitLabConfigured()) {\n return { success: false, error: 'Please sign in with GitLab' };\n }\n\n try {\n const projectPath = process.env.VITE_GITLAB_PROJECT_PATH!;\n const labels = ['apollo-comment', `route:${route}`, `coords:${Math.round(x)},${Math.round(y)}`];\n if (version) labels.push(`version:${version}`);\n\n const issue = await makeGitLabRequest(\n 'POST',\n `/projects/${encodeProject(projectPath)}/issues`,\n { title, description: body, labels: labels.join(',') }\n );\n // Normalize iid as number like GitHub's issue.number\n return { success: true, data: { ...issue, number: issue.iid } };\n } catch (error: any) {\n const message = error?.response?.data?.message || error?.message || 'Failed to create GitLab issue';\n return { success: false, error: message };\n }\n },\n\n async createComment(issueNumber: number, body: string): Promise<GitLabResult> {\n if (!isGitLabConfigured()) {\n return { success: false, error: 'Please sign in with GitLab' };\n }\n try {\n const projectPath = process.env.VITE_GITLAB_PROJECT_PATH!;\n const note = await makeGitLabRequest(\n 'POST',\n `/projects/${encodeProject(projectPath)}/issues/${issueNumber}/notes`,\n { body }\n );\n return { success: true, data: note };\n } catch (error: any) {\n const message = error?.response?.data?.message || error?.message || 'Failed to create GitLab comment';\n return { success: false, error: message };\n }\n },\n\n async updateComment(commentId: number, body: string): Promise<GitLabResult> {\n if (!isGitLabConfigured()) {\n return { success: false, error: 'Please sign in with GitLab' };\n }\n try {\n const projectPath = process.env.VITE_GITLAB_PROJECT_PATH!;\n const note = await makeGitLabRequest(\n 'PUT',\n `/projects/${encodeProject(projectPath)}/notes/${commentId}`,\n { body }\n );\n return { success: true, data: note };\n } catch (error: any) {\n const message = error?.response?.data?.message || error?.message || 'Failed to update GitLab comment';\n return { success: false, error: message };\n }\n },\n\n async deleteComment(commentId: number): Promise<GitLabResult> {\n if (!isGitLabConfigured()) {\n return { success: false, error: 'Please sign in with GitLab' };\n }\n try {\n const projectPath = process.env.VITE_GITLAB_PROJECT_PATH!;\n await makeGitLabRequest(\n 'DELETE',\n `/projects/${encodeProject(projectPath)}/notes/${commentId}`\n );\n return { success: true };\n } catch (error: any) {\n const message = error?.response?.data?.message || error?.message || 'Failed to delete GitLab comment';\n return { success: false, error: message };\n }\n },\n\n async closeIssue(issueNumber: number): Promise<GitLabResult> {\n if (!isGitLabConfigured()) {\n return { success: false, error: 'Please sign in with GitLab' };\n }\n try {\n const projectPath = process.env.VITE_GITLAB_PROJECT_PATH!;\n const issue = await makeGitLabRequest(\n 'PUT',\n `/projects/${encodeProject(projectPath)}/issues/${issueNumber}`,\n { state_event: 'close' }\n );\n return { success: true, data: issue };\n } catch (error: any) {\n const message = error?.response?.data?.message || error?.message || 'Failed to close GitLab issue';\n return { success: false, error: message };\n }\n },\n\n async fetchIssues(route: string) {\n if (!isGitLabConfigured()) {\n return [];\n }\n try {\n const projectPath = process.env.VITE_GITLAB_PROJECT_PATH!;\n const issues = await makeGitLabRequest(\n 'GET',\n `/projects/${encodeProject(projectPath)}/issues?state=opened&per_page=100`\n );\n return (issues || []).filter((issue: any) => {\n const labels: string[] = issue.labels || [];\n const routeLabel = labels.some(l => l === `route:${route}`);\n const inBody = (issue.description || '').includes(`Route: \\`${route}\\``);\n return routeLabel || inBody;\n });\n } catch {\n return [];\n }\n },\n\n async fetchComments(issueNumber: number) {\n if (!isGitLabConfigured()) {\n return [];\n }\n try {\n const projectPath = process.env.VITE_GITLAB_PROJECT_PATH!;\n const notes = await makeGitLabRequest(\n 'GET',\n `/projects/${encodeProject(projectPath)}/issues/${issueNumber}/notes?per_page=100`\n );\n return notes || [];\n } catch {\n return [];\n }\n }\n};\n\n\n","import * as React from 'react';\n\ninterface VersionContextType {\n currentVersion: string;\n setCurrentVersion: (version: string) => void;\n}\n\nconst VersionContext = React.createContext<VersionContextType | undefined>(undefined);\n\nconst VERSION_STORAGE_KEY = 'apollo-current-version';\n\nexport const VersionProvider: React.FunctionComponent<{ children: React.ReactNode }> = ({ children }) => {\n const [currentVersion, setCurrentVersionState] = React.useState<string>(() => {\n try {\n const stored = localStorage.getItem(VERSION_STORAGE_KEY);\n return stored || '3'; // Default to version 3 (current)\n } catch (error) {\n console.error('Failed to load version from localStorage:', error);\n return '3';\n }\n });\n\n // Persist version to localStorage\n React.useEffect(() => {\n try {\n localStorage.setItem(VERSION_STORAGE_KEY, currentVersion);\n } catch (error) {\n console.error('Failed to save version to localStorage:', error);\n }\n }, [currentVersion]);\n\n const setCurrentVersion = React.useCallback((version: string) => {\n setCurrentVersionState(version);\n }, []);\n\n const value = React.useMemo(\n () => ({\n currentVersion,\n setCurrentVersion,\n }),\n [currentVersion, setCurrentVersion]\n );\n\n return <VersionContext.Provider value={value}>{children}</VersionContext.Provider>;\n};\n\nexport const useVersion = (): VersionContextType => {\n const context = React.useContext(VersionContext);\n if (!context) {\n throw new Error('useVersion must be used within a VersionProvider');\n }\n return context;\n};\n\n","import * as React from 'react';\nimport { Button } from '@patternfly/react-core';\nimport { CommentIcon, ExclamationTriangleIcon } from '@patternfly/react-icons';\nimport { Thread } from '../contexts/CommentContext';\n\ninterface CommentPinProps {\n thread: Thread;\n onPinClick: () => void;\n isSelected?: boolean;\n}\n\nexport const CommentPin: React.FunctionComponent<CommentPinProps> = ({ \n thread, \n onPinClick,\n isSelected = false\n}) => {\n const commentCount = thread.comments.length;\n const isPending = thread.syncStatus === 'pending' || thread.syncStatus === 'syncing';\n const isError = thread.syncStatus === 'error';\n\n // Pulsing animation for pending syncs\n const pulseAnimation = isPending ? {\n animation: 'pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite'\n } : {};\n\n return (\n <>\n <style>\n {`\n @keyframes pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.5; }\n }\n `}\n </style>\n <Button\n id={`comment-pin-${thread.id}`}\n variant=\"plain\"\n aria-label={`Comment thread with ${commentCount} ${commentCount === 1 ? 'comment' : 'comments'}${isError ? ' - sync error' : ''}${isPending ? ' - syncing' : ''}`}\n onClick={(e) => {\n e.stopPropagation();\n onPinClick();\n }}\n style={{\n position: 'absolute',\n left: `${thread.x}px`,\n top: `${thread.y}px`,\n transform: 'translate(-50%, -50%)',\n width: '32px',\n height: '32px',\n borderRadius: '50%',\n backgroundColor: isError ? '#A30000' : isPending ? '#F0AB00' : '#C9190B',\n color: 'white',\n border: isSelected ? '3px solid #0066CC' : '2px solid white',\n boxShadow: isSelected \n ? '0 0 0 2px #0066CC, 0 4px 12px rgba(0, 0, 0, 0.4)'\n : '0 2px 8px rgba(0, 0, 0, 0.3)',\n padding: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: 'pointer',\n zIndex: isSelected ? 1001 : 1000,\n transition: 'all 0.2s ease',\n fontSize: commentCount > 1 ? '0.7rem' : undefined,\n ...pulseAnimation\n }}\n >\n {isError ? (\n <ExclamationTriangleIcon style={{ fontSize: '1rem' }} />\n ) : commentCount === 0 ? (\n <span style={{ fontWeight: 'bold', fontSize: '0.75rem' }}>0</span>\n ) : commentCount === 1 ? (\n <CommentIcon />\n ) : (\n <span style={{ fontWeight: 'bold' }}>{commentCount}</span>\n )}\n </Button>\n </>\n );\n};\n\n","import * as React from 'react';\nimport {\n Drawer,\n DrawerContent,\n DrawerContentBody,\n DrawerPanelContent,\n DrawerHead,\n DrawerActions,\n DrawerCloseButton,\n Title,\n Button,\n TextArea,\n Card,\n CardBody,\n CardTitle,\n EmptyState,\n EmptyStateBody,\n Divider,\n Label,\n Spinner,\n ExpandableSection,\n Alert\n} from '@patternfly/react-core';\nimport { CommentIcon, TimesIcon, PlusCircleIcon, SyncAltIcon, GithubIcon, ExternalLinkAltIcon, RedoIcon, MagicIcon, InfoCircleIcon } from '@patternfly/react-icons';\nimport { useComments } from '../contexts/CommentContext';\nimport { useVersion } from '../contexts/VersionContext';\nimport { useLocation } from 'react-router-dom';\nimport { isGitHubConfigured } from '../services/githubAdapter';\nimport { isGitLabConfigured } from '../services/gitlabAdapter';\nimport { useGitLabAuth } from '../contexts/GitLabAuthContext';\nimport { useAIContext } from '../contexts/AIContext';\n\ninterface CommentDrawerProps {\n children: React.ReactNode;\n selectedThreadId: string | null;\n onThreadSelect: (id: string | null) => void;\n}\n\nexport const CommentDrawer: React.FunctionComponent<CommentDrawerProps> = ({\n children,\n selectedThreadId,\n onThreadSelect\n}) => {\n const location = useLocation();\n const { \n getThreadsForRoute, \n addReply, \n updateComment, \n deleteComment,\n deleteThread,\n enableCommenting,\n syncFromGitHub,\n isSyncing,\n retrySync,\n hasPendingSync\n } = useComments();\n const { currentVersion } = useVersion();\n const { isAuthenticated: isGitLabAuthenticated } = useGitLabAuth();\n const { sendMessage, toggleChatbot, isChatbotVisible } = useAIContext();\n \n const [editingCommentId, setEditingCommentId] = React.useState<string | null>(null);\n const [editText, setEditText] = React.useState('');\n const [replyText, setReplyText] = React.useState('');\n const replyTextAreaRef = React.useRef<HTMLTextAreaElement>(null);\n \n // AI Summary state\n const [threadSummaries, setThreadSummaries] = React.useState<Record<string, string>>({});\n const [loadingSummary, setLoadingSummary] = React.useState(false);\n const [summaryExpanded, setSummaryExpanded] = React.useState(true);\n\n const currentRouteThreads = getThreadsForRoute(location.pathname, currentVersion);\n const selectedThread = currentRouteThreads.find(t => t.id === selectedThreadId);\n const isDrawerOpen = selectedThreadId !== null && selectedThread !== undefined;\n const isUserAuthenticated = isGitHubConfigured() || isGitLabAuthenticated;\n\n // Auto-focus reply textarea when drawer opens and commenting is enabled\n React.useEffect(() => {\n if (!isDrawerOpen || !enableCommenting) return;\n \n // Small delay to ensure drawer animation completes\n const timer = setTimeout(() => {\n replyTextAreaRef.current?.focus();\n }, 100);\n \n return () => clearTimeout(timer);\n }, [isDrawerOpen, enableCommenting, selectedThreadId]);\n\n // Sync from providers on mount if configured\n React.useEffect(() => {\n if (isGitHubConfigured() || isGitLabConfigured()) {\n syncFromGitHub(location.pathname).catch(err => {\n console.error('Failed to sync from providers:', err);\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [location.pathname]); // Only re-run when route changes\n\n const handleEdit = (commentId: string, text: string) => {\n setEditingCommentId(commentId);\n setEditText(text);\n };\n\n const handleSave = async (threadId: string, commentId: string) => {\n await updateComment(threadId, commentId, editText);\n setEditingCommentId(null);\n };\n\n const handleAddReply = async () => {\n if (selectedThreadId && replyText.trim()) {\n await addReply(selectedThreadId, replyText);\n setReplyText('');\n }\n };\n\n const handleDeleteThread = async () => {\n if (selectedThreadId && window.confirm('Delete this entire thread and all its comments?')) {\n await deleteThread(selectedThreadId);\n onThreadSelect(null);\n }\n };\n\n const handleSummarizeThread = async () => {\n if (!selectedThread) return;\n \n setLoadingSummary(true);\n setSummaryExpanded(true); // Auto-expand when generating\n \n try {\n // Call the AI API directly to get the summary\n const response = await fetch('/api/ai-assistant', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n query: `Summarize the feedback in this thread (${selectedThread.comments.length} comments)`,\n threads: [selectedThread],\n version: currentVersion || 'unknown',\n route: location.pathname\n })\n });\n\n if (!response.ok) {\n throw new Error(`API error: ${response.status}`);\n }\n\n const data = await response.json();\n const summary = data.message || 'No summary available.';\n \n // Store the summary in state for display in the drawer only\n setThreadSummaries(prev => ({\n ...prev,\n [selectedThread.id]: summary\n }));\n \n } catch (error) {\n console.error('Failed to generate summary:', error);\n setThreadSummaries(prev => ({\n ...prev,\n [selectedThread.id]: 'Failed to generate summary. Please try again.'\n }));\n } finally {\n setLoadingSummary(false);\n }\n };\n\n const handleDeleteComment = async (threadId: string, commentId: string) => {\n if (window.confirm('Delete this comment?')) {\n await deleteComment(threadId, commentId);\n }\n };\n\n const handleSync = async () => {\n await syncFromGitHub(location.pathname);\n };\n\n const handleRetrySync = async () => {\n await retrySync();\n };\n\n const getSyncStatusLabel = (status?: 'synced' | 'local' | 'pending' | 'syncing' | 'error') => {\n switch (status) {\n case 'synced':\n return <Label color=\"green\" icon={<GithubIcon />}>Synced</Label>;\n case 'local':\n return <Label color=\"grey\">Local Only</Label>;\n case 'pending':\n return <Label color=\"blue\" icon={<Spinner size=\"sm\" />}>Pending...</Label>;\n case 'syncing':\n return <Label color=\"blue\" icon={<Spinner size=\"sm\" />}>Syncing...</Label>;\n case 'error':\n return <Label color=\"red\">Sync Error</Label>;\n default:\n return null;\n }\n };\n\n const getIssueLink = (provider?: 'github' | 'gitlab', issueNumber?: number) => {\n if (!issueNumber || !provider) return null;\n try {\n if (provider === 'gitlab') {\n const baseUrl = process.env.VITE_GITLAB_BASE_URL || 'https://gitlab.com';\n const projectPath = process.env.VITE_GITLAB_PROJECT_PATH;\n if (!projectPath) return null;\n return `${baseUrl}/${projectPath}/-/issues/${issueNumber}`;\n } else {\n const owner = process.env.VITE_GITHUB_OWNER;\n const repo = process.env.VITE_GITHUB_REPO;\n if (!owner || !repo) return null;\n return `https://github.com/${owner}/${repo}/issues/${issueNumber}`;\n }\n } catch (error) {\n return null;\n }\n };\n\n const formatDate = (isoDate: string): string => {\n const date = new Date(isoDate);\n return date.toLocaleString(undefined, {\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit'\n });\n };\n\n const panelContent = (\n <DrawerPanelContent isResizable defaultSize=\"400px\" minSize=\"300px\">\n <DrawerHead>\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem', flex: 1 }}>\n <Title headingLevel=\"h2\" size=\"xl\">\n <CommentIcon style={{ marginRight: '0.5rem', color: '#C9190B' }} />\n Thread\n </Title>\n {(isGitHubConfigured() || isGitLabConfigured()) && (\n <>\n <Button\n id=\"sync-github-button\"\n variant=\"plain\"\n size=\"sm\"\n icon={<SyncAltIcon />}\n onClick={handleSync}\n isDisabled={isSyncing}\n aria-label=\"Sync with remote\"\n title=\"Sync with remote\"\n >\n {isSyncing ? <Spinner size=\"sm\" /> : null}\n </Button>\n {hasPendingSync && (\n <Button\n id=\"retry-sync-button\"\n variant=\"plain\"\n size=\"sm\"\n icon={<RedoIcon />}\n onClick={handleRetrySync}\n isDisabled={isSyncing}\n aria-label=\"Retry sync for pending threads\"\n title=\"Retry sync for pending threads\"\n />\n )}\n </>\n )}\n </div>\n <DrawerActions>\n <DrawerCloseButton onClick={() => onThreadSelect(null)} />\n </DrawerActions>\n </DrawerHead>\n <DrawerContentBody style={{ padding: '1rem' }}>\n {!selectedThread ? (\n <EmptyState>\n <CommentIcon style={{ fontSize: '3rem', color: 'var(--pf-v6-global--Color--200)', marginBottom: '1rem' }} />\n <Title headingLevel=\"h3\" size=\"lg\">\n No thread selected\n </Title>\n <EmptyStateBody>\n Click a pin to view its comments.\n </EmptyStateBody>\n </EmptyState>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n {/* Thread Info */}\n <Card isCompact>\n <CardBody>\n <div style={{ fontSize: '0.875rem', marginBottom: '0.5rem' }}>\n <strong>Location:</strong> ({Math.round(selectedThread.x)}, {Math.round(selectedThread.y)})\n </div>\n {selectedThread.version && (\n <div style={{ fontSize: '0.875rem', marginBottom: '0.5rem' }}>\n <strong>Version:</strong> {selectedThread.version}\n </div>\n )}\n <div style={{ fontSize: '0.875rem', marginBottom: '0.5rem' }}>\n <strong>Comments:</strong> {selectedThread.comments.length}\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem', marginBottom: '0.5rem' }}>\n <strong style={{ fontSize: '0.875rem' }}>Status:</strong>\n {getSyncStatusLabel(selectedThread.syncStatus)}\n </div>\n {selectedThread.issueNumber && (\n <div style={{ fontSize: '0.875rem', marginBottom: '0.5rem' }}>\n <a \n href={getIssueLink(selectedThread.provider, selectedThread.issueNumber) || '#'} \n target=\"_blank\" \n rel=\"noopener noreferrer\"\n style={{ display: 'inline-flex', alignItems: 'center', gap: '0.25rem' }}\n >\n <GithubIcon />\n Issue #{selectedThread.issueNumber}\n <ExternalLinkAltIcon style={{ fontSize: '0.75rem' }} />\n </a>\n </div>\n )}\n {/* AI Summarize Thread Button */}\n {selectedThread.comments.length > 0 && (\n <Button\n id={`ai-summarize-thread-${selectedThread.id}`}\n variant=\"secondary\"\n size=\"sm\"\n icon={<MagicIcon />}\n onClick={handleSummarizeThread}\n isLoading={loadingSummary}\n isDisabled={loadingSummary}\n style={{ marginTop: '0.5rem' }}\n >\n {loadingSummary ? 'Generating...' : 'AI Summarize Thread'}\n </Button>\n )}\n {enableCommenting && isUserAuthenticated && (\n <Button\n id={`delete-thread-${selectedThread.id}`}\n variant=\"danger\"\n size=\"sm\"\n icon={<TimesIcon />}\n onClick={handleDeleteThread}\n style={{ marginTop: '0.5rem', marginLeft: selectedThread.comments.length > 0 ? '0.5rem' : '0' }}\n >\n Delete Thread\n </Button>\n )}\n </CardBody>\n </Card>\n\n {/* AI Summary Display */}\n {threadSummaries[selectedThread.id] && (\n <Alert\n variant=\"info\"\n isInline\n title=\"AI Summary\"\n actionClose={\n <Button\n variant=\"plain\"\n onClick={() => {\n const newSummaries = { ...threadSummaries };\n delete newSummaries[selectedThread.id];\n setThreadSummaries(newSummaries);\n }}\n aria-label=\"Clear summary\"\n >\n <TimesIcon />\n </Button>\n }\n >\n <ExpandableSection\n toggleText={summaryExpanded ? 'Hide summary' : 'Show summary'}\n onToggle={(_event, isExpanded) => setSummaryExpanded(isExpanded)}\n isExpanded={summaryExpanded}\n isIndented\n >\n <div style={{ fontSize: '0.875rem', lineHeight: '1.5' }}>\n {threadSummaries[selectedThread.id]}\n </div>\n </ExpandableSection>\n </Alert>\n )}\n\n <Divider />\n\n {/* Comments List */}\n <div style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n {selectedThread.comments.length === 0 ? (\n <EmptyState>\n <Title headingLevel=\"h4\" size=\"md\">\n No comments yet\n </Title>\n <EmptyStateBody>\n {enableCommenting \n ? 'Add a reply below to start the conversation.'\n : 'Enable commenting to add replies.'}\n </EmptyStateBody>\n </EmptyState>\n ) : (\n selectedThread.comments.map((comment, index) => (\n <Card key={comment.id} isCompact>\n <CardTitle>\n Comment #{index + 1}\n <div style={{ fontSize: '0.75rem', color: 'var(--pf-v6-global--Color--200)', fontWeight: 'normal' }}>\n {comment.author && <span style={{ marginRight: '0.5rem' }}>@{comment.author}</span>}\n {formatDate(comment.createdAt)}\n </div>\n </CardTitle>\n <CardBody>\n {editingCommentId === comment.id ? (\n <>\n <TextArea\n id={`edit-comment-${comment.id}`}\n value={editText}\n onChange={(_event, value) => setEditText(value)}\n rows={3}\n style={{ marginBottom: '0.5rem' }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n handleSave(selectedThread.id, comment.id);\n }\n if (e.key === 'Escape') {\n setEditingCommentId(null);\n }\n }}\n />\n <div style={{ display: 'flex', gap: '0.5rem' }}>\n <Button\n id={`save-comment-${comment.id}`}\n variant=\"primary\"\n size=\"sm\"\n onClick={() => handleSave(selectedThread.id, comment.id)}\n >\n Save\n </Button>\n <Button\n id={`cancel-edit-${comment.id}`}\n variant=\"link\"\n size=\"sm\"\n onClick={() => setEditingCommentId(null)}\n >\n Cancel\n </Button>\n </div>\n </>\n ) : (\n <>\n <div style={{ marginBottom: '0.75rem', whiteSpace: 'pre-wrap' }}>\n {comment.text || <em style={{ color: 'var(--pf-v6-global--Color--200)' }}>No text</em>}\n </div>\n {enableCommenting && isUserAuthenticated && (\n <div style={{ display: 'flex', gap: '0.5rem' }}>\n <Button\n id={`edit-comment-btn-${comment.id}`}\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => handleEdit(comment.id, comment.text)}\n >\n Edit\n </Button>\n <Button\n id={`delete-comment-btn-${comment.id}`}\n variant=\"danger\"\n size=\"sm\"\n icon={<TimesIcon />}\n onClick={() => handleDeleteComment(selectedThread.id, comment.id)}\n >\n Delete\n </Button>\n </div>\n )}\n </>\n )}\n </CardBody>\n </Card>\n ))\n )}\n </div>\n\n {/* Add Reply */}\n {enableCommenting && isUserAuthenticated && (\n <>\n <Divider />\n <Card isCompact>\n <CardTitle>\n <PlusCircleIcon style={{ marginRight: '0.5rem' }} />\n Add Reply\n </CardTitle>\n <CardBody>\n <TextArea\n ref={replyTextAreaRef}\n id={`reply-textarea-${selectedThread.id}`}\n value={replyText}\n onChange={(_event, value) => setReplyText(value)}\n placeholder=\"Enter your reply...\"\n rows={3}\n style={{ marginBottom: '0.5rem' }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n handleAddReply();\n }\n }}\n />\n <Button\n id={`add-reply-${selectedThread.id}`}\n variant=\"primary\"\n size=\"sm\"\n onClick={handleAddReply}\n isDisabled={!replyText.trim()}\n >\n Add Reply\n </Button>\n </CardBody>\n </Card>\n </>\n )}\n </div>\n )}\n </DrawerContentBody>\n </DrawerPanelContent>\n );\n\n return (\n <Drawer isExpanded={isDrawerOpen} isInline position=\"right\">\n <DrawerContent panelContent={panelContent}>\n <DrawerContentBody>{children}</DrawerContentBody>\n </DrawerContent>\n </Drawer>\n );\n};\n","import * as React from 'react';\n\ninterface GitLabUser {\n username?: string;\n avatar?: string;\n}\n\ninterface GitLabAuthContextType {\n user: GitLabUser | null;\n isAuthenticated: boolean;\n login: () => void;\n logout: () => void;\n getToken: () => string | null;\n}\n\nconst GitLabAuthContext = React.createContext<GitLabAuthContextType | undefined>(undefined);\n\nconst GITLAB_TOKEN_KEY = 'gitlab_access_token';\nconst GITLAB_USER_KEY = 'gitlab_user';\n\nexport const GitLabAuthProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {\n const [user, setUser] = React.useState<GitLabUser | null>(null);\n\n // Load existing auth on mount\n React.useEffect(() => {\n try {\n const token = localStorage.getItem(GITLAB_TOKEN_KEY);\n const userStr = localStorage.getItem(GITLAB_USER_KEY);\n if (token && userStr) {\n setUser(JSON.parse(userStr));\n }\n } catch {\n // ignore\n }\n }, []);\n\n // Handle OAuth callback shared route: #/auth-callback?gitlab_token=...&gitlab_username=...&gitlab_avatar=...\n React.useEffect(() => {\n const handleCallback = () => {\n const hash = window.location.hash;\n if (hash.includes('#/auth-callback')) {\n const params = new URLSearchParams(hash.split('?')[1]);\n const token = params.get('gitlab_token');\n const username = params.get('gitlab_username') || undefined;\n const avatar = params.get('gitlab_avatar') || undefined;\n if (token) {\n localStorage.setItem(GITLAB_TOKEN_KEY, token);\n const u: GitLabUser = { username, avatar };\n localStorage.setItem(GITLAB_USER_KEY, JSON.stringify(u));\n setUser(u);\n // redirect to home\n window.location.hash = '/';\n }\n }\n };\n handleCallback();\n }, []);\n\n const getToken = React.useCallback((): string | null => {\n try {\n return localStorage.getItem(GITLAB_TOKEN_KEY);\n } catch {\n return null;\n }\n }, []);\n\n const login = () => {\n const clientId = process.env.VITE_GITLAB_CLIENT_ID;\n const baseUrl = process.env.VITE_GITLAB_BASE_URL || 'https://gitlab.com';\n if (!clientId) {\n // eslint-disable-next-line no-alert\n alert('GitLab login is not configured (missing VITE_GITLAB_CLIENT_ID).');\n return;\n }\n const redirectUri = `${window.location.origin}/api/auth/callback`;\n const scope = encodeURIComponent('read_user api'); // api scope for issues/comments\n const url =\n `${baseUrl}/oauth/authorize?client_id=${encodeURIComponent(clientId)}` +\n `&redirect_uri=${encodeURIComponent(redirectUri)}` +\n `&response_type=code&scope=${scope}`;\n window.location.href = url;\n };\n\n const logout = () => {\n try {\n localStorage.removeItem(GITLAB_TOKEN_KEY);\n localStorage.removeItem(GITLAB_USER_KEY);\n } finally {\n setUser(null);\n }\n };\n\n return (\n <GitLabAuthContext.Provider\n value={{\n user,\n isAuthenticated: !!getToken(),\n login,\n logout,\n getToken\n }}\n >\n {children}\n </GitLabAuthContext.Provider>\n );\n};\n\nexport const useGitLabAuth = () => {\n const ctx = React.useContext(GitLabAuthContext);\n if (!ctx) {\n throw new Error('useGitLabAuth must be used within a GitLabAuthProvider');\n }\n return ctx;\n};\n\n\n","import * as React from 'react';\n\nexport interface AIMessage {\n id: string;\n role: 'user' | 'bot';\n content: string;\n timestamp: string;\n}\n\ninterface AIContextType {\n isChatbotVisible: boolean;\n messages: AIMessage[];\n isLoading: boolean;\n toggleChatbot: () => void;\n sendMessage: (content: string, commentContext?: { threads: any[]; version: string; route?: string }) => Promise<void>;\n clearHistory: () => void;\n}\n\nconst AIContext = React.createContext<AIContextType | undefined>(undefined);\n\nconst STORAGE_KEY = 'apollo-ai-chat-history';\nconst VISIBILITY_KEY = 'apollo-ai-chatbot-visible';\n\nexport const AIProvider: React.FunctionComponent<{ children: React.ReactNode }> = ({ children }) => {\n // Load initial state from localStorage\n const [isChatbotVisible, setIsChatbotVisible] = React.useState<boolean>(() => {\n try {\n const stored = localStorage.getItem(VISIBILITY_KEY);\n return stored === 'true';\n } catch (error) {\n return false;\n }\n });\n\n const [messages, setMessages] = React.useState<AIMessage[]>(() => {\n try {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (stored) {\n return JSON.parse(stored);\n }\n return [];\n } catch (error) {\n console.error('Failed to load AI chat history from localStorage:', error);\n return [];\n }\n });\n\n const [isLoading, setIsLoading] = React.useState<boolean>(false);\n\n // Persist visibility to localStorage\n React.useEffect(() => {\n try {\n localStorage.setItem(VISIBILITY_KEY, String(isChatbotVisible));\n } catch (error) {\n console.error('Failed to save chatbot visibility to localStorage:', error);\n }\n }, [isChatbotVisible]);\n\n // Persist messages to localStorage\n React.useEffect(() => {\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(messages));\n } catch (error) {\n console.error('Failed to save AI chat history to localStorage:', error);\n }\n }, [messages]);\n\n const toggleChatbot = React.useCallback(() => {\n setIsChatbotVisible(prev => !prev);\n }, []);\n\n const sendMessage = React.useCallback(async (content: string, commentContext?: { threads: any[]; version: string; route?: string }) => {\n if (!content.trim()) return;\n\n const userMessage: AIMessage = {\n id: `user-${Date.now()}`,\n role: 'user',\n content: content.trim(),\n timestamp: new Date().toISOString()\n };\n\n // Add user message\n setMessages(prev => [...prev, userMessage]);\n setIsLoading(true);\n\n try {\n // Mock response for local development\n if (window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1') {\n await new Promise(resolve => setTimeout(resolve, 1500)); // Simulate API delay\n \n const mockResponse = `**Mock AI Response** (local dev mode)\\n\\nI analyzed your query: \"${content.trim()}\"\\n\\n**Summary:**\\n- Found ${commentContext?.threads?.length || 0} comment threads\\n- Version: ${commentContext?.version || 'unknown'}\\n- Page: ${commentContext?.route || 'unknown'}\\n\\n*Note: This is a mock response. Deploy to production to test the real AI.*`;\n \n const botMessage: AIMessage = {\n id: `bot-${Date.now()}`,\n role: 'bot',\n content: mockResponse,\n timestamp: new Date().toISOString()\n };\n\n setMessages(prev => [...prev, botMessage]);\n return;\n }\n\n // Call the Vercel serverless function (production)\n const response = await fetch('/api/ai-assistant', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n query: content.trim(),\n threads: commentContext?.threads || [],\n version: commentContext?.version || 'unknown',\n route: commentContext?.route\n })\n });\n\n if (!response.ok) {\n const errorData = await response.json();\n throw new Error(errorData.message || `API error: ${response.status}`);\n }\n\n const data = await response.json();\n\n const botMessage: AIMessage = {\n id: `bot-${Date.now()}`,\n role: 'bot',\n content: data.message || 'No response received.',\n timestamp: new Date().toISOString()\n };\n\n setMessages(prev => [...prev, botMessage]);\n } catch (error) {\n console.error('Failed to send message:', error);\n const errorMessage: AIMessage = {\n id: `bot-error-${Date.now()}`,\n role: 'bot',\n content: error instanceof Error \n ? `Sorry, I encountered an error: ${error.message}` \n : 'Sorry, something went wrong. Please try again.',\n timestamp: new Date().toISOString()\n };\n setMessages(prev => [...prev, errorMessage]);\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n const clearHistory = React.useCallback(() => {\n setMessages([]);\n try {\n localStorage.removeItem(STORAGE_KEY);\n } catch (error) {\n console.error('Failed to clear chat history from localStorage:', error);\n }\n }, []);\n\n const value = React.useMemo(\n () => ({\n isChatbotVisible,\n messages,\n isLoading,\n toggleChatbot,\n sendMessage,\n clearHistory\n }),\n [isChatbotVisible, messages, isLoading, toggleChatbot, sendMessage, clearHistory]\n );\n\n return <AIContext.Provider value={value}>{children}</AIContext.Provider>;\n};\n\nexport const useAIContext = (): AIContextType => {\n const context = React.useContext(AIContext);\n if (!context) {\n throw new Error('useAIContext must be used within an AIProvider');\n }\n return context;\n};\n\n","import * as React from 'react';\nimport { ChatbotToggle } from '@patternfly/chatbot';\nimport { useAIContext } from '../contexts/AIContext';\nimport { AIChatPanel } from './AIChatPanel';\n\nexport const AIAssistant: React.FunctionComponent = () => {\n const { isChatbotVisible, toggleChatbot } = useAIContext();\n\n return (\n <>\n <div\n style={{\n position: 'fixed',\n bottom: '20px',\n right: '20px',\n zIndex: 2000\n }}\n >\n <ChatbotToggle\n id=\"ai-chatbot-toggle\"\n isChatbotVisible={isChatbotVisible}\n onToggleChatbot={toggleChatbot}\n toggleButtonLabel=\"AI Assistant\"\n tooltipLabel=\"Get AI help analyzing feedback\"\n style={{\n backgroundColor: '#C9190B',\n borderRadius: '50%',\n width: '56px',\n height: '56px',\n border: '2px solid white',\n boxShadow: '0 2px 8px rgba(0, 0, 0, 0.3)',\n color: 'white'\n }}\n />\n </div>\n {isChatbotVisible && <AIChatPanel />}\n </>\n );\n};\n\n","import * as React from 'react';\nimport {\n Chatbot,\n ChatbotDisplayMode,\n ChatbotHeader,\n ChatbotHeaderActions,\n ChatbotHeaderMain,\n ChatbotHeaderTitle,\n ChatbotContent,\n ChatbotFooter,\n ChatbotWelcomePrompt,\n MessageBox,\n Message\n} from '@patternfly/chatbot';\nimport {\n Button,\n Label,\n TextArea,\n ActionList,\n ActionListItem\n} from '@patternfly/react-core';\nimport { TimesIcon, PaperPlaneIcon, TrashIcon } from '@patternfly/react-icons';\nimport { useLocation } from 'react-router-dom';\nimport { useAIContext } from '../contexts/AIContext';\nimport { useVersion } from '../contexts/VersionContext';\nimport { useComments } from '../contexts/CommentContext';\n\nexport const AIChatPanel: React.FunctionComponent = () => {\n const { messages, isLoading, sendMessage, toggleChatbot, clearHistory } = useAIContext();\n const { currentVersion } = useVersion();\n const { threads } = useComments();\n const location = useLocation();\n const [inputValue, setInputValue] = React.useState('');\n\n // Count comments in current version\n const commentCount = React.useMemo(() => {\n return threads.filter(t => t.version === currentVersion).reduce((acc, t) => acc + t.comments.length, 0);\n }, [threads, currentVersion]);\n\n const handleSendMessage = async () => {\n if (inputValue.trim() && !isLoading) {\n await sendMessage(inputValue, {\n threads,\n version: currentVersion || 'unknown',\n route: location.pathname\n });\n setInputValue('');\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n handleSendMessage();\n }\n };\n\n const handleQuickAction = (action: string) => {\n setInputValue(action);\n };\n\n return (\n <div\n style={{\n position: 'fixed',\n bottom: '80px',\n right: '20px',\n width: '400px',\n maxHeight: '600px',\n zIndex: 2000,\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)'\n }}\n >\n <Chatbot displayMode={ChatbotDisplayMode.default}>\n <ChatbotHeader>\n <ChatbotHeaderMain>\n <ChatbotHeaderTitle>\n 🤖 AI Feedback Assistant\n </ChatbotHeaderTitle>\n {currentVersion && commentCount > 0 && (\n <span style={{ marginLeft: '0.5rem' }}>\n <Label color=\"blue\" isCompact>\n Version {currentVersion}\n </Label>\n <Label color=\"grey\" isCompact style={{ marginLeft: '0.25rem' }}>\n {commentCount} comments\n </Label>\n </span>\n )}\n </ChatbotHeaderMain>\n <ChatbotHeaderActions>\n {messages.length > 0 && (\n <Button\n variant=\"plain\"\n onClick={clearHistory}\n aria-label=\"Clear chat history\"\n icon={<TrashIcon />}\n />\n )}\n <Button\n variant=\"plain\"\n onClick={toggleChatbot}\n aria-label=\"Close chatbot\"\n icon={<TimesIcon />}\n />\n </ChatbotHeaderActions>\n </ChatbotHeader>\n\n <ChatbotContent>\n <MessageBox>\n {messages.length === 0 ? (\n <ChatbotWelcomePrompt\n title=\"Welcome to AI Feedback Assistant\"\n description=\"Ask me about comments across your prototype. I can help you:\"\n >\n <ActionList>\n <ActionListItem>\n <Button\n variant=\"link\"\n isInline\n onClick={() => handleQuickAction('What feedback was left in the last week?')}\n >\n Summarize recent feedback\n </Button>\n </ActionListItem>\n <ActionListItem>\n <Button\n variant=\"link\"\n isInline\n onClick={() => handleQuickAction('Show me all accessibility issues')}\n >\n Find accessibility issues\n </Button>\n </ActionListItem>\n <ActionListItem>\n <Button\n variant=\"link\"\n isInline\n onClick={() => handleQuickAction('What are the main navigation problems?')}\n >\n Identify navigation problems\n </Button>\n </ActionListItem>\n <ActionListItem>\n <Button\n variant=\"link\"\n isInline\n onClick={() => handleQuickAction('Which page has the most comments?')}\n >\n Analyze comment distribution\n </Button>\n </ActionListItem>\n </ActionList>\n </ChatbotWelcomePrompt>\n ) : (\n <>\n {messages.map((msg) => (\n <Message\n key={msg.id}\n name={msg.role === 'user' ? 'You' : 'AI Assistant'}\n role={msg.role === 'user' ? 'user' : 'bot'}\n avatar={msg.role === 'user' ? '/images/user_advatar.jpg' : '/images/halefavicon.png'}\n content={msg.content}\n timestamp={new Date(msg.timestamp).toLocaleString(undefined, {\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit'\n })}\n />\n ))}\n {isLoading && (\n <Message \n name=\"AI Assistant\" \n role=\"bot\" \n avatar=\"/images/halefavicon.png\"\n content=\"⏳ Analyzing comments...\"\n />\n )}\n </>\n )}\n </MessageBox>\n </ChatbotContent>\n\n <ChatbotFooter>\n <div style={{ display: 'flex', gap: '0.5rem', alignItems: 'flex-end', width: '100%' }}>\n <TextArea\n id=\"ai-chat-input\"\n value={inputValue}\n onChange={(_event, value) => setInputValue(value)}\n onKeyDown={handleKeyDown}\n placeholder=\"Ask about feedback...\"\n aria-label=\"Message input\"\n rows={2}\n style={{ flex: 1 }}\n isDisabled={isLoading}\n />\n <Button\n variant=\"primary\"\n onClick={handleSendMessage}\n isDisabled={!inputValue.trim() || isLoading}\n icon={<PaperPlaneIcon />}\n aria-label=\"Send message\"\n />\n </div>\n </ChatbotFooter>\n </Chatbot>\n </div>\n );\n};\n\n","import * as React from 'react';\nimport { storeGitHubAuth, clearGitHubAuth, getAuthenticatedUser } from '../services/githubAdapter';\n\ninterface GitHubUser {\n login: string;\n avatar: string;\n}\n\ninterface GitHubAuthContextType {\n user: GitHubUser | null;\n isAuthenticated: boolean;\n login: () => void;\n logout: () => void;\n}\n\nconst GitHubAuthContext = React.createContext<GitHubAuthContextType | undefined>(undefined);\n\nexport const GitHubAuthProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {\n const [user, setUser] = React.useState<GitHubUser | null>(null);\n\n // Check for stored authentication on mount\n React.useEffect(() => {\n const storedUser = getAuthenticatedUser();\n if (storedUser) {\n setUser(storedUser);\n }\n }, []);\n\n // Handle OAuth callback\n React.useEffect(() => {\n const handleOAuthCallback = () => {\n const hash = window.location.hash;\n if (hash.includes('#/auth-callback')) {\n const params = new URLSearchParams(hash.split('?')[1]);\n const token = params.get('token');\n const login = params.get('login');\n const avatar = params.get('avatar');\n\n if (token && login && avatar) {\n storeGitHubAuth(token, login, decodeURIComponent(avatar));\n setUser({ login, avatar: decodeURIComponent(avatar) });\n \n // Redirect to home page\n window.location.hash = '/';\n }\n }\n };\n\n handleOAuthCallback();\n }, []);\n\n const login = () => {\n // Build GitHub OAuth URL client-side (works locally and in production)\n const clientId = process.env.VITE_GITHUB_CLIENT_ID;\n if (!clientId) {\n // eslint-disable-next-line no-alert\n alert('GitHub login is not configured (missing VITE_GITHUB_CLIENT_ID).');\n return;\n }\n \n const redirectUri = `${window.location.origin}/api/github-oauth-callback`;\n const scope = 'public_repo'; // Read/write access to public repositories\n const githubAuthUrl = \n `https://github.com/login/oauth/authorize?client_id=${encodeURIComponent(clientId)}` +\n `&redirect_uri=${encodeURIComponent(redirectUri)}` +\n `&scope=${encodeURIComponent(scope)}`;\n \n console.log('🔍 GitHub OAuth redirect:', { clientId: 'present', redirectUri });\n window.location.href = githubAuthUrl;\n };\n\n const logout = () => {\n clearGitHubAuth();\n setUser(null);\n };\n\n return (\n <GitHubAuthContext.Provider\n value={{\n user,\n isAuthenticated: !!user,\n login,\n logout,\n }}\n >\n {children}\n </GitHubAuthContext.Provider>\n );\n};\n\nexport const useGitHubAuth = () => {\n const context = React.useContext(GitHubAuthContext);\n if (context === undefined) {\n throw new Error('useGitHubAuth must be used within a GitHubAuthProvider');\n }\n return context;\n};\n\n"],"mappings":"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","names":["React","axios","import_axios","getApiBase","getStoredToken","axios","React","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","React","import_react_core","import_react_icons","import_react_router_dom","React","import_jsx_runtime","React","import_jsx_runtime","STORAGE_KEY","botMessage","import_jsx_runtime","import_chatbot","React","import_react_core","import_react_icons","import_react_router_dom","import_jsx_runtime","import_jsx_runtime","React","import_jsx_runtime","login"]}