@page-agent/ui 0.0.22 → 0.0.23
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.
|
@@ -221,6 +221,10 @@ function truncate(text, maxLength) {
|
|
|
221
221
|
return text;
|
|
222
222
|
}
|
|
223
223
|
__name(truncate, "truncate");
|
|
224
|
+
function escapeHtml(text) {
|
|
225
|
+
return text.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
|
|
226
|
+
}
|
|
227
|
+
__name(escapeHtml, "escapeHtml");
|
|
224
228
|
const wrapper = "_wrapper_1j0ct_1";
|
|
225
229
|
const background = "_background_1j0ct_39";
|
|
226
230
|
const header = "_header_1j0ct_99";
|
|
@@ -834,7 +838,7 @@ createHistoryItem_fn = /* @__PURE__ */ __name(function(step) {
|
|
|
834
838
|
<div class="${styles.historyItem} ${typeClass}">
|
|
835
839
|
<div class="${styles.historyContent}">
|
|
836
840
|
<span class="${styles.statusIcon}">${statusIcon2}</span>
|
|
837
|
-
<span>${step.displayText}</span>
|
|
841
|
+
<span>${escapeHtml(step.displayText)}</span>
|
|
838
842
|
</div>
|
|
839
843
|
<div class="${styles.historyMeta}">
|
|
840
844
|
${stepLabel}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page-agent-ui.js","sources":["../../src/UIState.ts","../../src/i18n/locales.ts","../../src/i18n/index.ts","../../src/utils.ts","../../src/Panel.ts"],"sourcesContent":["/**\n * Agent execution state management\n */\n\nexport interface Step {\n\tid: string\n\tstepNumber: number\n\ttimestamp: Date\n\ttype: 'thinking' | 'tool_executing' | 'completed' | 'error' | 'output' | 'input' | 'retry'\n\n\t// Tool execution related\n\ttoolName?: string\n\ttoolArgs?: any\n\ttoolResult?: any\n\n\t// Display data\n\tdisplayText: string\n\tduration?: number\n}\n\nexport type AgentStatus = 'idle' | 'running' | 'paused' | 'completed' | 'error'\n\nexport class UIState {\n\tprivate steps: Step[] = []\n\tprivate currentStep: Step | null = null\n\tprivate status: AgentStatus = 'idle'\n\tprivate stepCounter = 0\n\n\taddStep(stepData: Omit<Step, 'id' | 'stepNumber' | 'timestamp'>): Step {\n\t\tconst step: Step = {\n\t\t\tid: this.generateId(),\n\t\t\tstepNumber: ++this.stepCounter,\n\t\t\ttimestamp: new Date(),\n\t\t\t...stepData,\n\t\t}\n\n\t\tthis.steps.push(step)\n\t\tthis.currentStep = step\n\n\t\t// Update overall status\n\t\tthis.updateStatus(step.type)\n\n\t\treturn step\n\t}\n\n\tupdateCurrentStep(updates: Partial<Step>): Step | null {\n\t\tif (!this.currentStep) return null\n\n\t\tObject.assign(this.currentStep, updates)\n\t\treturn this.currentStep\n\t}\n\n\tgetCurrentStep(): Step | null {\n\t\treturn this.currentStep\n\t}\n\n\tgetAllSteps(): Step[] {\n\t\treturn [...this.steps]\n\t}\n\n\tgetStatus(): AgentStatus {\n\t\treturn this.status\n\t}\n\n\treset(): void {\n\t\tthis.steps = []\n\t\tthis.currentStep = null\n\t\tthis.status = 'idle'\n\t\tthis.stepCounter = 0\n\t}\n\n\tprivate updateStatus(stepType: Step['type']): void {\n\t\tswitch (stepType) {\n\t\t\tcase 'thinking':\n\t\t\tcase 'tool_executing':\n\t\t\tcase 'output':\n\t\t\tcase 'input':\n\t\t\tcase 'retry':\n\t\t\t\tthis.status = 'running'\n\t\t\t\tbreak\n\t\t\tcase 'completed':\n\t\t\t\tthis.status = 'completed'\n\t\t\t\tbreak\n\t\t\tcase 'error':\n\t\t\t\tthis.status = 'error'\n\t\t\t\tbreak\n\t\t}\n\t}\n\n\tprivate generateId(): string {\n\t\treturn `step_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`\n\t}\n}\n","// English translations (base/reference language)\nconst enUS = {\n\tui: {\n\t\tpanel: {\n\t\t\tready: 'Ready',\n\t\t\tthinking: 'Thinking...',\n\t\t\tpaused: 'Paused',\n\t\t\ttaskInput: 'Enter new task, describe steps in detail, press Enter to submit',\n\t\t\tuserAnswerPrompt: 'Please answer the question above, press Enter to submit',\n\t\t\ttaskTerminated: 'Task terminated',\n\t\t\ttaskCompleted: 'Task completed',\n\t\t\tcontinueExecution: 'Continue execution',\n\t\t\tuserAnswer: 'User answer: {{input}}',\n\t\t\tquestion: 'Question: {{question}}',\n\t\t\twaitingPlaceholder: 'Waiting for task to start...',\n\t\t\tpause: 'Pause',\n\t\t\tcontinue: 'Continue',\n\t\t\tstop: 'Stop',\n\t\t\texpand: 'Expand history',\n\t\t\tcollapse: 'Collapse history',\n\t\t\tstep: 'Step {{number}} · {{time}}{{duration}}',\n\t\t},\n\t\ttools: {\n\t\t\tclicking: 'Clicking element [{{index}}]...',\n\t\t\tinputting: 'Inputting text to element [{{index}}]...',\n\t\t\tselecting: 'Selecting option \"{{text}}\"...',\n\t\t\tscrolling: 'Scrolling page...',\n\t\t\twaiting: 'Waiting {{seconds}} seconds...',\n\t\t\tdone: 'Task done',\n\t\t\tclicked: '🖱️ Clicked element [{{index}}]',\n\t\t\tinputted: '⌨️ Inputted text \"{{text}}\"',\n\t\t\tselected: '☑️ Selected option \"{{text}}\"',\n\t\t\tscrolled: '🛞 Page scrolled',\n\t\t\twaited: '⌛️ Wait completed',\n\t\t\texecuting: 'Executing {{toolName}}...',\n\t\t\tresultSuccess: 'success',\n\t\t\tresultFailure: 'failed',\n\t\t\tresultError: 'error',\n\t\t},\n\t\terrors: {\n\t\t\telementNotFound: 'No interactive element found at index {{index}}',\n\t\t\ttaskRequired: 'Task description is required',\n\t\t\texecutionFailed: 'Task execution failed',\n\t\t\tnotInputElement: 'Element is not an input or textarea',\n\t\t\tnotSelectElement: 'Element is not a select element',\n\t\t\toptionNotFound: 'Option \"{{text}}\" not found',\n\t\t},\n\t},\n} as const\n\n// Chinese translations (must match the structure of enUS)\nconst zhCN = {\n\tui: {\n\t\tpanel: {\n\t\t\tready: '准备就绪',\n\t\t\tthinking: '正在思考...',\n\t\t\tpaused: '暂停中,稍后',\n\t\t\ttaskInput: '输入新任务,详细描述步骤,回车提交',\n\t\t\tuserAnswerPrompt: '请回答上面问题,回车提交',\n\t\t\ttaskTerminated: '任务已终止',\n\t\t\ttaskCompleted: '任务结束',\n\t\t\tcontinueExecution: '继续执行',\n\t\t\tuserAnswer: '用户回答: {{input}}',\n\t\t\tquestion: '询问: {{question}}',\n\t\t\twaitingPlaceholder: '等待任务开始...',\n\t\t\tpause: '暂停',\n\t\t\tcontinue: '继续',\n\t\t\tstop: '终止',\n\t\t\texpand: '展开历史',\n\t\t\tcollapse: '收起历史',\n\t\t\tstep: '步骤 {{number}} · {{time}}{{duration}}',\n\t\t},\n\t\ttools: {\n\t\t\tclicking: '正在点击元素 [{{index}}]...',\n\t\t\tinputting: '正在输入文本到元素 [{{index}}]...',\n\t\t\tselecting: '正在选择选项 \"{{text}}\"...',\n\t\t\tscrolling: '正在滚动页面...',\n\t\t\twaiting: '等待 {{seconds}} 秒...',\n\t\t\tdone: '结束任务',\n\t\t\tclicked: '🖱️ 已点击元素 [{{index}}]',\n\t\t\tinputted: '⌨️ 已输入文本 \"{{text}}\"',\n\t\t\tselected: '☑️ 已选择选项 \"{{text}}\"',\n\t\t\tscrolled: '🛞 页面滚动完成',\n\t\t\twaited: '⌛️ 等待完成',\n\t\t\texecuting: '正在执行 {{toolName}}...',\n\t\t\tresultSuccess: '成功',\n\t\t\tresultFailure: '失败',\n\t\t\tresultError: '错误',\n\t\t},\n\t\terrors: {\n\t\t\telementNotFound: '未找到索引为 {{index}} 的交互元素',\n\t\t\ttaskRequired: '任务描述不能为空',\n\t\t\texecutionFailed: '任务执行失败',\n\t\t\tnotInputElement: '元素不是输入框或文本域',\n\t\t\tnotSelectElement: '元素不是选择框',\n\t\t\toptionNotFound: '未找到选项 \"{{text}}\"',\n\t\t},\n\t},\n} as const\n\n// Type definitions generated from English base structure (but with string values)\ntype DeepStringify<T> = {\n\t[K in keyof T]: T[K] extends string ? string : T[K] extends object ? DeepStringify<T[K]> : T[K]\n}\n\nexport type TranslationSchema = DeepStringify<typeof enUS>\n\n// Utility type: Extract all nested paths from translation object\ntype NestedKeyOf<ObjectType extends object> = {\n\t[Key in keyof ObjectType & (string | number)]: ObjectType[Key] extends object\n\t\t? `${Key}` | `${Key}.${NestedKeyOf<ObjectType[Key]>}`\n\t\t: `${Key}`\n}[keyof ObjectType & (string | number)]\n\n// Extract all possible key paths from translation structure\nexport type TranslationKey = NestedKeyOf<TranslationSchema>\n\n// Parameterized translation types\nexport type TranslationParams = Record<string, string | number>\n\nexport const locales = {\n\t'en-US': enUS,\n\t'zh-CN': zhCN,\n} as const\n\nexport type SupportedLanguage = keyof typeof locales\n","import {\n\ttype SupportedLanguage,\n\ttype TranslationKey,\n\ttype TranslationParams,\n\ttype TranslationSchema,\n\tlocales,\n} from './locales'\n\nexport class I18n {\n\tprivate language: SupportedLanguage\n\tprivate translations: TranslationSchema\n\n\tconstructor(language: SupportedLanguage = 'en-US') {\n\t\tthis.language = language in locales ? language : 'en-US'\n\t\tthis.translations = locales[this.language]\n\t}\n\n\t// 类型安全的翻译方法\n\tt(key: TranslationKey, params?: TranslationParams): string {\n\t\tconst value = this.getNestedValue(this.translations, key)\n\t\tif (!value) {\n\t\t\tconsole.warn(`Translation key \"${key}\" not found for language \"${this.language}\"`)\n\t\t\treturn key\n\t\t}\n\n\t\tif (params) {\n\t\t\treturn this.interpolate(value, params)\n\t\t}\n\t\treturn value\n\t}\n\n\tprivate getNestedValue(obj: any, path: string): string | undefined {\n\t\treturn path.split('.').reduce((current, key) => current?.[key], obj)\n\t}\n\n\tprivate interpolate(template: string, params: TranslationParams): string {\n\t\treturn template.replace(/\\{\\{(\\w+)\\}\\}/g, (match, key) => {\n\t\t\t// Use != null to check for both null and undefined, allow empty strings\n\t\t\treturn params[key] != null ? params[key].toString() : match\n\t\t})\n\t}\n\n\tgetLanguage(): SupportedLanguage {\n\t\treturn this.language\n\t}\n}\n\n// 导出类型和实例创建函数\nexport type { TranslationKey, SupportedLanguage, TranslationParams }\nexport { locales }\n","export function truncate(text: string, maxLength: number): string {\n\tif (text.length > maxLength) {\n\t\treturn text.substring(0, maxLength) + '...'\n\t}\n\treturn text\n}\n","import { type Step, UIState } from './UIState'\nimport { I18n, type SupportedLanguage } from './i18n'\nimport { truncate } from './utils'\n\nimport styles from './Panel.module.css'\n\n/**\n * Panel configuration\n */\nexport interface PanelConfig {\n\tlanguage?: SupportedLanguage\n\tonExecuteTask: (task: string) => void\n\tonStop: () => void\n\tonPauseToggle: () => boolean // returns new paused state\n\tgetPaused: () => boolean\n}\n\n/**\n * Semantic update types - Panel handles i18n internally\n */\nexport type PanelUpdate =\n\t| { type: 'thinking'; text?: string } // text is optional, defaults to i18n thinking text\n\t| { type: 'input'; task: string }\n\t| { type: 'question'; question: string }\n\t| { type: 'userAnswer'; input: string }\n\t| { type: 'retry'; current: number; max: number }\n\t| { type: 'error'; message: string }\n\t| { type: 'output'; text: string }\n\t| { type: 'completed' }\n\t| { type: 'toolExecuting'; toolName: string; args: any }\n\t| { type: 'toolCompleted'; toolName: string; args: any; result?: string; duration?: number }\n\n/**\n * Agent control panel\n */\nexport class Panel {\n\t#wrapper: HTMLElement\n\t#indicator: HTMLElement\n\t#statusText: HTMLElement\n\t#historySection: HTMLElement\n\t#expandButton: HTMLElement\n\t#pauseButton: HTMLElement\n\t#stopButton: HTMLElement\n\t#inputSection: HTMLElement\n\t#taskInput: HTMLInputElement\n\n\t#state = new UIState()\n\t#isExpanded = false\n\t#config: PanelConfig\n\t#i18n: I18n\n\t#userAnswerResolver: ((input: string) => void) | null = null\n\t#isWaitingForUserAnswer: boolean = false\n\t#headerUpdateTimer: ReturnType<typeof setInterval> | null = null\n\t#pendingHeaderText: string | null = null\n\t#isAnimating = false\n\n\tget wrapper(): HTMLElement {\n\t\treturn this.#wrapper\n\t}\n\n\tconstructor(config: PanelConfig) {\n\t\tthis.#config = config\n\t\tthis.#i18n = new I18n(config.language ?? 'en-US')\n\t\tthis.#wrapper = this.#createWrapper()\n\t\tthis.#indicator = this.#wrapper.querySelector(`.${styles.indicator}`)!\n\t\tthis.#statusText = this.#wrapper.querySelector(`.${styles.statusText}`)!\n\t\tthis.#historySection = this.#wrapper.querySelector(`.${styles.historySection}`)!\n\t\tthis.#expandButton = this.#wrapper.querySelector(`.${styles.expandButton}`)!\n\t\tthis.#pauseButton = this.#wrapper.querySelector(`.${styles.pauseButton}`)!\n\t\tthis.#stopButton = this.#wrapper.querySelector(`.${styles.stopButton}`)!\n\t\tthis.#inputSection = this.#wrapper.querySelector(`.${styles.inputSectionWrapper}`)!\n\t\tthis.#taskInput = this.#wrapper.querySelector(`.${styles.taskInput}`)!\n\n\t\tthis.#setupEventListeners()\n\t\tthis.#startHeaderUpdateLoop()\n\n\t\tthis.#showInputArea()\n\t}\n\n\t/**\n\t * Ask for user input\n\t */\n\tasync askUser(question: string): Promise<string> {\n\t\treturn new Promise((resolve) => {\n\t\t\t// Set `waiting for user answer` state\n\t\t\tthis.#isWaitingForUserAnswer = true\n\t\t\tthis.#userAnswerResolver = resolve\n\n\t\t\t// Update state to `running`\n\t\t\tthis.#updateInternal({\n\t\t\t\ttype: 'output',\n\t\t\t\tdisplayText: this.#i18n.t('ui.panel.question', { question }),\n\t\t\t}) // Expand history panel\n\t\t\tif (!this.#isExpanded) {\n\t\t\t\tthis.#expand()\n\t\t\t}\n\n\t\t\tthis.#showInputArea(this.#i18n.t('ui.panel.userAnswerPrompt'))\n\t\t})\n\t}\n\n\t// ========== Public control methods ==========\n\n\tshow(): void {\n\t\tthis.wrapper.style.display = 'block'\n\t\tvoid this.wrapper.offsetHeight\n\t\tthis.wrapper.style.opacity = '1'\n\t\tthis.wrapper.style.transform = 'translateX(-50%) translateY(0)'\n\t}\n\n\thide(): void {\n\t\tthis.wrapper.style.opacity = '0'\n\t\tthis.wrapper.style.transform = 'translateX(-50%) translateY(20px)'\n\t\tthis.wrapper.style.display = 'none'\n\t}\n\n\treset(): void {\n\t\tthis.#state.reset()\n\t\tthis.#statusText.textContent = this.#i18n.t('ui.panel.ready')\n\t\tthis.#updateStatusIndicator('thinking')\n\t\tthis.#updateHistory()\n\t\tthis.#collapse()\n\t\t// Reset pause state via callback\n\t\tif (this.#config.getPaused()) {\n\t\t\tthis.#config.onPauseToggle()\n\t\t}\n\t\tthis.#updatePauseButton()\n\t\t// Reset user input state\n\t\tthis.#isWaitingForUserAnswer = false\n\t\tthis.#userAnswerResolver = null\n\t\t// Show input area\n\t\tthis.#showInputArea()\n\t}\n\n\texpand(): void {\n\t\tthis.#expand()\n\t}\n\n\tcollapse(): void {\n\t\tthis.#collapse()\n\t}\n\n\t/**\n\t * Update panel with semantic data - i18n handled internally\n\t */\n\tupdate(data: PanelUpdate): void {\n\t\tconst stepData = this.#toStepData(data)\n\t\tthis.#updateInternal(stepData)\n\t}\n\n\t/**\n\t * Dispose panel\n\t */\n\tdispose(): void {\n\t\tthis.#isWaitingForUserAnswer = false\n\t\tthis.#stopHeaderUpdateLoop()\n\t\tthis.wrapper.remove()\n\t}\n\n\t// ========== Private methods ==========\n\n\t/**\n\t * Convert semantic update to step data with i18n\n\t */\n\t#toStepData(data: PanelUpdate): Omit<Step, 'id' | 'stepNumber' | 'timestamp'> {\n\t\tswitch (data.type) {\n\t\t\tcase 'thinking':\n\t\t\t\treturn { type: 'thinking', displayText: data.text ?? this.#i18n.t('ui.panel.thinking') }\n\t\t\tcase 'input':\n\t\t\t\treturn { type: 'input', displayText: data.task }\n\t\t\tcase 'question':\n\t\t\t\treturn {\n\t\t\t\t\ttype: 'output',\n\t\t\t\t\tdisplayText: this.#i18n.t('ui.panel.question', { question: data.question }),\n\t\t\t\t}\n\t\t\tcase 'userAnswer':\n\t\t\t\treturn {\n\t\t\t\t\ttype: 'input',\n\t\t\t\t\tdisplayText: this.#i18n.t('ui.panel.userAnswer', { input: data.input }),\n\t\t\t\t}\n\t\t\tcase 'retry':\n\t\t\t\treturn { type: 'retry', displayText: `retry-ing (${data.current} / ${data.max})` }\n\t\t\tcase 'error':\n\t\t\t\treturn { type: 'error', displayText: data.message }\n\t\t\tcase 'output':\n\t\t\t\treturn { type: 'output', displayText: data.text }\n\t\t\tcase 'completed':\n\t\t\t\treturn { type: 'completed', displayText: this.#i18n.t('ui.panel.taskCompleted') }\n\t\t\tcase 'toolExecuting':\n\t\t\t\treturn {\n\t\t\t\t\ttype: 'tool_executing',\n\t\t\t\t\ttoolName: data.toolName,\n\t\t\t\t\ttoolArgs: data.args,\n\t\t\t\t\tdisplayText: this.#getToolExecutingText(data.toolName, data.args),\n\t\t\t\t}\n\t\t\tcase 'toolCompleted': {\n\t\t\t\tconst displayText = this.#getToolCompletedText(data.toolName, data.args)\n\t\t\t\tif (!displayText) return { type: 'tool_executing', displayText: '' } // will be filtered\n\t\t\t\treturn {\n\t\t\t\t\ttype: 'tool_executing',\n\t\t\t\t\ttoolName: data.toolName,\n\t\t\t\t\ttoolArgs: data.args,\n\t\t\t\t\ttoolResult: data.result,\n\t\t\t\t\tdisplayText,\n\t\t\t\t\tduration: data.duration,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t#getToolExecutingText(toolName: string, args: any): string {\n\t\tswitch (toolName) {\n\t\t\tcase 'click_element_by_index':\n\t\t\t\treturn this.#i18n.t('ui.tools.clicking', { index: args.index })\n\t\t\tcase 'input_text':\n\t\t\t\treturn this.#i18n.t('ui.tools.inputting', { index: args.index })\n\t\t\tcase 'select_dropdown_option':\n\t\t\t\treturn this.#i18n.t('ui.tools.selecting', { text: args.text })\n\t\t\tcase 'scroll':\n\t\t\t\treturn this.#i18n.t('ui.tools.scrolling')\n\t\t\tcase 'wait':\n\t\t\t\treturn this.#i18n.t('ui.tools.waiting', { seconds: args.seconds })\n\t\t\tcase 'done':\n\t\t\t\treturn this.#i18n.t('ui.tools.done')\n\t\t\tdefault:\n\t\t\t\treturn this.#i18n.t('ui.tools.executing', { toolName })\n\t\t}\n\t}\n\n\t#getToolCompletedText(toolName: string, args: any): string | null {\n\t\tswitch (toolName) {\n\t\t\tcase 'click_element_by_index':\n\t\t\t\treturn this.#i18n.t('ui.tools.clicked', { index: args.index })\n\t\t\tcase 'input_text':\n\t\t\t\treturn this.#i18n.t('ui.tools.inputted', { text: args.text })\n\t\t\tcase 'select_dropdown_option':\n\t\t\t\treturn this.#i18n.t('ui.tools.selected', { text: args.text })\n\t\t\tcase 'scroll':\n\t\t\t\treturn this.#i18n.t('ui.tools.scrolled')\n\t\t\tcase 'wait':\n\t\t\t\treturn this.#i18n.t('ui.tools.waited')\n\t\t\tcase 'done':\n\t\t\t\treturn null\n\t\t\tdefault:\n\t\t\t\treturn null\n\t\t}\n\t}\n\n\t/**\n\t * Update status (internal)\n\t */\n\t#updateInternal(stepData: Omit<Step, 'id' | 'stepNumber' | 'timestamp'>): void {\n\t\t// Skip empty displayText (filtered toolCompleted for 'done')\n\t\tif (!stepData.displayText) return\n\n\t\tconst step = this.#state.addStep(stepData)\n\n\t\t// Queue header text update (will be processed by periodic check)\n\t\tconst headerText = truncate(step.displayText, 20)\n\t\tthis.#pendingHeaderText = headerText\n\n\t\tthis.#updateStatusIndicator(step.type)\n\t\tthis.#updateHistory()\n\n\t\t// Auto-expand history after task completion\n\t\tif (step.type === 'completed' || step.type === 'error') {\n\t\t\tif (!this.#isExpanded) {\n\t\t\t\tthis.#expand()\n\t\t\t}\n\t\t}\n\n\t\t// Control input area display based on status\n\t\tif (this.#shouldShowInputArea()) {\n\t\t\tthis.#showInputArea()\n\t\t} else {\n\t\t\tthis.#hideInputArea()\n\t\t}\n\t}\n\n\t/**\n\t * Toggle pause state\n\t */\n\t#togglePause(): void {\n\t\tconst paused = this.#config.onPauseToggle()\n\t\tthis.#updatePauseButton()\n\n\t\t// Update status display\n\t\tif (paused) {\n\t\t\tthis.#statusText.textContent = this.#i18n.t('ui.panel.paused')\n\t\t\tthis.#updateStatusIndicator('thinking')\n\t\t} else {\n\t\t\tthis.#statusText.textContent = this.#i18n.t('ui.panel.continueExecution')\n\t\t\tthis.#updateStatusIndicator('tool_executing')\n\t\t}\n\t}\n\n\t/**\n\t * Update pause button state\n\t */\n\t#updatePauseButton(): void {\n\t\tconst paused = this.#config.getPaused()\n\t\tif (paused) {\n\t\t\tthis.#pauseButton.textContent = '▶'\n\t\t\tthis.#pauseButton.title = this.#i18n.t('ui.panel.continue')\n\t\t\tthis.#pauseButton.classList.add(styles.paused)\n\t\t} else {\n\t\t\tthis.#pauseButton.textContent = '⏸︎'\n\t\t\tthis.#pauseButton.title = this.#i18n.t('ui.panel.pause')\n\t\t\tthis.#pauseButton.classList.remove(styles.paused)\n\t\t}\n\t}\n\n\t/**\n\t * Stop Agent\n\t */\n\t#stopAgent(): void {\n\t\t// Update status display\n\t\tthis.#updateInternal({\n\t\t\ttype: 'error',\n\t\t\tdisplayText: this.#i18n.t('ui.panel.taskTerminated'),\n\t\t})\n\n\t\tthis.#config.onStop()\n\t}\n\n\t/**\n\t * Submit task\n\t */\n\t#submitTask() {\n\t\tconst input = this.#taskInput.value.trim()\n\t\tif (!input) return\n\n\t\t// Hide input area\n\t\tthis.#hideInputArea()\n\n\t\tif (this.#isWaitingForUserAnswer) {\n\t\t\t// Handle user input mode\n\t\t\tthis.#handleUserAnswer(input)\n\t\t} else {\n\t\t\tthis.#config.onExecuteTask(input)\n\t\t}\n\t}\n\n\t/**\n\t * Handle user answer\n\t */\n\t#handleUserAnswer(input: string): void {\n\t\t// Add user input to history\n\t\tthis.#updateInternal({\n\t\t\ttype: 'input',\n\t\t\tdisplayText: this.#i18n.t('ui.panel.userAnswer', { input }),\n\t\t})\n\n\t\t// Reset state\n\t\tthis.#isWaitingForUserAnswer = false\n\n\t\t// Call resolver to return user input\n\t\tif (this.#userAnswerResolver) {\n\t\t\tthis.#userAnswerResolver(input)\n\t\t\tthis.#userAnswerResolver = null\n\t\t}\n\t}\n\n\t/**\n\t * Show input area\n\t */\n\t#showInputArea(placeholder?: string): void {\n\t\t// Clear input field\n\t\tthis.#taskInput.value = ''\n\t\tthis.#taskInput.placeholder = placeholder || this.#i18n.t('ui.panel.taskInput')\n\t\tthis.#inputSection.classList.remove(styles.hidden)\n\t\t// Focus on input field\n\t\tsetTimeout(() => {\n\t\t\tthis.#taskInput.focus()\n\t\t}, 100)\n\t}\n\n\t/**\n\t * Hide input area\n\t */\n\t#hideInputArea(): void {\n\t\tthis.#inputSection.classList.add(styles.hidden)\n\t}\n\n\t/**\n\t * Check if input area should be shown\n\t */\n\t#shouldShowInputArea(): boolean {\n\t\t// Always show input area if waiting for user input\n\t\tif (this.#isWaitingForUserAnswer) return true\n\n\t\tconst steps = this.#state.getAllSteps()\n\t\tif (steps.length === 0) {\n\t\t\treturn true // Initial state\n\t\t}\n\n\t\tconst lastStep = steps[steps.length - 1]\n\t\treturn lastStep.type === 'completed' || lastStep.type === 'error'\n\t}\n\n\t#createWrapper(): HTMLElement {\n\t\tconst wrapper = document.createElement('div')\n\t\twrapper.id = 'page-agent-runtime_agent-panel'\n\t\twrapper.className = `${styles.wrapper} ${styles.collapsed}`\n\t\twrapper.setAttribute('data-browser-use-ignore', 'true')\n\n\t\twrapper.innerHTML = `\n\t\t\t<div class=\"${styles.background}\"></div>\n\t\t\t<div class=\"${styles.historySectionWrapper}\">\n\t\t\t\t<div class=\"${styles.historySection}\">\n\t\t\t\t\t${this.#createHistoryItem({\n\t\t\t\t\t\tid: 'placeholder',\n\t\t\t\t\t\tstepNumber: 0,\n\t\t\t\t\t\ttimestamp: new Date(),\n\t\t\t\t\t\ttype: 'thinking',\n\t\t\t\t\t\tdisplayText: this.#i18n.t('ui.panel.waitingPlaceholder'),\n\t\t\t\t\t})}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"${styles.header}\">\n\t\t\t\t<div class=\"${styles.statusSection}\">\n\t\t\t\t\t<div class=\"${styles.indicator} ${styles.thinking}\"></div>\n\t\t\t\t\t<div class=\"${styles.statusText}\">${this.#i18n.t('ui.panel.ready')}</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"${styles.controls}\">\n\t\t\t\t\t<button class=\"${styles.controlButton} ${styles.expandButton}\" title=\"${this.#i18n.t('ui.panel.expand')}\">\n\t\t\t\t\t\t▼\n\t\t\t\t\t</button>\n\t\t\t\t\t<button class=\"${styles.controlButton} ${styles.pauseButton}\" title=\"${this.#i18n.t('ui.panel.pause')}\">\n\t\t\t\t\t\t⏸︎\n\t\t\t\t\t</button>\n\t\t\t\t\t<button class=\"${styles.controlButton} ${styles.stopButton}\" title=\"${this.#i18n.t('ui.panel.stop')}\">\n\t\t\t\t\t\tX\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"${styles.inputSectionWrapper} ${styles.hidden}\">\n\t\t\t\t<div class=\"${styles.inputSection}\">\n\t\t\t\t\t<input \n\t\t\t\t\t\ttype=\"text\" \n\t\t\t\t\t\tclass=\"${styles.taskInput}\" \n\t\t\t\t\t\tmaxlength=\"200\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`\n\n\t\tdocument.body.appendChild(wrapper)\n\t\treturn wrapper\n\t}\n\n\t#setupEventListeners(): void {\n\t\t// Click header area to expand/collapse\n\t\tconst header = this.wrapper.querySelector(`.${styles.header}`)!\n\t\theader.addEventListener('click', (e) => {\n\t\t\t// Don't trigger expand/collapse if clicking on buttons\n\t\t\tif ((e.target as HTMLElement).closest(`.${styles.controlButton}`)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.#toggle()\n\t\t})\n\n\t\t// Expand button\n\t\tthis.#expandButton.addEventListener('click', (e) => {\n\t\t\te.stopPropagation()\n\t\t\tthis.#toggle()\n\t\t})\n\n\t\t// Pause/continue button\n\t\tthis.#pauseButton.addEventListener('click', (e) => {\n\t\t\te.stopPropagation()\n\t\t\tthis.#togglePause()\n\t\t})\n\n\t\t// Stop button\n\t\tthis.#stopButton.addEventListener('click', (e) => {\n\t\t\te.stopPropagation()\n\t\t\tthis.#stopAgent()\n\t\t})\n\n\t\t// Submit on Enter key in input field\n\t\tthis.#taskInput.addEventListener('keydown', (e) => {\n\t\t\tif (e.isComposing) return // Ignore IME composition keys\n\t\t\tif (e.key === 'Enter') {\n\t\t\t\te.preventDefault()\n\t\t\t\tthis.#submitTask()\n\t\t\t}\n\t\t})\n\n\t\t// Prevent input area click event bubbling\n\t\tthis.#inputSection.addEventListener('click', (e) => {\n\t\t\te.stopPropagation()\n\t\t})\n\t}\n\n\t#toggle(): void {\n\t\tif (this.#isExpanded) {\n\t\t\tthis.#collapse()\n\t\t} else {\n\t\t\tthis.#expand()\n\t\t}\n\t}\n\n\t#expand(): void {\n\t\tthis.#isExpanded = true\n\t\tthis.wrapper.classList.remove(styles.collapsed)\n\t\tthis.wrapper.classList.add(styles.expanded)\n\t\tthis.#expandButton.textContent = '▲'\n\t}\n\n\t#collapse(): void {\n\t\tthis.#isExpanded = false\n\t\tthis.wrapper.classList.remove(styles.expanded)\n\t\tthis.wrapper.classList.add(styles.collapsed)\n\t\tthis.#expandButton.textContent = '▼'\n\t}\n\n\t/**\n\t * Start periodic header update loop\n\t */\n\t#startHeaderUpdateLoop(): void {\n\t\t// Check every 450ms (same as total animation duration)\n\t\tthis.#headerUpdateTimer = setInterval(() => {\n\t\t\tthis.#checkAndUpdateHeader()\n\t\t}, 450)\n\t}\n\n\t/**\n\t * Stop periodic header update loop\n\t */\n\t#stopHeaderUpdateLoop(): void {\n\t\tif (this.#headerUpdateTimer) {\n\t\t\tclearInterval(this.#headerUpdateTimer)\n\t\t\tthis.#headerUpdateTimer = null\n\t\t}\n\t}\n\n\t/**\n\t * Check if header needs update and trigger animation if not currently animating\n\t */\n\t#checkAndUpdateHeader(): void {\n\t\t// If no pending text or currently animating, skip\n\t\tif (!this.#pendingHeaderText || this.#isAnimating) {\n\t\t\treturn\n\t\t}\n\n\t\t// If text is already displayed, clear pending and skip\n\t\tif (this.#statusText.textContent === this.#pendingHeaderText) {\n\t\t\tthis.#pendingHeaderText = null\n\t\t\treturn\n\t\t}\n\n\t\t// Start animation\n\t\tconst textToShow = this.#pendingHeaderText\n\t\tthis.#pendingHeaderText = null\n\t\tthis.#animateTextChange(textToShow)\n\t}\n\n\t/**\n\t * Animate text change with fade out/in effect\n\t */\n\t#animateTextChange(newText: string): void {\n\t\tthis.#isAnimating = true\n\n\t\t// Fade out current text\n\t\tthis.#statusText.classList.add(styles.fadeOut)\n\n\t\tsetTimeout(() => {\n\t\t\t// Update text content\n\t\t\tthis.#statusText.textContent = newText\n\n\t\t\t// Fade in new text\n\t\t\tthis.#statusText.classList.remove(styles.fadeOut)\n\t\t\tthis.#statusText.classList.add(styles.fadeIn)\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.#statusText.classList.remove(styles.fadeIn)\n\t\t\t\tthis.#isAnimating = false\n\t\t\t}, 300)\n\t\t}, 150) // Half the duration of fade out animation\n\t}\n\n\t#updateStatusIndicator(type: Step['type']): void {\n\t\t// Clear all status classes\n\t\tthis.#indicator.className = styles.indicator\n\n\t\t// Add corresponding status class\n\t\tthis.#indicator.classList.add(styles[type])\n\t}\n\n\t#updateHistory(): void {\n\t\tconst steps = this.#state.getAllSteps()\n\n\t\tthis.#historySection.innerHTML = steps.map((step) => this.#createHistoryItem(step)).join('')\n\n\t\t// Scroll to bottom to show latest records\n\t\tthis.#scrollToBottom()\n\t}\n\n\t#scrollToBottom(): void {\n\t\t// Execute in next event loop to ensure DOM update completion\n\t\tsetTimeout(() => {\n\t\t\tthis.#historySection.scrollTop = this.#historySection.scrollHeight\n\t\t}, 0)\n\t}\n\n\t#createHistoryItem(step: Step): string {\n\t\tconst time = step.timestamp.toLocaleTimeString('zh-CN', {\n\t\t\thour12: false,\n\t\t\thour: '2-digit',\n\t\t\tminute: '2-digit',\n\t\t\tsecond: '2-digit',\n\t\t})\n\n\t\tlet typeClass = ''\n\t\tlet statusIcon = ''\n\n\t\t// Set styles and icons based on step type\n\t\tif (step.type === 'completed') {\n\t\t\t// Check if this is a result from done tool\n\t\t\tif (step.toolName === 'done') {\n\t\t\t\t// Judge success or failure based on result\n\t\t\t\tconst failureKeyword = this.#i18n.t('ui.tools.resultFailure')\n\t\t\t\tconst errorKeyword = this.#i18n.t('ui.tools.resultError')\n\t\t\t\tconst isSuccess =\n\t\t\t\t\t!step.toolResult ||\n\t\t\t\t\t(!step.toolResult.includes(failureKeyword) && !step.toolResult.includes(errorKeyword))\n\t\t\t\ttypeClass = isSuccess ? styles.doneSuccess : styles.doneError\n\t\t\t\tstatusIcon = isSuccess ? '🎉' : '❌'\n\t\t\t} else {\n\t\t\t\ttypeClass = styles.completed\n\t\t\t\tstatusIcon = '✅'\n\t\t\t}\n\t\t} else if (step.type === 'error') {\n\t\t\ttypeClass = styles.error\n\t\t\tstatusIcon = '❌'\n\t\t} else if (step.type === 'tool_executing') {\n\t\t\tstatusIcon = '⚙️'\n\t\t} else if (step.type === 'output') {\n\t\t\ttypeClass = styles.output\n\t\t\tstatusIcon = '🤖'\n\t\t} else if (step.type === 'input') {\n\t\t\ttypeClass = styles.input\n\t\t\tstatusIcon = '🎯'\n\t\t} else if (step.type === 'retry') {\n\t\t\ttypeClass = styles.retry\n\t\t\tstatusIcon = '🔄'\n\t\t} else {\n\t\t\tstatusIcon = '🧠'\n\t\t}\n\n\t\tconst durationText = step.duration ? ` · ${step.duration}ms` : ''\n\t\tconst stepLabel = this.#i18n.t('ui.panel.step', {\n\t\t\tnumber: step.stepNumber.toString(),\n\t\t\ttime,\n\t\t\tduration: durationText || '', // Explicitly pass empty string to replace template\n\t\t})\n\n\t\treturn `\n\t\t\t<div class=\"${styles.historyItem} ${typeClass}\">\n\t\t\t\t<div class=\"${styles.historyContent}\">\n\t\t\t\t\t<span class=\"${styles.statusIcon}\">${statusIcon}</span>\n\t\t\t\t\t<span>${step.displayText}</span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"${styles.historyMeta}\">\n\t\t\t\t\t${stepLabel}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`\n\t}\n}\n"],"names":["paused","input","wrapper","header","statusIcon"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"page-agent-ui.js","sources":["../../src/UIState.ts","../../src/i18n/locales.ts","../../src/i18n/index.ts","../../src/utils.ts","../../src/Panel.ts"],"sourcesContent":["/**\n * Agent execution state management\n */\n\nexport interface Step {\n\tid: string\n\tstepNumber: number\n\ttimestamp: Date\n\ttype: 'thinking' | 'tool_executing' | 'completed' | 'error' | 'output' | 'input' | 'retry'\n\n\t// Tool execution related\n\ttoolName?: string\n\ttoolArgs?: any\n\ttoolResult?: any\n\n\t// Display data\n\tdisplayText: string\n\tduration?: number\n}\n\nexport type AgentStatus = 'idle' | 'running' | 'paused' | 'completed' | 'error'\n\nexport class UIState {\n\tprivate steps: Step[] = []\n\tprivate currentStep: Step | null = null\n\tprivate status: AgentStatus = 'idle'\n\tprivate stepCounter = 0\n\n\taddStep(stepData: Omit<Step, 'id' | 'stepNumber' | 'timestamp'>): Step {\n\t\tconst step: Step = {\n\t\t\tid: this.generateId(),\n\t\t\tstepNumber: ++this.stepCounter,\n\t\t\ttimestamp: new Date(),\n\t\t\t...stepData,\n\t\t}\n\n\t\tthis.steps.push(step)\n\t\tthis.currentStep = step\n\n\t\t// Update overall status\n\t\tthis.updateStatus(step.type)\n\n\t\treturn step\n\t}\n\n\tupdateCurrentStep(updates: Partial<Step>): Step | null {\n\t\tif (!this.currentStep) return null\n\n\t\tObject.assign(this.currentStep, updates)\n\t\treturn this.currentStep\n\t}\n\n\tgetCurrentStep(): Step | null {\n\t\treturn this.currentStep\n\t}\n\n\tgetAllSteps(): Step[] {\n\t\treturn [...this.steps]\n\t}\n\n\tgetStatus(): AgentStatus {\n\t\treturn this.status\n\t}\n\n\treset(): void {\n\t\tthis.steps = []\n\t\tthis.currentStep = null\n\t\tthis.status = 'idle'\n\t\tthis.stepCounter = 0\n\t}\n\n\tprivate updateStatus(stepType: Step['type']): void {\n\t\tswitch (stepType) {\n\t\t\tcase 'thinking':\n\t\t\tcase 'tool_executing':\n\t\t\tcase 'output':\n\t\t\tcase 'input':\n\t\t\tcase 'retry':\n\t\t\t\tthis.status = 'running'\n\t\t\t\tbreak\n\t\t\tcase 'completed':\n\t\t\t\tthis.status = 'completed'\n\t\t\t\tbreak\n\t\t\tcase 'error':\n\t\t\t\tthis.status = 'error'\n\t\t\t\tbreak\n\t\t}\n\t}\n\n\tprivate generateId(): string {\n\t\treturn `step_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`\n\t}\n}\n","// English translations (base/reference language)\nconst enUS = {\n\tui: {\n\t\tpanel: {\n\t\t\tready: 'Ready',\n\t\t\tthinking: 'Thinking...',\n\t\t\tpaused: 'Paused',\n\t\t\ttaskInput: 'Enter new task, describe steps in detail, press Enter to submit',\n\t\t\tuserAnswerPrompt: 'Please answer the question above, press Enter to submit',\n\t\t\ttaskTerminated: 'Task terminated',\n\t\t\ttaskCompleted: 'Task completed',\n\t\t\tcontinueExecution: 'Continue execution',\n\t\t\tuserAnswer: 'User answer: {{input}}',\n\t\t\tquestion: 'Question: {{question}}',\n\t\t\twaitingPlaceholder: 'Waiting for task to start...',\n\t\t\tpause: 'Pause',\n\t\t\tcontinue: 'Continue',\n\t\t\tstop: 'Stop',\n\t\t\texpand: 'Expand history',\n\t\t\tcollapse: 'Collapse history',\n\t\t\tstep: 'Step {{number}} · {{time}}{{duration}}',\n\t\t},\n\t\ttools: {\n\t\t\tclicking: 'Clicking element [{{index}}]...',\n\t\t\tinputting: 'Inputting text to element [{{index}}]...',\n\t\t\tselecting: 'Selecting option \"{{text}}\"...',\n\t\t\tscrolling: 'Scrolling page...',\n\t\t\twaiting: 'Waiting {{seconds}} seconds...',\n\t\t\tdone: 'Task done',\n\t\t\tclicked: '🖱️ Clicked element [{{index}}]',\n\t\t\tinputted: '⌨️ Inputted text \"{{text}}\"',\n\t\t\tselected: '☑️ Selected option \"{{text}}\"',\n\t\t\tscrolled: '🛞 Page scrolled',\n\t\t\twaited: '⌛️ Wait completed',\n\t\t\texecuting: 'Executing {{toolName}}...',\n\t\t\tresultSuccess: 'success',\n\t\t\tresultFailure: 'failed',\n\t\t\tresultError: 'error',\n\t\t},\n\t\terrors: {\n\t\t\telementNotFound: 'No interactive element found at index {{index}}',\n\t\t\ttaskRequired: 'Task description is required',\n\t\t\texecutionFailed: 'Task execution failed',\n\t\t\tnotInputElement: 'Element is not an input or textarea',\n\t\t\tnotSelectElement: 'Element is not a select element',\n\t\t\toptionNotFound: 'Option \"{{text}}\" not found',\n\t\t},\n\t},\n} as const\n\n// Chinese translations (must match the structure of enUS)\nconst zhCN = {\n\tui: {\n\t\tpanel: {\n\t\t\tready: '准备就绪',\n\t\t\tthinking: '正在思考...',\n\t\t\tpaused: '暂停中,稍后',\n\t\t\ttaskInput: '输入新任务,详细描述步骤,回车提交',\n\t\t\tuserAnswerPrompt: '请回答上面问题,回车提交',\n\t\t\ttaskTerminated: '任务已终止',\n\t\t\ttaskCompleted: '任务结束',\n\t\t\tcontinueExecution: '继续执行',\n\t\t\tuserAnswer: '用户回答: {{input}}',\n\t\t\tquestion: '询问: {{question}}',\n\t\t\twaitingPlaceholder: '等待任务开始...',\n\t\t\tpause: '暂停',\n\t\t\tcontinue: '继续',\n\t\t\tstop: '终止',\n\t\t\texpand: '展开历史',\n\t\t\tcollapse: '收起历史',\n\t\t\tstep: '步骤 {{number}} · {{time}}{{duration}}',\n\t\t},\n\t\ttools: {\n\t\t\tclicking: '正在点击元素 [{{index}}]...',\n\t\t\tinputting: '正在输入文本到元素 [{{index}}]...',\n\t\t\tselecting: '正在选择选项 \"{{text}}\"...',\n\t\t\tscrolling: '正在滚动页面...',\n\t\t\twaiting: '等待 {{seconds}} 秒...',\n\t\t\tdone: '结束任务',\n\t\t\tclicked: '🖱️ 已点击元素 [{{index}}]',\n\t\t\tinputted: '⌨️ 已输入文本 \"{{text}}\"',\n\t\t\tselected: '☑️ 已选择选项 \"{{text}}\"',\n\t\t\tscrolled: '🛞 页面滚动完成',\n\t\t\twaited: '⌛️ 等待完成',\n\t\t\texecuting: '正在执行 {{toolName}}...',\n\t\t\tresultSuccess: '成功',\n\t\t\tresultFailure: '失败',\n\t\t\tresultError: '错误',\n\t\t},\n\t\terrors: {\n\t\t\telementNotFound: '未找到索引为 {{index}} 的交互元素',\n\t\t\ttaskRequired: '任务描述不能为空',\n\t\t\texecutionFailed: '任务执行失败',\n\t\t\tnotInputElement: '元素不是输入框或文本域',\n\t\t\tnotSelectElement: '元素不是选择框',\n\t\t\toptionNotFound: '未找到选项 \"{{text}}\"',\n\t\t},\n\t},\n} as const\n\n// Type definitions generated from English base structure (but with string values)\ntype DeepStringify<T> = {\n\t[K in keyof T]: T[K] extends string ? string : T[K] extends object ? DeepStringify<T[K]> : T[K]\n}\n\nexport type TranslationSchema = DeepStringify<typeof enUS>\n\n// Utility type: Extract all nested paths from translation object\ntype NestedKeyOf<ObjectType extends object> = {\n\t[Key in keyof ObjectType & (string | number)]: ObjectType[Key] extends object\n\t\t? `${Key}` | `${Key}.${NestedKeyOf<ObjectType[Key]>}`\n\t\t: `${Key}`\n}[keyof ObjectType & (string | number)]\n\n// Extract all possible key paths from translation structure\nexport type TranslationKey = NestedKeyOf<TranslationSchema>\n\n// Parameterized translation types\nexport type TranslationParams = Record<string, string | number>\n\nexport const locales = {\n\t'en-US': enUS,\n\t'zh-CN': zhCN,\n} as const\n\nexport type SupportedLanguage = keyof typeof locales\n","import {\n\ttype SupportedLanguage,\n\ttype TranslationKey,\n\ttype TranslationParams,\n\ttype TranslationSchema,\n\tlocales,\n} from './locales'\n\nexport class I18n {\n\tprivate language: SupportedLanguage\n\tprivate translations: TranslationSchema\n\n\tconstructor(language: SupportedLanguage = 'en-US') {\n\t\tthis.language = language in locales ? language : 'en-US'\n\t\tthis.translations = locales[this.language]\n\t}\n\n\t// 类型安全的翻译方法\n\tt(key: TranslationKey, params?: TranslationParams): string {\n\t\tconst value = this.getNestedValue(this.translations, key)\n\t\tif (!value) {\n\t\t\tconsole.warn(`Translation key \"${key}\" not found for language \"${this.language}\"`)\n\t\t\treturn key\n\t\t}\n\n\t\tif (params) {\n\t\t\treturn this.interpolate(value, params)\n\t\t}\n\t\treturn value\n\t}\n\n\tprivate getNestedValue(obj: any, path: string): string | undefined {\n\t\treturn path.split('.').reduce((current, key) => current?.[key], obj)\n\t}\n\n\tprivate interpolate(template: string, params: TranslationParams): string {\n\t\treturn template.replace(/\\{\\{(\\w+)\\}\\}/g, (match, key) => {\n\t\t\t// Use != null to check for both null and undefined, allow empty strings\n\t\t\treturn params[key] != null ? params[key].toString() : match\n\t\t})\n\t}\n\n\tgetLanguage(): SupportedLanguage {\n\t\treturn this.language\n\t}\n}\n\n// 导出类型和实例创建函数\nexport type { TranslationKey, SupportedLanguage, TranslationParams }\nexport { locales }\n","export function truncate(text: string, maxLength: number): string {\n\tif (text.length > maxLength) {\n\t\treturn text.substring(0, maxLength) + '...'\n\t}\n\treturn text\n}\n\n/**\n * Escape HTML special characters to prevent XSS and rendering issues\n */\nexport function escapeHtml(text: string): string {\n\treturn text\n\t\t.replace(/&/g, '&')\n\t\t.replace(/</g, '<')\n\t\t.replace(/>/g, '>')\n\t\t.replace(/\"/g, '"')\n\t\t.replace(/'/g, ''')\n}\n","import { type Step, UIState } from './UIState'\nimport { I18n, type SupportedLanguage } from './i18n'\nimport { escapeHtml, truncate } from './utils'\n\nimport styles from './Panel.module.css'\n\n/**\n * Panel configuration\n */\nexport interface PanelConfig {\n\tlanguage?: SupportedLanguage\n\tonExecuteTask: (task: string) => void\n\tonStop: () => void\n\tonPauseToggle: () => boolean // returns new paused state\n\tgetPaused: () => boolean\n}\n\n/**\n * Semantic update types - Panel handles i18n internally\n */\nexport type PanelUpdate =\n\t| { type: 'thinking'; text?: string } // text is optional, defaults to i18n thinking text\n\t| { type: 'input'; task: string }\n\t| { type: 'question'; question: string }\n\t| { type: 'userAnswer'; input: string }\n\t| { type: 'retry'; current: number; max: number }\n\t| { type: 'error'; message: string }\n\t| { type: 'output'; text: string }\n\t| { type: 'completed' }\n\t| { type: 'toolExecuting'; toolName: string; args: any }\n\t| { type: 'toolCompleted'; toolName: string; args: any; result?: string; duration?: number }\n\n/**\n * Agent control panel\n */\nexport class Panel {\n\t#wrapper: HTMLElement\n\t#indicator: HTMLElement\n\t#statusText: HTMLElement\n\t#historySection: HTMLElement\n\t#expandButton: HTMLElement\n\t#pauseButton: HTMLElement\n\t#stopButton: HTMLElement\n\t#inputSection: HTMLElement\n\t#taskInput: HTMLInputElement\n\n\t#state = new UIState()\n\t#isExpanded = false\n\t#config: PanelConfig\n\t#i18n: I18n\n\t#userAnswerResolver: ((input: string) => void) | null = null\n\t#isWaitingForUserAnswer: boolean = false\n\t#headerUpdateTimer: ReturnType<typeof setInterval> | null = null\n\t#pendingHeaderText: string | null = null\n\t#isAnimating = false\n\n\tget wrapper(): HTMLElement {\n\t\treturn this.#wrapper\n\t}\n\n\tconstructor(config: PanelConfig) {\n\t\tthis.#config = config\n\t\tthis.#i18n = new I18n(config.language ?? 'en-US')\n\t\tthis.#wrapper = this.#createWrapper()\n\t\tthis.#indicator = this.#wrapper.querySelector(`.${styles.indicator}`)!\n\t\tthis.#statusText = this.#wrapper.querySelector(`.${styles.statusText}`)!\n\t\tthis.#historySection = this.#wrapper.querySelector(`.${styles.historySection}`)!\n\t\tthis.#expandButton = this.#wrapper.querySelector(`.${styles.expandButton}`)!\n\t\tthis.#pauseButton = this.#wrapper.querySelector(`.${styles.pauseButton}`)!\n\t\tthis.#stopButton = this.#wrapper.querySelector(`.${styles.stopButton}`)!\n\t\tthis.#inputSection = this.#wrapper.querySelector(`.${styles.inputSectionWrapper}`)!\n\t\tthis.#taskInput = this.#wrapper.querySelector(`.${styles.taskInput}`)!\n\n\t\tthis.#setupEventListeners()\n\t\tthis.#startHeaderUpdateLoop()\n\n\t\tthis.#showInputArea()\n\t}\n\n\t/**\n\t * Ask for user input\n\t */\n\tasync askUser(question: string): Promise<string> {\n\t\treturn new Promise((resolve) => {\n\t\t\t// Set `waiting for user answer` state\n\t\t\tthis.#isWaitingForUserAnswer = true\n\t\t\tthis.#userAnswerResolver = resolve\n\n\t\t\t// Update state to `running`\n\t\t\tthis.#updateInternal({\n\t\t\t\ttype: 'output',\n\t\t\t\tdisplayText: this.#i18n.t('ui.panel.question', { question }),\n\t\t\t}) // Expand history panel\n\t\t\tif (!this.#isExpanded) {\n\t\t\t\tthis.#expand()\n\t\t\t}\n\n\t\t\tthis.#showInputArea(this.#i18n.t('ui.panel.userAnswerPrompt'))\n\t\t})\n\t}\n\n\t// ========== Public control methods ==========\n\n\tshow(): void {\n\t\tthis.wrapper.style.display = 'block'\n\t\tvoid this.wrapper.offsetHeight\n\t\tthis.wrapper.style.opacity = '1'\n\t\tthis.wrapper.style.transform = 'translateX(-50%) translateY(0)'\n\t}\n\n\thide(): void {\n\t\tthis.wrapper.style.opacity = '0'\n\t\tthis.wrapper.style.transform = 'translateX(-50%) translateY(20px)'\n\t\tthis.wrapper.style.display = 'none'\n\t}\n\n\treset(): void {\n\t\tthis.#state.reset()\n\t\tthis.#statusText.textContent = this.#i18n.t('ui.panel.ready')\n\t\tthis.#updateStatusIndicator('thinking')\n\t\tthis.#updateHistory()\n\t\tthis.#collapse()\n\t\t// Reset pause state via callback\n\t\tif (this.#config.getPaused()) {\n\t\t\tthis.#config.onPauseToggle()\n\t\t}\n\t\tthis.#updatePauseButton()\n\t\t// Reset user input state\n\t\tthis.#isWaitingForUserAnswer = false\n\t\tthis.#userAnswerResolver = null\n\t\t// Show input area\n\t\tthis.#showInputArea()\n\t}\n\n\texpand(): void {\n\t\tthis.#expand()\n\t}\n\n\tcollapse(): void {\n\t\tthis.#collapse()\n\t}\n\n\t/**\n\t * Update panel with semantic data - i18n handled internally\n\t */\n\tupdate(data: PanelUpdate): void {\n\t\tconst stepData = this.#toStepData(data)\n\t\tthis.#updateInternal(stepData)\n\t}\n\n\t/**\n\t * Dispose panel\n\t */\n\tdispose(): void {\n\t\tthis.#isWaitingForUserAnswer = false\n\t\tthis.#stopHeaderUpdateLoop()\n\t\tthis.wrapper.remove()\n\t}\n\n\t// ========== Private methods ==========\n\n\t/**\n\t * Convert semantic update to step data with i18n\n\t */\n\t#toStepData(data: PanelUpdate): Omit<Step, 'id' | 'stepNumber' | 'timestamp'> {\n\t\tswitch (data.type) {\n\t\t\tcase 'thinking':\n\t\t\t\treturn { type: 'thinking', displayText: data.text ?? this.#i18n.t('ui.panel.thinking') }\n\t\t\tcase 'input':\n\t\t\t\treturn { type: 'input', displayText: data.task }\n\t\t\tcase 'question':\n\t\t\t\treturn {\n\t\t\t\t\ttype: 'output',\n\t\t\t\t\tdisplayText: this.#i18n.t('ui.panel.question', { question: data.question }),\n\t\t\t\t}\n\t\t\tcase 'userAnswer':\n\t\t\t\treturn {\n\t\t\t\t\ttype: 'input',\n\t\t\t\t\tdisplayText: this.#i18n.t('ui.panel.userAnswer', { input: data.input }),\n\t\t\t\t}\n\t\t\tcase 'retry':\n\t\t\t\treturn { type: 'retry', displayText: `retry-ing (${data.current} / ${data.max})` }\n\t\t\tcase 'error':\n\t\t\t\treturn { type: 'error', displayText: data.message }\n\t\t\tcase 'output':\n\t\t\t\treturn { type: 'output', displayText: data.text }\n\t\t\tcase 'completed':\n\t\t\t\treturn { type: 'completed', displayText: this.#i18n.t('ui.panel.taskCompleted') }\n\t\t\tcase 'toolExecuting':\n\t\t\t\treturn {\n\t\t\t\t\ttype: 'tool_executing',\n\t\t\t\t\ttoolName: data.toolName,\n\t\t\t\t\ttoolArgs: data.args,\n\t\t\t\t\tdisplayText: this.#getToolExecutingText(data.toolName, data.args),\n\t\t\t\t}\n\t\t\tcase 'toolCompleted': {\n\t\t\t\tconst displayText = this.#getToolCompletedText(data.toolName, data.args)\n\t\t\t\tif (!displayText) return { type: 'tool_executing', displayText: '' } // will be filtered\n\t\t\t\treturn {\n\t\t\t\t\ttype: 'tool_executing',\n\t\t\t\t\ttoolName: data.toolName,\n\t\t\t\t\ttoolArgs: data.args,\n\t\t\t\t\ttoolResult: data.result,\n\t\t\t\t\tdisplayText,\n\t\t\t\t\tduration: data.duration,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t#getToolExecutingText(toolName: string, args: any): string {\n\t\tswitch (toolName) {\n\t\t\tcase 'click_element_by_index':\n\t\t\t\treturn this.#i18n.t('ui.tools.clicking', { index: args.index })\n\t\t\tcase 'input_text':\n\t\t\t\treturn this.#i18n.t('ui.tools.inputting', { index: args.index })\n\t\t\tcase 'select_dropdown_option':\n\t\t\t\treturn this.#i18n.t('ui.tools.selecting', { text: args.text })\n\t\t\tcase 'scroll':\n\t\t\t\treturn this.#i18n.t('ui.tools.scrolling')\n\t\t\tcase 'wait':\n\t\t\t\treturn this.#i18n.t('ui.tools.waiting', { seconds: args.seconds })\n\t\t\tcase 'done':\n\t\t\t\treturn this.#i18n.t('ui.tools.done')\n\t\t\tdefault:\n\t\t\t\treturn this.#i18n.t('ui.tools.executing', { toolName })\n\t\t}\n\t}\n\n\t#getToolCompletedText(toolName: string, args: any): string | null {\n\t\tswitch (toolName) {\n\t\t\tcase 'click_element_by_index':\n\t\t\t\treturn this.#i18n.t('ui.tools.clicked', { index: args.index })\n\t\t\tcase 'input_text':\n\t\t\t\treturn this.#i18n.t('ui.tools.inputted', { text: args.text })\n\t\t\tcase 'select_dropdown_option':\n\t\t\t\treturn this.#i18n.t('ui.tools.selected', { text: args.text })\n\t\t\tcase 'scroll':\n\t\t\t\treturn this.#i18n.t('ui.tools.scrolled')\n\t\t\tcase 'wait':\n\t\t\t\treturn this.#i18n.t('ui.tools.waited')\n\t\t\tcase 'done':\n\t\t\t\treturn null\n\t\t\tdefault:\n\t\t\t\treturn null\n\t\t}\n\t}\n\n\t/**\n\t * Update status (internal)\n\t */\n\t#updateInternal(stepData: Omit<Step, 'id' | 'stepNumber' | 'timestamp'>): void {\n\t\t// Skip empty displayText (filtered toolCompleted for 'done')\n\t\tif (!stepData.displayText) return\n\n\t\tconst step = this.#state.addStep(stepData)\n\n\t\t// Queue header text update (will be processed by periodic check)\n\t\tconst headerText = truncate(step.displayText, 20)\n\t\tthis.#pendingHeaderText = headerText\n\n\t\tthis.#updateStatusIndicator(step.type)\n\t\tthis.#updateHistory()\n\n\t\t// Auto-expand history after task completion\n\t\tif (step.type === 'completed' || step.type === 'error') {\n\t\t\tif (!this.#isExpanded) {\n\t\t\t\tthis.#expand()\n\t\t\t}\n\t\t}\n\n\t\t// Control input area display based on status\n\t\tif (this.#shouldShowInputArea()) {\n\t\t\tthis.#showInputArea()\n\t\t} else {\n\t\t\tthis.#hideInputArea()\n\t\t}\n\t}\n\n\t/**\n\t * Toggle pause state\n\t */\n\t#togglePause(): void {\n\t\tconst paused = this.#config.onPauseToggle()\n\t\tthis.#updatePauseButton()\n\n\t\t// Update status display\n\t\tif (paused) {\n\t\t\tthis.#statusText.textContent = this.#i18n.t('ui.panel.paused')\n\t\t\tthis.#updateStatusIndicator('thinking')\n\t\t} else {\n\t\t\tthis.#statusText.textContent = this.#i18n.t('ui.panel.continueExecution')\n\t\t\tthis.#updateStatusIndicator('tool_executing')\n\t\t}\n\t}\n\n\t/**\n\t * Update pause button state\n\t */\n\t#updatePauseButton(): void {\n\t\tconst paused = this.#config.getPaused()\n\t\tif (paused) {\n\t\t\tthis.#pauseButton.textContent = '▶'\n\t\t\tthis.#pauseButton.title = this.#i18n.t('ui.panel.continue')\n\t\t\tthis.#pauseButton.classList.add(styles.paused)\n\t\t} else {\n\t\t\tthis.#pauseButton.textContent = '⏸︎'\n\t\t\tthis.#pauseButton.title = this.#i18n.t('ui.panel.pause')\n\t\t\tthis.#pauseButton.classList.remove(styles.paused)\n\t\t}\n\t}\n\n\t/**\n\t * Stop Agent\n\t */\n\t#stopAgent(): void {\n\t\t// Update status display\n\t\tthis.#updateInternal({\n\t\t\ttype: 'error',\n\t\t\tdisplayText: this.#i18n.t('ui.panel.taskTerminated'),\n\t\t})\n\n\t\tthis.#config.onStop()\n\t}\n\n\t/**\n\t * Submit task\n\t */\n\t#submitTask() {\n\t\tconst input = this.#taskInput.value.trim()\n\t\tif (!input) return\n\n\t\t// Hide input area\n\t\tthis.#hideInputArea()\n\n\t\tif (this.#isWaitingForUserAnswer) {\n\t\t\t// Handle user input mode\n\t\t\tthis.#handleUserAnswer(input)\n\t\t} else {\n\t\t\tthis.#config.onExecuteTask(input)\n\t\t}\n\t}\n\n\t/**\n\t * Handle user answer\n\t */\n\t#handleUserAnswer(input: string): void {\n\t\t// Add user input to history\n\t\tthis.#updateInternal({\n\t\t\ttype: 'input',\n\t\t\tdisplayText: this.#i18n.t('ui.panel.userAnswer', { input }),\n\t\t})\n\n\t\t// Reset state\n\t\tthis.#isWaitingForUserAnswer = false\n\n\t\t// Call resolver to return user input\n\t\tif (this.#userAnswerResolver) {\n\t\t\tthis.#userAnswerResolver(input)\n\t\t\tthis.#userAnswerResolver = null\n\t\t}\n\t}\n\n\t/**\n\t * Show input area\n\t */\n\t#showInputArea(placeholder?: string): void {\n\t\t// Clear input field\n\t\tthis.#taskInput.value = ''\n\t\tthis.#taskInput.placeholder = placeholder || this.#i18n.t('ui.panel.taskInput')\n\t\tthis.#inputSection.classList.remove(styles.hidden)\n\t\t// Focus on input field\n\t\tsetTimeout(() => {\n\t\t\tthis.#taskInput.focus()\n\t\t}, 100)\n\t}\n\n\t/**\n\t * Hide input area\n\t */\n\t#hideInputArea(): void {\n\t\tthis.#inputSection.classList.add(styles.hidden)\n\t}\n\n\t/**\n\t * Check if input area should be shown\n\t */\n\t#shouldShowInputArea(): boolean {\n\t\t// Always show input area if waiting for user input\n\t\tif (this.#isWaitingForUserAnswer) return true\n\n\t\tconst steps = this.#state.getAllSteps()\n\t\tif (steps.length === 0) {\n\t\t\treturn true // Initial state\n\t\t}\n\n\t\tconst lastStep = steps[steps.length - 1]\n\t\treturn lastStep.type === 'completed' || lastStep.type === 'error'\n\t}\n\n\t#createWrapper(): HTMLElement {\n\t\tconst wrapper = document.createElement('div')\n\t\twrapper.id = 'page-agent-runtime_agent-panel'\n\t\twrapper.className = `${styles.wrapper} ${styles.collapsed}`\n\t\twrapper.setAttribute('data-browser-use-ignore', 'true')\n\n\t\twrapper.innerHTML = `\n\t\t\t<div class=\"${styles.background}\"></div>\n\t\t\t<div class=\"${styles.historySectionWrapper}\">\n\t\t\t\t<div class=\"${styles.historySection}\">\n\t\t\t\t\t${this.#createHistoryItem({\n\t\t\t\t\t\tid: 'placeholder',\n\t\t\t\t\t\tstepNumber: 0,\n\t\t\t\t\t\ttimestamp: new Date(),\n\t\t\t\t\t\ttype: 'thinking',\n\t\t\t\t\t\tdisplayText: this.#i18n.t('ui.panel.waitingPlaceholder'),\n\t\t\t\t\t})}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"${styles.header}\">\n\t\t\t\t<div class=\"${styles.statusSection}\">\n\t\t\t\t\t<div class=\"${styles.indicator} ${styles.thinking}\"></div>\n\t\t\t\t\t<div class=\"${styles.statusText}\">${this.#i18n.t('ui.panel.ready')}</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"${styles.controls}\">\n\t\t\t\t\t<button class=\"${styles.controlButton} ${styles.expandButton}\" title=\"${this.#i18n.t('ui.panel.expand')}\">\n\t\t\t\t\t\t▼\n\t\t\t\t\t</button>\n\t\t\t\t\t<button class=\"${styles.controlButton} ${styles.pauseButton}\" title=\"${this.#i18n.t('ui.panel.pause')}\">\n\t\t\t\t\t\t⏸︎\n\t\t\t\t\t</button>\n\t\t\t\t\t<button class=\"${styles.controlButton} ${styles.stopButton}\" title=\"${this.#i18n.t('ui.panel.stop')}\">\n\t\t\t\t\t\tX\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"${styles.inputSectionWrapper} ${styles.hidden}\">\n\t\t\t\t<div class=\"${styles.inputSection}\">\n\t\t\t\t\t<input \n\t\t\t\t\t\ttype=\"text\" \n\t\t\t\t\t\tclass=\"${styles.taskInput}\" \n\t\t\t\t\t\tmaxlength=\"200\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`\n\n\t\tdocument.body.appendChild(wrapper)\n\t\treturn wrapper\n\t}\n\n\t#setupEventListeners(): void {\n\t\t// Click header area to expand/collapse\n\t\tconst header = this.wrapper.querySelector(`.${styles.header}`)!\n\t\theader.addEventListener('click', (e) => {\n\t\t\t// Don't trigger expand/collapse if clicking on buttons\n\t\t\tif ((e.target as HTMLElement).closest(`.${styles.controlButton}`)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.#toggle()\n\t\t})\n\n\t\t// Expand button\n\t\tthis.#expandButton.addEventListener('click', (e) => {\n\t\t\te.stopPropagation()\n\t\t\tthis.#toggle()\n\t\t})\n\n\t\t// Pause/continue button\n\t\tthis.#pauseButton.addEventListener('click', (e) => {\n\t\t\te.stopPropagation()\n\t\t\tthis.#togglePause()\n\t\t})\n\n\t\t// Stop button\n\t\tthis.#stopButton.addEventListener('click', (e) => {\n\t\t\te.stopPropagation()\n\t\t\tthis.#stopAgent()\n\t\t})\n\n\t\t// Submit on Enter key in input field\n\t\tthis.#taskInput.addEventListener('keydown', (e) => {\n\t\t\tif (e.isComposing) return // Ignore IME composition keys\n\t\t\tif (e.key === 'Enter') {\n\t\t\t\te.preventDefault()\n\t\t\t\tthis.#submitTask()\n\t\t\t}\n\t\t})\n\n\t\t// Prevent input area click event bubbling\n\t\tthis.#inputSection.addEventListener('click', (e) => {\n\t\t\te.stopPropagation()\n\t\t})\n\t}\n\n\t#toggle(): void {\n\t\tif (this.#isExpanded) {\n\t\t\tthis.#collapse()\n\t\t} else {\n\t\t\tthis.#expand()\n\t\t}\n\t}\n\n\t#expand(): void {\n\t\tthis.#isExpanded = true\n\t\tthis.wrapper.classList.remove(styles.collapsed)\n\t\tthis.wrapper.classList.add(styles.expanded)\n\t\tthis.#expandButton.textContent = '▲'\n\t}\n\n\t#collapse(): void {\n\t\tthis.#isExpanded = false\n\t\tthis.wrapper.classList.remove(styles.expanded)\n\t\tthis.wrapper.classList.add(styles.collapsed)\n\t\tthis.#expandButton.textContent = '▼'\n\t}\n\n\t/**\n\t * Start periodic header update loop\n\t */\n\t#startHeaderUpdateLoop(): void {\n\t\t// Check every 450ms (same as total animation duration)\n\t\tthis.#headerUpdateTimer = setInterval(() => {\n\t\t\tthis.#checkAndUpdateHeader()\n\t\t}, 450)\n\t}\n\n\t/**\n\t * Stop periodic header update loop\n\t */\n\t#stopHeaderUpdateLoop(): void {\n\t\tif (this.#headerUpdateTimer) {\n\t\t\tclearInterval(this.#headerUpdateTimer)\n\t\t\tthis.#headerUpdateTimer = null\n\t\t}\n\t}\n\n\t/**\n\t * Check if header needs update and trigger animation if not currently animating\n\t */\n\t#checkAndUpdateHeader(): void {\n\t\t// If no pending text or currently animating, skip\n\t\tif (!this.#pendingHeaderText || this.#isAnimating) {\n\t\t\treturn\n\t\t}\n\n\t\t// If text is already displayed, clear pending and skip\n\t\tif (this.#statusText.textContent === this.#pendingHeaderText) {\n\t\t\tthis.#pendingHeaderText = null\n\t\t\treturn\n\t\t}\n\n\t\t// Start animation\n\t\tconst textToShow = this.#pendingHeaderText\n\t\tthis.#pendingHeaderText = null\n\t\tthis.#animateTextChange(textToShow)\n\t}\n\n\t/**\n\t * Animate text change with fade out/in effect\n\t */\n\t#animateTextChange(newText: string): void {\n\t\tthis.#isAnimating = true\n\n\t\t// Fade out current text\n\t\tthis.#statusText.classList.add(styles.fadeOut)\n\n\t\tsetTimeout(() => {\n\t\t\t// Update text content\n\t\t\tthis.#statusText.textContent = newText\n\n\t\t\t// Fade in new text\n\t\t\tthis.#statusText.classList.remove(styles.fadeOut)\n\t\t\tthis.#statusText.classList.add(styles.fadeIn)\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.#statusText.classList.remove(styles.fadeIn)\n\t\t\t\tthis.#isAnimating = false\n\t\t\t}, 300)\n\t\t}, 150) // Half the duration of fade out animation\n\t}\n\n\t#updateStatusIndicator(type: Step['type']): void {\n\t\t// Clear all status classes\n\t\tthis.#indicator.className = styles.indicator\n\n\t\t// Add corresponding status class\n\t\tthis.#indicator.classList.add(styles[type])\n\t}\n\n\t#updateHistory(): void {\n\t\tconst steps = this.#state.getAllSteps()\n\t\tthis.#historySection.innerHTML = steps.map((step) => this.#createHistoryItem(step)).join('')\n\t\tthis.#scrollToBottom()\n\t}\n\n\t#scrollToBottom(): void {\n\t\t// Execute in next event loop to ensure DOM update completion\n\t\tsetTimeout(() => {\n\t\t\tthis.#historySection.scrollTop = this.#historySection.scrollHeight\n\t\t}, 0)\n\t}\n\n\t#createHistoryItem(step: Step): string {\n\t\tconst time = step.timestamp.toLocaleTimeString('zh-CN', {\n\t\t\thour12: false,\n\t\t\thour: '2-digit',\n\t\t\tminute: '2-digit',\n\t\t\tsecond: '2-digit',\n\t\t})\n\n\t\tlet typeClass = ''\n\t\tlet statusIcon = ''\n\n\t\t// Set styles and icons based on step type\n\t\tif (step.type === 'completed') {\n\t\t\t// Check if this is a result from done tool\n\t\t\tif (step.toolName === 'done') {\n\t\t\t\t// Judge success or failure based on result\n\t\t\t\tconst failureKeyword = this.#i18n.t('ui.tools.resultFailure')\n\t\t\t\tconst errorKeyword = this.#i18n.t('ui.tools.resultError')\n\t\t\t\tconst isSuccess =\n\t\t\t\t\t!step.toolResult ||\n\t\t\t\t\t(!step.toolResult.includes(failureKeyword) && !step.toolResult.includes(errorKeyword))\n\t\t\t\ttypeClass = isSuccess ? styles.doneSuccess : styles.doneError\n\t\t\t\tstatusIcon = isSuccess ? '🎉' : '❌'\n\t\t\t} else {\n\t\t\t\ttypeClass = styles.completed\n\t\t\t\tstatusIcon = '✅'\n\t\t\t}\n\t\t} else if (step.type === 'error') {\n\t\t\ttypeClass = styles.error\n\t\t\tstatusIcon = '❌'\n\t\t} else if (step.type === 'tool_executing') {\n\t\t\tstatusIcon = '⚙️'\n\t\t} else if (step.type === 'output') {\n\t\t\ttypeClass = styles.output\n\t\t\tstatusIcon = '🤖'\n\t\t} else if (step.type === 'input') {\n\t\t\ttypeClass = styles.input\n\t\t\tstatusIcon = '🎯'\n\t\t} else if (step.type === 'retry') {\n\t\t\ttypeClass = styles.retry\n\t\t\tstatusIcon = '🔄'\n\t\t} else {\n\t\t\tstatusIcon = '🧠'\n\t\t}\n\n\t\tconst durationText = step.duration ? ` · ${step.duration}ms` : ''\n\t\tconst stepLabel = this.#i18n.t('ui.panel.step', {\n\t\t\tnumber: step.stepNumber.toString(),\n\t\t\ttime,\n\t\t\tduration: durationText || '', // Explicitly pass empty string to replace template\n\t\t})\n\n\t\treturn `\n\t\t\t<div class=\"${styles.historyItem} ${typeClass}\">\n\t\t\t\t<div class=\"${styles.historyContent}\">\n\t\t\t\t\t<span class=\"${styles.statusIcon}\">${statusIcon}</span>\n\t\t\t\t\t<span>${escapeHtml(step.displayText)}</span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"${styles.historyMeta}\">\n\t\t\t\t\t${stepLabel}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`\n\t}\n}\n"],"names":["paused","input","wrapper","header","statusIcon"],"mappings":"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"}
|