ng-directive-zero 1.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +86 -0
- package/fesm2022/ng-directive-zero.mjs +2475 -0
- package/fesm2022/ng-directive-zero.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/components/agentation/agentation.component.d.ts +54 -0
- package/lib/components/annotation-panel/annotation-panel.component.d.ts +84 -0
- package/lib/components/inline-editor/inline-editor.component.d.ts +53 -0
- package/lib/components/markers-panel/markers-panel.component.d.ts +47 -0
- package/lib/components/overlay/overlay.component.d.ts +171 -0
- package/lib/components/settings-panel/settings-panel.component.d.ts +48 -0
- package/lib/components/toolbar/toolbar.component.d.ts +56 -0
- package/lib/models/component-node.interface.d.ts +154 -0
- package/lib/ng-directive-zero.module.d.ts +35 -0
- package/lib/services/component-walker.service.d.ts +109 -0
- package/lib/services/data-sanitizer.service.d.ts +65 -0
- package/lib/services/mcp.service.d.ts +43 -0
- package/lib/services/prompt-generator.service.d.ts +74 -0
- package/package.json +39 -0
- package/public-api.d.ts +13 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ng-directive-zero.mjs","sources":["../../../projects/ng-directive-zero/src/lib/models/component-node.interface.ts","../../../projects/ng-directive-zero/src/lib/services/component-walker.service.ts","../../../projects/ng-directive-zero/src/lib/components/inline-editor/inline-editor.component.ts","../../../projects/ng-directive-zero/src/lib/components/inline-editor/inline-editor.component.html","../../../projects/ng-directive-zero/src/lib/components/overlay/overlay.component.ts","../../../projects/ng-directive-zero/src/lib/components/overlay/overlay.component.html","../../../projects/ng-directive-zero/src/lib/services/data-sanitizer.service.ts","../../../projects/ng-directive-zero/src/lib/services/prompt-generator.service.ts","../../../projects/ng-directive-zero/src/lib/services/mcp.service.ts","../../../projects/ng-directive-zero/src/lib/components/annotation-panel/annotation-panel.component.ts","../../../projects/ng-directive-zero/src/lib/components/annotation-panel/annotation-panel.component.html","../../../projects/ng-directive-zero/src/lib/components/toolbar/toolbar.component.ts","../../../projects/ng-directive-zero/src/lib/components/toolbar/toolbar.component.html","../../../projects/ng-directive-zero/src/lib/components/settings-panel/settings-panel.component.ts","../../../projects/ng-directive-zero/src/lib/components/settings-panel/settings-panel.component.html","../../../projects/ng-directive-zero/src/lib/components/markers-panel/markers-panel.component.ts","../../../projects/ng-directive-zero/src/lib/components/markers-panel/markers-panel.component.html","../../../projects/ng-directive-zero/src/lib/components/agentation/agentation.component.ts","../../../projects/ng-directive-zero/src/lib/components/agentation/agentation.component.html","../../../projects/ng-directive-zero/src/lib/ng-directive-zero.module.ts","../../../projects/ng-directive-zero/src/public-api.ts","../../../projects/ng-directive-zero/src/ng-directive-zero.ts"],"sourcesContent":["/**\n * Angular Agentation - Component Node Interface\n * 定義從 DOM 元素解析出的 Angular 組件資訊結構\n */\n\n/**\n * 組件節點資訊\n * 包含識別、邏輯層、渲染層三個維度的資料\n */\nexport interface ComponentNode {\n /** 唯一識別符 */\n uid: string;\n\n /** 組件類別名稱 e.g., \"ProductCardComponent\" */\n displayName: string;\n\n /** Angular selector e.g., \"app-product-card\" */\n selector: string;\n\n /** 原始檔路徑 (MVP 階段為 null,需 build-time 支援) */\n filePath: string | null;\n\n /** DOM 路徑 e.g., \"html > body > app-root > app-product-card\" */\n domPath: string;\n\n // ==================== 邏輯層 ====================\n\n /** @Input 綁定值 { 'propertyName': currentValue } */\n inputs: Record<string, unknown>;\n\n /** @Output 事件名稱列表 */\n outputs: string[];\n\n /** 組件公開屬性(非 @Input 的成員變數) */\n publicProperties: Record<string, unknown>;\n\n // ==================== 渲染層 ====================\n\n /** 原始 DOM 元素參考 */\n domElement: HTMLElement;\n\n /** 元素的邊界矩形(用於繪製高亮框) */\n rect: DOMRect;\n\n /** 關鍵 computed styles */\n computedStyles: Record<string, string>;\n\n // ==================== Angular 特有 ====================\n\n /** 應用的指令列表 */\n directives: string[];\n\n /** 父組件資訊(可選) */\n parent?: ParentComponentInfo;\n}\n\n/**\n * 父組件簡要資訊\n */\nexport interface ParentComponentInfo {\n displayName: string;\n selector: string;\n}\n\n/**\n * 使用者標註\n * 將「人類意圖」與「程式碼位置」綁定\n */\nexport interface UserAnnotation {\n /** 目標組件節點 */\n target: ComponentNode;\n\n /** 使用者的意圖描述 */\n intent: string;\n\n /** 截圖 (Base64) - 可選 */\n snapshotImage?: string;\n\n /** 標註時間戳 */\n timestamp: number;\n}\n\n/**\n * Overlay 狀態\n */\nexport interface OverlayState {\n /** 是否處於檢查模式 */\n isInspecting: boolean;\n\n /** 當前懸停的組件節點 */\n hoveredNode: ComponentNode | null;\n\n /** 當前選中的組件節點 */\n selectedNode: ComponentNode | null;\n}\n\n/**\n * 需要提取的關鍵 CSS 屬性列表\n */\nexport const KEY_COMPUTED_STYLES = [\n 'display',\n 'position',\n 'width',\n 'height',\n 'padding',\n 'margin',\n 'background-color',\n 'color',\n 'font-size',\n 'font-family',\n 'border',\n 'border-radius',\n 'opacity',\n 'cursor',\n 'z-index',\n] as const;\n\n// ==================== 多選功能新增 ====================\n\n/**\n * 標記顏色選項\n */\nexport type MarkerColor = 'purple' | 'blue' | 'cyan' | 'green' | 'yellow' | 'orange' | 'red';\n\n/**\n * 標記顏色對應 HEX 值\n */\nexport const MARKER_COLORS: Record<MarkerColor, string> = {\n purple: '#a855f7',\n blue: '#3b82f6',\n cyan: '#06b6d4',\n green: '#22c55e',\n yellow: '#eab308',\n orange: '#f97316',\n red: '#ef4444',\n};\n\n/**\n * 單個標記\n * 代表一次點擊標記的組件\n */\nexport interface MarkerAnnotation {\n /** 標記編號(1, 2, 3...) */\n index: number;\n\n /** 目標組件節點 */\n target: ComponentNode;\n\n /** 使用者的意圖描述 */\n intent: string;\n\n /** 標記顏色 */\n color: MarkerColor;\n\n /** 標記時間戳 */\n timestamp: number;\n}\n\n/**\n * 錄製會話\n * 包含多個標記\n */\nexport interface RecordingSession {\n /** 會話 ID */\n id: string;\n\n /** 會話內的標記列表 */\n markers: MarkerAnnotation[];\n\n /** 會話開始時間 */\n startTime: number;\n\n /** 會話結束時間 */\n endTime?: number;\n\n /** 是否正在錄製中 */\n isRecording: boolean;\n}\n\n/**\n * 輸出詳細程度\n * - compact: 最簡潔,只有基本識別資訊\n * - standard: 標準模式,包含位置和基本樣式\n * - detailed: 詳細模式,包含所有屬性和上下文\n * - forensic: 完整模式,包含所有可用資訊\n */\nexport type OutputDetail = 'compact' | 'standard' | 'detailed' | 'forensic';\n\n/**\n * Agentation 設定\n */\nexport interface AgentationSettings {\n /** 是否為深色模式 */\n isDarkMode: boolean;\n\n /** 輸出詳細程度 */\n outputDetail: OutputDetail;\n\n /** 是否顯示 Angular 組件資訊 */\n showAngularComponents: boolean;\n\n /** 當前標記顏色 */\n markerColor: MarkerColor;\n\n /** 複製/發送後清除標記 */\n clearOnCopy: boolean;\n\n /** 阻止頁面互動(檢查模式下) */\n blockPageInteractions: boolean;\n}\n\n/**\n * 預設設定\n */\nexport const DEFAULT_SETTINGS: AgentationSettings = {\n isDarkMode: false,\n outputDetail: 'forensic',\n showAngularComponents: true,\n markerColor: 'blue',\n clearOnCopy: false,\n blockPageInteractions: false,\n};\n\n/**\n * 工具列狀態\n */\nexport interface ToolbarState {\n /** 是否顯示設定面板 */\n showSettings: boolean;\n\n /** 是否顯示標記列表 */\n showMarkers: boolean;\n\n /** 是否正在錄製 */\n isRecording: boolean;\n\n /** 是否最小化 */\n isMinimized: boolean;\n}\n\n","import { Injectable } from '@angular/core';\nimport {\n ComponentNode,\n ParentComponentInfo,\n KEY_COMPUTED_STYLES,\n} from '../models/component-node.interface';\n\n/**\n * Angular 全局除錯 API 類型定義\n * 僅在開發模式下可用\n */\ninterface NgGlobal {\n getComponent<T>(element: Element): T | null;\n getOwningComponent<T>(element: Element): T | null;\n getDirectives(element: Element): unknown[];\n getContext<T>(element: Element): T | null;\n}\n\n/**\n * Angular 組件定義內部結構\n */\ninterface ComponentDef {\n inputs?: Record<string, string>;\n outputs?: Record<string, string>;\n selectors?: Array<Array<string | null>>;\n}\n\n/**\n * ComponentWalkerService\n *\n * 核心服務:從 DOM 元素獲取 Angular 組件資訊\n * 使用 Angular 的 ng.getComponent() 等開發模式 API\n *\n * 效能要求:執行時間 < 16ms (1 frame)\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class ComponentWalkerService {\n private uidCounter = 0;\n\n /**\n * 檢查是否在開發模式下且 ng API 可用\n */\n isAvailable(): boolean {\n return typeof (window as unknown as { ng?: NgGlobal }).ng?.getComponent === 'function';\n }\n\n /**\n * 從 DOM 元素獲取 Angular 組件節點資訊\n *\n * @param element - 目標 DOM 元素\n * @returns ComponentNode 或 null(如果不是 Angular 組件)\n */\n getComponentNode(element: HTMLElement): ComponentNode | null {\n if (!this.isAvailable()) {\n console.warn('[ng-directive-zero] Angular debug API not available. Overlay disabled.');\n return null;\n }\n\n const ng = (window as unknown as { ng: NgGlobal }).ng;\n const startTime = performance.now();\n\n try {\n // 嘗試獲取組件實例\n let component = ng.getComponent(element);\n let targetElement = element;\n let isDomNode = false;\n\n // 如果當前元素不是組件,向上查找最近的組件\n if (!component) {\n const owningComponent = ng.getOwningComponent(element);\n if (!owningComponent) {\n return null;\n }\n\n // 檢查是否為 Root Component (沒有父組件)\n const componentHost = this.findComponentHost(element, owningComponent);\n // const parentOfOwning = this.getParentInfo(componentHost || element, ng);\n\n // 如果點擊的不是 host 本身,則將其視為 DOM 節點\n // (不再限制只能是 Root Component 的子元素)\n if (componentHost !== element) {\n component = owningComponent;\n targetElement = element;\n isDomNode = true;\n } else {\n component = owningComponent;\n // 找到擁有該組件的元素\n targetElement = componentHost ?? element;\n }\n }\n\n if (isDomNode) {\n return this.createDomNode(targetElement, component);\n }\n\n // 獲取組件定義\n const componentDef = this.getComponentDef(component);\n const displayName = (component as object).constructor.name;\n const selector = this.extractSelector(componentDef);\n\n // 提取 @Input 值\n const inputs = this.extractInputValues(component, componentDef);\n\n // 提取 @Output 名稱\n const outputs = this.extractOutputNames(componentDef);\n\n // 提取公開屬性\n const publicProperties = this.extractPublicProperties(component, componentDef);\n\n // 獲取應用的指令\n const directives = ng.getDirectives(targetElement)\n .map((d: unknown) => (d as object).constructor.name)\n .filter((name: string) => name !== 'Object');\n\n // 獲取父組件資訊\n const parent = this.getParentInfo(targetElement, ng);\n\n // 計算 DOM 路徑\n const domPath = this.computeDomPath(targetElement);\n\n // 獲取 computed styles\n const computedStyles = this.extractComputedStyles(targetElement);\n\n const node: ComponentNode = {\n uid: this.generateUid(),\n displayName,\n selector,\n filePath: null, // MVP 階段不支援\n domPath,\n inputs,\n outputs,\n publicProperties,\n domElement: targetElement,\n rect: targetElement.getBoundingClientRect(),\n computedStyles,\n directives,\n parent,\n };\n\n // 效能監控\n const elapsed = performance.now() - startTime;\n if (elapsed > 16) {\n console.warn(`[ng-directive-zero] ComponentWalker took ${elapsed.toFixed(2)}ms (> 16ms frame budget)`);\n }\n\n return node;\n } catch (error) {\n console.error('[ng-directive-zero] Error walking component:', error);\n return null;\n }\n }\n\n /**\n * 創建 DOM 節點組件資訊 (用於 Root Component 內的普通元素)\n */\n private createDomNode(element: HTMLElement, owningComponent: unknown): ComponentNode {\n const componentDef = this.getComponentDef(owningComponent);\n\n // 父組件是 Root Component\n const parentInfo: ParentComponentInfo = {\n displayName: (owningComponent as object).constructor.name,\n selector: this.extractSelector(componentDef),\n };\n\n const domPath = this.computeDomPath(element);\n const computedStyles = this.extractComputedStyles(element);\n\n // 使用 tag name 作為名稱\n const tagName = element.tagName.toLowerCase();\n\n // 加上 id 或 class 以便識別\n let displayName = tagName;\n if (element.id) {\n displayName += `#${element.id}`;\n } else if (element.classList.length > 0) {\n displayName += `.${element.classList[0]}`;\n }\n\n return {\n uid: this.generateUid(),\n displayName: displayName,\n selector: tagName,\n filePath: null,\n domPath,\n inputs: {},\n outputs: [],\n publicProperties: {},\n domElement: element,\n rect: element.getBoundingClientRect(),\n computedStyles,\n directives: [],\n parent: parentInfo,\n };\n }\n\n /**\n * 獲取組件定義 (ɵcmp)\n */\n private getComponentDef(component: unknown): ComponentDef | null {\n const constructor = (component as object).constructor as { ɵcmp?: ComponentDef };\n return constructor.ɵcmp ?? null;\n }\n\n /**\n * 從組件定義提取 selector\n */\n private extractSelector(componentDef: ComponentDef | null): string {\n if (!componentDef?.selectors?.[0]) {\n return 'unknown';\n }\n // selectors 是嵌套陣列,第一個元素通常是 tag selector\n return componentDef.selectors[0].filter(Boolean).join('') || 'unknown';\n }\n\n /**\n * 提取 @Input 綁定的當前值\n */\n private extractInputValues(\n component: unknown,\n componentDef: ComponentDef | null\n ): Record<string, unknown> {\n const inputs: Record<string, unknown> = {};\n const inputDefs = componentDef?.inputs ?? {};\n\n for (const [publicName, propertyName] of Object.entries(inputDefs)) {\n const value = (component as Record<string, unknown>)[propertyName];\n // 過濾掉 undefined 值\n if (value !== undefined) {\n inputs[publicName] = this.sanitizeValue(value);\n }\n }\n\n return inputs;\n }\n\n /**\n * 提取 @Output 事件名稱\n */\n private extractOutputNames(componentDef: ComponentDef | null): string[] {\n const outputDefs = componentDef?.outputs ?? {};\n return Object.keys(outputDefs);\n }\n\n /**\n * 提取非 Input/Output 的公開屬性\n */\n private extractPublicProperties(\n component: unknown,\n componentDef: ComponentDef | null\n ): Record<string, unknown> {\n const properties: Record<string, unknown> = {};\n const inputProps = new Set(Object.values(componentDef?.inputs ?? {}));\n const outputProps = new Set(Object.values(componentDef?.outputs ?? {}));\n\n // 獲取組件實例上的所有可枚舉屬性\n for (const key of Object.keys(component as object)) {\n // 跳過 Angular 內部屬性\n if (key.startsWith('_') || key.startsWith('ɵ') || key.startsWith('ng')) {\n continue;\n }\n // 跳過 Input/Output 屬性\n if (inputProps.has(key) || outputProps.has(key)) {\n continue;\n }\n const value = (component as Record<string, unknown>)[key];\n // 跳過函數\n if (typeof value === 'function') {\n continue;\n }\n properties[key] = this.sanitizeValue(value);\n }\n\n return properties;\n }\n\n /**\n * 清理值以便序列化\n */\n private sanitizeValue(value: unknown): unknown {\n if (value === null || value === undefined) {\n return value;\n }\n\n // 處理函數\n if (typeof value === 'function') {\n return `[Function: ${value.name || 'anonymous'}]`;\n }\n\n // 處理 Observable/Subject\n if (this.isObservable(value)) {\n return `[Observable]`;\n }\n\n // 處理 DOM 元素\n if (value instanceof HTMLElement) {\n return `[HTMLElement: ${value.tagName.toLowerCase()}]`;\n }\n\n // 處理大型字串 (可能是 Base64)\n if (typeof value === 'string' && value.length > 1024) {\n return `[String: ${value.length} chars]`;\n }\n\n // 處理陣列\n if (Array.isArray(value)) {\n if (value.length > 10) {\n return `[Array: ${value.length} items]`;\n }\n return value.map((v) => this.sanitizeValue(v));\n }\n\n // 處理物件\n if (typeof value === 'object') {\n // 避免循環引用,只展開一層\n const sanitized: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as object)) {\n if (typeof v !== 'object' || v === null) {\n sanitized[k] = this.sanitizeValue(v);\n } else {\n sanitized[k] = `[Object: ${v.constructor.name}]`;\n }\n }\n return sanitized;\n }\n\n return value;\n }\n\n /**\n * 檢查是否為 RxJS Observable\n */\n private isObservable(value: unknown): boolean {\n return (\n value !== null &&\n typeof value === 'object' &&\n typeof (value as { subscribe?: unknown }).subscribe === 'function'\n );\n }\n\n /**\n * 獲取父組件資訊\n */\n private getParentInfo(element: HTMLElement, ng: NgGlobal): ParentComponentInfo | undefined {\n let parent = element.parentElement;\n while (parent) {\n const parentComponent = ng.getComponent(parent);\n if (parentComponent) {\n const parentDef = this.getComponentDef(parentComponent);\n return {\n displayName: (parentComponent as object).constructor.name,\n selector: this.extractSelector(parentDef),\n };\n }\n parent = parent.parentElement;\n }\n return undefined;\n }\n\n /**\n * 找到組件的 host 元素\n */\n private findComponentHost(startElement: HTMLElement, component: unknown): HTMLElement | null {\n const ng = (window as unknown as { ng: NgGlobal }).ng;\n let current: HTMLElement | null = startElement;\n\n while (current) {\n if (ng.getComponent(current) === component) {\n return current;\n }\n current = current.parentElement;\n }\n\n return null;\n }\n\n /**\n * 計算 DOM 路徑\n */\n private computeDomPath(element: HTMLElement): string {\n const parts: string[] = [];\n let current: HTMLElement | null = element;\n\n while (current && current !== document.body) {\n let selector = current.tagName.toLowerCase();\n\n // 加上 id(如果有)\n if (current.id) {\n selector += `#${current.id}`;\n }\n // 或加上第一個 class\n else if (current.classList.length > 0) {\n selector += `.${current.classList[0]}`;\n }\n\n parts.unshift(selector);\n current = current.parentElement;\n }\n\n parts.unshift('body');\n return parts.join(' > ');\n }\n\n /**\n * 提取關鍵 computed styles\n */\n private extractComputedStyles(element: HTMLElement): Record<string, string> {\n const styles: Record<string, string> = {};\n const computed = window.getComputedStyle(element);\n\n for (const prop of KEY_COMPUTED_STYLES) {\n styles[prop] = computed.getPropertyValue(prop);\n }\n\n return styles;\n }\n\n /**\n * 生成唯一 ID\n */\n private generateUid(): string {\n this.uidCounter++;\n return `ag-${Date.now()}-${this.uidCounter}`;\n }\n\n /**\n * 獲取元素的祖先鏈(從當前元素到根)\n * 用於層級麵包屑導航\n *\n * @param element - 起始 DOM 元素\n * @param maxDepth - 最大深度(預設 10,避免過長)\n * @returns ComponentNode 陣列,索引 0 為當前元素,依次向上\n */\n getAncestorChain(element: HTMLElement, maxDepth = 10): ComponentNode[] {\n if (!this.isAvailable()) {\n return [];\n }\n\n const chain: ComponentNode[] = [];\n let current: HTMLElement | null = element;\n let depth = 0;\n\n while (current && current !== document.body && depth < maxDepth) {\n const node = this.getComponentNode(current);\n if (node) {\n chain.push(node);\n }\n\n // 尋找下一個有效的父元素\n current = current.parentElement;\n depth++;\n }\n\n return chain;\n }\n\n /**\n * 簡化版:僅獲取祖先元素的基本資訊(用於麵包屑顯示)\n * 效能更佳,不需要完整的 ComponentNode\n *\n * @param element - 起始 DOM 元素\n * @param maxDepth - 最大深度\n * @returns 簡化的祖先資訊陣列\n */\n getAncestorBreadcrumbs(element: HTMLElement, maxDepth = 10): AncestorBreadcrumb[] {\n if (!this.isAvailable()) {\n return [];\n }\n\n const ng = (window as unknown as { ng: NgGlobal }).ng;\n const breadcrumbs: AncestorBreadcrumb[] = [];\n let current: HTMLElement | null = element;\n let depth = 0;\n\n while (current && current !== document.body && depth < maxDepth) {\n const component = ng.getComponent(current);\n const owningComponent = ng.getOwningComponent(current);\n\n let label: string;\n let isComponent = false;\n\n if (component) {\n // 這是一個 Angular 組件的 host 元素\n const componentDef = this.getComponentDef(component);\n label = this.extractSelector(componentDef);\n isComponent = true;\n } else if (owningComponent) {\n // 這是組件內的普通 DOM 元素\n const tagName = current.tagName.toLowerCase();\n if (current.id) {\n label = `${tagName}#${current.id}`;\n } else if (current.classList.length > 0) {\n label = `${tagName}.${current.classList[0]}`;\n } else {\n label = tagName;\n }\n } else {\n // 不屬於任何 Angular 組件\n current = current.parentElement;\n depth++;\n continue;\n }\n\n breadcrumbs.push({\n label,\n element: current,\n isComponent,\n depth,\n });\n\n current = current.parentElement;\n depth++;\n }\n\n return breadcrumbs;\n }\n}\n\n/**\n * 祖先麵包屑項目(輕量版)\n */\nexport interface AncestorBreadcrumb {\n /** 顯示標籤 */\n label: string;\n /** 對應的 DOM 元素 */\n element: HTMLElement;\n /** 是否為 Angular 組件 */\n isComponent: boolean;\n /** 深度(0 = 當前元素) */\n depth: number;\n}\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { MarkerAnnotation } from '../../models/component-node.interface';\n\n/**\n * InlineEditorComponent\n *\n * 內嵌編輯器:用於編輯已標記元素的 intent\n * 參考 React Agentation 的設計\n */\n@Component({\n selector: 'ag-inline-editor',\n standalone: false,\n templateUrl: './inline-editor.component.html',\n styleUrls: ['./inline-editor.component.scss'],\n})\nexport class InlineEditorComponent {\n /** 正在編輯的標記 */\n @Input() marker: MarkerAnnotation | null = null;\n\n /** 編輯器位置 */\n @Input() position: { top: number; left: number } = { top: 0, left: 0 };\n\n /** 儲存時觸發 */\n @Output() save = new EventEmitter<{ index: number; intent: string }>();\n\n /** 刪除時觸發 */\n @Output() delete = new EventEmitter<number>();\n\n /** 取消時觸發 */\n @Output() cancel = new EventEmitter<void>();\n\n /** 暫存的 intent 值 */\n tempIntent = '';\n\n /** 樣式面板是否展開 */\n isStyleExpanded = false;\n\n ngOnChanges(): void {\n if (this.marker) {\n this.tempIntent = this.marker.intent || '';\n }\n }\n\n /** 儲存 */\n onSave(): void {\n if (this.marker) {\n this.save.emit({\n index: this.marker.index,\n intent: this.tempIntent,\n });\n }\n }\n\n /** 刪除 */\n onDelete(): void {\n if (this.marker) {\n this.delete.emit(this.marker.index);\n }\n }\n\n /** 取消 */\n onCancel(): void {\n this.cancel.emit();\n }\n\n /** 獲取編輯器樣式 */\n getEditorStyle(): Record<string, string> {\n return {\n position: 'absolute',\n top: `${this.position.top}px`,\n left: `${this.position.left}px`,\n zIndex: '999999',\n };\n }\n\n /** 獲取元素描述 */\n getElementDescription(): string {\n if (!this.marker) return '';\n const target = this.marker.target;\n return `${target.selector || target.displayName}`;\n }\n\n /** 切換樣式面板 */\n toggleStylePanel(): void {\n this.isStyleExpanded = !this.isStyleExpanded;\n }\n\n /** 獲取樣式條目 */\n getStyleEntries(): Array<{ key: string; value: string }> {\n if (!this.marker) return [];\n return Object.entries(this.marker.target.computedStyles)\n .filter(([, value]) => value && value !== 'none' && value !== 'normal')\n .map(([key, value]) => ({ key, value }));\n }\n\n /** 格式化值為顯示字串 */\n formatValue(value: string): string {\n if (!value) return '';\n // 如果值太長,截斷它\n return value.length > 50 ? value.substring(0, 50) + '...' : value;\n }\n}\n","<div class=\"ag-inline-editor\" [ngStyle]=\"getEditorStyle()\">\n <!-- 標題 -->\n <div class=\"ag-editor-header\">\n <button class=\"ag-editor-title\" (click)=\"toggleStylePanel()\" title=\"Toggle styles\">\n <svg \n viewBox=\"0 0 24 24\" \n fill=\"none\" \n stroke=\"currentColor\" \n stroke-width=\"2\"\n [class.expanded]=\"isStyleExpanded\"\n >\n <polyline points=\"6 9 12 15 18 9\"></polyline>\n </svg>\n {{ getElementDescription() }}\n </button>\n </div>\n\n <!-- 輸入框 -->\n <div class=\"ag-editor-body\">\n <textarea\n class=\"ag-editor-input\"\n [(ngModel)]=\"tempIntent\"\n placeholder=\"Enter your feedback or intent...\"\n rows=\"4\"\n (keydown.ctrl.enter)=\"onSave()\"\n (keydown.esc)=\"onCancel()\"\n autofocus\n ></textarea>\n </div>\n\n <!-- 樣式詳情區塊 -->\n <div class=\"ag-editor-styles\" *ngIf=\"isStyleExpanded\">\n <div class=\"ag-styles-header\">Computed Styles</div>\n <div class=\"ag-styles-list\">\n <div class=\"ag-style-item\" *ngFor=\"let style of getStyleEntries()\">\n <span class=\"ag-style-key\">{{ style.key }}:</span>\n <span class=\"ag-style-value\">{{ formatValue(style.value) }}</span>\n </div>\n <div class=\"ag-styles-empty\" *ngIf=\"getStyleEntries().length === 0\">\n No significant styles found\n </div>\n </div>\n </div>\n\n <!-- 操作按鈕 -->\n <div class=\"ag-editor-footer\">\n <button class=\"ag-btn ag-btn-delete\" (click)=\"onDelete()\" title=\"Delete marker\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <polyline points=\"3 6 5 6 21 6\"></polyline>\n <path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\"></path>\n </svg>\n </button>\n <div class=\"ag-btn-group\">\n <button class=\"ag-btn ag-btn-cancel\" (click)=\"onCancel()\">Cancel</button>\n <button class=\"ag-btn ag-btn-save\" (click)=\"onSave()\">Save</button>\n </div>\n </div>\n</div>\n","import {\n Component,\n EventEmitter,\n HostListener,\n Input,\n OnDestroy,\n OnInit,\n Output,\n SimpleChanges,\n OnChanges,\n} from '@angular/core';\nimport {\n ComponentNode,\n MarkerAnnotation,\n MarkerColor,\n MARKER_COLORS,\n AgentationSettings,\n DEFAULT_SETTINGS,\n} from '../../models/component-node.interface';\nimport { ComponentWalkerService, AncestorBreadcrumb } from '../../services/component-walker.service';\n\n/**\n * OverlayComponent (v2)\n *\n * 支援多選標記的視覺化 DOM 檢查器\n */\n@Component({\n selector: 'ag-overlay',\n standalone: false,\n templateUrl: './overlay.component.html',\n styleUrls: ['./overlay.component.scss'],\n})\nexport class OverlayComponent implements OnInit, OnDestroy, OnChanges {\n /** 已有的標記列表 */\n @Input() markers: MarkerAnnotation[] = [];\n\n /** 當前設定 */\n @Input() settings: AgentationSettings = DEFAULT_SETTINGS;\n\n /** 是否處於錄製模式 */\n @Input() isRecording = false;\n\n /** 工具列是否最小化 */\n @Input() isMinimized = false;\n\n /** 新增標記時觸發(多選模式) */\n @Output() markerAdded = new EventEmitter<ComponentNode>();\n\n /** 選中組件時觸發(兼容舊版) */\n @Output() componentSelected = new EventEmitter<ComponentNode>();\n\n /** 懸停組件變化時觸發 */\n @Output() componentHovered = new EventEmitter<ComponentNode | null>();\n\n /** 錄製模式變化時觸發 */\n @Output() recordingChanged = new EventEmitter<boolean>();\n\n /** 標記被刪除時觸發 */\n @Output() markerDeleted = new EventEmitter<number>();\n\n /** 高亮框樣式 */\n highlightStyle: Record<string, string> = { display: 'none' };\n\n /** Tooltip 內容 */\n tooltipContent = '';\n\n /** Tooltip 位置 */\n tooltipStyle: Record<string, string> = {};\n\n /** 是否顯示 tooltip */\n showTooltip = false;\n\n /** 當前懸停的節點 */\n hoveredNode: ComponentNode | null = null;\n\n /** 顏色對應的 HEX 值 */\n readonly colorHex = MARKER_COLORS;\n\n /** 綁定的 click handler(用於移除監聽器) */\n private boundClickHandler: ((event: MouseEvent) => void) | null = null;\n\n /** 正在編輯的標記 */\n editingMarker: MarkerAnnotation | null = null;\n\n /** 編輯器位置 */\n editorPosition: { top: number; left: number } = { top: 0, left: 0 };\n\n /** 祖先麵包屑列表 */\n ancestorBreadcrumbs: AncestorBreadcrumb[] = [];\n\n /** 麵包屑位置 */\n breadcrumbStyle: Record<string, string> = { display: 'none' };\n\n /** 當前選中的麵包屑索引 */\n selectedBreadcrumbIndex = 0;\n\n /** 是否顯示麵包屑 */\n showBreadcrumb = false;\n\n /** 是否鎖定當前選取(Click-to-lock) */\n isLocked = false;\n\n /** 鎖定的節點 */\n lockedNode: ComponentNode | null = null;\n\n constructor(private componentWalker: ComponentWalkerService) { }\n\n ngOnInit(): void {\n if (!this.componentWalker.isAvailable()) {\n console.warn('[ng-directive-zero] Angular debug API not available. Overlay disabled.');\n }\n\n // 使用 capture phase 攔截點擊事件\n this.boundClickHandler = this.onDocumentClick.bind(this);\n document.addEventListener('click', this.boundClickHandler, true);\n }\n\n ngOnDestroy(): void {\n this.stopRecording();\n if (this.boundClickHandler) {\n document.removeEventListener('click', this.boundClickHandler, true);\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['isRecording']) {\n if (this.isRecording) {\n if (this.componentWalker.isAvailable()) {\n document.body.style.cursor = 'crosshair';\n }\n } else {\n this.cleanupRecording();\n }\n }\n\n // 當工具列最小化時,隱藏所有 overlay 元素\n if (changes['isMinimized'] && this.isMinimized) {\n this.clearHighlight();\n }\n }\n\n /**\n * 開始錄製模式\n */\n startRecording(): void {\n if (!this.componentWalker.isAvailable()) {\n console.error('[ng-directive-zero] Cannot start recording: Angular debug API not available.');\n return;\n }\n this.isRecording = true;\n this.recordingChanged.emit(true);\n document.body.style.cursor = 'crosshair';\n }\n\n /**\n * 停止錄製模式\n */\n stopRecording(): void {\n this.isRecording = false;\n this.cleanupRecording();\n this.recordingChanged.emit(false);\n }\n\n private cleanupRecording(): void {\n this.hoveredNode = null;\n this.highlightStyle = { display: 'none' }; // 明確隱藏高亮框\n this.showTooltip = false;\n this.showBreadcrumb = false; // 隱藏麵包屑\n this.ancestorBreadcrumbs = [];\n this.showBreadcrumb = false; // 隱藏麵包屑\n this.ancestorBreadcrumbs = [];\n this.selectedBreadcrumbIndex = 0;\n this.isLocked = false;\n this.lockedNode = null;\n document.body.style.cursor = '';\n }\n\n /**\n * 切換錄製模式\n */\n toggleRecording(): void {\n if (this.isRecording) {\n this.stopRecording();\n } else {\n this.startRecording();\n }\n }\n\n /**\n * 處理滑鼠移動\n */\n @HostListener('document:mousemove', ['$event'])\n onMouseMove(event: MouseEvent): void {\n if (!this.isRecording) return;\n if (this.isLocked) return; // 鎖定時停止更新懸停狀態\n\n let target = event.target as HTMLElement;\n\n // 特殊處理:如果是我們的點擊捕捉層 (處理 disabled 元素)\n if (target.classList.contains('ag-click-overlay')) {\n target.style.display = 'none'; // 暫時隱藏\n const underlying = document.elementFromPoint(event.clientX, event.clientY);\n target.style.display = 'block'; // 恢復顯示\n\n if (underlying && underlying instanceof HTMLElement) {\n target = underlying;\n }\n }\n\n if (this.isOverlayElement(target)) return;\n\n const node = this.componentWalker.getComponentNode(target);\n\n if (node) {\n this.hoveredNode = node;\n this.updateHighlight(node, this.settings.markerColor);\n this.updateTooltip(node, event);\n this.updateBreadcrumbs(target, event);\n this.componentHovered.emit(node);\n } else {\n this.clearHighlight();\n }\n }\n\n /**\n * 處理點擊(capture phase,優先攔截)\n */\n /**\n * 處理點擊(capture phase,優先攔截)\n */\n private onDocumentClick(event: MouseEvent): void {\n if (!this.isRecording) return;\n\n let target = event.target as HTMLElement;\n\n // 特殊處理:如果是我們的點擊捕捉層\n if (target.classList.contains('ag-click-overlay')) {\n target.style.display = 'none'; // 暫時隱藏\n const underlying = document.elementFromPoint(event.clientX, event.clientY);\n target.style.display = 'block'; // 恢復顯示\n\n if (underlying && underlying instanceof HTMLElement) {\n target = underlying;\n }\n }\n\n if (this.isOverlayElement(target)) return;\n\n // 立即阻止事件傳播,防止觸發按鈕等元素的功能\n event.preventDefault();\n event.stopPropagation();\n event.stopImmediatePropagation();\n\n const node = this.componentWalker.getComponentNode(target);\n\n // 如果處於鎖定狀態\n if (this.isLocked) {\n // 如果點擊的是當前鎖定的節點(或其高亮範圍內),則確認標記\n // 直覺上:第二次點擊 = 確認\n if (node && this.lockedNode && this.isSameNode(node, this.lockedNode)) {\n this.confirmMarker(this.lockedNode);\n this.unlock();\n } else {\n // 點擊其他地方 -> 解鎖\n // 如果點擊了另一個有效節點,則立即鎖定該新節點(流暢體驗)\n this.unlock();\n if (node) {\n this.lockNode(node, event);\n }\n }\n } else {\n // 未鎖定狀態 -> 第一次點擊 -> 鎖定\n if (node) {\n this.lockNode(node, event);\n }\n }\n }\n\n /**\n * 鎖定節點\n */\n private lockNode(node: ComponentNode, event: MouseEvent): void {\n this.isLocked = true;\n this.lockedNode = node;\n this.hoveredNode = node;\n this.updateHighlight(node, this.settings.markerColor);\n this.updateTooltip(node, event);\n this.updateBreadcrumbs(node.domElement, event);\n this.componentHovered.emit(node);\n }\n\n /**\n * 解鎖\n */\n unlock(): void {\n this.isLocked = false;\n this.lockedNode = null;\n this.clearHighlight();\n }\n\n /**\n * 確認新增標記\n */\n private confirmMarker(node: ComponentNode): void {\n // 檢查是否已存在標記\n const existingMarker = this.markers.find(\n m => m.target.domElement === node.domElement\n );\n\n if (existingMarker) {\n // 顯示編輯器\n const rect = node.domElement.getBoundingClientRect();\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft;\n\n this.editorPosition = {\n top: rect.bottom + scrollTop + 10,\n left: rect.left + scrollLeft\n };\n this.editingMarker = existingMarker;\n } else {\n // 新增標記\n this.markerAdded.emit(node);\n this.componentSelected.emit(node);\n }\n }\n\n /**\n * 比較兩個節點是否相同\n */\n private isSameNode(a: ComponentNode, b: ComponentNode): boolean {\n return a.domElement === b.domElement;\n }\n\n /**\n * 處理編輯器儲存\n */\n onEditorSave(event: { index: number; intent: string }): void {\n const marker = this.markers.find(m => m.index === event.index);\n if (marker) {\n marker.intent = event.intent;\n }\n this.editingMarker = null;\n }\n\n /**\n * 處理編輯器刪除\n */\n onEditorDelete(index: number): void {\n this.editingMarker = null;\n this.markerDeleted.emit(index);\n }\n\n /**\n * 處理編輯器取消\n */\n onEditorCancel(): void {\n this.editingMarker = null;\n }\n\n /**\n * 處理 Escape 鍵\n */\n @HostListener('document:keydown.escape')\n onEscape(): void {\n if (this.isRecording) {\n this.stopRecording();\n }\n }\n\n /**\n * 處理快捷鍵 Ctrl+Shift+I\n */\n @HostListener('document:keydown', ['$event'])\n onKeyDown(event: KeyboardEvent): void {\n if (event.ctrlKey && event.shiftKey && event.key === 'I') {\n event.preventDefault();\n this.toggleRecording();\n }\n }\n\n /**\n * 處理點擊標記編號\n */\n onMarkerClick(marker: MarkerAnnotation, event: MouseEvent): void {\n event.preventDefault();\n event.stopPropagation();\n\n if (!this.isRecording) return;\n\n const rect = marker.target.domElement.getBoundingClientRect();\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft;\n\n this.editorPosition = {\n top: rect.bottom + scrollTop + 10,\n left: rect.left + scrollLeft\n };\n this.editingMarker = marker;\n }\n\n /**\n * 獲取標記的位置樣式\n */\n getMarkerStyle(marker: MarkerAnnotation): Record<string, string> {\n const element = marker.target.domElement;\n const rect = element.getBoundingClientRect();\n\n // 計算相對於 document 的絕對位置\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft;\n\n return {\n position: 'absolute',\n top: `${rect.top + scrollTop + rect.height / 2 - 14}px`,\n left: `${rect.left + scrollLeft + rect.width - 14}px`,\n backgroundColor: this.colorHex[marker.color],\n };\n }\n\n /**\n * 更新高亮框\n */\n private updateHighlight(node: ComponentNode, color: MarkerColor): void {\n const rect = node.rect;\n const hex = this.colorHex[color];\n\n this.highlightStyle = {\n display: 'block',\n position: 'absolute',\n top: `${rect.top + window.scrollY}px`,\n left: `${rect.left + window.scrollX}px`,\n width: `${rect.width}px`,\n height: `${rect.height}px`,\n backgroundColor: `${hex}33`,\n border: `2px solid ${hex}`,\n pointerEvents: 'none',\n zIndex: '999998',\n transition: 'all 0.1s ease-out',\n };\n }\n\n /**\n * 更新 tooltip\n */\n private updateTooltip(node: ComponentNode, event: MouseEvent): void {\n this.tooltipContent = `<${node.selector}> ${node.displayName}`;\n\n const tooltipX = event.clientX + 12;\n const tooltipY = event.clientY + 12;\n\n this.tooltipStyle = {\n display: 'block',\n position: 'fixed',\n top: `${tooltipY}px`,\n left: `${tooltipX}px`,\n zIndex: '999999',\n };\n\n this.showTooltip = true;\n }\n\n /**\n * 清除高亮\n */\n private clearHighlight(): void {\n this.highlightStyle = { display: 'none' };\n this.showTooltip = false;\n this.showBreadcrumb = false;\n this.hoveredNode = null;\n this.ancestorBreadcrumbs = [];\n this.selectedBreadcrumbIndex = 0;\n this.componentHovered.emit(null);\n }\n\n /**\n * 更新祖先麵包屑\n */\n private updateBreadcrumbs(element: HTMLElement, event: MouseEvent): void {\n const breadcrumbs = this.componentWalker.getAncestorBreadcrumbs(element);\n\n // 只有超過 1 個層級時才顯示麵包屑\n if (breadcrumbs.length > 1) {\n this.ancestorBreadcrumbs = breadcrumbs;\n this.selectedBreadcrumbIndex = 0;\n this.showBreadcrumb = true;\n\n // 固定在畫面頂部中間(錄製提示下方)\n const viewportWidth = window.innerWidth;\n\n this.breadcrumbStyle = {\n display: 'flex',\n position: 'fixed',\n top: '60px', // 在錄製提示下方\n left: '50%',\n transform: 'translateX(-50%)',\n maxWidth: `${viewportWidth - 32}px`,\n zIndex: '999999',\n };\n } else {\n this.showBreadcrumb = false;\n this.ancestorBreadcrumbs = [];\n }\n }\n\n /**\n * 處理麵包屑項目點擊\n */\n onBreadcrumbClick(breadcrumb: AncestorBreadcrumb, index: number, event: MouseEvent): void {\n event.preventDefault();\n event.stopPropagation();\n\n const node = this.componentWalker.getComponentNode(breadcrumb.element);\n if (!node) return;\n\n // 手機版優化:如果是點擊當前已選中的麵包屑 -> 確認標記\n if (this.selectedBreadcrumbIndex === index) {\n this.confirmMarker(node);\n this.unlock();\n return;\n }\n\n this.selectedBreadcrumbIndex = index;\n\n // 更新鎖定狀態到新的祖先節點\n this.isLocked = true;\n this.lockedNode = node;\n this.hoveredNode = node;\n this.updateHighlight(node, this.settings.markerColor);\n this.componentHovered.emit(node);\n }\n\n /**\n * 處理麵包屑項目雙擊(選取該元素)\n */\n /**\n * 處理麵包屑項目雙擊(直接選取)\n */\n onBreadcrumbDoubleClick(breadcrumb: AncestorBreadcrumb, event: MouseEvent): void {\n event.preventDefault();\n event.stopPropagation();\n\n const node = this.componentWalker.getComponentNode(breadcrumb.element);\n if (node) {\n this.confirmMarker(node);\n this.unlock();\n }\n }\n\n /**\n * 檢查是否為 overlay 元素\n */\n private isOverlayElement(element: HTMLElement): boolean {\n return element.closest('ag-overlay') !== null ||\n element.closest('ag-annotation-panel') !== null ||\n element.closest('ag-toolbar') !== null ||\n element.closest('ag-settings-panel') !== null ||\n element.closest('ag-markers-panel') !== null;\n }\n}\n","<!-- 互動捕捉層 (用於處理 disabled 元素) -->\n<div class=\"ag-click-overlay\" *ngIf=\"isRecording && !isMinimized\"></div>\n\n<!-- 高亮框 -->\n<div class=\"ag-highlight\" *ngIf=\"isRecording && !isMinimized && hoveredNode\" [ngStyle]=\"highlightStyle\"></div>\n\n<!-- Tooltip -->\n<div class=\"ag-tooltip\" *ngIf=\"showTooltip && !isMinimized\" [ngStyle]=\"tooltipStyle\">\n {{ tooltipContent }}\n</div>\n\n<!-- 祖先麵包屑導航 -->\n<div class=\"ag-breadcrumb\" *ngIf=\"showBreadcrumb && !isMinimized && ancestorBreadcrumbs.length > 1\"\n [ngStyle]=\"breadcrumbStyle\">\n <span class=\"ag-breadcrumb-hint\">層級:</span>\n <ng-container *ngFor=\"let crumb of ancestorBreadcrumbs; let i = index; let last = last\">\n <button class=\"ag-breadcrumb-item\" [class.ag-breadcrumb-active]=\"i === selectedBreadcrumbIndex\"\n [class.ag-breadcrumb-component]=\"crumb.isComponent\" (click)=\"onBreadcrumbClick(crumb, i, $event)\"\n (dblclick)=\"onBreadcrumbDoubleClick(crumb, $event)\" [title]=\"'單擊切換 / 再次單擊確認: ' + crumb.label\">\n {{ crumb.label }}\n </button>\n <span class=\"ag-breadcrumb-separator\" *ngIf=\"!last\">›</span>\n </ng-container>\n <button class=\"ag-breadcrumb-close\" (click)=\"unlock()\" title=\"取消鎖定\">✕</button>\n</div>\n\n\n<!-- 標記編號氣泡 -->\n<div *ngFor=\"let marker of markers\" class=\"ag-marker-bubble\" [ngStyle]=\"getMarkerStyle(marker)\"\n (click)=\"onMarkerClick(marker, $event)\" title=\"點擊編輯\">\n {{ marker.index }}\n</div>\n\n<!-- 錄製狀態提示 -->\n<div class=\"ag-recording-hint\" *ngIf=\"isRecording && !isMinimized\">\n <div class=\"ag-hint-content\">\n <span class=\"ag-hint-icon\">🔴</span>\n <span class=\"ag-hint-text\">Click to lock • Click again to mark • Use breadcrumb to select parent • <kbd>Esc</kbd> to\n stop</span>\n </div>\n</div>\n\n<!-- 內嵌編輯器 -->\n<ag-inline-editor *ngIf=\"editingMarker && !isMinimized\" [marker]=\"editingMarker\" [position]=\"editorPosition\"\n (save)=\"onEditorSave($event)\" (delete)=\"onEditorDelete($event)\" (cancel)=\"onEditorCancel()\"></ag-inline-editor>","import { Injectable } from '@angular/core';\n\n/**\n * DataSanitizerService\n *\n * 資料清洗服務:將組件資料轉換為 AI 友好的格式\n *\n * 清洗規則:\n * 1. 移除 Angular 內部屬性 (__ngContext__, ɵcmp 等)\n * 2. 將 Function 類型轉為描述字串\n * 3. 過濾 Observable/Subject(只保留類型名稱)\n * 4. 過濾大型資料(Base64 > 1KB)\n * 5. 避免循環引用\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class DataSanitizerService {\n /** Angular 內部屬性前綴 */\n private readonly INTERNAL_PREFIXES = ['__', 'ɵ', 'ng'];\n\n /** 最大字串長度 */\n private readonly MAX_STRING_LENGTH = 1024;\n\n /** 最大陣列長度 */\n private readonly MAX_ARRAY_LENGTH = 20;\n\n /** 最大物件深度 */\n private readonly MAX_DEPTH = 3;\n\n /**\n * 清洗單一值\n */\n sanitize(value: unknown, depth = 0): unknown {\n // 深度限制\n if (depth > this.MAX_DEPTH) {\n return '[MaxDepthReached]';\n }\n\n // 處理 null/undefined\n if (value === null) return null;\n if (value === undefined) return undefined;\n\n // 處理原始類型\n if (typeof value === 'boolean' || typeof value === 'number') {\n return value;\n }\n\n // 處理字串\n if (typeof value === 'string') {\n return this.sanitizeString(value);\n }\n\n // 處理函數\n if (typeof value === 'function') {\n return this.sanitizeFunction(value);\n }\n\n // 處理 Symbol\n if (typeof value === 'symbol') {\n return `[Symbol: ${value.description ?? 'unknown'}]`;\n }\n\n // 處理 BigInt\n if (typeof value === 'bigint') {\n return value.toString();\n }\n\n // 處理陣列\n if (Array.isArray(value)) {\n return this.sanitizeArray(value, depth);\n }\n\n // 處理物件\n if (typeof value === 'object') {\n return this.sanitizeObject(value as object, depth);\n }\n\n return String(value);\n }\n\n /**\n * 清洗字串\n */\n private sanitizeString(value: string): string {\n // 檢測 Base64 圖片\n if (value.startsWith('data:image/')) {\n return '[Base64Image]';\n }\n\n // 檢測過長字串\n if (value.length > this.MAX_STRING_LENGTH) {\n return `[String: ${value.length} chars, truncated: \"${value.substring(0, 100)}...\"]`;\n }\n\n return value;\n }\n\n /**\n * 清洗函數\n */\n private sanitizeFunction(fn: Function): string {\n const name = fn.name || 'anonymous';\n\n // 嘗試取得函數簽名\n const fnString = fn.toString();\n const argsMatch = fnString.match(/\\(([^)]*)\\)/);\n const args = argsMatch ? argsMatch[1] : '';\n\n return `[Function: ${name}(${args})]`;\n }\n\n /**\n * 清洗陣列\n */\n private sanitizeArray(arr: unknown[], depth: number): unknown {\n if (arr.length === 0) {\n return [];\n }\n\n if (arr.length > this.MAX_ARRAY_LENGTH) {\n const sample = arr.slice(0, 5).map((item) => this.sanitize(item, depth + 1));\n return {\n __type: 'TruncatedArray',\n length: arr.length,\n sample,\n };\n }\n\n return arr.map((item) => this.sanitize(item, depth + 1));\n }\n\n /**\n * 清洗物件\n */\n private sanitizeObject(obj: object, depth: number): unknown {\n // 處理特殊物件類型\n if (this.isObservable(obj)) {\n return '[Observable]';\n }\n\n if (this.isSubject(obj)) {\n return '[Subject]';\n }\n\n if (this.isPromise(obj)) {\n return '[Promise]';\n }\n\n if (obj instanceof Date) {\n return obj.toISOString();\n }\n\n if (obj instanceof RegExp) {\n return obj.toString();\n }\n\n if (obj instanceof Error) {\n return `[Error: ${obj.message}]`;\n }\n\n if (obj instanceof HTMLElement) {\n return `[HTMLElement: <${obj.tagName.toLowerCase()}>]`;\n }\n\n if (obj instanceof Event) {\n return `[Event: ${obj.type}]`;\n }\n\n // 處理一般物件\n const result: Record<string, unknown> = {};\n const keys = Object.keys(obj);\n\n for (const key of keys) {\n // 跳過內部屬性\n if (this.isInternalProperty(key)) {\n continue;\n }\n\n try {\n const value = (obj as Record<string, unknown>)[key];\n result[key] = this.sanitize(value, depth + 1);\n } catch {\n result[key] = '[AccessDenied]';\n }\n }\n\n // 如果物件為空,返回類型名稱\n if (Object.keys(result).length === 0) {\n return `[Object: ${obj.constructor.name}]`;\n }\n\n return result;\n }\n\n /**\n * 檢查是否為內部屬性\n */\n private isInternalProperty(key: string): boolean {\n return this.INTERNAL_PREFIXES.some((prefix) => key.startsWith(prefix));\n }\n\n /**\n * 檢查是否為 RxJS Observable\n */\n private isObservable(obj: unknown): boolean {\n return (\n obj !== null &&\n typeof obj === 'object' &&\n typeof (obj as { subscribe?: unknown }).subscribe === 'function' &&\n !this.isSubject(obj)\n );\n }\n\n /**\n * 檢查是否為 RxJS Subject\n */\n private isSubject(obj: unknown): boolean {\n return (\n obj !== null &&\n typeof obj === 'object' &&\n typeof (obj as { next?: unknown }).next === 'function' &&\n typeof (obj as { subscribe?: unknown }).subscribe === 'function'\n );\n }\n\n /**\n * 檢查是否為 Promise\n */\n private isPromise(obj: unknown): boolean {\n return (\n obj !== null &&\n typeof obj === 'object' &&\n typeof (obj as { then?: unknown }).then === 'function'\n );\n }\n\n /**\n * 批量清洗 Record\n */\n sanitizeRecord(record: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(record)) {\n if (!this.isInternalProperty(key)) {\n result[key] = this.sanitize(value);\n }\n }\n\n return result;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { ComponentNode, UserAnnotation, OutputDetail } from '../models/component-node.interface';\nimport { DataSanitizerService } from './data-sanitizer.service';\n\n/**\n * PromptGeneratorService\n *\n * 提示生成服務:根據 OutputDetail 模式生成不同詳細程度的輸出\n *\n * Modes:\n * - compact: 最簡潔,只有元素類型和 feedback\n * - standard: 標準,包含 DOM Path、Position、基本 Styles\n * - detailed: 詳細,包含所有屬性和上下文\n * - forensic: 完整,包含所有可用資訊(舊版相容)\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class PromptGeneratorService {\n constructor(private dataSanitizer: DataSanitizerService) { }\n\n /**\n * 生成 Page Feedback 輸出(多標記)\n */\n generatePageFeedback(\n markers: Array<{ target: ComponentNode; intent: string }>,\n options: {\n outputDetail: OutputDetail;\n pageUrl?: string;\n viewport?: { width: number; height: number };\n userAgent?: string;\n timestamp?: number;\n }\n ): string {\n const lines: string[] = [];\n\n // 環境資訊(standard 及以上)\n if (options.outputDetail !== 'compact') {\n lines.push(`## Page Feedback: ${this.getPathFromUrl(options.pageUrl)}`);\n lines.push('');\n lines.push('**Environment:**');\n\n if (options.viewport) {\n lines.push(`- Viewport: ${options.viewport.width}×${options.viewport.height}`);\n }\n if (options.pageUrl) {\n lines.push(`- URL: ${options.pageUrl}`);\n }\n if (options.userAgent && options.outputDetail !== 'standard') {\n lines.push(`- User Agent: ${options.userAgent}`);\n }\n if (options.timestamp) {\n lines.push(`- Timestamp: ${new Date(options.timestamp).toISOString()}`);\n }\n lines.push('');\n lines.push('---');\n lines.push('');\n } else {\n lines.push(`## Page Feedback`);\n lines.push('');\n }\n\n // 各個標記\n markers.forEach((marker, index) => {\n const markerOutput = this.generateMarkerOutput(\n marker.target,\n marker.intent,\n index + 1,\n options.outputDetail\n );\n lines.push(markerOutput);\n lines.push('');\n });\n\n return lines.join('\\n');\n }\n\n /**\n * 生成單個標記的輸出\n */\n generateMarkerOutput(\n node: ComponentNode,\n intent: string,\n index: number,\n outputDetail: OutputDetail\n ): string {\n switch (outputDetail) {\n case 'compact':\n return this.generateCompact(node, intent, index);\n case 'standard':\n return this.generateStandard(node, intent, index);\n case 'detailed':\n return this.generateDetailed(node, intent, index);\n case 'forensic':\n default:\n return this.generateForensic(node, intent, index);\n }\n }\n\n /**\n * Compact 模式:最簡潔\n */\n private generateCompact(node: ComponentNode, intent: string, index: number): string {\n const elementType = this.getElementType(node);\n const lines = [\n `### ${index}. ${elementType}`,\n ];\n\n if (node.selector) {\n lines.push(`**Selector:** \\`<${node.selector}>\\``);\n }\n\n if (intent) {\n lines.push(`**Feedback:** ${intent}`);\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Standard 模式:標準\n */\n private generateStandard(node: ComponentNode, intent: string, index: number): string {\n const elementType = this.getElementType(node);\n const lines = [\n `### ${index}. ${elementType}`,\n `**Full DOM Path:** ${this.formatDomPath(node.domPath)}`,\n ];\n\n // CSS Classes\n const cssClasses = this.extractCssClasses(node);\n if (cssClasses.length > 0) {\n lines.push(`**CSS Classes:** ${cssClasses.join(', ')}`);\n }\n\n // Position\n lines.push(`**Position:** x:${Math.round(node.rect.x)}, y:${Math.round(node.rect.y)} (${Math.round(node.rect.width)}×${Math.round(node.rect.height)}px)`);\n\n // 基本 Styles(只顯示重要的)\n const keyStyles = this.extractKeyStyles(node.computedStyles);\n if (keyStyles) {\n lines.push(`**Computed Styles:** ${keyStyles}`);\n }\n\n if (intent) {\n lines.push(`**Feedback:** ${intent}`);\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Detailed 模式:詳細\n */\n private generateDetailed(node: ComponentNode, intent: string, index: number): string {\n const elementType = this.getElementType(node);\n const lines = [\n `### ${index}. ${elementType}`,\n `**Full DOM Path:** ${this.formatDomPath(node.domPath)}`,\n ];\n\n // CSS Classes\n const cssClasses = this.extractCssClasses(node);\n if (cssClasses.length > 0) {\n lines.push(`**CSS Classes:** ${cssClasses.join(', ')}`);\n }\n\n // Position\n lines.push(`**Position:** x:${Math.round(node.rect.x)}, y:${Math.round(node.rect.y)} (${Math.round(node.rect.width)}×${Math.round(node.rect.height)}px)`);\n\n // Annotation position\n const annotationX = ((node.rect.x + node.rect.width / 2) / window.innerWidth * 100).toFixed(1);\n const annotationY = Math.round(node.rect.y + node.rect.height / 2);\n lines.push(`**Annotation at:** ${annotationX}% from left, ${annotationY}px from top`);\n\n // Context (text content)\n const textContent = this.getTextContent(node);\n if (textContent) {\n lines.push(`**Context:** ${textContent}`);\n }\n\n // Computed Styles\n const allStyles = this.formatAllStyles(node.computedStyles);\n if (allStyles) {\n lines.push(`**Computed Styles:** ${allStyles}`);\n }\n\n // Accessibility\n const accessibility = this.getAccessibility(node);\n if (accessibility) {\n lines.push(`**Accessibility:** ${accessibility}`);\n }\n\n // Nearby Elements\n const nearbyElements = this.getNearbyElements(node);\n if (nearbyElements) {\n lines.push(`**Nearby Elements:** ${nearbyElements}`);\n }\n\n if (intent) {\n lines.push(`**Feedback:** ${intent}`);\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Forensic 模式:完整(舊版相容格式)\n */\n private generateForensic(node: ComponentNode, intent: string, index: number): string {\n const elementType = this.getElementType(node);\n const lines = [\n `### ${index}. ${elementType}`,\n `**Full DOM Path:** ${this.formatDomPath(node.domPath)}`,\n ];\n\n // CSS Classes\n const cssClasses = this.extractCssClasses(node);\n if (cssClasses.length > 0) {\n lines.push(`**CSS Classes:** ${cssClasses.join(', ')}`);\n }\n\n // Position\n lines.push(`**Position:** x:${Math.round(node.rect.x)}, y:${Math.round(node.rect.y)} (${Math.round(node.rect.width)}×${Math.round(node.rect.height)}px)`);\n\n // Annotation position\n const annotationX = ((node.rect.x + node.rect.width / 2) / window.innerWidth * 100).toFixed(1);\n const annotationY = Math.round(node.rect.y + node.rect.height / 2);\n lines.push(`**Annotation at:** ${annotationX}% from left, ${annotationY}px from top`);\n\n // Selected text / Context\n const textContent = this.getTextContent(node);\n if (textContent) {\n if (textContent.length > 100) {\n lines.push(`**Selected text:** \"${textContent}\"`);\n } else {\n lines.push(`**Context:** ${textContent}`);\n }\n }\n\n // Full Computed Styles\n const allStyles = this.formatAllStyles(node.computedStyles);\n if (allStyles) {\n lines.push(`**Computed Styles:** ${allStyles}`);\n }\n\n // Accessibility\n const accessibility = this.getAccessibility(node);\n if (accessibility) {\n lines.push(`**Accessibility:** ${accessibility}`);\n }\n\n // Nearby Elements\n const nearbyElements = this.getNearbyElements(node);\n if (nearbyElements) {\n lines.push(`**Nearby Elements:** ${nearbyElements}`);\n }\n\n if (intent) {\n lines.push(`**Feedback:** ${intent}`);\n }\n\n return lines.join('\\n');\n }\n\n // ==================== 輔助方法 ====================\n\n /**\n * 生成完整的 AI Prompt(舊版兼容)\n */\n generatePrompt(annotation: UserAnnotation): string {\n return this.generateForensic(annotation.target, annotation.intent, 1);\n }\n\n /**\n * 僅生成組件資訊(舊版兼容)\n */\n generateComponentInfo(node: ComponentNode): string {\n return this.generateForensic(node, '', 1);\n }\n\n private getPathFromUrl(url?: string): string {\n if (!url) return '/';\n try {\n const urlObj = new URL(url);\n return urlObj.pathname || '/';\n } catch {\n return '/';\n }\n }\n\n private getElementType(node: ComponentNode): string {\n // 嘗試從 DOM 元素獲取更詳細的類型描述\n const tag = node.domElement.tagName.toLowerCase();\n const role = node.domElement.getAttribute('role');\n const ariaLabel = node.domElement.getAttribute('aria-label');\n const textContent = node.domElement.textContent?.trim().substring(0, 30);\n\n if (node.displayName && node.displayName !== tag) {\n // Angular 組件\n return `${node.displayName}`;\n }\n\n if (role) {\n return `${role}: \"${textContent || tag}\"`;\n }\n\n if (tag === 'button') {\n return `button \"${textContent || '(no text)'}\"`;\n }\n\n if (tag === 'a') {\n return `link \"${textContent || ariaLabel || '(no text)'}\"`;\n }\n\n if (tag === 'input') {\n const type = node.domElement.getAttribute('type') || 'text';\n return `input[${type}]`;\n }\n\n if (tag === 'p') {\n return `paragraph: \"${textContent ? textContent.substring(0, 40) + '...' : ''}\"`;\n }\n\n if (tag === 'section' || tag === 'div') {\n const className = node.domElement.className;\n if (className && typeof className === 'string') {\n const mainClass = className.split(' ')[0];\n return `${tag}.${mainClass}`;\n }\n }\n\n return node.selector ? `<${node.selector}>` : tag;\n }\n\n private formatDomPath(domPath: string): string {\n return domPath;\n }\n\n private extractCssClasses(node: ComponentNode): string[] {\n const className = node.domElement.className;\n if (!className || typeof className !== 'string') return [];\n return className.split(' ').filter(c => c.trim());\n }\n\n private extractKeyStyles(styles: Record<string, string>): string {\n const keyProps = ['color', 'background-color', 'font-size', 'font-weight', 'display', 'position'];\n const parts: string[] = [];\n\n for (const prop of keyProps) {\n if (styles[prop] && styles[prop] !== 'none' && styles[prop] !== 'normal') {\n parts.push(`${prop}: ${styles[prop]}`);\n }\n }\n\n return parts.join('; ');\n }\n\n private formatAllStyles(styles: Record<string, string>): string {\n const parts: string[] = [];\n\n for (const [prop, value] of Object.entries(styles)) {\n if (value && value !== 'none' && value !== 'normal' && value !== 'auto') {\n parts.push(`${prop}: ${value}`);\n }\n }\n\n return parts.join('; ');\n }\n\n private getTextContent(node: ComponentNode): string {\n const text = node.domElement.textContent?.trim() || '';\n if (text.length > 200) {\n return text.substring(0, 200) + '...';\n }\n return text;\n }\n\n private getAccessibility(node: ComponentNode): string {\n const parts: string[] = [];\n\n if (node.domElement.getAttribute('tabindex') !== null) {\n parts.push('focusable');\n }\n\n const ariaLabel = node.domElement.getAttribute('aria-label');\n if (ariaLabel) {\n parts.push(`aria-label: \"${ariaLabel}\"`);\n }\n\n const role = node.domElement.getAttribute('role');\n if (role) {\n parts.push(`role: ${role}`);\n }\n\n return parts.join(', ');\n }\n\n private getNearbyElements(node: ComponentNode): string {\n const parent = node.domElement.parentElement;\n if (!parent) return '';\n\n const siblings = Array.from(parent.children);\n const nearby: string[] = [];\n\n siblings.forEach((sibling) => {\n if (sibling !== node.domElement) {\n const tag = sibling.tagName.toLowerCase();\n const className = sibling.className;\n const text = sibling.textContent?.trim().substring(0, 20);\n const classStr = className && typeof className === 'string' ? `.${className.split(' ')[0]}` : '';\n nearby.push(`${tag}${classStr}${text ? ` \"${text}\"` : ''}`);\n }\n });\n\n if (nearby.length > 5) {\n return nearby.slice(0, 3).join(', ') + ` (${siblings.length} total in .${parent.className?.split(' ')[0] || 'parent'})`;\n }\n\n return nearby.join(', ');\n }\n\n private escapeMarkdown(text: string): string {\n return text\n .replace(/\\|/g, '\\\\|')\n .replace(/`/g, '\\\\`')\n .replace(/\\*/g, '\\\\*')\n .replace(/\\n/g, ' ');\n }\n}\n","import { Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { BehaviorSubject, Observable, timer, of, firstValueFrom } from 'rxjs';\nimport { catchError, switchMap } from 'rxjs/operators';\nimport { v4 as uuidv4 } from 'uuid';\nimport { UserAnnotation } from '../models/component-node.interface';\n\nexport interface McpStatus {\n connected: boolean;\n sessionId?: string;\n lastError?: string;\n}\n\nexport interface McpAnnotation extends UserAnnotation {\n id: string; // Server assignment or client generated\n sessionId: string;\n url: string;\n status: 'pending' | 'acknowledged' | 'resolved' | 'dismissed';\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class McpService {\n private readonly API_URL = 'http://localhost:4747';\n private _status = new BehaviorSubject<McpStatus>({ connected: false });\n public status$ = this._status.asObservable();\n\n // Store annotations state locally for UI updates\n private _annotations = new BehaviorSubject<McpAnnotation[]>([]);\n public annotations$ = this._annotations.asObservable();\n\n constructor(private http: HttpClient) {\n // Attempt initial connection\n this.checkConnection();\n }\n\n /**\n * Check if the MCP server is reachable\n */\n async checkConnection(): Promise<boolean> {\n try {\n await firstValueFrom(this.http.get(`${this.API_URL}/status`));\n this.updateStatus({ connected: true, lastError: undefined });\n return true;\n } catch (error) {\n this.updateStatus({ connected: false, lastError: 'Could not connect to MCP server' });\n return false;\n }\n }\n\n /**\n * Establish a new session or restore existing one\n */\n async connect(existingSessionId?: string): Promise<string> {\n if (!await this.checkConnection()) {\n throw new Error('MCP Server not reachable');\n }\n\n const sessionId = existingSessionId || uuidv4();\n\n // Register session - simulating for now, or real call if API exists\n // In real agentation-mcp, we heavily rely on the POST /session or implicit creation\n // For now we assume we just start using a session ID.\n\n this.updateStatus({ connected: true, sessionId });\n this.startPolling(sessionId);\n return sessionId;\n }\n\n /**\n * Send an annotation to the MCP server\n */\n async sendAnnotation(annotation: UserAnnotation): Promise<void> {\n const currentStatus = this._status.value;\n if (!currentStatus.connected || !currentStatus.sessionId) {\n throw new Error('Not connected to MCP server');\n }\n\n const mcpAnnotation: McpAnnotation = {\n ...annotation,\n id: uuidv4(),\n sessionId: currentStatus.sessionId,\n url: window.location.href,\n status: 'pending'\n };\n\n try {\n await firstValueFrom(this.http.post(`${this.API_URL}/annotations`, mcpAnnotation));\n\n // Optimistic update\n const currentList = this._annotations.value;\n this._annotations.next([...currentList, mcpAnnotation]);\n } catch (error) {\n console.error('Failed to send annotation', error);\n throw error;\n }\n }\n\n /**\n * Poll for updates (e.g., resolve/dismiss status from agent)\n */\n private startPolling(sessionId: string) {\n // Simple polling every 2 seconds\n timer(0, 2000).pipe(\n switchMap(() => this.http.get<McpAnnotation[]>(`${this.API_URL}/sessions/${sessionId}/annotations`).pipe(\n catchError(() => of([])) // Handle errors silently in polling\n ))\n ).subscribe(annotations => {\n if (annotations && annotations.length > 0) {\n this._annotations.next(annotations);\n }\n });\n }\n\n private updateStatus(newStatus: Partial<McpStatus>) {\n this._status.next({ ...this._status.value, ...newStatus });\n }\n}\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { ComponentNode, UserAnnotation } from '../../models/component-node.interface';\nimport { PromptGeneratorService } from '../../services/prompt-generator.service';\n\n/**\n * AnnotationPanelComponent\n *\n * 標註面板:顯示選中組件的詳細資訊,並提供使用者輸入意圖的介面\n */\nimport { McpService, McpStatus } from '../../services/mcp.service';\nimport { Observable } from 'rxjs';\n\n@Component({\n selector: 'ag-annotation-panel',\n standalone: false,\n templateUrl: './annotation-panel.component.html',\n styleUrls: ['./annotation-panel.component.scss'],\n})\nexport class AnnotationPanelComponent {\n /** 選中的組件節點 */\n @Input() selectedNode: ComponentNode | null = null;\n\n /** 面板關閉時觸發 */\n @Output() closed = new EventEmitter<void>();\n\n /** 使用者輸入的意圖 */\n userIntent = '';\n\n /** 是否已複製到剪貼板 */\n copied = false;\n\n /** 是否已發送到 MCP */\n sent = false;\n\n /** 展開的區塊 */\n expandedSections: Record<'inputs' | 'outputs' | 'properties' | 'styles', boolean> = {\n inputs: true,\n outputs: true,\n properties: false,\n styles: false,\n };\n\n mcpStatus$: Observable<McpStatus>;\n\n constructor(\n private promptGenerator: PromptGeneratorService,\n private mcpService: McpService\n ) {\n this.mcpStatus$ = this.mcpService.status$;\n }\n\n /**\n * 發送標註給 Agent (MCP)\n */\n async sendToAgent(): Promise<void> {\n if (!this.selectedNode) return;\n\n const annotation: UserAnnotation = {\n target: this.selectedNode,\n intent: this.userIntent || '(No specific intent provided)',\n timestamp: Date.now(),\n };\n\n try {\n await this.mcpService.sendAnnotation(annotation);\n this.sent = true;\n setTimeout(() => (this.sent = false), 2000);\n } catch (err) {\n console.error('[ng-directive-zero] Failed to send annotation:', err);\n // TODO: Error feedback to user\n }\n }\n\n /**\n * 複製 Markdown 到剪貼板\n */\n async copyToClipboard(): Promise<void> {\n if (!this.selectedNode) return;\n\n const annotation: UserAnnotation = {\n target: this.selectedNode,\n intent: this.userIntent || '(No specific intent provided)',\n timestamp: Date.now(),\n };\n\n const markdown = this.promptGenerator.generatePrompt(annotation);\n\n try {\n await navigator.clipboard.writeText(markdown);\n this.copied = true;\n setTimeout(() => (this.copied = false), 2000);\n } catch (err) {\n console.error('[ng-directive-zero] Failed to copy:', err);\n // Fallback\n this.fallbackCopy(markdown);\n }\n }\n\n /**\n * 僅複製組件資訊(不含使用者意圖)\n */\n async copyComponentInfo(): Promise<void> {\n if (!this.selectedNode) return;\n\n const markdown = this.promptGenerator.generateComponentInfo(this.selectedNode);\n\n try {\n await navigator.clipboard.writeText(markdown);\n this.copied = true;\n setTimeout(() => (this.copied = false), 2000);\n } catch (err) {\n console.error('[ng-directive-zero] Failed to copy:', err);\n this.fallbackCopy(markdown);\n }\n }\n\n /**\n * 清除選擇\n */\n clearSelection(): void {\n this.selectedNode = null;\n this.userIntent = '';\n this.closed.emit();\n }\n\n /**\n * 切換區塊展開狀態\n */\n toggleSection(section: 'inputs' | 'outputs' | 'properties' | 'styles'): void {\n this.expandedSections[section] = !this.expandedSections[section];\n }\n\n /**\n * 獲取 Input 的條目\n */\n getInputEntries(): Array<{ key: string; value: unknown }> {\n if (!this.selectedNode) return [];\n return Object.entries(this.selectedNode.inputs).map(([key, value]) => ({\n key,\n value,\n }));\n }\n\n /**\n * 獲取公開屬性條目\n */\n getPropertyEntries(): Array<{ key: string; value: unknown }> {\n if (!this.selectedNode) return [];\n return Object.entries(this.selectedNode.publicProperties).map(([key, value]) => ({\n key,\n value,\n }));\n }\n\n /**\n * 獲取樣式條目\n */\n getStyleEntries(): Array<{ key: string; value: string }> {\n if (!this.selectedNode) return [];\n return Object.entries(this.selectedNode.computedStyles)\n .filter(([, value]) => value && value !== 'none' && value !== 'normal')\n .map(([key, value]) => ({ key, value }));\n }\n\n /**\n * 格式化值為顯示字串\n */\n formatValue(value: unknown): string {\n if (value === null) return 'null';\n if (value === undefined) return 'undefined';\n if (typeof value === 'string') return `\"${value}\"`;\n if (typeof value === 'object') return JSON.stringify(value);\n return String(value);\n }\n\n /**\n * 獲取值的類型顏色\n */\n getValueColor(value: unknown): string {\n if (value === null || value === undefined) return '#808080';\n if (typeof value === 'string') return '#98c379';\n if (typeof value === 'number') return '#d19a66';\n if (typeof value === 'boolean') return '#56b6c2';\n return '#abb2bf';\n }\n\n /**\n * Fallback 複製方式\n */\n private fallbackCopy(text: string): void {\n const textarea = document.createElement('textarea');\n textarea.value = text;\n textarea.style.position = 'fixed';\n textarea.style.opacity = '0';\n document.body.appendChild(textarea);\n textarea.select();\n document.execCommand('copy');\n document.body.removeChild(textarea);\n this.copied = true;\n setTimeout(() => (this.copied = false), 2000);\n }\n}\n","<div class=\"ag-panel\" *ngIf=\"selectedNode\">\n <!-- 標題列 -->\n <header class=\"ag-panel-header\">\n <div class=\"ag-panel-title\">\n <span class=\"ag-component-icon\">📦</span>\n <span class=\"ag-component-name\">{{ selectedNode.displayName }}</span>\n </div>\n <button class=\"ag-close-button\" (click)=\"clearSelection()\" title=\"Close (Esc)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M18 6L6 18M6 6l12 12\"/>\n </svg>\n </button>\n </header>\n\n <!-- 組件基本資訊 -->\n <section class=\"ag-section ag-info-section\">\n <div class=\"ag-info-row\">\n <span class=\"ag-info-label\">Selector</span>\n <code class=\"ag-info-value\"><{{ selectedNode.selector }}></code>\n </div>\n <div class=\"ag-info-row\" *ngIf=\"selectedNode.parent\">\n <span class=\"ag-info-label\">Parent</span>\n <code class=\"ag-info-value\">{{ selectedNode.parent.displayName }}</code>\n </div>\n <div class=\"ag-info-row\" *ngIf=\"selectedNode.directives.length > 0\">\n <span class=\"ag-info-label\">Directives</span>\n <div class=\"ag-directive-list\">\n <span class=\"ag-directive-tag\" *ngFor=\"let dir of selectedNode.directives\">{{ dir }}</span>\n </div>\n </div>\n </section>\n\n <!-- @Input 綁定 -->\n <section class=\"ag-section\">\n <header class=\"ag-section-header\" (click)=\"toggleSection('inputs')\">\n <span class=\"ag-section-icon\">{{ expandedSections.inputs ? '▼' : '▶' }}</span>\n <span class=\"ag-section-title\">@Input Bindings</span>\n <span class=\"ag-section-count\">{{ getInputEntries().length }}</span>\n </header>\n <div class=\"ag-section-content\" *ngIf=\"expandedSections.inputs && getInputEntries().length > 0\">\n <div class=\"ag-prop-row\" *ngFor=\"let entry of getInputEntries()\">\n <span class=\"ag-prop-name\">{{ entry.key }}</span>\n <span class=\"ag-prop-value\" [style.color]=\"getValueColor(entry.value)\">\n {{ formatValue(entry.value) }}\n </span>\n </div>\n </div>\n <div class=\"ag-section-empty\" *ngIf=\"expandedSections.inputs && getInputEntries().length === 0\">\n No @Input bindings\n </div>\n </section>\n\n <!-- @Output 事件 -->\n <section class=\"ag-section\" *ngIf=\"selectedNode.outputs.length > 0\">\n <header class=\"ag-section-header\" (click)=\"toggleSection('outputs')\">\n <span class=\"ag-section-icon\">{{ expandedSections.outputs ? '▼' : '▶' }}</span>\n <span class=\"ag-section-title\">@Output Events</span>\n <span class=\"ag-section-count\">{{ selectedNode.outputs.length }}</span>\n </header>\n <div class=\"ag-section-content\" *ngIf=\"expandedSections.outputs\">\n <div class=\"ag-output-row\" *ngFor=\"let output of selectedNode.outputs\">\n <span class=\"ag-output-name\">{{ output }}</span>\n <span class=\"ag-output-type\">EventEmitter</span>\n </div>\n </div>\n </section>\n\n <!-- 公開屬性 -->\n <section class=\"ag-section\" *ngIf=\"getPropertyEntries().length > 0\">\n <header class=\"ag-section-header\" (click)=\"toggleSection('properties')\">\n <span class=\"ag-section-icon\">{{ expandedSections.properties ? '▼' : '▶' }}</span>\n <span class=\"ag-section-title\">Public Properties</span>\n <span class=\"ag-section-count\">{{ getPropertyEntries().length }}</span>\n </header>\n <div class=\"ag-section-content\" *ngIf=\"expandedSections.properties\">\n <div class=\"ag-prop-row\" *ngFor=\"let entry of getPropertyEntries()\">\n <span class=\"ag-prop-name\">{{ entry.key }}</span>\n <span class=\"ag-prop-value\" [style.color]=\"getValueColor(entry.value)\">\n {{ formatValue(entry.value) }}\n </span>\n </div>\n </div>\n </section>\n\n <!-- Computed Styles -->\n <section class=\"ag-section\">\n <header class=\"ag-section-header\" (click)=\"toggleSection('styles')\">\n <span class=\"ag-section-icon\">{{ expandedSections.styles ? '▼' : '▶' }}</span>\n <span class=\"ag-section-title\">Computed Styles</span>\n <span class=\"ag-section-count\">{{ getStyleEntries().length }}</span>\n </header>\n <div class=\"ag-section-content\" *ngIf=\"expandedSections.styles\">\n <div class=\"ag-style-row\" *ngFor=\"let entry of getStyleEntries()\">\n <span class=\"ag-style-name\">{{ entry.key }}</span>\n <span class=\"ag-style-value\">{{ entry.value }}</span>\n </div>\n </div>\n </section>\n\n <!-- 使用者意圖輸入 -->\n <section class=\"ag-section ag-intent-section\">\n <label class=\"ag-intent-label\" for=\"userIntent\">\n 💬 Your Instruction for AI\n </label>\n <textarea\n id=\"userIntent\"\n class=\"ag-intent-input\"\n [(ngModel)]=\"userIntent\"\n placeholder=\"e.g., 'This button should be disabled when loading'\"\n rows=\"3\"\n ></textarea>\n </section>\n\n <!-- 操作按鈕 -->\n <footer class=\"ag-panel-footer\">\n <!-- MCP Send Button -->\n <button\n *ngIf=\"(mcpStatus$ | async)?.connected\"\n class=\"ag-button ag-button-primary ag-mcp-button\"\n (click)=\"sendToAgent()\"\n [class.ag-button-success]=\"sent\"\n >\n <span *ngIf=\"!sent\">🤖 Send to Agent</span>\n <span *ngIf=\"sent\">✅ Sent!</span>\n </button>\n\n <button\n class=\"ag-button ag-button-primary\"\n (click)=\"copyToClipboard()\"\n [class.ag-button-success]=\"copied\"\n >\n <span *ngIf=\"!copied\">📋 Copy with Intent</span>\n <span *ngIf=\"copied\">✅ Copied!</span>\n </button>\n <button\n class=\"ag-button ag-button-secondary\"\n (click)=\"copyComponentInfo()\"\n >\n 📄 Copy Info Only\n </button>\n </footer>\n</div>\n","import { Component, EventEmitter, Input, Output, HostBinding } from '@angular/core';\nimport {\n ToolbarState,\n RecordingSession,\n AgentationSettings,\n DEFAULT_SETTINGS,\n} from '../../models/component-node.interface';\n\n/**\n * ToolbarComponent\n *\n * 浮動工具列:提供錄製控制、檢視、複製、設定等功能\n */\n@Component({\n selector: 'ag-toolbar',\n standalone: false,\n templateUrl: './toolbar.component.html',\n styleUrls: ['./toolbar.component.scss'],\n})\nexport class ToolbarComponent {\n /** 當前錄製會話 */\n @Input() session: RecordingSession | null = null;\n\n /** 當前設定 */\n @Input() settings: AgentationSettings = DEFAULT_SETTINGS;\n\n /** 綁定 dark mode class 到 host */\n @HostBinding('class.ag-dark-mode')\n get isDarkMode(): boolean {\n return this.settings.isDarkMode;\n }\n\n /** 工具列狀態 */\n @Input() state: ToolbarState = {\n showSettings: false,\n showMarkers: false,\n isRecording: false,\n isMinimized: false,\n };\n\n /** 開始錄製 */\n @Output() startRecording = new EventEmitter<void>();\n\n /** 結束錄製 */\n @Output() stopRecording = new EventEmitter<void>();\n\n /** 切換檢視標記列表 */\n @Output() toggleMarkers = new EventEmitter<void>();\n\n /** 複製到剪貼簿 */\n @Output() copyToClipboard = new EventEmitter<void>();\n\n /** 清除所有標記 */\n @Output() clearMarkers = new EventEmitter<void>();\n\n /** 切換設定面板 */\n @Output() toggleSettings = new EventEmitter<void>();\n\n /** 關閉工具 */\n @Output() closeToolbar = new EventEmitter<void>();\n\n /** 切換最小化狀態 */\n @Output() toggleMinimize = new EventEmitter<void>();\n\n /** 設定變更 */\n @Output() settingsChange = new EventEmitter<AgentationSettings>();\n\n /** 標記數量 */\n get markerCount(): number {\n return this.session?.markers.length ?? 0;\n }\n\n /** 是否有標記 */\n get hasMarkers(): boolean {\n return this.markerCount > 0;\n }\n\n /** 切換錄製狀態 */\n onToggleRecording(): void {\n if (this.state.isRecording) {\n this.stopRecording.emit();\n } else {\n this.startRecording.emit();\n }\n }\n\n /** 處理複製 */\n onCopy(): void {\n if (this.hasMarkers) {\n this.copyToClipboard.emit();\n }\n }\n\n /** 處理清除 */\n onClear(): void {\n if (this.hasMarkers) {\n this.clearMarkers.emit();\n }\n }\n\n /** 處理設定切換 */\n onToggleSettings(): void {\n this.toggleSettings.emit();\n }\n\n /** 處理標記列表切換 */\n onToggleMarkers(): void {\n this.toggleMarkers.emit();\n }\n\n /** 處理關閉 */\n onClose(): void {\n this.closeToolbar.emit();\n }\n\n /** 處理最小化切換 */\n onToggleMinimize(): void {\n this.toggleMinimize.emit();\n }\n}\n","<div class=\"ag-toolbar\" [class.collapsed]=\"state.isMinimized\" [class.recording]=\"state.isRecording\">\n <!-- 收合狀態:顯示展開按鈕 -->\n <button\n *ngIf=\"state.isMinimized\"\n class=\"ag-toolbar-btn ag-btn-expand\"\n (click)=\"onToggleMinimize()\"\n title=\"Expand Toolbar\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <!-- 三橫線 + 菱形圖標 -->\n <line x1=\"4\" y1=\"6\" x2=\"14\" y2=\"6\"/>\n <line x1=\"4\" y1=\"12\" x2=\"14\" y2=\"12\"/>\n <line x1=\"4\" y1=\"18\" x2=\"14\" y2=\"18\"/>\n <path d=\"M17 9l3 3-3 3\" fill=\"none\"/>\n </svg>\n </button>\n\n <!-- 展開狀態:顯示完整工具列 -->\n <ng-container *ngIf=\"!state.isMinimized\">\n <!-- 標記計數徽章 -->\n <div class=\"ag-marker-badge\" *ngIf=\"hasMarkers\">\n {{ markerCount }}\n </div>\n\n <!-- 主工具列 -->\n <div class=\"ag-toolbar-buttons\">\n <!-- 錄製按鈕 -->\n <button\n class=\"ag-toolbar-btn ag-btn-record\"\n [class.active]=\"state.isRecording\"\n (click)=\"onToggleRecording()\"\n [title]=\"state.isRecording ? 'Stop Recording' : 'Start Recording'\"\n >\n <svg *ngIf=\"!state.isRecording\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M8 5v14l11-7z\"/>\n </svg>\n <svg *ngIf=\"state.isRecording\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <rect x=\"6\" y=\"6\" width=\"12\" height=\"12\" rx=\"2\"/>\n </svg>\n </button>\n\n <!-- 檢視標記 -->\n <button\n class=\"ag-toolbar-btn\"\n [class.active]=\"state.showMarkers\"\n [disabled]=\"!hasMarkers\"\n (click)=\"onToggleMarkers()\"\n title=\"View Markers\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <circle cx=\"12\" cy=\"12\" r=\"3\"/>\n <path d=\"M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7z\"/>\n </svg>\n </button>\n\n <!-- 複製 -->\n <button\n class=\"ag-toolbar-btn\"\n [disabled]=\"!hasMarkers\"\n (click)=\"onCopy()\"\n title=\"Copy to Clipboard\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"/>\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"/>\n </svg>\n </button>\n\n <!-- 清除 -->\n <button\n class=\"ag-toolbar-btn\"\n [disabled]=\"!hasMarkers\"\n (click)=\"onClear()\"\n title=\"Clear Markers\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <polyline points=\"3 6 5 6 21 6\"/>\n <path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\"/>\n </svg>\n </button>\n\n <!-- 分隔線 -->\n <div class=\"ag-toolbar-divider\"></div>\n\n <!-- 設定 -->\n <!-- <button\n class=\"ag-toolbar-btn\"\n [class.active]=\"state.showSettings\"\n (click)=\"onToggleSettings()\"\n title=\"Settings\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <circle cx=\"12\" cy=\"12\" r=\"3\"/>\n <path d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z\"/>\n </svg>\n </button> -->\n\n <!-- 收合按鈕 -->\n <button\n class=\"ag-toolbar-btn ag-btn-collapse\"\n (click)=\"onToggleMinimize()\"\n title=\"Collapse Toolbar\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <line x1=\"4\" y1=\"6\" x2=\"14\" y2=\"6\"/>\n <line x1=\"4\" y1=\"12\" x2=\"14\" y2=\"12\"/>\n <line x1=\"4\" y1=\"18\" x2=\"14\" y2=\"18\"/>\n <path d=\"M20 9l-3 3 3 3\"/>\n </svg>\n </button>\n </div>\n </ng-container>\n\n <!-- Settings Panel -->\n <!-- <ag-settings-panel\n *ngIf=\"state.showSettings\"\n [settings]=\"settings\"\n (settingsChange)=\"settingsChange.emit($event)\"\n (closed)=\"onToggleSettings()\"\n ></ag-settings-panel> -->\n</div>\n","import { Component, EventEmitter, Input, Output, HostBinding } from '@angular/core';\nimport {\n AgentationSettings,\n DEFAULT_SETTINGS,\n MarkerColor,\n MARKER_COLORS,\n OutputDetail,\n} from '../../models/component-node.interface';\nimport { McpService, McpStatus } from '../../services/mcp.service';\nimport { Observable } from 'rxjs';\n\n/**\n * SettingsPanelComponent\n *\n * 設定面板:顏色選擇、輸出詳細程度、選項開關等\n */\n@Component({\n selector: 'ag-settings-panel',\n standalone: false,\n templateUrl: './settings-panel.component.html',\n styleUrls: ['./settings-panel.component.scss'],\n})\nexport class SettingsPanelComponent {\n /** 當前設定 */\n @Input() settings: AgentationSettings = DEFAULT_SETTINGS;\n\n /** 綁定 dark mode class 到 host */\n @HostBinding('class.ag-dark-mode')\n get isDarkMode(): boolean {\n return this.settings.isDarkMode;\n }\n\n /** 面板關閉時觸發 */\n @Output() closed = new EventEmitter<void>();\n\n /** 設定變更時觸發 */\n @Output() settingsChange = new EventEmitter<AgentationSettings>();\n\n mcpStatus$: Observable<McpStatus>;\n\n constructor(private mcpService: McpService) {\n this.mcpStatus$ = this.mcpService.status$;\n }\n\n connectMcp() {\n this.mcpService.connect();\n }\n\n /** 可用顏色列表 */\n readonly colors: MarkerColor[] = ['purple', 'blue', 'cyan', 'green', 'yellow', 'orange', 'red'];\n\n /** 顏色對應的 HEX 值 */\n readonly colorHex = MARKER_COLORS;\n\n /** 輸出詳細程度選項 */\n readonly outputOptions: OutputDetail[] = ['compact', 'standard', 'detailed', 'forensic'];\n\n /** 選擇顏色 */\n selectColor(color: MarkerColor): void {\n this.updateSettings({ markerColor: color });\n }\n\n /** 選擇輸出詳細程度 */\n selectOutputDetail(detail: OutputDetail): void {\n this.updateSettings({ outputDetail: detail });\n }\n\n /** 切換 Angular 組件顯示 */\n toggleAngularComponents(): void {\n this.updateSettings({ showAngularComponents: !this.settings.showAngularComponents });\n }\n\n /** 切換複製後清除 */\n toggleClearOnCopy(): void {\n this.updateSettings({ clearOnCopy: !this.settings.clearOnCopy });\n }\n\n /** 切換阻止頁面互動 */\n toggleBlockInteractions(): void {\n this.updateSettings({ blockPageInteractions: !this.settings.blockPageInteractions });\n }\n\n /** 切換主題(深色/淺色) */\n toggleTheme(): void {\n this.updateSettings({ isDarkMode: !this.settings.isDarkMode });\n }\n\n /** 關閉面板 */\n close(): void {\n this.closed.emit();\n }\n\n /** 更新設定 */\n private updateSettings(partial: Partial<AgentationSettings>): void {\n this.settings = { ...this.settings, ...partial };\n this.settingsChange.emit(this.settings);\n }\n}\n","<div class=\"ag-settings-panel\">\n <!-- 標題 -->\n <header class=\"ag-settings-header\">\n <div class=\"ag-settings-title\">\n <span class=\"ag-logo\">/agentation</span>\n <span class=\"ag-version\">v1.0.0</span>\n </div>\n <button class=\"ag-theme-toggle\" title=\"Toggle Theme\" (click)=\"toggleTheme()\">\n <!-- 月亮圖示 (light mode) -->\n <svg *ngIf=\"!settings.isDarkMode\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z\"/>\n </svg>\n <!-- 太陽圖示 (dark mode) -->\n <svg *ngIf=\"settings.isDarkMode\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <circle cx=\"12\" cy=\"12\" r=\"5\"/>\n <line x1=\"12\" y1=\"1\" x2=\"12\" y2=\"3\"/>\n <line x1=\"12\" y1=\"21\" x2=\"12\" y2=\"23\"/>\n <line x1=\"4.22\" y1=\"4.22\" x2=\"5.64\" y2=\"5.64\"/>\n <line x1=\"18.36\" y1=\"18.36\" x2=\"19.78\" y2=\"19.78\"/>\n <line x1=\"1\" y1=\"12\" x2=\"3\" y2=\"12\"/>\n <line x1=\"21\" y1=\"12\" x2=\"23\" y2=\"12\"/>\n <line x1=\"4.22\" y1=\"19.78\" x2=\"5.64\" y2=\"18.36\"/>\n <line x1=\"18.36\" y1=\"5.64\" x2=\"19.78\" y2=\"4.22\"/>\n </svg>\n </button>\n </header>\n\n <!-- 輸出詳細程度 -->\n <section class=\"ag-settings-section\">\n <div class=\"ag-settings-row\">\n <label class=\"ag-settings-label\">\n Output Detail\n <span class=\"ag-help-icon\" title=\"Level of detail in the generated output\">?</span>\n </label>\n <div class=\"ag-dropdown\">\n <select\n [value]=\"settings.outputDetail\"\n (change)=\"selectOutputDetail($any($event.target).value)\"\n >\n <option value=\"compact\">Compact</option>\n <option value=\"standard\">Standard</option>\n <option value=\"detailed\">Detailed</option>\n <option value=\"forensic\">Forensic</option>\n </select>\n </div>\n </div>\n </section>\n\n <!-- Angular 組件開關 -->\n <!-- <section class=\"ag-settings-section\">\n <div class=\"ag-settings-row\">\n <label class=\"ag-settings-label\">\n Angular Components\n <span class=\"ag-help-icon\" title=\"Include Angular component metadata in output\">?</span>\n </label>\n <label class=\"ag-toggle\">\n <input\n type=\"checkbox\"\n [checked]=\"settings.showAngularComponents\"\n (change)=\"toggleAngularComponents()\"\n />\n <span class=\"ag-toggle-slider\"></span>\n </label>\n </div>\n </section> -->\n\n <!-- 標記顏色 -->\n <section class=\"ag-settings-section\">\n <label class=\"ag-settings-label\">Marker Colour</label>\n <div class=\"ag-color-picker\">\n <button\n *ngFor=\"let color of colors\"\n class=\"ag-color-option\"\n [class.selected]=\"settings.markerColor === color\"\n [style.background-color]=\"colorHex[color]\"\n (click)=\"selectColor(color)\"\n [title]=\"color\"\n ></button>\n </div>\n </section>\n\n <!-- 其他選項 -->\n <section class=\"ag-settings-section ag-options-section\">\n <label class=\"ag-checkbox-row\">\n <input\n type=\"checkbox\"\n [checked]=\"settings.clearOnCopy\"\n (change)=\"toggleClearOnCopy()\"\n />\n <span>Clear on copy/send</span>\n <span class=\"ag-help-icon\" title=\"Clear markers after copying to clipboard\">?</span>\n </label>\n\n <!-- <label class=\"ag-checkbox-row\">\n <input\n type=\"checkbox\"\n [checked]=\"settings.blockPageInteractions\"\n (change)=\"toggleBlockInteractions()\"\n />\n <span>Block page interactions</span>\n </label> -->\n </section>\n\n <!-- MCP & Webhooks 連結 -->\n <!-- <section class=\"ag-settings-section ag-link-section\">\n <a href=\"javascript:void(0)\" class=\"ag-settings-link\">\n Manage MCP & Webhooks\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <polyline points=\"9 18 15 12 9 6\"/>\n </svg>\n </a>\n </section> -->\n</div>\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport {\n MarkerAnnotation,\n MARKER_COLORS,\n} from '../../models/component-node.interface';\n\n/**\n * MarkersPanelComponent\n *\n * 已標記組件列表:顯示、編輯意圖、刪除標記\n */\n@Component({\n selector: 'ag-markers-panel',\n standalone: false,\n templateUrl: './markers-panel.component.html',\n styleUrls: ['./markers-panel.component.scss'],\n})\nexport class MarkersPanelComponent {\n /** 標記列表 */\n @Input() markers: MarkerAnnotation[] = [];\n\n /** 面板關閉時觸發 */\n @Output() closed = new EventEmitter<void>();\n\n /** 刪除標記時觸發 */\n @Output() deleteMarker = new EventEmitter<number>();\n\n /** 更新標記意圖時觸發 */\n @Output() updateIntent = new EventEmitter<{ index: number; intent: string }>();\n\n /** 跳轉到標記時觸發 */\n @Output() scrollToMarker = new EventEmitter<number>();\n\n /** 顏色對應的 HEX 值 */\n readonly colorHex = MARKER_COLORS;\n\n /** 當前編輯的標記索引 */\n editingIndex: number | null = null;\n\n /** 編輯中的意圖文字 */\n editingIntent = '';\n\n /** 開始編輯意圖 */\n startEdit(marker: MarkerAnnotation): void {\n this.editingIndex = marker.index;\n this.editingIntent = marker.intent;\n }\n\n /** 保存編輯 */\n saveEdit(): void {\n if (this.editingIndex !== null) {\n this.updateIntent.emit({\n index: this.editingIndex,\n intent: this.editingIntent,\n });\n this.editingIndex = null;\n this.editingIntent = '';\n }\n }\n\n /** 取消編輯 */\n cancelEdit(): void {\n this.editingIndex = null;\n this.editingIntent = '';\n }\n\n /** 刪除標記 */\n onDelete(index: number): void {\n this.deleteMarker.emit(index);\n }\n\n /** 跳轉到標記 */\n onScrollTo(index: number): void {\n this.scrollToMarker.emit(index);\n }\n\n /** 關閉面板 */\n close(): void {\n this.closed.emit();\n }\n\n /** 處理 Enter 鍵 */\n onKeyDown(event: KeyboardEvent): void {\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n this.saveEdit();\n } else if (event.key === 'Escape') {\n this.cancelEdit();\n }\n }\n\n /** trackBy 函數 */\n trackByIndex(index: number, marker: MarkerAnnotation): number {\n return marker.index;\n }\n}\n","<div class=\"ag-markers-panel\">\n <!-- 標題 -->\n <header class=\"ag-markers-header\">\n <h3 class=\"ag-markers-title\">\n <span class=\"ag-markers-icon\">📌</span>\n Marked Components\n <span class=\"ag-markers-count\">{{ markers.length }}</span>\n </h3>\n <button class=\"ag-close-btn\" (click)=\"close()\" title=\"Close\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\n </svg>\n </button>\n </header>\n\n <!-- 標記列表 -->\n <div class=\"ag-markers-list\" *ngIf=\"markers.length > 0\">\n <div\n class=\"ag-marker-item\"\n *ngFor=\"let marker of markers; trackBy: trackByIndex\"\n >\n <!-- 標記編號 -->\n <div\n class=\"ag-marker-number\"\n [style.background-color]=\"colorHex[marker.color]\"\n (click)=\"onScrollTo(marker.index)\"\n >\n {{ marker.index }}\n </div>\n\n <!-- 標記內容 -->\n <div class=\"ag-marker-content\">\n <div class=\"ag-marker-component\">\n <span class=\"ag-marker-name\">{{ marker.target.displayName }}</span>\n <code class=\"ag-marker-selector\"><{{ marker.target.selector }}></code>\n </div>\n\n <!-- 意圖顯示/編輯 -->\n <div class=\"ag-marker-intent\" *ngIf=\"editingIndex !== marker.index\">\n <span class=\"ag-intent-text\" *ngIf=\"marker.intent\">{{ marker.intent }}</span>\n <button class=\"ag-edit-btn\" (click)=\"startEdit(marker)\" title=\"Edit intent\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"/>\n <path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"/>\n </svg>\n {{ marker.intent ? 'Edit' : 'Add intent' }}\n </button>\n </div>\n\n <!-- 編輯模式 -->\n <div class=\"ag-marker-edit\" *ngIf=\"editingIndex === marker.index\">\n <textarea\n class=\"ag-edit-textarea\"\n [(ngModel)]=\"editingIntent\"\n (keydown)=\"onKeyDown($event)\"\n placeholder=\"Describe what you want AI to do...\"\n rows=\"2\"\n ></textarea>\n <div class=\"ag-edit-actions\">\n <button class=\"ag-save-btn\" (click)=\"saveEdit()\">Save</button>\n <button class=\"ag-cancel-btn\" (click)=\"cancelEdit()\">Cancel</button>\n </div>\n </div>\n </div>\n\n <!-- 刪除按鈕 -->\n <button class=\"ag-delete-btn\" (click)=\"onDelete(marker.index)\" title=\"Delete marker\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\n </svg>\n </button>\n </div>\n </div>\n\n <!-- 空狀態 -->\n <div class=\"ag-markers-empty\" *ngIf=\"markers.length === 0\">\n <span class=\"ag-empty-icon\">📭</span>\n <p>No markers yet</p>\n <span class=\"ag-empty-hint\">Click on components to add markers</span>\n </div>\n</div>\n","import { Component, OnInit, isDevMode } from '@angular/core';\nimport {\n ComponentNode,\n MarkerAnnotation,\n RecordingSession,\n AgentationSettings,\n ToolbarState,\n DEFAULT_SETTINGS\n} from '../../models/component-node.interface';\nimport { PromptGeneratorService } from '../../services/prompt-generator.service';\n\n@Component({\n selector: 'ag-directive-zero',\n standalone: false,\n templateUrl: './agentation.component.html',\n styleUrls: ['./agentation.component.scss']\n})\nexport class AgentationComponent implements OnInit {\n\n isDev = isDevMode();\n\n /** 設定 */\n settings: AgentationSettings = { ...DEFAULT_SETTINGS };\n\n /** 工具列狀態 */\n toolbarState: ToolbarState = {\n showSettings: false,\n showMarkers: false,\n isRecording: false,\n isMinimized: false,\n };\n\n /** 錄製會話 */\n session: RecordingSession = {\n id: this.generateId(),\n markers: [],\n startTime: 0,\n isRecording: false,\n };\n\n // Just used for legacy panel if needed, but mainly for overlay\n selectedNode: ComponentNode | null = null;\n\n constructor(private promptGenerator: PromptGeneratorService) { }\n\n ngOnInit(): void {\n }\n\n // ==================== 工具列事件 ====================\n\n /** 開始錄製 */\n onStartRecording(): void {\n this.session = {\n id: this.generateId(),\n markers: [],\n startTime: Date.now(),\n isRecording: true,\n };\n this.toolbarState.isRecording = true;\n this.toolbarState.showSettings = false;\n this.toolbarState.showMarkers = false;\n }\n\n /** 停止錄製 */\n onStopRecording(): void {\n this.session.isRecording = false;\n this.session.endTime = Date.now();\n this.toolbarState.isRecording = false;\n }\n\n /** 處理錄製狀態變更(來自 Overlay 快捷鍵等) */\n onRecordingChanged(isRecording: boolean): void {\n if (isRecording) {\n this.onStartRecording();\n } else {\n this.onStopRecording();\n }\n }\n\n /** 切換顯示標記列表 */\n onToggleMarkers(): void {\n this.toolbarState.showMarkers = !this.toolbarState.showMarkers;\n if (this.toolbarState.showMarkers) {\n this.toolbarState.showSettings = false;\n }\n }\n\n /** 複製到剪貼簿 */\n async onCopyToClipboard(): Promise<void> {\n if (this.session.markers.length === 0) return;\n\n const markdown = this.generateMultiMarkerOutput();\n\n try {\n await navigator.clipboard.writeText(markdown);\n console.log('[Agentation] Copied to clipboard');\n\n if (this.settings.clearOnCopy) {\n this.onClearMarkers();\n }\n } catch (err) {\n console.error('[Agentation] Failed to copy:', err);\n }\n }\n\n /** 清除所有標記 */\n onClearMarkers(): void {\n this.session.markers = [];\n }\n\n /** 切換設定面板 */\n onToggleSettings(): void {\n this.toolbarState.showSettings = !this.toolbarState.showSettings;\n if (this.toolbarState.showSettings) {\n this.toolbarState.showMarkers = false;\n }\n }\n\n /** 關閉工具列 */\n onCloseToolbar(): void {\n this.toolbarState.isRecording = false;\n this.toolbarState.showSettings = false;\n this.toolbarState.showMarkers = false;\n this.session.markers = [];\n }\n\n /** 切換最小化 */\n onToggleMinimize(): void {\n this.toolbarState.isMinimized = !this.toolbarState.isMinimized;\n // 如果工具列收合,則關閉設定面板\n if (this.toolbarState.isMinimized) {\n this.toolbarState.showSettings = false;\n }\n }\n\n /** 設定變更 */\n onSettingsChange(newSettings: AgentationSettings): void {\n // 如果顏色有變更,更新所有已存在的 markers\n if (newSettings.markerColor !== this.settings.markerColor) {\n this.session.markers = this.session.markers.map((m: MarkerAnnotation) => ({\n ...m,\n color: newSettings.markerColor,\n }));\n }\n this.settings = newSettings;\n }\n\n // ==================== 標記事件 ====================\n\n /** 新增標記 */\n onMarkerAdded(node: ComponentNode): void {\n const marker: MarkerAnnotation = {\n index: this.session.markers.length + 1,\n target: node,\n intent: '',\n color: this.settings.markerColor,\n timestamp: Date.now(),\n };\n this.session.markers = [...this.session.markers, marker];\n // console.log('[Agentation] Marker added:', marker);\n }\n\n /** 刪除標記 */\n onDeleteMarker(index: number): void {\n this.session.markers = this.session.markers\n .filter((m: MarkerAnnotation) => m.index !== index)\n .map((m: MarkerAnnotation, i: number) => ({ ...m, index: i + 1 }));\n }\n\n /** 更新標記意圖 */\n onUpdateIntent(event: { index: number; intent: string }): void {\n this.session.markers = this.session.markers.map((m: MarkerAnnotation) =>\n m.index === event.index ? { ...m, intent: event.intent } : m\n );\n }\n\n /** 跳轉到標記 */\n onScrollToMarker(index: number): void {\n const marker = this.session.markers.find((m: MarkerAnnotation) => m.index === index);\n if (marker) {\n marker.target.domElement.scrollIntoView({\n behavior: 'smooth',\n block: 'center',\n });\n }\n }\n\n // ==================== 輔助方法 ====================\n\n /** 生成多標記輸出 */\n private generateMultiMarkerOutput(): string {\n const markers = this.session.markers.map((marker: MarkerAnnotation) => ({\n target: marker.target,\n intent: marker.intent || '',\n }));\n\n return this.promptGenerator.generatePageFeedback(markers, {\n outputDetail: this.settings.outputDetail,\n pageUrl: window.location.href,\n viewport: { width: window.innerWidth, height: window.innerHeight },\n userAgent: navigator.userAgent,\n timestamp: Date.now(),\n });\n }\n\n /** 生成唯一 ID */\n private generateId(): string {\n return `session-${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;\n }\n\n}\n","<ng-container *ngIf=\"isDev\">\n <!-- Overlay (多選標記) -->\n <ag-overlay [markers]=\"session.markers\" [settings]=\"settings\" [isRecording]=\"toolbarState.isRecording\"\n [isMinimized]=\"toolbarState.isMinimized\" (markerAdded)=\"onMarkerAdded($event)\"\n (markerDeleted)=\"onDeleteMarker($event)\" (recordingChanged)=\"onRecordingChanged($event)\"></ag-overlay>\n\n <!-- Toolbar (浮動工具列) -->\n <ag-toolbar [session]=\"session\" [settings]=\"settings\" [state]=\"toolbarState\" (startRecording)=\"onStartRecording()\"\n (stopRecording)=\"onStopRecording()\" (toggleMarkers)=\"onToggleMarkers()\" (copyToClipboard)=\"onCopyToClipboard()\"\n (clearMarkers)=\"onClearMarkers()\" (toggleSettings)=\"onToggleSettings()\" (toggleMinimize)=\"onToggleMinimize()\"\n (closeToolbar)=\"onCloseToolbar()\" (settingsChange)=\"onSettingsChange($event)\"></ag-toolbar>\n\n <!-- Markers Panel -->\n <ag-markers-panel *ngIf=\"toolbarState.showMarkers\" [markers]=\"session.markers\" (deleteMarker)=\"onDeleteMarker($event)\"\n (updateIntent)=\"onUpdateIntent($event)\" (scrollToMarker)=\"onScrollToMarker($event)\"\n (closed)=\"toolbarState.showMarkers = false\"></ag-markers-panel>\n</ng-container>","import { NgModule, ModuleWithProviders } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\n// HttpClientModule is deprecated in Angular 15+ but remains available through Angular 20.\n// Kept here for Angular 14 compatibility; Angular 15+ apps may also call\n// provideHttpClient() in their own root providers.\nimport { HttpClientModule } from '@angular/common/http';\n\n// Components\nimport { OverlayComponent } from './components/overlay/overlay.component';\nimport { AnnotationPanelComponent } from './components/annotation-panel/annotation-panel.component';\nimport { ToolbarComponent } from './components/toolbar/toolbar.component';\nimport { SettingsPanelComponent } from './components/settings-panel/settings-panel.component';\nimport { MarkersPanelComponent } from './components/markers-panel/markers-panel.component';\nimport { InlineEditorComponent } from './components/inline-editor/inline-editor.component';\nimport { AgentationComponent } from './components/agentation/agentation.component';\n\n// Services\nimport { ComponentWalkerService } from './services/component-walker.service';\nimport { DataSanitizerService } from './services/data-sanitizer.service';\nimport { PromptGeneratorService } from './services/prompt-generator.service';\nimport { McpService } from './services/mcp.service';\n\n/**\n * NgDirectiveZeroModule\n *\n * Angular 版本的 Agentation 工具\n * 提供視覺化 DOM 檢查器、組件樹遍歷、AI 語意化序列化等功能\n *\n * 使用方式:\n * ```typescript\n * @NgModule({\n * imports: [NgDirectiveZeroModule.forRoot()]\n * })\n * export class AppModule {}\n * ```\n */\n@NgModule({\n declarations: [\n OverlayComponent,\n AnnotationPanelComponent,\n ToolbarComponent,\n SettingsPanelComponent,\n MarkersPanelComponent,\n InlineEditorComponent,\n AgentationComponent,\n ],\n imports: [\n CommonModule,\n FormsModule,\n HttpClientModule,\n ],\n exports: [\n OverlayComponent,\n AnnotationPanelComponent,\n ToolbarComponent,\n SettingsPanelComponent,\n MarkersPanelComponent,\n InlineEditorComponent,\n AgentationComponent,\n ],\n})\nexport class NgDirectiveZeroModule {\n /**\n * 在根模組中使用,提供單例服務\n */\n static forRoot(): ModuleWithProviders<NgDirectiveZeroModule> {\n return {\n ngModule: NgDirectiveZeroModule,\n providers: [\n ComponentWalkerService,\n DataSanitizerService,\n PromptGeneratorService,\n McpService,\n ],\n };\n }\n}\n","/*\n * ng-directive-zero Public API\n */\n\n// Module\nexport * from './lib/ng-directive-zero.module';\n\n// Models\nexport * from './lib/models/component-node.interface';\n\n// Services\nexport * from './lib/services/component-walker.service';\nexport * from './lib/services/data-sanitizer.service';\nexport * from './lib/services/prompt-generator.service';\nexport * from './lib/services/mcp.service';\n\n// Components\nexport * from './lib/components/overlay/overlay.component';\nexport * from './lib/components/annotation-panel/annotation-panel.component';\nexport * from './lib/components/toolbar/toolbar.component';\nexport * from './lib/components/settings-panel/settings-panel.component';\nexport * from './lib/components/markers-panel/markers-panel.component';\nexport * from './lib/components/inline-editor/inline-editor.component';\nexport * from './lib/components/agentation/agentation.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.ComponentWalkerService","i2","i3.InlineEditorComponent","i1.DataSanitizerService","uuidv4","i1","i1.PromptGeneratorService","i2.McpService","i3","i4","i1.McpService","i3.OverlayComponent","i4.ToolbarComponent","i5.MarkersPanelComponent"],"mappings":"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"}
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { OnInit } from '@angular/core';
|
|
2
|
+
import { ComponentNode, RecordingSession, AgentationSettings, ToolbarState } from '../../models/component-node.interface';
|
|
3
|
+
import { PromptGeneratorService } from '../../services/prompt-generator.service';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export declare class AgentationComponent implements OnInit {
|
|
6
|
+
private promptGenerator;
|
|
7
|
+
isDev: boolean;
|
|
8
|
+
/** 設定 */
|
|
9
|
+
settings: AgentationSettings;
|
|
10
|
+
/** 工具列狀態 */
|
|
11
|
+
toolbarState: ToolbarState;
|
|
12
|
+
/** 錄製會話 */
|
|
13
|
+
session: RecordingSession;
|
|
14
|
+
selectedNode: ComponentNode | null;
|
|
15
|
+
constructor(promptGenerator: PromptGeneratorService);
|
|
16
|
+
ngOnInit(): void;
|
|
17
|
+
/** 開始錄製 */
|
|
18
|
+
onStartRecording(): void;
|
|
19
|
+
/** 停止錄製 */
|
|
20
|
+
onStopRecording(): void;
|
|
21
|
+
/** 處理錄製狀態變更(來自 Overlay 快捷鍵等) */
|
|
22
|
+
onRecordingChanged(isRecording: boolean): void;
|
|
23
|
+
/** 切換顯示標記列表 */
|
|
24
|
+
onToggleMarkers(): void;
|
|
25
|
+
/** 複製到剪貼簿 */
|
|
26
|
+
onCopyToClipboard(): Promise<void>;
|
|
27
|
+
/** 清除所有標記 */
|
|
28
|
+
onClearMarkers(): void;
|
|
29
|
+
/** 切換設定面板 */
|
|
30
|
+
onToggleSettings(): void;
|
|
31
|
+
/** 關閉工具列 */
|
|
32
|
+
onCloseToolbar(): void;
|
|
33
|
+
/** 切換最小化 */
|
|
34
|
+
onToggleMinimize(): void;
|
|
35
|
+
/** 設定變更 */
|
|
36
|
+
onSettingsChange(newSettings: AgentationSettings): void;
|
|
37
|
+
/** 新增標記 */
|
|
38
|
+
onMarkerAdded(node: ComponentNode): void;
|
|
39
|
+
/** 刪除標記 */
|
|
40
|
+
onDeleteMarker(index: number): void;
|
|
41
|
+
/** 更新標記意圖 */
|
|
42
|
+
onUpdateIntent(event: {
|
|
43
|
+
index: number;
|
|
44
|
+
intent: string;
|
|
45
|
+
}): void;
|
|
46
|
+
/** 跳轉到標記 */
|
|
47
|
+
onScrollToMarker(index: number): void;
|
|
48
|
+
/** 生成多標記輸出 */
|
|
49
|
+
private generateMultiMarkerOutput;
|
|
50
|
+
/** 生成唯一 ID */
|
|
51
|
+
private generateId;
|
|
52
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<AgentationComponent, never>;
|
|
53
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<AgentationComponent, "ag-directive-zero", never, {}, {}, never, never, false, never>;
|
|
54
|
+
}
|